diff --git a/frame.js b/frame.js index d40fd740..85d71284 100644 --- a/frame.js +++ b/frame.js @@ -1,6 +1,7 @@ Volcanos(chat.ONENGINE, { _init: function(can, meta, list, cb, target) { can.Option = function() {}, can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb) } + can.Inputs = can.page.Append(can, document.body, ["inputs"])._target can.core.Next(list, function(item, next) { item.type = chat.PANEL can.onappend._init(can, item, item.list, function(sub) { can[item.name] = sub, sub.db = {}, sub.ui = {}, sub.db._boot = can.misc._time() sub.run = function(event, cmds, cb) { var msg = sub.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, sub, cmds, cb) } @@ -22,8 +23,11 @@ Volcanos(chat.ONENGINE, { if (panel.onengine._plugin(event, can, msg, panel, cmds, cb)) { return } if (panel.onengine._engine(event, can, msg, panel, cmds, cb)) { return } if (panel.onengine._static(event, can, msg, panel, cmds, cb)) { return } + var toast, _toast = msg.Option(chat._TOAST); if (_toast) { can.onmotion.delay(can, function() { - if (sub.__toast || sub._toast) { return } toast = toast||can.user.toastProcess(sub, _toast) }, 30) } + if (sub.__toast || sub._toast) { return } toast = toast||can.user.toastProcess(sub, _toast) + }, 30) } + if (can.base.isUndefined(msg[ice.MSG_DAEMON])) { can.base.isUndefined(sub._daemon) && can.ondaemon._list[0] && (sub._daemon = can.ondaemon._list.push(sub)-1) if (sub._daemon) { msg.Option(ice.MSG_DAEMON, can.core.Keys(can.ondaemon._list[0], sub._daemon)) } @@ -33,8 +37,12 @@ Volcanos(chat.ONENGINE, { names = can.base.MergeURL(names, ice.MSG_INDEX, sub.ConfIndex()), can.page.exportValue(sub, msg) can.onengine.signal(panel, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds, names: names})) can.misc.Run(event, can, {names: names}, cmds, function(msg) { - can.user.isMobile || toast && can.user.toastSuccess(msg._can, msg.Option(ctx.ACTION)+lex.SP+ice.SUCCESS) + // can.user.isMobile || + toast && can.user.toastSuccess(msg._can, _toast) toast && toast.close && toast.close(), toast = true + delete(sub._toast) + delete(sub.__toast) + can.base.isFunc(cb) && cb(msg), Volcanos.meta.pack[can.core.Keys(panel._name, cmds.join(mdb.FS))] = msg }) }, @@ -478,8 +486,10 @@ Volcanos(chat.ONAPPEND, { } input.onclick = item.onclick if (item.type == html.TEXT) { - input.placeholder = can.user.trans(can, input.placeholder||input.name, item._trans, html.INPUT) - input.title = can.user.trans(can, input.title||input.placeholder||input.name, item._trans, html.INPUT) + if (!can.user.isMobile) { + input.placeholder = can.user.trans(can, input.placeholder||input.name, item._trans, html.INPUT) + input.title = can.user.trans(can, input.title||input.placeholder||input.name, item._trans, html.INPUT) + } input.onkeydown = item.onkeydown||function(event) { if (event.key == code.ENTER) { return can.Update(), can.onkeymap.prevent(event) } can.onkeymap.input(event, can), can.onkeymap.selectOutput(event, can) } @@ -522,7 +532,7 @@ Volcanos(chat.ONAPPEND, { can.user.trans(can, kit.Dict(target.name, target.value)) return {type: html.BUTTON, name: target.name, value: target.value, style: _style} }) - function run(event, button) { button && can.run(can.request(event, value, can.Option())._event, [ctx.ACTION, button]), can.onkeymap.prevent(event) } + function run(event, button) { button && can.run(can.request(event, value, can.Option(), {_toast: can.user.trans(can, button)})._event, [ctx.ACTION, button]), can.onkeymap.prevent(event) } if (list.length <= limit) { target.onclick = function(event) { run(event, event.target.name) } } else { @@ -698,7 +708,7 @@ Volcanos(chat.ONAPPEND, { msg.IsDetail() && key == mdb.KEY? can.user.trans(can, _value, null, html.INPUT): can.user.trans(can, _value, null, "value."+key), html.TD, ], onclick: function(event) { if (onclick()) { return } 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(request(event), target.name) + if (can.page.tagis(target, html.INPUT) && target.type == html.BUTTON) { can.requestAction(request(event, {_toast: can.user.trans(can, target.name)}), target.name) meta && meta[target.name]? can.user.input(event, can, meta[target.name], function(args) { run(event, target.name, args) }, data): run(event, target.name) } else { can.sup.onimport.change(event, can.sup, key, value, null, data) || can.sup.onexport.record(can.sup, value, key, data, event) diff --git a/index.css b/index.css index 71af0d4d..2bcbd07b 100644 --- a/index.css +++ b/index.css @@ -403,47 +403,48 @@ body>div.carte div.item span.icon.next { line-height:22px; height:22px; float:ri body>div.carte div.item span.name { flex-grow:1; } body>div.carte.select.float>div.item { text-align:center; } body>div.carte.header.avatar img { width:370px; } -body>div.input.process input { background-color:var(--disable-bg-color) !important; color:var(--disable-fg-color); border:var(--box-border) !important; } -body>div.input.process input:hover { background-color:var(--disable-bg-color) !important; color:var(--disable-fg-color); border:var(--box-border) !important; } -body>div.input { padding:var(--plugin-padding); } -body>div.input { padding:var(--plugin-padding); } -body>div.input>legend { background-color:var(--input-bg-color); float:right; padding:0; } -body>div.input tr { margin:var(--button-margin); } -body>div.input td { padding:var(--table-padding); } -body>div.input td span.must { color:red; padding:0 5px; } -body>div.input td:nth-child(2) { padding:var(--table-padding) 0; } -body.mobile>div.input tr:not(.hide) { display:flex; flex-direction:column; margin:var(--button-margin); } -body.mobile>div.input td { padding:0 var(--button-padding); margin:var(--button-margin); } -body.mobile>div.input td:nth-child(1) { color:gray; font-size:var(--status-font-size); padding-left:var(--button-padding); margin-bottom:0; } -body.mobile>div.input td:nth-child(2) { display:none; } -body>div.input tr.img td:last-child>span { display:none; } -body>div.input tr.img td:last-child>div.item { width:var(--river-width); flex-wrap:wrap; } -body>div.input tr.img td:last-child>div.item>div { background-color:gray; margin:var(--input-margin); } -body>div.input tr.img td:last-child>div>span { font-size:var(--action-height); } -body>div.input tr.img td:last-child>div>span.icon { display:none; } -body>div.input tr.icon td:last-child { position:relative; } -body>div.input tr.icon td:last-child img:first-child { height:28px; width:28px; position:absolute; left:12px; top:12px; } -body>div.input tr.icon td:last-child input { padding-left:var(--action-height); } -body>div.input tr.icons td:last-child img { height:28px; width:28px; position:absolute; left:2px; top:2px; } -body>div.input tr.icons td:last-child span:not(.icon) { font-family:var(--code-font-family); position:absolute; left:33px; } -body>div.input tr.icons td:last-child input { padding-left:var(--action-height); } -body>div.input td span.icon { margin-left:-20px; visibility:hidden; } -body>div.input td span.icons { margin-left:-20px; visibility:hidden; } -body>div.input td label { font-family:var(--code-font-family); } -body>div.input td:hover span.icon { visibility:visible; } -body>div.input td:hover span.icons { visibility:visible; } -body:not(.mobile)>div.input textarea { height:var(--textarea-height); width:var(--form-width) !important; } -body>div.input select { width:var(--form-width) !important; } -body>div.input input.select[type=button] { width:var(--form-width) !important; } -body>div.input input:not([type=button]) { width:var(--form-width) !important; padding-left:24px; } -body>div.input input[type=text] { width:var(--form-width) !important; padding-left:24px; } -body>div.input input[name=cancel] { border:var(--box-danger); } -body>div.input input[name=submit] { border:var(--box-notice); } -body>div.input input[name=submit]:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-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] { min-width:112px; } +body div.input.float.process input { background-color:var(--disable-bg-color) !important; color:var(--disable-fg-color); border:var(--box-border) !important; } +body div.input.float.process input:hover { background-color:var(--disable-bg-color) !important; color:var(--disable-fg-color); border:var(--box-border) !important; } +body div.input.float { padding:var(--plugin-padding); } +body div.input.float { padding:var(--plugin-padding); } +body div.input.float>legend { background-color:var(--input-bg-color); float:right; padding:0; } +body div.input.float tr { margin:var(--button-margin); } +body div.input.float td { padding:var(--table-padding); } +body div.input.float td span.must { color:red; padding:0 5px; } +body div.input.float td:nth-child(2) { padding:var(--table-padding) 0; } +body.mobile div.input.float table { width:100%; } +body.mobile div.input.float tr:not(.hide) { display:flex; flex-direction:column; margin:var(--button-margin); } +body.mobile div.input.float td { padding:0 var(--button-padding); margin:var(--button-margin); } +body.mobile div.input.float td:nth-child(1) { color:gray; font-size:var(--status-font-size); padding-left:var(--button-padding); margin-bottom:0; } +body.mobile div.input.float td:nth-child(2) { display:none; } +body div.input.float tr.img td:last-child>span { display:none; } +body div.input.float tr.img td:last-child>div.item { width:var(--river-width); flex-wrap:wrap; } +body div.input.float tr.img td:last-child>div.item>div { background-color:gray; margin:var(--input-margin); } +body div.input.float tr.img td:last-child>div>span { font-size:var(--action-height); } +body div.input.float tr.img td:last-child>div>span.icon { display:none; } +body div.input.float tr.icon td:last-child { position:relative; } +body div.input.float tr.icon td:last-child img:first-child { height:28px; width:28px; position:absolute; left:12px; top:12px; } +body div.input.float tr.icon td:last-child input { padding-left:var(--action-height); } +body div.input.float tr.icons td:last-child img { height:28px; width:28px; position:absolute; left:2px; top:2px; } +body div.input.float tr.icons td:last-child span:not(.icon) { font-family:var(--code-font-family); position:absolute; left:33px; } +body div.input.float tr.icons td:last-child input { padding-left:var(--action-height); } +body div.input.float td span.icon { margin-left:-20px; visibility:hidden; } +body div.input.float td span.icons { margin-left:-20px; visibility:hidden; } +body div.input.float td label { font-family:var(--code-font-family); } +body div.input.float td:hover span.icon { visibility:visible; } +body div.input.float td:hover span.icons { visibility:visible; } +body:not(.mobile)>div.input.float textarea { height:var(--textarea-height); width:var(--form-width) !important; } +body div.input.float select { width:var(--form-width) !important; } +body div.input.float input.select[type=button] { width:var(--form-width) !important; } +body div.input.float input:not([type=button]) { width:var(--form-width) !important; padding-left:24px; } +body div.input.float input[type=text] { width:var(--form-width) !important; padding-left:24px; } +body div.input.float input[name=cancel] { border:var(--box-danger); } +body div.input.float input[name=submit] { border:var(--box-notice); } +body div.input.float input[name=submit]:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } +body div.input.float input[name=cancel]:hover { background-color:var(--danger-bg-color); color:var(--danger-fg-color); } +body div.input.float div.action { padding:var(--table-padding); width:100%; position:sticky; bottom:0; flex-direction:row-reverse; cursor:move; } +body div.input.float div.action>div.item { margin-left:var(--button-margin); float:right; } +body div.input.float 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); } @@ -470,7 +471,7 @@ body>div.upload div.status div.size { text-align:center; } body.mobile>div.input { margin:10px; width:calc(100% - 20px); left:0 !important; } body.mobile>div.input table { width:100%; } body.mobile>div.input td { padding:0; } -body.mobile>div.input table input { width:100% !important; } +body.mobile div.input.float table input { width:100% !important; } /* display */ fieldset:not(.Action) { position:relative; } fieldset>form.option:not(.hide), fieldset>div.action:not(.hide):not(.flex) { display:contents; } .hide, .hidden { display:none; } diff --git a/lib/misc.js b/lib/misc.js index 5e0c6c61..93d7ec9b 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -176,7 +176,7 @@ Volcanos("misc", { input.values = input.values || can.core.Split(input.value) } if (can.base.isIn(input.type, html.TEXT, html.TEXTAREA)) { - input.placeholder = can.user.trans(can, input.placeholder||input.name, field, html.INPUT) + // input.placeholder = can.user.trans(can, input.placeholder||input.name, field, html.INPUT) } if (input.type == html.BUTTON) { input.value = can.user.trans(can, input.value||input.name, field) @@ -248,6 +248,11 @@ Volcanos("misc", { }, ResourceFavicon: function(can, path, space) { return can.misc.Resource(can, path||can.user.info.favicon||nfs.SRC_MAIN_ICO, space) }, ResourceIcons: function(can, path, space, serve) { + if (!path) { + if (can.user.info.nodetype == web.WORKER) { + return can.misc.Resource(can, can.user.info.favicon, can.user.info.nodename) + } + } return can.misc.Resource(can, path||(can.page.isDark(can)? "usr/icons/volcanos.png": "usr/icons/icebergs.png"), space, serve) }, Resource: function(can, path, space, serve) { if (!path) { return "" } @@ -257,6 +262,7 @@ Volcanos("misc", { if (!can.base.beginWith(path, web.HTTP)) { if (serve && serve.indexOf(location.origin) == -1) { var u = can.base.ParseURL(serve); path = u.origin + path } } if (!space && can.base.beginWith(path, web.HTTP)) { return path } if (!space && path.indexOf("pod=") > 0) { return path } + if (can.base.beginWith(path, "/") && path.indexOf("pod=") > 0) { return path } return can.base.MergeURL(path, ice.POD, space||can.ConfSpace()||can.misc.Search(can, ice.POD)) }, ShareLocal: function(can, path, space) { if (can.base.beginWith(path, web.HTTP, nfs.PS)) { return path } diff --git a/lib/page.js b/lib/page.js index 7245f8d3..814c20f3 100644 --- a/lib/page.js +++ b/lib/page.js @@ -85,9 +85,7 @@ Volcanos("page", { data.className = list[1]||data.className||name, data.type = html.PASSWORD } else if (item.img) { var list = can.core.List(item.img); type = html.IMG, data.src = list[0] - if (can.base.contains(data.src, ".jpg")) { - data.className = data.className||"jpg" - } + if (can.base.contains(data.src, ".jpg")) { data.className = data.className||"jpg" } } else if (item.row) { type = html.TR, item.list = item.row.map(function(text) { return {text: [text, item.sub||html.TD]} }) } else if (item.th) { type = html.TR, item.list = item.th.map(function(text) { return {text: [text, html.TH]} }) } else if (item.td) { type = html.TR, item.list = item.td.map(function(text) { return can.base.isObject(text)? text: {text: [text||"", html.TD]} }) } @@ -95,11 +93,18 @@ Volcanos("page", { if (type == html.INPUT) { if (data.type == html.TEXT || data.type == html.PASSWORD || !data.type) { // data.autocomplete = data.autocomplete||"new-password" - data.placeholder = (data.placeholder||name||"").split(nfs.PT).pop(), data.title = can.user.trans(can, data.title||data.placeholder, null, html.INPUT) + if (!can.user.isMobile) { + data.placeholder = (data.placeholder||name||"").split(nfs.PT).pop(), data.title = can.user.trans(can, data.title||data.placeholder, null, html.INPUT) + } } else if (data.type == html.BUTTON) { // data.value = can.user.trans(can, data.value) } - } if (type == html.TEXTAREA) { data.placeholder = can.user.trans(can, (data.placeholder||name||"").split(nfs.PT).pop(), null, html.INPUT) } + } + if (type == html.TEXTAREA) { + if (!can.user.isMobile) { + data.placeholder = can.user.trans(can, (data.placeholder||name||"").split(nfs.PT).pop(), null, html.INPUT) + } + } can.core.List(["className", "placeholder", "title"], function(key) { data[key] || delete(data[key]) }) name && (data.name = name); var node = can.page.Create(can, type, data) value[type] = value[name] = value[can.core.Split(data.className)[0]] = node, value._target = value._target||node, value.first = value.first||node, value.last = node @@ -432,7 +437,7 @@ Volcanos("page", { case html.TEXT: case html.FILTER: item.className||can.page.ClassList.add(can, item, ctx.ARGS), item.name = item.name||item.type, item.value = value||item.value||""; - item.placeholder = item.placeholder||item.name + //item.placeholder = item.placeholder||item.name break case html.UPLOAD: item.type = html.FILE, input.name = html.UPLOAD; break case html.BUTTON: item.value = item.value||item.name||mdb.LIST; break @@ -490,7 +495,7 @@ Volcanos("page", { appendAction: function(can, value, target) { if (!value.action) { return } target.innerHTML = value.action can.page.Select(can, target, html.INPUT_BUTTON, function(target) { var style = can.Conf("_style."+target.name)||can.page.buttonStyle(can, target.name); style && can.onappend.style(can, style, target) - target.onclick = function(event) { can.onkeymap.prevent(event), can.Update(can.request(event, value), [ctx.ACTION, target.name]) } + target.onclick = function(event) { can.onkeymap.prevent(event), can.Update(can.request(event, value, {_toast: can.user.trans(can, target.name)}), [ctx.ACTION, target.name]) } }) }, parseAction: function(can, value) { var action = [] diff --git a/lib/user.js b/lib/user.js index 47202a38..336579d0 100644 --- a/lib/user.js +++ b/lib/user.js @@ -97,7 +97,7 @@ Volcanos("user", { var carte = can.user.toast(can, {content: content, title: title, action: action||[cli.CLOSE], duration: -1}) can.page.style(can, carte._target, html.TOP, 200, html.BOTTOM, ""); return carte }, - toastProcess: function(can, content, title, progress) { return can.user.toast(can, {content: "πŸ•‘ "+(content||ice.PROCESS), title: title, duration: -1, progress: progress}) }, + toastProcess: function(can, content, title, progress) { return can.user.toast(can, {content: "πŸ•‘ "+(content||ice.PROCESS)+(can.user.isEnglish(can)? "": "δΈ­..."), title: title, duration: -1, progress: progress}) }, toastFailure: function(can, content, title) { return can.user.toast(can, {content: "❌ "+(content||ice.FAILURE), title: title, duration: -1}) }, toastSuccess: function(can, content, title, duration) { if (!can.user.isEnglish(can)) { @@ -137,7 +137,7 @@ Volcanos("user", { }), _target: ui._target, }); can.onmotion.story.auto(can, ui._target) if (action._target.parentNode == document.body) { can.onmotion.delay(can, function() { - can.page.style(can, action._target, html.TOP, (can.page.height() - action._target.offsetHeight)/4, html.LEFT, (can.page.width()-action._target.offsetWidth)/2) + can.page.style(can, action._target, html.TOP, (can.page.height() - action._target.offsetHeight)/2, html.LEFT, (can.page.width()-action._target.offsetWidth)/2) }) } if (meta.action && meta.action.length == 1 && meta.action[0] === "") { can.page.Select(can, action._target, html.DIV_ACTION, function(target) { can.onmotion.hidden(can, target) }) @@ -234,8 +234,8 @@ Volcanos("user", { can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { item.name && item.value && _msg.Option(item.name, item.value) }); (item.run||can.run)(event, cmds, cb, true) }, _enter: function(event) { return action.submit(event, can, html.SUBMIT), true }}, item), target) }, item.onkeydown = function(event) { if (event.key == code.ESCAPE) { event.target.blur() } } - item.placeholder = can.user.trans(can, item.placeholder||item.name, null, html.INPUT) - item.title = can.user.trans(can, item.title||item.placeholder||item.name, null, html.INPUT) + // item.placeholder = can.user.trans(can, item.placeholder||item.name, null, html.INPUT) + // item.title = can.user.trans(can, item.title||item.placeholder||item.name, null, html.INPUT) return {view: [[item.name, item.type, item.action], html.TR], list: [ {type: html.TD, list: [ {text: [can.user.trans(can, item.name||"", item._trans, html.INPUT), html.LABEL]}, @@ -243,9 +243,7 @@ Volcanos("user", { ]}, {type: html.TD, list: []}, {type: html.TD, _init: function(target) { can.onappend.input(can, item, msg.Option(item.name), target) }}, ], onclick: function(event) { - can.page.Select(can, event.currentTarget, "input", function(target) { - target.focus() - }) + can.page.Select(can, event.currentTarget, "input", function(target) { target.focus() }) }} })}]}, html.ACTION, ], onclick: function(event) { if (!can.page.tagis(event.target, html.INPUT, html.TEXTAREA)) { can.onmotion.clearCarte(can) } }}]) @@ -298,7 +296,9 @@ Volcanos("user", { upload: function(event, can, cb, silent) { var begin = new Date() var ui = can.page.Append(can, document.body, [{view: [[html.UPLOAD, can.Conf(ctx.INDEX)||can.ConfIndex(), chat.FLOAT]], list: [ html.ACTION, {view: html.OUTPUT, list: ["progress"]}, {view: html.STATUS, list: [html.SHOW, cli.COST, nfs.SIZE]}, - ]}]); can.onlayout.figure(event, can, ui._target) + ]}]) + can.user.isMobile && can.page.style(can, ui._target, html.LEFT, 0, html.WIDTH, window.innerWidth) + can.onlayout.figure(event, can, ui._target) var action = can.onappend._action(can, [{type: html.UPLOAD, onchange: function(event) { action.show(event, 0, event.target.files[0].size, 0) }}, {type: html.BUTTON, name: cli.CLOSE}], ui.action, { begin: function() { begin = new Date() var upload = can.page.Select(can, ui.action, html.INPUT_FILE)[0]; if (upload.files.length == 0) { return upload.focus() } diff --git a/plugin/table.js b/plugin/table.js index 72cb6b23..6ec99135 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -288,15 +288,6 @@ Volcanos(chat.ONIMPORT, { can.Conf(mdb.ICONS)? can.misc.Resource(can, can.Conf(mdb.ICONS)): can.user.info.nodetype == web.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(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.myPluginSelect(can, sub, _output) }, sub._select(), cb && cb(sub) - }, _output) - }, myField: function(can, sub) { sub.onexport._output = function(_sub) { can.core.Item(can.onimport, function(key, value) { _sub.onimport[key] = _sub.onimport[key]||value }) @@ -307,10 +298,19 @@ Volcanos(chat.ONIMPORT, { myPluginSelect: function(can, sub, _output) { can.page.SelectChild(can, _output, html.FIELDSET, function(target) { can.onmotion.toggle(can, target, target == sub._target) }) can.page.SelectChild(can, sub._output, "*", function(target) { can.onmotion.toggle(can, target, true) }) - can.page.style(can, sub._action, html.DISPLAY, html.NONE), sub._output.innerHTML == "" && sub.Update() - can.user.isMobile && sub.onimport.size(sub, window.innerHeight, window.innerWidth, false) + can.page.style(can, sub._action, html.DISPLAY, html.NONE) + can.user.isMobile? sub.onimport.size(sub, window.innerHeight, window.innerWidth, false): sub.onimport.size(sub, sub.ConfHeight(), sub.ConfWidth(), false) can.onimport.myOption(sub) }, + 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(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.myPluginSelect(can, sub, _output) }, sub._select(), cb && cb(sub) + }, _output) + }, myStory: function(can, value) { if (!can._stacks_current) { var sup = can.sup; can._stacks_root = sup, sup._stacks = {} var key = [can.ConfSpace(), can.ConfIndex()].concat(can.base.trim(can.core.Item(can.Option(), function(key, value) { return value }))).join(",") @@ -327,11 +327,12 @@ Volcanos(chat.ONIMPORT, { var run = sub.run; sub.run = function(event, cmds, cb) { run(can.request(event, { city_name: current[CITY_NAME], street_name: current[STREET_NAME], place_name: current[PLACE_NAME], - dashboard_uid: current["dashboard_uid"], command_uid: sub.Conf("command_uid"), portal_name: can.ConfHelp(), + dashboard_uid: current["dashboard_uid"], storage_uid: current["storage_uid"], + command_uid: sub.Conf("command_uid"), portal_name: can.ConfHelp(), }, can.base.Obj(sub.Conf("field.option"))), cmds, cb) } sub.onimport._field = function(sub, msg, cb) { - msg.Table(function(value) { value._goback = function() { goback(true) }, can.onimport.myStory(can, value) }) + msg.Table(function(value) { value._goback = function(event) { goback(event, true) }, can.onimport.myStory(can, value) }) } can.onimport.myField(can, sub) sub.onexport.output = function(_sub, msg) { _sub._stacks_current = can._stacks_current, _sub._stacks_root = can._stacks_root @@ -339,19 +340,21 @@ Volcanos(chat.ONIMPORT, { sub.sub.onaction._goback = goback can.page.style(can, sub._output, "left", "0") }, can.page.style(can, sub._output, "left", "100") - function goback(clear) { if (value._goback) { return value._goback() } + function goback(event, clear) { if (value._goback) { return value._goback(event) } + sub.request(event, {_toast: can.user.trans(can, "reload", "εˆ·ζ–°")}) if (clear) { if (sub.Option(UID)) { sub.Option(UID, "") } } - if (sub.Option(UID)) { return sub.Option(UID, ""), sub.Update() } + if (sub.Option(UID)) { return sub.Option(UID, ""), sub.Update(event) } var last = can._stacks_current.pop(); can.page.Remove(can, last._target) var last = can._stacks_current[can._stacks_current.length-1]; if (last._select) { - if (last.ConfIndex().split(".").pop() == "message") { last.Update() } + if (last.ConfIndex().split(".").pop() == "message") { last.Update(event) } + can._stacks_current.length == 1 && last._output.innerHTML == "" && last.Update(event) return last._select() } } - function reload() { sub.Update() } + function reload(event) { sub.Update(sub.request(event, {_toast: can.user.trans(can, "reload", "εˆ·ζ–°")})) } sub._select = function() { can.onimport.myOption(sub) can.page.SelectChild(can, _output, "*", function(target) { can.onmotion.toggle(can, target, target == sub._target) }) - var list = [can.page.button(can, can.user.trans(can, "goback", "θΏ”ε›ž"), function(event) { goback() }), can.page.button(can, can.user.trans(can, "reload", "εˆ·ζ–°"), function(event) { reload() })] + var list = [can.page.button(can, can.user.trans(can, "", "θΏ”ε›ž"), function(event) { goback(event) }), can.page.button(can, can.user.trans(can, "reload", "εˆ·ζ–°"), function(event) { reload(event) })] can.page.Appends(can, _action, list), can.page.style(can, _action, html.DISPLAY, html.BLOCK) can.user.isMobile && sub.onimport.size(sub, window.innerHeight-ACTION_HEIGHT, window.innerWidth, false) }, sub._select() @@ -362,9 +365,6 @@ Volcanos(chat.ONIMPORT, { }, myTabs: function(can, key, list, target) { var last = can.misc.Cookie(can, key) 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, target, "*", event.target), can.misc.Cookie(can, key, value == "all"? "": value), can.Update() @@ -415,14 +415,7 @@ Volcanos(chat.ONIMPORT, { }} }, textView: function(can, value, key, type) { - if (!key) { - can.core.Item(value, function(k, v) { - if (k == "status" || can.base.endWith(k, "_status")) { - key = k - } - }) - } - if (!type) { type = key.split("_").pop() } + key || can.core.Item(value, function(k, v) { if (k == "status" || can.base.endWith(k, "_status")) { key = k } }); if (!type) { type = key.split("_").pop() } return value[key] && value[key] != "finish" && {text: [can.user.transValue(can, value, key), "", [type, value[key], can.Conf("_trans.value."+key+".style."+value[key])||""]]} }, authView: function(can, value) { return can.base.isIn(value.auth_status, "issued", "2") && {view: [aaa.AUTH, html.SPAN], list: [{icon: "bi bi-patch-check-fill", style: {color: "var(--notice-bg-color)"}}]} }, diff --git a/proto.js b/proto.js index 3b2eaecc..effe38ef 100644 --- a/proto.js +++ b/proto.js @@ -65,7 +65,7 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {}, can.core.List(arguments, function(item, index) { if (!item || index == 0) { return } can.core.Item(item, set) }); return msg }, requestPodCmd: function(event) { return can.request(event, {pod: can.ConfSpace(), index: can.ConfIndex()}) }, - requestAction: function(event, button) { return can.request(event, {action: button, _toast: event.isTrusted? button+lex.SP+ice.PROCESS: ""}) }, + requestAction: function(event, button) { return can.request(event, {action: button, _toast: event.isTrusted? can.user.trans(can, button): ""}) }, runActionInputs: function(event, cmds, cb) { var msg = can.request(event), meta = can.Conf() if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { var msg = can.request(event, {action: cmds[1]}) if (can.base.isFunc(meta.feature[cmds[1]])) { return meta.feature[cmds[1]](can, msg, cmds.slice(2)) }