From a41445b91f7b724e485e5c66162eeb8ba544fe45 Mon Sep 17 00:00:00 2001 From: harveyshao Date: Fri, 28 Oct 2022 14:16:42 +0800 Subject: [PATCH] opt some --- frame.js | 36 ++++++++------- lib/base.js | 12 ++--- lib/user.js | 5 +- page/index.css | 2 +- plugin/input.js | 8 ++-- plugin/input/date.js | 107 ++++++++++++++++++++++--------------------- plugin/input/key.js | 32 ++++++++----- 7 files changed, 109 insertions(+), 93 deletions(-) diff --git a/frame.js b/frame.js index e814de62..ffb82d16 100644 --- a/frame.js +++ b/frame.js @@ -37,11 +37,11 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { if (panel.onengine._plugin(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() { toast = toast||can.user.toastProcess(msg._can, _toast) }) } + var toast, _toast = msg.Option(chat._TOAST); if (_toast) { can.onmotion.delay(can, function() { toast = toast||can.user.toastProcess(msg._can, _toast) }, 1000) } msg.option = can.core.List(msg.option, function(item) { return [chat._TOAST, ice.MSG_HANDLE].indexOf(item) > -1 && delete(msg[item])? undefined: item }) can.getHeader(chat.TOPIC, function(topic) { msg.Option(chat.TOPIC, topic) }) if (can.base.isUndefined(msg._daemon)) { var sub = msg._can - can.base.isUndefined(sub._daemon) && can.ondaemon._list[0] && (sub._daemon = can.ondaemon._list.push(can)-1) + 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)) } } can.onengine.signal(panel, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) @@ -85,13 +85,13 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { }) Volcanos(chat.ONDAEMON, {_init: function(can, name) { if (can.user.isLocalFile) { return } can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, cli.DAEMON)||name||"", text: can.user.title()}, function(event, msg, cmd, arg) { if (!msg) { return } - var sub = can.ondaemon._list[msg.Option(ice.MSG_TARGET)]; can.base.isFunc(sub.ondaemon[cmd])? - can.core.CallFunc(sub.ondaemon[cmd], {can: can, sub: sub, msg: msg, cmd: cmd, arg: arg, cb: function() { msg.Reply() }}): + var sub = can.ondaemon._list[msg.Option(ice.MSG_TARGET)]||can; can.base.isFunc(sub.ondaemon[cmd])? + can.core.CallFunc(sub.ondaemon[cmd], {can: can, msg: msg, sub: sub, cmd: cmd, arg: arg, cb: function() { msg.Reply() }}): can.onengine._search({}, can, msg, can, [chat._SEARCH, cmd].concat(arg), function() { msg.Reply() }) }) }, _list: [""], pwd: function(can, msg, arg) { can._wss_name = can.ondaemon._list[0] = arg[0] }, - toast: function(can, msg, arg) { can.core.CallFunc(can.user.toast, [can].concat(arg)) }, + toast: function(can, msg, sub, arg) { can.core.CallFunc(can.user.toast, [sub].concat(arg)) }, refresh: function(can, msg, sub) { sub.Update() }, input: function(can, msg, sub, arg) { can.page.Select(can, sub._target, "input:focus", function(target) { target.value += arg[0] }) }, action: function(can, msg, sub, arg) { @@ -160,7 +160,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { Option: can.Option, Action: can.Action, Status: can.Status, Input: can.Input, CloneInput: function() { can.onmotion.focus(can, add(item)._target) }, CloneField: can.Clone, }, [item.display, chat.PLUGIN_INPUT_JS], function(sub) { sub.Conf(item) - sub.run = function(event, cmds, cb, silent) { var msg = can.request(event) + sub.run = function(event, cmds, cb, silent) { var msg = can.request(event, kit.Dict(chat._TOAST, ice.PROCESS)) if (msg.RunAction(event, sub, cmds)) { return } if (msg.RunAction(event, can.core.Value(can, chat._OUTPUTS_CURRENT), cmds)) { return } can.Update(event, can.Input(cmds, !silent), cb, silent) @@ -169,7 +169,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.core.ItemCB(sub.onaction, function(key, cb) { sub._target[key] = function(event) { cb(can.request(event)._event, sub) } }) can.core.ItemCB(item, function(key, cb) { sub._target[key] = function(event) { cb(can.request(event)._event, sub) } }) skip? next(): can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, meta: item, cb: next, target: sub._target}); - (item.action||can.core.Value(meta, [ctx.FEATURE, ctx.INPUTS])) && can.onappend.figure(sub, item, sub._target, function(_sub, value) { + // (item.action||can.core.Value(meta, [ctx.FEATURE, ctx.INPUTS])) && can.onappend.figure(sub, item, sub._target, function(_sub, value) { + can.onappend.figure(sub, item, sub._target, function(_sub, value) { sub._target.value = value, can.onmotion.focus(can, sub._target), can.onmotion.delay(can, function() { can.Update() }) }) }) @@ -178,7 +179,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { _action: function(can, list, action, meta) { meta = meta||can.onaction||{}, action = action||can._action, can.onmotion.clear(can, action) return can.core.List(can.page.inputs(can, can.base.getValid(can.base.Obj(list), can.core.Value(can, [chat.ONACTION, mdb.LIST]), can.core.Item(meta))||[]), function(item) { !can.base.isUndefined(item) && can.onappend.input(can, item == ""? /* 空白 */ {type: html.SPACE}: - can.base.isString(item)? /* 按键 */ {type: html.BUTTON, value: can.user.trans(can, item), onclick: function(event) { + can.base.isString(item)? /* 按键 */ {type: html.BUTTON, name: item, value: can.user.trans(can, item), onclick: function(event) { var cb = meta[item]||meta[chat._ENGINE]; cb? can.core.CallFunc(cb, {event: event, can: can, button: item}): can.run(event, [ctx.ACTION, item].concat(can.sup.Input())) }, onkeydown: function(event) { if (event.key == lang.ENTER) { var cb = meta[item]||meta[chat._ENGINE]; cb? can.core.CallFunc(cb, {event: event, can: can, button: item}): can.run(event, [ctx.ACTION, item].concat(can.sup.Input())) @@ -251,7 +252,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { case html.SPACE: return can.page.Append(can, target, [{view: can.base.join([html.ITEM, html.SPACE])}]) } var input = can.page.input(can, can.base.Copy({}, item), value) - if (item.type == html.SELECT && item.value) { input._init = function(target) { target.value = item.value } } + if (item.type == html.SELECT && item.value) { + input._init = function(target) { target.value = item.value } + } if (item.type == html.TEXT) { input.onkeydown = item.onkeydown||function(event) { can.onkeymap.input(event, can), can.onkeymap.selectOutput(event, can), event.key == lang.ENTER && can.onkeymap.prevent(event) } } @@ -330,19 +333,22 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.onappend._plugin(can, value, meta, cbs, target, field) }) }); return res }, - figure: function(can, meta, target, cb) { if (meta.action == ice.AUTO || can.base.In(meta.type, html.BUTTON, html.SELECT)) { return } + figure: function(can, meta, target, cb) { if (meta.action == ice.AUTO || can.base.isIn(meta.type, html.BUTTON)) { return } var input = meta.action||mdb.KEY; can.require([chat.PLUGIN_INPUT+input+nfs._JS], function(can) { function _cb(sub, value, old) { if (value == old) { return } can.base.isFunc(cb)? cb(sub, value, old): target.value = value||"", can.onmotion.focus(can, target) } - can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]; target[key] = function(event) { - can.core.CallFunc(on, {event: event, can: can, meta: meta, target: target, last: last||function(){}, sub: target._can, cb: _cb, cbs: function(cb) { + can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]||function(){}; target[key] = function(event) { + target._can && can.onlayout.figure(event, can, target._can._target) + can.core.CallFunc(on, {event: event, can: can, meta: meta, cb: _cb, target: target, sub: target._can, last: last, cbs: function(cb) { if (target._can) { return can.onmotion.toggle(can, target._can._target, true), can.base.isFunc(cb) && cb(target._can, _cb) } can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT, mode: meta.mode}, [chat.PLUGIN_INPUT+input+nfs._JS], function(sub) { sub.Conf(meta) 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 } (meta.run||can.run)(sub.request(event, can.Option()), cmds, cb, true) - }, target._can = sub, sub.close = function() { can.page.Remove(can, sub._target), delete(target._can) } + }, target._can = sub, can.base.Copy(sub, can.onfigure[input], true) + sub.close = function() { can.page.Remove(can, sub._target), delete(target._can) } + sub.hidden = function() { return sub._target.style.display == html.NONE } can.onlayout.figure({target: target}, can, sub._target), can.page.style(sub, sub._target, meta.style) - can.page.style(can, sub._outupt, html.MAX_HEIGHT, can.page.height()-sub._target.offsetTop-2*html.ACTION_HEIGHT) + can.page.style(can, sub._output, html.MAX_HEIGHT, can.base.Max(can.page.height()-sub._target.offsetTop-2*html.ACTION_HEIGHT, can.page.height()/2)) can.base.isFunc(cb) && cb(sub, _cb), can.base.isFunc(meta._init) && meta._init(sub, sub._target) }, document.body) }}) @@ -509,7 +515,6 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { document.body.onclick = function(event) { if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } if (can.page.tagis(event.target, html.A) && can.user.isWebview) { return event.shiftKey? window.outopen(event.target.href): can.user.open(event.target.href) } - // can.page.Select(can, document.body, can.page.Keys("div.carte.float", "fieldset.input.key.float"), function(target) { can.page.Remove(can, target) }) can.page.Select(can, document.body, can.page.Keys("div.carte.float"), function(target) { can.page.Remove(can, target) }) } can.onkeymap._build(can), document.body.onkeydown = function(event) { @@ -636,4 +641,3 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { }, prevent: function(event) { event && (event.stopPropagation(), event.preventDefault()); return true }, }) - diff --git a/lib/base.js b/lib/base.js index 5024f677..2cf6d3dd 100644 --- a/lib/base.js +++ b/lib/base.js @@ -8,12 +8,12 @@ Volcanos("base", { if (val.length > 0) { return val } for (var k in val) { return val } return def } catch (e) { return val&&val.split&&val.split(ice.FS) || def } }, - Copy: function(to, from, skip) { if (!from) { return to } - if (arguments.length == 2 || typeof skip == lang.BOOLEAN) { + Copy: function(to, from, hold) { if (!from) { return to } + if (arguments.length == 2 || typeof hold == lang.BOOLEAN) { for (var k in from) { - if (skip && to[k] != undefined) { continue } - if (from[k] === "") { delete(to[k]); continue } - to[k] = from[k] + if (k == undefined) { continue } + if (hold && to.hasOwnProperty(k) && to[k] != undefined) { continue } + if (from[k] === "") { delete(to[k]) } else { to[k] = from[k] } } return to } for (var i = 2; i < arguments.length; i++) { var k = arguments[i]; to[k] = from[k] } return to }, @@ -95,7 +95,7 @@ Volcanos("base", { } return res }, AddUniq: function(list, value) { list = list||[]; return list.indexOf(value) == -1 && list.push(value), list }, - In: function(item) { var args = arguments; for (var i = 1; i < args; i++) { + isIn: function(item) { var args = arguments; for (var i = 1; i < args; i++) { if (typeof args[i] == lang.OBJECT && args[i].length > 0 && args[i].indexOf(item) > -1) { return true } if (item == args[i]) { return true } } }, diff --git a/lib/user.js b/lib/user.js index b911ce34..b97153c6 100644 --- a/lib/user.js +++ b/lib/user.js @@ -84,7 +84,7 @@ Volcanos("user", {info: {}, agent: { can.user.copy(event, can, meta.title) }}, {view: "duration", title: "点击关闭", onclick: function() { action.close() }}, can.base.isObject(meta.content)? meta.content: {text: [meta.content||"", html.DIV, nfs.CONTENT]}, - html.ACTION, can.base.isUndefined(meta.progress) && {view: "progress", style: {width: width}, list: [ + html.ACTION, !can.base.isUndefined(meta.progress) && {view: "progress", style: {width: width}, list: [ {view: "current", style: {width: (meta.progress||0)/100*width}}, ]}, ] }]); can.onengine.signal(can, chat.ONTOAST, can.request({}, {time: can.misc._time(), title: meta.title, content: meta.content, fileline: can.misc.FileLine(-3)})) @@ -95,7 +95,8 @@ Volcanos("user", {info: {}, agent: { timer: can.core.Timer({interval: 100, length: (parseInt(meta.duration||1000))/100}, function(event, interval, index) { if (index > 30) { ui.duration.innerHTML = parseInt(index/10)+ice.PT+(index%10)+"s..." } }, function() { action.close() }), _target: ui._target, ui: ui, - }); can.onmotion.story.auto(can, ui._target); return action + }); can.onmotion.story.auto(can, ui._target) + return can._toast && (can._toast.close(), delete(can._toast)), can._toast = action }, share: function(can, msg, cmd) { can.run(msg, cmd||[ctx.ACTION, chat.SHARE], function(msg) { diff --git a/page/index.css b/page/index.css index a3bf75e5..0f46d1e7 100644 --- a/page/index.css +++ b/page/index.css @@ -176,7 +176,7 @@ div.output.card div.item.stop { color:gray; } /* white */ body.white { background-color:rgba(5,34,56,0.75); color:white; } -body.white select { background-color:yellowgreen; color:white; } +body.white select { background-color:yellowgreen; color:white; opacity:1; } body.white textarea { background-color:white; } body.white input[type=password] { background-color:white; } body.white input[type=text] { background-color:white; } diff --git a/plugin/input.js b/plugin/input.js index 2f826c35..79b7ba67 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -1,12 +1,12 @@ Volcanos(chat.ONACTION, { _init: function(can, meta, target) { meta.type == html.BUTTON && meta.action == ice.AUTO && !can.sup._delay_init && target.click() }, - run: function(event, can) { can.run(can.request(event, {_toast: ice.PROCESS})) }, - list: function(event, can) { can.sup.Conf("mode") != chat.SIMPLE && can.run(event) }, + run: function(event, can) { can.run(event) }, + list: function(event, can) { can.sup.isSimpleMode() || can.run(event) }, back: function(event, can) { can.sup.onimport._back(can.sup) }, refresh: function(event, can) { can.run(event) }, - onclick: function(event, can) { can.Conf(mdb.TYPE) == html.BUTTON && can.run(can.request(event, {_toast: ice.PROCESS}), [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())) }, - onchange: function(event, can) { can.Conf(mdb.TYPE) == html.SELECT && can.run(can.request(event, {_toast: ice.PROCESS})) }, + onclick: function(event, can) { can.Conf(mdb.TYPE) == html.BUTTON && can.run(event, [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())) }, + onchange: function(event, can) { can.Conf(mdb.TYPE) == html.SELECT && can.run(event) }, onkeydown: function(event, can) { can.onkeymap.input(event, can, event.target) if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } } if (event.key == lang.ENTER) { return can.run(event), can.onmotion.focus(can, event.target), can.onkeymap.prevent(event) } diff --git a/plugin/input/date.js b/plugin/input/date.js index 293d8cbe..90af6169 100644 --- a/plugin/input/date.js +++ b/plugin/input/date.js @@ -1,60 +1,61 @@ -Volcanos(chat.ONFIGURE, {help: "控件详情", date: {onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) { - function set(now) { cbs(can, can.user.time(can, now), target.value) } +Volcanos(chat.ONFIGURE, {date: { + onclick: function(event, can, meta, target, cbs) { cbs(function(can, cb) { + function set(now) { cb(can, can.user.time(can, now), target.value) } - // 添加控件 - var now = target.value? new Date(target.value): new Date() - can._trans = kit.Dict("today", "今天", mdb.NEXT, "下一月", mdb.PREV, "上一月") - can.onmotion.clear(can, can._action), can.onappend._action(can, [cli.CLOSE, - ["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)), - "today", "", mdb.PREV, ["year"].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)), - ["month"].concat(can.core.List(1, 13)), mdb.NEXT, - ], can._action, {close: function(event) { can.close() }, - "hour": function(event, can, key, value) { now.setHours(parseInt(value)||0), show(now) }, - "minute": function(event, can, key, value) { now.setMinutes(parseInt(value)||0), show(now) }, - "second": function(event, can, key, value) { now.setSeconds(parseInt(value)||0), show(now) }, - "today": function(event) { now = new Date(), set(show(now)) }, + var now = target.value? new Date(target.value): new Date() + can.user.trans(can, kit.Dict("today", "今天", mdb.NEXT, "下一月", mdb.PREV, "上一月")) + can.onmotion.clear(can, can._action), can.onappend._action(can, [cli.CLOSE, + ["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)), + "today", "", mdb.PREV, ["year"].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)), + ["month"].concat(can.core.List(1, 13)), mdb.NEXT, + ], can._action, {close: function(event) { can.close() }, + "hour": function(event, can, key, value) { now.setHours(parseInt(value)||0), show(now) }, + "minute": function(event, can, key, value) { now.setMinutes(parseInt(value)||0), show(now) }, + "second": function(event, can, key, value) { now.setSeconds(parseInt(value)||0), show(now) }, + "today": function(event) { now = new Date(), set(show(now)) }, - "prev": function(event) { now.setMonth(now.getMonth()-1), show(now) }, - "year": function(event, can, key, value) { now.setFullYear(parseInt(value)), show(now) }, - "month": function(event, can, key, value) { now.setMonth(parseInt(value)-1), show(now) }, - "next": function(event) { now.setMonth(now.getMonth()+1), show(now) }, + "prev": function(event) { now.setMonth(now.getMonth()-1), set(show(now)) }, + "year": function(event, can, key, value) { now.setFullYear(parseInt(value)), show(now) }, + "month": function(event, can, key, value) { now.setMonth(parseInt(value)-1), show(now) }, + "next": function(event) { now.setMonth(now.getMonth()+1), set(show(now)) }, - "随机": function(event) { now.setDate((Math.random() * 100 - 50) + now.getDate()), show(now) }, - "前一年": function(event) { now.setFullYear(now.getFullYear()-1), show(now) }, - "后一年": function(event) { now.setFullYear(now.getFullYear()+1), show(now) }, - }) + "随机": function(event) { now.setDate((Math.random() * 100 - 50) + now.getDate()), show(now) }, + "前一年": function(event) { now.setFullYear(now.getFullYear()-1), show(now) }, + "后一年": function(event) { now.setFullYear(now.getFullYear()+1), show(now) }, + }) - can.onmotion.clear(can, can._status) - can._table = can.page.Appends(can, can._output, [{view: [chat.CONTENT, html.TABLE]}]).first - var today = new Date(); function show(now) { - // 设置控件 - can.Action("year", now.getFullYear()) - can.Action("month", now.getMonth()+1) - can.Action("hour", now.getHours()) - can.Action("minute", parseInt(now.getMinutes()/5)*5) - can.Action("second", parseInt(now.getSeconds()/5)*5) + can._table = can.page.Appends(can, can._output, [{view: [chat.CONTENT, html.TABLE]}]).first + var today = new Date(); function show(now) { + can.Action("year", now.getFullYear()) + can.Action("month", now.getMonth()+1) + can.Action("hour", now.getHours()) + can.Action("minute", parseInt(now.getMinutes()/5)*5) + can.Action("second", parseInt(now.getSeconds()/5)*5) - // 设置组件 - can.page.Appends(can, can._table, [{th: ["日", "一", "二", "三", "四", "五", "六"]}]) - var tr; function add(day, type) { if (day.getDay() == 0) { tr = can.page.Append(can, can._table, [{type: html.TR}]).last } - can.page.Append(can, tr, [{text: [day.getDate(), html.TD, can.base.Time(today, "%y-%m-%d") == can.base.Time(day, "%y-%m-%d")? html.SELECT: type], - dataset: {date: day.getTime()}, onclick: function(event) { - set(now = new Date(parseInt(event.target.dataset.date))) - }, - }]) - } + can.page.Appends(can, can._table, [{th: ["日", "一", "二", "三", "四", "五", "六"]}]) + var tr; function add(day, type) { if (day.getDay() == 0) { tr = can.page.Append(can, can._table, [{type: html.TR}]).last } + can.page.Append(can, tr, [{text: [day.getDate(), html.TD, can.base.Time(today, "%y-%m-%d") == can.base.Time(day, "%y-%m-%d")? html.SELECT: type], + dataset: {date: day.getTime()}, onclick: function(event) { set(now = new Date(parseInt(event.target.dataset.date))) }, + }]) + } - // 时间区间 - var one = new Date(now); one.setDate(1) - var end = new Date(now); end.setMonth(now.getMonth()+1), end.setDate(1) - var head = new Date(one); head.setDate(one.getDate()-one.getDay()) - var tail = new Date(end); tail.setDate(end.getDate()+7-end.getDay()) + var one = new Date(now); one.setDate(1) + var end = new Date(now); end.setMonth(now.getMonth()+1), end.setDate(1) + var head = new Date(one); head.setDate(one.getDate()-one.getDay()) + var tail = new Date(end); tail.setDate(end.getDate()+7-end.getDay()) - // 时间序列 - for (var day = new Date(head); day < one; day.setDate(day.getDate()+1)) { add(day, mdb.PREV) } - for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) { add(day, mdb.MAIN) } - for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) { add(day, mdb.NEXT) } - - return now - } show(now), can.onlayout.figure(event, can) -})}} }) + for (var day = new Date(head); day < one; day.setDate(day.getDate()+1)) { add(day, mdb.PREV) } + for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) { add(day, mdb.MAIN) } + for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) { add(day, mdb.NEXT) } + return now + } show(now) + can._show = function(_now) { set(now = show(_now)) } + can._now = function() { return now } + })}, + onkeydown: function(event, can, meta, cb, target, sub, last) { if (sub.hidden()) { return } switch (event.key) { + case "n": can.page.Select(can, sub._action, "input[name=next]", function(target) { target.click() }); break + case "p": can.page.Select(can, sub._action, "input[name=prev]", function(target) { target.click() }); break + case "j": sub._show(can.base.TimeAdd(sub._now(), 1)); break + case "k": sub._show(can.base.TimeAdd(sub._now(), -1)); break + } }, +} }) diff --git a/plugin/input/key.js b/plugin/input/key.js index e20d3282..46ea0604 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -1,24 +1,34 @@ Volcanos(chat.ONFIGURE, {key: { - _show: function(can, msg, cb, target, name) { if (!can.onmotion.toggle(can, can._target, msg.Length() != 0)) { return } + _show: function(can, msg, cb, target, name) { if (msg.Length() == 0 || msg.Length() == 1 && msg.Append(name) == target.value) { return can.onmotion.hidden(can) } can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, line) { value = line[key] return {text: [value, html.TD], style: msg.append && msg.append.length == 1? kit.Dict(html.MIN_WIDTH, target.offsetWidth-16): {}, onclick: function(event) { - cb(can, value, target.value), msg.Option(ice.MSG_PROCESS) == ice.PROCESS_AGAIN && can.onmotion.delay(can, function() { can.onfigure.key._load(event, can, cb, target, name, value) }) + cb(can, value, target.value), msg.Option(ice.MSG_PROCESS) == ice.PROCESS_AGAIN && can.onmotion.delay(can, function() { can._load(event, can, cb, target, name, value) }) + can._delay_hidden = true }} }), can.onappend._status(can, [mdb.TOTAL, mdb.INDEX]), can.Status(mdb.TOTAL, msg.Length()) }, - _load: function(event, can, cb, target, name, value) { can.runAction(event, mdb.INPUTS, [name, value||target.value], function(msg) { + _load: function(event, can, cb, target, name, value) { can.runAction(event, mdb.INPUTS, [name, value||""], function(msg) { name == ctx.INDEX && can.core.Item(can.onengine.plugin.meta, function(key) { msg.Push(ctx.INDEX, can.core.Keys(ice.CAN, key)) }) - can.onfigure.key._show(can, msg, cb, target, name) + can._show(can, msg, cb, target, name) }) }, - onfocus: function(event, can, meta, target, cbs) { can.onmotion.delay(can, function() { cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return } - meta.msg && meta.msg.Length() > 0? can.onfigure.key._show(sub, meta.msg, cb, target, meta.name): can.onfigure.key._load(event, sub, cb, target, meta.name) - }) }, 30) }, - onblur: function(event, can, sub) { can.onmotion.delay(can, function() { can.onmotion.hidden(can, sub._target) }, 10) }, - onkeydown: function(event, can, meta, cb, target, sub, last) { switch (event.key) { + onfocus: 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) + }) }, + 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) + }) + }, + onblur: function(event, can, sub) { + can.onmotion.delay(can, function() { sub._delay_hidden || can.onmotion.hidden(can, sub._target), sub._delay_hidden = false }, 300) + }, + onkeydown: function(event, can, meta, cb, target, sub, last) { if (sub.hidden()) { return } switch (event.key) { case "n": case "p": - case lang.TAB: can.onkeymap.selectInputs(event, sub, function() { can.onfigure.key._load(event, sub, cb, target, meta.name) }, target); break + case lang.TAB: can.onkeymap.selectInputs(event, sub, function() { sub._load(event, sub, cb, target, meta.name) }, target); break case lang.ENTER: if (meta._enter && (!can.page.tagis(event.target, html.TEXTAREA) || event.ctrlKey) && meta._enter(event)) { break } - default: can.onkeymap.selectCtrlN(event, can, sub._output, "tr:not(.hidden) td:first-child", function(td) { return cb(sub, td.innerText, target.value), td }) || last(event) + default: can.onkeymap.selectCtrlN(event, can, sub._output, "tr:not(.hidden)>td:first-child", function(td) { return cb(sub, td.innerText, target.value), td }) || last(event) + target.value == "" && sub._load(event, sub, cb, target, meta.name) } }, }})