diff --git a/const.js b/const.js index 6b901354..86258401 100644 --- a/const.js +++ b/const.js @@ -81,6 +81,7 @@ var mdb = {FOREACH: "*", RANDOMS: "%", NOTFOUND: "notfound", NICK: "nick", HELP: "help", + INFO: "info", DATA: "data", VIEW: "view", INPUTS: "inputs", CREATE: "create", REMOVE: "remove", UPDATE: "update", INSERT: "insert", DELETE: "delete", MODIFY: "modify", SELECT: "select", diff --git a/frame.js b/frame.js index 2ad57fc6..d40fd740 100644 --- a/frame.js +++ b/frame.js @@ -276,6 +276,7 @@ Volcanos(chat.ONAPPEND, { can.base.isString(item)? /* 2.按键 */ {type: html.BUTTON, name: item, value: can.user.trans(can, item, meta._trans), onclick: function(event) { run(event, item) }}: item.length > 0? /* 3.列表 */ {type: html.SELECT, name: item[0], value: item.value, values: item.slice(1), onchange: function(event) { can.misc.Event(event, can, function(msg) { + if (!can.onexport) { return } var button = event.target.value; can.onexport.session && can.onexport.session(can, "action:"+(item.name||item[0]), button) can.onaction._select && can.onaction._select(event, can, item[0], button) meta[item[0]]? can.core.CallFunc(meta[item[0]], [event, can, item[0], button]): @@ -1292,8 +1293,8 @@ Volcanos(chat.ONMOTION, { }, slideAction: function(can, target) { var action = can.page.Select(can, target.parentNode, html.DIV_ACTION)[0] - var beginY, beginX, beginLeft, max = can.base.Max(action.offsetWidth, 200, 60) - target.addEventListener("touchstart", function(event) { max = can.base.Max(action.offsetWidth, 200, 60) + var beginY, beginX, beginLeft, max = can.base.Max(action.offsetWidth, 240, 60) + target.addEventListener("touchstart", function(event) { max = can.base.Max(action.offsetWidth, 240, 60) beginY = event.touches[0].clientY, beginX = event.touches[0].clientX, beginLeft = parseFloat(target.style.left)||0 }) target.addEventListener("touchmove", function(event) { diff --git a/index.css b/index.css index 4221ea99..71af0d4d 100644 --- a/index.css +++ b/index.css @@ -205,14 +205,14 @@ div.item.card img { height:60px; width:60px; margin:5px; } div.item.card div.info { width:100%; } div.item.card div.title { font-size:16px; } div.item.card div.title span { margin-right:5px; } -div.item.card div.title span.type { border:var(--box-notice); color:var(--notice-bg-color); font-size:12px; padding:0 5px; margin-left:5px; } -div.item.card div.title span.role { border:var(--box-notice); color:var(--notice-bg-color); font-size:12px; padding:0 5px; margin-left:5px; } -div.item.card div.title span.status { border:var(--box-notice); color:var(--notice-bg-color); font-size:12px; padding:0 5px; margin-left:5px; } +div.item.card div.title span.type { border:var(--box-notice); color:var(--notice-bg-color); font-size:12px; padding:0 5px; } +div.item.card div.title span.role { border:var(--box-notice); color:var(--notice-bg-color); font-size:12px; padding:0 5px; } +div.item.card div.title span.status { border:var(--box-notice); color:var(--notice-bg-color); font-size:12px; padding:0 5px; } div.item.card div.status { font-size:12px; color:gray; } div.item.card div.status span { margin-right:5px; } -div.item.card div.action { max-width:200px; display:flex; align-items:center; } +div.item.card div.action { max-width:100%; display:flex; align-items:center; } div.item.card div.action { position:absolute; right:0; } -div.item.card div.action input[type=button] { border:none; margin-left:5px; } +div.item.card div.action input[type=button] { border:none; color:var(--notice-bg-color); margin-left:5px; } div.item.card div.action input[type=button].danger { color:var(--danger-bg-color) } div.item.card div.action input[type=button]:last-child { margin-right:5px; } div.item.card div.output { padding:10px 0; display:flex; transition:left .2s; } @@ -443,7 +443,7 @@ body>div.input input[name=submit]:hover { background-color:var(--notice-bg-color body>div.input input[name=cancel]:hover { background-color:var(--danger-bg-color); color:var(--danger-fg-color); } body>div.input div.action { padding:var(--table-padding); width:100%; position:sticky; bottom:0; flex-direction:row-reverse; cursor:move; } body>div.input div.action>div.item { margin-left:var(--button-margin); float:right; } -body>div.input div.action>div.item>input[type=button] { width:112px; } +body>div.input div.action>div.item>input[type=button] { min-width:112px; } body>div.input.login { flex-direction:column; } body>div.input.login>div.action { border-bottom:var(--box-border); padding:0; flex-direction:row; } body>div.input.login>div.action>div.tabs { padding:var(--button-padding); } diff --git a/lib/user.js b/lib/user.js index 66c5570c..47202a38 100644 --- a/lib/user.js +++ b/lib/user.js @@ -251,9 +251,7 @@ Volcanos("user", { ], onclick: function(event) { if (!can.page.tagis(event.target, html.INPUT, html.TEXTAREA)) { can.onmotion.clearCarte(can) } }}]) var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, { _trans: {submit: msg.Option(web.SUBMIT)}, - focus: function() { - can.onmotion.focus(can, can.page.Select(can, ui._target, html.INPUT_ARGS)[0]) - }, + focus: function() { can.onmotion.focus(can, can.page.Select(can, ui._target, html.INPUT_ARGS)[0]) }, Option: function(key, value, hidden) { var target = can.page.Select(can, ui._target, "input.args[name="+key+"]")[0] if (!target) { return } @@ -262,8 +260,7 @@ Volcanos("user", { return target.value }, cancel: function(event, can, button) { - button == "cancel" && msg._cancel && msg._cancel(event) - callback("afterInputs", button) + button == "cancel" && msg._cancel && msg._cancel(event), callback("afterInputs", button) can.onengine.signal(can, "onremove", can.request(event, {query: can.page.getquery(can, ui._target)})), can.page.Remove(can, ui._target) }, submit: function(event, can, button) { var args = [], data = {}, err = false diff --git a/panel/header.js b/panel/header.js index d7310b16..ab77ccd8 100644 --- a/panel/header.js +++ b/panel/header.js @@ -99,7 +99,9 @@ Volcanos(chat.ONACTION, {_init: function(can) {}, lang(msg, function() { can.onmotion.clear(can), can.onimport._init(can, can.request(), can._output), can.onengine.signal(can, chat.ONLOGIN) }) } can.run(can.request({}, {_method: http.GET}), [], function(msg) { lang(msg) - if (msg.Option(ice.MSG_PROCESS) == "_open") { return can.user.jumps(msg.Option("_arg")) } + if (msg.Option(ice.MSG_PROCESS) == "_open") { + // return can.user.jumps(msg.Option("_arg")) + } can.ui.diy = can.base.Obj(msg.Option("diy"))||{}, can.__theme = can.onimport._theme(can, can.page.theme(function(theme) { can.onengine.signal(can, chat.ONTHEMECHANGE, can.request(event, {theme: can.__theme = can.onimport._theme(can, theme)})), can.onimport.theme(can) })), can.onimport.theme(can, can.misc.Search(can, "theme")||"") diff --git a/plugin/input/date.js b/plugin/input/date.js index 5d33f02f..94a35c43 100644 --- a/plugin/input/date.js +++ b/plugin/input/date.js @@ -25,8 +25,12 @@ Volcanos(chat.ONFIGURE, {date: { return now } show(now), can._show = function(d) { d? _cb(show(now = new Date(now.getTime()+d*24*3600*1000))): _cb(show(now)) } })}, - onfocus: function(event, can, meta, target, cbs, mod) { if (target._selectonly) { target.blur() } }, - onblur: function(event, can, sub, cb, target) { if (target._selectonly) { return } }, + onfocus: function(event, can, meta, target, cbs, mod) { + if (target._selectonly) { can.onmotion.delay(can, function() { target.blur() }) } + }, + onblur: function(event, can, sub, cb, target) { + if (target._selectonly) { return } + }, onkeydown: function(event, can, meta, cb, target, sub, last) { if (sub && sub.hidden()) { return last(event) } switch (event.key) { case "n": can.page.SelectInput(can, sub._action, mdb.NEXT, function(target) { target.click(), sub._show() }); break case "p": can.page.SelectInput(can, sub._action, mdb.PREV, function(target) { target.click(), sub._show() }); break diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index c7093fc3..f7ac25a6 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -462,7 +462,7 @@ Volcanos(chat.ONACTION, { show: function(event, can) { can._msg._profile_hidden = false, can.runAction(can.request(event, {_toast: "渲染中...", args: can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.RENDER, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.profile(can, msg) }) }, exec: function(event, can) { can.runAction(can.request(event, {_toast: "执行中...", args: can.onexport.session(can, DISPLAY_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.ENGINE, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) }) }, plug: function(event, can, button) { - function show(index, args) { input.cancel(); can.onimport.toolkit(can, {index: index, args: can.core.Split(args||"")}, function(sub) { sub.select() }) } + function show(index, args) { input.cancel({}, can, "cancel"); can.onimport.toolkit(can, {index: index, args: can.core.Split(args||"")}, function(sub) { sub.select() }) } var input = can.user.input(can.request(event, {type: button}), can, [{type: html.TEXT, name: ctx.INDEX, run: function(event, cmds, cb) { can.run(event, cmds, function(msg) { if (cmds[0] == ctx.ACTION && cmds[1] == mdb.INPUTS && cmds[2] == ctx.INDEX) { var _msg = can.request({}) can.core.Item(can.db.toolkit, function(index) { _msg.Push(ctx.INDEX, index) }), _msg.Push(ctx.INDEX, ""), _msg.Copy(msg), cb(_msg) @@ -480,7 +480,7 @@ Volcanos(chat.ONACTION, { can.core.Item(can.onengine.plugin.meta, function(key, value) { push(ctx.INDEX, "can."+key) }), cb(_msg) } else { cb(msg) } }, true) - }}], function(list, input) { input.cancel(); var ls = can.core.Split(list[0], nfs.DF, nfs.DF); switch (ls[0]) { + }}], function(list, input) { input.cancel({}, can, "cancel"); var ls = can.core.Split(list[0], nfs.DF, nfs.DF); switch (ls[0]) { case web.HTTP: return can.onimport.tabview(can, "", list[0], web.SPACE) case nfs.LINE: return can.onaction.selectLine(can, parseInt(ls[1]), true) case web.SPACE: return can.onimport.tabview(can, "", ls[1].indexOf(web.HTTP) == 0? list[0].slice(6): ls[1], web.SPACE) diff --git a/plugin/state.js b/plugin/state.js index 642da951..d1d39e70 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -16,7 +16,8 @@ Volcanos(chat.ONIMPORT, { _clear: function(can, msg) { can.onmotion.clear(can) }, _inner: function(can, sub, msg) { sub = sub||can, can.onmotion.scrollIntoView(can, can.onappend.table(sub, msg)), can.onmotion.scrollIntoView(can, can.onappend.board(sub, msg)), can.onmotion.story.auto(sub) }, _cookie: function(can, msg) { can.misc.Cookie(can, msg._arg[0], msg._arg[1]) - if (msg._arg[2]) { history.go(msg._arg[2]) + if (msg._arg[2]) { + history.go(msg._arg[2]) can.onmotion.delay(can, function() { history.back() }, 300) } else { can.Update() diff --git a/plugin/table.js b/plugin/table.js index 4f18db9e..5be895cc 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -271,7 +271,7 @@ Volcanos(chat.ONIMPORT, { _float: function(can, index, args) { args = args||[] can.user.isMobile? can.user.jumps(can.misc.MergePodCmd(can, {cmd: index+"/"+args.join("/")})): can.onappend._float(can, index, args) }, - + myOption: function(can) { var sub = can.sub; if (!sub) { return } var plugin = sub._stacks_current[0] current = plugin.current||{} if (plugin == sub._stacks_root) { var PLACE_UID = can.core.Item(can.Option())[0] @@ -284,13 +284,16 @@ Volcanos(chat.ONIMPORT, { sub._stacks_root.onexport.title(sub._stacks_root, current._name, can.ConfHelp(), can._msg && can._msg.IsDetail()? can._msg.Append(html.TITLE)||can._msg.Append(mdb.NAME)||(can._msg.Append(UID)||"").slice(0, 6): "" ) + can.user.agent.init(can, + (can._msg && can._msg.IsDetail()? can._msg.Append(html.CONTENT)||can._msg.Append(mdb.INFO)||"": "")||current.city_name+" "+current._street, + can.Conf("icons")? can.misc.Resource(can, can.Conf("icons")): can.user.info.nodetype == "worker"? can.misc.Resource(can, can.user.info.favicon, can.user.info.nodename): "", + ) }, myPlugin: function(can, value, cb) { var key = [value.space||can.ConfSpace(), value.index||can.ConfIndex()].concat(value.args||"").join(",") var sup = can._stacks_root; sup._stacks = sup._stacks||{}; var sub = (sup._stacks[key]||[])[0]; if (sub) { return sub._select() } var _output = sup._target.parentNode; value.style = html.OUTPUT - sup.onappend.plugin(sup, value, function(sub) { - can.onimport.myField(can, sub) + sup.onappend.plugin(can._root.Action, value, function(sub) { can.onimport.myField(can, sub) sub.onexport.output = function(_sub, msg) { _sub._stacks_current = sup._stacks[key] = [sub], _sub._stacks_root = sup, sub._select() } sub._select = function() { can.onimport.myOption(sub) can.page.SelectChild(can, _output, html.FIELDSET, function(target) { can.onmotion.toggle(can, target, target == sub._target) }) @@ -314,9 +317,10 @@ Volcanos(chat.ONIMPORT, { can.page.SelectChild(can, target, html.FIELDSET, function(target) { can.onmotion.toggle(can, target, target == sup._target) }) can.page.SelectChild(can, _output, "*", function(target) { can.onmotion.toggle(can, target, true) }) can.page.style(can, _action, html.DISPLAY, html.NONE), sup._output.innerHTML == "" && sup.Update() + can.user.isMobile && sup.onimport.size(sup, window.innerHeight, window.innerWidth, false) } } var plugin = can._stacks_current[0], _action = plugin._action, _output = plugin._output; current = plugin.current||{} - value.type = html.STORY, value.style = html.OUTPUT, value.height = can.ConfHeight()-48 + value.type = html.STORY, value.style = html.OUTPUT, value.height = (can.user.isMobile? window.innerHeight: can.ConfHeight())-48 can.onappend.plugin(can, value, function(sub) { can._stacks_current.push(sub) can.core.List(["_trans", "_style", "_icons", "_trans.input", "_trans.value"], function(key) { var value = sub.Conf(key); value && can.core.Item(can.Conf(key), function(k, v) { value[k] = value[k]||v }) @@ -358,14 +362,18 @@ Volcanos(chat.ONIMPORT, { }, myTabs: function(can, key, list, target) { var last = can.misc.Cookie(can, key) - can.page.Append(can, can.ui.tabs, can.core.List(list, function(value) { + if (!target && !can.ui.tabs) { can.ui = can.page.Append(can, can._output, [html.TABS, html.LIST]) } target = target||can.ui.tabs + can.onimport.layout = can.onimport.layout||function(can) { + can.ui.list && can.page.styleHeight(can, can.ui.list, can.ConfHeight()-can.ui.tabs.offsetHeight) + } + can.page.Append(can, target, can.core.List(list, function(value) { return {text: [can.user.trans(can, value, "", "value."+key), "", [value, value == "all" && last == "" || value == last? html.SELECT: ""]], onclick: function(event) { - can.onmotion.select(can, can.ui.tabs, "*", event.target), can.misc.Cookie(can, key, value == "all"? "": value), can.Update() + can.onmotion.select(can, target, "*", event.target), can.misc.Cookie(can, key, value == "all"? "": value), can.Update() }} })) }, myView: function(can, msg, cb, cbs, target) { - can.onimport.itemcards(can, msg, cb, cbs, target) + can.onimport.itemcards(can, msg, cb, cbs, target||can.ui.list) }, itemcards: function(can, msg, cb, cbs, target) { target = target||can._output can.onimport.shareTitle(can, msg) @@ -417,6 +425,17 @@ Volcanos(chat.ONIMPORT, { shareTitle: function(can, msg, title, content) { if (msg.IsDetail()) { var value = msg.TableDetail() msg.Option("_share_title", (value[title]||value.name||value.uid).slice(0, 6)), msg.Option("_share_content", value[content]||value.info) } }, + titleAction: function(can, value, filter) { var filter = can.core.List(arguments).slice(2) + return can.user.isMobile && {view: html.ACTION, _init: function(target) { can.page.appendAction(can, value, target) + can.page.Select(can, target, html.INPUT_BUTTON, function(target) { + if (filter.length > 0) { + filter.indexOf(target.name) == -1 && can.page.Remove(can, target) + } else { + can.page.tagis(target, "input.notice") || can.page.Remove(can, target) + } + }) + }} + }, }) Volcanos(chat.ONLAYOUT, { _init: function(can, height, width) { can.core.CallFunc([can.onimport, html.LAYOUT], {can: can, height: height, width: width}) },