diff --git a/frame.js b/frame.js index 57735461..b4bbb8e3 100644 --- a/frame.js +++ b/frame.js @@ -98,7 +98,7 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, listen: shy("监听事件", {}, [], function(can, name, cb) { arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) }), signal: shy("触发事件", function(can, name, msg) { msg = msg||can.request() can.misc.Log(gdb.SIGNAL, name, name == chat.ONREMOTE? msg.Option("_msg"): msg) - can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {event: msg._event, msg: msg}) }) + return can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {event: msg._event, msg: msg}) }).length }), }) Volcanos("ondaemon", {help: "推荐引擎", list: [], _init: function(can, name) { if (can.user.isLocalFile) { return } @@ -417,6 +417,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }} }); table && can.page.Modify(can, table, {className: chat.CONTENT}) if (msg.append && msg.append[msg.append.length-1] == "action") { can.page.ClassList.add(can, table, "action") } + can._table = table, can.sup && (can.sup._table = table) return sort && can.page.RangeTable(can, table, sort), table }, board: function(can, text, target) { text && text.Result && (text = text.Result()); if (!text) { return } @@ -428,124 +429,6 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }) return (code.scrollBy && code.scrollBy(0, 10000)), code }, - parse: function(can, list, target, type, data) { target = target||can._output, data = data || {} - if (!list) { return } else if (can.base.isArray(list)) { - return can.core.List(list, function(meta) { return can.onappend.parse(can, meta, target, type, data) }) - - } else if (can.base.isString(list)) { - var ls = can.core.Split(list, "", ":="); if (ls.length == 1) { - var meta = type? {type: type, name: ls[0]}: {type: ls[0]} - } else { - var meta = {name: ls[0]}; for (var i = 1; i < ls.length; i += 2) { switch (ls[i]) { - case ":": meta.type = ls[i+1]; break - case "=": meta.value = ls[i+1]; break - } } - } - - } else if (can.base.isObject(list)) { var meta = list } - - var item = {view: meta.type}, init; switch (meta.type) { - case "head": data = {} - init = function(target) { - data.head = target - can.page.ClassList.add(can, target, "layout") - } - break - case "left": - init = function(target) { - can.page.ClassList.add(can, target, "layout") - can.core.Timer(10, function() { - var height = target.parentNode.offsetHeight - can.page.Select(can, target.parentNode, "div.layout.head", function(item) { - height -= item.offsetHeight - }) - can.page.Select(can, target.parentNode, "div.layout.foot", function(item) { - height -= item.offsetHeight - }) - can.page.style(can, target, html.HEIGHT, height) - }) - } - break - case "main": - init = function(target) { - data.main = target - var width = target.parentNode.offsetWidth - can.page.Select(can, target.parentNode, "div.layout.left", function(item) { - width -= item.offsetWidth+1 - }) - can.page.style(can, target, html.HEIGHT, height, html.WIDTH, width) - - can.core.Timer(10, function() { - var height = target.parentNode.offsetHeight - can.page.Select(can, target.parentNode, "div.layout.head", function(item) { - height -= item.offsetHeight - }) - can.page.Select(can, target.parentNode, "div.layout.foot", function(item) { - height -= item.offsetHeight - }) - can.page.style(can, target, html.HEIGHT, height) - }) - } - break - case "foot": - init = function(target) { - can.page.ClassList.add(can, target, "layout") - } - break - case "tabs": - var height = target.offsetHeight - item.list = [{view: "name"}, {view: "page", style: {width: 240}}], item._init = function(_target, ui) { - can.core.Timer(100, function() { - var height = target.offsetHeight - can.page.style(can, _target, html.HEIGHT, height-10) - can.page.style(can, ui.page, html.HEIGHT, height-10-(meta.style? 0: ui.name.offsetHeight)) - }) - can.page.Append(can, ui.page, [{view: "input", list: [{type: "input", onkeyup: function(event) { - can.page.Select(can, _target, ["div.page", html.DIV_ITEM], function(item) { - can.page.ClassList.set(can, item, "hide", item.innerText.indexOf(event.target.value) == -1) - }) - }}]}]) - can.core.List(meta.list, function(item, index) { - can.page.Append(can, ui.name, [{view: ["item", html.DIV, item.name||item], onclick: function(event) { - can.onmotion.select(can, _target, [["div.page", "div.list"]], index) - can.onmotion.select(can, ui.name, html.DIV_ITEM, index) - ui.page.scrollTo(0, 0) - }}]) - can.page.Append(can, ui.page, [{view: ["item", html.DIV, item.name], onclick: function(event) { - can.page.ClassList.neg(can, event.target.nextSibling, html.SELECT) - can.onmotion.select(can, ui.name, html.DIV_ITEM, index) - }}, {view: ["list"], _init: function(target) { can.onappend.parse(can, item.list, target, "item", data) }}]) - }) - can.page.Select(can, ui.name, html.DIV_ITEM)[0].click() - } - break - case "plugin": - break - default: - } - - item._init = item._init||function(target) { meta.list && can.onappend.parse(can, meta.list, target, type, data), can.base.isFunc(init) && init(target) } - if (can.base.isString(meta.style)) { item.className = meta.style } - if (can.base.isObject(meta.style)) { item.style = meta.style } - if (type == "item") { - can.page.Append(can, target, [{view: ["item", "div", meta.name||meta], onclick: function(event) { - switch (meta.type) { - case "plugin": - can.onappend.plugin(can, {index: meta.index}, function(sub) { - sub.ConfWidth(data.main.offsetWidth) - sub.run = function(event, cmds, cb, silent) { - can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true) - } - }, data.main) - default: - meta.list && can.onmotion.toggle(can, event.target.nextSibling) - } - }}]) - if (!meta.list) { return } - item.view = "list" - } - return can.page.Append(can, target, [item]).first - }, _plugin: function(can, value, meta, cb, target) { meta.feature = can.base.getValid(meta.feature, can.base.Obj(value.meta))||{} diff --git a/lib/page.js b/lib/page.js index f2fe3ce5..afc9d682 100644 --- a/lib/page.js +++ b/lib/page.js @@ -200,12 +200,14 @@ Volcanos("page", {help: "用户界面", ClassList: { if (!msg.append||msg.append.length == 0) {return} var table = can.page.Append(can, target, html.TABLE) - can.page.Append(can, table, [{type: html.TR, data: {dataset: {index: -1}}, list: + var thead = can.page.Append(can, table, "thead") + var tbody = can.page.Append(can, table, "tbody") + can.page.Append(can, thead, [{type: html.TR, data: {dataset: {index: -1}}, list: can.core.List(list, function(key) { return key[0] == "_"? undefined: {text: [key.trim(), html.TH]} }) }]) - can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) { + can.page.Append(can, tbody, can.core.List(msg.Table(), function(line, index, array) { var _list = can.core.List(list, function(key) { if (key.indexOf("_") == 0) { return } return cb(can.page.Color(line[key]).trim(), key, index, line, array) }) diff --git a/lib/user.js b/lib/user.js index 59affb02..92561085 100644 --- a/lib/user.js +++ b/lib/user.js @@ -204,16 +204,21 @@ Volcanos("user", {help: "用户操作", agent: { var ui = can.page.Append(can, document.body, [{view: chat.CARTE, style: {left: 0, top: 0}, onmouseleave: function(event) { // can.page.Remove(can, ui._target) }, list: can.core.List(list, function(item, index) { - return can.base.isString(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item), click: function(event) { + return can.base.isString(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item), onclick: function(event) { can.user.isMobile && can.page.Remove(can, ui._target) can.base.isFunc(cb) && cb(event, item, meta, index) }, onmouseenter: function(event) { carte._float && can.page.Remove(can, carte._float._target) - } }] }: {view: html.ITEM, list: [{text: can.user.trans(can, item[0])+" -> "}], onmouseenter: function(event) { + } }] }: can.base.isArray(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item[0])+" -> "}], onmouseenter: function(event) { var sub = can.user.carte(event, can, meta, item.slice(1), cb, carte) carte._float && can.page.Remove(can, carte._float._target), carte._float = sub can.onlayout.figure(event, can, sub._target, true) - } } + } }: {view: html.ITEM, list: [{text: can.user.trans(can, item.name), onclick: function(event) { + can.user.isMobile && can.page.Remove(can, ui._target) + can.base.isFunc(cb) && cb(event, item.name, meta, index) + }, onmouseenter: function(event) { + carte._float && can.page.Remove(can, carte._float._target) + } }] } }) }] ) ui._target.onmouseover = function(event) { can.onkeymap.prevent(event) } diff --git a/page/index.css b/page/index.css index cfe2344f..1bed1bdb 100644 --- a/page/index.css +++ b/page/index.css @@ -33,7 +33,7 @@ table.content tr.show { background-color:red; } table.content th { background-color:#0fbd45; padding:2px 6px; } table.content td { padding:2px 6px; } table.content.action td:last-child, table.content.action th:last-child { background-color:#7dc6d7eb; position:sticky; right:0; } -table.content tr:first-child { position:sticky; top:2px; } +table.content thead { position:sticky; top:-1px; } td>input[type=button][name=create] { background-color:blue; } td>input[type=button][name=remove] { background-color:red; } diff --git a/panel/action.css b/panel/action.css index 49ea5e27..78e5544d 100644 --- a/panel/action.css +++ b/panel/action.css @@ -32,117 +32,3 @@ div.output.form div.item div.label { margin:5px 0px; } -div.head { - height:32px; - background-color:#404040; - clear:both; -} -div.left { - background-color:blue; float:left; -} -div.main { - background-color:#cccccc; height:180px; width:180px; float:left; - overflow:auto; -} -div.foot { - height:32px; clear:both; - background-color:#404040; -} - - -div.left { - overflow:auto; - background-color:#323232; -} -div.left:hover { - background-color:#323232; -} -div.left div.item:hover { - background-color:#404040; -} -div.left div.item { - background-color:#323232; -} -div.tabs:hover { - background-color:#272727; -} -div.tabs div.list.select { - background-color:#323232; -} -div.tabs div.name { - float:left; - position:sticky; - top:5px; -} -div.tabs div.name div.item { - float:left; - padding:10px; - color:gray; -} -div.tabs div.name div.item.select { - background-color:#404040; - /* background-color:red; */ - border-bottom:solid red 2px; - color:white; - -} -div.tabs div.page { - overflow:auto; - clear:both; -} -div.tabs div.page>div.input { - position:sticky; - padding:5px; - top:0px; -} -div.tabs div.page>div.input input { - color:white; - background-color:#212121; - width:230px; - border:0; -} -div.tabs div.page>div.input input:focus { - border:0; - outline:none; -} -div.tabs div.page>div.item { - display:none; clear:both; - background-color:#404040; -} -div.tabs div.page>div.list { - clear:both; -} -div.tabs div.page>div.list { - display:none; -} -div.tabs div.page>div.list.select { - display:block; -} -div.tabs div.page div.list { - padding-left:20px; -} - -div.tabs.left div.name { - float:left; -} -div.tabs.left div.name div.item.select { - border-right:solid red 2px; -} -div.tabs.left div.name div.item { - float:none; - border-bottom:none; -} -div.tabs.left div.page { - float:left; - clear:none; -} -div.tabs.left div.page>div.item { - display:block; -} - -div.tabs.void div.name { - display:none; -} -div.tabs.void div.page>div.item { - display:block; -} diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 515ca7be..3292b9d5 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -72,6 +72,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) }, cli.SHOW, function(event) { can.onaction["展示"](event, can) }, "加载", function(event) { can.onaction["加载"](event, can), can.user.toastSuccess(can) }, + "链接", function(event) { can.user.open(can.base.Path("/chat/cmd/", can.Option(nfs.PATH), can.Option(nfs.FILE))) }, mdb.PLUGIN, function(event) { can.user.input(event, can, [ctx.INDEX, ctx.ARGS], function(event, button, data) { can.onimport.plugin(can, data, ui.output) diff --git a/plugin/table.js b/plugin/table.js index 4ada0a73..1086b7d1 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -1,13 +1,14 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) { can.user.isMobile && !can.user.isLandscape() && can.onmotion.hidden(can, can._action) - can.onmotion.clear(can, target), can.base.isFunc(cb) && cb(msg) var cbs = can.onimport[can._args["style"]]; if (can.base.isFunc(cbs)) { can.page.ClassList.add(can, target, can._args["style"]) return cbs(can, msg, target) } + can.onmotion.clear(can, target) can.onappend.table(can, msg, null, target) can.onappend.board(can, msg, target) can.onmotion.story.auto(can, target) + can.base.isFunc(cb) && cb(msg) }, _process: function(can, msg) { diff --git a/proto.js b/proto.js index 1ea13103..bf1b9239 100644 --- a/proto.js +++ b/proto.js @@ -238,6 +238,20 @@ var html = { DIV_ITEM: "div.item", DIV_FLOAT: "div.float", TABS: "tabs", DIV_TABS: "div.tabs", HIDE: "hide", SHOW: "show", + + HEAD: "head", LEFT: "left", MAIN: "main", FOOT: "foot", + TABS: "tabs", MENU: "menu", + LIST: "list", ITEM: "item", + PAGE: "page", + HIDE: "hide", + LAYOUT: "layout", + PLUGIN: "plugin", + DIV_PAGE: "div.page", + DIV_LIST: "div.list", + DIV_ITEM: "div.item", + DIV_LAYOUT_HEAD: "div.layout.head", + DIV_LAYOUT_LEFT: "div.layout.left", + DIV_LAYOUT_FOOT: "div.layout.foot", } var lang = { UNDEFINED: "undefined",