diff --git a/const.js b/const.js index 36312c11..24f3daf1 100644 --- a/const.js +++ b/const.js @@ -353,7 +353,32 @@ var html = {value: { var icon = { CHEVRON_DOWN: "bi bi-chevron-down", SEARCH: "bi bi-search", TERMINAL: "bi bi-terminal", SUN: "bi bi-sun", MOON: "bi bi-moon-stars", - help: "bi bi-question-square", + + help: "bi bi-question-square", doc: "bi bi-question-square", + admin: "bi bi-window-sidebar", login: "bi bi-person-check", + + vimer: "bi bi-keyboard", build: "bi bi-tools", repos: "bi bi-git", + xterm: "bi bi-terminal", cmds: "bi bi-terminal", cmd: "bi bi-terminal", + cat: "bi bi-file-earmark-code", + + record1: "bi bi-images", record2: "bi bi-record-circle", + spide: "bi bi-diagram-3", travel: "bi bi-list-ol", + upload: "bi bi-cloud-upload", download: "bi bi-cloud-download", + push: "bi bi-cloud-upload", pull: "bi bi-cloud-download", + autogen: "bi bi-tools", preview: "bi bi-window-stack", show: "bi bi-window-stack", + start: "bi bi-play-circle", stop: "bi bi-stop-circle", + startall: "bi bi-play-circle", stopall: "bi bi-stop-circle", + play: "bi bi-play-circle", + conf: "bi bi-gear", configs: "bi bi-gear", + inspect: "bi bi-window-stack", + logs: "bi bi-calendar4-week", + tag: "bi bi-tags", + + open: "bi bi-box-arrow-up-right", + main: "bi bi-box-arrow-up-right", + portal: "bi bi-box-arrow-up-right", + trash: "bi bi-trash", remove: "bi bi-trash", + more: "bi bi-three-dots-vertical", actions: "bi bi-three-dots", } var svg = { GROUP: "group", PID: "pid", GRID: "grid", diff --git a/frame.js b/frame.js index 6367eb65..9f9dc459 100644 --- a/frame.js +++ b/frame.js @@ -176,10 +176,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }, [item.display, chat.PLUGIN_INPUT_JS], function(sub) { sub.Conf(item) sub._fields = can if (item.type == html.TEXT) { can.page.Append(can, sub._target.parentNode, [{text: [sub._target.value, html.SPAN, mdb.VALUE]}]) } - if (item.type == html.BUTTON && can.base.isIn(item.name, mdb.CREATE, mdb.INSERT, mdb.PRUNES, mdb.PRUNE, ice.HELP)) { - can.onappend.icons(can, sub._target, item.name, function(event) { - can.Update(event, [ctx.ACTION, item.name].concat(can.page.SelectArgs(sub))) - }) + if (item.type == html.BUTTON && can.page.isIconInput(can, item.name)) { + can.onappend.icons(can, sub._target, item.name, function(event) { can.Update(event, [ctx.ACTION, item.name].concat(can.page.SelectArgs(sub))) }) } item.type == html.BUTTON && can.onappend.icons(can, sub._target, can.Conf(["_icons", item.name]), function(event) { can.Update(event, [ctx.ACTION, item.name].concat(can.page.SelectArgs(sub))) }) @@ -217,9 +215,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }) }}: /* 4.其它 */(item.type == html.BUTTON && (item.value = item.value||can.user.trans(can, item.name, meta._trans), item.onclick = item.onclick||function(event) { run(event, item.name||item.value) }, item._init = item._init||function(target) { item.action && can.onappend.figure(sub, item, target, function(_sub, value) { can.Update() }) - if (item.type == html.BUTTON && can.base.isIn(item.name, mdb.CREATE, mdb.INSERT, mdb.PRUNES, cli.START, web.REFRESH)) { - can.onappend.icons(can, target, item.name) - } item.type == html.BUTTON && can.onappend.icons(can, target, can.Conf(["_icons", item.name]), item.name) + if (item.type == html.BUTTON && can.page.isIconInput(can, item.name)) { can.onappend.icons(can, target, item.name) } }), item), "", action) }), meta }, @@ -351,8 +347,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { item.style && can.onappend.style(can, item.style, target) }}])[item.name]; return _input }, - icons: function(can, target, icon, cb) { if (!icon) { return } can.onappend.style(can, "icons", target.parentNode) - can.page.Append(can, target.parentNode, [{icon: icon, title: can.user.trans(can, icon), onclick: can.base.isFunc(cb)? cb: function(event) { can.Update(event, [ctx.ACTION, cb||icon]) }}]) + icons: function(can, target, name, cb) { + var _icon = can.Conf("feature._icons."+name) || icon[name] || name + if (!_icon) { return } can.onappend.style(can, "icons", target.parentNode) + can.page.Append(can, target.parentNode, [{icon: _icon, title: can.user.trans(can, name), onclick: can.base.isFunc(cb)? cb: target.onclick||function(event) { can.Update(event, [ctx.ACTION, cb||name]) }}]) }, mores: function(can, target, value, limit) { var list = can.page.Select(can, target, html.INPUT_BUTTON, function(target) { @@ -436,6 +434,15 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }) }, title: can.user.trans(can, can.Option(key) == undefined? key: "click to detail", null, html.INPUT), _init: function(target) { key == ctx.ACTION && can.onappend.mores(can, target, data, msg.IsDetail()? 10: html.TABLE_BUTTON) + var list = can.page.Select(can, target, html.INPUT, function(target) { + var _icon = can.Conf("feature._icons."+target.name)||icon[target.name]; if (_icon) { return target } + }) + can.core.List(list, function(target) { can.onappend.style(can, "icons", target) + var _icon = can.Conf("feature._icons."+target.name)||icon[target.name] + can.page.insertBefore(can, [{icon: _icon, title: can.user.trans(can, target.name), onclick: target.onclick||function(event) { + can.Update(can.request(event, data), [ctx.ACTION, target.name]) + }}], target.nextSibling, target.parentNode) + }) can.page.SelectOne(can, target, html.SPAN, function(span) { can.core.List(span.style, function(key) { target.style[key] = span.style[key] }) }) can.page.style(can, target, "cursor", can.base.isIn(key, mdb.KEY, mdb.TIME)? "default": can.Option(key) != undefined? "pointer": "text") }} @@ -697,7 +704,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { if (can.base.beginWith(item.innerText, "open http")) { return can.user.open(can.core.Split(item.innerText)[1]) } if (item.innerText.indexOf(web.HTTP) == 0) { return can.user.open(item.innerText) } if (item.innerText.indexOf("vim ") == 0) { - can.onappend._float(can, web.CODE_VIMER, can.misc.SplitPath(can, item.innerText.split(" ")[1])) + can.onappend._float(can, web.CODE_VIMER, can.misc.SplitPath(can, item.innerText.split(lex.SP)[1])) } else { meta.name == "shell" && can.onappend._float(can, web.CODE_XTERM, ["sh"]) } diff --git a/index.css b/index.css index aefa5755..5b88c245 100644 --- a/index.css +++ b/index.css @@ -103,6 +103,11 @@ table.content th.select { border:var(--notice-bg-color) solid 1px; } table.content th.select[data-asc="1"] i.bi-sort-down-alt { display:none; } table.content th.select[data-asc="0"] i.bi-sort-up { display:none; } table.content td { padding:var(--table-padding); } +table.content td input.icons { display:none; } +table.content td i:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); cursor:pointer; } +table.content td i { padding:var(--input-padding); } +body:not(.mobile) fieldset.plugin:not(.float):not(.full):not(.cmd) table.content td input.icons { display:unset; } +body:not(.mobile) fieldset.plugin:not(.float):not(.full):not(.cmd) table.content td i { display:none; } table.content.checkbox th:first-child { text-align:center; padding:var(--table-padding); position:sticky; left:2px; z-index:1; } table.content.checkbox td:first-child { background-color:var(--th-bg-color); text-align:center; position:sticky; left:2px; } table.content.detail td:first-child { width:var(--input-width); } @@ -295,7 +300,7 @@ body:not(.mobile) fieldset.plugin:not(.float):not(.full):not(.cmd)>form.option>d body:not(.mobile) fieldset.plugin:not(.float):not(.full):not(.cmd)>form.option>div.button.icons>i { display:none; } body:not(.mobile) fieldset.plugin:not(.float):not(.full):not(.cmd)>div.action>div.button.icons>input { display:unset; } body:not(.mobile) fieldset.plugin:not(.float):not(.full):not(.cmd)>div.action>div.button.icons>span.icon { display:none; } -body:not(.mobile) fieldset.plugin:not(.float):not(.full):not(.cmd)>div.aciton>div.button.icons>i { display:none; } +body:not(.mobile) fieldset.plugin:not(.float):not(.full):not(.cmd)>div.action>div.button.icons>i { display:none; } fieldset.panel>div.action>div.button.icons>span.icon { display:none; } fieldset.plugin.cmd>form.option>div.icon.delete { display:none; } fieldset.story>form.option>div.button.icons>input { display:none; } diff --git a/lib/page.js b/lib/page.js index 8e5c8884..967eb540 100644 --- a/lib/page.js +++ b/lib/page.js @@ -298,6 +298,9 @@ Volcanos("page", { }, tagClass: function(target) { return target.tagName.toLowerCase()+(target.className? nfs.PT+target.className.replaceAll(lex.SP, nfs.PT): "") }, isDisplay: function(target) { return target && target.style.display != html.NONE && target.className.indexOf(html.HIDE) == -1 }, + isIconInput: function(can, name) { + return can.base.isIn(name, mdb.CREATE, mdb.INSERT, mdb.PRUNES, mdb.PRUNE, ice.HELP, cli.START, web.REFRESH) || icon[name] || can.Conf("feature._icons."+name) + }, editable: function(can, item, ok) { item.setAttribute("contenteditable", ok) }, draggable: function(can, item, ok) { item.setAttribute("draggable", ok) }, height: function() { return window.innerHeight },