diff --git a/demo/order.js b/demo/order.js deleted file mode 100644 index 40709b19..00000000 --- a/demo/order.js +++ /dev/null @@ -1,25 +0,0 @@ -var Config = {name: "demo", volcano: "frame.js", iceberg: "/chat/", intshell: "plug.sh", - libs: ["lib/base", "lib/core", "lib/misc", "lib/page", "lib/user"], panes: [ - {type: "pane", name: "Header", help: "标题栏", pos: "head", list: ["pane/Header.js", "pane/Header.css"], state: ["time"]}, - {type: "pane", name: "River", help: "群聊组", pos: "left", list: ["pane/River.js", "pane/River.css"]}, - {type: "pane", name: "Storm", help: "应用流", pos: "right", list: ["pane/Storm.js", "pane/Storm.css"]}, - {type: "pane", name: "Action", help: "工作台", pos: "middle", list: ["pane/Action.js", "pane/Action.css"]}, - {type: "pane", name: "Footer", help: "状态条", pos: "foot", list: ["pane/Footer.js", "pane/Footer.css"]}, - ], main: {name: "Header", engine: "remote", list: []}, - list: ["plugin/state.js", "plugin/input.js", "plugin/table.js"], -} - -var Preload = Config.libs; Config.panes.forEach(function(pane) { - Preload = Preload.concat(pane.list); -}); Preload = Preload.concat(Config.list) - -Volcanos(Config.name, { _target: document.body, - _head: document.head, _body: document.body, - _width: window.innerWidth, _height: window.innerHeight, -}, Preload.concat(Config.volcano), function(can) { // 程序入口 - can.onimport._init(can, can.Conf(Config), [], function(msg) { - console.log(can._root, can._name, "start", can, msg); - can.Footer.onaction._init(can.Footer, msg); - }, can._target) -}) - diff --git a/demo/pane/Action.css b/demo/pane/Action.css deleted file mode 100644 index 24920f53..00000000 --- a/demo/pane/Action.css +++ /dev/null @@ -1,10 +0,0 @@ -fieldset.Action { - min-width:160px; - min-height:160px; - padding-left:10px; - padding-right:10px; -} -fieldset.Action>div.output>div.item:hover { - background-color:lightblue; -} - diff --git a/demo/pane/Action.js b/demo/pane/Action.js deleted file mode 100644 index 967a5e86..00000000 --- a/demo/pane/Action.js +++ /dev/null @@ -1,40 +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) - }, -}) -Volcanos("onexport", {help: "导出数据", list: [], - _init: function(can, msg, list, cb, target) { var key = "action"; - if (Volcanos.meta.follow[can._root]) { debugger } - can.run(msg._event, ["search", "Storm.onaction._init"], function(msg) { - if (Volcanos.meta.follow[can._root]) { debugger } - can.Cache(can.Conf("river")+can.Conf("storm"), can._output, can.Conf(key)); - var river = can.Conf("river", msg.Option("river")); - var storm = can.Conf("storm", msg.Option("storm")); - console.log(can._root, can._name, "show", river, storm); - if (can.Conf(key, msg.Option(key, can.Cache(river+"."+storm, can._output)))) { - typeof cb == "function" && cb(msg); return - } - - can.run(msg._event, [river, storm], function(msg) { can._output.innerHTML = ""; - if (Volcanos.meta.follow[can._root]) { debugger } - msg.Table(function(value, index, array) { - // 添加列表 - can.onappend._init(can, value, Config.libs.concat([value.display||"plugin/state.js"]), function(sub) { - sub.run = function(event, cmds, cb, silent) { - can.run(event, [river, storm, index].concat(cmds), cb, silent) - } - }, can._output) - can.Conf(key, "which") - }); - msg.Option(key, can.Conf(key)) - typeof cb == "function" && cb(msg) - }) - }) - }, -}) - diff --git a/demo/pane/Footer.css b/demo/pane/Footer.css deleted file mode 100644 index 307e3b3f..00000000 --- a/demo/pane/Footer.css +++ /dev/null @@ -1,19 +0,0 @@ -fieldset.Footer { - height:32px; - clear:both; -} -fieldset.Footer>div { - margin:7px 0; -} -fieldset.Footer>div.output div.title { - margin-left:5px; - float:left; -} -fieldset.Footer>div.output div.state { - float:right; -} -fieldset.Footer>div.output div.state>div { - margin-right:5px; - float:right; -} - diff --git a/demo/pane/Footer.js b/demo/pane/Footer.js deleted file mode 100644 index 7edf4125..00000000 --- a/demo/pane/Footer.js +++ /dev/null @@ -1,25 +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) - }, -}) -Volcanos("onexport", {help: "导出数据", list: [], - _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""; - can.run(msg._event, [], function(msg) { - console.log(can._root, can._name, "show", msg.result) - can.core.List(msg.result, function(title) { - can.page.Append(can, can._output, [{view: ["title", "div", title]}]) - }) - - console.log(can._root, can._name, "show", can.Conf("state")) - can.ui = can.page.Append(can, can._output, [{view: "state", list: can.core.List(can.Conf("state"), function(item) { - return {text: can.Conf(item)||"", className: item, click: function(event) {can.onaction[item](event, can, item)}}; - })}]) - }) - }, -}) - diff --git a/demo/pane/Header.js b/demo/pane/Header.js deleted file mode 100644 index 9521f1b2..00000000 --- a/demo/pane/Header.js +++ /dev/null @@ -1,39 +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) - can.run(msg._event, ["search", "Footer.onaction._init"], function(msg) { - }) - can.run(msg._event, ["search", "Action.onaction._init"], function(msg) { - }) - }, - title: function(event, can, key) { - }, - time: function(event, can, key) { - can.ui[key].innerHTML = can.base.Time().split(" ")[1] - }, -}) -Volcanos("onexport", {help: "导出数据", list: [], - _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""; - can.run(msg._event, [], function(msg) { - console.log(can._root, can._name, "show", msg.result) - can.core.List(msg.result, function(title) { - can.page.Append(can, can._output, [{view: ["title", "div", title], - click: function(event) {can.onaction["title"](event, can, "title")}, - }]) - }) - - console.log(can._root, can._name, "show", can.Conf("state")) - can.ui = can.page.Append(can, can._output, [{view: "state", list: can.core.List(can.Conf("state"), function(item) { - return {text: can.Conf(item)||"", className: item, click: function(event) {can.onaction[item](event, can, item)}}; - })}]) - - can.timer = can.Timer({interval: 1000, length: -1}, function(event) { - can.onaction.time(event, can, "time") - }) - }) - }, -}) diff --git a/demo/pane/River.js b/demo/pane/River.js deleted file mode 100644 index d8915b25..00000000 --- a/demo/pane/River.js +++ /dev/null @@ -1,37 +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) - }, -}) -Volcanos("onexport", {help: "导出数据", list: [], - _init: function(can, msg, list, cb, target) { var key = "river"; - if (Volcanos.meta.follow[can._root]) { debugger } - if (msg.Option(key, can.Conf(key))) { - typeof cb == "function" && cb (msg); return - } - - can.run(msg._event, [], function(msg) { can._output.innerHTML = ""; - if (Volcanos.meta.follow[can._root]) { debugger } - var select; msg.Table(function(value, index, array) { - // 添加列表 - var view = can.onappend.item(can, can._output, "item", value, function(event, item) { - // 左键点击 - can.Conf(key, value.key); can.run(event, ["search", "Storm.onaction._init"], function(action) { - // 切换群组 - }); - }, function(event) { - // 右键点击 - }); - if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { - select = view - } - }); select.click(); - typeof cb == "function" && cb(msg) - }) - }, -}) - diff --git a/demo/pane/Storm.css b/demo/pane/Storm.css deleted file mode 100644 index df64ac18..00000000 --- a/demo/pane/Storm.css +++ /dev/null @@ -1,21 +0,0 @@ -fieldset.Storm { - min-width:80px; - min-height:160px; - 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/demo/pane/Storm.js b/demo/pane/Storm.js deleted file mode 100644 index aed0854f..00000000 --- a/demo/pane/Storm.js +++ /dev/null @@ -1,41 +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) - }, -}) -Volcanos("onexport", {help: "导出数据", list: [], - _init: function(can, msg, list, cb, target) { var key = "storm"; - if (Volcanos.meta.follow[can._root]) { debugger } - can.run(msg._event, ["search", "River.onaction._init"], function(msg) { - if (Volcanos.meta.follow[can._root]) { debugger } - can.Cache(can.Conf("river"), can._output, can.Conf(key)); - var river = can.Conf("river", msg.Option("river")); - console.log(can._root, can._name, "show", river); - if (can.Conf(key, msg.Option(key, can.Cache(river, can._output)))) { - typeof cb == "function" && cb (msg); return - } - - can.run(msg._event, [river], function(msg) { can._output.innerHTML = ""; - if (Volcanos.meta.follow[can._root]) { debugger } - var select; msg.Table(function(value, index, array) { - // 添加列表 - var view = can.onappend.item(can, can._output, "item", value, function(event, item) { - // 左键点击 - can.Conf(key, value.key); can.run(event, ["search", "Action.onaction._init"], function(msg) { - }) - }, function(event, item) { - // 右键点击 - }); - if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { - select = view - } - }); select.click(); - typeof cb == "function" && cb(msg) - }) - }) - }, -}) diff --git a/demo/plugin/input.js b/demo/plugin/input.js deleted file mode 100644 index f37c07e4..00000000 --- a/demo/plugin/input.js +++ /dev/null @@ -1,27 +0,0 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, meta, list, cb, output, action, option, field) { output.innerHTML = ""; - }, -}) -Volcanos("onaction", {help: "控件交互", list: [], - onclick: function(event, can) { - switch (can.Conf("type")) { - case "button": - can.run(event, [], function() {}) - break - } - }, - onkeydown: function(event, can) { - switch (event.key) { - case "Enter": - can.run(event, [], function() {}) - break - } - }, - onkeyup: function(event, can) { - switch (event.key) { - case "Enter": - can.run(event, [], function() {}) - break - } - }, -}) diff --git a/demo/plugin/state.js b/demo/plugin/state.js deleted file mode 100644 index 8caf88e6..00000000 --- a/demo/plugin/state.js +++ /dev/null @@ -1,5 +0,0 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, meta, list, cb, target) { - }, -}) - diff --git a/demo/plugin/table.js b/demo/plugin/table.js deleted file mode 100644 index f76c9cb2..00000000 --- a/demo/plugin/table.js +++ /dev/null @@ -1,19 +0,0 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, msg, list, cb, output, action, option, field) { output.innerHTML = ""; - var table = can.page.AppendTable(can, output, msg, msg.append, function(event, value, key, index, tr, td) { - can.page.Select(can, option, "input.args", function(input) { if (input.name == key) { - input.value = value - } }) - }, function(event, value, key, index, tr, td) { - }); - msg.result && can.page.AppendBoard(can, output, msg.result.join("")) - }, -}) -Volcanos("onaction", {help: "控件交互", list: [], - onclick: function(event, can) { - can.run(event, [], function() {}) - }, -}) - - - diff --git a/demo/style.css b/demo/style.css deleted file mode 100644 index aceec56f..00000000 --- a/demo/style.css +++ /dev/null @@ -1,156 +0,0 @@ -* { - background:black; -} -body { - padding:0; - margin:0; -} -fieldset { - color:cyan; - padding:2px; - margin:0px; -} -legend { - margin-left:10px; -} - -fieldset>form.option { - padding:0 5px; -} -fieldset>form.option>br { - clear:both; -} -fieldset>form.option>div.item { - margin-right:3px; - float:left; -} -fieldset>form.option>div.item label { - margin-right:3px; -} -fieldset>form.option>div.item input.args.char { - width:20px; -} -fieldset>form.option>div.item input.args.tiny { - width:40px; -} -fieldset>form.option>div.item input.args { - width:80px; -} -fieldset>form.option>div.item input.args.cmd { - background-color:black; - color:white; - width:160px; -} -fieldset>form.option>div.item input.args.long { - width:240px; -} -fieldset>form.option>div.item input.args.full { - width:480px; -} -fieldset>form.option>div.item input.opts { - width:80px; -} -fieldset>form.option>div.item textarea.args { - width:300px; - height:50px; - background-color:cyan; -} - -fieldset>form.option>div.item.text>input { - background-color:cyan; -} -fieldset>form.option>div.item.button>input { - color:cyan; -} -fieldset>form.option>div.item.select>select { - color:cyan; -} -fieldset>form.option>div.item.textarea { - margin-top:4px; - clear:both; -} - -fieldset.Action>div.output { - overflow:auto; -} -fieldset>div.output { - margin-top:4px; - clear:both; - overflow:auto; -} - -fieldset table { - font-size:14px; - overflow: auto; -} -fieldset table caption { - font-size:18px; - font-style:italic; - border:solid 1px green; -} -fieldset table tbody { - overflow:auto; -} -fieldset table td sup.more { - color:red; -} - -fieldset table { - border:solid 1px green; - cursor:pointer; -} -fieldset table tr:hover { - background-color:#0fbd45; -} -fieldset table tr.over { - background:red; -} -fieldset table tr.select { - background-color:#0fbd45; -} -fieldset table th { - font-family:monospace; - background-color:#0fbd45; - cursor:pointer; - padding: 0 6px; -} -fieldset table td { - max-width:1200px; - font-family:monospace; - padding: 0 6px; - white-space: pre; -} -fieldset table td:hover { - background-color:red; -} -fieldset table td.select { - background-color:red; -} - -fieldset div.code { - color:white; - font-size:14px; - font-family:monospace; - background-color:#343a34f2; - white-space:pre; - padding:10px; - overflow:auto; - border:solid 3px green; - max-height:640px; -} -fieldset div.hidden { - display:none; -} - -fieldset div.code { - color:white; - font-size:14px; - font-family:monospace; - background-color:#343a34f2; - white-space:pre; - padding:10px; - overflow:auto; - border:solid 3px green; - max-height:640px; -} - diff --git a/demo/frame.js b/frame.js similarity index 98% rename from demo/frame.js rename to frame.js index aa484826..2281f210 100644 --- a/demo/frame.js +++ b/frame.js @@ -44,6 +44,7 @@ Volcanos("onappend", { var option = can.page.Select(can, field, "form.option")[0]; var action = can.page.Select(can, field, "div.action")[0]; var output = can.page.Select(can, field, "div.output")[0]; + var feature = JSON.parse(meta.feature||"{}")||{} // 添加插件 if (Volcanos.meta.follow[can._root]) { debugger } @@ -85,10 +86,10 @@ Volcanos("onappend", { if (silent) { typeof cb == "function" && cb(msg); return } // 添加组件 - var display = msg.Option("display")||meta.display||"table" + var display = msg.Option("display")||feature.display||"plugin/table" sub[display] = Volcanos(display, { _target: output, _option: option, _action: action, _output: output, - }, Config.libs.concat(["plugin/"+display]), function(table) { + }, Config.libs.concat([display]), function(table) { table.onimport._init(table, msg, msg.append||[], function() { }, output) }) diff --git a/frame_old.js b/old/frame_old.js similarity index 100% rename from frame_old.js rename to old/frame_old.js diff --git a/page/chat.js b/old/page/chat.js similarity index 100% rename from page/chat.js rename to old/page/chat.js diff --git a/page/demo.html b/old/page/demo.html similarity index 100% rename from page/demo.html rename to old/page/demo.html diff --git a/page/demo.js b/old/page/demo.js similarity index 100% rename from page/demo.js rename to old/page/demo.js diff --git a/old/page/frame_old.js b/old/page/frame_old.js new file mode 120000 index 00000000..f8b9cc53 --- /dev/null +++ b/old/page/frame_old.js @@ -0,0 +1 @@ +../frame_old.js \ No newline at end of file diff --git a/demo/index.html b/old/page/index.html similarity index 58% rename from demo/index.html rename to old/page/index.html index 657607a7..a9d7642a 100644 --- a/demo/index.html +++ b/old/page/index.html @@ -5,11 +5,12 @@ volcanos - + - - + + + diff --git a/old/page/index.js b/old/page/index.js new file mode 100644 index 00000000..dde63d82 --- /dev/null +++ b/old/page/index.js @@ -0,0 +1,46 @@ +var Config = {iceberg: "/chat/", volcano: "", + libs: ["lib/base", "lib/core", "lib/misc", "lib/page", "lib/user"], + main: "chat", list: [ + "page/chat", + "pane/float/Toast", "pane/float/Carte", + "pane/float/Tutor", "pane/float/Debug", + "pane/float/Login", "pane/float/Favor", + + "pane/Header", + "pane/River", "pane/Storm", + "pane/Target", "pane/Source", "pane/Action", + "pane/Ocean", "pane/Steam", + "pane/Footer", + + "plugin/state", "plugin/table", "plugin/input", + "plugin/input/date", "plugin/input/key", + ], pane: [ + {group: "index", name: "Toast", path: "float/", pos: "dialog", duration: 3000}, + {group: "index", name: "Carte", path: "float/", pos: "dialog"}, + {group: "index", name: "Tutor", path: "float/", pos: "dialog"}, + {group: "index", name: "Debug", path: "float/", pos: "dialog"}, + {group: "index", name: "Login", path: "float/", pos: "dialog"}, + {group: "index", name: "Favor", path: "float/", pos: "dialog"}, + + {group: "index", name: "Header", pos: "head", state: ["time", "user", "link"]}, + {group: "index", name: "River", pos: "left"}, + {group: "index", name: "Storm", pos: "right"}, + + {group: "index", name: "Target", pos: "top"}, + {group: "index", name: "Source", pos: "center"}, + {group: "index", name: "Action", pos: "bottom"}, + + {group: "index", name: "Ocean", pos: "dialog", def_name: "meet"}, + {group: "index", name: "Steam", pos: "dialog", def_name: "miss"}, + {group: "index", name: "Footer", pos: "foot", state: ["ntxt", "ncmd"]}, + + ], title: "volcanos", topic: "black", layout: {def: "工作", list: ["工作", "办公", "聊天"], size: { + "最大": {head: 0, foot: 0, left: 0, right: 0, bottom: -1, center: 0, top: 0}, + "工作": {head: 30, foot: 30, left: 0, right: 100, bottom: -1, center: 0, top: 0}, + "办公": {head: 30, foot: 30, left: 100, right: 100, bottom: -1, center: 0, top: 0}, + "聊天": {head: 30, foot: 30, left: 100, right: 100, bottom: 300, center: 40, top: -2}, + "最长": {head: 30, foot: 30, left: 0, right: 0, bottom: -2, center: 0, top: 0}, + "全屏": {head: 0, foot: 0, left: 0, right: 0, bottom: -1, center: 0, top: 0}, + }, border: 4, + }, scroll: {line: 100}, +} diff --git a/old/page/lib b/old/page/lib new file mode 120000 index 00000000..58677ddb --- /dev/null +++ b/old/page/lib @@ -0,0 +1 @@ +../../lib \ No newline at end of file diff --git a/page/open.sh b/old/page/open.sh similarity index 100% rename from page/open.sh rename to old/page/open.sh diff --git a/page/page b/old/page/page similarity index 100% rename from page/page rename to old/page/page diff --git a/old/page/pane b/old/page/pane new file mode 120000 index 00000000..cabd17f1 --- /dev/null +++ b/old/page/pane @@ -0,0 +1 @@ +../pane \ No newline at end of file diff --git a/page/plugin b/old/page/plugin similarity index 100% rename from page/plugin rename to old/page/plugin diff --git a/old/page/proto_old.js b/old/page/proto_old.js new file mode 120000 index 00000000..1e3a533c --- /dev/null +++ b/old/page/proto_old.js @@ -0,0 +1 @@ +../proto_old.js \ No newline at end of file diff --git a/page/share.html b/old/page/share.html similarity index 100% rename from page/share.html rename to old/page/share.html diff --git a/page/share.js b/old/page/share.js similarity index 100% rename from page/share.js rename to old/page/share.js diff --git a/old/page/style_old.css b/old/page/style_old.css new file mode 120000 index 00000000..81f38473 --- /dev/null +++ b/old/page/style_old.css @@ -0,0 +1 @@ +../style_old.css \ No newline at end of file diff --git a/page/topic/black.css b/old/page/topic/black.css similarity index 100% rename from page/topic/black.css rename to old/page/topic/black.css diff --git a/page/topic/gray.css b/old/page/topic/gray.css similarity index 100% rename from page/topic/gray.css rename to old/page/topic/gray.css diff --git a/page/topic/miss.css b/old/page/topic/miss.css similarity index 100% rename from page/topic/miss.css rename to old/page/topic/miss.css diff --git a/page/topic/miss.svg b/old/page/topic/miss.svg similarity index 100% rename from page/topic/miss.svg rename to old/page/topic/miss.svg diff --git a/old/pane/Action.css b/old/pane/Action.css new file mode 100644 index 00000000..bb16ee50 --- /dev/null +++ b/old/pane/Action.css @@ -0,0 +1,4 @@ +fieldset.Action div.output div.item:hover { + background-color:lightblue; +} + diff --git a/old/pane/Action.js b/old/pane/Action.js new file mode 100644 index 00000000..c30f888e --- /dev/null +++ b/old/pane/Action.js @@ -0,0 +1,218 @@ +Volcanos("onimport", {help: "导入数据", list: [], + _begin: function(can) {}, + _start: function(can) { + can.page.Select(can, can.action, "input,select", function(input) { + input.value = can.user.Search(can, input.name) || input.value || "" + }) + }, + + init: function(event, can, msg, cmd, field) {can.output.innerHTML = ""; + can._local[msg.cmds[0]] = can._local[msg.cmds[0]] || {} + can._local[msg.cmds[0]][msg.cmds[1]] = msg.Table(function(item, index) {if (!item.name) {return} + // 添加插件 + var plugin = can[item.name] = can.Plugin(can, item.name, item, function(event, cmds, cbs) { + can.run(event, [item.river, item.storm, item.action].concat(cmds), cbs) + }, can.page.AppendField(can, can.output, "item "+item.name, item)) + return can._plugins.push(plugin), plugin + }) + }, + river: function(event, can, value, cmd, field) {if (value == "update") {return} + can.Conf("temp_river", value) + }, + storm: function(event, can, value, cmd, field) {if (value == "update") {return} + // 保存界面 + can.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output, "some"); + if (can.Cache(can.Conf("river", can.Conf("temp_river"))+"."+can.Conf("storm", value), can.output)) { + // 恢复界面 + return + } + // 刷新界面 + can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) { + can.onimport.init(event, can, msg, cmd, can.output) + }) + }, + pod: function(event, can, value, cmd, field) { + can.user.title(value) + }, + you: function(event, can, value, cmd, field) { + can.user.title(value) + }, + + layout: function(event, can, value, cmd, field) {value}, + scroll: function(event, can, value, cmd, field) {can.layout = value; + can.output.parentElement.scrollBy(value.x, value.y) + }, + favor: function(event, can, msg, cmd, field) {if (msg._hand) {return} + var cmds = msg.detail, key = cmds[0]; + if (key == can.Name()) {key = cmds[1], cmds = cmds.slice(1)} + + // 下发数据 + can.core.Item(can._local, function(river, list) { + can.core.Item(list, function(storm, list) { + can.core.List(list, function(sub) { + if (sub._name == key) { + sub.Select(event), msg._hand = true; + msg.Echo(can._name, " ", key) + } + }) + }) + }) + }, +}) +Volcanos("onaction", {help: "组件交互", list: [ + ["layout"].concat(Config.layout.list), "清屏", "刷新", "并行","串行", + ["action", "正常", "竖排", "编排", "定位", "定形"], + {input: "pod"}, {input: "you"}, + {input: "hot"}, {input: "top"}, + {input: "grp"}, {input: "lab"}, +], + layout: function(event, can, value, cmd, field) {can.Export(event, cmd, value)}, + + "清屏": function(event, can, msg, cmd, field) { + can.page.Select(can, can.output, "fieldset.item>div.output", function(item) { + item.innerHTML = ""; + }) + }, + "刷新": function(event, can, msg, cmd, field) { + can.page.Select(can, can.output, "fieldset.item>div.output", function(item) { + item.innerHTML = ""; + }) + can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) { + can.onimport.init(event, can, msg, cmd, can.output) + }) + }, + "并行": function(event, can, msg, cmd, field) { + can.page.Select(can, field, "fieldset.item", function(field) { + can.page.Select(can, field, "input[type=button]", function(input, index) { + index == 0 && input.click() + }) + }) + }, + "串行": function(event, can, msg, cmd, field) { + can.core.Next(can.page.Select(can, field, "fieldset.item", function(field) { + return field + }), function(field, cb) { + can.page.Select(can, field, "input[type=button]", function(input, index) { + index == 0 && field.Check(event, input, cb) + }) + }) + }, + + "正常": function(event, can, value, cmd, field) { + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.setAttribute("draggable", false) + item.style.position = "" + item.style.cursor = "" + item.style.clear = "" + item.style.left = "" + item.style.top = "" + }) + }, + "竖排": function(event, can, value, cmd, field) { + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.style.clear = "both" + }) + }, + "编排": function(event, can, value, cmd, field) { + can.page.Select(can, can.target, "fieldset.item", function(item) { + item.setAttribute("draggable", true) + item.ondragstart = function(event) {can.drag = event.target} + item.ondragover = function(event) {event.preventDefault()} + item.ondrop = function(event) {event.preventDefault() + item.parentNode.insertBefore(can.drag, item) + } + }) + }, + "定位": function(event, can, value, cmd, field) { + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.style.left = item.offsetLeft + "px" + item.style.top = item.offsetTop + "px" + }) + + var max, current, begin; + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.style.position = "absolute" + + item.onmousedown = function(event) {if (can.Action("action") != "定位") {return} + if (current) { + // 更新位置 + current.style.left = begin.left + event.clientX - begin.x + "px" + current.style.top = begin.top + event.clientY - begin.y + "px" + current = null; + return + } + // 记录位置 + current = item; + current.style["z-index"] = max = max + 1 + begin = {x: event.clientX, y: event.clientY, left: item.offsetLeft, top: item.offsetTop} + }; + + can.output.onmousemove = item.onmousemove = function(event) {if (!current) {return} + // 移动位置 + current.style.left = begin.left + event.clientX - begin.x + "px" + current.style.top = begin.top + event.clientY - begin.y + "px" + } + }) + }, + "定形": function(event, can, value, cmd, field) { + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.style.top = item.offsetTop + "px" + item.style.left = item.offsetLeft + "px" + item.style.width = item.offsetWidth + "px" + item.style.height = item.offsetHeight + "px" + }) + + var max, pos, current, begin; + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.style.position = "absolute" + + item.onmousedown = function(event) { + if (can.Action("action") != "定形") {return} + if (current) {current = null; return} + + // 记录位置 + current = item; + current.style["z-index"] = max = max + 1 + begin = { + x: event.clientX, y: event.clientY, + left: item.offsetLeft, top: item.offsetTop, + width: item.offsetWidth, height: item.offsetHeight, + } + }; + + item.onmousemove = function(event) { + if (can.Action("action") != "定形") {return} + var pos = can.page.Prepos(event, item) + if (!current) {return} + can.page.Resize(event, current, begin, pos) + } + }) + }, +}) +Volcanos("onchoice", {help: "组件菜单", list: ["共享", "保存", "刷新"], + "共享": function(event, can, msg, cmd, field) { + can.user.input(event, can, ["name", "text"], function(event, cmd, meta, list) { + var msg = can.Event(event); + msg.Option("name", meta.name) + msg.Option("text", meta.key) + cmd == "提交" && can.Export(event, can.Name(), "share") + return true + }) + }, + "保存": function(event, can, msg, cmd, field) { + var list = [] + can.page.Select(can, field, "fieldset.item", function(item) {var meta = item.Meta + can.page.Select(can, item, "form.option", function(option) { + if (option.parentNode != item) {return} + meta.args = can.page.Select(can, option, ".args", function(item) {return item.value}) + }) + list.push(meta.node||"", meta.group, meta.index, meta.help, JSON.stringify(meta.args||[])) + }) + can.run(event, [can.Conf("river"), can.Conf("storm"), "save"].concat(list), function(msg) { + can.user.toast("保存成功") + }) + }, +}) +Volcanos("ondetail", {help: "组件详情", list: []}) +Volcanos("onexport", {help: "导出数据", list: []}) + diff --git a/old/pane/Footer.css b/old/pane/Footer.css new file mode 100644 index 00000000..aa2f2117 --- /dev/null +++ b/old/pane/Footer.css @@ -0,0 +1,29 @@ +fieldset.Footer { + clear:both; + overflow:hidden; + height:32px; +} +fieldset.Footer>div.action { + padding:0; +} +fieldset.Footer>div.output div.title { + float:left; +} +fieldset.Footer>div.output div.magic { + float:right; + margin-top:-6px; +} +fieldset.Footer>div.output div.magic>label { + margin-right:2px; +} +fieldset.Footer>div.output div.magic>input { + background-color:black; + color:lightgreen;; +} +fieldset.Footer>div.output div.state { + float:right; +} +fieldset.Footer>div.output div.state div { + float:right; +} + diff --git a/old/pane/Footer.js b/old/pane/Footer.js new file mode 100644 index 00000000..c60e58b1 --- /dev/null +++ b/old/pane/Footer.js @@ -0,0 +1,31 @@ +Volcanos("onimport", {help: "导入数据", list: [], + _init: function(can, meta, list, cb, output, action, option, field) {output.innerHTML = ""; + can._init = function() { + can.run({}, [], function(msg) { + can.core.List(msg.result, function(title) { + can.page.Append(can, output, [{view: "title", list: [{text: title, className: "title"}]}]) + }) + + can.ui = can.page.Append(can, output, [{view: "state", list: can.core.List(meta.state, function(item) { + return {text: meta[item]||"", className: item, click: function(event) {can.Export(event, meta[item], item)}}; + })}]) + }) + } + }, + username: function(event, can, value, cmd, field) {can._init()}, + + email: function(event, can, value, cmd, field) { + can.ui[cmd].innerHTML = value + }, + ntxt: function(event, can, value, cmd, field) {var state = can.Conf(cmd); + can.ui[cmd].innerHTML = cmd+":"+ can.Conf(cmd, can.base.Int(value)+can.base.Int(state)) + }, + ncmd: function(event, can, value, cmd, field) {var state = can.Conf(cmd); + can.ui && (can.ui[cmd].innerHTML = cmd+":"+ can.Conf(cmd, can.base.Int(value)+can.base.Int(state))) + }, +}) +Volcanos("onaction", {help: "组件交互", list: []}) +Volcanos("onchoice", {help: "组件菜单", list: []}) +Volcanos("ondetail", {help: "组件详情", list: []}) +Volcanos("onexport", {help: "导出数据", list: []}) + diff --git a/demo/pane/Header.css b/old/pane/Header.css similarity index 75% rename from demo/pane/Header.css rename to old/pane/Header.css index bb6b95ea..a59bdd90 100644 --- a/demo/pane/Header.css +++ b/old/pane/Header.css @@ -1,27 +1,29 @@ fieldset.Header { height:32px; + min-width:640px; clear:both; } -fieldset.Header>div { - margin:7px 0; +fieldset.Header>div.action { + padding:0; } fieldset.Header>div.output>div.title { - margin-left:5px; cursor:pointer; float:left; } fieldset.Header>div.output>div.title:hover { + cursor:pointer; background-color:red; border:ridge 2px yellow; } - fieldset.Header>div.output>div.state { - margin-right:5px; float:right; } +fieldset.Header>div.output>div.state div.item { + padding:0; +} fieldset.Header>div.output>div.state>div { cursor:pointer; - margin-right:5px; + margin-left:5px; float:right; } fieldset.Header>div.output>div.state>div:hover { diff --git a/old/pane/Header.js b/old/pane/Header.js new file mode 100644 index 00000000..79a2d94b --- /dev/null +++ b/old/pane/Header.js @@ -0,0 +1,59 @@ +Volcanos("onimport", {help: "导入数据", list: [], + _init: function(can, meta, list, cb, output, action, option, field) {output.innerHTML = ""; + can._init = function() { + can.run({}, [], function(msg) { + can.core.List(msg.result, function(title) { + can.page.Append(can, output, [{view: "title", list: [{text: title, className: "title"}], + click: function(event) {can.Export(event, meta.title, "title")}, + }]) + }) + + can.ui = can.page.Append(can, output, [{view: "state", list: can.core.List(meta.state, function(item) { + return {text: meta[item]||"", className: item, click: function(event) {can.Export(event, meta[item], item)}}; + })}]) + + can.timer = can.Timer({interval: 1000, length: -1}, function(event) { + can.onimport.time(event, can, can.base.Time().split(" ")[1], "time") + }) + }) + } + }, + username: function(event, can, value, cmd, field) {can.Conf("user", value), can._init()}, + + title: function(event, can, value, cmd, field) { + can.ui[cmd].innerHTML = value + }, + time: function(event, can, value, cmd, field) { + can.ui[cmd].innerHTML = value + }, + + river: function(event, can, value, cmd, field) {if (value == "update") {return} + can.Conf("river", value) + }, + storm: function(event, can, value, cmd, field) {if (value == "update") {return} + can.Conf("storm", value) + }, + layout: function(event, can, value, cmd, field) {if (value == "update") {return} + can.Conf("layout", value) + }, +}) +Volcanos("onaction", {help: "组件交互", list: []}) +Volcanos("onchoice", {help: "组件菜单", list: []}) +Volcanos("ondetail", {help: "组件详情", list: []}) +Volcanos("onexport", {help: "导出数据", list: [], + title: function(event, can, value, cmd, field) { + var args = {river: can.Conf("river"), storm: can.Conf("storm"), layout: can.Conf("layout")} + + can.page.Select(can, document.body, "fieldset.Action>div.action input", function(input) { + input.name && input.value && (args[input.name] = input.value) + }) + can.user.Search(can, args) + }, + user: function(event, can, value, cmd, field) { + if (can.user.confirm("logout?")) { + can.user.Cookie(can, "sessid", "") + can.user.reload() + } + }, +}) + diff --git a/pane/Ocean.css b/old/pane/Ocean.css similarity index 100% rename from pane/Ocean.css rename to old/pane/Ocean.css diff --git a/pane/Ocean.js b/old/pane/Ocean.js similarity index 100% rename from pane/Ocean.js rename to old/pane/Ocean.js diff --git a/demo/pane/River.css b/old/pane/River.css similarity index 63% rename from demo/pane/River.css rename to old/pane/River.css index 49111b54..5dec11b0 100644 --- a/demo/pane/River.css +++ b/old/pane/River.css @@ -1,6 +1,4 @@ fieldset.River { - min-width:80px; - min-height:160px; float:left; } fieldset.River>div.output { @@ -9,10 +7,6 @@ fieldset.River>div.output { fieldset.River>div.output>div.item { padding-left:6px; } -fieldset.River>div.output>div.item:hover { - background-color:red; - border:ridge 2px yellow; -} fieldset.River>div.output>div.item.select { background-color:red; border:ridge 2px yellow; diff --git a/old/pane/River.js b/old/pane/River.js new file mode 100644 index 00000000..e49eea33 --- /dev/null +++ b/old/pane/River.js @@ -0,0 +1,79 @@ +Volcanos("onimport", {help: "导入数据", list: [], + init: function(event, can, msg, cmd, field) {can.output.innerHTML = ""; + can.page.AppendItem(can, can.output, msg.Table(), can.user.Search(can, can.Name()), function(event, line, item) { + can.Export(event, line.key, can.Name()) + }) + }, + river: function(event, can, value, cmd, field) {if (value == "update") { + can.run(event, [], function(msg) { + can.onimport.init(event, can, msg, cmd, field) + }) + }}, + favor: function(event, can, msg, cmd, field) {if (msg._hand) {return} + var cmds = msg.detail, key = cmds[0]; + if (key == can.Name()) {key = cmds[1], cmds = cmds.slice(1)} + + can.page.Select(can, field, "div.item>span", function(item) { + if (item.innerText == key) { + item.click(), msg._hand = true; + msg.Echo(can._name, " ", key) + } + }) + }, +}) +Volcanos("onaction", {help: "组件交互", list: ["创建", "刷新"], + "创建": function(event, can, meta, cmd, field) { + can.Export(event, "create", "ocean") + }, + "刷新": function(event, can, meta, cmd, field) { + can.Import(event, "update", can.Name()) + }, +}) +Volcanos("onchoice", {help: "组件菜单", list: ["创建", "刷新", "宽度"], + "宽度": function(event, can, meta, cmd, field) { + var begin; + function end() { + field.onmousedown = null; + field.onmousemove = null; + field.style.cursor = ""; + begin = null; + } + + field.style.cursor = "e-resize" + field.onmousedown = function(event) {if (begin) {return end()} + begin = {x: event.clientX, width: field.offsetWidth} + } + field.onmousemove = function(event) {if (!begin) {return} + field.dataset.width = field.style.width = begin.width + event.clientX - begin.x + "px"; + can.Export(event, "", "layout"); + } + + can.user.prompt("输入宽度", function(width) { + field.dataset.width = field.style.width = width + "px" + can.Export(event, "", "layout") + end() + }, field.offsetWidth) + }, +}) +Volcanos("ondetail", {help: "组件详情", list: ["共享", "重命名", "删除"], + "共享": function(event, can, line, value, cmd, item) { + var msg = can.Event(event); + msg.Option("name", line.name) + msg.Option("text", line.key) + can.Export(event, can.Name(), "share") + }, + "重命名": function(event, can, line, value, cmd, item) { + can.user.prompt("输入新名:", function(name) { + can.run(event, [value, "rename", name], function(msg) { + can.Import(event, "update", can.Name()) + }) + }, line.name) + }, + "删除": function(event, can, line, value, cmd, item) { + can.run(event, [value, "remove"], function(msg) { + can.Import(event, "update", can.Name()) + }) + }, +}) +Volcanos("onexport", {help: "导出数据", list: []}) + diff --git a/pane/Source.css b/old/pane/Source.css similarity index 100% rename from pane/Source.css rename to old/pane/Source.css diff --git a/pane/Source.js b/old/pane/Source.js similarity index 100% rename from pane/Source.js rename to old/pane/Source.js diff --git a/pane/Steam.css b/old/pane/Steam.css similarity index 100% rename from pane/Steam.css rename to old/pane/Steam.css diff --git a/pane/Steam.js b/old/pane/Steam.js similarity index 100% rename from pane/Steam.js rename to old/pane/Steam.js diff --git a/old/pane/Storm.css b/old/pane/Storm.css new file mode 100644 index 00000000..b72d830c --- /dev/null +++ b/old/pane/Storm.css @@ -0,0 +1,10 @@ +fieldset.Storm { + float:right; +} +fieldset.Storm>div.output { + padding:0; +} +fieldset.Storm>div.output>div.item { + padding-left:6px; +} + diff --git a/old/pane/Storm.js b/old/pane/Storm.js new file mode 100644 index 00000000..f23ab8ea --- /dev/null +++ b/old/pane/Storm.js @@ -0,0 +1,89 @@ +Volcanos("onimport", {help: "导入数据", list: [], + init: function(event, can, msg, cmd, field) {can.output.innerHTML = ""; + can.page.AppendItem(can, can.output, msg.Table(), can.user.Search(can, can.Name()), function(event, line, item) { + can.Export(event, line.key, can.Name()) + }) + }, + river: function(event, can, value, cmd, field) {if (value == "update") {return} + can.run(event, [can.Conf("river", value)], function(msg) { + can.onimport.init(event, can, msg, cmd, field) + }) + }, + storm: function(event, can, value, cmd, field) { + if (value == "update") { + can.run(event, [can.Conf("river")], function(msg) { + can.onimport.init(event, can, msg, cmd, field) + }) + } else { + can.Conf(can.Name(), value) + } + }, + favor: function(event, can, msg, cmd, field) {if (msg._hand) {return} + var cmds = msg.detail, key = cmds[0]; + if (key == "river") {key = cmds[1], cmds = cmds.slice(1)} + + can.page.Select(can, field, "div.item>span", function(item) { + if (item.innerText == key) { + item.click(), msg._hand = true; + msg.Echo(can._name, " ", key) + } + }) + }, +}) +Volcanos("onaction", {help: "组件交互", list: ["创建", "刷新"], + "创建": function(event, can, meta, cmd, field) { + can.Export(event, "create", "steam") + }, + "刷新": function(event, can, meta, cmd, field) { + can.Import(event, "update", can.Name()) + }, +}) +Volcanos("onchoice", {help: "组件菜单", list: ["创建", "刷新", "宽度"], + "宽度": function(event, can, meta, cmd, field) { + var begin; + function end() { + field.onmousedown = null; + field.onmousemove = null; + field.style.cursor = ""; + begin = null; + } + + field.style.cursor = "w-resize" + field.onmousedown = function(event) {if (begin) {return end()} + begin = {x: event.clientX, width: field.offsetWidth} + } + field.onmousemove = function(event) {if (!begin) {return} + field.dataset.width = field.style.width = begin.width - event.clientX + begin.x + "px"; + can.Export(event, "", "layout"); + } + + can.user.prompt("输入宽度", function(width) { + field.dataset.width = field.style.width = width + "px" + can.Export(event, "", "layout") + end() + }, field.offsetWidth) + }, +}) +Volcanos("ondetail", {help: "组件详情", list: ["共享", "重命名", "删除"], + "共享": function(event, can, line, value, cmd, item) {can.share || (can.share = {}); + var msg = can.Event(event); + msg.Option("name", line.name) + msg.Option("text", line.key) + can.Export(event, can.Name(), "share") + }, + "重命名": function(event, can, line, value, cmd, item) { + can.user.prompt("输入新名:", function(name) { + can.run(event, [can.Conf("river"), value, "rename", name], function(msg) { + can.Import(event, "update", can.Name()) + }) + }, line.name) + }, + "删除": function(event, can, line, value, cmd, item) { + can.run(event, [can.Conf("river"), value, "remove"], function(msg) { + can.Import(event, "update", can.Name()) + }) + }, +}) +Volcanos("onexport", {help: "导出数据", list: [], +}) + diff --git a/pane/Target.css b/old/pane/Target.css similarity index 100% rename from pane/Target.css rename to old/pane/Target.css diff --git a/pane/Target.js b/old/pane/Target.js similarity index 100% rename from pane/Target.js rename to old/pane/Target.js diff --git a/pane/float/Carte.css b/old/pane/float/Carte.css similarity index 100% rename from pane/float/Carte.css rename to old/pane/float/Carte.css diff --git a/pane/float/Carte.js b/old/pane/float/Carte.js similarity index 100% rename from pane/float/Carte.js rename to old/pane/float/Carte.js diff --git a/pane/float/Debug.css b/old/pane/float/Debug.css similarity index 100% rename from pane/float/Debug.css rename to old/pane/float/Debug.css diff --git a/pane/float/Debug.js b/old/pane/float/Debug.js similarity index 100% rename from pane/float/Debug.js rename to old/pane/float/Debug.js diff --git a/pane/float/Favor.css b/old/pane/float/Favor.css similarity index 100% rename from pane/float/Favor.css rename to old/pane/float/Favor.css diff --git a/pane/float/Favor.js b/old/pane/float/Favor.js similarity index 100% rename from pane/float/Favor.js rename to old/pane/float/Favor.js diff --git a/pane/float/Login.css b/old/pane/float/Login.css similarity index 100% rename from pane/float/Login.css rename to old/pane/float/Login.css diff --git a/pane/float/Login.js b/old/pane/float/Login.js similarity index 100% rename from pane/float/Login.js rename to old/pane/float/Login.js diff --git a/pane/float/Toast.css b/old/pane/float/Toast.css similarity index 100% rename from pane/float/Toast.css rename to old/pane/float/Toast.css diff --git a/pane/float/Toast.js b/old/pane/float/Toast.js similarity index 100% rename from pane/float/Toast.js rename to old/pane/float/Toast.js diff --git a/pane/float/Tutor.css b/old/pane/float/Tutor.css similarity index 100% rename from pane/float/Tutor.css rename to old/pane/float/Tutor.css diff --git a/pane/float/Tutor.js b/old/pane/float/Tutor.js similarity index 100% rename from pane/float/Tutor.js rename to old/pane/float/Tutor.js diff --git a/plugin/chrome/chrome.html b/old/plugin/chrome/chrome.html similarity index 100% rename from plugin/chrome/chrome.html rename to old/plugin/chrome/chrome.html diff --git a/plugin/chrome/chrome.js b/old/plugin/chrome/chrome.js similarity index 100% rename from plugin/chrome/chrome.js rename to old/plugin/chrome/chrome.js diff --git a/plugin/chrome/config.js b/old/plugin/chrome/config.js similarity index 100% rename from plugin/chrome/config.js rename to old/plugin/chrome/config.js diff --git a/plugin/chrome/popup.html b/old/plugin/chrome/popup.html similarity index 100% rename from plugin/chrome/popup.html rename to old/plugin/chrome/popup.html diff --git a/plugin/chrome/popup.js b/old/plugin/chrome/popup.js similarity index 100% rename from plugin/chrome/popup.js rename to old/plugin/chrome/popup.js diff --git a/old/plugin/github.com/shylinux/echarts b/old/plugin/github.com/shylinux/echarts new file mode 160000 index 00000000..7a692891 --- /dev/null +++ b/old/plugin/github.com/shylinux/echarts @@ -0,0 +1 @@ +Subproject commit 7a6928917468fdc44c879de55baeaf933c052fc5 diff --git a/plugin/inner.js b/old/plugin/inner.js similarity index 100% rename from plugin/inner.js rename to old/plugin/inner.js diff --git a/old/plugin/input.js b/old/plugin/input.js new file mode 100644 index 00000000..b084acc4 --- /dev/null +++ b/old/plugin/input.js @@ -0,0 +1,117 @@ +Volcanos("onimport", {help: "导入数据", list: [], + init: shy("添加控件", function(can, item, name, value, option) { + var input = {type: "input", name: name, data: item}; + item.action = item.action || item.value || ""; + item.figure = item.figure || item.value || ""; + item.cb = item.cb || item.value || ""; + item.name && item.name.indexOf("@") == 0 && (item.name = item.name.slice(1)) && (item.position = item.position || "opts") + + switch (item.type = item.type || item._type || item._input || "text") { + case "upfile": item.type = "file"; break + case "button": + item.value = item.name || item.value; + break + case "select": + item.values = typeof item.values == "string"? item.values.split(" "): item.values; + if (!item.values && item.value) { + item.values = item.value.split("|") + item.value = item.values[0] + } + input.type = "select", input.list = item.values.map(function(value) { + return {type: "option", value: value, inner: value}; + }) + item.className || can.page.ClassList.add(can, item, item.position||"args"); + break + case "textarea": + input.type = "textarea" + // no break + case "password": + // no break + case "text": + item.className || can.page.ClassList.add(can, item, item.position||"args"); + item.value = value || item.value || ""; + item.autocomplete = "off"; + break + } + + if (item.value == "auto") {item.value = ""} + item.figure && item.figure.indexOf("@") == 0 && (item.figure = item.figure.slice(1)) && can.require(["plugin/input/"+item.figure], function() { + target.type != "button" && (target.value = "") + }) + + var target = can.Dream(option, "input", input)[input.name]; + item.type == "text" && !target.placeholder && (target.placeholder = item.name || ""); + item.type != "button" && !target.title && (target.title = item.placeholder || item.name || ""); + item.type == "textarea" && can.page.Append(can, option, [{type: "br"}]) + item.type == "select" && (target.value = value || item.value || item.values[item.index||0]) + item.type == "button" && item.action == "auto" && can.run && can.run({}); + return target; + }), + path: function(event, can, value, cmd, target) { + return target.value + (target.value == "" || target.value.endsWith("/")? "": "/") + value + }, +}) +Volcanos("onfigure", {help: "控件交互", list: []}) +Volcanos("onaction", {help: "控件交互", list: [], + onclick: function(event, can) {can.Select(event); + var figure = can.onfigure[can.item.cb] || can.onfigure[can.item.figure] + figure? can.page.AppendFigure(event, can, can.item.figure, can._name) && figure.click(event, can, can.item, can.item.name, event.target, can.figure): + can.item.type == "button" && can.run(event) + }, + onchange: function(event, can) { + can.item.type == "select" && can.item.action == "auto" && can.Runs(event) + }, + onkeydown: function(event, can) { + if (event.target.tagName == "TEXTAREA") {return} + + can.page.oninput(event, can, function(event) { + switch (event.key) { + case "b": + can.Append(event) + return true + case "m": + can.Clone(event) + return true + } + }) + + switch (event.key) { + case "Enter": can.run(event, []); break + case "Escape": event.target.blur(); break + default: + if (event.target.value.endsWith("j") && event.key == "k") { + can.page.DelText(event.target, event.target.selectionStart-1, 2); + event.target.blur(); + break + } + return false + } + event.stopPropagation() + event.preventDefault() + return true + }, + onkeyup: function(event, can) { + if (event.target.tagName == "TEXTAREA") {return} + + switch (event.key) { + default: return false + } + event.stopPropagation() + event.preventDefault() + return true + }, +}) +Volcanos("onchoice", {help: "控件菜单", list: ["全选", "复制", "清空"], + "全选": function(event, can, msg, value, target) { + can.target.focus(), can.target.setSelectionRange(0, can.target.value.length); + }, + "复制": function(event, can, msg, value, target) { + can.user.toast(can.page.CopyText(can, can.target.value), "复制成功") + }, + "清空": function(event, can, msg, value, target) { + can.target.value = ""; + }, +}) +Volcanos("ondetail", {help: "控件详情", list: []}) +Volcanos("onexport", {help: "导出数据", list: []}) + diff --git a/plugin/input/city.js b/old/plugin/input/city.js similarity index 100% rename from plugin/input/city.js rename to old/plugin/input/city.js diff --git a/plugin/input/date.js b/old/plugin/input/date.js similarity index 100% rename from plugin/input/date.js rename to old/plugin/input/date.js diff --git a/plugin/input/key.js b/old/plugin/input/key.js similarity index 100% rename from plugin/input/key.js rename to old/plugin/input/key.js diff --git a/plugin/input/province.js b/old/plugin/input/province.js similarity index 100% rename from plugin/input/province.js rename to old/plugin/input/province.js diff --git a/plugin/input/upload.js b/old/plugin/input/upload.js similarity index 100% rename from plugin/input/upload.js rename to old/plugin/input/upload.js diff --git a/plugin/local/mall/input.js b/old/plugin/local/mall/input.js similarity index 100% rename from plugin/local/mall/input.js rename to old/plugin/local/mall/input.js diff --git a/plugin/local/team/plan.css b/old/plugin/local/team/plan.css similarity index 100% rename from plugin/local/team/plan.css rename to old/plugin/local/team/plan.css diff --git a/plugin/local/team/plan.js b/old/plugin/local/team/plan.js similarity index 100% rename from plugin/local/team/plan.js rename to old/plugin/local/team/plan.js diff --git a/plugin/local/wiki/data.js b/old/plugin/local/wiki/data.js similarity index 100% rename from plugin/local/wiki/data.js rename to old/plugin/local/wiki/data.js diff --git a/plugin/local/wiki/draw.css b/old/plugin/local/wiki/draw.css similarity index 100% rename from plugin/local/wiki/draw.css rename to old/plugin/local/wiki/draw.css diff --git a/plugin/local/wiki/draw.js b/old/plugin/local/wiki/draw.js similarity index 100% rename from plugin/local/wiki/draw.js rename to old/plugin/local/wiki/draw.js diff --git a/plugin/local/wiki/draw/heart.js b/old/plugin/local/wiki/draw/heart.js similarity index 100% rename from plugin/local/wiki/draw/heart.js rename to old/plugin/local/wiki/draw/heart.js diff --git a/plugin/local/wiki/feel.js b/old/plugin/local/wiki/feel.js similarity index 100% rename from plugin/local/wiki/feel.js rename to old/plugin/local/wiki/feel.js diff --git a/plugin/local/wiki/walk.js b/old/plugin/local/wiki/walk.js similarity index 100% rename from plugin/local/wiki/walk.js rename to old/plugin/local/wiki/walk.js diff --git a/plugin/local/wiki/word.css b/old/plugin/local/wiki/word.css similarity index 100% rename from plugin/local/wiki/word.css rename to old/plugin/local/wiki/word.css diff --git a/plugin/local/wiki/word.js b/old/plugin/local/wiki/word.js similarity index 100% rename from plugin/local/wiki/word.js rename to old/plugin/local/wiki/word.js diff --git a/old/plugin/state.js b/old/plugin/state.js new file mode 100644 index 00000000..f909207a --- /dev/null +++ b/old/plugin/state.js @@ -0,0 +1,41 @@ +Volcanos("onimport", {help: "导入数据", list: []}) +Volcanos("onaction", {help: "组件交互", list: []}) +Volcanos("onchoice", {help: "组件菜单", list: ["执行", "返回", "共享", "重命名", "选项", "加参", "减参", "克隆", "删除"], + "执行": function(event, can, msg, cmd, field) {can.Runs(event)}, + "返回": function(event, can, msg, cmd, field) {can.Last(event)}, + "共享": function(event, can, msg, cmd, field) { + can.user.input(event, can, ["name", "text"], function(event, cmd, meta, list) { + var msg = can.Event(event); + msg.Option("name", meta.name) + msg.Option("text", meta.text) + can.Conf("args", JSON.stringify(can.Option())) + can.core.List(["node", "group", "index", "args"], function(key) { + msg.Option(key, can.Conf(key)) + }) + can.Export(event, "action", "share") + return true + }) + }, + "重命名": function(event, can, msg, cmd, field) {var meta = field.Meta; + meta.help = can.user.prompt("", function(help) { + meta.help = help + }, meta.help) + }, + "选项": function(event, can, msg, cmd, field) { + can.user.input(event, can, ["name", "value"], function(event, cmd, meta, list) { + var data = {type: "text", value: meta.value||""} + can.page.ClassList.add(can, data, "opts"); + + var input = {type: "input", name: meta.name, data: data}; + var target = can.Dream(can.option, "option", input)[input.name]; + return true + }) + }, + "加参": function(event, can, msg, cmd, field) {can.Append()}, + "减参": function(event, can, msg, cmd, field) {can.Remove(event)}, + "克隆": function(event, can, msg, cmd, field) {can.Clone(event)}, + "删除": function(event, can, msg, cmd, field) {can.Delete(event)}, +}) +Volcanos("ondetail", {help: "组件详情", list: []}) +Volcanos("onexport", {help: "导出数据", list: []}) + diff --git a/plugin/story/trend.js b/old/plugin/story/trend.js similarity index 100% rename from plugin/story/trend.js rename to old/plugin/story/trend.js diff --git a/old/plugin/table.js b/old/plugin/table.js new file mode 100644 index 00000000..d0d1ad50 --- /dev/null +++ b/old/plugin/table.js @@ -0,0 +1,143 @@ +Volcanos("onimport", {help: "导入数据", list: [], + init: function(can, msg, cb, output, action, option) {output.innerHTML = ""; + var table = can.page.AppendTable(can, output, msg, msg.append, function(event, value, key, index, tr, td) { + can.ondetail["复制"](event, can, msg, value, index, key, td); + can.Export(event, value.trim(), key, index) + }, function(event, value, key, index, tr, td) { + can.user.carte(event, shy("上下文菜单", can.ondetail, msg["field.detail"] || can.feature.detail || can.ondetail.list, function(event, cmd, meta) {var cb = meta[cmd]; + var sub = can.Event(event); + msg.append.forEach(function(key) {sub.Option(key, msg[key][index].trim())}) + + typeof cb == "function"? cb(event, can, msg, index, key, cmd, td): + can.run(event, ["action", typeof cb == "string"? cb: cmd, key, value.trim(), msg.Ids(index)], function(msg) { + can.user.toast(msg.Result()) + if (msg.Option("field.reload") == "true") { + can.run(event) + } + }, true) + })) + }); + + if (msg.Option("render") != "" && msg.result) { + var story = can.page.Append(can, output, [{view: [msg.Option("render"), "div", msg.Result()]}]).first; + can.page.Select(can, story, ".story", function(item) {var data = item.dataset; + switch (item.tagName) { + case "FIELDSET": + can.Plugin(can, data.name, JSON.parse(data.meta||"{}"), function(event, cmds, cb, silent) { + can.run(event, ["action", "story", data.type, data.name, data.text].concat(cmds), cb, true) + }, item, function(sub) { + + }) + break + } + }) + } else { + switch (msg._xhr.getResponseHeader("content-type")) { + case "image/png": + if (msg._xhr.responseType != "blob") { + break + } + var str = URL.createObjectURL(new Blob([msg._xhr.response], {type: "image/png"})); + can.page.Append(can, output, [{img: [str]}]) + break + + default: + msg.result && can.page.Append(can, output, [{view: ["code", "div"], list: [ + {view: ["code", "pre", can.page.Display(msg.Result())]}, + ]}]).code; + } + } + return typeof cb == "function" && cb(msg); + }, +}) +Volcanos("onaction", {help: "组件交互", list: []}) +Volcanos("onchoice", {help: "组件菜单", list: ["返回", "清空", "复制", "下载"], + "返回": function(event, can, msg, cmd, target) { + can.run(event, ["", "Last"]) + }, + "清空": function(event, can, msg, cmd, target) { + can.target.innerHTML = ""; + }, + "复制": function(event, can, msg, cmd, target) { + var list = can.onexport.Format(can, msg, "data"); + can.user.toast(can.page.CopyText(can, list[2]), "复制成功") + }, + "下载": function(event, can, msg, cmd, target) {msg = msg || can.msg; + var list = can.onexport.Format(can, msg, msg._plugin_name||"data"); + can.page.Download(can, list[0]+list[1], list[2]); + }, +}) +Volcanos("ondetail", {help: "组件详情", list: ["渲染", "选择", "编辑", "删除", "复制", "下载", "收藏"], + "渲染": function(event, can, msg, index, key, cmd, td) { + can._story = can._story || can.Plugin(can, msg.name[index], {inputs: [ + {_input: "button", name: "喜欢"}, + {_input: "button", name: "讨厌"}, + {_input: "button", name: "查看"}, + {_input: "button", name: "关闭"}, + ]}, function(event, cmds, cb, silent) { + var req = can.Event(event) + switch (req.Option("_action")) { + case "关闭": + can.page.Remove(can, can._story.target) + delete(can._story) + break + default: + req.Option("pod", ""); + can.run(event, ["set", msg.pod[index], msg.engine[index], msg.favor[index], msg.id[index], + msg.type[index], msg.name[index], msg.text[index]], function(res) { + can._story.Show(res.Option("display")||"table", res, cb) + }, true) + } + }, can.page.AppendField(can, document.body, "story", {name: msg.type[index], help: msg.name[index]}), function(plugin) { + can.page.Modify(can, plugin.target, {style: {position: "absolute", left: "10px", top: "100px"}}) + }) + can._story.Runs(event) + }, + "选择": "select", + "删除": "delete", + "编辑": function(event, can, msg, index, key, cmd, td) { + var text = td.innerHTML; + var input = can.page.Appends(can, td, [{type: "input", value: text, style: {width: td.clientWidth+"px"}, data: {onkeydown: function(event) { + if (event.key != "Enter") {return} + if (key == "value" && msg.key) {key = msg.key[index]} + + var sub = can.Event(event); + can.core.List(msg.append, function(key) {sub.Option(key, msg[key][index])}) + can.run(event, ["action", "modify", key, event.target.value, text, can.Option("id")||msg.Ids(index)], function(msg) { + td.innerHTML = event.target.value; + can.user.toast(msg.Result()||"修改成功") + }, true) + }}}]).first; + input.focus(); + input.setSelectionRange(0, input.value.length); + }, + "复制": function(event, can, msg, index, key, cmd, target) { + can.user.toast(can.page.CopyText(can, target.innerHTML), "复制成功") + }, + "下载": function(event, can, msg, index, key, cmd, target) { + can.page.Download(can, key, target.innerHTML); + }, + "收藏": function(event, can, msg, index, key, cmd, target) { + can.user.input(event, can, [ + {_input: "text", name: "favor", value: can._last_favor||""}, + {_input: "text", name: "type", value: msg.type && msg.type[index] || ""}, + {_input: "text", name: "name", value: msg.name && msg.name[index] || ""}, + {_input: "text", name: "text", value: msg.text && msg.text[index] || ""}, + ], function(event, cmd, meta, list) {can._last_favor = meta.favor; + can.run(event, ["action", "favor", meta.favor, meta.type, meta.name, meta.text], function(msg) { + can.user.toast(msg.Result()||"收藏成功"); + }, true) + }) + }, +}) +Volcanos("onexport", {help: "导出数据", list: [], + Format: function(can, msg, name) { + var ext = ".csv", txt = can.page.Select(can, can.target, "tr", function(tr) { + return can.page.Select(can, tr, "td,th", function(td) {return td.innerText}).join(",") + }).join("\n"); + + !txt && (ext = ".txt", txt = msg.result && msg.result.join("") || ""); + return [name, ext, txt] + }, +}) + diff --git a/proto_old.js b/old/proto_old.js similarity index 100% rename from proto_old.js rename to old/proto_old.js diff --git a/style_old.css b/old/style_old.css similarity index 100% rename from style_old.css rename to old/style_old.css diff --git a/page/index.html b/page/index.html index a9d7642a..99c68d07 100644 --- a/page/index.html +++ b/page/index.html @@ -5,12 +5,11 @@ volcanos - + + - - diff --git a/page/index.js b/page/index.js index dde63d82..40709b19 100644 --- a/page/index.js +++ b/page/index.js @@ -1,46 +1,25 @@ -var Config = {iceberg: "/chat/", volcano: "", - libs: ["lib/base", "lib/core", "lib/misc", "lib/page", "lib/user"], - main: "chat", list: [ - "page/chat", - "pane/float/Toast", "pane/float/Carte", - "pane/float/Tutor", "pane/float/Debug", - "pane/float/Login", "pane/float/Favor", - - "pane/Header", - "pane/River", "pane/Storm", - "pane/Target", "pane/Source", "pane/Action", - "pane/Ocean", "pane/Steam", - "pane/Footer", - - "plugin/state", "plugin/table", "plugin/input", - "plugin/input/date", "plugin/input/key", - ], pane: [ - {group: "index", name: "Toast", path: "float/", pos: "dialog", duration: 3000}, - {group: "index", name: "Carte", path: "float/", pos: "dialog"}, - {group: "index", name: "Tutor", path: "float/", pos: "dialog"}, - {group: "index", name: "Debug", path: "float/", pos: "dialog"}, - {group: "index", name: "Login", path: "float/", pos: "dialog"}, - {group: "index", name: "Favor", path: "float/", pos: "dialog"}, - - {group: "index", name: "Header", pos: "head", state: ["time", "user", "link"]}, - {group: "index", name: "River", pos: "left"}, - {group: "index", name: "Storm", pos: "right"}, - - {group: "index", name: "Target", pos: "top"}, - {group: "index", name: "Source", pos: "center"}, - {group: "index", name: "Action", pos: "bottom"}, - - {group: "index", name: "Ocean", pos: "dialog", def_name: "meet"}, - {group: "index", name: "Steam", pos: "dialog", def_name: "miss"}, - {group: "index", name: "Footer", pos: "foot", state: ["ntxt", "ncmd"]}, - - ], title: "volcanos", topic: "black", layout: {def: "工作", list: ["工作", "办公", "聊天"], size: { - "最大": {head: 0, foot: 0, left: 0, right: 0, bottom: -1, center: 0, top: 0}, - "工作": {head: 30, foot: 30, left: 0, right: 100, bottom: -1, center: 0, top: 0}, - "办公": {head: 30, foot: 30, left: 100, right: 100, bottom: -1, center: 0, top: 0}, - "聊天": {head: 30, foot: 30, left: 100, right: 100, bottom: 300, center: 40, top: -2}, - "最长": {head: 30, foot: 30, left: 0, right: 0, bottom: -2, center: 0, top: 0}, - "全屏": {head: 0, foot: 0, left: 0, right: 0, bottom: -1, center: 0, top: 0}, - }, border: 4, - }, scroll: {line: 100}, +var Config = {name: "demo", volcano: "frame.js", iceberg: "/chat/", intshell: "plug.sh", + libs: ["lib/base", "lib/core", "lib/misc", "lib/page", "lib/user"], panes: [ + {type: "pane", name: "Header", help: "标题栏", pos: "head", list: ["pane/Header.js", "pane/Header.css"], state: ["time"]}, + {type: "pane", name: "River", help: "群聊组", pos: "left", list: ["pane/River.js", "pane/River.css"]}, + {type: "pane", name: "Storm", help: "应用流", pos: "right", list: ["pane/Storm.js", "pane/Storm.css"]}, + {type: "pane", name: "Action", help: "工作台", pos: "middle", list: ["pane/Action.js", "pane/Action.css"]}, + {type: "pane", name: "Footer", help: "状态条", pos: "foot", list: ["pane/Footer.js", "pane/Footer.css"]}, + ], main: {name: "Header", engine: "remote", list: []}, + list: ["plugin/state.js", "plugin/input.js", "plugin/table.js"], } + +var Preload = Config.libs; Config.panes.forEach(function(pane) { + Preload = Preload.concat(pane.list); +}); Preload = Preload.concat(Config.list) + +Volcanos(Config.name, { _target: document.body, + _head: document.head, _body: document.body, + _width: window.innerWidth, _height: window.innerHeight, +}, Preload.concat(Config.volcano), function(can) { // 程序入口 + can.onimport._init(can, can.Conf(Config), [], function(msg) { + console.log(can._root, can._name, "start", can, msg); + can.Footer.onaction._init(can.Footer, msg); + }, can._target) +}) + diff --git a/page/lib b/page/lib deleted file mode 120000 index dc598c56..00000000 --- a/page/lib +++ /dev/null @@ -1 +0,0 @@ -../lib \ No newline at end of file diff --git a/pane/Action.css b/pane/Action.css index bb16ee50..24920f53 100644 --- a/pane/Action.css +++ b/pane/Action.css @@ -1,4 +1,10 @@ -fieldset.Action div.output div.item:hover { +fieldset.Action { + min-width:160px; + min-height:160px; + padding-left:10px; + padding-right:10px; +} +fieldset.Action>div.output>div.item:hover { background-color:lightblue; } diff --git a/pane/Action.js b/pane/Action.js index c30f888e..897ae038 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -1,218 +1,41 @@ Volcanos("onimport", {help: "导入数据", list: [], - _begin: function(can) {}, - _start: function(can) { - can.page.Select(can, can.action, "input,select", function(input) { - input.value = can.user.Search(can, input.name) || input.value || "" - }) + _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) + }, +}) +Volcanos("onexport", {help: "导出数据", list: [], + _init: function(can, msg, list, cb, target) { var key = "action"; + if (Volcanos.meta.follow[can._root]) { debugger } + can.run(msg._event, ["search", "Storm.onaction._init"], function(msg) { + if (Volcanos.meta.follow[can._root]) { debugger } + can.Cache(can.Conf("river")+can.Conf("storm"), can._output, can.Conf(key)); + var river = can.Conf("river", msg.Option("river")); + var storm = can.Conf("storm", msg.Option("storm")); + console.log(can._root, can._name, "show", river, storm); + if (can.Conf(key, msg.Option(key, can.Cache(river+"."+storm, can._output)))) { + typeof cb == "function" && cb(msg); return + } - init: function(event, can, msg, cmd, field) {can.output.innerHTML = ""; - can._local[msg.cmds[0]] = can._local[msg.cmds[0]] || {} - can._local[msg.cmds[0]][msg.cmds[1]] = msg.Table(function(item, index) {if (!item.name) {return} - // 添加插件 - var plugin = can[item.name] = can.Plugin(can, item.name, item, function(event, cmds, cbs) { - can.run(event, [item.river, item.storm, item.action].concat(cmds), cbs) - }, can.page.AppendField(can, can.output, "item "+item.name, item)) - return can._plugins.push(plugin), plugin - }) - }, - river: function(event, can, value, cmd, field) {if (value == "update") {return} - can.Conf("temp_river", value) - }, - storm: function(event, can, value, cmd, field) {if (value == "update") {return} - // 保存界面 - can.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output, "some"); - if (can.Cache(can.Conf("river", can.Conf("temp_river"))+"."+can.Conf("storm", value), can.output)) { - // 恢复界面 - return - } - // 刷新界面 - can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) { - can.onimport.init(event, can, msg, cmd, can.output) - }) - }, - pod: function(event, can, value, cmd, field) { - can.user.title(value) - }, - you: function(event, can, value, cmd, field) { - can.user.title(value) - }, - - layout: function(event, can, value, cmd, field) {value}, - scroll: function(event, can, value, cmd, field) {can.layout = value; - can.output.parentElement.scrollBy(value.x, value.y) - }, - favor: function(event, can, msg, cmd, field) {if (msg._hand) {return} - var cmds = msg.detail, key = cmds[0]; - if (key == can.Name()) {key = cmds[1], cmds = cmds.slice(1)} - - // 下发数据 - can.core.Item(can._local, function(river, list) { - can.core.Item(list, function(storm, list) { - can.core.List(list, function(sub) { - if (sub._name == key) { - sub.Select(event), msg._hand = true; - msg.Echo(can._name, " ", key) - } - }) + can.run(msg._event, [river, storm], function(msg) { can._output.innerHTML = ""; + if (Volcanos.meta.follow[can._root]) { debugger } + msg.Table(function(value, index, array) { + // 添加列表 + // + can.onappend._init(can, value, Config.libs.concat(["plugin/state.js"]), function(sub) { + sub.run = function(event, cmds, cb, silent) { + can.run(event, [river, storm, index].concat(cmds), cb, silent) + } + }, can._output) + can.Conf(key, "which") + }); + msg.Option(key, can.Conf(key)) + typeof cb == "function" && cb(msg) }) }) }, }) -Volcanos("onaction", {help: "组件交互", list: [ - ["layout"].concat(Config.layout.list), "清屏", "刷新", "并行","串行", - ["action", "正常", "竖排", "编排", "定位", "定形"], - {input: "pod"}, {input: "you"}, - {input: "hot"}, {input: "top"}, - {input: "grp"}, {input: "lab"}, -], - layout: function(event, can, value, cmd, field) {can.Export(event, cmd, value)}, - - "清屏": function(event, can, msg, cmd, field) { - can.page.Select(can, can.output, "fieldset.item>div.output", function(item) { - item.innerHTML = ""; - }) - }, - "刷新": function(event, can, msg, cmd, field) { - can.page.Select(can, can.output, "fieldset.item>div.output", function(item) { - item.innerHTML = ""; - }) - can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) { - can.onimport.init(event, can, msg, cmd, can.output) - }) - }, - "并行": function(event, can, msg, cmd, field) { - can.page.Select(can, field, "fieldset.item", function(field) { - can.page.Select(can, field, "input[type=button]", function(input, index) { - index == 0 && input.click() - }) - }) - }, - "串行": function(event, can, msg, cmd, field) { - can.core.Next(can.page.Select(can, field, "fieldset.item", function(field) { - return field - }), function(field, cb) { - can.page.Select(can, field, "input[type=button]", function(input, index) { - index == 0 && field.Check(event, input, cb) - }) - }) - }, - - "正常": function(event, can, value, cmd, field) { - can.page.Select(can, can.output, "fieldset.item", function(item) { - item.setAttribute("draggable", false) - item.style.position = "" - item.style.cursor = "" - item.style.clear = "" - item.style.left = "" - item.style.top = "" - }) - }, - "竖排": function(event, can, value, cmd, field) { - can.page.Select(can, can.output, "fieldset.item", function(item) { - item.style.clear = "both" - }) - }, - "编排": function(event, can, value, cmd, field) { - can.page.Select(can, can.target, "fieldset.item", function(item) { - item.setAttribute("draggable", true) - item.ondragstart = function(event) {can.drag = event.target} - item.ondragover = function(event) {event.preventDefault()} - item.ondrop = function(event) {event.preventDefault() - item.parentNode.insertBefore(can.drag, item) - } - }) - }, - "定位": function(event, can, value, cmd, field) { - can.page.Select(can, can.output, "fieldset.item", function(item) { - item.style.left = item.offsetLeft + "px" - item.style.top = item.offsetTop + "px" - }) - - var max, current, begin; - can.page.Select(can, can.output, "fieldset.item", function(item) { - item.style.position = "absolute" - - item.onmousedown = function(event) {if (can.Action("action") != "定位") {return} - if (current) { - // 更新位置 - current.style.left = begin.left + event.clientX - begin.x + "px" - current.style.top = begin.top + event.clientY - begin.y + "px" - current = null; - return - } - // 记录位置 - current = item; - current.style["z-index"] = max = max + 1 - begin = {x: event.clientX, y: event.clientY, left: item.offsetLeft, top: item.offsetTop} - }; - - can.output.onmousemove = item.onmousemove = function(event) {if (!current) {return} - // 移动位置 - current.style.left = begin.left + event.clientX - begin.x + "px" - current.style.top = begin.top + event.clientY - begin.y + "px" - } - }) - }, - "定形": function(event, can, value, cmd, field) { - can.page.Select(can, can.output, "fieldset.item", function(item) { - item.style.top = item.offsetTop + "px" - item.style.left = item.offsetLeft + "px" - item.style.width = item.offsetWidth + "px" - item.style.height = item.offsetHeight + "px" - }) - - var max, pos, current, begin; - can.page.Select(can, can.output, "fieldset.item", function(item) { - item.style.position = "absolute" - - item.onmousedown = function(event) { - if (can.Action("action") != "定形") {return} - if (current) {current = null; return} - - // 记录位置 - current = item; - current.style["z-index"] = max = max + 1 - begin = { - x: event.clientX, y: event.clientY, - left: item.offsetLeft, top: item.offsetTop, - width: item.offsetWidth, height: item.offsetHeight, - } - }; - - item.onmousemove = function(event) { - if (can.Action("action") != "定形") {return} - var pos = can.page.Prepos(event, item) - if (!current) {return} - can.page.Resize(event, current, begin, pos) - } - }) - }, -}) -Volcanos("onchoice", {help: "组件菜单", list: ["共享", "保存", "刷新"], - "共享": function(event, can, msg, cmd, field) { - can.user.input(event, can, ["name", "text"], function(event, cmd, meta, list) { - var msg = can.Event(event); - msg.Option("name", meta.name) - msg.Option("text", meta.key) - cmd == "提交" && can.Export(event, can.Name(), "share") - return true - }) - }, - "保存": function(event, can, msg, cmd, field) { - var list = [] - can.page.Select(can, field, "fieldset.item", function(item) {var meta = item.Meta - can.page.Select(can, item, "form.option", function(option) { - if (option.parentNode != item) {return} - meta.args = can.page.Select(can, option, ".args", function(item) {return item.value}) - }) - list.push(meta.node||"", meta.group, meta.index, meta.help, JSON.stringify(meta.args||[])) - }) - can.run(event, [can.Conf("river"), can.Conf("storm"), "save"].concat(list), function(msg) { - can.user.toast("保存成功") - }) - }, -}) -Volcanos("ondetail", {help: "组件详情", list: []}) -Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Footer.css b/pane/Footer.css index aa2f2117..307e3b3f 100644 --- a/pane/Footer.css +++ b/pane/Footer.css @@ -1,29 +1,19 @@ fieldset.Footer { - clear:both; - overflow:hidden; height:32px; + clear:both; } -fieldset.Footer>div.action { - padding:0; +fieldset.Footer>div { + margin:7px 0; } fieldset.Footer>div.output div.title { + margin-left:5px; float:left; } -fieldset.Footer>div.output div.magic { - float:right; - margin-top:-6px; -} -fieldset.Footer>div.output div.magic>label { - margin-right:2px; -} -fieldset.Footer>div.output div.magic>input { - background-color:black; - color:lightgreen;; -} fieldset.Footer>div.output div.state { float:right; } -fieldset.Footer>div.output div.state div { +fieldset.Footer>div.output div.state>div { + margin-right:5px; float:right; } diff --git a/pane/Footer.js b/pane/Footer.js index c60e58b1..7edf4125 100644 --- a/pane/Footer.js +++ b/pane/Footer.js @@ -1,31 +1,25 @@ Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, meta, list, cb, output, action, option, field) {output.innerHTML = ""; - can._init = function() { - can.run({}, [], function(msg) { - can.core.List(msg.result, function(title) { - can.page.Append(can, output, [{view: "title", list: [{text: title, className: "title"}]}]) - }) - - can.ui = can.page.Append(can, output, [{view: "state", list: can.core.List(meta.state, function(item) { - return {text: meta[item]||"", className: item, click: function(event) {can.Export(event, meta[item], item)}}; - })}]) - }) - } - }, - username: function(event, can, value, cmd, field) {can._init()}, - - email: function(event, can, value, cmd, field) { - can.ui[cmd].innerHTML = value - }, - ntxt: function(event, can, value, cmd, field) {var state = can.Conf(cmd); - can.ui[cmd].innerHTML = cmd+":"+ can.Conf(cmd, can.base.Int(value)+can.base.Int(state)) - }, - ncmd: function(event, can, value, cmd, field) {var state = can.Conf(cmd); - can.ui && (can.ui[cmd].innerHTML = cmd+":"+ can.Conf(cmd, can.base.Int(value)+can.base.Int(state))) + _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) + }, +}) +Volcanos("onexport", {help: "导出数据", list: [], + _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""; + can.run(msg._event, [], function(msg) { + console.log(can._root, can._name, "show", msg.result) + can.core.List(msg.result, function(title) { + can.page.Append(can, can._output, [{view: ["title", "div", title]}]) + }) + + console.log(can._root, can._name, "show", can.Conf("state")) + can.ui = can.page.Append(can, can._output, [{view: "state", list: can.core.List(can.Conf("state"), function(item) { + return {text: can.Conf(item)||"", className: item, click: function(event) {can.onaction[item](event, can, item)}}; + })}]) + }) }, }) -Volcanos("onaction", {help: "组件交互", list: []}) -Volcanos("onchoice", {help: "组件菜单", list: []}) -Volcanos("ondetail", {help: "组件详情", list: []}) -Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Header.css b/pane/Header.css index a59bdd90..bb6b95ea 100644 --- a/pane/Header.css +++ b/pane/Header.css @@ -1,29 +1,27 @@ fieldset.Header { height:32px; - min-width:640px; clear:both; } -fieldset.Header>div.action { - padding:0; +fieldset.Header>div { + margin:7px 0; } fieldset.Header>div.output>div.title { + margin-left:5px; cursor:pointer; float:left; } fieldset.Header>div.output>div.title:hover { - cursor:pointer; background-color:red; border:ridge 2px yellow; } + fieldset.Header>div.output>div.state { + margin-right:5px; float:right; } -fieldset.Header>div.output>div.state div.item { - padding:0; -} fieldset.Header>div.output>div.state>div { cursor:pointer; - margin-left:5px; + margin-right:5px; float:right; } fieldset.Header>div.output>div.state>div:hover { diff --git a/pane/Header.js b/pane/Header.js index 79a2d94b..9521f1b2 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -1,59 +1,39 @@ Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, meta, list, cb, output, action, option, field) {output.innerHTML = ""; - can._init = function() { - can.run({}, [], function(msg) { - can.core.List(msg.result, function(title) { - can.page.Append(can, output, [{view: "title", list: [{text: title, className: "title"}], - click: function(event) {can.Export(event, meta.title, "title")}, - }]) - }) - - can.ui = can.page.Append(can, output, [{view: "state", list: can.core.List(meta.state, function(item) { - return {text: meta[item]||"", className: item, click: function(event) {can.Export(event, meta[item], item)}}; - })}]) - - can.timer = can.Timer({interval: 1000, length: -1}, function(event) { - can.onimport.time(event, can, can.base.Time().split(" ")[1], "time") - }) - }) - } - }, - username: function(event, can, value, cmd, field) {can.Conf("user", value), can._init()}, - - title: function(event, can, value, cmd, field) { - can.ui[cmd].innerHTML = value - }, - time: function(event, can, value, cmd, field) { - can.ui[cmd].innerHTML = value - }, - - river: function(event, can, value, cmd, field) {if (value == "update") {return} - can.Conf("river", value) - }, - storm: function(event, can, value, cmd, field) {if (value == "update") {return} - can.Conf("storm", value) - }, - layout: function(event, can, value, cmd, field) {if (value == "update") {return} - can.Conf("layout", value) + _init: function(can, meta, list, cb, target) { }, }) -Volcanos("onaction", {help: "组件交互", list: []}) -Volcanos("onchoice", {help: "组件菜单", list: []}) -Volcanos("ondetail", {help: "组件详情", list: []}) -Volcanos("onexport", {help: "导出数据", list: [], - title: function(event, can, value, cmd, field) { - var args = {river: can.Conf("river"), storm: can.Conf("storm"), layout: can.Conf("layout")} - - can.page.Select(can, document.body, "fieldset.Action>div.action input", function(input) { - input.name && input.value && (args[input.name] = input.value) +Volcanos("onaction", {help: "交互数据", list: [], + _init: function(can, msg, list, cb, target) { + can.onexport._init(can, msg, list, cb, target) + can.run(msg._event, ["search", "Footer.onaction._init"], function(msg) { + }) + can.run(msg._event, ["search", "Action.onaction._init"], function(msg) { }) - can.user.Search(can, args) }, - user: function(event, can, value, cmd, field) { - if (can.user.confirm("logout?")) { - can.user.Cookie(can, "sessid", "") - can.user.reload() - } + title: function(event, can, key) { + }, + time: function(event, can, key) { + can.ui[key].innerHTML = can.base.Time().split(" ")[1] }, }) +Volcanos("onexport", {help: "导出数据", list: [], + _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""; + can.run(msg._event, [], function(msg) { + console.log(can._root, can._name, "show", msg.result) + can.core.List(msg.result, function(title) { + can.page.Append(can, can._output, [{view: ["title", "div", title], + click: function(event) {can.onaction["title"](event, can, "title")}, + }]) + }) + console.log(can._root, can._name, "show", can.Conf("state")) + can.ui = can.page.Append(can, can._output, [{view: "state", list: can.core.List(can.Conf("state"), function(item) { + return {text: can.Conf(item)||"", className: item, click: function(event) {can.onaction[item](event, can, item)}}; + })}]) + + can.timer = can.Timer({interval: 1000, length: -1}, function(event) { + can.onaction.time(event, can, "time") + }) + }) + }, +}) diff --git a/pane/River.css b/pane/River.css index 5dec11b0..49111b54 100644 --- a/pane/River.css +++ b/pane/River.css @@ -1,4 +1,6 @@ fieldset.River { + min-width:80px; + min-height:160px; float:left; } fieldset.River>div.output { @@ -7,6 +9,10 @@ fieldset.River>div.output { fieldset.River>div.output>div.item { padding-left:6px; } +fieldset.River>div.output>div.item:hover { + background-color:red; + border:ridge 2px yellow; +} fieldset.River>div.output>div.item.select { background-color:red; border:ridge 2px yellow; diff --git a/pane/River.js b/pane/River.js index e49eea33..d8915b25 100644 --- a/pane/River.js +++ b/pane/River.js @@ -1,79 +1,37 @@ Volcanos("onimport", {help: "导入数据", list: [], - init: function(event, can, msg, cmd, field) {can.output.innerHTML = ""; - can.page.AppendItem(can, can.output, msg.Table(), can.user.Search(can, can.Name()), function(event, line, item) { - can.Export(event, line.key, can.Name()) - }) - }, - river: function(event, can, value, cmd, field) {if (value == "update") { - can.run(event, [], function(msg) { - can.onimport.init(event, can, msg, cmd, field) - }) - }}, - favor: function(event, can, msg, cmd, field) {if (msg._hand) {return} - var cmds = msg.detail, key = cmds[0]; - if (key == can.Name()) {key = cmds[1], cmds = cmds.slice(1)} - - can.page.Select(can, field, "div.item>span", function(item) { - if (item.innerText == key) { - item.click(), msg._hand = true; - msg.Echo(can._name, " ", key) - } - }) + _init: function(can, meta, list, cb, target) { }, }) -Volcanos("onaction", {help: "组件交互", list: ["创建", "刷新"], - "创建": function(event, can, meta, cmd, field) { - can.Export(event, "create", "ocean") - }, - "刷新": function(event, can, meta, cmd, field) { - can.Import(event, "update", can.Name()) +Volcanos("onaction", {help: "交互数据", list: [], + _init: function(can, msg, list, cb, target) { + can.onexport._init(can, msg, list, cb, target) }, }) -Volcanos("onchoice", {help: "组件菜单", list: ["创建", "刷新", "宽度"], - "宽度": function(event, can, meta, cmd, field) { - var begin; - function end() { - field.onmousedown = null; - field.onmousemove = null; - field.style.cursor = ""; - begin = null; +Volcanos("onexport", {help: "导出数据", list: [], + _init: function(can, msg, list, cb, target) { var key = "river"; + if (Volcanos.meta.follow[can._root]) { debugger } + if (msg.Option(key, can.Conf(key))) { + typeof cb == "function" && cb (msg); return } - field.style.cursor = "e-resize" - field.onmousedown = function(event) {if (begin) {return end()} - begin = {x: event.clientX, width: field.offsetWidth} - } - field.onmousemove = function(event) {if (!begin) {return} - field.dataset.width = field.style.width = begin.width + event.clientX - begin.x + "px"; - can.Export(event, "", "layout"); - } - - can.user.prompt("输入宽度", function(width) { - field.dataset.width = field.style.width = width + "px" - can.Export(event, "", "layout") - end() - }, field.offsetWidth) - }, -}) -Volcanos("ondetail", {help: "组件详情", list: ["共享", "重命名", "删除"], - "共享": function(event, can, line, value, cmd, item) { - var msg = can.Event(event); - msg.Option("name", line.name) - msg.Option("text", line.key) - can.Export(event, can.Name(), "share") - }, - "重命名": function(event, can, line, value, cmd, item) { - can.user.prompt("输入新名:", function(name) { - can.run(event, [value, "rename", name], function(msg) { - can.Import(event, "update", can.Name()) - }) - }, line.name) - }, - "删除": function(event, can, line, value, cmd, item) { - can.run(event, [value, "remove"], function(msg) { - can.Import(event, "update", can.Name()) + can.run(msg._event, [], function(msg) { can._output.innerHTML = ""; + if (Volcanos.meta.follow[can._root]) { debugger } + var select; msg.Table(function(value, index, array) { + // 添加列表 + var view = can.onappend.item(can, can._output, "item", value, function(event, item) { + // 左键点击 + can.Conf(key, value.key); can.run(event, ["search", "Storm.onaction._init"], function(action) { + // 切换群组 + }); + }, function(event) { + // 右键点击 + }); + if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { + select = view + } + }); select.click(); + typeof cb == "function" && cb(msg) }) }, }) -Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Storm.css b/pane/Storm.css index b72d830c..df64ac18 100644 --- a/pane/Storm.css +++ b/pane/Storm.css @@ -1,4 +1,6 @@ fieldset.Storm { + min-width:80px; + min-height:160px; float:right; } fieldset.Storm>div.output { @@ -7,4 +9,13 @@ fieldset.Storm>div.output { 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 index f23ab8ea..aed0854f 100644 --- a/pane/Storm.js +++ b/pane/Storm.js @@ -1,89 +1,41 @@ Volcanos("onimport", {help: "导入数据", list: [], - init: function(event, can, msg, cmd, field) {can.output.innerHTML = ""; - can.page.AppendItem(can, can.output, msg.Table(), can.user.Search(can, can.Name()), function(event, line, item) { - can.Export(event, line.key, can.Name()) - }) - }, - river: function(event, can, value, cmd, field) {if (value == "update") {return} - can.run(event, [can.Conf("river", value)], function(msg) { - can.onimport.init(event, can, msg, cmd, field) - }) - }, - storm: function(event, can, value, cmd, field) { - if (value == "update") { - can.run(event, [can.Conf("river")], function(msg) { - can.onimport.init(event, can, msg, cmd, field) - }) - } else { - can.Conf(can.Name(), value) - } - }, - favor: function(event, can, msg, cmd, field) {if (msg._hand) {return} - var cmds = msg.detail, key = cmds[0]; - if (key == "river") {key = cmds[1], cmds = cmds.slice(1)} - - can.page.Select(can, field, "div.item>span", function(item) { - if (item.innerText == key) { - item.click(), msg._hand = true; - msg.Echo(can._name, " ", key) - } - }) + _init: function(can, meta, list, cb, target) { }, }) -Volcanos("onaction", {help: "组件交互", list: ["创建", "刷新"], - "创建": function(event, can, meta, cmd, field) { - can.Export(event, "create", "steam") - }, - "刷新": function(event, can, meta, cmd, field) { - can.Import(event, "update", can.Name()) - }, -}) -Volcanos("onchoice", {help: "组件菜单", list: ["创建", "刷新", "宽度"], - "宽度": function(event, can, meta, cmd, field) { - var begin; - function end() { - field.onmousedown = null; - field.onmousemove = null; - field.style.cursor = ""; - begin = null; - } - - field.style.cursor = "w-resize" - field.onmousedown = function(event) {if (begin) {return end()} - begin = {x: event.clientX, width: field.offsetWidth} - } - field.onmousemove = function(event) {if (!begin) {return} - field.dataset.width = field.style.width = begin.width - event.clientX + begin.x + "px"; - can.Export(event, "", "layout"); - } - - can.user.prompt("输入宽度", function(width) { - field.dataset.width = field.style.width = width + "px" - can.Export(event, "", "layout") - end() - }, field.offsetWidth) - }, -}) -Volcanos("ondetail", {help: "组件详情", list: ["共享", "重命名", "删除"], - "共享": function(event, can, line, value, cmd, item) {can.share || (can.share = {}); - var msg = can.Event(event); - msg.Option("name", line.name) - msg.Option("text", line.key) - can.Export(event, can.Name(), "share") - }, - "重命名": function(event, can, line, value, cmd, item) { - can.user.prompt("输入新名:", function(name) { - can.run(event, [can.Conf("river"), value, "rename", name], function(msg) { - can.Import(event, "update", can.Name()) - }) - }, line.name) - }, - "删除": function(event, can, line, value, cmd, item) { - can.run(event, [can.Conf("river"), value, "remove"], function(msg) { - can.Import(event, "update", can.Name()) - }) +Volcanos("onaction", {help: "交互数据", list: [], + _init: function(can, msg, list, cb, target) { + can.onexport._init(can, msg, list, cb, target) }, }) Volcanos("onexport", {help: "导出数据", list: [], -}) + _init: function(can, msg, list, cb, target) { var key = "storm"; + if (Volcanos.meta.follow[can._root]) { debugger } + can.run(msg._event, ["search", "River.onaction._init"], function(msg) { + if (Volcanos.meta.follow[can._root]) { debugger } + can.Cache(can.Conf("river"), can._output, can.Conf(key)); + var river = can.Conf("river", msg.Option("river")); + console.log(can._root, can._name, "show", river); + if (can.Conf(key, msg.Option(key, can.Cache(river, can._output)))) { + typeof cb == "function" && cb (msg); return + } + can.run(msg._event, [river], function(msg) { can._output.innerHTML = ""; + if (Volcanos.meta.follow[can._root]) { debugger } + var select; msg.Table(function(value, index, array) { + // 添加列表 + var view = can.onappend.item(can, can._output, "item", value, function(event, item) { + // 左键点击 + can.Conf(key, value.key); can.run(event, ["search", "Action.onaction._init"], function(msg) { + }) + }, function(event, item) { + // 右键点击 + }); + if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { + select = view + } + }); select.click(); + typeof cb == "function" && cb(msg) + }) + }) + }, +}) diff --git a/plugin/input.js b/plugin/input.js index b084acc4..f37c07e4 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -1,117 +1,27 @@ Volcanos("onimport", {help: "导入数据", list: [], - init: shy("添加控件", function(can, item, name, value, option) { - var input = {type: "input", name: name, data: item}; - item.action = item.action || item.value || ""; - item.figure = item.figure || item.value || ""; - item.cb = item.cb || item.value || ""; - item.name && item.name.indexOf("@") == 0 && (item.name = item.name.slice(1)) && (item.position = item.position || "opts") - - switch (item.type = item.type || item._type || item._input || "text") { - case "upfile": item.type = "file"; break - case "button": - item.value = item.name || item.value; - break - case "select": - item.values = typeof item.values == "string"? item.values.split(" "): item.values; - if (!item.values && item.value) { - item.values = item.value.split("|") - item.value = item.values[0] - } - input.type = "select", input.list = item.values.map(function(value) { - return {type: "option", value: value, inner: value}; - }) - item.className || can.page.ClassList.add(can, item, item.position||"args"); - break - case "textarea": - input.type = "textarea" - // no break - case "password": - // no break - case "text": - item.className || can.page.ClassList.add(can, item, item.position||"args"); - item.value = value || item.value || ""; - item.autocomplete = "off"; - break - } - - if (item.value == "auto") {item.value = ""} - item.figure && item.figure.indexOf("@") == 0 && (item.figure = item.figure.slice(1)) && can.require(["plugin/input/"+item.figure], function() { - target.type != "button" && (target.value = "") - }) - - var target = can.Dream(option, "input", input)[input.name]; - item.type == "text" && !target.placeholder && (target.placeholder = item.name || ""); - item.type != "button" && !target.title && (target.title = item.placeholder || item.name || ""); - item.type == "textarea" && can.page.Append(can, option, [{type: "br"}]) - item.type == "select" && (target.value = value || item.value || item.values[item.index||0]) - item.type == "button" && item.action == "auto" && can.run && can.run({}); - return target; - }), - path: function(event, can, value, cmd, target) { - return target.value + (target.value == "" || target.value.endsWith("/")? "": "/") + value + _init: function(can, meta, list, cb, output, action, option, field) { output.innerHTML = ""; }, }) -Volcanos("onfigure", {help: "控件交互", list: []}) Volcanos("onaction", {help: "控件交互", list: [], - onclick: function(event, can) {can.Select(event); - var figure = can.onfigure[can.item.cb] || can.onfigure[can.item.figure] - figure? can.page.AppendFigure(event, can, can.item.figure, can._name) && figure.click(event, can, can.item, can.item.name, event.target, can.figure): - can.item.type == "button" && can.run(event) - }, - onchange: function(event, can) { - can.item.type == "select" && can.item.action == "auto" && can.Runs(event) + onclick: function(event, can) { + switch (can.Conf("type")) { + case "button": + can.run(event, [], function() {}) + break + } }, onkeydown: function(event, can) { - if (event.target.tagName == "TEXTAREA") {return} - - can.page.oninput(event, can, function(event) { - switch (event.key) { - case "b": - can.Append(event) - return true - case "m": - can.Clone(event) - return true - } - }) - switch (event.key) { - case "Enter": can.run(event, []); break - case "Escape": event.target.blur(); break - default: - if (event.target.value.endsWith("j") && event.key == "k") { - can.page.DelText(event.target, event.target.selectionStart-1, 2); - event.target.blur(); - break - } - return false + case "Enter": + can.run(event, [], function() {}) + break } - event.stopPropagation() - event.preventDefault() - return true }, onkeyup: function(event, can) { - if (event.target.tagName == "TEXTAREA") {return} - switch (event.key) { - default: return false + case "Enter": + can.run(event, [], function() {}) + break } - event.stopPropagation() - event.preventDefault() - return true }, }) -Volcanos("onchoice", {help: "控件菜单", list: ["全选", "复制", "清空"], - "全选": function(event, can, msg, value, target) { - can.target.focus(), can.target.setSelectionRange(0, can.target.value.length); - }, - "复制": function(event, can, msg, value, target) { - can.user.toast(can.page.CopyText(can, can.target.value), "复制成功") - }, - "清空": function(event, can, msg, value, target) { - can.target.value = ""; - }, -}) -Volcanos("ondetail", {help: "控件详情", list: []}) -Volcanos("onexport", {help: "导出数据", list: []}) - diff --git a/plugin/state.js b/plugin/state.js index f909207a..8caf88e6 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -1,41 +1,5 @@ -Volcanos("onimport", {help: "导入数据", list: []}) -Volcanos("onaction", {help: "组件交互", list: []}) -Volcanos("onchoice", {help: "组件菜单", list: ["执行", "返回", "共享", "重命名", "选项", "加参", "减参", "克隆", "删除"], - "执行": function(event, can, msg, cmd, field) {can.Runs(event)}, - "返回": function(event, can, msg, cmd, field) {can.Last(event)}, - "共享": function(event, can, msg, cmd, field) { - can.user.input(event, can, ["name", "text"], function(event, cmd, meta, list) { - var msg = can.Event(event); - msg.Option("name", meta.name) - msg.Option("text", meta.text) - can.Conf("args", JSON.stringify(can.Option())) - can.core.List(["node", "group", "index", "args"], function(key) { - msg.Option(key, can.Conf(key)) - }) - can.Export(event, "action", "share") - return true - }) +Volcanos("onimport", {help: "导入数据", list: [], + _init: function(can, meta, list, cb, target) { }, - "重命名": function(event, can, msg, cmd, field) {var meta = field.Meta; - meta.help = can.user.prompt("", function(help) { - meta.help = help - }, meta.help) - }, - "选项": function(event, can, msg, cmd, field) { - can.user.input(event, can, ["name", "value"], function(event, cmd, meta, list) { - var data = {type: "text", value: meta.value||""} - can.page.ClassList.add(can, data, "opts"); - - var input = {type: "input", name: meta.name, data: data}; - var target = can.Dream(can.option, "option", input)[input.name]; - return true - }) - }, - "加参": function(event, can, msg, cmd, field) {can.Append()}, - "减参": function(event, can, msg, cmd, field) {can.Remove(event)}, - "克隆": function(event, can, msg, cmd, field) {can.Clone(event)}, - "删除": function(event, can, msg, cmd, field) {can.Delete(event)}, }) -Volcanos("ondetail", {help: "组件详情", list: []}) -Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/table.js b/plugin/table.js index d0d1ad50..f76c9cb2 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -1,143 +1,19 @@ Volcanos("onimport", {help: "导入数据", list: [], - init: function(can, msg, cb, output, action, option) {output.innerHTML = ""; + _init: function(can, msg, list, cb, output, action, option, field) { output.innerHTML = ""; var table = can.page.AppendTable(can, output, msg, msg.append, function(event, value, key, index, tr, td) { - can.ondetail["复制"](event, can, msg, value, index, key, td); - can.Export(event, value.trim(), key, index) + can.page.Select(can, option, "input.args", function(input) { if (input.name == key) { + input.value = value + } }) }, function(event, value, key, index, tr, td) { - can.user.carte(event, shy("上下文菜单", can.ondetail, msg["field.detail"] || can.feature.detail || can.ondetail.list, function(event, cmd, meta) {var cb = meta[cmd]; - var sub = can.Event(event); - msg.append.forEach(function(key) {sub.Option(key, msg[key][index].trim())}) - - typeof cb == "function"? cb(event, can, msg, index, key, cmd, td): - can.run(event, ["action", typeof cb == "string"? cb: cmd, key, value.trim(), msg.Ids(index)], function(msg) { - can.user.toast(msg.Result()) - if (msg.Option("field.reload") == "true") { - can.run(event) - } - }, true) - })) }); - - if (msg.Option("render") != "" && msg.result) { - var story = can.page.Append(can, output, [{view: [msg.Option("render"), "div", msg.Result()]}]).first; - can.page.Select(can, story, ".story", function(item) {var data = item.dataset; - switch (item.tagName) { - case "FIELDSET": - can.Plugin(can, data.name, JSON.parse(data.meta||"{}"), function(event, cmds, cb, silent) { - can.run(event, ["action", "story", data.type, data.name, data.text].concat(cmds), cb, true) - }, item, function(sub) { - - }) - break - } - }) - } else { - switch (msg._xhr.getResponseHeader("content-type")) { - case "image/png": - if (msg._xhr.responseType != "blob") { - break - } - var str = URL.createObjectURL(new Blob([msg._xhr.response], {type: "image/png"})); - can.page.Append(can, output, [{img: [str]}]) - break - - default: - msg.result && can.page.Append(can, output, [{view: ["code", "div"], list: [ - {view: ["code", "pre", can.page.Display(msg.Result())]}, - ]}]).code; - } - } - return typeof cb == "function" && cb(msg); + msg.result && can.page.AppendBoard(can, output, msg.result.join("")) }, }) -Volcanos("onaction", {help: "组件交互", list: []}) -Volcanos("onchoice", {help: "组件菜单", list: ["返回", "清空", "复制", "下载"], - "返回": function(event, can, msg, cmd, target) { - can.run(event, ["", "Last"]) - }, - "清空": function(event, can, msg, cmd, target) { - can.target.innerHTML = ""; - }, - "复制": function(event, can, msg, cmd, target) { - var list = can.onexport.Format(can, msg, "data"); - can.user.toast(can.page.CopyText(can, list[2]), "复制成功") - }, - "下载": function(event, can, msg, cmd, target) {msg = msg || can.msg; - var list = can.onexport.Format(can, msg, msg._plugin_name||"data"); - can.page.Download(can, list[0]+list[1], list[2]); - }, -}) -Volcanos("ondetail", {help: "组件详情", list: ["渲染", "选择", "编辑", "删除", "复制", "下载", "收藏"], - "渲染": function(event, can, msg, index, key, cmd, td) { - can._story = can._story || can.Plugin(can, msg.name[index], {inputs: [ - {_input: "button", name: "喜欢"}, - {_input: "button", name: "讨厌"}, - {_input: "button", name: "查看"}, - {_input: "button", name: "关闭"}, - ]}, function(event, cmds, cb, silent) { - var req = can.Event(event) - switch (req.Option("_action")) { - case "关闭": - can.page.Remove(can, can._story.target) - delete(can._story) - break - default: - req.Option("pod", ""); - can.run(event, ["set", msg.pod[index], msg.engine[index], msg.favor[index], msg.id[index], - msg.type[index], msg.name[index], msg.text[index]], function(res) { - can._story.Show(res.Option("display")||"table", res, cb) - }, true) - } - }, can.page.AppendField(can, document.body, "story", {name: msg.type[index], help: msg.name[index]}), function(plugin) { - can.page.Modify(can, plugin.target, {style: {position: "absolute", left: "10px", top: "100px"}}) - }) - can._story.Runs(event) - }, - "选择": "select", - "删除": "delete", - "编辑": function(event, can, msg, index, key, cmd, td) { - var text = td.innerHTML; - var input = can.page.Appends(can, td, [{type: "input", value: text, style: {width: td.clientWidth+"px"}, data: {onkeydown: function(event) { - if (event.key != "Enter") {return} - if (key == "value" && msg.key) {key = msg.key[index]} - - var sub = can.Event(event); - can.core.List(msg.append, function(key) {sub.Option(key, msg[key][index])}) - can.run(event, ["action", "modify", key, event.target.value, text, can.Option("id")||msg.Ids(index)], function(msg) { - td.innerHTML = event.target.value; - can.user.toast(msg.Result()||"修改成功") - }, true) - }}}]).first; - input.focus(); - input.setSelectionRange(0, input.value.length); - }, - "复制": function(event, can, msg, index, key, cmd, target) { - can.user.toast(can.page.CopyText(can, target.innerHTML), "复制成功") - }, - "下载": function(event, can, msg, index, key, cmd, target) { - can.page.Download(can, key, target.innerHTML); - }, - "收藏": function(event, can, msg, index, key, cmd, target) { - can.user.input(event, can, [ - {_input: "text", name: "favor", value: can._last_favor||""}, - {_input: "text", name: "type", value: msg.type && msg.type[index] || ""}, - {_input: "text", name: "name", value: msg.name && msg.name[index] || ""}, - {_input: "text", name: "text", value: msg.text && msg.text[index] || ""}, - ], function(event, cmd, meta, list) {can._last_favor = meta.favor; - can.run(event, ["action", "favor", meta.favor, meta.type, meta.name, meta.text], function(msg) { - can.user.toast(msg.Result()||"收藏成功"); - }, true) - }) - }, -}) -Volcanos("onexport", {help: "导出数据", list: [], - Format: function(can, msg, name) { - var ext = ".csv", txt = can.page.Select(can, can.target, "tr", function(tr) { - return can.page.Select(can, tr, "td,th", function(td) {return td.innerText}).join(",") - }).join("\n"); - - !txt && (ext = ".txt", txt = msg.result && msg.result.join("") || ""); - return [name, ext, txt] +Volcanos("onaction", {help: "控件交互", list: [], + onclick: function(event, can) { + can.run(event, [], function() {}) }, }) + + diff --git a/demo/proto.js b/proto.js similarity index 100% rename from demo/proto.js rename to proto.js diff --git a/style.css b/style.css index e69de29b..aceec56f 100644 --- a/style.css +++ b/style.css @@ -0,0 +1,156 @@ +* { + background:black; +} +body { + padding:0; + margin:0; +} +fieldset { + color:cyan; + padding:2px; + margin:0px; +} +legend { + margin-left:10px; +} + +fieldset>form.option { + padding:0 5px; +} +fieldset>form.option>br { + clear:both; +} +fieldset>form.option>div.item { + margin-right:3px; + float:left; +} +fieldset>form.option>div.item label { + margin-right:3px; +} +fieldset>form.option>div.item input.args.char { + width:20px; +} +fieldset>form.option>div.item input.args.tiny { + width:40px; +} +fieldset>form.option>div.item input.args { + width:80px; +} +fieldset>form.option>div.item input.args.cmd { + background-color:black; + color:white; + width:160px; +} +fieldset>form.option>div.item input.args.long { + width:240px; +} +fieldset>form.option>div.item input.args.full { + width:480px; +} +fieldset>form.option>div.item input.opts { + width:80px; +} +fieldset>form.option>div.item textarea.args { + width:300px; + height:50px; + background-color:cyan; +} + +fieldset>form.option>div.item.text>input { + background-color:cyan; +} +fieldset>form.option>div.item.button>input { + color:cyan; +} +fieldset>form.option>div.item.select>select { + color:cyan; +} +fieldset>form.option>div.item.textarea { + margin-top:4px; + clear:both; +} + +fieldset.Action>div.output { + overflow:auto; +} +fieldset>div.output { + margin-top:4px; + clear:both; + overflow:auto; +} + +fieldset table { + font-size:14px; + overflow: auto; +} +fieldset table caption { + font-size:18px; + font-style:italic; + border:solid 1px green; +} +fieldset table tbody { + overflow:auto; +} +fieldset table td sup.more { + color:red; +} + +fieldset table { + border:solid 1px green; + cursor:pointer; +} +fieldset table tr:hover { + background-color:#0fbd45; +} +fieldset table tr.over { + background:red; +} +fieldset table tr.select { + background-color:#0fbd45; +} +fieldset table th { + font-family:monospace; + background-color:#0fbd45; + cursor:pointer; + padding: 0 6px; +} +fieldset table td { + max-width:1200px; + font-family:monospace; + padding: 0 6px; + white-space: pre; +} +fieldset table td:hover { + background-color:red; +} +fieldset table td.select { + background-color:red; +} + +fieldset div.code { + color:white; + font-size:14px; + font-family:monospace; + background-color:#343a34f2; + white-space:pre; + padding:10px; + overflow:auto; + border:solid 3px green; + max-height:640px; +} +fieldset div.hidden { + display:none; +} + +fieldset div.code { + color:white; + font-size:14px; + font-family:monospace; + background-color:#343a34f2; + white-space:pre; + padding:10px; + overflow:auto; + border:solid 3px green; + max-height:640px; +} +