From 1a9e64b92df50afbed090b351a53b7bdd96d6871 Mon Sep 17 00:00:00 2001 From: shy Date: Thu, 25 Jan 2024 13:03:11 +0800 Subject: [PATCH] opt chat.message --- const.js | 5 ++++- frame.js | 13 ++++++++++--- index.css | 3 +++ lib/base.js | 14 +++++++++----- lib/user.js | 2 +- plugin/input/key.js | 18 ++++++------------ plugin/state.js | 10 +++++++--- 7 files changed, 40 insertions(+), 25 deletions(-) diff --git a/const.js b/const.js index d72844df..97ae015a 100644 --- a/const.js +++ b/const.js @@ -192,7 +192,8 @@ var cli = { DELAY: "delay", PLAY: "play", STEP: "step", QRCODE: "qrcode", COLOR: "color", BLACK: "black", WHITE: "white", BLUE: "blue", RED: "red", GRAY: "gray", CYAN: "cyan", GREEN: "green", PURPLE: "purple", YELLOW: "yellow", - MAGENTA: "magenta", SILVER: "silver", ALICEBLUE: "aliceblue", TRANSPARENT: "transparent", + MAGENTA: "magenta", SILVER: "silver", ALICEBLUE: "aliceblue", + TRANSPARENT: "transparent", LINUX: "linux", DARWIN: "darwin", WINDOWS: "windows", DONE: "done", COST: "cost", FROM: "from", PWD: "pwd", } @@ -260,6 +261,7 @@ var chat = { ONENGINE: "onengine", ONDAEMON: "ondaemon", ONAPPEND: "onappend", ONLAYOUT: "onlayout", ONMOTION: "onmotion", ONKEYMAP: "onkeymap", ONIMPORT: "onimport", ONACTION: "onaction", ONDETAIL: "ondetail", ONEXPORT: "onexport", ONSYNTAX: "onsyntax", ONFIGURE: "onfigure", ONPLUGIN: "onplugin", + ONINPUTS: "oninputs", ONSIZE: "onsize", ONMAIN: "onmain", ONLOGIN: "onlogin", ONREMOTE: "onremote", ONSEARCH: "onsearch", ONRESIZE: "onresize", ONKEYUP: "onkeyup", ONKEYDOWN: "onkeydown", ONMOUSEENTER: "onmouseenter", ORIENTATIONCHANGE: "orientationchange", @@ -331,6 +333,7 @@ var html = {value: { FLEX: "flex", FLOW: "flow", SCROLLBAR: "scrollbar", VISIBILITY: "visibility", + TRANSPARENT: "transparent", VERTICAL: "vertical", HORIZON: "horizon", NOTICE: "notice", DANGER: "danger", TOIMAGE: "toimage", diff --git a/frame.js b/frame.js index 8d74161f..5c82ac07 100644 --- a/frame.js +++ b/frame.js @@ -166,10 +166,12 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }}]) }) while (args.length > 0) { if (args[args.length-1] != "") { break } args.pop() } - can.core.List(args.slice(can.core.List(meta.inputs, function(item) { if (can.base.isIn(item.type, html.TEXTAREA, html.TEXT, html.SELECT)) { return item } }).length), function(item, index) { meta.inputs.push({type: mdb.TEXT, name: "args"+index, value: item}) }) + if (args.slice) { + can.core.List(args.slice(can.core.List(meta.inputs, function(item) { if (can.base.isIn(item.type, html.TEXTAREA, html.TEXT, html.SELECT)) { return item } }).length), function(item, index) { meta.inputs.push({type: mdb.TEXT, name: "args"+index, value: item}) }) + } function add(item, next) { item = can.base.isString(item)? {type: html.TEXT, name: item}: item, item.type != html.BUTTON && index++ return Volcanos(item.name, {_root: can._root, _follow: can.core.Keys(can._follow, item.name), - _target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option), _option: option||can._option, _action: can._action, _output: can._output, _status: can._status, + _target: can.onappend.input(can, item, args[index]||args[item.name]||opts[item.name], option||can._option), _option: option||can._option, _action: can._action, _output: can._output, _status: can._status, CloneField: can.Clone, CloneInput: function() { can.onmotion.focus(can, add(item)._target) }, Input: can.Input, Option: can.Option, Action: can.Action, Status: can.Status, }, [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]}]) } @@ -649,7 +651,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { sub.Status(html.HEIGHT, sub._output.offsetHeight), sub.Status(html.WIDTH, sub._output.offsetWidth) } can.core.CallFunc(on, {event: event, can: can, meta: meta, cb: _cb, target: target, sub: target._can, last: last, cbs: function(cb) { - target._can? show(target._can, cb): can.onappend._init(can, {type: html.INPUT, name: input, style: meta.name, mode: chat.FLOAT}, [path], function(sub) { sub.Conf(meta) + target._can? show(target._can, cb): can.onappend._init(can, {type: html.INPUT, name: input, style: meta.name, mode: chat.FLOAT}, [path, meta.display], function(sub) { sub.Conf(meta) can.page.Append(can, sub._target, [{text: [can.page.unicode.remove, "", "close"], onclick: function() { sub.close() }}]) sub.run = function(event, cmds, cb) { var msg = sub.request(event) if (meta.range) { for (var i = meta.range[0]; i < meta.range[1]; i += meta.range[2]||1) { msg.Push(mdb.VALUE, i) } cb(msg); return } @@ -1027,6 +1029,11 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||documen default: return } return can.Status(mdb.INDEX, target._index), can.onkeymap.prevent(event) } + if (can.page.Select(can, can._output, html.DIV_ITEM, function(tr, index) { + can.onmotion.hidden(can, tr, tr.innerText.indexOf(target.value) > -1) + return tr + }).length > 0) { return } + // , target._index = -1, target._value = target.value can.page.Select(can, can._output, [html.TBODY, html.TR], function(tr, index) { var has = false can.page.Select(can, tr, html.TD, function(td) { has = has || td.innerText.indexOf(target.value)>-1 }), can.page.ClassList.set(can, tr, html.HIDDEN, !has) }), target._index = -1, target._value = target.value diff --git a/index.css b/index.css index 55d27b59..8f3622d3 100644 --- a/index.css +++ b/index.css @@ -148,6 +148,8 @@ fieldset>div.output { width:100%; } fieldset>div.status { width:100%; } fieldset.rich>div.output>table.content { font-family:var(--code-font-family); } fieldset.input>legend { display:none; } +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.action { display:none; } fieldset.input.key div.output table.content { width:100%; } fieldset.input.key div.status { background-color:var(--plugin-bg-color); } @@ -203,6 +205,7 @@ body>div.input tr.icon td:last-child { position:relative; } body>div.input tr.icon td:last-child img:first-child { position:absolute; height:28px; width:28px; 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:first-child { position:absolute; height:28px; width:28px; left:2px; top:2px; } +body>div.input tr.icons td:last-child span:not(.icon) { position:absolute; left:32px; } 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; } diff --git a/lib/base.js b/lib/base.js index e5bf14d1..7138b453 100644 --- a/lib/base.js +++ b/lib/base.js @@ -87,11 +87,15 @@ Volcanos("base", { if (typeof arg[i] == code.OBJECT && arg[i].length > 0 && arg[i].indexOf(item) > -1) { return true } if (item == arg[i]) { return true } } }, - TimeTrim: function(value) { - var now = new Date() - var year = now.getFullYear()+"-" - var pre = this.Time(now, "%y-%m-%d ") - return this.trimPrefix(value.split(":").slice(0, 2).join(":"), pre, year) + TimeTrim: function(value) { var prefix = "" + var now = new Date(), year = now.getFullYear()+"-", pre = this.Time(now, "%y-%m-%d ") + if (value.indexOf(pre) == -1) { var list = ["昨天", "前天"] + for (var i = 0; i < list.length; i++) { + var yestoday = this.Time(new Date(now - (i+1)*24*60*60*1000), "%y-%m-%d ") + if (value.indexOf(yestoday) == 0) { prefix = list[i]+" ", pre = yestoday; break } + } + } + return prefix+this.trimPrefix(value.split(":").slice(0, 2).join(":"), pre, year) }, Time: function(time, fmt) { var now = this.Date(time) fmt = fmt||"%y-%m-%d %H:%M:%S" diff --git a/lib/user.js b/lib/user.js index 06fb3c16..958e79ab 100644 --- a/lib/user.js +++ b/lib/user.js @@ -186,7 +186,7 @@ Volcanos("user", { if (item.name && item.name != ctx.ACTION) { target.value = item.value||msg.Option(item.name)||can.Option(item.name)||can.Status(item.name)||target.value||"" } item.mode = chat.SIMPLE, can.onappend.figure(can, can.base.Copy({space: msg.Option(web.SPACE), run: function(event, cmds, cb) { var _msg = can.request(event, {_handle: ice.TRUE, action: msg.Option(html.ACTION)}, msg, can.Option()) can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { item.name && item.value && _msg.Option(item.name, item.value) }) - can.run(event, cmds, cb, true) + ;(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) diff --git a/plugin/input/key.js b/plugin/input/key.js index 3090b3f8..4489518f 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -16,24 +16,18 @@ Volcanos(chat.ONFIGURE, {key: { can.close(); if (msg.cb && msg.cb[index]) { return msg.cb[index](value) } var _cb = can.Conf("select"); if (_cb) { return _cb(target.value = value) } can.base.isFunc(cb) && cb(can, value, target.value) }} - }), can.onappend._status(can, [mdb.TOTAL, mdb.INDEX]), can.Status(mdb.TOTAL, msg.Length()), can.onmotion.toggle(can, can._status, msg.Length() > 5) + }), can.onappend._status(can, [mdb.TOTAL, mdb.INDEX]), can.Status(mdb.TOTAL, msg.Length()), can.Status("index", "-1") + can.onmotion.toggle(can, can._status, msg.Length() > 5), can.onmotion.toggle(can, can._target, can.Status("total") > 0) + can.core.CallFunc(can.oninputs._show, {event: event, can: can, msg: msg, target: target, name: name}) can.page.style(can, can._output, html.MAX_HEIGHT, can.page.height()/2, html.MIN_WIDTH, target.offsetWidth, html.MAX_WIDTH, can.Conf("style.width")||can.page.width()/2) - msg.append.length == 1 && can.page.ClassList.add(can, can._target, chat.SIMPLE), can.onlayout.figure({target: target}, can, can._target, false, 200) - can.onmotion.toggle(can, can._target, can.Status("total") > 0) - can.Status("index", "-1") + msg.append.length == 1 && can.page.ClassList.add(can, can._target, chat.SIMPLE) + can.onlayout.figure({target: target}, can, can._target, false, 200) }, onclick: function(event, can, meta, target, cbs) { cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return } 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) }) }, - onfocus: function(event, can, meta, target, cbs) { - return - cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return } - 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) { sub && can.onmotion.delay(can, sub.close, 300) }, - onkeydown: function(event, can, meta, cb, target, sub, last) { - if (event.key == code.TAB) { return } + onkeydown: 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 }) diff --git a/plugin/state.js b/plugin/state.js index f6a8b529..6cc2820b 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -106,12 +106,12 @@ Volcanos(chat.ONIMPORT, { can.page.SelectArgs(can, can._action, "", function(target) { target.value = his[i++]||"" }); break } can.Update(event) }, }) -Volcanos(chat.ONACTION, {list: ["刷新数据", "刷新界面", "切换浮动", "切换全屏", "生成链接", +Volcanos(chat.ONACTION, {list: ["刷新数据", "刷新界面", "切换浮动", "切换全屏", "发送聊天", "生成链接", function(can) { if (!can.isCmdMode()) { return "打开链接" } }, function(can) { if (can.isCmdMode()) { return "打开首页" } }, function(can) { if (can.ConfSpace() || can.isCmdMode() && can.misc.Search(can, ice.POD)) { return "打开空间" } }, + "共享工具", function(can) { if (can.misc.Search(can, ice.MSG_DEBUG)) { return "查看源码" } }, function(can) { if (can.misc.Search(can, ice.MSG_DEBUG)) { return "查看镜像" } }, - "共享工具", ["视图", "参数", function(can) { if (can._action.innerHTML) { return "操作" } }, function(can) { if (can._status.innerHTML) { return "状态" } }, @@ -157,7 +157,11 @@ Volcanos(chat.ONACTION, {list: ["刷新数据", "刷新界面", "切换浮动", "打开空间": function(event, can) { can.user.open(can.misc.MergePodCmd(can, {pod: can.ConfSpace()||can.misc.Search(can, ice.POD)})) }, "打开链接": function(event, can) { can.user.open(can.onexport.link(can)) }, "发送聊天": function(event, can) { - can.user.input(event, can, [{name: "message", value: "dream"}], function(list) { + can.user.input(event, can, [{name: "message", display: "/require/usr/icebergs/core/chat/message.js", run: function(event, cmds, cb) { + can._root.Header.run(event, [ctx.ACTION, "message"].concat(cmds), function(msg) { + cb(msg) + }) + }}], function(list) { can._root.Header.run(event, [ctx.ACTION, "message", list[0], mdb.TYPE, "plug", web.SPACE, can.ConfSpace(), ctx.INDEX, can.ConfIndex(), ctx.ARGS, JSON.stringify(can.Option())]) }) },