From d6d648ff90a2f4845a11c9d07fec430eea89541b Mon Sep 17 00:00:00 2001 From: shy Date: Thu, 12 Sep 2024 00:13:02 +0800 Subject: [PATCH] add some --- frame.js | 25 +++++++++++++++++-------- index.css | 6 +++--- lib/misc.js | 6 ++++-- lib/page.js | 11 +++++++++-- lib/user.js | 39 +++++++++++++++++++++++++++++---------- panel/action.js | 2 +- plugin/input/key.js | 12 +++++++----- plugin/table.js | 25 +++++++++++++------------ 8 files changed, 83 insertions(+), 43 deletions(-) diff --git a/frame.js b/frame.js index 8b565ca0..2ad57fc6 100644 --- a/frame.js +++ b/frame.js @@ -460,9 +460,7 @@ Volcanos(chat.ONAPPEND, { if (["_space"].indexOf(item.view) > -1) { return can.page.Append(can, target, [item]) } if ([html.BR, html.HR].indexOf(item.type) > -1) { return can.page.Append(can, target, [item]) } if (item.type == html.SELECT) { item._selectonly = true, item.type = html.TEXT - if (item.values && item.values.length > 0) { - item._selectonly = false, item.type = html.SELECT - } + if (item.values && item.values.length > 0) { item._selectonly = false, item.type = html.SELECT } } var _icon = [], _item = can.base.Copy({className: "", type: "", name: ""}, item), input = can.page.input(can, _item, value) if (item._selectonly) { input._selectonly = true } @@ -497,7 +495,7 @@ Volcanos(chat.ONAPPEND, { input.data.type = html.BUTTON, input.value = can.user.trans(can, item.name) } if (item.range) { input._init = function(target) { can.onappend.figure(can, item, target, function(sub, value, old) { target.value = value, can.core.CallFunc([can.onaction, item.name], [event, can, item.name]) }) } } - var _style = can.page.buttonStyle(can, item.name) + var _style = can.Conf("_style."+item.name)||can.page.buttonStyle(can, item.name) var _input = can.page.Append(can, target, [{view: [[html.ITEM].concat(style, [item.type, item.name, item._className, item.icon? "_icon": ""], _style)], list: [item.icon && {icon: item.icon}, input].concat(_icon), _init: function(target, _input) { if (item.type == html.MULTIPLE) { can.onappend.multiple(can, item, _input.input) @@ -638,6 +636,17 @@ Volcanos(chat.ONAPPEND, { if (can.user.isMobile) { can.base.toLast(msg.append, mdb.TIME) } can.base.toLast(msg.append, web.LINK), can.base.toLast(msg.append, ctx.ACTION) if (msg.append[msg.append.length-1] == ctx.ACTION && can.core.List(msg[ctx.ACTION], function(item) { if (item) { return item } }).length == 0) { msg.append.pop() } if (msg.append[msg.append.length-1] == ctx.ACTION && (!msg[ctx.ACTION] || msg[ctx.ACTION].length == 0)) { msg.append.pop() } + if (msg.IsDetail()) { + for (var i = 0; i < msg[mdb.KEY].length; i++) { + if (msg[mdb.KEY][i] == "action") { var action = msg[mdb.VALUE][i] + for (var j = i; j < msg[mdb.KEY].length-1; j++) { + msg[mdb.KEY][j] = msg[mdb.KEY][j+1], msg[mdb.VALUE][j] = msg[mdb.VALUE][j+1] + } + msg[mdb.KEY][j] = "action", msg[mdb.VALUE][j] = action + break + } + } + } var option = can.core.Item(can.Option()) var table = can.page.AppendTable(can, msg, target||can.ui.content||can._output, msg.append, cb||function(value, key, index, data, list) { var _value = value if (msg.IsDetail()) { @@ -744,12 +753,12 @@ Volcanos(chat.ONAPPEND, { }) } else { can.page.Select(can, code, html.INPUT_BUTTON, function(target) { target.onclick = function(event) { if (can.page.ClassList.has(can, target, "disable")) { return } can.page.ClassList.add(can, target, "disable") - can.misc.Event(event, can, function(msg) { can.Update(can.request(event, can.Option(), {_toast: target.name}), [ctx.ACTION, target.name], function(msg) { + can.Update(can.request(event, can.Option(), {_toast: target.name, _cancel: function(event) { + can.page.ClassList.del(can, target, "disable") + }}), [ctx.ACTION, target.name], function(msg) { can.page.ClassList.del(can, target, "disable") - // can.page.ClassList.del(can, can._fields, "form") - // can.page.ClassList.del(can, can._fields, "output") var sup = can._fields? can.sup: can; if (sup.onimport._process(sup, msg)) { return } - }) }) + }) } }) } return code.scrollBy && code.scrollBy(0, 10000), code }, diff --git a/index.css b/index.css index 8512bf80..e9f834dd 100644 --- a/index.css +++ b/index.css @@ -412,7 +412,7 @@ 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 { display:flex; flex-direction:column; margin:var(--button-margin); } +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; } @@ -513,9 +513,9 @@ textarea:hover { border:var(--box-notice); } textarea:focus { border:var(--box-n select { border-radius:var(--button-radius); } input { background-color:var(--input-bg-color); color:var(--input-fg-color); } input:not([type=button]) { border:var(--input-border); } -input:not([type=button]):hover { border:var(--box-notice); } +body:not(.mobile) input:not([type=button]):hover { border:var(--box-notice); } input:not([type=button]):focus { border:var(--box-notice); } -input.disable { color:var(--disable-fg-color) !important; border:unset !important; } +input.disable { border:var(--box-border) !important; background-color:var(--disable-bg-color) !important; color:var(--disable-fg-color) !important; } input.select[type=button]:hover { border:var(--box-notice); } input.select[type=button]:focus { border:var(--box-notice); } input.select[type=button] { border:var(--input-border); padding:0 var(--button-padding); } diff --git a/lib/misc.js b/lib/misc.js index 8430351f..5e0c6c61 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -142,14 +142,16 @@ Volcanos("misc", { var input = can.user.input(event, can, meta.feature[cmds[1]], function(args) { can.page.ClassList.add(can, input._target, html.PROCESS) msg.result = [] - can.Update(can.request(event, {_handle: ice.TRUE}, msg, can.Option()), cmds.slice(0, 2).concat(args), function(msg) { + can.Update(can.request(event, can.Option(), {_handle: ice.TRUE, _cancel: function(event) { + can.page.ClassList.del(can, input._target, html.PROCESS) + }}, msg), cmds.slice(0, 2).concat(args), function(msg) { can.page.ClassList.del(can, input._target, html.PROCESS) if (msg.IsErr()) { can.onappend.style(can, "warn", can.user.toastFailure(can, msg.Result())._target) input.focus() } else { if (cb && cb(msg)) { return } - input.cancel() + input.cancel({}, can) return true } }); return true diff --git a/lib/page.js b/lib/page.js index c22d0fb6..7245f8d3 100644 --- a/lib/page.js +++ b/lib/page.js @@ -93,7 +93,8 @@ Volcanos("page", { } else if (item.td) { type = html.TR, item.list = item.td.map(function(text) { return can.base.isObject(text)? text: {text: [text||"", html.TD]} }) } // if (type == html.SELECT) { data.title = can.user.trans(can, data.title||name) } if (type == html.INPUT) { - if (data.type == html.TEXT || data.type == html.PASSWORD || !data.type) { data.autocomplete = data.autocomplete||"new-password" + 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) } else if (data.type == html.BUTTON) { // data.value = can.user.trans(can, data.value) @@ -486,6 +487,12 @@ Volcanos("page", { cb && cb(themeMedia.matches? html.DARK: html.LIGHT) return themeMedia.matches? html.DARK: html.LIGHT }, + 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]) } + }) + }, parseAction: function(can, value) { var action = [] can.page.Select(can, can.page.Create(can, html.DIV, value.action), html.INPUT, function(target) { action.push(target.name), target.name != target.value && can.user.trans(can, kit.Dict(target.name, target.value)) @@ -494,7 +501,7 @@ Volcanos("page", { }, buttonStyle: function(can, name) { return can.core.Value(can.onaction, ["_trans", "style", name])||(can.base.isIn(name, mdb.CREATE, mdb.INSERT, mdb.IMPORT, nfs.CLONE, cli.START, ctx.RUN, web.UPLOAD, web.CONFIRM, aaa.LOGIN, code.AUTOGEN, "sso", "add", "pull", "push", "commit", "preview", "auto-preview", ice.APP)? html.NOTICE: - can.base.isIn(name, mdb.REMOVE, mdb.DELETE, mdb.PRUNES, mdb.PRUNE, nfs.TRASH, cli.RESTART, cli.STOP, cli.CLOSE, cli.REBOOT, web.CANCEL, code.UPGRADE, "reject", "del", "drop", "access", "kill", "prockill")? html.DANGER: "") + can.base.isIn(name, mdb.REMOVE, "rename", mdb.DELETE, mdb.PRUNES, mdb.PRUNE, nfs.TRASH, cli.RESTART, cli.STOP, cli.CLOSE, cli.REBOOT, web.CANCEL, code.UPGRADE, "reject", "del", "drop", "access", "kill", "prockill")? html.DANGER: "") }, exportValue: function(can, msg, target) { target = target||can._output msg.OptionDefault(ice.MSG_THEME, can.getHeaderTheme()) diff --git a/lib/user.js b/lib/user.js index 42de5d3e..66c5570c 100644 --- a/lib/user.js +++ b/lib/user.js @@ -242,21 +242,41 @@ Volcanos("user", { item.need == "must" && {text: ["*", "", "must"]}, ]}, {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() + }) + }} })}]}, html.ACTION, ], 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]) }, - cancel: function(event) { can.onengine.signal(can, "onremove", can.request(event, {query: can.page.getquery(can, ui._target)})), can.page.Remove(can, ui._target) }, + 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 } + if (value != undefined) { target.value = target.value||value } + if (target.value && hidden) { can.onmotion.hidden(can, can.page.parentNode(can, target, html.TR)) } + return target.value + }, + cancel: function(event, can, 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 var list = can.page.Select(can, ui._target, html.OPTION_ARGS, function(item) { if (item.value == "" && need[item.name] == "must") { err = true, item.focus(), can.user.toast(can, item.name+" 是必选字段, 请重新输入") } return item.name && args.push(item.name, item.value||""), data[item.name] = item.value||"" }); if (err) { return } can.onkeymap.prevent(event) - var _msg = can.request(event); _msg.Option(ctx.ACTION, msg.Option(ctx.ACTION)) - _msg.Option("_toast", msg.Option("_toast")) - can.core.CallFunc(cb, {event: can.request(event, {_handle: ice.TRUE})._event, button: button, data: data, list: list, args: args, input: action}) || action.cancel() + var _msg = can.request(event); _msg.Option(ctx.ACTION, msg.Option(ctx.ACTION)), _msg.Option("_toast", msg.Option("_toast")) + if (can.core.CallFunc(cb, {event: can.request(event, {_handle: ice.TRUE})._event, button: button, data: data, list: list, args: args, input: action})) { + callback("afterInputs", button) + } else { + action.cancel(event, can, button) + } }, _target: ui._target, _engine: function(event, can, button) { action.submit(event, can, button) }, }); can.page.Select(can, action._target, "input", function(target) { @@ -264,13 +284,13 @@ Volcanos("user", { var onclick = target.onclick; target.onclick = function(event) { can.onengine.signal(can, "onevent", can.request(event, {_type: target.name})), onclick && onclick(event) } }) title && can.page.Select(can, action._target, "input[name=submit]", function(target) { target.value = can.user.trans(can, title) }) - if (event && event.target) { - can.onlayout.figure(event, can, ui._target) + if (event && event.target) { can.onlayout.figure(event, can, ui._target) can.user.isMobile && can.page.style(can, ui._target, html.LEFT, (can.page.width()-ui._target.offsetWidth)/2, html.TOP, 40) - // can.user.isMobile && can.page.style(can, ui._target, html.LEFT, (can.page.width()-ui._target.offsetWidth)/2, html.TOP, can.getHeaderHeight(can)) } else { can.getActionSize(function(left, top, height) { can.page.style(can, ui._target, html.LEFT, left||0, html.TOP, (height/4||0)) }) } can.onmotion.resize(can, ui._target), can.onmotion.delay(can, function() { action.focus() }, 300) + function callback(key, button) { var sub = can._fields? can: can.sub; sub.onaction && sub.onaction[key] && sub.onaction[key](event, sub, button, action) } + callback("beforeInputs") return button === true && action.submit(event, can, html.SUBMIT), action }, select: function(event, can, type, fields, cb, cbs) { @@ -315,7 +335,6 @@ Volcanos("user", { }), resize: html.IMG, }) }, login: function(can, _cb, _msg) { - debugger can.misc.CookieSessid(can, ""), can.misc.Cookie(can, "sessid", "") can.page.ClassList.add(can, document.body.parentNode, aaa.LOGIN), can.onimport.theme(can) function check() { diff --git a/panel/action.js b/panel/action.js index 278f3028..1ebd06b7 100644 --- a/panel/action.js +++ b/panel/action.js @@ -143,7 +143,7 @@ Volcanos(chat.ONLAYOUT, { Volcanos(chat.ONEXPORT, { size: function(can, msg) { msg.Option(html.LEFT, can._output.offsetLeft), msg.Option(html.TOP, can._output.offsetTop) - msg.Option(html.HEIGHT, can._output.offsetHeight), msg.Option(html.WIDTH, can._output.offsetWidth) + msg.Option(html.HEIGHT, can._output.offsetHeight||window.innerHeight), msg.Option(html.WIDTH, can._output.offsetWidth||window.innerWidth) msg.Option(html.MARGIN_Y, can.Conf(html.MARGIN_Y)), msg.Option(html.MARGIN_X, can.Conf(html.MARGIN_X)) }, layout: function(can) { return can._layout||can.onlayout._storage(can)||can.misc.SearchOrConf(can, html.LAYOUT)||"" }, diff --git a/plugin/input/key.js b/plugin/input/key.js index 5ff8dac2..be132a11 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -53,19 +53,21 @@ Volcanos(chat.ONFIGURE, {key: { can.layout(msg) }, onfocus: function(event, can, meta, target, cbs, mod) { - can.onengine.signal(can, "onevent", can.request(event)); - meta._force && mod.onclick(event, can, meta, target, cbs) + // can.onengine.signal(can, "onevent", can.request(event)); if (target._selectonly) { can.onmotion.delay(can, function() { target.blur() }) } + meta._force && mod.onclick(event, can, meta, target, cbs) }, - onclick: function(event, can, meta, target, cbs) { can.onengine.signal(can, "onevent", can.request(event)); + onclick: function(event, can, meta, target, cbs) { + // can.onengine.signal(can, "onevent", can.request(event)); if (target._selectonly) { can.onmotion.delay(can, function() { target.blur() }) } (target.value == "" || meta._force || target._selectonly) && cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return } sub.sup = can._fields? can.sup: can meta.msg && meta.msg.Length() > 0? sub._show(sub, meta.msg, cb, target, meta.name): sub._load(event, sub, cb, target, meta.name, target.value) }) }, - onblur: function(event, can, sub, cb, target) { if (target._hold) { return } + onblur: function(event, can, sub, cb, target) { + if (target._hold) { return } if (target._selectonly) { return } - can.onengine.signal(can, "onevent", can.request(event, {query: can.page.getquery(can, target)+","+target.value})) + // can.onengine.signal(can, "onevent", can.request(event, {query: can.page.getquery(can, target)+","+target.value})) sub && can.onmotion.delay(can, sub.close, 300) }, onkeyup: function(event, can, meta, cb, target, sub, last) { if (event.key == code.TAB) { return } diff --git a/plugin/table.js b/plugin/table.js index 25370d33..4f18db9e 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -290,6 +290,7 @@ Volcanos(chat.ONIMPORT, { 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) 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) }) @@ -298,6 +299,13 @@ Volcanos(chat.ONIMPORT, { }, 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 }) + can.core.Item(can.onaction, function(key, value) { _sub.onaction[key] = _sub.onaction[key]||value }) + can.core.Item(can.onexport, function(key, value) { _sub.onexport[key] = _sub.onexport[key]||value }) + } + }, 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(",") @@ -308,7 +316,7 @@ Volcanos(chat.ONIMPORT, { can.page.style(can, _action, html.DISPLAY, html.NONE), sup._output.innerHTML == "" && sup.Update() } } 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()-html.ACTION_HEIGHT + value.type = html.STORY, value.style = html.OUTPUT, value.height = 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 }) @@ -323,14 +331,12 @@ Volcanos(chat.ONIMPORT, { sub.onimport._field = function(sub, msg, cb) { msg.Table(function(value) { value._goback = function() { goback(true) }, can.onimport.myStory(can, value) }) } - sub.onexport._output = function(_sub) { - can.core.Item(can.onimport, function(key, value) { _sub.onimport[key] = _sub.onimport[key]||value }) - can.core.Item(can.onexport, function(key, value) { _sub.onexport[key] = _sub.onexport[key]||value }) - } + can.onimport.myField(can, sub) sub.onexport.output = function(_sub, msg) { _sub._stacks_current = can._stacks_current, _sub._stacks_root = can._stacks_root sub._select(), msg.Option(ice.MSG_ACTION) && can.onappend._action(sub, msg.Option(ice.MSG_ACTION), _action, null, true) 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() } if (clear) { if (sub.Option(UID)) { sub.Option(UID, "") } } if (sub.Option(UID)) { return sub.Option(UID, ""), sub.Update() } @@ -385,12 +391,7 @@ Volcanos(chat.ONIMPORT, { }) cb = cb|| function(event) { can.Option(UID, value.uid), can.Update() } return {view: [[html.ITEM_CARD, value._uid? "uid-"+value._uid: ""].concat(value._style||[])], list: [ - {view: html.ACTION, _init: function(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]) } - }) - }}, + {view: html.ACTION, _init: function(target) { can.page.appendAction(can, value, target) }}, {view: html.OUTPUT, list: [ {img: can.misc.ResourceIcons(can, value.icons||value.icon||value.command_icon||value.service_icon||