From 169c2924ff8c1287e30383edab781d1def32d083 Mon Sep 17 00:00:00 2001 From: shylinux Date: Thu, 4 Feb 2021 22:15:53 +0800 Subject: [PATCH] opt wx --- frame.js | 42 +++++++++++--------- lib/base.js | 17 ++++++++ lib/user.js | 36 ++++++++--------- page/index.css | 28 +++++++------ pane/Action.css | 2 +- pane/Action.js | 5 ++- pane/Footer.css | 3 ++ pane/Header.js | 16 ++++---- plugin/local/wiki/word.css | 3 ++ plugin/local/wiki/word.js | 17 +++++--- plugin/state.js | 80 +++++++++----------------------------- plugin/story/trend.js | 9 ++--- plugin/table.js | 21 +++++----- 13 files changed, 134 insertions(+), 145 deletions(-) diff --git a/frame.js b/frame.js index 67f512b4..96014a5a 100644 --- a/frame.js +++ b/frame.js @@ -282,8 +282,8 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, item.name && item.value && msg.Option(item.name, item.value) }) - if (cmds && cmds[0] == "action" && can.onaction[cmds[1]]) { - return can.onaction[cmds[1]](event, can) + if (msg.Option("_handle") != "true" && cmds && cmds[0] == "action" && can.onaction[cmds[1]]) { + return can.onaction[cmds[1]](event, can, cmds[1]) } var feature = can.Conf("feature") @@ -414,19 +414,19 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return can.page.Append(can, target, [{view: ["item "+item.type], list: [input]}])[item.name] }, - table: function(can, msg, cb, target, list) { + table: function(can, msg, cb, target, sort) { var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key) { return {text: [value, "td"], onclick: function(event) { can.sup.onaction.change(event, can.sup, key, value, function(msg) { - can.onimport._init(can, msg, list, cb, can._output) + can.onimport._init(can, msg, [], cb, can._output) }) }} }); table && can.page.Modify(can, table, {className: "content"}) - list && can.page.RangeTable(can, table, list) + sort && can.page.RangeTable(can, table, sort) return table }, board: function(can, text, target) { text = can.page.Display(text || "") - return text && can.page.Append(can, target, [{view: ["code", "div", text]}]).code + return text && can.page.Append(can, target||can._output, [{view: ["code", "div", text]}]).code }, figure: function(can, meta, key, target) { @@ -484,28 +484,32 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }, [], function(can) {}) Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can) { var target = document.body, width = window.innerWidth, height = window.innerHeight + can.user.isMobile && can.page.ClassList.set(can, document.body, "landscape", width > height) can.page.Select(can, target, ["fieldset.head", "fieldset.foot"], function(field) { - can.page.Modify(can, field, {style: {display: can.user.isMobile && width > height? "none": ""}}) height -= field.offsetHeight }) - can.page.Select(can, target, ["fieldset.left", "fieldset.right"], function(field, index) { + can.page.Select(can, target, "fieldset.left", function(field, index) { can.page.Modify(can, field, {style: {height: height}}) width -= field.offsetWidth + }) + can.page.Select(can, target, "fieldset.left>div.output", function(output) { + can.page.Modify(can, output, {style: {height: height-32}}) + }) - can.page.Select(can, field, "div.output", function(output) { - can.page.Modify(can, output, {style: {height: height-32}}) + if (can.user.isMobile) { + can.page.Select(can, target, "fieldset.main", function(field, index) { + can.user.isMobile && can.page.Modify(can, field, {style: {"padding-top": width > height? "0px": ""}}) }) - }) - - if (can.user.isMobile) { return } - can.page.Select(can, target, ["fieldset.main"], function(field, index) { - can.page.Modify(can, field, {style: {height: height}}) - }) - can.page.Select(can, target, ["fieldset.main>div.output"], function(output) { - can.page.Modify(can, output, {style: {height: height}}) - }) + } else { + can.page.Select(can, target, "fieldset.main", function(field, index) { + can.page.Modify(can, field, {style: {height: height}}) + }) + can.page.Select(can, target, "fieldset.main>div.output", function(output) { + can.page.Modify(can, output, {style: {height: height}}) + }) + } can.onengine.signal(can, "resize", can.request({}, {width: width, height: height})) }, topic: function(can, topic) { topic && (can._topic = topic) diff --git a/lib/base.js b/lib/base.js index 36f8f078..58b09654 100644 --- a/lib/base.js +++ b/lib/base.js @@ -139,6 +139,23 @@ Volcanos("base", {help: "数据类型", return size + "B" }, + parseJSON: function(str) { var res + if (typeof str == "object") { return str } + if (str.indexOf("http") == 0) { var ls = str.split("?") + res = {type: "link", name: "", text: str} + res.name = ls[0].split("://").pop().split("/")[0] + ls[1] && ls[1].split("&").forEach(function(item) { var ls = item.split("=") + res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1]) + }) + return res + } + try { res = JSON.parse(str) + res.type = res.type||"json" + } catch (e) { + res = {type: "text", text: str} + } + return res + }, parseSize: function(size) { size = size.toLowerCase() if (size.endsWith("tb") || size.endsWith("t")) { return parseInt(size) * 1024 * 1024 * 1024 * 1024 diff --git a/lib/user.js b/lib/user.js index 6683a9a7..a8746b3e 100644 --- a/lib/user.js +++ b/lib/user.js @@ -1,12 +1,13 @@ Volcanos("user", {help: "用户模块", agent: { + scanQRCode: function(cb) { + typeof cb == "function" && cb({name: "some"}) + }, getLocation: function(cb) { typeof cb == "function" && cb({name: "some"}) }, openLocation: function(msg) { - window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option("text"))+"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option("text"))) - }, - scanQRCode: function(cb) { - typeof cb == "function" && cb({name: "some"}) + window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option("text")) + +"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option("text"))) }, chooseImage: function(cb) { typeof cb == "function" && cb([]) @@ -28,23 +29,16 @@ Volcanos("user", {help: "用户模块", agent: { jumps: function(url) { location.href = url }, open: function(url) { window.open(url) }, - scan: function(str) { - try { var value = JSON.parse(str) } catch(e) { try { - var value = {"type": "url", "text": str} - var ls = str.split("?"); if (ls.length > 1) { ls = ls[1].split("&") - for (var i = 0; i < ls.length; i++) { var vs = ls[i].split("=") - value[vs[0]] = decodeURIComponent(vs[1]) - } - } - } catch(e) { } } - return value - }, copy: function(event, can, text) { - var input = can.page.Append(can, event.target, [{type: "input", value: text}]).first - input.setSelectionRange(0,-1), input.focus() - document.execCommand("Copy"), can.page.Remove(can, input) - can.user.toast(can, text, "复制成功") - event.stopPropagation(), event.preventDefault() + navigator.clipboard.writeText(text).then(() => { + can.user.toast(can, text, "复制成功") + }).catch(err => { + var input = can.page.Append(can, event.target, [{type: "input", value: text}]).first + input.setSelectionRange(0,-1), input.focus() + document.execCommand("Copy"), can.page.Remove(can, input) + can.user.toast(can, text, "复制成功") + event.stopPropagation(), event.preventDefault() + }) }, camera: function(can, msg, cb) { @@ -106,6 +100,8 @@ Volcanos("user", {help: "用户模块", agent: { }) } }) + + can.run(can.request({}, {text: meta.text})._event, ["search", "Footer.onimport.toast"], function() {}, true) return ui }, share: function(can, msg, cmd) { diff --git a/page/index.css b/page/index.css index 1fcdb8e1..e78c93f3 100644 --- a/page/index.css +++ b/page/index.css @@ -1,29 +1,35 @@ +body.mobile.landscape fieldset.Header.head { + position:unset; +} +body.mobile.landscape fieldset.Footer.foot { + position:unset; +} +body.mobile.landscape fieldset.Action.main { + margin-top:0; margin-bottom:0; +} body.mobile fieldset.Header.head { - position:fixed; + position:fixed; top:0; width:-webkit-fill-available; height:48px; font-size:24px; background-color:#000000b8; z-index:10; } -body.mobile fieldset.Header.head>div.output { - height:48px; -} body.mobile fieldset.Footer.foot { - position:fixed; bottom:0px; + position:fixed; bottom:0; width:-webkit-fill-available; height:64px; font-size:24px; background-color:#000000b8; + display:none; z-index:10; } -body.mobile fieldset.River { - background-color:#243950bf; +body.mobile fieldset.River.left { position:fixed; top:48px; - min-width:240px; - font-size:24px; + background-color:#243950bf; + min-width:240px; font-size:24px; z-index:10; } -body.mobile fieldset.Action { - padding-top:48px; +body.mobile fieldset.Action.main { + margin-top:48px; margin-bottom:64px; } body.mobile select { font-size:18px; diff --git a/pane/Action.css b/pane/Action.css index 1e83a7d8..382530c2 100644 --- a/pane/Action.css +++ b/pane/Action.css @@ -42,7 +42,7 @@ fieldset.Action div.output.grid fieldset.plugin>div.output { width:480px; height:320px; overflow:auto; } fieldset.Action div.output.tabs fieldset.plugin { - display:none; position:absolute; + display:none; } fieldset.Action div.output.tabs fieldset.plugin.select { display:block; diff --git a/pane/Action.js b/pane/Action.js index 9bd6c6cb..3e01ef3c 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -9,7 +9,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) can.onappend.plugin(can, item, function(sub, meta) { can.onimport._plugin(can, river, storm, sub, meta), next() sub._option.dataset = sub._option.dataset || {} - sub._option.dataset.id = item.id + item.id && (sub._option.dataset.id = item.id) }) }) }, @@ -23,7 +23,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) can.page.Modify(can, sub._output, {style: {"max-width": item.width-40}}) can.onengine.listen(can, "action.resize", function(width, height) { - can.page.Modify(can, sub._output, {style: {"max-width": item.width = width-40}}) + can.page.Modify(can, sub._output, {style: {"max-width": width-40}}) + item.width = width }) can.page.Append(can, can._action, [{view: ["item", "div", item.name], onclick: function(event) { diff --git a/pane/Footer.css b/pane/Footer.css index 49c69e91..54d40aa3 100644 --- a/pane/Footer.css +++ b/pane/Footer.css @@ -18,6 +18,9 @@ fieldset.Footer>div.output>div:hover { fieldset.Footer>div.output div.title { float:left; } +fieldset.Footer>div.output div.toast { + float:right; +} fieldset.Footer>div.output div.state { float:right; } diff --git a/pane/Header.js b/pane/Header.js index 0cd860f0..147a2e6e 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -14,7 +14,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onimport._title(can, msg, target) can.onimport._state(can, msg, target) can.onimport._search(can, msg, target) - // can.onengine._daemon(can, can.user.title()) can.onimport._background(can, msg, target) can.onimport._agent(can, msg, target) can.onimport._menu(can, msg, target) @@ -29,8 +28,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) }, _state: function(can, msg, target) { - can.core.List(can.Conf("state")||["time", "username"], function(item) { - can.page.Append(can, target, [{view: ["state "+item, "div", can.Conf(item)], onclick: function(event) { + can.core.List(can.user.isMobile? ["username"]: can.Conf("state")||["time", "username"], function(item) { + can.page.Append(can, target, [{view: ["state "+item, "div", (can.Conf(item)||"").slice(0, 8)], onclick: function(event) { can.core.CallFunc([can.onaction, item], [event, can, item]) }, _init: function(target) { item == "time" && can.onimport._time(can, target) @@ -76,7 +75,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, _weixin: function(can, msg) { can.run({}, ["action", "wx"], function(msg) { can.require(["https://res.wx.qq.com/open/js/jweixin-1.6.0.js"], function(can) { - can.user.agent = { __proto__: can.user.agent, + wx.config({debug: msg.Option("debug") == "true", jsApiList: can.core.Item({ + scanQRCode: function(cb) { wx.scanQRCode({needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) { + typeof cb == "function" && cb(res.resultStr) + } }) }, getLocation: function(cb) { wx.getLocation({type: "gcj02", success: function (res) { typeof cb == "function" && cb({latitude: parseInt(res.latitude*100000), longitude: parseInt(res.longitude*100000) }) } }) }, @@ -86,14 +88,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, name: msg.Option("name"), address: msg.Option("text"), scale: msg.Option("scale")||14, infoUrl: msg.Option("link"), }) }, - scanQRCode: function(cb) { wx.scanQRCode({ needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) { - typeof cb == "function" && cb(can.user.scan(res.resultStr)) - } }) }, chooseImage: function(cb, count) { wx.chooseImage({count: count||9, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: function (res) { typeof cb == "function" && cb(res.localIds) } }) }, - } - wx.config({debug: msg.Option("debug") == "true", jsApiList: can.core.Item(can.user.agent), + }, function(key, value) { return can.user.agent[key] = value, key }), nonceStr: msg.Option("noncestr"), timestamp: msg.Option("timestamp"), appId: msg.Option("appid"), signature: msg.Option("signature"), }) diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 02b23d6d..dea29cd7 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -1,3 +1,6 @@ +fieldset.word a { + word-break:break-word; +} fieldset.word h1.story { clear:both; } diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index bf0ecd89..b166a12c 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -7,7 +7,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.page.Select(can, target, ".story", function(item) { var data = item.dataset||{} can.core.CallFunc([can.onimport, data.type], [can, data, item]) can.page.Modify(can, item, {style: can.base.Obj(data.style)}) - // delete(data.meta) + delete(data.meta) }) }, @@ -40,12 +40,19 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, } }) }, - field: function(can, data, target) { var meta = can.base.Obj(data.meta) - meta.width = can.Conf("width"), meta.height = can.Conf("height") - can.onappend._init(can, meta, ["/plugin/state.js"], function(sub) { + field: function(can, data, target) { var item = can.base.Obj(data.meta) + item.width = parseInt(can.Conf("width"))-20, item.height = parseInt(can.Conf("height")) + item.type = "story" + can.onappend._init(can, item, ["/plugin/state.js"], function(sub) { sub.run = function(event, cmds, cb, silent) { - can.run(event, (cmds[0] == "search"? []: ["action", "story", data.type, data.name, data.text]).concat(cmds), cb, true) + can.run(event, (cmds && cmds[0] == "search"? []: ["action", "story", data.type, data.name, data.text]).concat(cmds), cb, true) } + + can.page.Modify(can, sub._output, {style: {"max-width": item.width-40}}) + can.onengine.listen(can, "action.resize", function(width, height) { + can.page.Modify(can, sub._output, {style: {"max-width": width-60}}) + sub.Conf("width", item.width = width-20) + }) }, can._output, target) }, diff --git a/plugin/state.js b/plugin/state.js index bd63d0dd..95cca512 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -56,73 +56,31 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, }, upload: function(event, can) { can.user.upload(event, can) }, + scanQRCode: function(event, can, cmd) { + can.user.agent.scanQRCode(function(text) { var cmds = ["action", cmd] + can.core.Item(can.base.parseJSON(text), function(key, value) { cmds.push(key, value) }) + can.run(event, cmds, function(msg) { can.user.toast(can, "添加成功"), can.run() }, true) + }) + }, + scanQRCode0: function(event, can) { can.user.agent.scanQRCode() }, + getClipboardData: function(event, can, cmd) { + navigator.clipboard.readText().then(text => { var cmds = ["action", cmd] + can.core.Item(can.base.parseJSON(text), function(key, value) { cmds.push(key, value) }) + can.run(event, cmds, function(msg) { can.user.toast(can, text, "添加成功"), can.run() }, true) + }).catch((err) => { can.base.Log(err) }) + }, getLocation: function(event, can, cmd) { var msg = can.request(can) can.user.agent.getLocation(function(res) { var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) }) - can.run(event, ["action", cmd].concat(arg)) - }) - }, - openLocation: function(event, can) { var msg = can.request(can) - can.user.agent.openLocation(msg) - }, - scanQRCode0: function(event, can) { var msg = can.request(can) - can.user.agent.scanQRCode() - }, - scanQRCode: function(event, can, cmd) { var msg = can.request(can) - can.user.agent.scanQRCode(function(res) { - var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) }) - can.run(event, ["action", cmd].concat(arg)) + can.run(event, ["action", cmd].concat(arg), function(msg) { + can.user.toast(can, "添加成功") + }, true) }) }, + openLocation: function(event, can) { can.user.agent.openLocation(can.request(event)) }, "参数": function(event, can) { can.page.Toggle(can, can._action) }, - "清空": function(event, can, name) { can._output.innerHTML = "" }, - "结束": function(event, can, name) { can.user.confirm("确定结束?") && can.run(event, ["action", name], function(msg) { - can.run({}) - }, true) }, - - "关闭": function(event, can) { - can.page.Remove(can, can._target) - }, - "复制": function(event, can) { - can.onaction._show(can, args, { - position: "fixed", - left: layout.left+100, top: layout.top+100, - width: layout.width, height: layout.height, - }) - }, - "分屏": function(event, can) { - if (event.ctrlKey) { - layout.height = layout.height/2 - can.onaction._resize(sub, layout) - - can.onaction._show(can, args, { - position: "fixed", - left: layout.left, top: layout.top+layout.height+10, - width: layout.width, height: layout.height, - }) - return - } - - layout.width = layout.width/2 - can.onaction._resize(sub, layout) - - can.onaction._show(can, args, { - position: "fixed", - left: layout.left+layout.width+10, top: layout.top, - width: layout.width, height: layout.height, - }) - }, - "最大": function(event, can) { - can.page.Modify(can, can._target, {style: { margin: 0, - left: 0, top: 0, width: window.innerWidth, height: window.innerHeight - }}) - - var sub = can.core.Value(can, "_outputs.-1") - var cb = can.core.Value(can, "_outputs.-1.onimport.resize") - sub && cb && can.core.CallFunc(cb, {can: sub, - width: window.innerWidth, height: window.innerHeight, - }) - }, + "关闭": function(event, can) { can.page.Remove(can, can._target) }, + "清空": function(event, can, name) { can.onmotion.clear(can, can._output) }, }) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/story/trend.js b/plugin/story/trend.js index b239ed62..6f50e3e4 100644 --- a/plugin/story/trend.js +++ b/plugin/story/trend.js @@ -10,9 +10,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.core.Timer(100, function() { can.sub = sub._outputs[0] can.sub.onmotion.hidden(can.sub, can.sub.ui.project) can.onaction[can.Action("view")](event, can) - can.onlayout.resize(can, "action.resize", function(event) { - can.onaction[can.Action("view")](event, can) - }) }) } }) @@ -65,14 +62,14 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view", var space = 10 var view = parseInt(can.Action("height")) - var max = parseInt(can.Conf("width"))-40 - var step = parseInt(max / can.list.length)||2 + var max = parseInt(can.Conf("width")) + var step = parseInt(max / (can.list.length+1))||2 can.onmotion.clear(can, sub.svg) var width = can.list.length * step + space * 2 var height = view + space * 2 sub.svg.Val("height", height) - sub.svg.Val("width", width) + sub.svg.Val("width", width-space*2+5) function compute(y) { return (y - can.min)/(can.max - can.min)*view } can.core.Next(can.list, function(line, next, index) { diff --git a/plugin/table.js b/plugin/table.js index ecf278a1..a3369921 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -3,15 +3,14 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, if (can.onimport._process(can, msg)) { return typeof cb == "function" && cb(can, msg) } can.onmotion.clear(can) - can.ui = can.onlayout.display(can) typeof cb == "function" && cb(msg) - can.page.Append(can, can.ui.content, [can.onimport._control(can, msg)]) + can.page.Append(can, target, [can.onimport._control(can, msg)]) can.onappend.table(can, msg, function(value, key, index, line, array) { return can.onimport._table(can, value, key, index, line, array) - }, can.ui.content) + }) - can.onappend.board(can, msg.Result(), can.ui.display) + can.onappend.board(can, msg.Result()) can.onimport._board(can, msg) }, _table: function(can, value, key, index, line, array) { @@ -57,9 +56,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, _follow: function(can, msg) { if (msg.Option("cache.status") == "stop") { return can.user.toast(can, msg.Option("cache.action")+" done!")} - can.page.Modify(can, can.ui.display, {className: "code", style: {"max-height": 400, "display": "block"}}) - can.page.Append(can, can.ui.display, [{text: msg.Result()}]) - can.ui.display.scrollBy(0, 1000) + can.page.Modify(can, can._output, {className: "code", style: {"max-height": 400, "display": "block"}}) + can.page.Append(can, can._output, [{text: msg.Result()}]) + can._output.scrollBy(0, 1000) can.core.Timer(100, function() { var sub = can.request({}) sub.Option("cache.hash", msg.Option("cache.hash")) @@ -74,11 +73,11 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, _inner: function(can, msg) { can.onappend.table(can, msg, function(value, key, index, line, array) { return can.onimport._table(can, value, key, index, line, array) - }, can.ui.display) + }, can._output) - can.onappend.board(can, msg.Result(), can.ui.display) + can.onappend.board(can, msg.Result(), can._output) can.onimport._board(can, msg) - can.page.Modify(can, can.ui.display, {style: {display: "block"}}) + can.page.Modify(can, can._output, {style: {display: "block"}}) return true }, @@ -122,7 +121,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, {input: ["cache.value", function(event) { if (event.key == "Enter") { - can.page.Select(can, can.ui.content, "tr", function(tr, index) { + can.page.Select(can, can._output, "tr", function(tr, index) { if (event.target.value == "") { can.page.Modify(can, tr, {style: {"display": ""}}); return } index > 0 && can.page.Modify(can, tr, {style: {"display": "none"}}) can.page.Select(can, tr, "td", function(td, index) {