From 4068d72b808e928a039c26d051b0929d149e0035 Mon Sep 17 00:00:00 2001 From: shy Date: Sat, 26 Aug 2023 21:09:17 +0800 Subject: [PATCH] add some --- const.js | 1 + frame.js | 10 ++- index.css | 155 ++++++++++++++++++++++++++++++++++++ lib/base.js | 11 ++- lib/misc.js | 5 +- lib/page.js | 2 +- lib/user.js | 5 +- plugin/local/code/inner.css | 2 +- plugin/local/code/inner.js | 3 + plugin/state.js | 9 +-- plugin/table.js | 23 +++--- proto.js | 2 + 12 files changed, 201 insertions(+), 27 deletions(-) diff --git a/const.js b/const.js index 63494a68..134d24ed 100644 --- a/const.js +++ b/const.js @@ -107,6 +107,7 @@ var web = {CHAT: "chat", TEAM_PLAN: "web.team.plan", } var aaa = { + SESS: "sess", USER: "user", EMAIL: "email", LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token", diff --git a/frame.js b/frame.js index 665ed51c..586edd1c 100644 --- a/frame.js +++ b/frame.js @@ -229,8 +229,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: can.page.inputs(can, sub.onimport.list, html.TEXT) }) } can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) { - action === false || can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action) - action === false || sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS)), can.user.isMobile || sub.onappend.tools(sub, msg) + if (action !== false) { + 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) + } can.onappend.style(sub, sub.Conf(ctx.STYLE)), can.onmotion.story.auto(can, can._output) if (can.onimport.size) { if (can.isFullMode() || can.isCmdMode()) { can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width()) } can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), can.Conf("_auto"), can.Mode()), can.onexport.output(sub, msg) @@ -248,7 +250,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }, field: function(can, type, item, target) { type = type||html.STORY, item = item||{} - var name = can.core.Split(item.nick||item.name||"").pop()||""; name = can.core.Keys(item.space, name) + var name = can.core.Split(item.nick||item.name||"").pop()||""; can.base.isIn(name, "server", "client", "studio") && (name = (item.index||"").split(".").slice(-2).join(".")), name = can.core.Keys(item.space, name) var title = item.help && item.help != name && !can.user.isEnglish(can)? name+"("+can.core.Split(item.help)[0]+")": name return can.page.Append(can, target||can._output, [{view: [type, html.FIELDSET], list: [{type: html.LEGEND, list: [{icon: item.icon}, {text: title}]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS]}]) }, @@ -371,7 +373,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { if (item.index) { item._index = count++, ui.size[item._index] = item.height||item.width can.onappend.plugin(can, item, function(sub) { can._plugins = (can._plugins||[]).concat([sub]) item.layout = function(height, width) { sub.onimport.size(sub, height, width) } - }, target, ui[item._index] = can.onappend.field(can, item.type, {name: item.index.split(nfs.PT).pop(), help: item.help}, target)._target) + }, target, ui[item._index] = can.onappend.field(can, item.type, {index: item.index, name: item.index.split(nfs.PT).pop(), help: item.help}, target)._target) } else { can.page.Append(can, target, [item]) } } }); return list } ui.list = append(target, type, list||[html.PROJECT, [[html.CONTENT, html.PROFILE], html.DISPLAY]]) diff --git a/index.css b/index.css index cb1adc49..f3b3d147 100644 --- a/index.css +++ b/index.css @@ -1,4 +1,159 @@ body { + --ui-white: #fff; + --ui-white-p: 255,255,255; + --ui-black: #101828; + --ui-black-p: 16,24,40; + --ui-red-1: #fff1f0; + --ui-red-2: #ffccc7; + --ui-red-3: #ffa39e; + --ui-red-4: #ff7875; + --ui-red-5: #ff4d4f; + --ui-red-5-p: 255,77,79; + --ui-red-base: #f5222d; + --ui-red-6: #f5222d; + --ui-red-7: #cf1322; + --ui-red-7-p: 207,19,34; + --ui-red-8: #a8071a; + --ui-red-9: #820014; + --ui-red-10: #5c0011; + --ui-yellow-1: #feffe6; + --ui-yellow-2: #ffffb8; + --ui-yellow-3: #fffb8f; + --ui-yellow-4: #fff566; + --ui-yellow-5: #ffec3d; + --ui-yellow-base: #fadb14; + --ui-yellow-6: #fadb14; + --ui-yellow-7: #d4b106; + --ui-yellow-8: #ad8b00; + --ui-yellow-9: #876800; + --ui-yellow-10: #614700; + --ui-green-1: #e8f5e9; + --ui-green-2: #c8e6c9; + --ui-green-3: #a5d6a7; + --ui-green-4: #81c784; + --ui-green-5: #66bb6a; + --ui-green-base: #4caf50; + --ui-green-6: #4caf50; + --ui-green-6-p: 76,175,80; + --ui-green-7: #43a047; + --ui-green-8: #388e3c; + --ui-green-9: #2e7d32; + --ui-green-10: #1b5e20; + --ui-cyan-1: #e6fffb; + --ui-cyan-2: #b5f5ec; + --ui-cyan-3: #87e8de; + --ui-cyan-4: #5cdbd3; + --ui-cyan-5: #36cfc9; + --ui-cyan-base: #13c2c2; + --ui-cyan-6: #13c2c2; + --ui-cyan-7: #08979c; + --ui-cyan-8: #006d75; + --ui-cyan-9: #00474f; + --ui-cyan-10: #002329; + --ui-blue-1: #e6f7ff; + --ui-blue-2: #bae7ff; + --ui-blue-3: #91d5ff; + --ui-blue-4: #69c0ff; + --ui-blue-5: #40a9ff; + --ui-blue-base: #1890ff; + --ui-blue-6: #1890ff; + --ui-blue-6-p: 24,144,255; + --ui-blue-7: #096dd9; + --ui-blue-8: #0050b3; + --ui-blue-9: #003a8c; + --ui-blue-10: #002766; + --ui-purple-1: #f4f1fd; + --ui-purple-1-p: 244,241,253; + --ui-purple-2: #e5ddfb; + --ui-purple-3: #d1c3f8; + --ui-purple-4: #bba7f4; + --ui-purple-5: #9e81f0; + --ui-purple-base: #9373ee; + --ui-purple-6: #9373ee; + --ui-purple-6-p: 147,115,238; + --ui-purple-7: #7d62ca; + --ui-purple-8: #6852a9; + --ui-purple-9: #544288; + --ui-purple-10: #42346b; + --ui-magenta-1: #fff0f6; + --ui-magenta-2: #ffd6e7; + --ui-magenta-3: #ffadd2; + --ui-magenta-4: #ff85c0; + --ui-magenta-5: #f759ab; + --ui-magenta-base: #eb2f96; + --ui-magenta-6: #eb2f96; + --ui-magenta-7: #c41d7f; + --ui-magenta-8: #9e1068; + --ui-magenta-9: #780650; + --ui-magenta-10: #520339; + --ui-pink-base: #eb2f96; + --ui-pink-1: #fff0f6; + --ui-pink-2: #ffd6e7; + --ui-pink-3: #ffadd2; + --ui-pink-4: #ff85c0; + --ui-pink-5: #f759ab; + --ui-pink-6: #eb2f96; + --ui-pink-7: #c41d7f; + --ui-pink-8: #9e1068; + --ui-pink-9: #780650; + --ui-pink-10: #520339; + --ui-orange-1: #fff7e6; + --ui-orange-2: #ffe7ba; + --ui-orange-3: #ffd591; + --ui-orange-4: #ffc069; + --ui-orange-5: #ffa940; + --ui-orange-base: #fa8c16; + --ui-orange-6: #fa8c16; + --ui-orange-7: #d46b08; + --ui-orange-8: #ad4e00; + --ui-orange-9: #873800; + --ui-orange-10: #612500; + --ui-volcano-1: #fff2e8; + --ui-volcano-2: #ffd8bf; + --ui-volcano-3: #ffbb96; + --ui-volcano-4: #ff9c6e; + --ui-volcano-5: #ff7a45; + --ui-volcano-base: #fa541c; + --ui-volcano-6: #fa541c; + --ui-volcano-7: #d4380d; + --ui-volcano-8: #ad2102; + --ui-volcano-9: #871400; + --ui-volcano-10: #610b00; + --ui-geekblue-1: #f0f5ff; + --ui-geekblue-2: #d6e4ff; + --ui-geekblue-3: #adc6ff; + --ui-geekblue-4: #85a5ff; + --ui-geekblue-5: #597ef7; + --ui-geekblue-base: #2f54eb; + --ui-geekblue-6: #2f54eb; + --ui-geekblue-7: #1d39c4; + --ui-geekblue-8: #10239e; + --ui-geekblue-9: #061178; + --ui-geekblue-10: #030852; + --ui-lime-1: #fcffe6; + --ui-lime-2: #f4ffb8; + --ui-lime-3: #eaff8f; + --ui-lime-4: #d3f261; + --ui-lime-5: #bae637; + --ui-lime-base: #a0d911; + --ui-lime-6: #a0d911; + --ui-lime-7: #7cb305; + --ui-lime-8: #5b8c00; + --ui-lime-9: #3f6600; + --ui-lime-10: #254000; + --ui-gold-1: #fffbe6; + --ui-gold-2: #fff1b8; + --ui-gold-3: #ffe58f; + --ui-gold-4: #ffd666; + --ui-gold-5: #ffc53d; + --ui-gold-base: #faad14; + --ui-gold-6: #faad14; + --ui-gold-6-p: 250,173,20; + --ui-gold-7: #d48806; + --ui-gold-8: #ad6800; + --ui-gold-9: #874d00; + --ui-gold-10: #613400; + --body-bg-color:black; --body-fg-color:silver; --danger-bg-color:red; --danger-fg-color:white; --notice-bg-color:blue; --notice-fg-color:white; diff --git a/lib/base.js b/lib/base.js index d88d90ab..b864efe6 100644 --- a/lib/base.js +++ b/lib/base.js @@ -117,7 +117,16 @@ Volcanos("base", { if (arg[i] && str.replace) { while (str.indexOf(arg[i]) > -1) { str = str.replace(arg[i], arg[i+1]) } } } return str }, contains: function(str) { var arg = arguments; for (var i = 1; i < arg.length; i++) { if (!arg[i] || str.indexOf(arg[i]) > -1) { return true } } }, - beginWith: function(str) { for (var i = 1; i < arguments.length; i++) { if (typeof str == code.STRING && str.trim().indexOf(arguments[i]) == 0) { return true } } }, + beginWith: function(str) { + for (var i = 1; i < arguments.length; i++) { + if (typeof str == code.STRING && str.trim().indexOf(arguments[i]) == 0) { return true } + if (typeof str == code.OBJECT) { var begin = true + for (var j = 0; j < arguments[i].length; j++) { + if (str[j] != arguments[i][j]) { begin = false; break } + } if (begin) { return true } + } + } + }, endWith: function(str) { var arg = arguments; for (var i = 1; i < arg.length; i++) { if (typeof str == code.STRING && str.lastIndexOf(arg[i]) > 0 && str.lastIndexOf(arg[i]) + arg[i].length == str.length) { return true } } }, trimPrefix: function(str, pre) { if (typeof str != code.STRING) { return str } var arg = arguments, callee = arg.callee if (arg.length > 2) { for (var i = 1; i < arg.length; i++) { str = callee(str, arg[i]) } return str } diff --git a/lib/misc.js b/lib/misc.js index 9d515d92..d9f100e3 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -195,7 +195,10 @@ Volcanos("misc", { }, sessionStorage: function(can, key, value) { if (can.base.isUndefined(key)) { var res = {}; can.core.Item(sessionStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res } - if (!can.base.isUndefined(value)) { if (value === "") { return sessionStorage.removeItem(key) } sessionStorage.setItem(key, value) } return can.base.Obj(sessionStorage.getItem(key)) + if (can.base.isArray(key)) { key = key.join(":") } + if (!can.base.isUndefined(value)) { + if (value === "") { return sessionStorage.removeItem(key) } sessionStorage.setItem(key, value) + } return can.base.Obj(sessionStorage.getItem(key)) }, Log: function() { var args = this._args("", arguments) if (arguments[0].indexOf && arguments[0].indexOf("on") == 0) { args[1] = this.FileLine((arguments[0] == "onremote"? 4: 2)+this._skip) } diff --git a/lib/page.js b/lib/page.js index ab0b0071..4575fa33 100644 --- a/lib/page.js +++ b/lib/page.js @@ -178,7 +178,7 @@ Volcanos("page", { 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.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.table) + })); return can.page.OrderTable(can, ui._target) }, OrderTable: function(can, table) { can.page.Select(can, table, html.TH, function(th, index) { th.onclick = function(event) { var dataset = event.target.dataset can.page.RangeTable(can, table, index, (dataset["asc"] = (dataset["asc"] == "1") ? 0: 1) == "1") diff --git a/lib/user.js b/lib/user.js index 4226f0b9..666c5025 100644 --- a/lib/user.js +++ b/lib/user.js @@ -123,7 +123,8 @@ Volcanos("user", { meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta)); if (!list || list.length == 0) { return } function click(event, button) { can.misc.Event(event, can, function() { can.onkeymap.prevent(event), can.request(event, {action: button}) meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}): can.base.isFunc(cb)? cb(event, button, meta, carte): - can.onaction && can.onaction[button] && can.core.CallFunc([can.onaction, button], [event, can, button]) + can.Update(event, [ctx.ACTION, button]) + // can.onaction && can.onaction[button] && can.core.CallFunc([can.onaction, button], [event, can, button]) // meta._style == nfs.PATH || can.onmotion.clearCarte(can) }) } var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, meta._style||can.base.replaceAll(can._index||"", nfs.PT, lex.SP)||"", chat.FLOAT]], list: can.core.List(list, function(item, index) { @@ -135,7 +136,7 @@ Volcanos("user", { 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) }, carte, trans); can.onlayout.figure(event, can, sub._target, true), carte._sub = sub } - return item === ""? /* 0.space */ {type: html.HR}: can.base.isString(item)||can.base.isNumber(item)? /* 1.string */ {view: [html.ITEM, html.DIV, meta._style == ice.CMD? item: can.user.trans(can, item, trans)], onclick: function(event) { click(event, item) }, onmouseenter: function(event) { remove_sub(carte) } }: + return item === ""? /* 0.space */ {type: html.HR}: can.base.isString(item)||can.base.isNumber(item)? /* 1.string */ {view: [[html.ITEM, item], html.DIV, meta._style == ice.CMD? item: can.user.trans(can, item, trans)], onclick: function(event) { click(event, item) }, onmouseenter: function(event) { remove_sub(carte) } }: can.base.isArray(item)? /* 2.array */ {view: html.ITEM, list: [{text: can.user.trans(can, item[0], trans)}, {text: [lex.SP+can.page.unicode.next, "", [html.ICON, "next"]]}], onmouseenter: subs, onclick: subs}: /* 3.object */ item })}]); can.onkeymap.prevent(event), can.page.Select(can, ui._target, html.IMG, function(target) { target.onload = function() { can.onlayout.figure(event, can, ui._target) } }) var carte = {_target: ui._target, _parent: parent, layout: can.onlayout.figure(event, can, ui._target, false, 200), close: function() { can.page.Remove(can, ui._target) }} diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 12bed9e8..ccdcc3c3 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -25,7 +25,7 @@ fieldset.inner>div.output>div.project>div.zone div.action>div.item>span.delete { fieldset.inner>div.output>div.project>div.zone fieldset.plug { position:static; } fieldset.inner>div.output>div.layout>div.tabs { font-size:14px; display:none; } fieldset.inner>div.output>div.layout>div.path { font-size:14px; display:none; } -fieldset.inner>div.output>div.layout>div.layout div.content * { font-family:monospace; font-size:14px; outline:none; } +fieldset.inner>div.output>div.layout>div.layout>div.content * { font-family:monospace; font-size:14px; outline:none; } fieldset.inner>div.output>div.layout>div.layout>div.profile { max-width:unset; box-shadow:var(--box-shadow); } fieldset.inner>div.output>div.layout>div.layout>div.profile h1 { text-align:left; padding:10px 0; margin:20px 0; border-bottom:var(--box-border); } fieldset.inner>div.output>div.layout>div.layout>div.profile h2 { padding:10px 0; margin:20px 0; border-bottom:var(--box-border); } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 03493a60..fc963057 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -334,6 +334,9 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { var key = can.onexport. p.keyword = p.keyword||{}, can.core.Item(can.onsyntax[from].keyword, function(key, value) { p.keyword[key] = p.keyword[key] || value }) can.core.Item(can.onsyntax[from], function(key, value) { p[key] = p[key] || value }) }) + p && p.prepare && can.core.ItemForm(p.prepare, function(value, index, key) { + p.keyword = p.keyword||{}, p.keyword[value] = key + }) if (!content._root && can.db.history.length > 1) { content = can.ui.content = can.page.insertBefore(can, [{view: html.CONTENT, style: {width: can.ui.content.offsetWidth}}], can.ui._profile), content._cache_key = key } content._max = 0, content._msg = msg, msg.__content = content, can.page.Appends(can, content, [{view: ["tips", "", msg.Option(nfs.FILE)]}]) if (msg.Length() > 0) { can.onsyntax._change(can, msg), can.onaction.rerankLine(can, "tr.line:not(.delete)>td.line") diff --git a/plugin/state.js b/plugin/state.js index 30122a2f..02184f67 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -62,11 +62,8 @@ Volcanos(chat.ONACTION, {list: [ "生成脚本", "生成图片", ["视图", "参数", "操作", "状态", "专注", "项目", "预览", "演示"], ["数据", "保存参数", "清空参数", "复制数据", "下载数据", "清空数据", "删除工具"], - ["调试", "打包页面", "查看文档", "查看脚本", "查看源码", "_config", "查看日志"], + ["调试", "打包页面", "查看文档", "查看脚本", "查看源码", "查看配置", "查看日志"], ], - _trans: { - "_config": "查看配置", - }, _engine: function(event, can, button) { can.Update(event, [ctx.ACTION, button].concat(can.Input())) }, _switch: function(can, sub, mode, save, load) { if (can.page.ClassList.neg(can, can._target, mode)) { @@ -124,8 +121,8 @@ Volcanos(chat.ONACTION, {list: [ "打包页面": function(event, can) { can.onengine.signal(can, "onwebpack", can.request(event)) }, "查看文档": function(event, can) { can.onengine.signal(can, "ondebugs", can.request(event, {action: ice.HELP, index: can.Conf(ctx.INDEX)})) }, "查看脚本": function(event, can) { can.onengine.signal(can, "ondebugs", can.request(event, {action: nfs.SCRIPT, index: can.Conf(ctx.INDEX)})) }, - "查看源码": function(event, can) { can.onengine.signal(can, "ondebugs", can.request(event, {action: nfs.SOURCE, index: can.Conf(ctx.INDEX)})) }, - "_config": function(event, can) { can.onengine.signal(can, "ondebugs", can.requestPodCmd(event)) }, + "查看源码": function(event, can) { can.request(event).Option(ctx.ACTION, nfs.SOURCE), can.onengine.signal(can, "ondebugs", can.requestPodCmd(event)) }, + "查看配置": function(event, can) { can.request(event).Option(ctx.ACTION, ctx.CONFIG), can.onengine.signal(can, "ondebugs", can.requestPodCmd(event)) }, "查看日志": function(event, can) { var sub = can.sub; sub.onimport.tool(sub, ["can.debug"], function(sub) { sub.select() }) }, refresh: function(event, can) { can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), true, can.Mode()) }, diff --git a/plugin/table.js b/plugin/table.js index abb4d911..a858c841 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -1,6 +1,5 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(can, target) if (can.Mode() == html.ZONE) { return can.onimport._vimer_zone(can, msg, target) } - can.sup.onimport.size(can.sup, can.sup.ConfHeight(), can.sup.ConfWidth(), true) var cbs = can.onimport[can.Conf(ctx.STYLE)||msg.Option(ctx.STYLE)]; if (can.base.isFunc(cbs)) { can.onappend.style(can, can._args[ctx.STYLE], target), can.core.CallFunc(cbs, {can: can, msg: msg, target: target}) @@ -105,8 +104,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( }}, "", target) }, item: function(can, item, cb, cbs, target) { target = target||(can.ui && can.ui.project? can.ui.project: can._output) - var ui = can.page.Append(can, target, [{view: html.ITEM, list: [{icon: item.icon}, {text: item.nick||item.name||item.zone}], title: item.title, onclick: function(event) { can.onmotion.select(can, target, html.DIV_ITEM, event.target) - cb(event, event.target, event.target._list && can.onmotion.toggle(can, event.target._list)) + var ui = can.page.Append(can, target, [{view: html.ITEM, list: [{icon: item.icon}, {text: item.nick||item.name||item.zone}], title: item.title, onclick: function(event) { + can.onmotion.select(can, target, html.DIV_ITEM, event.currentTarget) + cb(event, event.currentTarget, event.currentTarget._list && can.onmotion.toggle(can, event.currentTarget._list)) }, oncontextmenu: function(event) { if (can.base.isFunc(cbs)) { var menu = cbs(event, ui._target); if (menu) { can.user.carteRight(event, can, menu.meta, menu.list, menu) } return } can.user.carteItem(event, can, item) @@ -115,7 +115,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( }, itemlist: function(can, list, cb, cbs, target) { return target._list = can.page.insertBefore(can, [{view: html.LIST, list: can.core.List(list, function(item) { - return {view: [html.ITEM, html.DIV, item.name], onclick: function(event) { + return {view: [html.ITEM, html.DIV, item.nick||item.name], onclick: function(event) { cb(event, item, event.target._list && can.page.ClassList.neg(can, event.target._list, html.HIDE)) }, oncontextmenu: function(event) { if (can.base.isFunc(cbs)) { var menu = cbs(event, ui._target); if (menu) { can.user.carteRight(event, can, menu.meta, menu.list, menu) } } }} }) }], target.nextSibling, target.parentNode) @@ -133,11 +133,13 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( var next = target.nextSibling||target.previousSibling; if (!next) { return } next.click() } cbs && cbs(tabs), can.page.Remove(can, target) } - return {view: html.TABS, title: tabs.text, list: [{text: [tabs.name, html.SPAN, mdb.NAME]}, {icon: mdb.DELETE, onclick: function(event) { + return {view: html.TABS, title: tabs.title||tabs.text, list: [{text: [tabs.nick||tabs.name, html.SPAN, mdb.NAME]}, {icon: mdb.DELETE, onclick: function(event) { close(tabs._target), can.onkeymap.prevent(event) }}], onclick: function(event) { can.onmotion.select(can, action, html.DIV_TABS, tabs._target), can.base.isFunc(cb) && cb(event, tabs) - }, _init: function(target) { var menu = tabs._menu||shy(); tabs._target = target, target._close = function() { close(target) } + }, _init: function(target) { var menu = tabs._menu||shy(function(event, button) { can.Update(event, [ctx.ACTION, button]) }) + target._item = tabs, tabs._target = target, target._close = function() { close(target) } + var action = can.page.parseAction(can, tabs) can.page.Modify(can, target, {draggable: true, _close: function() { close(target) }, ondragstart: function(event) { action._drop = function(before) { before.parentNode == action && action.insertBefore(target, before) } }, ondragover: function(event) { event.preventDefault(), action._drop(event.target) }, @@ -147,7 +149,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( "Rename Tabs", function(event) { can.user.input(event, can, [mdb.NAME], function(list) { can.page.Select(can, target, "span.name", function(target) { can.page.Modify(can, target, list[0]||tabs.name) }) }) }, menu.meta, - ), ["Close", "Close Other", "Rename Tabs", ""].concat(can.base.getValid(menu.list, can.core.Item(menu.meta))), function(event, button, meta) { (meta[button]||menu)(event, button, meta) }) }, + ), ["Close", "Close Other", "Rename Tabs", ""].concat(can.base.getValid(menu.list, can.core.Item(menu.meta)), action), function(event, button, meta) { + (meta[button]||menu)(can.request(event, tabs), button, meta) + }) }, }), target.click() }} }))._target }, @@ -195,8 +199,5 @@ Volcanos(chat.ONEXPORT, { }, board: function(can) { var msg = can._msg; return msg.Result() }, session: function(can, key, value) { return can.misc[can.user.isWebview? "localStorage": "sessionStorage"](can, [can.Conf(ctx.INDEX), key, location.pathname].join(":"), value == ""? "": JSON.stringify(value)) }, - action_value: function(can, key, def) { var value = can.Action(key) - if (can.base.isIn(value, ice.AUTO, key)) { value = def } - return value - }, + action_value: function(can, key, def) { var value = can.Action(key); return can.base.isIn(value, ice.AUTO, key)? def: value }, }) diff --git a/proto.js b/proto.js index a1e0ffa8..503b2f38 100644 --- a/proto.js +++ b/proto.js @@ -101,6 +101,8 @@ var Volcanos = shy({ ConfDefault: function(value) { can.core.Item(value, function(k, v) { can.Conf(k) || can.Conf(k, v) }) }, ConfHeight: function(value) { return can.Conf(html.HEIGHT, value) }, ConfWidth: function(value) { return can.Conf(html.WIDTH, value) }, + ConfSpace: function() { return can.Conf(web.SPACE) }, + ConfIndex: function() { return can.Conf(ctx.INDEX) }, Conf: function(key, value) { var res = can._conf for (var i = 0; i < arguments.length; i += 2) { if (typeof key == code.OBJECT) { res = can.core.Value(can._conf, arguments[i]), i--; continue }