From 23f1142ae76912ee2cbf2f395b2ac30871b6a96c Mon Sep 17 00:00:00 2001 From: shy Date: Mon, 17 Jun 2024 18:27:19 +0800 Subject: [PATCH] add some --- frame.js | 11 +++++++---- index.css | 12 ++++++++---- lib/user.js | 9 ++++----- panel/header.js | 2 +- panel/river.js | 9 +++++++-- plugin/input/key.js | 30 ++++++++++++++++++++++++------ 6 files changed, 51 insertions(+), 22 deletions(-) diff --git a/frame.js b/frame.js index d0cca6b6..de314c1d 100644 --- a/frame.js +++ b/frame.js @@ -557,7 +557,10 @@ Volcanos(chat.ONAPPEND, { checkbox: function(can, table, msg) { can.page.Select(can, table, "tr>th:first-child,tr>td:first-child", function(target) { can.page.insertBefore(can, [{type: target.tagName, list: [{type: html.INPUT, data: {type: html.CHECKBOX}, onchange: function(event) { - can.page.tagis(target, html.TH) && can.page.Select(can, table, "tr>td:first-child>input[type=checkbox]", function(target) { target.checked = event.target.checked }) + can.page.tagis(target, html.TH) && can.page.Select(can, table, "tr>td:first-child>input[type=checkbox]", function(target) { + if (can.page.ClassList.has(can, can.page.parentNode(can, target, html.TR), html.HIDE)) { return } + target.checked = event.target.checked + }) var list = {}, key = can.page.SelectArgs(can, can._option, "", function(target) { if (target.value == "") { return target.name } }) can.page.Select(can, table, "tr>td:first-child>input[type=checkbox]", function(target) { can.page.ClassList.set(can, can.page.parentNode(can, target, html.TR), html.SELECT, target.checked) target.checked && can.core.List(key, function(key) { if (!msg[key]) { return } list[key] = (list[key]||[]).concat([msg[key][can.page.parentNode(can, target, html.TR).dataset.index]]) }) @@ -931,7 +934,7 @@ Volcanos(chat.ONAPPEND, { msg.append.length == 1 && can.page.ClassList.add(can, sub._target, chat.SIMPLE) can.page.style(can, sub._target, html.MAX_HEIGHT, can.page.height()/2, html.MIN_WIDTH, target.offsetWidth, html.MAX_WIDTH, can.page.width()/2) can.onlayout.figure({target: target}, can, sub._target, false, 200, function(height, width) { - can.page.style(can, sub._output, html.MAX_HEIGHT, height-sub._status.offsetHeight) + can.page.style(can, sub._output, html.MAX_HEIGHT, height-sub._status.offsetHeight-sub._action.offsetHeight) sub.Status(html.HEIGHT, parseInt(height-sub._status.offsetHeight)), sub.Status(html.WIDTH, parseInt(width)) }) } @@ -1072,7 +1075,7 @@ Volcanos(chat.ONMOTION, { }, modify: function(can, target, cb, item) { var back = target.innerHTML, _target = target if (back.length > 120 || back.indexOf(lex.NL) > -1) { return can.onmotion.modifys(can, target, cb) } - var ui = can.page.Appends(can, target, [{type: html.INPUT, value: target.innerText, style: {width: can.base.Max(target.offsetWidth-20, 400)}, onkeydown: function(event) { switch (event.key) { + var ui = can.page.Appends(can, target, [{type: html.INPUT, value: target.innerText, style: {width: can.base.Max(target.offsetWidth-20, can.ConfWidth())}, onkeydown: function(event) { switch (event.key) { case code.ENTER: target.innerHTML = event.target.value, event.target.value == back || cb(event, event.target.value.trim(), back); break case code.ESCAPE: target.innerHTML = back; break default: can.onkeymap.input(event, can) @@ -1082,7 +1085,7 @@ Volcanos(chat.ONMOTION, { }, modifys: function(can, target, cb, item) { var back = target.innerHTML var ui = can.page.Appends(can, target, [{type: html.TEXTAREA, value: target.innerText, style: { - height: can.base.Min(target.offsetHeight-20, 60), width: can.base.Max(target.offsetWidth-20, 400), + height: can.base.Min(target.offsetHeight-20, 60), width: can.base.Max(target.offsetWidth-20, can.ConfWidth()), }, onkeydown: function(event) { switch (event.key) { case code.ENTER: if (event.ctrlKey) { target.innerHTML = event.target.value, event.target.value == back || cb(event, event.target.value.trim(), back) } break case code.ESCAPE: target.innerHTML = back; break diff --git a/index.css b/index.css index e7d22c12..1d509db0 100644 --- a/index.css +++ b/index.css @@ -130,8 +130,8 @@ table.content td.option { cursor:pointer; } table.content td { padding:var(--table-padding); } table.content td i { padding:var(--input-padding); } table.content:not(.detail) td input.icons { display:none; } -table.content.checkbox th:first-child { text-align:center; padding:var(--table-padding); position:sticky; left:2px; } -table.content.checkbox td:first-child { text-align:center; padding:var(--table-padding); position:sticky; left:2px; } +table.content.checkbox th:first-child { text-align:center; padding:var(--table-padding); position:sticky; left:2px; width:20px; } +table.content.checkbox td:first-child { text-align:center; padding:var(--table-padding); position:sticky; left:2px; width:20px; } table.content.action th:last-child { text-align:center; padding:var(--table-padding); position:sticky; right:2px; } table.content.action td:last-child { text-align:center; padding:var(--table-padding); position:sticky; right:2px; } table.content.action td:last-child i { color:var(--notice-bg-color); } @@ -291,9 +291,10 @@ fieldset>div.action>div.item { margin-right:var(--input-margin); } fieldset.input>legend { display:none; } fieldset.input.icons table { width:100%; text-align:center; } fieldset.input.key div.action { display:none; } +fieldset.input.key div.action div.item.state { display:none; } fieldset.input.key div.output table.content { font-family:var(--code-font-family); width:100%; } fieldset.input.key div.output table.content td:first-child { cursor:pointer; } -fieldset.input.key div.output table.content td:not(:first-child) { background-color:unset !important; color:var(--disable-fg-color); cursor:default; } +fieldset.input.key div.output table.content:not(.checkbox) td:not(:first-child) { background-color:unset !important; color:var(--disable-fg-color); cursor:default; } fieldset.input.key>div.output>div.item:not(.hide) { display:flex; align-items:center; } fieldset.input.key>div.output>div.item img { height:var(--header-height); width:var(--header-height); } fieldset.input.key>div.output>div.item img[src*=".jpg"] { padding:5px; } @@ -352,6 +353,7 @@ body>div.carte input[name=filter] { margin:var(--input-margin); width:calc(100% body>div.carte div.item:not(.hide) { white-space:pre; padding:var(--button-padding); display:flex; align-items:center; } body>div.carte div.item i:first-child { margin-right:var(--button-margin); } body>div.carte div.item span.icon.next { line-height:22px; height:22px; float:right; } +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; } @@ -546,6 +548,8 @@ fieldset.input div.output { background-color:var(--input-bg-color); } fieldset.input div.output>table.content { border-collapse:collapse; } fieldset.input tr:hover { background-color:var(--tr-hover-bg-color); } fieldset.input td:hover { background-color:var(--td-hover-bg-color); } +fieldset.input table.checkbox.content td:first-child { box-shadow:none; } +fieldset.input table.checkbox.content th.select { border:none; } fieldset.input>span.close { padding:var(--input-padding); position:absolute; top:0; right:0; line-height:16px; } fieldset.input>span.close:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); cursor:pointer; } div.float { background-color:var(--float-bg-color); } @@ -593,7 +597,7 @@ fieldset>div.status>legend.select { box-shadow:var(--legend-box-shadow); } fieldset>div.status>legend:hover { box-shadow:var(--legend-box-shadow); } fieldset.Action>div.toast>div.toast:hover { box-shadow:var(--notice-box-shadow); } table.content th { box-shadow:var(--th-box-shadow); } -table.content th.select { border:var(--box-notice); } +// table.content th.select { border:var(--box-notice); } table.content.checkbox td:first-child { box-shadow:var(--th-box-shadow); } table.content.action td:last-child { box-shadow:var(--th-box-shadow); } table.content.detail tr.action td { box-shadow:var(--th-box-shadow); } diff --git a/lib/user.js b/lib/user.js index ae8a8506..fb2fd6ac 100644 --- a/lib/user.js +++ b/lib/user.js @@ -159,8 +159,7 @@ Volcanos("user", { }) } var isinput = can.page.tagis(event.target, html.INPUT) var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, - can.Conf(ctx.INDEX)||can.ConfIndex(), msg.Option(ctx.ACTION), meta._style||msg.Option("_style"), - chat.FLOAT, + can.Conf(ctx.INDEX)||can.ConfIndex(), msg.Option(ctx.ACTION), meta._style||msg.Option("_style"), chat.FLOAT, ]], list: can.core.List(list, function(item, index) { if (typeof item == code.FUNCTION) { item = item(can); if (!item) { return } } if (item === "") { return {type: html.HR} } @@ -175,7 +174,7 @@ Volcanos("user", { var _style = can.page.buttonStyle(can, item) return { view: [[html.ITEM, item, _style]], - list: [can.page.icons(can, item), {text: can.user.trans(can, item, trans)}], + list: [can.page.icons(can, item), {text: [can.user.trans(can, item, trans), "", "name"]}], onclick: function(event) { click(event, item, index) }, onmouseenter: function(event) { remove_sub(carte) }, } @@ -186,7 +185,7 @@ Volcanos("user", { }, carte, trans); carte._sub = sub } return {view: html.ITEM, list: [ can.page.icons(can, item[0]), - {text: can.user.trans(can, item[0], trans)}, + {text: [can.user.trans(can, item[0], trans), "", "name"]}, {text: [lex.SP+can.page.unicode.next, "", [html.ICON, "next"]]} ], onmouseenter: subs, onclick: subs} } @@ -348,7 +347,7 @@ Volcanos("user", { can.onappend.figure(can, {action: "date", _hold: true}, target, function(sub, value) {}) can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%H:%M:%S %w")) }) }}, - avatar: {view: [[html.ITEM, "state", aaa.AVATAR]], list: [{img: can.user.info.avatar}], onclick: function(event) { header && header.onaction.avatar(event, header) }}, + avatar: {view: [[html.ITEM, "state", aaa.AVATAR]], list: [{img: can.misc.Resource(can, can.user.info.avatar)}], onclick: function(event) { header && header.onaction.avatar(event, header) }}, usernick: {view: [[html.ITEM, "state", aaa.USERNICK, html.FLEX], "", can.user.info.usernick], onclick: function(event) { header && header.onaction.usernick(event, header) }, _init: function(target) { can = can._fields? can.sup: can can.ui.head = target.parentNode diff --git a/panel/header.js b/panel/header.js index 51767abf..736606fc 100644 --- a/panel/header.js +++ b/panel/header.js @@ -185,7 +185,7 @@ Volcanos(chat.ONACTION, {_init: function(can) {}, }) Volcanos(chat.ONEXPORT, { language: function(can) { return can.user.info.language }, - avatar: function(can) { return can.user.info.avatar == "void"? "": can.user.info.avatar }, + avatar: function(can) { return can.misc.Resource(can, can.user.info.avatar == "void"? "": can.user.info.avatar) }, background: function(can) { return can.user.info.background == "void"? "": can.user.info.background }, theme: function(can) { return can._theme || can.misc.SearchOrConf(can, chat.THEME) || can.__theme || (can.base.isNight()? html.DARK: html.LIGHT) }, height: function(can) { return can._target.offsetHeight }, diff --git a/panel/river.js b/panel/river.js index 90bd8916..48a2afbe 100644 --- a/panel/river.js +++ b/panel/river.js @@ -141,18 +141,23 @@ Volcanos(chat.ONEXPORT, { }) Volcanos(chat.ONENGINE, { _engine: function(event, can, msg, panel, cmds, cb) { + function right(role) { if (!role || role == aaa.VOID) { return true } + return can.core.List(can.core.Split(can.user.info.userrole||aaa.VOID), function(userrole) { + if (can.base.isIn(userrole, role, aaa.TECH, aaa.ROOT)) { return true } + }).length > 0 + } if (typeof can.river == code.FUNCTION) { can.river = can.river(can) } var list = can.river cmds.length == 0 && can.core.ItemOrder(list, mdb.ORDER, function(key, value) { if (!value) { return } if (value.debug && can.misc.Search(can, ice.MSG_DEBUG) != ice.TRUE) { return } if (value.nodetype && value.nodetype != can.user.info.nodetype) { return } - if (can.base.isIn(can.user.info.userrole||aaa.VOID, value.type||aaa.VOID, aaa.TECH, aaa.ROOT)) { + if (right(value.type)) { can.core.Item(value.storm).length > 0 && msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name, icon: value.icon||"", main: value.main||false}) } }) if (cmds.length != 1 && cmds[1] != chat.STORM) { return false } var river = list[cmds[0]]; if (!river) { return false } can.core.ItemOrder(river.storm, mdb.ORDER, function(key, value) { if (!value) { return } if (value.nodetype && value.nodetype != can.user.info.nodetype) { return } - if (can.base.isIn(can.user.info.userrole||aaa.VOID, value.type||aaa.VOID, aaa.TECH, aaa.ROOT)) { + if (right(value.type)) { msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name||(can.user.trans(can, key)+" "+key), icon: value.icon||icon[key]||"", main: value.main||false}) } }), can.base.isFunc(cb) && cb(msg); return true diff --git a/plugin/input/key.js b/plugin/input/key.js index 1c563f4b..017af285 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -7,7 +7,23 @@ Volcanos(chat.ONFIGURE, {key: { can._show(can, msg, cb, target, name) }) }, - _show: function(can, msg, cb, target, name) { msg.Option(ice.TABLE_CHECKBOX, "") + _show: function(can, msg, cb, target, name) { + // msg.Option(ice.TABLE_CHECKBOX, "") + if (msg.Option(ice.TABLE_CHECKBOX) == ice.TRUE) { target._hold = true + can.onappend._action(can, [html.CANCEL, html.CONFIRM, html.FILTER], can._action, { + cancel: function() { + can.onmotion.focus(can, target), can.onmotion.hidden(can, can._target) + }, + confirm: function() { var list = msg.Table() + can.base.isFunc(cb) && cb(can, can.page.Select(can, can._output, html.TR, function(target) { + if (can.page.ClassList.has(can, target, html.SELECT)) { + return list[target.dataset.index][msg.append[0]] + } + }).join(","), target.value) + can.onmotion.focus(can, target), can.onmotion.hidden(can, can._target) + }, + }) + } if (msg.Length() == 0 || msg.Length() == 1 && msg.Append(name) == target.value && target.value != "") { return can.onmotion.hidden(can) } if (can.base.isIn(msg.append[msg.append.length-1], ctx.ACTION, "cb")) { msg.append = msg.append.slice(0, -1) } var list = {} can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, item) { value = item[key] @@ -39,20 +55,22 @@ Volcanos(chat.ONFIGURE, {key: { }, 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) }, + meta._force && mod.onclick(event, can, meta, target, cbs) + }, onclick: function(event, can, meta, target, cbs) { can.onengine.signal(can, "onevent", can.request(event)); (target.value == "" || meta._force) && 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) { - can.onengine.signal(can, "onevent", can.request(event, {query: can.page.getquery(can, target)+","+target.value})); - sub && can.onmotion.delay(can, sub.close, 300) }, + onblur: function(event, can, sub, cb, target) { if (target._hold) { return } + 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 } if (event.key == code.ENTER) { return meta._enter && (!can.page.tagis(event.target, html.TEXTAREA) || event.ctrlKey) && meta._enter(event, target.value)? sub && sub.close(): last(event) } if (!sub) { return } can.onmotion.toggle(can, sub._target, true) sub.hidden() || can.onkeymap.selectCtrlN(event, can, sub._output, "tr:not(.hidden)>td:first-child", function(td) { return meta.select && (sub.close(), meta.select(target.value = td.innerText)), cb(sub, td.innerText, target.value), td }) - || can.onmotion.delayOnce(can, function() { can.onkeymap.selectInputs(event, sub, function() { sub._load(event, sub, cb, target, meta.name) }, target) }, target.value.length < 3? 500: 150) + || can.onmotion.delayOnce(can, function() { can.onkeymap.selectInputs(event, sub, function() { sub._load(event, sub, cb, target, meta.name) }, target) }, target.value.length < 3? 500: 150) }, }})