diff --git a/frame.js b/frame.js index af7ce2cb..663917ab 100644 --- a/frame.js +++ b/frame.js @@ -464,7 +464,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { sub.onmotion.float(sub), sub.onaction.close = function() { can.page.Remove(can, sub._target) }, cb && cb(sub) }, can._root._target) }, figure: function(can, meta, target, cb) { if (meta.type == html.SELECT || meta.type == html.BUTTON) { return } - var input = meta.action||mdb.KEY, path = chat.PLUGIN_INPUT+input+nfs._JS; can.require([path], function(can) { + var input = meta.action||(meta.name == mdb.ICON? mdb.ICON: mdb.KEY), path = chat.PLUGIN_INPUT+input+nfs._JS; can.require([path], function(can) { function _cb(sub, value, old) { if (value == old) { return } target.value = value, can.base.isFunc(cb) && cb(sub, value, old) } target.onkeydown = function() { if (event.key == code.ESCAPE && target._can) { return target._can.close(), target.blur() } else if (event.key == code.ENTER) { can.base.isFunc(cb) && cb(event, target.value) } } can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]||function() { }; target[key] = function(event) { can.misc.Event(event, can, function(msg) { diff --git a/index.css b/index.css index dfeb96a2..d7bb8978 100644 --- a/index.css +++ b/index.css @@ -124,6 +124,10 @@ body>div.carte div.item span.icon.next { float:right; line-height:22px; height:2 body>div.carte.select.float>div.item { text-align:center; } body>div.input { padding:20px; } body>div.input td { padding:10px; } +body>div.input td:nth-child(2) { padding:10px 0;} +body>div.input tr.icon td:last-child { position:relative; } +body>div.input tr.icon td:last-child i:first-child { font-size:22px; position:absolute; left:15px; top:14px; } +body>div.input tr.icon td:last-child input { padding-left:30px; } body>div.input td span.icon { margin-left:-20px; visibility:hidden; } body>div.input td:hover span.icon { visibility:visible; } body>div.input select { width:230px; } @@ -424,6 +428,7 @@ body.print select, body.print input[type=text], body.print textarea { box-shadow body.print fieldset.draw div.output { background-color:lightgray; } body.print fieldset.draw div.output div.content svg { background-color:lightgray; } /* misc */ +fieldset.input.icon div.output td { font-size:28px; padding:5px; } fieldset.Search div.story[data-type=spark] { margin:0; } fieldset.Search>div.output>div.profile { border-left:none; width:unset; } fieldset.Action>div.output>fieldset.plugin:not(.output):not(.float):not(.full):not(.cmd) { padding:10px; margin:10px; box-shadow:var(--box-shadow); } diff --git a/lib/user.js b/lib/user.js index 9b0e83c5..55fe52c6 100644 --- a/lib/user.js +++ b/lib/user.js @@ -168,7 +168,7 @@ Volcanos("user", { 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() } } - return {type: html.TR, list: [ + return {type: html.TR, className: item.name, list: [ {type: html.TD, list: [{text: [can.user.trans(can, item.name||"", item._trans), html.LABEL]}]}, {type: html.TD, list: [{text: item.need == "must"? "*": "", style: {color: cli.RED}}]}, {type: html.TD, list: [can.page.input(can, item), item.type == html.TEXT && {icon: "delete", onclick: function(event) { event.target.previousSibling.value = "" }}]}, ]} diff --git a/panel/river.js b/panel/river.js index 6d670fd4..f097ad92 100644 --- a/panel/river.js +++ b/panel/river.js @@ -30,7 +30,7 @@ Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH], _init: func create: function(event, can) { can.user.input(can.request(event, {title: "创建群组"}), can, [ {name: mdb.TYPE, values: [aaa.TECH, aaa.ROOT, aaa.TECH, aaa.VOID], _trans: "类型"}, {name: mdb.NAME, value: "hi", _trans: "群名", need: "must"}, - {name: mdb.ICON, value: "", _trans: "图标"}, + {name: mdb.ICON, value: "", _trans: "图标", action: "icon"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}, ], function(args) { can.runAction(event, mdb.CREATE, args, function(msg) { can.misc.Search(can, {river: msg.Result()}) }) diff --git a/panel/search.css b/panel/search.css index 71a06984..77eb795d 100644 --- a/panel/search.css +++ b/panel/search.css @@ -1,3 +1,3 @@ -fieldset.Search { padding:10px; position:fixed; left:230px; top:48px; } +fieldset.Search { padding:10px; box-shadow:unset; position:fixed; left:230px; top:48px; } fieldset.Search>div.output>div.profile { max-width:unset; } fieldset.Search>div.output table.content { width:100%; } diff --git a/plugin/input/icon.js b/plugin/input/icon.js new file mode 100644 index 00000000..2a341056 --- /dev/null +++ b/plugin/input/icon.js @@ -0,0 +1,24 @@ +Volcanos(chat.ONFIGURE, {icon: { + _load: function(event, can, cb, target, name, value) { + can.runAction(event, ctx.RUN, ["web.chat.icons"], function(msg) { + can._show(can, msg, cb, target, name) + }) + }, + _show: function(can, msg, cb, target, name) { can.onmotion.clear(can) + var table = can.page.Append(can, can._output, [{type: html.TABLE}])._target, tr + msg.Table(function(value, index) { if (index%10 == 0) { tr = can.page.Append(can, table, [{type: html.TR}])._target } + can.page.Append(can, tr, [{type: html.TD, inner: value.icon, title: value.name, onclick: function() { + can.close(), can.base.isFunc(cb) && cb(can, value.name, target.value) + target._icon.className = value.name + }}]) + }), can.onappend._status(can, [mdb.TOTAL]), can.Status(mdb.TOTAL, msg.Length()) + can.page.style(can, can._output, html.MAX_HEIGHT, can.page.height()/2, html.MIN_WIDTH, target.offsetWidth, html.MAX_WIDTH, can.page.width()/2) + }, + onclick: function(event, can, meta, target, cbs) { can.onmotion.focus(can, target) }, + onfocus: function(event, can, meta, target, cbs) { cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return } + target._icon = target._icon || can.page.insertBefore(can, [{type: "i"}], target) + 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) }, +}}) +