diff --git a/const.js b/const.js index 9f982633..69d71c76 100644 --- a/const.js +++ b/const.js @@ -55,6 +55,7 @@ var ctx = { var mdb = {FOREACH: "*", RANDOMS: "%", DICT: "dict", META: "meta", HASH: "hash", LIST: "list", ID: "id", KEY: "key", TIME: "time", ZONE: "zone", TYPE: "type", NAME: "name", TEXT: "text", DATA: "data", VIEW: "view", + STATUS: "status", LINK: "link", SCAN: "scan", HELP: "help", ICON: "icon", ICONS: "icons", INDEX: "index", VALUE: "value", EXTRA: "extra", ALIAS: "alias", EXPIRE: "expire", SHORT: "short", FIELD: "field", TOTAL: "total", COUNT: "count", LIMIT: "limit", @@ -70,6 +71,7 @@ var mdb = {FOREACH: "*", RANDOMS: "%", } var web = {CHAT: "chat", PORTAL: "portal", STUDIO: "studio", SERVICE: "service", SPIDE: "spide", SPACE: "space", ROUTE: "route", DREAM: "dream", + DOMAIN: "domain", SHARE: "share", COUNT: "count", WORKER: "worker", SERVER: "server", GATEWAY: "gateway", OPEN: "open", LINK: "link", HTTP: "http", URL: "url", SHARE_CACHE: "/share/cache/", SHARE_LOCAL: "/share/local/", @@ -94,11 +96,13 @@ var web = {CHAT: "chat", PORTAL: "portal", STUDIO: "studio", SERVICE: "service", CHAT_FAVOR: "web.chat.favor", CHAT_FLOWS: "web.chat.flows", TEAM_PLAN: "web.team.plan", + MALL_GOODS: "web.mall.goods", } var aaa = { LOGIN: "login", LOGOUT: "logout", - USER: "user", AUTH: "auth", SESS: "sess", + USER: "user", AUTH: "auth", SESS: "sess", ROLE: "role", USERNICK: "usernick", USERNAME: "username", PASSWORD: "password", USERROLE: "userrole", + USERZONE: "userzone", EMAIL: "email", AVATAR: "avatar", BACKGROUND: "background", LANGUAGE: "language", ENGLISH: "english", CHINESE: "chinese", VOID: "void", TECH: "tech", ROOT: "root", @@ -118,14 +122,21 @@ var gdb = { SIGNAL: "signal", } var tcp = { - HOST: "host", PORT: "port", CLIENT: "client", SERVER: "server", + PROTO: "proto", HOST: "host", PORT: "port", + HOSTNAME: "hostname", + SERVICE: "service", } var nfs = { DIR: "dir", CAT: "cat", DEFS: "defs", PACK: "pack", TRASH: "trash", DIR_ROOT: "dir_root", COPY: "copy", EDIT: "edit", SAVE: "save", LOAD: "load", FIND: "find", GREP: "grep", TAGS: "tags", SUBJECT: "subject", CONTENT: "content", RECENT: "recent", SCRIPT: "script", SOURCE: "source", TARGET: "target", - REPOS: "repos", MASTER: "master", MODULE: "module", PUSH: "push", PULL: "pull", + REPOS: "repos", + IMAGE: "image", + MODULE: "module", SCRIPT: "script", + VERSION: "version", + BRANCH: "branch", MASTER: "master", + PUSH: "push", PULL: "pull", PATH: "path", FILE: "file", LINE: "line", SIZE: "size", REPLACE: "replace", FROM: "from", TO: "to", SVG: "svg", HTML: "html", CSS: "css", JS: "js", SH: "sh", GO: "go", CSV: "csv", JSON: "json", SHY: "shy", @@ -226,6 +237,7 @@ var team = { var mall = { COUNT: "count", PRICE: "price", ASSET: "asset", SALARY: "salary", + GOODS: "goods", } var http = { diff --git a/frame.js b/frame.js index a529eed3..94bfa3e8 100644 --- a/frame.js +++ b/frame.js @@ -99,27 +99,29 @@ Volcanos(chat.ONDAEMON, {_init: function(can, name) { if (can.user.isLocalFile) }) Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { meta.index && (meta.name = meta.index), meta.name = can.core.Split(meta.name||"", "\t .\n").pop()||can.Conf(mdb.NAME) - field = field||can.onappend.field(can, meta.type, meta, target)._target - var legend = can.page.SelectOne(can, field, html.LEGEND) + field = field||can.onappend.field(can, meta.type, meta, target)._target, can.isCmdMode() && can.onmotion.hidden(can, field) + var legend = can.page.SelectOne(can, field, html.LEGEND); legend.innerHTML = legend.innerHTML || meta.index var option = can.page.SelectOne(can, field, html.FORM_OPTION) var action = can.page.SelectOne(can, field, html.DIV_ACTION) var output = can.page.SelectOne(can, field, html.DIV_OUTPUT) var status = can.page.SelectOne(can, field, html.DIV_STATUS) - legend.innerHTML = legend.innerHTML || meta.index - (can.base.isIn(meta.index, web.WIKI_PORTAL) || meta.style == html.OUTPUT) && can.onappend.style(can, html.OUTPUT, field) var sub = Volcanos(meta.name, {_root: can._root||can, _follow: can.core.Keys(can._follow, meta.name), _target: field, _legend: legend, _option: option, _action: action, _output: output, _status: status, _history: [], Status: function(key, value) { if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } try { can.page.Select(can, status, [[[html.SPAN, key]]], function(target) { + if (key == web.SPACE && value) { value = can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: value}), value) } if (can.base.beginWith(value, nfs.PS, ice.HTTP)) { value = can.page.Format(html.A, value) } return can.base.isUndefined(value)? (value = target.innerHTML): (target.innerHTML = value.trim? value.trim(): value+"") }); return value } catch {} }, Action: function(key, value) { key && value && can.misc.sessionStorage(can, [sub.ConfIndex(), ctx.ACTION, key], value) + value && (value = can.user.trans(sub, value, null, html.INPUT)) return can.page.SelectArgs(can, action, key, value)[0] }, - Option: function(key, value) { return can.page.SelectArgs(can, option, key, value)[0] }, + Option: function(key, value) { + value && (value = can.user.trans(sub, value, null, html.INPUT)) + return can.page.SelectArgs(can, option, key, value)[0] }, Update: function(event, cmds, cb, silent) { sub.request(event)._caller(), sub.onappend._output0(sub, sub.Conf(), event||{}, cmds||sub.Input([], !silent), cb, silent); return true }, Focus: function() { can.page.SelectOne(can, option, html.INPUT_ARGS, function(target) { target.focus() }) }, Input: function(cmds, save) { cmds = cmds && cmds.length > 0? cmds: can.page.SelectArgs(sub), cmds && cmds[0] != ctx.ACTION && (cmds = can.base.trim(cmds)) @@ -237,6 +239,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { sub.db.hash = can.isCmdMode()? can.misc.SearchHash(can): [] can.page.requireModules(can, can.Conf("modules"), function() { if (sub.Mode() != "result") { can.onmotion.clear(can, output) } can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) { + can.onmotion.toggle(can, can._target, true) if (action !== false) { can.onkeymap._build(sub) can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action) sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS)), can.user.isMobile || sub.onappend.tools(sub, msg) @@ -256,10 +259,11 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { _status: function(can, list, status) { status = status||can._status, can.onmotion.clear(can, status) var keys = {} can.core.List(can.base.Obj(list, can.core.Value(can, [chat.ONEXPORT, mdb.LIST])), function(item) { item = can.base.isString(item)? {name: item}: item + if (item.name == web.SPACE && item.value) { item.value = can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: item.value}), item.value) } if (can.base.beginWith(item.value, nfs.PS, ice.HTTP)) { item.value = can.page.Format(html.A, item.value, item.value.split("?")[0]) } if (keys[item.name]) { return can.Status(item.name, item.value) } keys[item.name] = item can.page.Append(can, status, [{view: html.ITEM, list: [ - {text: [can.page.Color(item.name), html.LABEL]}, {text: [": ", html.LABEL]}, {text: [(item.value == undefined? "": item.value.trim())+"", html.SPAN, item.name]}, + {text: [can.page.Color(can.user.trans(can, item.name, null, html.INPUT)), html.LABEL]}, {text: [": ", html.LABEL]}, {text: [(item.value == undefined? "": item.value.trim())+"", html.SPAN, item.name]}, ], onclick: function(event) { can.user.copy(event, can, item.value) }}]) }) }, @@ -274,19 +278,32 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }, input: function(can, item, value, target, style) { if ([html.BR, html.HR].indexOf(item.type) > -1) { return can.page.Append(can, target, [item]) } var icon = [], _item = can.base.Copy({className: "", type: "", name: ""}, item), input = can.page.input(can, _item, value) + if (item.type == html.SELECT) { can.core.List(input.list, function(item) { item.inner = can.user.trans(can, item.inner, null, html.INPUT) }) } if (item.type == html.BUTTON && !input.value) { input.value = can.user.trans(can, item.name) } - if (item.type == html.TEXT) { input.onfocus = input.onfocus||function(event) { can.onmotion.selectRange(event.target) } + if (item.type == html.TEXT) { + input.placeholder = can.user.trans(can, input.placeholder||input.name, null, html.INPUT) + input.title = can.user.trans(can, input.title||input.placeholder||input.name, null, html.INPUT) input.onkeydown = item.onkeydown||function(event) { if (event.key == code.ENTER) { return can.Update(), can.onkeymap.prevent(event) } can.onkeymap.input(event, can), can.onkeymap.selectOutput(event, can) } - input.onkeyup = item.onkeyup||function(event) { if (item.name == html.FILTER) { can.user.toast(can, "filter out "+can.page.Select(can, can._output, html.TR, function(tr, index) { - if (!can.page.ClassList.set(can, tr, html.HIDE, index > 0 && tr.innerText.indexOf(event.target.value) == -1)) { return tr } - }).length+" lines") } }, icon.push({icon: mdb.DELETE, onclick: function(event) { _input.value = "", input.onkeyup({target: event.target.previousSibling}) }}) + input.onkeyup = item.onkeyup||function(event) { if (item.name == html.FILTER) { + can.onmotion.delayOnce(can, function() { + var count = can.page.Select(can, can._output, html.TR, function(tr, index) { + if (!can.page.ClassList.set(can, tr, html.HIDE, index > 0 && tr.innerText.indexOf(event.target.value) == -1)) { return tr } + }).length + count += can.page.SelectChild(can, can.ui.content||can._output, html.DIV_ITEM, function(target) { + if (!can.page.ClassList.set(can, target, html.HIDE, target.innerText.indexOf(event.target.value) == -1)) { return target } + }).length + can.user.toast(can, "filter out "+count+" lines") + }, 1000) + + } }, icon.push({icon: mdb.DELETE, onclick: function(event) { _input.value = "", input.onkeyup({target: event.target.previousSibling}) }}) } if (item.range) { input._init = function(target) { can.onappend.figure(can, item, target, function(sub, value, old) { target.value = value, can.core.CallFunc([can.onaction, item.name], [event, can, item.name]) }) } } var _style = can.page.buttonStyle(can, item.name) var _input = can.page.Append(can, target, [{view: [[html.ITEM].concat(style, [item.type, item.name], _style)], list: [item.icon && {icon: item.icon}, input].concat(icon), _init: function(target, _input) { if (item.type == html.SELECT) { - _input.select.value = value||_item.value||_item.values[0], can.onappend.select(can, _input.select, _item) + _input.select.value = value||_item.value||_item.values[0] + can.onappend.select(can, _input.select, _item) can.onappend.style(can, html.BUTTON, target) } item.style && can.onappend.style(can, item.style, target) @@ -315,9 +332,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { } }, select: function(can, select, item) { // can.user.trans(can, item.value||item.values[0]) - return can.page.Append(can, select.parentNode, [{type: html.INPUT, data: {className: html.SELECT, type: html.BUTTON, name: item.name, value: item.value||item.values[0], title: item.name}, onclick: function(event) { var target = event.target - var carte = can.user.carte(event, can, {}, item.values, function(event, button) { carte.close() - if (target.value != button) { target.value = button, select.value = button, select.onchange && select.onchange({target: select}) } + var trans = {}; can.core.List(item.values, function(value) { trans[can.user.trans(can, value, null, html.INPUT)] = value }) + return can.page.Append(can, select.parentNode, [{type: html.INPUT, data: {className: html.SELECT, type: html.BUTTON, name: item.name, value: can.user.trans(can, item.value||item.values[0], null, html.INPUT), title: can.user.trans(can, item.name, null, html.INPUT)}, onclick: function(event) { var target = event.target + var carte = can.user.carte(event, can, {}, can.core.List(item.values, function(item) { return can.user.trans(can, item, null, html.INPUT) }), function(event, button) { carte.close() + if (target.value != button) { target.value = button, select.value = trans[button], select.onchange && select.onchange({target: select}) } return true }); can.onappend.style(can, [html.SELECT, item.name], carte._target), can.page.style(can, carte._target, html.MIN_WIDTH, event.target.offsetWidth) }, _init: function(target) { can.page.style(can, target, html.WIDTH, (select.offsetWidth||80)+10), can.onappend.style(can, html.HIDE, select) }}, {icon: mdb.SELECT}]) @@ -327,6 +345,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key, index, data, list) { if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) { if (key == mdb.VALUE) { key = data.key } data = {}, can.core.List(list, function(item) { data[item.key] = item.value }) } function run(event, cmd, arg) { can.misc.Event(event, can, function(msg) { can.run(can.request(event, data, can.Option()), [ctx.ACTION, cmd].concat(arg)) }) } + if (key == web.SPACE && value) { value = can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: value}), value) } return {text: [value, html.TD], onclick: function(event) { var target = event.target if (can.page.tagis(target, html.INPUT) && target.type == html.BUTTON) { can.requestAction(event, target.name) meta && meta[target.name]? can.user.input(event, can, meta[target.name], function(args) { run(event, target.name, args) }): run(event, target.name) @@ -492,7 +511,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { 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) { - function show(sub, cb) { can.base.isFunc(cb) && cb(sub, _cb), can.onlayout.figure(event, can, sub._target), can.onmotion.toggle(can, sub._target, true) } + function show(sub, cb) { can.base.isFunc(cb) && cb(sub, _cb), can.onlayout._figure(event, can, sub._target), can.onmotion.toggle(can, sub._target, true) } 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) sub.run = function(event, cmds, cb) { var msg = sub.request(event) @@ -500,8 +519,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { (meta.run||can.run)(sub.request(event, can.Option()), cmds, cb, true) }, target._can = sub, can.base.Copy(sub, can.onfigure[input], true), sub._name = sub._path = path sub._target._close = sub.close = function() { can.page.Remove(can, sub._target), delete(target._can) }, sub.hidden = function() { return !can.page.isDisplay(sub._target) } - meta.mode && can.onappend.style(sub, meta.mode), can.page.style(sub, sub._target, meta.style), can.base.isFunc(meta._init) && meta._init(sub, sub._target), - can.onmotion.delay(can, function() { show(sub, cb) }, 300) + meta.mode && can.onappend.style(sub, meta.mode), can.page.style(sub, sub._target, meta.style), can.base.isFunc(meta._init) && meta._init(sub, sub._target) + // can.onmotion.delay(can, function() { show(sub, cb) }, 300) + can.onmotion.delay(can, function() { show(sub, cb) }, 0) }, can._root._target) }}) }) } }), can.onfigure[input]._init && can.onfigure[input]._init(can, meta, target, _cb) @@ -526,10 +546,26 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||can._ro can.page.SelectChild(can, target, html.DIV_ITEM, function(target) { can.page.styleWidth(can, target, width) }) }, background: function(can, url, target) { can.page.style(can, target||can._root._target, "background-image", url == "" || url == "void"? "": 'url("'+url+'")') }, + _figure: function(event, can, target, right, min) { if (!event || !event.target) { return {} } target = target||can._fields||can._target + var rect = event.target == document.body? {left: can.page.width()/2, top: can.page.height()/2, right: can.page.width()/2, bottom: can.page.height()/2}: (event.currentTarget||event.target).getBoundingClientRect() + var layout = right? {left: rect.right, top: rect.top}: {left: rect.left, top: rect.bottom} + can.getActionSize(function(left, top, width, height) { left = left||0, top = top||0, height = can.base.Max(height, can.page.height()-top) + can.page.style(can, target, html.MAX_HEIGHT, top+height-layout.top) + can.page.style(can, target, html.MAX_WIDTH, left+width-layout.left) + }); + can.onmotion.move(can, target, layout), can.onmotion.slideGrow(can, target) + return layout + }, figure: function(event, can, target, right, min) { if (!event || !event.target) { return {} } target = target||can._fields||can._target var rect = event.target == document.body? {left: can.page.width()/2, top: can.page.height()/2, right: can.page.width()/2, bottom: can.page.height()/2}: (event.currentTarget||event.target).getBoundingClientRect() var layout = right? {left: rect.right, top: rect.top}: {left: rect.left, top: rect.bottom} can.getActionSize(function(left, top, width, height) { left = left||0, top = top||0, height = can.base.Max(height, can.page.height()-top) + if (can.user.isMobile) { + if (target.offsetHeight > height/2) { layout.top = top+32 } + if (target.offsetWidth > width/2) { layout.left = left, can.page.style(can, target, html.WIDTH, width) } + can.page.style(can, target, html.MAX_HEIGHT, top+height-layout.top) + return + } if (layout.top+target.offsetHeight > top+height) { if (min && top+height-layout.top > min) { can.page.style(can, target, html.MAX_HEIGHT, top+height-layout.top) @@ -537,11 +573,11 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||can._ro layout.top = rect.top-target.offsetHeight } else { if (!right) { right = true, layout.left += (event.currentTarget||event.target).offsetWidth } - can.page.style(can, target, html.MAX_HEIGHT, height) layout.top = top+height-target.offsetHeight } } if (layout.left+target.offsetWidth > left+width) { layout.left = (right? rect.left: left+width)-target.offsetWidth-1 } + can.page.style(can, target, html.MAX_HEIGHT, top+height-layout.top) }); can.onmotion.move(can, target, layout), can.onmotion.slideGrow(can, target) return layout @@ -594,7 +630,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { if (can.page.Select(can, document.body, list[i], function(target) { return target._close? target._close(): can.page.Remove(can, target) }).length > 0) { return true } } }, - clearCarte: function(can) { can.page.SelectChild(can, document.body, "div.carte.float", function(target) { can.page.Remove(can, target) }) }, + clearCarte: function(can) { can.page.SelectChild(can, document.body, "div.carte.float,fieldset.input.float", function(target) { can.page.Remove(can, target) }) }, clearInput: function(can) { can.page.SelectChild(can, document.body, "div.input.float", function(target) { can.page.Remove(can, target) }) }, hidden: function(can, target, show) { target = target||can._target if (!target.tagName && target.length > 0) { return can.core.List(target, function(target) { can.onmotion.hidden(can, target, show) }) } @@ -684,7 +720,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { return can.user.input(event, can, input, function(args) { can.onengine.signal(can, chat.ONSHARE, can.request(event, {args: [mdb.TYPE, chat.FIELD].concat(_args||[], args||[])})) }) }, focus: function(can, target, value) { if (!target) { return } if (!can.base.isUndefined(value)) { target.value = value } - target.focus(), can.onmotion.selectRange(target) + target.focus(), can.user.isMobile || can.onmotion.selectRange(target) }, selectRange: function(target) { target && target.setSelectionRange && target.setSelectionRange(0, target.value.length) }, copy: function(can, target, cb) { target.title = "点击复制,或 Command + Click 打开应用", target.onclick = function(event) { can.user.copy(event, can, target.innerText), can.base.isFunc(cb) && cb(event) diff --git a/index.css b/index.css index cfd68a81..21dbedb4 100644 --- a/index.css +++ b/index.css @@ -45,6 +45,7 @@ legend { padding:0 20px; } select { padding:0 10px; } input:not([type=file]) { padding:0 10px; } input:not([type=button]) { border-radius:0; outline:none; width:120px; } +body.mobile input:not([type=button]) { width:80px; } input[name=path] { width:160px; } input[name=line] { width:60px !important; } input[name=limit] { width:60px; } @@ -128,16 +129,22 @@ body>div.input { padding:20px; } body>div.input div.output { clear:both; } body>div.input td { padding:10px; } body>div.input td:nth-child(2) { padding:10px 0;} +body>div.input tr.img td:last-child>span { display:none; } +body>div.input tr.img td:last-child>div { + background-color:gray; margin:1px; float:left; cursor:pointer; + display:flex; align-items:center; justify-content:center; +} +body>div.input tr.img td:last-child>div>span { font-size:32px; } 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 img:first-child { height:28px; width:28px; left:12px; top:12px; position:absolute; } body>div.input tr.icon td:last-child input { padding-left:32px; } 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; } -body>div.input input { width:240px; } -body>div.input textarea { height:120px; width:240px; } -body>div.input div.action { width:100%; } +body>div.input select { width:230px !important; } +body>div.input input:not([type=button]) { width:240px !important; } +body>div.input textarea { height:120px; width:240px !important; } +body>div.input div.action { width:100%; position:sticky; bottom:0; } body>div.input div.action>div.item { margin:5px; float:right; } body>div.input div.action>div.item>input[type=button] { width:110px; } body>div.input.login>div.output { text-align:center; } @@ -190,6 +197,7 @@ div.action>div.item.icons.start>span.icon { font-size:30px; line-height:28px; } div.action>div.item.icons.refresh>span.icon { font-size:30px; line-height:28px; } div.action>div.item.icons.prunes>span.icon { display:inline-block; padding-top:2px; } div.action>div.item.icons>i { font-size:21px; line-height:32px; padding:6px; } + form.option>div.item.icons>i { font-size:21px; line-height:32px; padding:6px; } form.option div.icon, form.option span.icon { font-size:20px; line-height:32px; padding:0 5px; margin:0; height:32px; } form.option div.icon.refresh { font-size:28px; line-height:28px; } @@ -211,9 +219,10 @@ div.tabs>div:hover>span.icon { visibility:visible; } div.tabs:hover>span.icon { visibility:visible; } fieldset.plug>form.option>div.icon { margin-left:5px; } fieldset.panel>div.action>div.button>span.icon { display:none; } +fieldset.plugin.cmd>form.option>div.icon.delete { display:none; } fieldset.plugin:not(.story):not(.float):not(.full):not(.cmd)>form.option>div.icon { display:none; } -fieldset.plugin:not(.story):not(.float):not(.full):not(.cmd)>form.option>div.button>span.icon { display:none; } -fieldset.plugin:not(.story):not(.float):not(.full):not(.cmd)>div.action>div.button>span.icon { display:none; } +fieldset.plugin:not(.story):not(.float):not(.full):not(.cmd)>form.option>div.button:not(.select)>span.icon { display:none; } +fieldset.plugin:not(.story):not(.float):not(.full):not(.cmd)>div.action>div.button:not(.select)>span.icon { display:none; } fieldset.story>form.option>div.button.icons>input { display:none; } fieldset.float>form.option>div.button.icons>input { display:none; } fieldset.full>form.option>div.button.icons>input { display:none; } @@ -336,6 +345,7 @@ textarea:focus { border:var(--box-notice); } table.content tr:hover { background-color:var(--tr-hover-bg-color) !important; } table.content tr.select { background-color:var(--tr-hover-bg-color); } table.content th { background-color:var(--th-bg-color); color:var(--th-fg-color); } +table.content.detail td:first-child { text-align:center; } table.content td:hover { background-color:var(--td-hover-bg-color); } table.content td.select { background-color:var(--td-hover-bg-color); } table.content input { box-shadow:var(--box-shadow); } @@ -427,10 +437,6 @@ body.mobile fieldset.word.float>div.output>div.project { top:32px; } body.mobile fieldset.word>div.output>fieldset.story>form.option>div.text { display:none; } body.mobile fieldset.word>div.output { overflow-x:hidden; } body.mobile fieldset.web.code.inner.cmd>div.output { overflow:hidden; } -body.mobile fieldset.web.wiki.portal>div.output>div.layout { display:block; } -body.mobile fieldset.web.wiki.portal>div.output>div.layout>div.nav { padding:10px; height:unset; } -body.mobile fieldset.web.wiki.portal>div.output>div.layout>div.main { padding:10px; height:unset; min-width:unset; } -body.mobile fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] div.item { padding:10px; } body.mobile fieldset.word>div.output div.story.flex { display:block; } body.mobile fieldset.word>div.output div.story.flex>* { padding:unset; } /* print */ @@ -511,7 +517,9 @@ fieldset.draw.spide div.output svg path { stroke-width:1; } fieldset.draw>div.output>div.project { width:180px; flex:0 0 180px; } fieldset.draw>div.output>div.layout>div.layout>div.profile { width:180px; flex:0 0 180px; } fieldset.web.chat.location>div.action input[type=text] { width:80px !important; } -fieldset.web.chat.location>div.output>div.layout>div.layout>div.profile { position:absolute; top:0; right:0; height:200px; width:200px; z-index:5; border-left:none; } +fieldset.web.chat.location>div.output>div.layout>div.layout>div.profile { + background-color:var(--plugin-bg-color); + position:absolute; right:0; width:360px; z-index:5; border-left:none; } fieldset.web.chat.location>div.output>div.layout>div.layout { position:relative; } fieldset.web.code.git.total.draw div.output { text-align:center; } fieldset.web.code.docker.studio>div.action>div.item { font-style:italic; height:32px; padding:5px 10px; } @@ -526,8 +534,7 @@ fieldset.studio>div.output>fieldset>form.option div.icon:nth-child(2) { margin-l fieldset.studio>div.output>fieldset>div.output>table.content { width:100%; } fieldset.studio>div.output>fieldset:not(.select) { display:none; } body>div.input.vimer.plug td:first-child { display:none; } -body.cmd.web.wiki.portal { background-color:rgb(22 31 49); } -body.cmd.web.chat.macos.desktop { background-color:#8dbaea; } +body.cmd.web.chat.macos.desktop { background-color:#8ebff2; } body.zh fieldset.inner>div.output>div.project>div.zone>div.item { letter-spacing:10px; border-top:var(--box-border); } body.white fieldset.inner.cmd>div.output>div.layout>div.tabs div:not(.select):not(:hover) { background-color:transparent; } body.webview fieldset.word>form.option>div.item>input[name=path] { width:160px; } diff --git a/lib/misc.js b/lib/misc.js index 84437c5d..93f799b8 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -71,8 +71,7 @@ Volcanos("misc", { msg.Push(ctx.ACTION, can.page.Format(html.INPUT, "", mdb.TYPE, html.BUTTON, mdb.NAME, button, mdb.VALUE, can.user.trans(can, button))) }); return msg }, Echo: function(res) { msg.result = (msg.result||[]).concat(can.core.List(arguments)); return msg._hand = true, msg }, - Dump: function(can) { can = can||msg._can - if (can.user.isNodejs) { return } + Dump: function(can) { can = can||msg._can; if (can.user.isNodejs) { return } can.onmotion.clear(can), can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.story.auto(can) }, Defer: function(cb) { msg._defer = msg._defer||[] @@ -246,7 +245,7 @@ Volcanos("misc", { for (var i = -depth+1; i < list.length; i++) { var pos = split(i); if (pos.path != current.path) { return pos } } } return split(depth)||{} }, - _stacks: function(n, s) { var list = ((s||(new Error())).stack||"").split(lex.NL).slice(typeof n == undefined? 2: n) + _stacks: function(n, s) { var list = ((s||(new Error())).stack||"").split(lex.NL).slice(typeof n == "undefined"? 2: n) for (var i = 0; i < list.length; i++) { var ls = list[i].trim().split(lex.SP) list[i] = ls.pop().trim(); if (list[i][0] == "(") { list[i] = list[i].slice(1, -1) } list[i] = " "+list[i]; if (ls.length > 1) { list[i] += " "+ls.pop() } diff --git a/lib/page.js b/lib/page.js index b84d9bd1..98129f6d 100644 --- a/lib/page.js +++ b/lib/page.js @@ -68,7 +68,6 @@ Volcanos("page", { data.onchange = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, event.target.value, name) }) } item.list = list[0].slice(1).map(function(value) { return {type: html.OPTION, value: value, inner: can.user.trans(can, value)} }) } else if (item.input) { var list = can.core.List(item.input); type = html.INPUT, name = list[0], data.className = data.className||list[0], data.type = data.type||html.TEXT - data.onfocus = data.onfocus||function(event) { event.target.setSelectionRange(0, -1) } data.onkeydown = function(event) { can.base.isFunc(list[1]) && list[1](event) } data.onkeyup = function(event) { can.base.isFunc(list[2]) && list[2](event) } } else if (item.username) { var list = can.core.List(item.username); type = html.INPUT, name = list[0]||name||html.USERNAME @@ -175,7 +174,7 @@ Volcanos("page", { if (value == undefined) { return {view: [key, "col"]} } return {view: [[key, "option"], "col"]} } }) }, {type: html.THEAD}, {type: html.TBODY}]}]) - can.page.Append(can, ui.thead, [{data: {dataset: {index: -1}}, th: can.core.List(list, function(key) { if (key[0] != "_") { return key } }) }]) + can.page.Append(can, ui.thead, [{data: {dataset: {index: -1}}, th: can.core.List(list, function(key) { if (key[0] != "_") { return can.user.trans(can, key, null, html.INPUT) } }) }]) can.page.Append(can, ui.tbody, can.core.List(msg.Table(), function(item, index, array) { return {dataset: {index: index}, className: item["status"], td: can.core.List(list, function(key) { if (key[0] != "_") { return cb(can.page.Color(item[key]).trim(), key, index, item, array) } }) } })); return can.page.OrderTable(can, ui._target) diff --git a/lib/user.js b/lib/user.js index d46a0323..a82c2d02 100644 --- a/lib/user.js +++ b/lib/user.js @@ -62,10 +62,14 @@ Volcanos("user", { title: function(text) { if (window.webview) { return title(text) } return text && (document.title = text), document.title }, language: function(can) { return (can.misc.SearchOrConf(can, aaa.LANGUAGE)||can.user.info.language||"") }, isEnglish: function(can) { return can.base.isIn(can.user.language(can).toLowerCase(), "en", "en-us") }, - trans: function(can, text, list) { if (can.base.isNumber(text)) { return text+"" } if (can.user.isEnglish(can)) { return text } - if (can.base.isObject(text)) { return can.core.Item(text, function(k, v) { can.core.Value(can._trans, k, v) }) } + trans: function(can, text, list, zone) { if (can.base.isNumber(text)) { return text+"" } if (can.user.isEnglish(can)) { return text } + if (can.base.isObject(text)) { return can.core.Item(text, function(k, v) { can.core.Value(can._trans, can.core.Keys(zone, k), v) }) } if (can.base.isFunc(text)) { text = text.name||"" } if (can.base.isString(list)) { return list } - return list&&list[text] || can.user._trans[text] || can._trans&&can._trans[text] || can.Conf("trans."+text) || can.Conf("feature._trans."+text) || text + var key = can.core.Keys(zone, text) + return can.core.Value(list, key) || can.core.Value(can._trans, key) || + can.Conf(["trans", key]) || can.Conf(["feature._trans", key]) || + can.core.Value(can.user._trans, key) || text + }, _trans: {"_week_header": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]}, time: function(can, time, fmt) { var now = can.base.Date(time), list = can.user._trans["_week_header"] return fmt == "%W"? list: can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()])) @@ -126,8 +130,8 @@ Volcanos("user", { function remove_sub(carte) { carte._sub && can.page.Remove(can, carte._sub._target), delete(carte._sub) } parent? remove_sub(parent): can.onmotion.clearCarte(can) meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta)), trans = trans||meta._trans; if (!list || list.length == 0) { return } var _events = event._events||event - function click(event, button) { can.misc.Event(event, can, function() { can.request(event, {action: button}), can.onkeymap.prevent(event), event._events = _events; - (can.base.isFunc(cb)? cb(event, button, meta, carte): + function click(event, button, index) { can.misc.Event(event, can, function() { can.request(event, {action: button}), can.onkeymap.prevent(event), event._events = _events; + (can.base.isFunc(cb)? cb(event, button, meta, carte, index): meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}): can.Update(event, [ctx.ACTION, button])) || can.onmotion.clearCarte(can) }) } @@ -142,12 +146,12 @@ Volcanos("user", { return { view: [[html.ITEM, item, _style], html.DIV, (isinput || meta._style == ice.CMD) && !trans? item: can.user.trans(can, item, trans)], onmouseenter: function(event) { remove_sub(carte) }, - onclick: function(event) { click(event, item) }, + onclick: function(event) { click(event, item, index) }, } } if (can.base.isArray(item)) { function subs(event) { var sub = can.user.carte(event, can, meta, item.slice(1), cb||function(event, button) { - can.onimport && can.onimport[item[0]]? can.onimport[item[0]](can, button): click(event, button) + can.onimport && can.onimport[item[0]]? can.onimport[item[0]](can, button): click(event, button, index) }, carte, trans); carte._sub = sub } return {view: html.ITEM, list: [ {text: can.user.trans(can, item[0], trans)}, @@ -181,12 +185,19 @@ 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, 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}}]}, + item.value = item.value||msg.Option(item.name) + item.placeholder = can.user.trans(can, item.placeholder||item.name, null, html.INPUT) + item.title = can.user.trans(can, item.title||item.placeholder||item.name, null, html.INPUT) + return {view: [[item.name, item.type, item.action], html.TR], list: [ + {type: html.TD, list: [{text: [can.user.trans(can, item.name||"", item._trans, html.INPUT), 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 = "" }}]}, ]} })}]}, html.ACTION, - ]}]) + ], onclick: function(event) { + if (!can.page.tagis(event.target, html.INPUT, html.TEXTAREA)) { + can.onmotion.clearCarte(can) + } + }}]) var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, { _trans: {submit: msg.Option(web.SUBMIT)}, focus: function() { can.onmotion.focus(can, can.page.Select(can, ui._target, html.INPUT_ARGS)[0]) }, @@ -199,12 +210,9 @@ Volcanos("user", { can.core.CallFunc(cb, {event: can.request(event, {_handle: ice.TRUE})._event, button: button, data: data, list: list, args: args, input: action}) || action.cancel() }, _target: ui._target, _engine: function(event, can, button) { action.submit(event, can, button) }, }); - if (event && event.target) { - can.onlayout.figure(event, can, ui._target) - } else { + if (event && event.target) { can.onlayout.figure(event, can, ui._target) } else { can.getActionSize(function(left, top, height) { can.page.style(can, ui._target, html.LEFT, left||0, html.TOP, (height/4||0)) }) - } - can.onmotion.resize(can, ui._target), can.onmotion.delay(can, function() { action.focus() }) + } can.onmotion.resize(can, ui._target), can.onmotion.delay(can, function() { action.focus() }, 300) return button === true && action.submit(event, can, html.SUBMIT), action }, select: function(event, can, type, fields, cb, cbs) { diff --git a/panel/action.js b/panel/action.js index c70eff40..678b318e 100644 --- a/panel/action.js +++ b/panel/action.js @@ -1,14 +1,17 @@ (function() { const TABS = "tabs", TABVIEW = "tabview", HORIZON = "horizon", VERTICAL = "vertical", GRID = "grid", FREE = "free", FLOW = "flow", PAGE = "page", CAN_LAYOUT = "can.layout" Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM), list = can.misc.SearchHash(can) + // can.isCmdMode() || can.page.style(can, can._output, "visibility", "hidden") can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { item.type = chat.PLUGIN, item.mode = can.Mode(); if (item.deleted == ice.TRUE) { return next() } can.onappend.plugin(can, item, function(sub, meta, skip) { can._plugins = (can._plugins||[]).concat([sub]), can.onimport._tabs(can, sub, meta), skip || next() sub.onaction._close = function() { can.onengine.signal(can, chat.ONACTION_REMOVE, can.request({river: river, storm: storm}, item)), can.page.Remove(can, sub._target) } sub.run = function(event, cmds, cb) { return can.run(event, [river, storm, meta.id||meta.index].concat(cmds), cb) } sub.onexport.output = function() { can.page.style(can, sub._output, html.MAX_HEIGHT, "") } }) - }, function() { can.isCmdMode() || can.onmotion.delay(can, function() { can.onaction.layout(can), can.onappend.scroll(can, can._output) - can.onexport.layout(can) && list[0] == river && list[1] == storm && can.core.List(can._plugins, function(sub) { sub.Conf(ctx.INDEX) == list[2] && can.onmotion.delay(can, function() { sub._tabs.click() }) }) - }, 300) }) + }, function() { if (can.isCmdMode()) { return } + can.onmotion.delay(can, function() { can.onaction.layout(can), can.onappend.scroll(can, can._output), can.page.style(can, can._output, "visibility", "visible") + can.onexport.layout(can) && list[0] == river && list[1] == storm && can.core.List(can._plugins, function(sub) { sub.Conf(ctx.INDEX) == list[2] && can.onmotion.delay(can, function() { sub._tabs.click() }) }) + }, 300) + }) }, _tabs: function(can, sub, meta) { var tabs = [{view: [html.ITEM, "", meta.name], onclick: function(event) { can.onmotion.select(can, can._header_tabs, html.DIV_ITEM, sub._header_tabs) diff --git a/plugin/input/img.js b/plugin/input/img.js index 815056af..44a3a2ea 100644 --- a/plugin/input/img.js +++ b/plugin/input/img.js @@ -1,14 +1,18 @@ Volcanos(chat.ONFIGURE, {img: { - _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 + _init: function(can, meta, target) { target.value == meta.value && (target.value = ""); var images = can.core.Split(target.value) + var count = parseInt(meta.value||"1"), width = target.parentNode.offsetWidth-22; 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(mdb.FS) } + can.onmotion.hidden(can, target) 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.misc.Event(event, can, function(msg) { - can.user.upload(event, can, function(msg) { add(target, msg.Result()), set() }, true) - })} } }]) + "clear": i%n == 0? "both": "none", height: width, width: width, + }, _init: function(target) { + if (images[i] && images[i].length > 10) { add(target, images[i]) } else { can.page.Append(can, target, [{text: "+"}]) } + target.onclick = function(event) { can.misc.Event(event, can, function(msg) { + 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 13a74423..430a5269 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -11,11 +11,10 @@ Volcanos(chat.ONFIGURE, {key: { return {text: [value, html.TD, value == ""? html.HR: ""], style: msg.append && msg.append.length == 1? kit.Dict(html.MIN_WIDTH, target.offsetWidth-16): {}, onclick: function(event) { 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) - 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()), can.onmotion.toggle(can, can._status, msg.Length() > 5) 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) + 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) { can.onmotion.focus(can, target) }, onfocus: function(event, can, meta, target, cbs) { cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return } diff --git a/plugin/local/chat/location.js b/plugin/local/chat/location.js index 9155e0c1..a9a73bf5 100644 --- a/plugin/local/chat/location.js +++ b/plugin/local/chat/location.js @@ -17,9 +17,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { msg.Option(ice.MSG_ACTI if (msg.IsDetail()) { can.onaction.center(can, can._current = can.onimport._item(can, msg.TableDetail())) } else { - msg.Table(function(item) { can.onimport._item(can, item) }) - var item = can.db.list[can.db.hash[0]]; item? item.click(): - can.user.agent.getLocation(can, function(res) { res.type = "current", can.onaction.center(can, can._current = res) }) + msg.Table(function(item) { can.onimport._item(can, item) }), can.ui.zone.favor._total(msg.Length()) + var item = can.db.list[can.db.hash[0]]; item? item.click(): can.user.agent.getLocation(can, function(res) { res.type = "current", can.onaction.center(can, can._current = res) }) } can.user.isMobile && can.core.Item(can.ui.zone, function(key, item) { key == "favor" || item._legend.click() }) }) @@ -28,7 +27,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { msg.Option(ice.MSG_ACTI {name: "explore"}, {name: "search"}, {name: "direction"}, {name: "favor", _menu: shy({"play": function(event, can, button) { can.core.Next(can.page.Select(can, can.ui.zone.favor._target, html.DIV_ITEM), function(item, next) { - item.click(), can.onmotion.delay(can, next, 2000) + item.click(), can.onmotion.delay(can, next, 3000) }, function() { can.user.toastSuccess(can) }) }})}, {name: "district", _delay_init: function(target, zone) { @@ -103,13 +102,22 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { msg.Option(ice.MSG_ACTI remove: function(event, button) { can.runAction(event, mdb.REMOVE, [mdb.HASH, item.hash], function() { can.page.Remove(can, _target) }) }, }) }, target||can.ui.zone.favor._target); can.db.list[item.hash] = _target + can.ui.zone.favor._total() can.mark && can.mark.add({position: can.onimport.point(can, item), properties: item}) return item }, point: function(can, item) { return new TMap.LatLng(item.latitude, item.longitude) }, plugin: function(can, item) { var extra = can.base.Obj(item.extra, {}) - if (!extra.index) { return can.onmotion.toggle(can, can.ui.profile, false) } can.onmotion.toggle(can, can.ui.profile, true) - if (can.onmotion.cache(can, function() { return item.hash }, can.ui.profile)) { return true} + can.onmotion.toggle(can, can.ui.profile, true) + if (can.onmotion.cache(can, function() { return item.hash }, can.ui.profile)) { return true } + if (!extra.index) { return can.onmotion.toggle(can, can.ui.profile, false) + var msg = can.request() + can.core.Item(item, function(key, value) { if (key == mdb.EXTRA) { return } + if (key == web.SPACE) { value = can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: value}), value) } + msg.Push(mdb.KEY, key), msg.Push(mdb.VALUE, value) + }), can.onappend.table(can, msg, null, can.ui.profile) + return + } can.onappend.plugin(can, {index: extra.index, args: extra.args}, function(sub) { item._plugin = sub sub.onaction._close = function() { can.onmotion.hidden(can, can.ui.profile) } sub.onexport.output = function() { sub.onimport.size(sub, can.ConfHeight()/2, can.ConfWidth()/2, true) @@ -249,7 +257,7 @@ Volcanos(chat.ONACTION, {list: [ }) }, }) -Volcanos(chat.ONEXPORT, {list: ["nation", "province", "city", "latitude", "longitude", "ip", "type", "name", "text"], +Volcanos(chat.ONEXPORT, {list: ["nation", "province", "city", "latitude", "longitude", "ip", "type", "name", "text", "space"], point: function(can, point, item) { return can.base.Copy({latitude: point.lat, longitude: point.lng}, item, true) }, center: function(can) { return can.onexport.point(can, can.map.getCenter()) }, current: function(can) { diff --git a/plugin/local/mall/goods.css b/plugin/local/mall/goods.css index 3fa4f1de..acb39bd5 100644 --- a/plugin/local/mall/goods.css +++ b/plugin/local/mall/goods.css @@ -1,6 +1,14 @@ -fieldset.goods>div.output>div.item { border-radius:10px; height:170px; float:left; } -fieldset.goods>div.output>div.item>div { padding:10px; float:left; clear:none; } -fieldset.goods>div.output>div.item>div.image img { border-radius:10px; } -fieldset.goods>div.output>div.item>div.content { float:right; } -fieldset.goods>div.output>div.item>div.content>div.title { white-space:break-spaces; overflow:hidden; height:50px; } -fieldset.goods>div.output>div.item>div.content>div.price { color:red; } \ No newline at end of file +fieldset.goods>div.output>div.project { flex:0 0 80px; } +fieldset.goods>div.output>div.layout>div.layout>div.content>div.item:not(.hide) { + background-color:var(--plugin-bg-color); border-radius:10px; box-shadow:var(--box-shadow); margin:10px; float:left; + display:flex; height:150px; +} +fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div { padding:10px; float:left; clear:none; } +fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.image { flex-grow:0; } +fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.image>img { height:100px; width:100px; } +fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.content { flex-grow:1; } +fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.content div.title { font-weight:bold; white-space:break-spaces; overflow:hidden; height:32px; } +fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.content div.content { height:24px; } +fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.content div.display { line-height:32px; } +fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.content div.display>div { float:left; margin-right:5px; } +fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.content div.price { color:red; } diff --git a/plugin/local/mall/goods.js b/plugin/local/mall/goods.js index 57a9c3fc..15022ab5 100644 --- a/plugin/local/mall/goods.js +++ b/plugin/local/mall/goods.js @@ -1,42 +1,28 @@ Volcanos(chat.ONIMPORT, { - _init: function(can, msg, target) { - can.page.Appends(can, target, msg.Table(function(item) { + _init: function(can, msg) { if (msg.IsDetail()) { return msg.Dump(can) } + var list = {}; can.ui = can.onappend.layout(can), can.onmotion.clear(can, can.ui.project) + can.page.Appends(can, can.ui.content, msg.Table(function(item) { + if (!list[item.zone]) { list[item.zone] = item, can.onimport.item(can, {name: item.zone}, function() {}) } return {view: html.ITEM, list: [ - {view: wiki.IMAGE, list: [{img: can.misc.MergeCache(can, can.core.Split(item.image)[0]), width: 150, height: 150}]}, + {view: wiki.IMAGE, list: [{img: can.misc.MergeCache(can, can.core.Split(item.image)[0])}]}, {view: wiki.CONTENT, list: [ {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: [mall.PRICE, html.DIV, "¥ "+(item.price||0)]}, + {view: [mall.COUNT, html.DIV, "剩 "+(item.count||0)+" "+item.type]}, ]}, {view: html.ACTION, inner: item.action}, ]}, ], onclick: function(event) { if (can.page.tagis(event.target, html.INPUT) && event.target.type == html.BUTTON) { can.run(can.request(event, item), [ctx.ACTION, event.target.name]) - } else { - can.Option(mdb.HASH, item.hash), can.Update() } }} - })), can.onimport.layout(can) + })) }, - layout: function(can) { var width = can.onexport.width(can) - can.page.Select(can, can._output, "div.item>div.content", function(target) { can.page.styleWidth(can, target, width-190) }) - can.isCmdMode() && can.page.styleHeight(can, can._output, can.ConfHeight()) + layout: function(can) { + can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight()) + can.ui.content && can.onlayout.expand(can, can.ui.content, 260) }, }, [""]) -Volcanos(chat.ONACTION, {list: ["music"], - "play": function(event, can, button) { - can._audio = can._audio||can.page.Append(can, can._output, [{type:"audio", src: "https://m701.music.126.net/20221029062844/f7593e1bb844dc4e35003543494314a2/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/9879113394/5ffc/73bd/1a47/b11e9469bf4f6744db6e88c527a678df.m4a", _init: function(target) { - }}])._target - can._audio.play() - }, - "stop": function(event, can, button) { - }, - "music": function(event, can, button) { - }, -}) -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) } } }, -}) diff --git a/plugin/local/team/plan.js b/plugin/local/team/plan.js index 4d0e2d67..7434aec0 100644 --- a/plugin/local/team/plan.js +++ b/plugin/local/team/plan.js @@ -31,9 +31,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( _profile: function(can, task) { can.onmotion.toggle(can, can.ui.profile, true), can.onexport.hash(can, task) if (can.onmotion.cache(can, function() { return can.sup.task = task, can.Status(task), [task.space, task.zone, task.id].join(nfs.PT) }, can.ui.profile)) { return } task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task[key] = value }), delete(task.extra) - var table = can.page.Appends(can, can.ui.profile, [{view: [chat.CONTENT, html.TABLE], list: [{th: [can.user.trans(can, mdb.KEY, "字段"), can.user.trans(can, mdb.VALUE, "属性")]}]}])._target + var table = can.page.Appends(can, can.ui.profile, [{view: [[chat.CONTENT, mdb.DETAIL], html.TABLE], list: [{th: [can.user.trans(can, mdb.KEY, "字段"), can.user.trans(can, mdb.VALUE, "属性")]}]}])._target can.core.Item(task, function(key, value) { key != "_target" && can.page.Append(can, table, [{ - td: [key, key == web.SPACE && value != ""? can.page.Format(html.A, can.misc.MergeURL(can, {pod: value}), value): value], + td: [can.user.trans(can, key, null, html.INPUT), key == web.SPACE && value != ""? can.page.Format(html.A, can.misc.MergeURL(can, {pod: value}), value): value], onclick: function(event) { can.page.tagis(event.target, html.INPUT) && event.target.type == html.BUTTON && can.run(can.request(event, task), [ctx.ACTION, event.target.name]) }, ondblclick: function(event) { if ([web.SPACE, mdb.ZONE, mdb.ID].indexOf(key) > -1) { return } can.onmotion.modify(can, event.target, function(sub, value) { can.onaction.modifyTask(event, can, task, key, value) }, {name: key, action: key.indexOf(mdb.TIME) > 0? "date": "key"}) @@ -149,7 +149,7 @@ Volcanos(chat.ONACTION, {list: [ score: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, view: function(event, can, key, value) { can.Action(key, value), can.onmotion.clear(can, can.ui.project), can.onmotion.clear(can, can.ui.content), can.core.CallFunc([can.onimport, can.Option("scale")], [can, can._msg]) }, }) -Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, web.SPACE, team.BEGIN_TIME, mdb.ZONE, mdb.ID, mdb.TYPE, mdb.NAME, mdb.TEXT], +Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, team.BEGIN_TIME, mdb.ZONE, mdb.ID, mdb.TYPE, mdb.NAME, mdb.TEXT, web.SPACE], span: function(can) { return kit.Dict(team.DAY, 24*3600*1000, team.WEEK, 7*24*3600*1000, team.MONTH, 30*24*3600*1000, team.YEAR, 365*24*3600*1000, team.LONG, 365*24*3600*1000)[can.Option("scale")]||0 }, hash: function(can, task) { if (!can.isCmdMode()) { return } location.hash = [task.space, task.zone, task.id].join(nfs.DF) }, head: function(can, scale) { if ([team.YEAR, team.LONG].indexOf(scale) > -1) { return } return [scale].concat(can.user.time(can, "", "%W")) }, diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 5fa6154e..6e7e0a7d 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -44,11 +44,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(html.PADDI }); select && select.click() }, field: function(can, meta, target) { var item = can.base.Obj(meta.meta), width = item.width + if (can.Option(nfs.PATH).indexOf(nfs.DF) > 0) { var ls = can.core.Split(can.Option(nfs.PATH), nfs.DF); item.space = ls[0] } can.onappend.plugin(can, item, function(sub) { can._plugins = (can._plugins||[]).concat([sub]) sub.onimport.size(sub, can.base.Min(can.ConfHeight()/2, 300, 600), sub.Conf("_width", width)||(can.ConfWidth()-2*can.Conf(html.PADDING)), true) - var size = sub.onimport.size; sub.onimport.size = function(can, height, width, auto, mode) { size(can, height, width, auto, mode) - can.page.style(can, sub._output, html.MAX_HEIGHT, "", "overflow-y", "hidden") - } + var size = sub.onimport.size; sub.onimport.size = function(can, height, width, auto, mode) { size(can, height, width, auto, mode), can.page.style(can, sub._output, html.MAX_HEIGHT, "", "overflow-y", "hidden") } can.core.Value(item, "auto.cmd") && can.onmotion.delay(function() { sub.runAction(sub.request({}, can.core.Value(item, "opts")), can.core.Value(item, "auto.cmd")) }) }, can._output, target) }, diff --git a/plugin/table.js b/plugin/table.js index 30d4a449..9514495d 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -9,7 +9,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( }, card: function(can, msg, target) { can.sup.onexport.outputMargin = function() { return 211 } - can.page.Appends(can, target||can._output, msg.Table(function(value) { + can.page.Appends(can, target||can._output, msg.Table(function(value) { value.icon = value.icon||value.image return {view: [[html.ITEM, value.status]], list: [ {view: [wiki.TITLE, html.DIV], list: [value.icon && {img: can.misc.Resource(can, value.icon, value.name)}, {text: value.name}]}, {view: [wiki.CONTENT, html.DIV, value.text]}, @@ -184,7 +184,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( can.core.Next(list.reverse(), function(meta, next) { can.base.isString(meta) && (meta = {index: meta}), meta.mode = html.FLOAT can.onimport.plug(can, meta, function(sub) { sub.onexport.output = function() { var width = can.ConfWidth()-(can.ui && can.ui.project? can.ui.project.offsetWidth: 0) - can.page.style(can, can._output, html.MAX_HEIGHT, "", html.HEIGHT, "", html.WIDTH, "", html.MAX_WIDTH, "") + can.page.style(can, sub._output, html.MAX_HEIGHT, "", html.HEIGHT, "", html.WIDTH, "", html.MAX_WIDTH, "") sub.onimport.size(sub, can.ConfHeight()/2, can.base.Min(sub._target.offsetWidth, width/2, width/(can.base.isIn(sub.ConfIndex(), code.COMPILE, cli.RUNTIME)? 1: 2)), true) } can.onmotion.hidden(can, sub._target), sub._legend._target = sub._target, sub._legend._meta = {index: meta.index}