diff --git a/frame.js b/frame.js
index 663d62da..2100c448 100644
--- a/frame.js
+++ b/frame.js
@@ -145,7 +145,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
}); return sub
},
_option: function(can, meta, option, skip) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {})
- meta.inputs = can.base.Obj(meta.inputs, [{type: html.BUTTON, name: html.LIST, action: html.AUTO}])
+ meta.inputs = can.base.Obj(meta.inputs, []), meta.inputs.length == 0 && can.onmotion.delay(can, function() { can.Update() })
can.core.List([""].concat(meta.inputs), function(item) { if (item != "" && item.type != html.BUTTON) { return }
var icon = {
"": {name: mdb.DELETE, cb: function(event) { can.onaction.close(event, can) }},
@@ -355,6 +355,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
if (key == nfs.IMAGE && value) { value = can.core.List(can.core.Split(data[key]), function(item) { return img(can.misc.ShareCache(can, item)) }).join("") }
if (key == mdb.ICONS && value) { value = img(can.misc.Resource(can, data[key])) }
if (key == mdb.NAME) { value = can.user.trans(can, value, null, html.INPUT) }
+ if (key == aaa.PASSWORD) { value = "******" }
return {text: [msg.IsDetail() && key == mdb.KEY? can.user.trans(can, value, null, html.INPUT): can.user.trans(can, value, null, html.VALUE), html.TD], onclick: function(event) { var target = event.target
if (key == cli.QRCODE && can.page.tagis(event.target, html.IMG)) { can.user.opens(event.target.title) }
if (can.page.tagis(target, html.INPUT) && target.type == html.BUTTON) { can.requestAction(event, target.name)
diff --git a/index.css b/index.css
index b50b4e25..d2e7ad84 100644
--- a/index.css
+++ b/index.css
@@ -494,6 +494,7 @@ body.mobile div.output.stats { justify-content:space-around; }
div.output.stats>div.item { text-align:center; padding:10px; margin:10px; float:left; display:flex; flex-direction:column; justify-content:center; flex-grow:1; }
div.output.stats>div.item>div.name { font-size:var(--status-font-size); font-style:italic; color:var(--disable-fg-color); }
div.output.stats>div.item>div.value { font-size:32px; }
+div.output.stats>div.item>div.value span.units { color:var(--disable-fg-color); font-size:24px; font-style:italic; }
fieldset.input.icon div.output td { font-size:28px; padding:5px; }
fieldset.Search div.story[data-type=spark] { margin:0; }
fieldset.Search>div.output>div.profile { border-left:none; width:unset; }
diff --git a/lib/misc.js b/lib/misc.js
index 5db8afba..48e9529f 100644
--- a/lib/misc.js
+++ b/lib/misc.js
@@ -95,7 +95,7 @@ Volcanos("misc", {
},
POST: function(can, msg, url, form, cb, cbs) { var xhr = new XMLHttpRequest(), begin = new Date(); msg._xhr = xhr
var data = can.core.ItemForm(form, function(v, i, k) { return k+mdb.EQ+encodeURIComponent(v) }).join("&")
- if (can.base.isIn(msg._method, http.GET, http.DELETE)) { url += (url.indexOf("?") == -1? "?": "&")+data, data = "" }
+ if (data && can.base.isIn(msg._method, http.GET, http.DELETE)) { url += (url.indexOf("?") == -1? "?": "&")+data, data = "" }
xhr.open(msg._method||http.POST, url), xhr.onreadystatechange = function() { if (xhr.readyState != 4) { return }
try { var res = JSON.parse(xhr.responseText) } catch (e) {
if (xhr.responseText.indexOf("warn: ")) {
diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js
index b274c3b5..4d73eb74 100644
--- a/plugin/local/code/inner.js
+++ b/plugin/local/code/inner.js
@@ -369,10 +369,14 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { if (!msg) { return }
_split: function(can, msg, content, cb, key) {
var path = msg.Option(nfs.PATH, can.Option(nfs.PATH)), file = msg.Option(nfs.FILE, can.Option(nfs.FILE))
function show(p) {
- p && p.include && can.core.List(p.include, function(from) {
- p.keyword = p.keyword||{}, can.core.Item(can.onsyntax[from].keyword, function(key, value) { p.keyword[key] = p.keyword[key] || value })
- can.core.Item(can.onsyntax[from], function(key, value) { p[key] = p[key] || value })
- })
+ function include(list) { if (!list || list.length == 0) { return }
+ can.core.List(list, function(from) {
+ p.split = p.split|| can.onsyntax[from].split
+ include(can.onsyntax[from].include)
+ p.keyword = p.keyword||{}, can.core.Item(can.onsyntax[from].keyword, function(key, value) { p.keyword[key] = p.keyword[key] || value })
+ can.core.Item(can.onsyntax[from], function(key, value) { p[key] = p[key] || value })
+ })
+ } p && include(p.include)
p && p.prepare && can.core.ItemForm(p.prepare, function(value, index, key) { p.keyword = p.keyword||{}, p.keyword[value] = key })
if (!content._root && can.db.history.length > 1) { content = can.ui.content = can.page.insertBefore(can, [{view: html.CONTENT, style: {width: can.ui.content.offsetWidth}}], can.ui._profile), content._cache_key = key }
content._max = 0, content._msg = msg, msg.__content = content, can.page.Appends(can, content, [{view: ["tips", "", msg.Option(nfs.FILE)]}])
diff --git a/plugin/local/code/inner/syntax.js b/plugin/local/code/inner/syntax.js
index c9214701..08cec628 100644
--- a/plugin/local/code/inner/syntax.js
+++ b/plugin/local/code/inner/syntax.js
@@ -231,8 +231,14 @@ Volcanos(chat.ONSYNTAX, {
"length": code.FUNCTION, "split": code.FUNCTION, "trim": code.FUNCTION, "toLowerCase": code.FUNCTION, "indexOf": code.FUNCTION, "lastIndexOf": code.FUNCTION,
"concat": code.FUNCTION, "reverse": code.FUNCTION, "slice": code.FUNCTION, "join": code.FUNCTION, "sort": code.FUNCTION, "push": code.FUNCTION, "pop": code.FUNCTION,
"stringify": code.FUNCTION, "parse": code.FUNCTION,
+ "require": code.FUNCTION,
+
+ "kit": code.CONSTANT, "ice": code.CONSTANT,
+ "ctx": code.CONSTANT, "mdb": code.CONSTANT, "web": code.CONSTANT, "aaa": code.CONSTANT,
+ "tcp": code.CONSTANT, "nfs": code.CONSTANT, "cli": code.CONSTANT, "log": code.CONSTANT,
+ "code": code.CONSTANT, "wiki": code.CONSTANT, "chat": code.CONSTANT, "team": code.CONSTANT, "mall": code.CONSTANT,
+ "http": code.CONSTANT, "html": code.CONSTANT, "icon": code.CONSTANT, "svg": code.CONSTANT,
- "kit": code.PACKAGE, "ice": code.PACKAGE,
"can": code.OBJECT, "msg": code.OBJECT, "cb": code.FUNCTION, "target": code.OBJECT, "event": code.OBJECT,
"Volcanos": code.FUNCTION, "shy": code.FUNCTION, "cbs": code.FUNCTION,
"res": code.OBJECT, "sub": code.OBJECT, "sup": code.OBJECT,
diff --git a/plugin/story/stats.js b/plugin/story/stats.js
index 77ad3d0f..65172e4c 100644
--- a/plugin/story/stats.js
+++ b/plugin/story/stats.js
@@ -7,11 +7,10 @@ Volcanos(chat.ONIMPORT, {
while (value > 0) { ls.push(value%1000)
if (ls.length == 1) { ls[0] = ls[0].toFixed(2) }
value = parseInt(value/1000)
- }
- return ls.reverse().join(", ")
+ } return ls.reverse().join(", ")
}
can.core.Item(stats, function(name, value) { can.page.Append(can, can._output, [{view: [[html.ITEM, name]], list: [
- {view: [mdb.VALUE, "", can.base.trimSuffix(fmts(parseFloat(value).toFixed(2))+"", ".00")+" "+units[name]]},
+ {view: mdb.VALUE, list: [{text: can.base.trimSuffix(fmts(parseFloat(value).toFixed(2))+"", ".00")}, {text: [units[name], "", "units"]}]},
{view: [mdb.NAME, "", can.user.trans(can, name, null, html.INPUT)]},
]}]) }), can.isCmdMode() && can.onappend.table(can, msg)
},
diff --git a/publish/client/mp/app.json b/publish/client/mp/app.json
index 35adc4ae..b5af881e 100644
--- a/publish/client/mp/app.json
+++ b/publish/client/mp/app.json
@@ -1,16 +1,16 @@
{
- "pages": [
- "pages/river/river",
- "pages/action/action",
- "pages/insert/insert"
- ],
- "window": {
- "backgroundColor": "#000",
- "backgroundTextStyle": "dark",
- "navigationBarBackgroundColor": "#000",
- "navigationBarTitleText": "终端工具链",
- "navigationBarTextStyle": "white"
- },
- "style": "v2",
- "sitemapLocation": "sitemap.json"
+ "pages": [
+ "pages/river/river",
+ "pages/action/action",
+ "pages/insert/insert"
+ ],
+ "window": {
+ "backgroundColor": "#000",
+ "backgroundTextStyle": "dark",
+ "navigationBarBackgroundColor": "#000",
+ "navigationBarTitleText": "终端工具链",
+ "navigationBarTextStyle": "white"
+ },
+ "style": "v2",
+ "sitemapLocation": "sitemap.json"
}
diff --git a/publish/client/mp/app.wxml b/publish/client/mp/app.wxml
index 00029c3c..24943871 100644
--- a/publish/client/mp/app.wxml
+++ b/publish/client/mp/app.wxml
@@ -1,7 +1,7 @@
-
+
@@ -26,15 +26,12 @@
-
-
{{item.values[item.index||0]}}
-
@@ -44,7 +41,6 @@
-
@@ -57,12 +53,13 @@
{{item}} |
-
- {{input._text}}
+
+ {{input._text}}
-
+
|
diff --git a/publish/client/mp/pages/action/action.js b/publish/client/mp/pages/action/action.js
index 902fb11e..02cac9d5 100644
--- a/publish/client/mp/pages/action/action.js
+++ b/publish/client/mp/pages/action/action.js
@@ -24,7 +24,7 @@ Volcanos(chat.ONIMPORT, {
input.value = {"list": "查看", "back": "返回", "create": "创建"}[input.value||input.name]||input.value||input.name
}
input.type == html.BUTTON && input.action == ice.AUTO && can.core.Timer(100, function() {
- can.run({}, [can.db.river, can.db.storm, value.id||value.index], function(msg) {
+ can.run({}, [value.id||value.index], function(msg) {
value.msg = msg, can.page.setData(can)
})
})
@@ -36,7 +36,19 @@ Volcanos(chat.ONACTION, {list: ["刷新", "扫码", "清屏"],
"刷新": function(event, can) { can.onaction.refresh(event, can) },
"扫码": function(event, can) { can.user.agent.scanQRCode(can) },
"清屏": function(event, can) { can.core.List(can.ui.data.list, function(item) { delete(item.msg) }), can.page.setData(can) },
- refresh: function(event, can) { can.run(event, [can.db.river, can.db.storm], function(msg) { can.onimport._init(can, msg) }) },
+ refresh: function(event, can) { can.onaction._cmds = [], can.onaction._space = ""
+ if (can.db.cmd||can.db.index) {
+ can.onaction._space = can.db.pod||can.db.space
+ can.onaction._serve = decodeURIComponent(can.db.serve)
+ can.user.title(can.core.Keys(can.onaction._space, can.db.cmd||can.db.index))
+ can.run(event, [ctx.ACTION, ctx.COMMAND, can.db.cmd||can.db.index], function(msg) {
+ can.onaction._cmds = [ctx.ACTION, ctx.RUN], can.onimport._init(can, msg)
+ })
+ } else {
+ can.onaction._cmds = [can.db.river, can.db.storm]
+ can.run(event, [], function(msg) { can.onimport._init(can, msg) })
+ }
+ },
onaction: function(event, can, button, data) { var name = data.name;
(can.onaction[name]||function(event) { can.run(event, [ctx.ACTION, name]) })(event, can)
},
@@ -52,7 +64,7 @@ Volcanos(chat.ONACTION, {list: ["刷新", "扫码", "清屏"],
var field = can.ui.data.list[order||0]
if (field.feature[name]) {
can.data.insert = {field: field, name: name, list: field.feature[name], cb: function(res) {
- can.run(event, can.base.Simple([can.db.river, can.db.storm, field.id||field.index, ctx.ACTION, name], res), function(msg) {
+ can.run(event, can.base.Simple([field.id||field.index, ctx.ACTION, name], res), function(msg) {
can.onaction.onAction(event, can, ice.LIST, {order: order, name: ice.LIST})
})
}}
@@ -71,19 +83,28 @@ Volcanos(chat.ONACTION, {list: ["刷新", "扫码", "清屏"],
case "refresh": break
default: return
}
- var cmds = [can.db.river, can.db.storm, field.id||field.index]
var cmd = can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { return input.value } })
+ for (var i = cmd.length-1; i > 0; i--) { if (cmd[i] === "") { cmd.pop() } else { break } }
function eq(to, from) { if (!to) { return false }
if (to.length != from.length) { return false }
for (var i = 0; i < to.length; i++) { if (to[i] != from[i]) { return false } }
return true
} eq(field._history[field._history.length-1], cmd) || field._history.push(cmd)
- cmds = cmds.concat(cmd)
- for (var i = cmds.length-1; i > 0; i--) { if (cmds[i] === "") { cmds.pop() } else { break } }
- can.run(event, cmds, function(msg) { field.msg = msg, can.page.setData(can) })
+ can.run(event, [field.id||field.index].concat(cmd), function(msg) { field.msg = msg, can.page.setData(can) })
},
- onDetail: function(event, can, button, data) { var order = data.order, name = data.name, value = data.value
+ onDetail: function(event, can, button, data) { var order = data.order, name = data.name, value = data.value, input = data.input
var field = can.ui.data.list[order||0]
+ if (input && input.type == html.BUTTON) {
+ can.request(event, field.msg.Table()[data.index])
+ if (field.feature[input.name]) {
+ can.onAction(event, can, input.name, {order: order, name: input.name})
+ } else {
+ can.run(event, [field.id||field.index, ctx.ACTION, input.name], function(msg) {
+ // value.msg = msg, can.page.setData(can)
+ })
+ }
+ return
+ }
can.core.List(field.inputs, function(input) {
if (input.name == name) { input.value = value, can.page.setData(can)
can.onaction.onAction(event, can, ice.LIST, {order: order, name: ice.LIST})
diff --git a/publish/client/mp/utils/const.js b/publish/client/mp/utils/const.js
index afacc3b8..7f534cb1 100644
--- a/publish/client/mp/utils/const.js
+++ b/publish/client/mp/utils/const.js
@@ -15,6 +15,8 @@ var ice = {
MAIN: "main", AUTO: "auto",
LIST: "list", BACK: "back",
+ CAN: "can", POD: "pod", CTX: "ctx", CMD: "cmd", ARG: "arg",
+
MSG_FIELDS: "fields", MSG_SESSID: "sessid",
MSG_DETAIL: "detail", MSG_OPTION: "option", MSG_APPEND: "append", MSG_RESULT: "result",
}
diff --git a/publish/client/mp/utils/lib/base.js b/publish/client/mp/utils/lib/base.js
index 62978f18..8d9562b4 100644
--- a/publish/client/mp/utils/lib/base.js
+++ b/publish/client/mp/utils/lib/base.js
@@ -27,6 +27,7 @@ Volcanos("base", {
MergeURL: function(url) { var arg = this._parse(url); delete(arg._origin); for (var i = 1; i < arguments.length; i += 2) { delete(arg[arguments[i]]) }
var arg = this.Args.apply(this, [arg].concat(Array.prototype.slice.call(arguments, 1))); return url.split(ice.QS)[0]+(arg? ice.QS+arg: "")
},
+ ParseURL: function(url) { var res = this._parse(url); res.link = url, res.origin = res._origin; return res },
ParseJSON: function(str) { var res; if (typeof str == code.OBJECT) { return str }
if (str.indexOf(ice.HTTP) == 0) {
var res = this._parse(str, {type: web.LINK, name: "", text: str})
diff --git a/publish/client/mp/utils/lib/core.js b/publish/client/mp/utils/lib/core.js
index eaf02991..2bd26641 100644
--- a/publish/client/mp/utils/lib/core.js
+++ b/publish/client/mp/utils/lib/core.js
@@ -2,6 +2,14 @@ const {ice, mdb, nfs, code, http} = require("../const.js")
const {shy, Volcanos} = require("../proto.js")
module.exports =
Volcanos("core", {
+ Keys: function() { var list = []
+ for (var i = 0; i < arguments.length; i++) { var v = arguments[i]; switch (typeof v) {
+ case code.OBJECT: for (var j = 0; j < v.length; j++) { list.push(v[j]) } break
+ case code.NUMBER: list.push(v+""); break
+ case code.FUNCTION: v = v()
+ default: v && list.push(v+"")
+ } } return list.join(nfs.PT)
+ },
Value: function(data, key, value) { if (data == undefined) { return } if (key == undefined) { return data }
if (typeof key == code.OBJECT) { if (key.length != undefined) { key = key.join(nfs.PT) } else { for (var k in key) { arguments.callee.call(this, data, k, key[k]) } return data } }
if (value != undefined) { var _node = data, keys = key.split(nfs.PT)
diff --git a/publish/client/mp/utils/lib/misc.js b/publish/client/mp/utils/lib/misc.js
index 36b7ea62..e3c58f2c 100644
--- a/publish/client/mp/utils/lib/misc.js
+++ b/publish/client/mp/utils/lib/misc.js
@@ -1,4 +1,4 @@
-const {kit, ice, mdb, nfs, code, http} = require("../const.js")
+const {kit, ice, mdb, nfs, code, chat, http} = require("../const.js")
const {Volcanos} = require("../proto.js")
module.exports =
Volcanos("misc", {
@@ -50,11 +50,19 @@ Volcanos("misc", {
}); return msg },
Echo: function(res) { msg.result = (msg.result||[]).concat(can.core.List(arguments)); return msg._hand = true, msg },
}); return msg },
+ ParseURL: function(can, url) { url = url||location&&location.href; var args = can.base.ParseURL(url)
+ delete(args.link), delete(args.origin), delete(args._origin)
+ var ls = can.core.Split(url.split("://")[1].split("?")[0].split("#")[0], nfs.PS).slice(1)
+ if (ls[0] == chat.SHARE) { args[chat.SHARE] = ls[1] }
+ for (var i = 1; i < ls.length; i += 2) { if (can.base.isIn(ls[i], [ice.POD, ice.CMD])) { args[ls[i]] = ls[i+1] } }
+ return args
+ },
requests: function(can, msg, cmd, data, cb) {
wx.showLoading(), can.misc.request(can, msg, cmd, data, function(msg) { wx.hideLoading(), cb && cb(msg) })
},
request: function(can, msg, cmd, data, cb) { data.sessid = can.conf.sessid
- wx.request({method: http.POST, url: can.conf.serve+cmd, data: data, success: function(res) {
+ can.core.List(msg.option, function(key) { data[key] = data[key]||[msg.Option(key)] }), data.option = data.option||msg.option
+ wx.request({method: http.POST, url: (msg._serve||can.conf.serve)+cmd, data: data, success: function(res) {
if (res.statusCode == 401) {
can.user.info = {}, can.misc.localStorage(can, ice.MSG_SESSID, can.conf.sessid = "")
return can.user.login(can, function() { can.misc.request(can, msg, cmd, data, cb) })
diff --git a/publish/client/mp/utils/lib/user.js b/publish/client/mp/utils/lib/user.js
index e7bb1020..f9a58dc3 100644
--- a/publish/client/mp/utils/lib/user.js
+++ b/publish/client/mp/utils/lib/user.js
@@ -1,4 +1,4 @@
-const {ice, ctx, mdb, chat} = require("../const.js")
+const {ice, ctx, mdb, web, chat} = require("../const.js")
const {shy, Volcanos} = require("../proto.js")
module.exports =
Volcanos("user", {
@@ -19,18 +19,13 @@ Volcanos("user", {
},
scanQRCode: function(can, cb) {
wx.scanCode({success: function(res) { var data = can.base.ParseJSON(res.result)
+ if (data.type == web.LINK, data._origin) { can.base.Copy(data, can.misc.ParseURL(can, res.result)) }
if (cb && cb(data)) { return }
- switch (data.type) {
- case "auth":
- can.user.userinfo(can, function() {
- can.user.modal(can, "授权登录", data.name, function(res) {
- res.confirm && can.misc.request(can, can.request(), chat.WX_LOGIN_SCAN, data, function(msg) {
- can.user.toast(can, "授权成功")
- })
- })
- })
- break
- default: can.misc.request(can, can.request(), chat.WX_LOGIN_SCAN, data)
+ if (data.cmd) { var serve = /(https?:\/\/[^/]+)([^?#])/.exec(data._origin)[1]; data.serve = serve
+ delete(data.type), delete(data.name), delete(data.text), delete(data._origin)
+ can.user.jumps(can.base.MergeURL("/pages/action/action", data))
+ } else {
+ can.misc.request(can, can.request(), chat.WX_LOGIN_SCAN, data)
}
}})
},
diff --git a/publish/client/mp/utils/proto.js b/publish/client/mp/utils/proto.js
index 5a20c8ce..fba77ca4 100644
--- a/publish/client/mp/utils/proto.js
+++ b/publish/client/mp/utils/proto.js
@@ -25,7 +25,8 @@ Volcanos._init = function() {
}); return msg
},
run: function(event, cmds, cb) {
- can.misc.requests(can, can.request(event), can.onaction._name||nfs.CHAT_ACTION, {cmds: cmds}, function(msg) {
+ var msg = can.request(event); msg._serve = can.onaction._serve
+ can.misc.requests(can, can.request(event, {pod: can.onaction._space}), can.onaction._name||nfs.CHAT_ACTION, {cmds: (can.onaction._cmds||[]).concat(cmds)}, function(msg) {
msg.Dump = function() { can.ui.setData({list: msg.Table()}) }, cb(msg)
})
},