From b50208ed8b7751eba936d02c40f24a5a0aa47751 Mon Sep 17 00:00:00 2001 From: harveyshao Date: Fri, 28 Oct 2022 22:42:47 +0800 Subject: [PATCH] opt input --- frame.js | 16 +++---- lib/base.js | 4 +- lib/page.js | 9 ++-- lib/user.js | 11 +++-- page/index.css | 5 ++- panel/header.js | 2 +- plugin/input/date.js | 75 +++++++++++++++---------------- plugin/input/img.js | 18 ++++---- plugin/input/key.js | 17 +++---- plugin/input/keyboard.css | 88 ++++++++++-------------------------- plugin/input/keyboard.js | 91 ++++++++++---------------------------- plugin/input/province.js | 17 +++---- plugin/local/mall/goods.js | 14 +++--- 13 files changed, 142 insertions(+), 225 deletions(-) diff --git a/frame.js b/frame.js index ffb82d16..2aaecce5 100644 --- a/frame.js +++ b/frame.js @@ -179,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, name: item, value: can.user.trans(can, item), onclick: function(event) { + can.base.isString(item)? /* 按键 */ {type: html.BUTTON, name: item, value: can.user.trans(can, item, meta._trans), 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())) @@ -335,7 +335,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }, 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) } + function _cb(sub, value, old) { if (value == old) { return } can.base.isFunc(cb)? cb(sub, value, old): target.value = value||"", can.onmotion.delay(can, function() { can.onmotion.focus(can, target) }) } 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) { @@ -345,14 +345,14 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { 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, 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._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) + sub.close = function() { can.page.Remove(can, sub._target), delete(target._can) } + can.onmotion.delay(can, function() { can.onlayout.figure({target: target}, can, sub._target), can.page.style(sub, sub._target, meta.style) + 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) }}) - } }), can.onfigure[input]._init && can.onfigure[input]._init(can, target, _cb) + } }), can.onfigure[input]._init && can.onfigure[input]._init(can, meta, target, _cb) }) }, }) @@ -471,7 +471,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { }) }, delay: function(can, cb, interval) { can.core.Timer(interval||30, cb) }, - clear: function(can, target) { return can.page.Modify(can, target||can._output, ""), true }, + clear: function(can, target) { return can.page.Modify(can, target||can._output, ""), target }, cache: function(can, next) { var list = can.base.Obj(can.core.List(arguments).slice(2), [can._output]) can.core.List(list, function(target) { target && target._cache_key && can.page.Cache(target._cache_key, target, target.scrollTop+1) }) var key = next(can._cache_data = can._cache_data||{}, arguments[2]._cache_key); if (!key) { return } diff --git a/lib/base.js b/lib/base.js index 2cf6d3dd..28ebaaf9 100644 --- a/lib/base.js +++ b/lib/base.js @@ -95,7 +95,7 @@ Volcanos("base", { } return res }, AddUniq: function(list, value) { list = list||[]; return list.indexOf(value) == -1 && list.push(value), list }, - isIn: function(item) { var args = arguments; for (var i = 1; i < args; i++) { + isIn: function(item) { var args = arguments; for (var i = 1; i < args.length; i++) { if (typeof args[i] == lang.OBJECT && args[i].length > 0 && args[i].indexOf(item) > -1) { return true } if (item == args[i]) { return true } } }, @@ -146,7 +146,7 @@ Volcanos("base", { }, beginWith: function(str, begin) { return typeof str == lang.STRING && str.trim().indexOf(begin) == 0 }, - endWith: function(str, end) { return str.lastIndexOf(end) + end.length == str.length }, + endWith: function(str, end) { return typeof str == lang.STRING && str.lastIndexOf(end) + end.length == str.length }, trim: function(args) { if (this.isString(args)) { return args.trim() } if (this.isArray(args)) { for (var i = args.length-1; i >= 0; i--) { if (!args[i]) { args.pop() } else { break } } } return args diff --git a/lib/page.js b/lib/page.js index faf10041..ddfdb444 100644 --- a/lib/page.js +++ b/lib/page.js @@ -13,6 +13,7 @@ Volcanos("page", {ClassList: { can.page.Select(can, target, html.IFRAME, function(item) { can.page.SelectAll(can, item.contentWindow.document.body, key, cb, interval, cbs) }) return can.core.List(target && target.querySelectorAll(key), cb, interval, cbs) }, + SelectInput: function(can, target, name, cb) { return can.page.Select(can, target, "input[name="+name+"]", cb) }, SelectArgs: function(can, option, key, cb) { if (can.base.isUndefined(key)) { var value = {}; can.page.SelectArgs(can, option, "", function(item) { item.name && item.value && (value[item.name] = item.value) }); return [value] } if (can.base.isObject(key)) { return can.core.Item(key, function(key, value) { can.page.SelectArgs(can, option, key, value) }), [key] } @@ -29,10 +30,10 @@ Volcanos("page", {ClassList: { can.base.isString(value)? (target.innerHTML = value): can.core.Item(value, function(key, val) { key == "className" && can.base.isArray(val) && (val = val.join(ice.SP)) !can.base.isObject(val)? (target[key] = val): can.core.Item(val, function(k, v) { - if (["height", "max-height", "min-height", "width", "max-width", "min-width"].indexOf(k) > -1 && parseInt(v) < 0) { return target[key] && (target[key][k] = "") } - if (["height", "max-height", "min-height", "width", "max-width", "min-width", - "left", "right", "top", "bottom", "margin-left", "margin-top", "padding", "font-size", - ].indexOf(k) > -1 && v && (v&&v.indexOf&&v.indexOf("px") == -1 || can.base.isNumber(v))) { v += "px" } + if (can.base.isIn(k, "height", "width", "min-height", "max-height", "min-width", "max-width") && parseInt(v) < 0) { return target[key] && (target[key][k] = "") } + if (can.base.isIn(k, "height", "width", "min-height", "max-height", "min-width", "max-width", + "left", "top", "right", "bottom", "margin-left", "margin-top", "margin", "padding", "font-size", + ) && v && (can.base.isNumber(v) || !can.base.endWidth(v, "px"))) { v += "px" } target[key] && (target[key][k] = v) }) }); return target diff --git a/lib/user.js b/lib/user.js index b97153c6..8d5860b8 100644 --- a/lib/user.js +++ b/lib/user.js @@ -173,7 +173,7 @@ Volcanos("user", {info: {}, agent: { can.core.Next(list, cb, cbs||function() { can.user.toastSuccess(can) }) }) }, - upload: function(event, can, cb) { var begin = new Date() + upload: function(event, can, cb, silent) { var begin = new Date() var ui = can.page.Append(can, document.body, [{view: [[html.UPLOAD, chat.FLOAT]], list: [ html.ACTION, {view: html.OUTPUT, list: ["progress"]}, {view: html.STATUS, list: [ice.SHOW, cli.COST, nfs.SIZE]}, ]}]); can.onlayout.figure(event, can, ui._target) @@ -182,15 +182,18 @@ Volcanos("user", {info: {}, agent: { begin: function(event) { begin = new Date() var upload = can.page.Select(can, ui.action, html.INPUT_FILE)[0]; if (upload.files.length == 0) { return upload.focus() } var msg = can.request(event, can.Option(), {_handle: ice.TRUE}); msg._upload = upload.files[0], msg._progress = action.show - can.runAction(event, html.UPLOAD, [], cb||function(msg) { can.user.toastSuccess(can), can.Update(), action.close() }) + can.runAction(event, html.UPLOAD, [], function(msg) { action.close() + if (can.base.isFunc(cb)) { return cb(msg) } + can.user.toastSuccess(can), can.Update() + }) }, show: function (event, value, total, loaded) { ui.cost.innerHTML = can.base.Duration(new Date() - begin) ui.show.innerHTML = value+"%", value == 0 && action.begin(event) ui.size.innerHTML = can.base.Size(loaded)+ice.PS+can.base.Size(total) can.page.styleWidth(can, ui.progress, value*(ui.output.offsetWidth-2)/100) - }, - }); can.page.Select(can, ui.action, html.INPUT_FILE)[0].click(); return action + }, _target: ui._target, + }); can.page.Select(can, ui.action, html.INPUT_FILE)[0].click(), silent && can.onmotion.hidden(can, ui._target); return action }, download: function(can, path, name, ext) { var a = can.page.Append(can, document.body, [{type: html.A, href: path, download: can.core.Keys(name, ext)||path.split(ice.PS).pop()}]).first diff --git a/page/index.css b/page/index.css index 0f46d1e7..040fc0c7 100644 --- a/page/index.css +++ b/page/index.css @@ -2,7 +2,7 @@ body, fieldset, table, tr, th, td { padding:0; border:0; margin:0; } body { background-color:black; color:cyan; font-size:16px; overflow:hidden; } legend { background-color:cadetblue; color:white; padding:0 20px; margin-right:2px; float:left; } select { background-color:black; color:cyan; padding:0 10px; margin:0 2px; border:0; } -textarea { background-color:cyan; width:400px; padding:5px; border:0; } +textarea { background-color:cyan; width:400px; padding:5px; border:0; margin:2px; } input[type=password] { background-color:cyan; color:black; padding:0 5px; border:0; width:90px; } input[type=text] { background-color:cyan; color:black; padding:0 5px; margin:0 2px; border:0; width:90px; } input[name=cmd] { background-color:black; color:white; width:320px; } @@ -85,6 +85,9 @@ fieldset.input.date div.output td.prev { color:gray; } fieldset.input.date div.output td.next { color:gray; } fieldset.input.date div.output td { padding:2px 10px; } fieldset.input.date table { text-align:center; width:280px; } +fieldset.input.date select { width:63px; } +fieldset.input.date select[name=month] { width:70px; } +fieldset.input.date select[name=year] { width:88px; } body>div.toast div.action>div.item.space { height:unset; } body>div.float { background-color:#0e3369b3; color:white; padding:5px; } diff --git a/panel/header.js b/panel/header.js index 68ac2272..bc3925ec 100644 --- a/panel/header.js +++ b/panel/header.js @@ -53,7 +53,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar _time: function(can, target) { can.core.Timer({interval: 500}, function() { can.onimport.time(can, target) }) - can.onappend.figure(can, {action: "date", style: {"min-width": 306}}, target), target.onmouseenter = target.click + can.onappend.figure(can, {action: "date"}, target), target.onmouseenter = target.click }, time: function(can, target) { can.onimport.topic(can), target.innerHTML = can.user.time(can, null, "%w %H:%M:%S") diff --git a/plugin/input/date.js b/plugin/input/date.js index 90af6169..f2067f65 100644 --- a/plugin/input/date.js +++ b/plugin/input/date.js @@ -1,41 +1,36 @@ 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) } + const TODAY = "today", YEAR = "year", MONTH = "month", HOUR = "hour", MINUTE = "minute", SECOND = "second" + var today = new Date(), now = can.base.Date(target.value); function _cb(_now) { cb(can, can.user.time(can, now = _now), target.value) } + 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.onmotion.clear(can, can._action), kit.Dict(cli.CLOSE, function() { can.close() }, + HOUR, function(event, can, button, value) { now.setHours(parseInt(value)||0), show(now) }, + MINUTE, function(event, can, button, value) { now.setMinutes(parseInt(value)||0), show(now) }, + SECOND, function(event, can, button, value) { now.setSeconds(parseInt(value)||0), show(now) }, + TODAY, function() { _cb(show(today)) }, - 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)) }, + mdb.PREV, function() { now.setMonth(now.getMonth()-1), _cb(show(now)) }, + YEAR, function(event, can, button, value) { now.setFullYear(parseInt(value)), show(now) }, + MONTH, function(event, can, button, value) { now.setMonth(parseInt(value)-1), show(now) }, + mdb.NEXT, function() { now.setMonth(now.getMonth()+1), _cb(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) }, - }) - - 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) + "rand", function() { now.setDate((Math.random() * 100 - 50) + now.getDate()), show(now) }, + "over", function() { now.setFullYear(now.getFullYear()-1), show(now) }, + "come", function() { now.setFullYear(now.getFullYear()+1), show(now) }, + chat._TRANS, kit.Dict(TODAY, "今天", mdb.NEXT, "下一月", mdb.PREV, "上一月", "over", "去年", "come", "今年"), + )), can._table = can.page.Appends(can, can._output, [{view: [chat.CONTENT, html.TABLE]}]).first + 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.Append(can, tr, [{text: [day.getDate(), html.TD, can.base.isIn(can.base.Time(day, "%y-%m-%d"), can.base.Time(now, "%y-%m-%d"), can.base.Time(today, "%y-%m-%d"))? html.SELECT: type], + onclick: function(event) { _cb(day) }, }]) } @@ -48,14 +43,16 @@ Volcanos(chat.ONFIGURE, {date: { 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 } + } show(now), can._show = function(d) { _cb(show(new Date(now.getTime()+d*24*3600*1000))) } })}, 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 - } }, + case "n": can.page.SelectInput(can, sub._action, mdb.NEXT, function(target) { target.click() }); break + case "p": can.page.SelectInput(can, sub._action, mdb.PREV, function(target) { target.click() }); break + case "t": can.page.SelectInput(can, sub._action, "today", function(target) { target.click() }); break + case "j": sub._show(7); break + case "k": sub._show(-7); break + case "h": sub._show(-1); break + case "l": sub._show(1); break + default: return + } can.onkeymap.prevent(event) }, } }) diff --git a/plugin/input/img.js b/plugin/input/img.js index 84a51e90..293b7195 100644 --- a/plugin/input/img.js +++ b/plugin/input/img.js @@ -1,12 +1,14 @@ Volcanos(chat.ONFIGURE, {img: { - _init: function(can, target) { can.onmotion.hidden(can, target) - for (var i = 0; i < 1; i++) { - can.page.Append(can, target.parentNode, [{type: html.DIV, style: {width: 90, height: 90, "background-color": "yellow"}, onclick: function(event) { - can.user.upload(event, can, function(msg) { - target.value = can.core.Split(target.value).concat([msg.Result()]).join(ice.FS) - can.page.Append(can, event.target, [{img: can.misc.MergeURL(can, {_path: "/share/cache/"+msg.Result()}, true), width: 90, height: 90}]) - }) - }}]) + _init: function(can, meta, target) { var images = can.core.Split(target.value); can.onmotion.hidden(can, target) + var count = parseInt(meta.value||"1"), width = target.parentNode.offsetWidth-12; for (var n = 1; n < 10; n++) { if (n * n >= count) { width = width/n; break } } width -= 1 + function add(target, hash) { target._hash = hash, can.page.Appends(can, target, [{img: can.misc.MergeURL(can, {_path: web.SHARE_CACHE+hash}, true), height: width, width: width}]) } + function set() { target.value = can.page.SelectChild(can, target.parentNode, html.DIV, function(target) { return target._hash }).join(ice.FS) } + for (var i = 0; i < count; i++) { + can.page.Append(can, target.parentNode, [{type: html.DIV, style: { + "background-color": "yellow", "float": "left", "clear": i%n == 0? "both": "none", "margin": 1, height: width, width: width, + }, _init: function(target) { images[i] && add(target, images[i]), target.onclick = function(event) { + can.user.upload(event, can, function(msg) { add(target, msg.Result()), set() }, true) + } } }]) } }, }}) diff --git a/plugin/input/key.js b/plugin/input/key.js index 46ea0604..23d77976 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -2,8 +2,7 @@ Volcanos(chat.ONFIGURE, {key: { _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._load(event, can, cb, target, name, value) }) - can._delay_hidden = true + can._delay_hidden = false, 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.onappend._status(can, [mdb.TOTAL, mdb.INDEX]), can.Status(mdb.TOTAL, msg.Length()) }, @@ -11,21 +10,15 @@ Volcanos(chat.ONFIGURE, {key: { name == ctx.INDEX && can.core.Item(can.onengine.plugin.meta, function(key) { msg.Push(ctx.INDEX, can.core.Keys(ice.CAN, key)) }) can._show(can, msg, cb, target, name) }) }, - onfocus: function(event, can, meta, target, cbs) { - cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return } + onclick: function(event, can, meta, target, cbs) { can.onfigure.key.onfocus(event, can, meta, target, cbs) }, + 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) - }, + 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.ESCAPE: target.blur(); 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) diff --git a/plugin/input/keyboard.css b/plugin/input/keyboard.css index 4d0af724..7e795bed 100644 --- a/plugin/input/keyboard.css +++ b/plugin/input/keyboard.css @@ -1,70 +1,28 @@ -fieldset.keyboard div.output div.key { +fieldset.keyboard>div.output { min-width:750px; } +fieldset.keyboard>div.output>br { clear:both; } +fieldset.keyboard>div.output>div.key { font-size:24px; text-align:center; background-color:green; color:white; padding:0; margin:5px; height:40px; width:40px; float:left; + cursor:pointer; } -fieldset.keyboard div.output div.key.double { - font-size:16px; white-space:pre; -} -fieldset.keyboard div.output div.key.special { - font-size:16px; - background-color:red; -} -fieldset.keyboard div.output div.key.special.hold { - background-color:green; -} -fieldset.keyboard div.output div.key.tail { - width:70px; -} -fieldset.keyboard div.output div.key.Tab { - width:60px; -} -fieldset.keyboard div.output div.key.Ctrl { - width:70px; -} -fieldset.keyboard div.output div.key.Shift { - width:90px; -} -fieldset.keyboard div.output div.key.Win { - width:60px; -} -fieldset.keyboard div.output div.key.Alt { - width:60px; -} -fieldset.keyboard div.output div.key.Space { - width:300px; -} -fieldset.keyboard div.output div.key.Shift.tail { - width:140px; -} -fieldset.keyboard div.output div.key.Enter { - width:110px; -} -fieldset.keyboard div.output div.key.Backspace { - width:90px; -} -fieldset.keyboard div.output div.key span { - margin-top:2px; display:block; -} -fieldset.keyboard div.output div.key.special span { - margin-top:10px; display:block; -} -fieldset.keyboard div.output br { - clear:both; -} -fieldset.keyboard div.output div.key:hover { - background-color:red; -} -fieldset.keyboard div.output div.key.special:hover { - background-color:green; -} -fieldset.keyboard div.output { - min-width:750px; -} +fieldset.keyboard>div.output>div.key:hover { background-color:red; } +fieldset.keyboard>div.output>div.key.double { font-size:16px; white-space:pre; } +fieldset.keyboard>div.output>div.key.special { font-size:16px; background-color:red; } +fieldset.keyboard>div.output>div.key.special:hover { background-color:green; } +fieldset.keyboard>div.output>div.key.special.hold { background-color:green; } +fieldset.keyboard>div.output>div.key.tail { width:70px; } +fieldset.keyboard>div.output>div.key.Tab { width:60px; } +fieldset.keyboard>div.output>div.key.Ctrl { width:70px; } +fieldset.keyboard>div.output>div.key.Shift { width:90px; } +fieldset.keyboard>div.output>div.key.Win { width:60px; } +fieldset.keyboard>div.output>div.key.Alt { width:60px; } +fieldset.keyboard>div.output>div.key.Space { width:300px; } +fieldset.keyboard>div.output>div.key.Shift.tail { width:140px; } +fieldset.keyboard>div.output>div.key.Enter { width:110px; } +fieldset.keyboard>div.output>div.key.Backspace { width:90px; } +fieldset.keyboard>div.output>div.key>span { margin-top:2px; display:block; } +fieldset.keyboard>div.output>div.key.special>span { margin-top:10px; } -table.content td input { - width:50px; -} -body.mobile table.content td input { - width:80px; -} +table.content td input { width:50px; } +body.mobile table.content td input { width:80px; } diff --git a/plugin/input/keyboard.js b/plugin/input/keyboard.js index f63898ba..86c51e1f 100644 --- a/plugin/input/keyboard.js +++ b/plugin/input/keyboard.js @@ -1,77 +1,34 @@ -Volcanos(chat.ONFIGURE, {help: "控件详情", keyboard: { - onclick: function(event, can, meta, cb, target) { - can.onfigure.keyboard._make(event, can, meta, cb, target) - }, - onfocus: function(event, can, meta, cb, target, last) { - can.onfigure.keyboard._make(event, can, meta, cb, target) - }, - _make: function(event, can, meta, cb, target, last) { - var sub = target._can; if (sub && sub._cbs) { return } - cb(function(sub, cbs) { sub._cbs = cbs - can.onfigure.keyboard._show(sub, target) - }) - }, - _show: function(can, target) { can.require(["/plugin/input/keyboard.css"]) - var msg = can.request({}); can.onfigure.keyboard._normal(can, msg) - var keys = {}; function hold(value, div) { keys[value.name] = div, can.page.ClassList.add(can, div, "hold") } - msg.Table(function(value) { value.type == "head" && can.page.Append(can, can._output, "br") - var t = value.type+" "+value.name+(value.name.indexOf("\n")>-1? " double": value.name.length>1? " special": "") - var div = can.page.Append(can, can._output, [{view: t, list: [{text: [value.name]}], onclick: function(event) { - switch (value.name) { - case "Esc": - can.page.Remove(can, can._target) - delete(target._can) - break - case "Ctrl": - can._ctrl = !can._ctrl, hold(value, div) - break - case "Shift": - can._shift = !can._shift, hold(value, div) - break - case "Backspace": - if (can.base.isFunc(target)) { - target(value.name) - } else { - target.value = target.value.slice(0, -1) - } - target.focus(), can.user.toast(can, value.name) - break - case "Enter": - break - case "Esc": - break - default: - function add(value) { - if (can.base.isFunc(target)) { - target(value) - } else { - target.value += value - target.focus(), can.user.toast(can, value.name) - } - } - - can._shift = can._shift||event.shiftKey - if (value.name == "Tab") { - add("\t") - } else if (value.name == "Space") { - add(" ") - } else if (value.name.indexOf("\n") > -1) { - var ls = can.core.Split(value.name, "\n", "\n", "\n") +Volcanos(chat.ONFIGURE, {keyboard: { + onclick: function(can, cbs, target) { cbs(function(sub) { var msg = can.request(); sub._normal(can, msg), can.onfigure.keyboard._show(sub, msg, target) }) }, + _show: function(can, msg, target) { can.require(["/plugin/input/keyboard.css"]) + msg.Table(function(item) { item.type == "head" && can.page.Append(can, can._output, html.BR) + function add(value) { target.value += value, target.focus(), can.user.toast(can, value||item.name) } + function hold() { can.page.ClassList.add(can, div, "hold") } + var div = can.page.Append(can, can._output, [{view: item.type+ice.SP+item.name+(item.name.indexOf(ice.NL)>-1? " double": item.name.length>1? " special": ""), list: [{text: [item.name]}], onclick: function(event) { + switch (item.name) { + case "clear": target.value = "", target.focus(); break + case "close": can.close(); break + case "Esc": can.close(); break + case "Ctrl": can._ctrl = !can._ctrl, hold(); break + case "Shift": can._shift = !can._shift, hold(); break + case "Backspace": target.value = target.value.slice(0, -1), add(""); break + case "Enter": break + default: can._shift = can._shift||event.shiftKey + if (item.name == lang.TAB) { + add(ice.TB) + } else if (item.name == "Space") { + add(ice.SP) + } else if (item.name.indexOf(ice.NL) > -1) { var ls = can.core.Split(item.name, ice.NL, ice.NL, ice.NL) add(can._shift? ls[0]: ls[1]) - } else if (can._shift) { - add(value.name.toUpperCase()) } else { - add(value.name) - } - can.core.Item(keys, function(key, div) { - can.page.ClassList.del(can, div, "hold") - }), can._ctrl = false, can._shift = false + add(can._shift? item.name.toUpperCase(): item.name) + } can._shift = false, can._ctrl = false, can.page.Select(can, can._output, "div.hold", function(target) { can.page.ClassList.del(can, div, "hold") }) } } }]).first }) }, _normal: function(can, msg) { - can.core.List([["Esc"], + can.core.List([["Esc", "close", "clear"], ["~\n`", "!\n1", "@\n2", "#\n3", "$\n4", "%\n5", "^\n6", "&\n7", "*\n8", "(\n9", ")\n0", "_\n-", "+\n=", "Backspace"], ["Tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "{\n[", "}\n]", "|\n\\"], ["Ctrl", "a", "s", "d", "f", "g", "h", "j", "k", "l", ":\n;", "\"\n'", "Enter"], diff --git a/plugin/input/province.js b/plugin/input/province.js index f0d65475..d42b01d6 100644 --- a/plugin/input/province.js +++ b/plugin/input/province.js @@ -1,8 +1,9 @@ -Volcanos(chat.ONFIGURE, {help: "控件详情", province: {onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) { - can.require(["/require/shylinux.com/x/echarts/echarts.js", "/require/shylinux.com/x/echarts/china.js"], function() { - var china_chart = echarts.init(can.page.Append(can, can._output, [{type: html.DIV, style: {width: 600, height: 400}}]).first) - china_chart.setOption({geo: {map: 'china'}}), china_chart.on(html.CLICK, function (params) { - target.value = params.name, can.close() - }), can.Status(mdb.TOTAL, 34), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can) - }) -}) }}, }) +Volcanos(chat.ONFIGURE, {province: { + onclick: function(event, can, meta, cbs, target) { cbs(function(can, cb) { + can.require(["/require/shylinux.com/x/echarts/echarts.js", "/require/shylinux.com/x/echarts/china.js"], function() { + var chart = echarts.init(can.page.Append(can, can._output, [{type: html.DIV, style: {width: 600, height: 400}}]).first) + chart.setOption({geo: {map: 'china'}}), chart.on(html.CLICK, function(params) { target.value = params.name, can.close() }) + can.Status(mdb.TOTAL, 34) + }) + }) } +}}) diff --git a/plugin/local/mall/goods.js b/plugin/local/mall/goods.js index b987f4de..1ca47c6d 100644 --- a/plugin/local/mall/goods.js +++ b/plugin/local/mall/goods.js @@ -2,12 +2,14 @@ Volcanos(chat.ONIMPORT, { _init: function(can, msg, target) { can.page.Appends(can, target, msg.Table(function(item) { return {view: html.ITEM, list: [ - {view: wiki.IMAGE, list: [{img: can.misc.MergeCache(can, can.core.Split(item.image)[0]), width: 150}]}, + {view: wiki.IMAGE, list: [{img: can.misc.MergeCache(can, can.core.Split(item.image)[0]), width: 150, height: 150}]}, {view: wiki.CONTENT, list: [ - {view: [wiki.TITLE, html.DIV, item.name]}, - {view: [wiki.CONTENT, html.DIV, item.text]}, - {view: [mall.PRICE, html.DIV, "¥ "+(item.price||0)]}, - {view: [mall.COUNT, html.DIV, "还剩 "+(item.count||0)]}, + {view: [html.TITLE, html.DIV, item.name]}, + {view: [html.CONTENT, html.DIV, item.text]}, + {view: html.DISPLAY, list: [ + {view: [mall.PRICE, html.DIV, "¥ "+(item.price||0)], style: {"float": "left"}}, + {view: [mall.COUNT, html.DIV, " 还剩 "+(item.count||0)+" 件"], style: {"float": "left"}}, + ]}, {view: html.ACTION, inner: item.action}, ]}, ], onclick: function(event) { @@ -26,4 +28,4 @@ Volcanos(chat.ONIMPORT, { }, [""]) Volcanos(chat.ONEXPORT, { width: function(can) { if (can.ConfWidth() < 343) { return 343 } for (var i = 2; i < 10; i++) { if (can.ConfWidth() < 343*i) { return can.ConfWidth()/(i-1) } } }, -}) \ No newline at end of file +})