diff --git a/frame.js b/frame.js index e5ea4667..ce59f1b3 100644 --- a/frame.js +++ b/frame.js @@ -1,5 +1,9 @@ var _can_name = "/frame.js" Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, list, cb, target) { + can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds || [] + return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb) + } + can.core.Next(list, function(item, next) { item.type = "panel" can.onappend._init(can, item, item.list, function(panel) { panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds || [] @@ -41,6 +45,10 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, return can.base.isFunc(cb) && cb(msg) } + can.search(can.request({}, { + time: can.base.Time(null, "%H:%M:%S"), follow: panel._follow, msg: msg, commands: cmds, + })._event, ["Footer.onimport.ncmd"]) + can.misc.Run(event, can, {names: (can.Conf("iceberg")||"/chat/")+panel._name, daemon: can.ondaemon._list[0]+"."+msg._daemon}, cmds, function(msg) { Volcanos.meta.pack[key] = msg, delete(msg._handle), delete(msg._toast) can.base.isFunc(cb) && cb(msg) @@ -148,36 +156,24 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"") sub.page.ClassList.add(sub, field, meta.index? meta.index.split(".").pop(): meta.name) - can.base.isFunc(cb) && cb(sub) - meta.option = can.base.Obj(meta.option||"{}", {}) - meta.inputs && sub.onappend._option(sub, meta, sub._option) - sub.page.Modify(sub, sub._legend, { onmouseenter: function(event) { sub.user.carte(event, sub, sub.onaction, sub.onaction.list) }, }) + + meta.inputs && sub.onappend._option(sub, meta, sub._option) + can.base.isFunc(cb) && cb(sub) }); return sub }, _option: function(can, meta, option) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []) function add(item, next) { item._input != "button" && item.type != "button" && index++ - Volcanos(item.name, {_follow: can._follow+"."+item.name, + Volcanos(item.name, {_follow: can.core.Keys(can._follow, item.name), _target: can.onappend.input(can, item, args[index], option), _option: can._option, _action: can._action, _output: can._output, _status: can._status, - // _target: can.onappend.input(can, item, args[index]||meta.option[item.name], option), - _target: can.onappend.input(can, item, args[index], option), Option: can.Option, Action: can.Action, Status: can.Status, - CloneInput: function() { add(item)._target.focus() }, - CloneField: function() { can.Clone() }, + CloneInput: function() { add(item)._target.focus() }, CloneField: function() { can.Clone() }, }, [item.display||"/plugin/input.js"].concat(Volcanos.meta.volcano, Volcanos.meta.libs), function(input) { - input.Conf(item), input.sup = can, input.run = function(event, cmds, cb, silent) { - var msg = can.request(event) - var sub = can.core.Value(can, "_outputs.-1") - if (msg.Option("_handle") != "true" && sub && cmds && cmds[0] == "action" && sub.onaction && sub.onaction[cmds[1]]) { - msg.Option("_handle", "true") - return sub.onaction[cmds[1]](event, sub) - } - + input.Conf(item), input.sup = can, input.run = function(event, cmds, cb, silent) { var msg = can.request(event) if (msg.Option("_handle") != "true" && cmds && cmds[0] == "action" && input.onaction[cmds[1]]) { - msg.Option("_handle", "true") - return input.onaction[cmds[1]](event, input) + return msg.Option("_handle", "true"), can.core.CallFunc(input.onaction[cmds[1]], {event: event, can: input, msg: msg}) } return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) @@ -217,28 +213,18 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return can.onaction[cmds[1]](event, can, cmds[1]) } - can._daemon == undefined && (can._daemon = can.ondaemon._list.push(can)-1) - msg._daemon = msg._daemon||can._daemon - var feature = can.Conf("feature") var input = msg.Option("_handle") != "true" && cmds && cmds[0] == "action" && feature && feature[cmds[1]]; if (input) { - can.user.input(event, can, input, function(ev, button, data, list) { - cmds = cmds.slice(0, 2), can.core.Item(data, function(key, value) { - key && value && cmds.push(key, value) - }) - - var msg = can.request(event, can.Option()); msg.Option("_handle", "true") - can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1") - if (can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return } - if (can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return } - can.base.isFunc(cb) && cb(msg) - }) + can.user.input(event, can, input, function(ev, button, data, list, args) { + var msg = can.request(event, {_handle: "true"}, can.Option()) + can.onappend._output(can, meta, event, cmds.slice(0, 2).concat(args), cb, true) }) return } - return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1") - can._msg = msg + can._daemon == undefined && (can._daemon = can.ondaemon._list.push(can)-1), msg._daemon = msg._daemon||can._daemon + + return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg if (can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return } if (can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return } if (can.base.isFunc(cb) && can.core.CallFunc(cb, {can: can, msg: msg})) { return } @@ -246,16 +232,13 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, var display = msg.Option("_display") || meta.display || meta.feature.display || "/plugin/table.js" - Volcanos(display, {_follow: can._follow+"."+display, + Volcanos(display, {_follow: can._follow+"."+display, _target: can._output, _fields: can._target, _option: can._option, _action: can._action, _output: can._output, _status: can._status, - _target: can._output, _fields: can._target, Option: can.Option, Action: can.Action, Status: can.Status, }, [display].concat(Volcanos.meta.volcano, Volcanos.meta.libs), function(table) { - table.Conf(can.Conf()), table.sup = can, table.run = function(event, cmds, cb, silent) { - var msg = can.request(event) + table.Conf(can.Conf()), table.sup = can, table.run = function(event, cmds, cb, silent) { var msg = can.request(event) if (msg.Option("_handle") != "true" && cmds && cmds[0] == "action" && table.onaction[cmds[1]]) { - msg.Option("_handle", "true") - return table.onaction[cmds[1]](event, table) + return msg.Option("_handle", "true"), can.core.CallFunc(table.onaction[cmds[1]], {event: event, can: table, msg: msg}) } return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) @@ -264,19 +247,11 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function(msg) { can.page.Modify(can, can._action, ""), can.page.Modify(can, can._status, "") table.onaction && table.onappend._action(table, can.base.Obj(msg.Option("_action"), meta._action||table.onaction.list)) - table.ondetail && table.onappend._detail(table, can.base.Obj(msg.Option("_detail"), meta._detail||table.ondetail.list)) table.onexport && table.onappend._status(table, can.base.Obj(msg.Option("_status"), meta._export||table.onexport.list)) }, can._output) }) }) }, - _detail: function(can, list, target) { target = target || can._output - list.length > 0 && (target.oncontextmenu = function(event) { - can.user.carte(event, can, can.ondetail||can.onaction||{}, list, function(ev, item, meta) { - (can.ondetail[item]||can.onaction[item])(event, can, item) - }) - }) - }, _status: function(can, list, status) { status = status || can._status can.core.List(list, function(item) { item = typeof item == "object"? item: {name: item} can.page.Append(can, status, [{view: "item "+item.name, title: item.name, list: [ @@ -419,18 +394,18 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, meta.name = meta.name||value.name||"story" meta.help = meta.help||value.help||"story" - meta.width = meta.width||can.Conf("width") - meta.height = meta.height||can.Conf("height") meta.type = meta.type||"story" + meta.width = meta.width||can.Conf("width") + meta.height = meta.height||can.Conf("height") + can.onappend._init(can, meta, ["/plugin/state.js"], function(sub) { - meta.type == "story" && sub.page.Remove(sub, sub._legend) sub.base.isFunc(cb) && cb(sub, meta) }, target||can._output) }, plugin: function(can, meta, cb, target) { meta = meta || {} meta.inputs && meta.inputs.length > 0? can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cb, target): - can.run({}, ["action", "command", meta.index||meta.ctx+"."+meta.cmd], function(msg) { msg.Table(function(value) { + can.run({}, ["action", "command", meta.index||can.core.Keys(meta.ctx, meta.cmd)], function(msg) { msg.Table(function(value) { can.onappend._plugin(can, value, meta, cb, target) }) }, true) }, @@ -443,39 +418,60 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.base.isFunc(cb) && cb(sub) }, target) }, + + float: function(can, msg, cb) { + var ui = can.onappend.field(can, "story toast float", {}, document.body) + + can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) { + can.page.Modify(can, ui.output, {style: {"max-width": width, "max-height": height-28}}) + can.page.Modify(can, ui.first, {style: {top: top, left: left}}) + }) + + can.onappend._action(can, ["关闭", "刷新"], ui.action, { + "关闭": function(event) { can.page.Remove(can, ui.first) }, + "刷新": function(event) { can.page.Remove(can, ui.first), can.toast.click() }, + }) + can.onappend.table(can, msg, function(value, key, index, line, list) { + return {text: [value, "td"], onclick: function(event) { + can.base.isFunc(cb) && cb(value, key, index, line, list) + }} + }, ui.output) + return ui + }, }, [], function(can) {}) -Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, target) { target = document.body +Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, target) { target = target||document.body + var list = []; document.body.onresize = function() { + can.core.Delay(list, 1000, function() { can.onlayout._init(can, target) }) + } + var width = window.innerWidth, height = window.innerHeight - can.user.isMobile && can.page.ClassList.add(can, target, "mobile") - can.user.isMobile && can.page.ClassList.set(can, target, "landscape", width > height) - - document.body.onresize = function() { can.onlayout._init(can, target) } - can.page.Select(can, target, ["fieldset.head", "fieldset.foot"], function(field) { height -= field.offsetHeight }) can.page.Select(can, target, "fieldset.left", function(field, index) { - can.page.Modify(can, field, {style: {height: height}}) can.user.isMobile || (width -= field.offsetWidth) - }) - can.page.Select(can, target, "fieldset.left>div.output", function(output) { - can.page.Modify(can, output, {style: {height: height-32}}) + + can.page.Modify(can, field, {style: {height: height}}) + can.page.Select(can, target, "fieldset.left>div.output", function(output) { + can.page.Modify(can, output, {style: {height: height-32}}) + }) }) - if (can.user.isMobile) { - can.page.Select(can, target, "fieldset.main", function(field, index) { - can.user.isMobile && can.page.Modify(can, field, {style: {"padding-top": width > height? "0px": ""}}) - }) - } else { - can.page.Select(can, target, "fieldset.main", function(field, index) { + can.page.Select(can, target, "fieldset.main", function(field, index) { + if (can.user.isMobile) { + can.page.Modify(can, field, {style: {"padding-top": can.user.isLandscape? "0px": ""}}) + } else { + height -= can.page.Select(can, field, "div.action")[0].offsetHeight + can.page.Modify(can, field, {style: {height: height}}) - }) - can.page.Select(can, target, "fieldset.main>div.output", function(output) { - can.page.Modify(can, output, {style: {height: height}}) - }) - } - can.onengine.signal(can, "resize", can.request({}, {width: width, height: height})) + can.page.Select(can, target, "fieldset.main>div.output", function(output) { + can.page.Modify(can, output, {style: {height: height}}) + }) + } + }) + + can.onengine.signal(can, "onresize", can.request({}, {width: width, height: height})) }, topic: function(can, topic) { topic && (can._topic = topic) can.user.topic(can, can._topic || can.user.Search(can, "topic") || ((can.user.Search(can, "pod")||can.base.isNight())? "black": "white")) @@ -693,6 +689,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe layout.left = begin.left + event.x - begin.x can.page.Modify(can, target, {style: {left: layout.left, top: layout.top}}) } + event.stopPropagation(), event.preventDefault() } }, show: function(can, time, cb, target) { target = target || can._target diff --git a/lib/core.js b/lib/core.js index 8f907186..a8d5d06c 100644 --- a/lib/core.js +++ b/lib/core.js @@ -138,7 +138,13 @@ Volcanos("core", {help: "数据结构", }, i, list): typeof cbs == "function" && cbs(list) } - list = typeof list == "object"? list: [list] + switch (typeof list) { + case "undefined": list = []; break + case "object": break + default: list = [list] + + } + list && list.length > 0 && typeof cb == "function"? next(0): typeof cbs == "function" && cbs(list) }), Timer: shy("定时器, value, [1,2,3,4], {interval, length}", function(interval, cb, cbs) { diff --git a/lib/misc.js b/lib/misc.js index 7bad36bd..8b257ec3 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -100,9 +100,10 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg try { xhr.send(data) } catch(e) { can.misc.Log(e) } }, Run: function(event, can, dataset, cmds, cb) { + var skip = {_handle: true} var msg = can.request(event||{}) var form = {cmds: cmds||msg.cmd}; msg.option && msg.option.forEach(function(item) { - msg[item] && (form[item] = msg[item]) + !skip[item] && msg[item] && (form[item] = msg[item]) }) can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(), diff --git a/lib/user.js b/lib/user.js index d540fac8..25ea30df 100644 --- a/lib/user.js +++ b/lib/user.js @@ -145,6 +145,7 @@ Volcanos("user", {help: "用户操作", agent: { return typeof item == "string"? {view: "item", list: [{text: can.user.trans(can, item), click: function(event) { can.user.isMobile && can.page.Remove(can, ui._target) can.base.isFunc(cb) && cb(event, item, meta) + // can.onmotion.float.del(can, "carte") }, onmouseenter: function(event) { carte._float && can.page.Remove(can, carte._float._target) } }] }: {view: "item", list: [{text: can.user.trans(can, item[0])}], onmouseenter: function(event) { @@ -162,7 +163,7 @@ Volcanos("user", {help: "用户操作", agent: { var msg = can.request(event, can.Option()) var ui = can.page.Append(can, document.body, [{view: ["input"], style: {left: 0, top: 0}, list: [ {view: ["option", "table"], list: can.core.List(form, function(item) { - item._input == "select" && (item = {select: [[item.name].concat(item.values)], data: item, name: item.name}) + (item._input == "select"||item.values) && (item = {select: [[item.name].concat(item.values)], data: item, name: item.name}) item = typeof item == "string"? {input: item, name: item}: item.length > 0? {select: [item], name: item[0]}: item item.type = item.type||"input", item.type == "input" && (item.data=item.data||{}, item.data.type = item.data.type||"text") @@ -176,7 +177,7 @@ Volcanos("user", {help: "用户操作", agent: { } can.onappend.figure(can, item, item.value, function() {}, target) - target.value = target.value || msg.Option(item.name) + target.value = target.value || msg.Option(item.name) || item.value } return {type: "tr", list: [{type: "td", list: [{text: item.name||""}]}, {type: "td", list: [item]} ]} diff --git a/page/index.css b/page/index.css index ab4ab4e9..aa9b360f 100644 --- a/page/index.css +++ b/page/index.css @@ -285,6 +285,12 @@ div.input { background-color:#0d4142a6; z-index:50; } +div.input textarea { + width:145px; + padding:4px; + margin:2px; + height:45px; +} div.input div.item { float:left; } @@ -443,6 +449,9 @@ fieldset>div.output div.project div.list { margin-left:10px; } +body>fieldset.float table { + color:white; +} body>fieldset.input table { color:white; } diff --git a/page/index.js b/page/index.js index 1b6d97ce..c64668df 100644 --- a/page/index.js +++ b/page/index.js @@ -2,7 +2,7 @@ Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js", libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], panels: [ {name: "Header", help: "标题栏", pos: "head", state: ["time", "username", "avatar"]}, {name: "Search", help: "搜索框", pos: "auto"}, - {name: "River", help: "群聊组", pos: "left", action: ["创建", "刷新"]}, + {name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]}, {name: "Action", help: "工作台", pos: "main"}, {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]}, ], main: {name: "Header", list: ["/publish/order.js"]}, plugin: [ diff --git a/panel/Action.js b/panel/Action.js index 7092b15a..cbc8e607 100644 --- a/panel/Action.js +++ b/panel/Action.js @@ -1,70 +1,62 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) { var river = can.Conf(can._RIVER), storm = can.Conf(can._STORM) can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { - item.width = parseInt(can.Conf(can._WIDTH)), item.height = parseInt(can.Conf(can._HEIGHT)) + item.width = parseInt(can.Conf(can._WIDTH))-40, item.height = parseInt(can.Conf(can._HEIGHT))-40 item.feature = can.base.Obj(item.feature||item.meta) item.inputs = can.base.Obj(item.inputs||item.list) item.type = can._PLUGIN can.onappend.plugin(can, item, function(sub, meta) { can.onimport._plugin(can, river, storm, sub, meta), next() - sub._option.dataset = sub._option.dataset || {} - item.id && (sub._option.dataset.id = item.id) - sub._target.Meta = item }) }, function() { - can.onaction._layout(can, can.Conf(can._LAYOUT)||can.user.Search(can, can._LAYOUT)) + can.onaction.layout(can, can.user.Search(can, can._LAYOUT)||can.Conf(can._LAYOUT)) + !can.user.isMobile && can.onimport._menu(can) }) can.onmotion.float.auto(can, can._output, "carte") }, - _plugin: function(can, river, storm, sub, item) { + _plugin: function(can, river, storm, sub, meta) { sub.run = function(event, cmds, cb) { var msg = sub.request(event) - var toast = msg.Option("_toast") && can.user.toast(can, msg.Option("_toast"), "", 1000000) - return can.run(event, (can.onengine[cmds[0]]? []: [river, storm, item.id||item.index||item.key+"."+item.name]).concat(cmds), function(msg) { + var toast = msg.Option("_toast") && can.user.toast(can, msg.Option("_toast"), "", -1) + return can.run(event, (can.onengine[cmds[0]]? []: [river, storm, meta.id||meta.index||can.core.Keys(meta.key, meta.name)]).concat(cmds), function(msg) { toast && toast.close(), can.base.isFunc(cb) && cb(msg) }) }, can._plugins = (can._plugins||[]).concat([sub]) - can.page.Modify(can, sub._output, {style: {"max-width": item.width-40}}) - can.onengine.listen(can, "action.resize", function(width, height) { - can.page.Modify(can, sub._output, {style: {"max-width": width-40}}) - item.width = width - }) - - can.page.Append(can, can._action, [{view: ["item", "div", item.name], onclick: function(event) { + can.page.Append(can, can._action, [{view: ["item", "div", meta.name], onclick: function(event) { can.onmotion.select(can, can._output, "fieldset.plugin", sub._target) can.onmotion.select(can, can._action, "div.item", event.target) }}]) - }, - _share: function(can, msg, share) { - can.Conf(can._WIDTH, window.innerWidth) - can.Conf(can._HEIGHT, window.innerHeight) - can.user.topic(can, can.user.Search(can, can._TOPIC)||msg.Option(can._TOPIC)||"white") - can.user.title(can.user.Search(can, can._TITLE)||msg.Option(can._TITLE)) - can.Conf(can._RIVER, "_share"), can.Conf(can._STORM, share) - can.onimport._init(can, msg) - can.onaction._layout(can, "flow") + + can.page.Modify(can, sub._output, {style: {"max-width": meta.width}}) + can.onengine.listen(can, "onaction_resize", function(width, height) { + can.page.Modify(can, sub._output, {style: {"max-width": meta.width = width-40}}) + }) + + sub._option.dataset = sub._option.dataset || {} + meta.id && (sub._option.dataset.id = meta.id) + sub._target.Meta = meta }, _menu: function(can) { - if (can.user.isMobile) { return } can._menu && can.page.Remove(can, can._menu) can._menu = can.search({}, ["Header.onimport.menu", can._ACTION, ["布局", "默认布局", "流动布局", "网格布局", "标签布局", "自由布局"], - ], function(event, key) { can.onaction._layout(can, key) }) + ], function(event, layout) { can.onaction.layout(can, layout) }) }, + _share: function(can, share) { + share && can.run({}, ["_share", share], function(msg) { + can.user.topic(can, can.user.Search(can, can._TOPIC)||msg.Option(can._TOPIC)||"white") + can.user.title(can.user.Search(can, can._TITLE)||msg.Option(can._TITLE)) + can.onaction.layout(can, "auto") - height: function(can, height) { - can.page.Modify(can, can._target, {style: { - height: can.Conf(can._HEIGHT, height), - }}) - can.page.Modify(can, can._output, {style: { - height: can.Conf(can._HEIGHT, height-(can.Conf(can._LAYOUT)=="tabs"? 28: 10)), - }}) + can.Conf({width: window.innerWidth, height: window.innerHeight}) + can.Conf(can._RIVER, "_share"), can.Conf(can._STORM, share) + can.onimport._init(can, msg) + }) }, }) -Volcanos("onengine", {help: "解析引擎", list: [], - _engine: function(event, page, msg, can, cmds, cb) { +Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, page, msg, can, cmds, cb) { var river = can.onengine.river[cmds[0]] var storm = river && river.storm[cmds[1]] if (!storm || cmds.length != 2) { return false } @@ -85,27 +77,9 @@ Volcanos("onengine", {help: "解析引擎", list: [], }, }) Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { - var share = can.user.Search(can, can._SHARE); if (share) { - can.run({}, ["_share", share], function(msg) { msg.Length()>0? can.onimport._share(can, msg, share): - can.onengine._engine({}, can, msg, can, [msg.Option("sess.river"), msg.Option("sess.storm")], function(msg) { - can.onimport._share(can, msg, share) - }) - }) - } - - var list = []; can.onengine.listen(can, "resize", function(width, height) { - can.Conf({width: width, height: height}), can.core.Delay(list, 1000, function() { - can.onengine.signal(can, "action.resize", can.request({}, { - width: can.Conf(can._WIDTH), height: can.Conf(can._HEIGHT), - })) - }) - }) - can._target.ontouchstart = function(event) { can.onengine.signal(can, "onaction_touch", can.request(event)) - can.onmotion.float.del(can, "carte") } - can.base.isFunc(cb) && cb() }, _const: [ @@ -114,15 +88,35 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, "title", "topic", "layout", "width", "height", "top", "left", "scroll", "plugin", ], - + onmain: function(can, msg) { + can.onimport._share(can, can.user.Search(can, can._SHARE)) + }, + onresize: function(can, msg, width, height) { var args = {width: width, height: height} + can.Conf(args), can.onengine.signal(can, "onaction_resize", can.request({}, args)) + }, onsearch: function(can, msg, word) { if (word[0] == "*" || word[0] == can._PLUGIN) { can.onexport.plugin(can, msg, word) } }, - onstorm_select: function(can, msg, river, storm) { - can.onaction._select(can, msg, river, storm) - can.onimport._menu(can) + onstorm_select: function(can, msg, river, storm) { can.onlayout._init(can) + function key(name) { return can.core.Keys(can.Conf(can._RIVER), can.Conf(can._STORM), name) } + can.page.Cache(key(can._ACTION), can._action, can._output.scrollTop+1) + can.page.Cache(key(can._OUTPUT), can._output, can._output.scrollTop+1) + + can.Conf(can._RIVER, river), can.Conf(can._STORM, storm) // 转场 + var position = can.page.Cache(key(can._ACTION), can._action) + var position = can.page.Cache(key(can._OUTPUT), can._output) + if (position) { can._output.scrollTo(0, position-1); return } + + can.run({}, [river, storm], function(msg) { + if (msg.Length() == 0) { // 添加工具 + can.onengine.signal(can, "onaction_notool", can.request({}, {river: river, storm: storm})) + } else { + can.onimport._init(can, msg) + } + }) }, - _layout: function(can, key) { if (!key) { return } + + layout: function(can, layout) { if (!layout) { return } var trans = { "默认布局": "auto", "流动布局": "flow", @@ -131,42 +125,23 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, "自由布局": "free", } - key = trans[key]||key, can.Conf(can._LAYOUT, key) - can.page.Modify(can, can._action, {className: "action "+key}) - can.page.Modify(can, can._output, {className: "output "+key}) + layout = trans[layout]||layout, can.Conf(can._LAYOUT, layout) + can.page.Modify(can, can._action, {className: "action "+layout}) + can.page.Modify(can, can._output, {className: "output "+layout}) - if (key == "tabs") { + if (layout == "tabs" && !can.tabs) { can.onmotion.select(can, can._output, "fieldset.plugin", 0) can.onmotion.select(can, can._action, "div.item", 0) + can.tabs = true } - if (key == "free") { + if (layout == "free" && !can.free) { can.page.Select(can, can._target, "div.output>fieldset.plugin", function(item, index) { - can.onmotion.move(can, item, {left: 10*index, top: 10*index}) - }) + can.page.Modify(can, item, {style: {left: 20*index, top: 20*index}}) + can.onmotion.move(can, item, {left: 20*index, top: 20*index}) + }), can.free = true } - var header = can.get("Header", "height") - var footer = can.get("Footer", "height") - can.set("Action", "height", window.innerHeight-header-footer) - }, - _select: function(can, msg, river, storm) { - function key(name) { return can.Conf(can._RIVER)+"."+can.Conf(can._STORM)+"."+name} - can.page.Cache(key(can._ACTION), can._action, can._output.scrollTop+1) - can.page.Cache(key(can._OUTPUT), can._output, can._output.scrollTop+1) - - can.Conf(can._RIVER, river), can.Conf(can._STORM, storm) // 转场 - var position = can.page.Cache(key(can._OUTPUT), can._output) - var position = can.page.Cache(key(can._ACTION), can._action) - if (position) { can._output.scrollTo(0, position-1); return } - - can.run({}, [river, storm], function(msg) { - if (msg.Length() > 0) { - can.onimport._init(can, msg) - } else { - var msg = can.request({}, {river: river, storm: storm}) - can.search(msg._event, ["River.ondetail.添加工具"]) - } - }) + can.onlayout._init(can) }, }) Volcanos("onexport", {help: "导出数据", list: [], @@ -190,30 +165,15 @@ Volcanos("onexport", {help: "导出数据", list: [], if (item.innerHTML.indexOf(word[1]) == -1) { return } var meta = item.parentNode.Meta - can.core.List(fields, function(key) { - switch (key) { - case "context": - msg.Push(key, meta.ctx||meta.key||"") - break - case "command": - msg.Push(key, meta.index||meta.cmd||meta.name) - break - case "argument": - var list = can.page.Select(can, item.nextSibling, '.args', function(item) { return item.value||"" }) - msg.Push(key, JSON.stringify(list)) - break - case "ctx": msg.Push(key, "web.chat"); break - case "cmd": msg.Push(key, can._ACTION); break - case "type": msg.Push(key, can._PLUGIN); break - case "name": msg.Push(key, item.innerHTML); break - case "text": - msg.Push(key, shy("跳转", function() { - var input = can.page.Select(can, item.parentNode, "input.args")[0] - input && input.focus() - })); break - default: msg.Push(key, "") - } - }) + var list = can.page.Select(can, item.nextSibling, '.args', function(item) { return item.value||"" }) + + var data = {ctx: "web.chat", cmd: can._ACTION, + type: can._PLUGIN, name: item.innerHTML, text: shy("跳转", function(event) { + var input = can.page.Select(can, item.parentNode, "input.args")[0] + input && input.focus() + }), + context: meta.ctx||meta.key||"", command: meta.index||meta.cmd||meta.name, argument: JSON.stringify(list), + }; can.core.List(fields, function(key) { msg.Push(key, data[key]||"") }) }) }, }) diff --git a/panel/Footer.js b/panel/Footer.js index 420f20a8..b6ff52a7 100644 --- a/panel/Footer.js +++ b/panel/Footer.js @@ -1,56 +1,66 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can.onmotion.clear(can) can.onimport._title(can, msg, target) - can.onimport._toast(can, msg, target) can.onimport._state(can, msg, target) + can.onimport._toast(can, msg, target) + + can.onmotion.float.auto(can, can._output, "carte", "input") can.base.isFunc(cb) && cb(msg) }, - _title: function(can, msg, target) { - can.user.isMobile || can.core.List(msg.result, function(title) { - can.page.Append(can, target, [{view: ["title", "div", title]}]) + _title: function(can, msg, target) { const TITLE = "title" + !can.user.isMobile && can.core.List(msg.result, function(item) { + can.page.Append(can, target, [{view: [TITLE, "div", item], title: "联系站长"}]) }) }, + _state: function(can, msg, target) { const STATE = "state" + can.core.List(can.base.Obj(msg.Option(STATE), can.Conf(STATE)||["ncmd"]), function(item) { + can.page.Append(can, target, [{view: [STATE+" "+item, "div", can.Conf(item)], list: [ + {text: [item, "label"]}, {text: [": ", "label"]}, {text: [can.Conf(item)||"", "span", item]}, + ], onclick: function(event) { + can.show = can.show? (can.page.Remove(can, can.show), null): can.onimport._cmd(can) + }}]) + }) + }, + _cmd: function(can) { + return can.onappend.float(can, can._cmds, function(value, key, index, line, list) { + var commands = can.base.Obj(line.commands) + commands.length > 2 && can.onappend.plugin(can, {index: commands[2]}, function(sub) { + sub.run = function(event, cmds, cb) { + can.run(event, ["action", "command", "run", commands[2]].concat(cmds), cb) + } + + can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) { + can.page.Modify(can, sub._output, {style: {"max-width": width, "max-height": height-28}}) + can.page.Modify(can, sub._target, {style: {top: top+100, left: left}}) + can.page.Modify(can, sub._legend, {style: {display: "block"}}) + can.page.ClassList.add(can, sub._target, "float") + }) + + }, document.body) + + }).first + }, _toast: function(can, msg, target) { can.toast = can.page.Append(can, target, [{view: "toast", onclick: function(event) { - var ui = can.onappend.field(can, "story toast float", {}, document.body) - can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) { - can.page.Modify(can, ui.output, {style: {"max-width": width, "max-height": height-28}}) - can.page.Modify(can, ui.first, {style: {top: top, left: left}}) - } ) - - can.onappend._action(can, ["关闭", "刷新"], ui.action, { - "关闭": function(event) { can.page.Remove(can, ui.first) }, - "刷新": function(event) { can.page.Remove(can, ui.first), can.toast.click() }, - }) - can.onappend.table(can, can._toast, function(value) { - return {text: [value, "td"], onclick: function(event) { - - }} - }, ui.output) + can.show = can.show? (can.page.Remove(can, can.show), null): can.onappend.float(can, can._toast).first }}]).first }, - _state: function(can, msg, target) { - can.core.List(can.Conf("state")|["ncmd"], function(item) { - can.page.Append(can, target, [{view: ["state "+item, "div", can.Conf(item)], list: [ - {text: [item, "label"]}, {text: [": ", "label"]}, {text: [can.Conf(item)||"", "span", item]}, - ]}]) - }) - }, toast: function(can, msg, title, content, fileline, time) { can._toast = can._toast || can.request() can.page.Modify(can, can.toast, [time.split(" ").pop(), title, content].join(" ")) can._toast.Push({time: time, fileline: fileline, title: title, content: content}) }, - ncmd: function(can, target) { - can.page.Select(can, target, "span.ncmd", function(item) { - item.innerHTML = can.Conf("ncmd", parseInt(can.Conf("ncmd")||"0")+1+"")+"" + ncmd: function(can, msg, time, follow, commands) { const NCMD = "ncmd"; can._cmds = can._cmds || can.request() + can._cmds.Push({time: time, follow: follow, commands: commands}) + can.page.Select(can, can._output, can.core.Keys("span", NCMD), function(item) { + item.innerHTML = can.Conf(NCMD, parseInt(can.Conf(NCMD)||"0")+1+"")+"" }) }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) { can.base.isFunc(cb) && cb(msg) }, - onlogin: function(can, msg) { + onmain: function(can, msg) { can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) }, }) diff --git a/panel/Header.js b/panel/Header.js index ee208383..9154ebd0 100644 --- a/panel/Header.js +++ b/panel/Header.js @@ -27,18 +27,18 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, } can.user.isWeiXin && can.onimport._weixin(can) }, - _grant: function(can, msg, target) { const GRANT = "grant" + _grant: function(can, msg, target) { const GRANT = "grant", SPACE = "space" if (can.user.Search(can, GRANT)) { if (can.user.confirm(GRANT+" "+can.user.Search(can, GRANT))) { - can.run(event, [can._ACTION, GRANT, "space", can.user.Search(can, GRANT)]) + can.run(event, [can._ACTION, GRANT, SPACE, can.user.Search(can, GRANT)]) } can.user.Search(can, GRANT, "") } }, - _title: function(can, msg, target) { - can.user.title(can.user.Search(can, can._TITLE)||can.user.Search(can, "pod")) + _title: function(can, msg, target) { const TITLE = "title" + can.user.title(can.user.Search(can, TITLE)||can.user.Search(can, "pod")) !can.user.isMobile && can.core.List(msg.result||["github.com/shylinux/contexts"], function(item) { - can.page.Append(can, target, [{view: [can._TITLE, "div", item], title: "返回主页", onclick: function(event) { + can.page.Append(can, target, [{view: [TITLE, "div", item], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}]) }) @@ -200,19 +200,11 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta, river: function(event, can) { can.onaction.River(can) }, black: function(event, can, button) { can.onlayout.topic(can, button) - - var header = can.get("Header", "height") - var footer = can.get("Footer", "height") - can.set("River", "height", window.innerHeight-header-footer) - can.set("Action", "height", window.innerHeight-header-footer) + can.onlayout._init(can) }, white: function(event, can, button) { can.onlayout.topic(can, button) - - var header = can.get("Header", "height") - var footer = can.get("Footer", "height") - can.set("River", "height", window.innerHeight-header-footer) - can.set("Action", "height", window.innerHeight-header-footer) + can.onlayout._init(can) }, print: function(event, can, button) { can.onlayout.topic(can, "white print") diff --git a/panel/River.js b/panel/River.js index 48ea3be8..7f1fd287 100644 --- a/panel/River.js +++ b/panel/River.js @@ -1,20 +1,15 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.base.isFunc(cb) && cb(msg) - can.onmotion.clear(can), can.sublist = {} - if (msg.Option("sess.river") == "_share") { return can.onmotion.hide(can) } + if (msg.Option("sess.river") == "_share") { return can.onmotion.hidden(can) } + can.onmotion.clear(can), can.river_list = {}, can.storm_list = {} - can.onimport._main(can, msg) - can.onimport._menu(can, msg) + can.onimport._main(can, msg), can.onimport._menu(can, msg) + var select; can.page.Append(can, can._output, msg.Table(function(item, index) { + return can.onimport._river(can, item, function(target) { + (index == 0 || item.hash == can._main_river) && (select = target) + }) + })), select && select.click() - var select; msg.Table(function(value, index, array) { - var item = can.onimport._river(can, value) - if (index == 0 || [value.hash, value.name].indexOf(can._main_river) > -1) { select = item } - }) - - select && select.click() - - can.onlayout._init(can) - can.onmotion.float.auto(can, can._output, "carte", "input") + can.onmotion.float.auto(can, target, "carte", "input") }, _main: function(can, msg) { can._main_river = "project", can._main_storm = "studio" @@ -34,76 +29,52 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, ], function(event, item) { can.core.CallFunc([can.ondetail, item], [event, can, item, can.Conf(can._RIVER), can.Conf(can._STORM)]) }) - - can.page.Modify(can, can._output, {onmouseover: function(event) { - can.menu && can.page.Remove(can, can.menu.first) - }}) }, - - _river: function(can, meta) { - var item = can.onappend.item(can, "item", meta, function(event) { - // 左键选中 + _river: function(can, meta, cb) { + return {text: [meta.name, "div", "item"], onclick: function(event) { can.onaction.storm(event, can, meta.hash) - }, function(event) { - // 右键菜单 + + }, onmouseenter: function(event) { can.onaction.carte(event, can, can.ondetail.list, function(event, button, module) { module[button](event, can, button, meta.hash) }) - }) - - !can.user.isMobile && can.page.Modify(can, item, {onmouseenter: function(event) { - can.onaction.carte(event, can, can.ondetail.list, function(event, button, module) { - module[button](event, can, item, meta.hash) - }) - }}) - return item + }, _init: function(target) { cb(target) + can.river_list[meta.hash] = target + }} }, _storm: function(can, meta, river) { return {text: [meta.name, "div", "item"], onclick: function(event) { - // 左键点击 can.onaction.action(event, can, river, meta.hash) can.user.title(can._main_title || meta.name) - can.onmotion.select(can, event.target.parentNode, "div.item", event.target) }, onmouseenter: function(event) { can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(event, button, module) { module[button](event, can, button, river, meta.hash) }) - }, oncontextmenu: function(event) { - can.onaction.action(event, can, river, meta.hash) - can.user.title(can._main_title || meta.name) - - // 右键点击 - can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(event, button, module) { - module[button](event, can, button, river, meta.hash) - }) + }, _init: function(target) { + can.storm_list[can.core.Keys(river, meta.hash)] = target }} }, - - height: function(can, height) { - can.page.Modify(can, can._target, {style: { - height: can.Conf(can._HEIGHT, height), - }}) - can.page.Modify(can, can._output, {style: { - height: can.Conf(can._HEIGHT, height-10), - }}) - }, }) Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, can, msg, panel, cmds, cb) { cmds.length == 0 && can.core.Item(can.onengine.river, function(key, value) { - msg.Push({hash: key, name: value.name}) + msg.Push({hash: key, name: value.name}) // 群组列表 }); if (cmds.length != 1 && cmds[1] != "tool") { return false } var river = can.onengine.river[cmds[0]]; if (!river) { return false } can.core.Item(river.storm, function(key, value) { - msg.Push({hash: key, name: value.name}) + msg.Push({hash: key, name: value.name}) // 应用列表 }), can.base.isFunc(cb) && cb(msg); return true }, }) Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, list, cb, target) { can.base.isFunc(cb) && cb() }, - _const: ["title", "river", "storm"], + _const: ["title", "river", "storm", "action"], + _trans: { + create: "创建", refresh: "刷新", + "public": "公开群", "protected": "内部群", "private": "私有群", + }, onlogin: function(can, msg) { can.onappend._action(can, can.Conf("action")||can.onaction.list) can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) @@ -112,43 +83,13 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, if (word[0] == "*" || word[0] == can._STORM) { can.onexport.storm(can, msg, word) } }, onaction_touch: function(can, msg) { + can.onmotion.float.del(can, "carte") can.user.isMobile && can.onmotion.hidden(can) }, - - storm: function(event, can, river) { - var list = can.sublist[river]; if (list) { return can.onmotion.Toggle(can, list) } - - can.run({}, [river, "tool"], function(msg) { - var select = 0; list = can.page.Append(can, can._output, [{view: "list", list: msg.Table(function(meta, index) { - river == can._main_river && meta.hash == can._main_storm && (select = index) - return can.onimport._storm(can, meta, river) - }) }]).first, list.children.length > 0 && list.children[select].click() - - event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling) - can.sublist[river] = list - }) + onaction_notool: function(can, msg, river, storm) { + can.ondetail["添加工具"](msg._event, can, "添加工具", river, storm) }, - action: function(event, can, river, storm) { - // can.onlayout._init(can) - can.onengine.signal(can, "onstorm_select", can.request(event, { - river: can.Conf(can._RIVER, river), storm: can.Conf(can._STORM, storm), - })) - can.page.Select(can, can._output, "div.item.select", function(item) { - can.page.ClassList.del(can, item, "select") - }), can.page.ClassList.add(can, event.target, "select") - }, - create: function(event, can) { - can.user.input(event, can, [ - ["类型", "public", "protected", "private"], - {name: "群名", value: "hi"}, - {name: "简介", value: "hello"}, - ], function(event, button, meta, list) { - can.run(event, ["action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) { - can.user.Search(can, {river: msg.Result()}) - }) - }) - }, carte: function(event, can, list, cb) { var carte = can.user.carte(event, can, can.ondetail, list, cb) can.page.Modify(can, carte._target, {style: { @@ -156,9 +97,41 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, top: carte._target.offsetTop-event.target.offsetHeight, }}) }, + storm: function(event, can, river) { can.sublist = can.sublist||{} + can.onmotion.select(can, can._output, "div.item", can.river_list[river]) + var list = can.sublist[river]; if (list) { return can.onmotion.Toggle(can, list) } - "创建": function(event, can) { can.onaction.create(event, can) }, - "刷新": function(event, can) { + can.run({}, [river, "tool"], function(msg) { + var select = 0; list = can.page.Append(can, can._output, [{view: "list", list: msg.Table(function(item, index) { + river == can._main_river && item.hash == can._main_storm && (select = index) + return can.onimport._storm(can, item, river) + }) }]).first, list.children.length > 0 && list.children[select].click() + + event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling) + can.sublist[river] = list + }) + }, + action: function(event, can, river, storm) { + can.page.Modify(can, can.sublist[river], {style: {display: "block"}}) + can.onmotion.select(can, can._output, "div.item", can.river_list[river]) + can.onmotion.select(can, can._output, "div.list div.item", can.storm_list[can.core.Keys(river, storm)]) + + can.onengine.signal(can, "onstorm_select", can.request(event, { + river: can.Conf(can._RIVER, river), storm: can.Conf(can._STORM, storm), + })) + }, + + create: function(event, can) { + can.user.input(event, can, [ + {name: "type", values: ["public", "protected", "private"]}, + {name: "name", value: "hi"}, {type: "textarea", name: "text", value: "hello"}, + ], function(event, button, meta, list, args) { + can.run(event, [can._ACTION, "create"].concat(args), function(msg) { + can.user.Search(can, {river: msg.Result()}) + }) + }) + }, + refresh: function(event, can) { can.user.Search(can, { river: can.Conf(can._RIVER), storm: can.Conf(can._STORM), topic: can.search(event, ["Header.onexport.topic"]), @@ -173,19 +146,19 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 can.user.input(event, can, [ {name: "name", value: river}, ], function(event, button, meta, list) { - can.user.share(can, can.request(event), [river, "action", "share", "type", can._RIVER, "name", meta.name]) + can.user.share(can, can.request(event), [river, can._ACTION, "share", "type", can._RIVER, "name", meta.name]) }) }, "添加用户": function(event, can, button, river) { can.user.select(event, can, "user", "usernick,username", function(item, next) { - can.run({}, [river, "user", "action", "insert", "username", item[0]], function(msg) { + can.run({}, [river, "user", can._ACTION, "insert", "username", item[0]], function(msg) { next() }) }) }, "添加设备": function(event, can, button, river) { can.user.select(event, can, "space", "type,name,text", function(item, next) { - can.run({}, [river, "node", "action", "insert", "type", item[0], "name", item[1]], function(msg) { + can.run({}, [river, "node", can._ACTION, "insert", "type", item[0], "name", item[1]], function(msg) { next() }) }) @@ -196,7 +169,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 {name: "名称", value: "hi"}, {name: "简介", value: "hello"}, ], function(event, button, meta, list) { - can.run({}, [river, "tool", "action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) { + can.run({}, [river, "tool", can._ACTION, "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) { can.user.Search(can, {river: river, storm: msg.Result()}) }) }) @@ -204,7 +177,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 "重命名群组": function(event, can, button, river) { can.user.input(event, can, ["name"], function(event, button, meta, list) { var msg = can.request(event, {hash: river}) - can.run(event, ["action", "modify", "name", meta.name], function(msg) { + can.run(event, [can._ACTION, "modify", "name", meta.name], function(msg) { can.user.Search(can, {river: river}) }) }) @@ -220,14 +193,14 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 {name: "name", value: storm}, ], function(event, button, meta, list) { var msg = can.request(event) - can.user.share(can, msg, [river, "action", "share", "type", can._STORM, "name", meta.name, + can.user.share(can, msg, [river, can._ACTION, "share", "type", can._STORM, "name", meta.name, can._STORM, storm, can._RIVER, river, ]) }) }, "添加工具": function(event, can, button, river, storm) { can.user.select(event, can, "command", "context,command", function(item, next) { - can.run({}, [river, "tool", "action", "insert", "hash", storm].concat(["pod", "", "ctx", item[0], "cmd", item[1]]), function(msg) { + can.run({}, [river, "tool", can._ACTION, "insert", "hash", storm].concat(["pod", "", "ctx", item[0], "cmd", item[1]]), function(msg) { next() }) }, function() { @@ -237,7 +210,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 "保存参数": function(event, can, button, river, storm) { can.search(event, ["Action.onexport.args"], function(item, next, index, array) { var msg = can.request({}, {hash: storm, id: item.dataset.id}) - can.run(msg._event, [river, "tool", "action", "modify", "arg", item.dataset.args], function(msg) { + can.run(msg._event, [river, "tool", can._ACTION, "modify", "arg", item.dataset.args], function(msg) { can.user.toast(can, (index+1)+"/"+array.length, "保存参数", 10000, (index+1)/array.length) next() }) @@ -246,14 +219,14 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 "重命名应用": function(event, can, button, river, storm) { var msg = can.request(event, {hash: storm}) can.user.input(event, can, ["name"], function(ev, button, meta, list, args) { - can.run(event, [river, "tool", "action", "modify"].concat(args), function(msg) { + can.run(event, [river, "tool", can._ACTION, "modify"].concat(args), function(msg) { can.user.Search(can, {river: river, storm: storm}) }) }) }, "删除应用": function(event, can, button, river, storm) { var msg = can.request(event, {hash: storm}) - can.run(event, [river, "tool", "action", "remove"], function(msg) { + can.run(event, [river, "tool", can._ACTION, "remove"], function(msg) { can.user.Search(can, {river: river}) }) }, @@ -281,7 +254,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 }, "共享主机": function(event, can, button, river, storm) { - can.run(event, ["action", "invite"], function(msg) { + can.run(event, [can._ACTION, "invite"], function(msg) { can.user.toast(can, { title: "共享主机", duration: -1, width: -100, content: msg.Result(), action: ["close"], @@ -290,7 +263,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 }, "共享工具": function(event, can, button, river, storm) { can.user.select(event, can, "plugin", "name,context,command,argument", function(item, next) { - can.user.share(can, can.request(event), [river, "action", "share", "type", "field", + can.user.share(can, can.request(event), [river, can._ACTION, "share", "type", "field", can._RIVER, item[1], can._STORM, item[2], "name", item[0], "text", item[3], ]) @@ -306,7 +279,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 {name: "repos", value: "@key"}, {name: "template", value: "@key"}, ], function(event, button, data, list, args) { - can.run(event, ["action", "start"].concat(args), function(msg) { + can.run(event, [can._ACTION, "start"].concat(args), function(msg) { can.user.open(can.user.MergeURL(can, {pod: can.core.Keys(can.user.Search(can, "pod"), msg.Option("name"))})) can.user.toast(can, can.user.MergeURL(can, {pod: msg.Option("name")})) }) @@ -315,28 +288,17 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 }) Volcanos("onexport", {help: "导出数据", list: [], width: function(can) { return can._target.offsetWidth }, - height: function(can) { return can._target.offsetHeight }, storm: function(can, msg, word) { var fields = (msg.Option("fields")||"ctx,cmd,type,name,text").split(",") can.core.Item(can.onengine.river, function(river, value) { can.core.Item(value.storm, function(storm, item) { if (word[1] != "" && word[1] != storm && word[1] != item.name) { return } - can.core.List(fields, function(key) { - switch (key) { - case "ctx": msg.Push(key, "web.chat"); break - case "cmd": msg.Push(key, can._STORM); break - case "type": msg.Push(key, river); break - case "name": msg.Push(key, storm); break - case "text": - // msg.Push(key, can.user.MergeURL(can, {river: river, storm: storm})) - // break - msg.Push(key, shy("跳转", function(event) { - can.onaction.action(event, can, river, storm) - })); break - default: msg.Push(key, "") - } - }) + var data = {ctx: "web.chat", cmd: can._STORM, + type: river, name: storm, text: shy("跳转", function(event) { + can.onaction.action(event, can, river, storm) + }), + }; can.core.List(fields, function(key) { msg.Push(key, data[key]||"") }) }) }) }, diff --git a/panel/Search.js b/panel/Search.js index 97482584..06d8fed6 100644 --- a/panel/Search.js +++ b/panel/Search.js @@ -9,11 +9,11 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, })); table && can.page.Modify(can, can.ui.display, {style: {width: table.offsetWidth}}) }, _word: function(can, msg, cmds, fields) { can.type = cmds[0] - var sub = can.request({}, {word: cmds, fields: fields.join(","), sort: msg.Option("sort"), index: msg.Option("index")}) - can.onengine.signal(can, "onsearch", sub) + var res = can.request({}, {word: cmds, fields: fields.join(","), sort: msg.Option("sort"), index: msg.Option("index")}) + can.onengine.signal(can, "onsearch", res) - can.run(sub._event, cmds, function(sub) { can.list = sub.Table() - can.onimport._init(can, sub, fields) + can.run(res._event, cmds, function(res) { can.list = res.Table() + can.onimport._init(can, res, fields) }), can.ui.word.setSelectionRange(0, -1) can.onmotion.show(can), can.ui.input.focus() @@ -60,50 +60,32 @@ Volcanos("onaction", {help: "交互操作", list: ["关闭", "清空", "完成"] "清空": function(event, can) { can.onmotion.clear(can, can.ui.preview) }, "完成": function(event, can) { can.base.isFunc(can.cb) && can.cb() }, - select: function(event, can, index) { + select: function(event, can, index) { var line = can.list[index] + if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) } - // if (line.ctx == "web.chat" && line.cmd == "/search") { - // return can.onimport.select(can, msg, [line.type, line.name, line.text], can.cb) - // } - - if (can.list && can.list[index]) { - var text = can.list[index].text || "" - if (can.base.isFunc(text)) { - can.list[index].text(event) - } else { var line = can.list[index] - var fields = can.page.Select(can, can.ui.display, "th", function(item) { return item.innerText }) - can.page.Append(can, can.ui.display, [{td: can.core.List(fields, function(item) { - return line[item] - }), data: {index: index}, onclick: function(event) { - can.page.Remove(can, event.target.parentNode) - can.Status("selected", can.page.Select(can, can.ui.display, "tr").length-1) - }}]), can.Status("selected", can.page.Select(can, can.ui.display, "tr").length-1) - return false - } - can.onmotion.hide(can) - return true + if (line.ctx == "web.chat" && line.cmd == "/search") { + return can.onimport.select(can, msg, [line.type, line.name, line.text], can.cb) } - return false + + var fields = can.page.Select(can, can.ui.display, "th", function(item) { return item.innerText }) + can.page.Append(can, can.ui.display, [{td: can.core.List(fields, function(item) { + return line[item] + }), data: {index: index}, onclick: function(event) { can.page.Remove(can, event.target.parentNode) + can.Status("selected", can.page.Select(can, can.ui.display, "tr").length-1) + }}]), can.Status("selected", can.page.Select(can, can.ui.display, "tr").length-1) }, plugin: function(event, can, index) { var line = can.list[index] - var cmd = line.cmd == "command"? can.core.Keys(line.text, line.name): can.core.Keys(line.ctx, line.cmd) + if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) } - can.onappend.plugin(can, {type: "plugin", index: cmd||msg.Option("index"), option: line}, function(sub, meta) { + var cmd = line.cmd == "command"? can.core.Keys(line.text, line.name): can.core.Keys(line.ctx, line.cmd) + can.onappend.plugin(can, {type: "plugin", index: cmd||msg.Option("index")}, function(sub, meta) { sub.run = function(event, cmds, cb) { var msg = can.request(event, line) - can.run(event, ["action", "command", "run", meta.index].concat(cmds), function(msg) { - can.base.isFunc(cb) && cb(msg) - }) + can.run(event, ["action", "command", "run", meta.index].concat(cmds), cb) } }, can.ui.preview) }, }) -Volcanos("ondetail", {help: "交互操作", list: ["删除"], _init: function(can, msg, list, cb, target) { - }, - "删除": function(event, sub) { - sub.page.Remove(sub, sub._target) - }, -}) Volcanos("onexport", {help: "导出数据", list: ["selected", "count"], select: function(can) { return can.page.Select(can, can.ui.display, "tr", function(tr) { diff --git a/plugin/local/wiki/feel.js b/plugin/local/wiki/feel.js index 0ffbfa9c..a617619a 100644 --- a/plugin/local/wiki/feel.js +++ b/plugin/local/wiki/feel.js @@ -6,6 +6,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.base.isFunc(cb) && cb(msg) can.ui = can.onlayout.display(can, target) can.onappend.table(can, can.path, null, can.ui.content) + can.dir_root = msg.Option("dir_root") can.Action("height", msg.Option("height")||"100") can.Action("limit", msg.Option("limit")||"6") @@ -16,7 +17,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onimport.page(can, can.list) }, _file: function(can, path, index) { var p = location.href.indexOf("http") == 0? "": "http://localhost:9020" - return path.indexOf("http") == 0? path: p+can.base.Path("/share/local", can._msg.Option("dir_root")||"", path) + return path.indexOf("http") == 0? path: p+can.base.Path("/share/local", can.dir_root||"", path) }, file: function(can, path, index) { path = can.onimport._file(can, path, index) var cb = can.onfigure[can.base.Ext(path)]; can.Status("file", path) diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 66eaad30..15d2f27a 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -41,17 +41,16 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) }, field: function(can, data, target) { var item = can.base.Obj(data.meta) - item.width = parseInt(can.Conf("width"))-20, item.height = parseInt(can.Conf("height")) + item.width = parseInt(can.Conf("width")), item.height = parseInt(can.Conf("height")) item.type = "story" can.onappend._init(can, item, ["/plugin/state.js"], function(sub) { sub.run = function(event, cmds, cb, silent) { - can.run(event, (cmds && cmds[0] == "_search"? []: ["action", "story", data.type, data.name, data.text]).concat(cmds), cb, true) + can.run(event, (cmds && can.onengine[cmds[0]]? []: ["action", "story", data.type, data.name, data.text]).concat(cmds), cb, true) } - can.page.Modify(can, sub._output, {style: {"max-width": item.width-40}}) - can.onengine.listen(can, "action.resize", function(width, height) { - can.page.Modify(can, sub._output, {style: {"max-width": width-60}}) - sub.Conf("width", item.width = width-20) + can.page.Modify(can, sub._output, {style: {"max-width": item.width}}) + can.onengine.listen(can, "onaction_resize", function(width, height) { + can.page.Modify(can, sub._output, {style: {"max-width": sub.Conf("width", item.width=width-60)}}) }) }, can._output, target) },