diff --git a/frame.js b/frame.js index 9b598b2f..337db450 100644 --- a/frame.js +++ b/frame.js @@ -1,8 +1,6 @@ -// volcanos: 前端 火山架 我看不行 -// FMS: a fieldset manager system Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, list, cb, target) { can.core.Next(meta.panes, function(item, next) { - can.onappend._init(can, item, meta.libs.concat(item.list), function(pane) { pane.Conf(item) + can.onappend._init(can, item, meta.libs.concat(item.list), function(pane) { pane.run = function(event, cmds, cb) { return (can.onengine[cmds[0]]||can.onengine[meta.main.engine])(event, can, pane.request(event), pane, cmds, cb) }, can[item.name] = pane, next() @@ -18,14 +16,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, }) }) }, - _merge: function(can, sub) { - can.core && can.core.Item(sub, function(key, value) { - if (sub.hasOwnProperty(key)) { can.onengine[key] = value } - }) - return true - }, - _daemon: function(can, name) { - return + _daemon: function(can, name) { return can.misc.WSS(can, "", {type: "chrome", name: name}, function(event, msg) { if (msg.Option("_handle")) { return can.user.toast(can, msg.result.join("")) } can.user.toast(can, msg.detail.join(" ")) @@ -219,7 +210,8 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, }}, }, }) -Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, list, cb, target, field) { meta.name = meta.name.split(" ")[0] +Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, list, cb, target, field) { + meta.name = meta.name.split(" ")[0] field = field || can.onappend.field(can, target, meta.type||"plugin", meta).first var legend = can.page.Select(can, field, "legend")[0] var option = can.page.Select(can, field, "form.option")[0] @@ -281,13 +273,13 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }, [Volcanos.meta.volcano].concat(list), function(sub) { cb(sub) meta.feature = sub.base.Obj(meta.feature, {}) sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"") - sub.onimport && sub.onimport._init(sub, sub.Conf(meta), list, function() {}, field) + // sub.onimport && sub.onimport._init(sub, sub.Conf(meta), list, function() {}, field) meta.inputs && sub.onappend._option(sub, meta, list, cb) sub.onaction && sub.onappend._action(sub, sub._action, meta.button || sub.onaction.list) sub.onexport && sub.onappend._status(sub, sub._status, sub.onexport.list) }) - return sub + return sub.Conf(meta), sub }, _option: function(can, meta, list, cb) { var index = -1, args = can.base.Obj(meta.arg||meta.args, []) function add(item, next) { item._input != "button" && index++ diff --git a/lib/core.js b/lib/core.js index 7d7842b1..0d7de56a 100644 --- a/lib/core.js +++ b/lib/core.js @@ -150,6 +150,19 @@ var core = Volcanos("core", {help: "核心模块", return true } return obj === other - } + }, + + Timer: shy("定时器, value, [1,2,3,4], {value, length}", function(interval, cb, cbs) { + interval = typeof interval == "object"? interval || []: [interval] + var timer = {stop: false}; function loop(timer, i) { + if (timer.stop || i >= interval.length && interval.length >= 0) { + return typeof cbs == "function" && cbs(timer, interval) + } + return typeof cb == "function" && cb(timer, interval.value||interval[i], i, interval)? + typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(timer, i+1) }, interval.value||interval[i+1]) + } + setTimeout(function() { loop(timer, 0) }, interval.value||interval[0]) + return timer + }), }) diff --git a/pane/Action.js b/pane/Action.js index a594367c..4f076ba1 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -1,112 +1,44 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { - typeof cb == "function" && cb() - }, -}) -Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { - can.onexport._init(can, msg, list, cb, target) - }, - - _process: function(can, sub, conf, msg, cmds, cb, silent) { - var p = can.onaction[msg.Option("_process")] - typeof p == "function"? p(can, sub, conf, msg, cmds, cb, silent): typeof cb == "function" && cb(msg) - can.run(msg._event, ["search", "Footer.onaction.ncmd"]) - }, - _progress: function(can, sub, conf, msg, cmds, cb, silent) { - var size = msg.Append("size") || msg.Append("count") - if (size != "" && size == msg.Append("total")) { - return typeof cb == "function" && cb(msg) - } - can.user.toast(can, { - width: 400, - title: conf.name+" "+msg.Append("step")+"% ", duration: 1100, - text: "执行进度: "+can.base.Size(size||0)+"/"+can.base.Size(msg.Append("total")||"1000")+"\n"+msg.Append("name"), - progress: parseInt(msg.Append("step")), - }) - can.page.Select(can, sub._output, "td", function(td) { - if (td.innerText == msg.Option("name")) { - can.page.ClassList.add(can, td, "done") +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + var river = can.Conf("river"), storm = can.Conf("storm") + can._output.innerHTML = "", can.core.Next(msg.Table(), function(value, next) { + value.feature = can.base.Obj(value.feature||value.meta||"{}", {}) + value.inputs = can.base.Obj(value.inputs||value.list||"[]", []) + if (value.inputs.length > 0) { + can.onimport._plugin(can, river, storm, value), next() + return } + + value.index && can.run({}, ["action", "command", value.index], function(msg) { + value.feature = can.base.Obj(msg.meta&&msg.meta[0]||"{}", {}) + value.inputs = can.base.Obj(msg.list&&msg.list[0]||"[]", []) + can.onimport._plugin(can, river, storm, value), next() + }) }) - can.Timer(1000, function() { - var res = sub.request({}) - res.Option("_progress", msg.Option("_progress")) - sub.run(res._event, cmds, cb, silent) - }) + typeof cb == "function" && cb(msg) }, - add_plugin: function(can, river, storm, value) { value.name = value.name.split(" ")[0] + _plugin: function(can, river, storm, value) { value.name = value.name.split(" ")[0] value.action = value.id || value.index || value.key+"."+value.name - value.height = can._target.offsetHeight value.width = can._target.offsetWidth can.onappend._init(can, value, Volcanos.meta.libs.concat(["/plugin/state.js"]), function(sub) { - sub._legend.onclick = function(event) { - var opt = {pod: can.user.Search(can, "pod"), river: river, storm: storm, active: value.name} - can.core.Item(sub.Option(), function(key, value) { opt[key] = value }) - location.href = can.user.Share(can, opt, true) - } sub.run = function(event, cmds, cb, silent) { var msg = can.request(event); cmds = cmds || [] - can.Conf("active", sub.Option()) - can.Conf("action", value.name) - can.Conf("current", sub) - // 插件回调 return can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) { - // return typeof cb == "function" && cb(msg) - can.onaction._process(can, sub, value, msg, cmds, cb, silent) + return typeof cb == "function" && cb(msg) }, silent) } - sub._target.oncontextmenu = function(event) { - can.user.carte(can, can.ondetail, can.ondetail.list, function(event, item, meta) { - // 菜单命令 - meta[item] && meta[item](event, can, value, sub) - }) - } }, can._output) }, }) -Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"], - "共享": function(event, can, value, sub) { var msg = sub.request(event) - var list = [can.Conf("river"), can.Conf("storm"), "share", value.name, value.help] - list = list.concat([ - value.pod||can.user.Search(can, "pod")||"", value.group||"", value.index, JSON.stringify(can.core.Item(sub.Option(), function(key, value) { return value })), - JSON.stringify(sub.Option()) - ]) - can.user.share(can, msg, list) - }, -}) -Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "action" +Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { can.Cache(can.Conf("river")+"."+can.Conf("storm"), can._output, can._output.scrollTop+1) - var river = can.Conf("river", msg.Option("river")), storm = can.Conf("storm", msg.Option("storm")||"main") - var position = can.Conf(key, msg.Option(key, can.Cache(river+"."+storm, can._output)||"")) + var river = can.Conf("river", msg.Option("river")), storm = can.Conf("storm", msg.Option("storm")) + var position = can.Conf("action", msg.Option("action", can.Cache(river+"."+storm, can._output)||"")) if (position) { can._output.scrollTo(0, position-1); return } - msg.Clear("option"), can.run(msg._event, [river, storm], function(sup) { can._output.innerHTML = "" - can.core.Next(sup.Table(), function(value, next) { - value.feature = can.base.Obj(value.feature||value.meta||"{}", []) - value.inputs = can.base.Obj(value.inputs||value.list||"[]", []) - if (value.inputs.length > 0) { - can.onaction.add_plugin(can, river, storm, value), next() - return - } - - value.index && can.run({}, ["action", "command", value.index], function(msg) { - value.feature = can.base.Obj(msg.meta&&msg.meta[0]||"{}", {}) - value.inputs = can.base.Obj(msg.list&&msg.list[0]||"[]", []) - can.onaction.add_plugin(can, river, storm, value), next() - }) - }) + msg.Clear("option"), can.run(msg._event, [river, storm], function(sup) { + can.onimport._init(can, msg, list, cb, target) }) }, - key: function(can, msg) { msg.Option("active", can.Conf("action")) - can.core.Item(can.Conf("active"), msg.Option) - can.core.List(can.Conf("current")._outputs, function(item) { - item.onexport && item.onexport.key && item.onexport.key(item, msg) - }) - }, - left: function(can) { - return can._target.offsetLeft - }, - top: function(can) { - return can._target.offsetTop - }, }) +Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Footer.js b/pane/Footer.js index 4e60abce..ea09cb53 100644 --- a/pane/Footer.js +++ b/pane/Footer.js @@ -1,8 +1,27 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + can._output.innerHTML = "" + can.onimport._title(can, msg) + can.onimport._state(can, msg) + typeof cb == "function" && cb() + }, + _title: function(can, msg) { + can.core.List(msg.result, function(title) { + can.page.Append(can, can._output, [{view: ["title", "div", title]}]) + }) + }, + _state: function(can, msg) { + can.core.List(can.Conf("state"), function(item) { + can.page.Append(can, can._output, [{view: ["state "+item, "div", can.Conf(item)], + list: [{text: item}, {text: ": "}, {text: [can.Conf(item)||"", "span", item]}], + click: function(event) { can.onaction[item](event, can, item) }, + }]) + }) }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) { - can.onexport._init(can, msg, list, cb, target) + can.run({}, [], function(msg) { + can.onimport._init(can, msg, list, cb, target) + }) }, ncmd: function(can, msg, list, cb, target) { can.page.Select(can, can._target, "span.ncmd", function(item) { @@ -10,19 +29,5 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, }) }, }) -Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { - can.run({}, [], function(msg) { can._output.innerHTML = "" - can.core.List(msg.result, function(title) { - can.page.Append(can, can._output, [{view: ["title", "div", title]}]) - }) - - can.core.List(can.Conf("state"), function(item) { - can.page.Append(can, can._output, [{view: ["state "+item, "div", can.Conf(item)], - list: [{text: item}, {text: ": "}, {text: [can.Conf(item)||"", "span", item]}], - click: function(event) { can.onaction[item](event, can, item) }, - }]) - }) - }) - }, -}) +Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Header.js b/pane/Header.js index 173c5e36..8e61e8b7 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -1,7 +1,57 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { - can.user.isWeiXin && can.onimport.weixin(can) +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + can._output.innerHTML = "" + can.onimport._title(can, msg) + can.onimport._state(can, msg) + can.onimport._search(can, msg) + can.onimport._agent(can, msg) + typeof cb == "function" && cb() }, - weixin: function(can) { can.run({}, ["action", "wx"], function(msg) { + _title: function(can, msg) { + 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(title) { + can.page.Append(can, can._output, [{view: ["title", "div", title], + click: function(event) { can.onaction["title"](event, can, "title") }, + }]) + }) + }, + _search: function(can, msg) { + can.user.isMobile || (can.search = can.page.Append(can, can._output, [{view: "search", list: [{type: "input", data: {placeholder: "search"}, onkeydown: function(event) { + switch (event.key) { + case "Enter": can.run(event, ["search", "Search.onimport.input", "*", event.target.value]); break + } + }, }], }]).input) + + var ui = can.page.Append(can, can._output, can.core.List(can.user.isMobile || can.user.isExtension || can.user.Search(can, "pod")? ["River"]: ["pack"], function(item) { + return {view: "item", list: [{type: "input", data: {type: "button", name: item, value: item.toLowerCase()}, onclick: function(event) { + var cb = can.onaction[item]; typeof cb == "function" && cb(event, can, item) + }, }]} + })) + }, + _state: function(can, msg) { + can.core.List(can.Conf("state")||["time", USERNAME], function(item) { + can.page.Append(can, can._output, [{view: ["state "+item, "div", can.Conf(item)], + click: function(event) { can.onaction[item](event, can, item) }, + _init: function(target) { + item == "time" && can.core.Timer({interval: 1000, length: -1}, function(event) { + can.onimport.time(can, target) + }) + }, + }]) + }) + }, + _agent: function(can, msg) { + if (can.user.isExtension) { + can.onaction.River({}, can) + } else if (can.user.isMobile) { + can.onaction.River({}, can) + can.onaction.Footer({}, can) + } else if (can.user.Search(can, "pod")) { + can.onaction.River({}, can) + can.onaction.Footer({}, can) + } + can.user.isWeiXin && can.onimport._weixin(can) + }, + _weixin: function(can, msg) { can.run({}, ["action", "wx"], function(msg) { can.require(["https://res.wx.qq.com/open/js/jweixin-1.6.0.js"], function(can) { can.user.agent = { __proto__: can.user.agent, getLocation: function(cb) { wx.getLocation({type: "gcj02", success: function (res) { @@ -26,18 +76,33 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, }) }) }) }, + + time: function(can, target) { + target.innerHTML = can.base.Time(null, "%w %H:%M:%S") + + if (can.user.Search(can, "topic")) { return } + if (can.user.Search(can, "pod")) { return } + + var h = parseInt(can.base.Time(null, "%H")) + var topic = h<7 || h>17? "black": "white" + can.onaction[topic]({}, can, topic) + }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) { function init() { can.run({}, [], function(msg) { - can.onexport._init(can, msg, msg.append, function() { + const USERNAME = "username" + can.Conf(USERNAME, msg.Option("user.nick")||msg.Option("user.name")) + can.Conf(USERNAME).length > 10 && can.Conf(USERNAME, can.Conf(USERNAME).slice(0, 10)) + + can.onimport._init(can, msg, msg.append, function() { can.run({}, ["search", "River.onaction._init"]) can.run({}, ["search", "Footer.onaction._init"]) }, target) }) } - can.user.title(can.user.Search(can, "title")) - can.page.Modify(can, document.body, {className: - can.user.Search(can, "topic") || (can.user.Search(can, "pod") || can.base.isNight() ? "black": "white")}) + can.page.Modify(can, target, { + className: can.user.Search(can, "topic") || (can.user.Search(can, "pod") || can.base.isNight() ? "black": "white"), + }) location.protocol == "file:"? init(): can.run({}, ["check"], function(msg) { msg.Result()? init(): can.user.login(can, init) @@ -49,18 +114,19 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, }) location.href = can.user.Share(can, args, true) }, - white: function(event, can, key) { - can.page.Modify(can, document.body, {className: key}) - }, - black: function(event, can, key) { - can.page.Modify(can, document.body, {className: key}) - }, username: function(event, can, key) { if (can.user.confirm("logout?")) { can.user.Cookie(can, "sessid", "") can.user.reload(true) } }, + + white: function(event, can, key) { + can.page.Modify(can, document.body, {className: key}) + }, + black: function(event, can, key) { + can.page.Modify(can, document.body, {className: key}) + }, pack: function(event, can, key) { can.core.Item(Volcanos.meta.pack, function(key, msg) { delete(msg._event), delete(msg._can) @@ -87,66 +153,5 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, }) }, }) -Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { - const USERNAME = "username" - can.Conf(USERNAME, msg.Option("user.nick")||msg.Option("user.name")) - can.Conf(USERNAME).length > 10 && can.Conf(USERNAME, can.Conf(USERNAME).slice(0, 10)) - can._output.innerHTML = "" - - // 标题 - can.user.title(can.user.Search(can, "pod")) - can.user.isMobile || can.core.List(msg.result||["github.com/shylinux/contexts"], function(title) { - can.page.Append(can, can._output, [{view: ["title", "div", title], - click: function(event) { can.onaction["title"](event, can, "title") }, - }]) - }) - - // 状态 - can.core.List(can.Conf("state")||["time", USERNAME], function(item) { - can.page.Append(can, can._output, [{view: ["state "+item, "div", can.Conf(item)], - click: function(event) { can.onaction[item](event, can, item) }, - }]) - }) - can.page.Select(can, can._output, "div.state.time", function(item) { - can.timer = can.Timer({interval: 1000, length: -1}, function(event) { - can.onexport.time(event, can, "time", item) - }) - }) - - // 搜索 - can.user.isMobile || (can.search = can.page.Append(can, can._output, [{view: "search", list: [{type: "input", data: {placeholder: "search"}, onkeydown: function(event) { - switch (event.key) { - case "Enter": can.run(event, ["search", "Search.onimport.input", "*", event.target.value]); break - } - }, }], }]).input) - - var ui = can.page.Append(can, can._output, can.core.List(can.user.isMobile || can.user.isExtension || can.user.Search(can, "pod")? ["River"]: ["pack"], function(item) { - return {view: "item", list: [{type: "input", data: {type: "button", name: item, value: item.toLowerCase()}, onclick: function(event) { - var cb = can.onaction[item]; typeof cb == "function" && cb(event, can, item) - }, }]} - })) - - // 场景 - if (can.user.isExtension) { - can.onaction.River({}, can) - } else if (can.user.isMobile) { - can.onaction.River({}, can) - can.onaction.Footer({}, can) - } else if (can.user.Search(can, "pod")) { - can.onaction.River({}, can) - can.onaction.Footer({}, can) - } - - typeof cb == "function" && cb() - }, - time: function(event, can, key, target) { - target.innerHTML = can.base.Time(null, "%w %H:%M:%S") - - if (can.user.Search(can, "pod")) { return } - if (can.user.Search(can, "topic")) { return } - var h = parseInt(can.base.Time(null, "%H")) - var topic = h < 7 || h > 17? "black": "white" - can.onaction[topic]({}, can, topic) - }, -}) +Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/River.js b/pane/River.js index 55c4cb2b..bfddd638 100644 --- a/pane/River.js +++ b/pane/River.js @@ -1,78 +1,66 @@ const RIVER = "river", STORM = "storm" -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { - can.sublist = {} - }, - river: function(can) { - can._main_river = can.user.Search(can, RIVER) || (can.user.isMobile? "product": "project") - can._main_storm = can.user.Search(can, STORM) || (can.user.isMobile? "office": "studio") +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + can._main_river = can.user.Search(can, RIVER) || (can.user.isExtension || can.user.isMobile? "product": "project") + can._main_storm = can.user.Search(can, STORM) || (can.user.isExtension || can.user.isMobile? "office": "studio") - can._main_river = can.user.Search(can, RIVER) || (can.user.isExtension? "product": "project") - can._main_storm = can.user.Search(can, STORM) || (can.user.isExtension? "chrome": "studio") + can._output.innerHTML = "", can.sublist = {} - can.run({}, [], function(sup) { - can._output.innerHTML = ""; var select; - sup.Table(function(value, index, array) { - var view = can.onappend.item(can, can._output, "item", value, function(event, item) { var msg = can.request(event, {_msg: sup}) - // 左键点击 - can.onimport.storm(event, can, value.hash) - }, function(event) { - // 右键点击 - can.onappend.menu(can, sup, value) - }) + var select; msg.Table(function(value, index, array) { + var view = can.onappend.item(can, can._output, "item", value, function(event, item) { + // 左键点击 + can.onimport.storm(event, can, value.hash) + }, function(event) { + // 右键点击 + can.onappend.menu(can, msg, value) + }) - if (index == 0 || [value.hash, value.name].indexOf(can._main_river) > -1) { select = view } - }); - select && select.click(), typeof cb == "function" && cb(sup) - }) + if (index == 0 || [value.hash, value.name].indexOf(can._main_river) > -1) { select = view } + }), select && select.click() + + typeof cb == "function" && cb(msg) }, storm: function(event, can, river) { - var list = can.sublist[river]; if (list) { var hide = list.style.display == "none" - return can.page.Modify(can, list, {style: {display: hide? "": "none"}}) + var list = can.sublist[river]; if (list) { + return can.page.Modify(can, list, {style: {display: list.style.display == "none"? "": "none"}}) } - can.run({}, [river, "tool"], function(msg) { var which = 0 - list = can.page.Append(can, can._output, [{view: "sublist", list: msg.Table(function(storm, index) { - river == can._main_river && storm.hash == can._main_storm && (which = index) + can.run({}, [river, "tool"], function(msg) { + var select = 0; list = can.page.Append(can, can._output, [{view: "sublist", list: msg.Table(function(storm, index) { + river == can._main_river && storm.hash == can._main_storm && (select = index) + return {text: [storm.name, "div", "subitem"], onclick: function(event) { // 左键点击 - var msg = can.request(event) - msg.Option(RIVER, can.Conf(RIVER, river)) - msg.Option(STORM, can.Conf(STORM, storm.hash)) - can.run(event, ["search", "Action.onaction._init"]) - + can.onimport.action(event, can, river, storm.hash) storm.name != "main" && can.user.title(can.user.Search(can, "pod") || storm.name) - can.page.Select(can, can._output, "div.subitem.select", function(item) { - can.page.ClassList.del(can, item, "select") - }), can.page.ClassList.add(can, event.target, "select") }, oncontextmenu: function(event) { // 右键点击 - can.user.carte(can, {}, ["添加工具", "重命名", "保存参数", "共享应用", "删除应用"], function(ev, item, meta) { - switch (item) { - case "重命名": - can.user.input(event, can, ["name"], function(event, button, meta, list) { - var msg = can.request(event); msg.Option("hash", storm.hash) - can.run(event, [river, "tool", "action", "modify", "name", meta.name], function(msg) { - can.user.Search(can, {river: can.Conf(RIVER), storm: can.Conf(STORM)}) - }) - return true - }) - break - default: - can.ondetail[item](event, can, item, storm) - } + can.user.carte(can, {}, ["添加工具", "保存参数", "重命名应用", "删除应用"], function(ev, item, meta) { + can.ondetail[item](event, can, item, storm) }) }} - })}]).sublist - which < list.children.length && list.children[which].click() + }) }]).sublist, select < list.children.length && list.children[select].click() + event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling) can.sublist[river] = list }) }, + action: function(event, can, river, storm) { + var msg = can.request(event) + msg.Option(RIVER, can.Conf(RIVER, river)) + msg.Option(STORM, can.Conf(STORM, storm)) + can.run(event, ["search", "Action.onaction._init"]) + + can.page.Select(can, can._output, "div.subitem.select", function(item) { + can.page.ClassList.del(can, item, "select") + }), can.page.ClassList.add(can, event.target, "select") + }, }) Volcanos("onaction", {help: "控件交互", list: ["创建", "刷新"], _init: function(can, msg, list, cb, target) { - can.onimport.river(can) + can.run({}, [], function(msg) { + can.onimport._init(can, msg, list, cb, target) + }) }, - create: function(can) { + create: function(event, can) { can.user.input(event, can, [ ["类型", "public", "protected", "private"], {_input: "text", name: "群名", value: "hi"}, @@ -81,15 +69,60 @@ Volcanos("onaction", {help: "控件交互", list: ["创建", "刷新"], _init: f can.run(event, ["action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) { can.user.Search(can, {river: msg.Result()}) }) - return true }) }, - "创建": function(event, can) { can.onaction.create(can) }, + + "创建": function(event, can) { can.onaction.create(event, can) }, "刷新": function(event, can) { can.user.Search(can, {river: can.Conf(RIVER), storm: can.Conf(STORM)}) }, }) -Volcanos("ondetail", {help: "菜单交互", list: ["添加应用", "添加设备", "添加用户", "重命名", "共享群组", "删除群组"], _init: function(can, msg, list, cb, target) { - can.onexport._init(can, msg, list, cb, target) +Volcanos("ondetail", {help: "菜单交互", list: ["添加用户", "添加设备", "添加应用", "重命名群组", "删除群组"], + "添加用户": function(event, can, river, button) { + can.run(event, ["search", "Search.onimport.select", "user", "", ""], function(list) { + can.core.Next(list, function(item, next) { + can.run({}, [can.Conf(RIVER), "user", "action", "insert", "username", item[5]], function(msg) { + next() + }) + }, function() { + can.user.toast(can, "添加成功") + }) + }) }, + "添加设备": function(event, can, value) { + can.run(event, ["search", "Search.onimport.select", "space", "", ""], function(list) { + can.core.Next(list, function(item, next) { + can.run({}, [can.Conf(RIVER), "node", "action", "insert", "type", item[3], "name", item[4]], function(msg) { + next() + }) + }, function() { + can.user.toast(can, "添加成功") + }) + }) + }, + "添加应用": function(event, can, river, button) { + can.user.input(event, can, [ + ["类型", "public", "protected", "private"], + {_input: "text", name: "名称", value: "hi"}, + {_input: "text", name: "简介", value: "hello"}, + ], function(event, button, meta, list) { + can.run(event, [can.Conf(RIVER), "tool", "action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) { + can.user.Search(can, {river: can.Conf(RIVER), storm: msg.Result()}) + }) + }) + }, + "重命名群组": function(event, can, river, button) { + can.user.input(event, can, ["name"], function(event, button, meta, list) { + var msg = can.request(event); msg.Option("hash", river.hash) + can.run(event, ["action", "modify", "name", meta.name], function(msg) { + can.user.Search(can, {river: can.Conf(RIVER)}) + }) + }) + }, + "删除群组": function(event, can, river, button) { + can.run(event, ["remove", "hash", river.hash], function(msg) { + can.user.Search(can, {}) + }) + }, + "添加工具": function(event, can, button, storm) { can.run(event, ["search", "Search.onimport.select", "command", "", ""], function(list) { can.core.Next(list, function(item, next) { @@ -97,7 +130,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["添加应用", "添加设备 next() }) }, function() { - can.user.Search(can, {river: can.Conf(RIVER), storm: can.Conf(STORM)}) + // can.user.Search(can, {river: can.Conf(RIVER), storm: can.Conf(STORM)}) }) }) }, @@ -113,6 +146,21 @@ Volcanos("ondetail", {help: "菜单交互", list: ["添加应用", "添加设备 can.user.toast(can, "保存成功", STORM) }) }, + "重命名应用": function(event, can, button, storm) { + can.user.input(event, can, ["name"], function(event, button, meta, list) { + var msg = can.request(event); msg.Option("hash", storm.hash) + can.run(event, [can.Conf(RIVER), "tool", "action", "modify", "name", meta.name], function(msg) { + can.user.Search(can, {river: can.Conf(RIVER), storm: can.Conf(STORM)}) + }) + }) + }, + "删除应用": function(event, can, button, storm) { + var msg = can.request(event); msg.Option("hash", storm.hash) + can.run(event, [can.Conf(RIVER), "tool", "action", "remove"], function(msg) { + can.user.Search(can, {river: can.Conf(RIVER)}) + }) + }, + "共享应用": function(event, can, button, storm) { can.user.input(event, can, [ {_input: "text", name: "username", value: "@key=hi"}, @@ -125,56 +173,6 @@ Volcanos("ondetail", {help: "菜单交互", list: ["添加应用", "添加设备 return true }) }, - "删除应用": function(event, can, button, storm) { - var msg = can.request(event); msg.Option("hash", storm.hash) - can.run(event, [can.Conf(RIVER), "tool", "action", "remove"], function(msg) { - can.user.Search(can, {river: can.Conf(RIVER)}) - }) - }, - - "添加应用": function(event, can, river, button) { - can.user.input(event, can, [ - ["类型", "public", "protected", "private"], - {_input: "text", name: "名称", value: "hi"}, - {_input: "text", name: "简介", value: "hello"}, - ], function(event, button, meta, list) { - can.run(event, [can.Conf(RIVER), "tool", "action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) { - can.user.Search(can, {river: can.Conf(RIVER), storm: msg.Result()}) - }) - return true - }) - }, - "添加设备": function(event, can, value) { - can.run(event, ["search", "Search.onimport.select", "space", "", ""], function(list) { - can.core.Next(list, function(item, next) { - can.run({}, [can.Conf(RIVER), "node", "action", "insert", "type", item[3], "name", item[4]], function(msg) { - // can.user.Search(can, {river: can.Conf(RIVER)}) - next() - }) - }, function() { - }) - }) - }, - "添加用户": function(event, can, river, button) { - can.run(event, ["search", "Search.onimport.select", "user", "", ""], function(list) { - can.core.Next(list, function(item, next) { - can.run({}, [can.Conf(RIVER), "user", "action", "insert", "username", item[5]], function(msg) { - // can.user.Search(can, {river: can.Conf(RIVER)}) - next() - }) - }, function() { - }) - }) - }, - "重命名": function(event, can, river, button) { - can.user.input(event, can, ["name"], function(event, button, meta, list) { - var msg = can.request(event); msg.Option("hash", river.hash) - can.run(event, ["action", "modify", "name", meta.name], function(msg) { - can.user.Search(can, {river: can.Conf(RIVER)}) - }) - return true - }) - }, "共享群组": function(event, can, value) { can.user.input(event, can, ["name"], function(event, button, meta, list) { var msg = can.request(event) @@ -184,11 +182,6 @@ Volcanos("ondetail", {help: "菜单交互", list: ["添加应用", "添加设备 }) }, - "删除群组": function(event, can, river, button) { - can.run(event, ["remove", "hash", river.hash], function(msg) { - can.user.Search(can, {}) - }) - }, }) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Storm.css b/pane/Storm.css deleted file mode 100644 index fc7eac82..00000000 --- a/pane/Storm.css +++ /dev/null @@ -1,23 +0,0 @@ -fieldset.Storm { - min-width:80px; - max-width:160px; - min-height:160px; - overflow:auto; - float:right; -} -fieldset.Storm>div.output { - padding:0; -} -fieldset.Storm>div.output>div.item { - padding-left:6px; -} -fieldset.Storm>div.output>div.item:hover { - cursor:pointer; - background-color:red; - border:ridge 2px yellow; -} -fieldset.Storm>div.output>div.item.select { - background-color:red; - border:ridge 2px yellow; -} - diff --git a/pane/Storm.js b/pane/Storm.js deleted file mode 100644 index b9bb47ea..00000000 --- a/pane/Storm.js +++ /dev/null @@ -1,93 +0,0 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { - }, -}) -Volcanos("onaction", {help: "交互操作", list: ["创建", "刷新"], _init: function(can, msg, list, cb, target) { - can.onexport._init(can, msg, list, cb, target) - }, - create: function(can) { - can.user.input(event, can, [["type", "public", "protected", "private"], "name", "text"], function(event, button, meta, list) { - can.run(event, [can.Conf("river"), can.Conf("storm"), "action", "create"].concat(list), function(msg) { - can.user.Search(can, {"river": can.Conf("river"), "storm": msg.Result()}) - }) - return true - }) - }, - "创建": function(event, can) { - can.onaction.create(can) - }, - "刷新": function(event, can) { - can.user.Search(can, {"river": can.Conf("river"), "storm": can.Conf("storm")}) - }, -}) -Volcanos("ondetail", {help: "交互菜单", list: ["添加工具", "重命名", "共享", "删除"], - insert: function(can) { - can.run(event, ["search", "Search.onimport.select", "command", "", ""], function(list) { - var args = []; can.core.List(list, function(item) { - args = args.concat([item[0], item[5], item[4], ""]) - }) - can.run(event, [can.Conf("river"), can.Conf("storm"), "action", "tool"].concat(args), function(msg) { - can.user.Search(can, {"river": can.Conf("river"), "storm": can.Conf("storm")}) - }) - }) - }, - "添加工具": function(event, can, value) { - can.run(event, ["search", "Search.onimport.select", "command", "", ""], function(list) { - var args = []; can.core.List(list, function(item) { - args = args.concat([item[0], item[5], item[4], ""]) - }) - can.run(event, [can.Conf("river"), can.Conf("storm"), "action", "tool"].concat(args), function(msg) { - can.user.Search(can, {"river": can.Conf("river"), "storm": can.Conf("storm")}) - }) - }) - }, - "重命名": function(event, can, value) { - can.user.input(event, can, ["name"], function(event, button, meta, list) { - can.run(event, [can.Conf("river"), value.key, "action", "rename", meta.name], function(msg) { - can.user.Search(can, {"river": can.Conf("river"), "storm": can.Conf("storm")}) - }) - return true - }) - }, - "共享": function(event, can, value) { - can.user.input(event, can, ["name"], function(event, button, meta, list) { - var msg = can.request(event) - can.user.share(can, msg, [can.Conf("river"), value.key, "action", "share", meta.name]) - return true - }) - }, - "删除": function(event, can, value) { - can.run(event, [can.Conf("river"), value.key, "action", "remove"], function(msg) { - can.user.Search(can, {"river": can.Conf("river")}) - }) - }, -}) -Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "storm" - can.Cache(can.Conf("river"), can._output, can.Conf(key)) - var river = can.Conf("river", msg.Option("river")) - if (msg.Option(key, can.Conf(key, can.Cache(river, can._output)||""))) { - return can.run(msg._event, ["search", "Action.onaction._init"]) - } - - can.run(msg._event, [river], function(sup) { can._output.innerHTML = ""; var select; sup.Table(function(value, index, array) { - var view = can.onappend.item(can, can._output, "item", value, function(event, item) { var msg = can.request(event, {_msg: sup}) - // 左键点击 - msg.Option("river", river) - msg.Option(key, can.Conf(key, value.key)), can.run(event, ["search", "Action.onaction._init"]) - }, function(event, item) { - // 右键点击 - can.onappend.menu(can, msg, value) - }) - - if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { - select = view - if (!value.count) { - can.ondetail["添加工具"]({}, can, value) - } - } - }); select && select.click() }) - }, - key: function(can, msg) { - // msg.Option("storm", can.Conf("storm")) - }, -}) - diff --git a/plugin/state.js b/plugin/state.js index fb687aa6..053c6202 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -2,6 +2,34 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, }, }) Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { + // can.onaction._process(can, sub, value, msg, cmds, cb, silent) + }, + _process: function(can, sub, conf, msg, cmds, cb, silent) { + var p = can.onaction[msg.Option("_process")] + typeof p == "function"? p(can, sub, conf, msg, cmds, cb, silent): typeof cb == "function" && cb(msg) + can.run(msg._event, ["search", "Footer.onaction.ncmd"]) + }, + _progress: function(can, sub, conf, msg, cmds, cb, silent) { + var size = msg.Append("size") || msg.Append("count") + if (size != "" && size == msg.Append("total")) { + return typeof cb == "function" && cb(msg) + } + can.user.toast(can, { + width: 400, + title: conf.name+" "+msg.Append("step")+"% ", duration: 1100, + text: "执行进度: "+can.base.Size(size||0)+"/"+can.base.Size(msg.Append("total")||"1000")+"\n"+msg.Append("name"), + progress: parseInt(msg.Append("step")), + }) + can.page.Select(can, sub._output, "td", function(td) { + if (td.innerText == msg.Option("name")) { + can.page.ClassList.add(can, td, "done") + } + }) + can.Timer(1000, function() { + var res = sub.request({}) + res.Option("_progress", msg.Option("_progress")) + sub.run(res._event, cmds, cb, silent) + }) }, input: function(event, can, name, cb) { var feature = can.Conf("feature") feature[name]? can.user.input(event, can, feature[name], function(ev, button, data, list) {