diff --git a/client/mp/app.js b/client/mp/app.js index ad14f326..c9b44b46 100644 --- a/client/mp/app.js +++ b/client/mp/app.js @@ -5,7 +5,7 @@ App({ conf: {serve: "https://shylinux.com/chat"}, request: function(cmd, data, cb) {var app = this; data.sessid = app.conf.sessid wx.request({method: "POST", url: app.conf.serve+"/"+cmd, data: data, success(res) {var msg = res.data - console.log(msg) + console.log("POST", cmd, msg) if (res.statusCode == 401) { app.usercode(function() {app.request(cmd, data, cb)}) return @@ -26,6 +26,17 @@ App({ } }, } + var row = 0 + var index = [] + if (msg.append) { + for (var i = 0; i < msg.append.length; i++) { + row = msg[msg.append[i]].length > row? msg[msg.append[i]].length: row + } + for (var i = 0; i < row; i++) { + index.push(i) + } + } + msg._index = index typeof cb == "function" && cb(msg) }}) }, @@ -54,5 +65,6 @@ App({ toast: function(title) {wx.showToast({title: title})}, onLaunch: function() { this.conf.sessid = wx.getStorageSync("sessid") + console.log("load", "sessid", this.conf.sessid) }, }) diff --git a/client/mp/app.wxml b/client/mp/app.wxml index 88e04e02..74147a28 100644 --- a/client/mp/app.wxml +++ b/client/mp/app.wxml @@ -1,5 +1,5 @@ diff --git a/client/mp/pages/action/action.js b/client/mp/pages/action/action.js index 56c1f4fa..05f9c986 100644 --- a/client/mp/pages/action/action.js +++ b/client/mp/pages/action/action.js @@ -11,33 +11,34 @@ Page({ {name: "共享", bind: "refresh"}, {name: "扫码", bind: "action"}, ], - msg: {append: ["hi", "he"], hi: [1, 2], he: [3, 4]}, res: [], his: {}, + inputs: {}, }, - run: function(order, cb) {var page = this, field = page.data.res[order] - var his = page.data.his[order] || [] + run: function(order, cmd, cb) {var page = this, field = page.data.res[order] + // var his = page.data.his[order] || [] var arg = [] field.inputs.forEach(function(input) { if (input._input == "text") { arg.push(input.value||"") } - }) - his.push(arg) - page.data.his[order] = his - - var cmds = [page.data.river, page.data.storm, order] - field.inputs.forEach(function(input) { - if (input._input == "text") { - cmds.push(input.value||"") + if (input._input == "textarea") { + arg.push(input.value||"") } }) + // his.push(arg) + // page.data.his[order] = his + + var cmds = [page.data.river, page.data.storm, order] + cmds = cmds.concat(cmd||arg||[]) + for (var i = cmds.length-1; i > 0; i--) { if (cmds[i] === "") {cmds.pop()} else {break} } app.request("action", {cmds: cmds}, function(msg) { page.data.res[order].msg = msg page.setData({res: page.data.res}) + console.log("update-----", page.data.res[order]) typeof cb == "function" && cb(msg) }) }, @@ -48,7 +49,7 @@ Page({ break case "串行": function cb(i) { - page.run(i, function() {i < page.data.res.length && cb(i+1)}) + page.run(i, null, function() {i < page.data.res.length && cb(i+1)}) } cb(0) break @@ -82,10 +83,34 @@ Page({ onEnter: function(event) {var page = this, data = event.target.dataset page.data.res[data.order].inputs[data.index].value = event.detail.value }, + onfigure: { + key: { + click: function(event, page, data, cmd, field) { + page.run(data.order, ["action", "input", data.item.name, data.item.value], function(msg) { + console.log("onkey-----", page.data.res[data.order]) + }) + }, + }, + location: { + click: function(event, page, data, cmd, field) { + wx.chooseLocation({success: function(res) { + field.inputs[data.index].value = res.name + page.setData({res: page.data.res}) + page.run(data.order, ["action", "location", res.name, res.address, res.latitude*100000, res.longitude*100000]) + }}) + }, + } + }, onClick: function(event) {var page = this, data = event.target.dataset var field = page.data.res[data.order] + if (data && data.item && data.item._input == "text") { + var figure = page.onfigure[data.item.cb||data.item.figure||data.item.name] + figure && figure.click(event, page, data, "what", field) + return + } switch (data.input.cb) { case "Last": + break var his = page.data.his[data.order] || [] his.pop() var arg = his.pop() @@ -105,15 +130,21 @@ Page({ page.data.res[data.order].inputs.forEach(function(input) { if (input.name == data.field) { input.value = data.value - if (input.action == "auto") { - page.run(data.order) - } page.setData({res: page.data.res}) + page.data.inputs[data.order] = page.data.res[data.order].inputs + + if (input.action == "auto") { + page.run(data.order, null, function(msg) { + console.log("onwhich-----", page.data.res[data.order]) + + }) + } } }) }, onLoad: function (options) {var page = this + console.log("page", "action", options) app.conf.sessid = app.conf.sessid || options.sessid page.data.river = options.river page.data.storm = options.storm diff --git a/client/mp/pages/action/action.wxml b/client/mp/pages/action/action.wxml index 31740f7c..339f8605 100644 --- a/client/mp/pages/action/action.wxml +++ b/client/mp/pages/action/action.wxml @@ -1,15 +1,21 @@ - + - + + {{field.name}}({{field.help}}) - + - + + + + @@ -18,10 +24,10 @@ - - + +
{{item}}
{{field.msg[item][line]}}
{{item}}
{{field.msg[item][line]}}
- - {{item}} + + {{item}}
diff --git a/client/mp/pages/action/action.wxss b/client/mp/pages/action/action.wxss index 3c18c3d0..6a974a94 100644 --- a/client/mp/pages/action/action.wxss +++ b/client/mp/pages/action/action.wxss @@ -5,19 +5,25 @@ view.detail { margin-top:10px; clear:both; } -input { - width:80px; -} -text.title { +view.detail text.title { font-weight:bold; font-size:18px; } -view.detail>view.inputs>view { +view.detail view.inputs>view { float:left; } -.input { +view.detail input { + width:80px; + margin:2px; + padding:2px; border:solid 1px green; } -.output { +view.detail view.textarea { + clear:both; + width:calc(100% - 2px); + border:solid 1px green; +} +view.output { background-color:#272822; } + diff --git a/client/mp/pages/river/river.js b/client/mp/pages/river/river.js index 417298a0..40f62979 100644 --- a/client/mp/pages/river/river.js +++ b/client/mp/pages/river/river.js @@ -19,6 +19,7 @@ Page({ onClick: function(event) {this.toStorm(event.currentTarget.dataset.index)}, onLoad: function (options) { + console.log("page", "river", options) app.conf.sessid = app.conf.sessid || options.sessid this.refresh() }, diff --git a/client/mp/pages/storm/storm.js b/client/mp/pages/storm/storm.js index 136e851a..388ef508 100644 --- a/client/mp/pages/storm/storm.js +++ b/client/mp/pages/storm/storm.js @@ -18,6 +18,7 @@ Page({ onClick: function(event) {this.toAction(event.currentTarget.dataset.index)}, onLoad: function (options) { + console.log("page", "storm", options) app.conf.sessid = app.conf.sessid || options.sessid this.data.river = options.river, this.refresh() }, diff --git a/frame.js b/frame.js index 8bdc7fd8..4bf1149b 100644 --- a/frame.js +++ b/frame.js @@ -1,6 +1,6 @@ var can = Volcanos("chat", { Page: shy("构造网页", function(can, name, conf, cb, body) { - var page = Volcanos(name, {_type: "local", _panes: {}, target: body, + var page = Volcanos(name, {_type: "local", _panes: {}, _views: {}, target: body, Plugin: can.Plugin, Inputs: can.Inputs, Output: can.Output, Import: function(event, value, key) {var cb = page.onimport[key]; @@ -18,7 +18,7 @@ var can = Volcanos("chat", { page.onimport._init && page.onimport._init(page, page.Conf(conf), body) can.core.Next(conf.pane, function(item, cb) { - page._panes[item.name] = page[item.pos] = page[item.name] = can.Pane(page, item.name, item, cb, + page._panes[item.name] = page[item.name] = page._views[item.pos] = page[item.pos] = can.Pane(page, item.name, item, cb, can.page.Select(can, body, "fieldset."+item.name)[0] || can.page.AppendField(can, body, item.name+" "+(item.pos||""), item)) }, function() {typeof cb == "function" && cb(page)}) @@ -28,7 +28,7 @@ var can = Volcanos("chat", { Pane: shy("构造面板", function(can, name, meta, cb, field) { var river = "", storm = ""; - var pane = Volcanos(name, {_type: "local", _plugins: [], target: field, + var pane = Volcanos(name, {_type: "local", _plugins: [], _local: {}, target: field, option: field.querySelector("form.option"), action: field.querySelector("div.action"), output: field.querySelector("div.output"), @@ -115,7 +115,7 @@ var can = Volcanos("chat", { var args = meta.args || []; var feature = JSON.parse(meta.feature||'{}'); var exports = JSON.parse(meta.exports||'""')||feature.exports||[]; - var plugin = Volcanos(name, {_type: "local", target: field, + var plugin = Volcanos(name, {_type: "local", _local: {}, target: field, option: option, action: action, output: output, Inputs: can.Inputs, Output: can.Output, @@ -131,7 +131,7 @@ var can = Volcanos("chat", { var name = item.name || item.value || "args"+plugin.page.Select(can, option, "input.args.temp").length; var count = plugin.page.Select(can, option, ".args").length, value = ""; args && count < args.length && (value = args[count] || item.value || ""); - plugin[name] = can.Inputs(plugin, item, item.display||"input", name, value, cb, option); + plugin._local[name] = plugin[name] = can.Inputs(plugin, item, item.display||"input", name, value, cb, option); }, Select: function(event, target, focus) { can.page.Select(can, field.parentNode, "fieldset.item.select", function(item) { @@ -169,7 +169,9 @@ var can = Volcanos("chat", { return item.target.value = item.value }).length > 0 && plugin.Runs(event) }, - Runs: function(event, cb) {plugin.Run(event, plugin.Option(), cb)}, + Runs: function(event, cb) { + plugin.Run(event, plugin.Option(), cb) + }, Run: function(event, args, cb, silent) {var show = !silent; history.push(plugin.page.Select(can, option, ".args", function(item, index, list) { return {target: item, value: item.value} @@ -185,7 +187,7 @@ var can = Volcanos("chat", { }) }, Show: function(type, msg, cb) {plugin.msg = msg, msg._plugin_name = name; - return plugin._output = plugin[type] = can.Output(plugin, feature, type, msg, cb, output, action, option, status) + return plugin._output = plugin._local[type] = plugin[type] = can.Output(plugin, feature, type, msg, cb, output, action, option, status) }, Clone: function(event, cb) {meta.nick = meta.name + can.ID() meta.args = can.page.Select(can, plugin.option, ".args", function(item) {return item.value}) @@ -194,31 +196,6 @@ var can = Volcanos("chat", { }, Delete: function(event) {field.parentNode.removeChild(field)}, }, Config.libs.concat(["plugin/"+(meta.type||feature.active||"state")]), function(plugin) {plugin.Conf(meta); - var resize = false, last, size, change; - can.page.Select(can, field, "div.border-bottom", function(item) { - item.onmousedown = function(event) {resize = !resize; - can.escape = function(event) {resize = false - plugin._output.onaction && plugin._output.onaction.resize && plugin._output.onaction.resize(event, plugin._output, change, "y") - } - can.resize = plugin.resize = function(event) {change = event.clientY - last; - if (resize) {field.style.height = size + change + "px"} - } - size = field.offsetHeight; - last = event.clientY; - } - item.onmousemove = function(event) {plugin.resize && plugin.resize(event)} - }) - can.page.Select(can, field, "div.border-right", function(item) { - item.onmousedown = function(event) {resize = !resize; - can.escape = function(event) {resize = false} - can.resize = plugin.resize = function(event) { - if (resize) {field.style.width = size + event.clientX - last + "px"} - } - size = field.offsetWidth; - last = event.clientX; - } - item.onmousemove = function(event) {plugin.resize && plugin.resize(event)} - }) var list = JSON.parse(meta.inputs||"[]"); plugin.onimport._init? plugin.onimport._init(plugin, feature, plugin.output, plugin.action, plugin.option): can.core.Next(list.length>0? list: [{type: "text"}, {type: "button", value: "执行"}], plugin.Append, function() { @@ -229,7 +206,9 @@ var can = Volcanos("chat", { return plugin }), Inputs: shy("构造控件", function(can, item, type, name, value, cb, option) { - var input = Volcanos(name, {_type: "local", item: item, _plugin: can, + var input = Volcanos(name, {_type: "input", _plugin: can, item: item, target: "", + Run: can.Run, Runs: can.Runs, + Select: function(event) {can.Select(event, input.target, true)}, Import: function(event, value, key, index) {var cb = input.onimport[item.imports]; value = typeof cb == "function" && cb(event, input, value, key, input.target) || value @@ -245,22 +224,25 @@ var can = Volcanos("chat", { }, Config.libs.concat(["plugin/"+type]), function(input) { var target = input.onimport.init(input, item, name, value, option); - input.target = target, target.Input = input; - typeof cb == "function" && cb(input); + input.target = target, typeof cb == "function" && cb(input); }) return input }), Output: shy("构造组件", function(can, feature, type, msg, cb, target, action, option, status) { if (type == "inner" && (!msg.result || msg.result.length == 0)) {type = "table"} - var output = Volcanos(type, {_type: "local", action: action, msg: msg, feature: feature, + var output = Volcanos(type, {_type: "output", feature: feature, msg: msg, + target: target, action: action, + Run: can.Run, Runs: can.Runs, + Import: function(event, value, key) {var cb = output.onimport[key]; typeof cb == "function" && cb(event, output, value, key, target); }, Option: function(key, value) { - return can.page.Select(can, can.option, "input[name="+key+"],select[name="+key+"]", function(item) { - value != undefined && (item.value = value), value = item.value - }), value + return key == undefined? can.page.Select(can, can.option, ".args", function(item) {return item.value}): + (can.page.Select(can, can.option, "input[name="+key+"],select[name="+key+"]", function(item) { + value != undefined && (item.value = value), value = item.value + }), value) }, Action: function(key, value) { return can.page.Select(can, can.action, "input[name="+key+"],select."+key+",select[name="+key+"]", function(item) { @@ -277,7 +259,7 @@ var can = Volcanos("chat", { }, run: function(event, cmd, cb, silent) {var msg = can.Event(event); - can.page.Select(can, option, "input,select", function(item) { + cmd = cmd || can.Option(), can.page.Select(can, option, "input,select", function(item) { item.name && item.value && msg.Option(item.name, item.value) }); (output[cmd[1]] || can[cmd[1]] || can.Run)(event, cmd, cb, silent); @@ -286,7 +268,7 @@ var can = Volcanos("chat", { status.innerHTML = "", output.onstatus && can.page.AppendStatus(output, status, output.onstatus.list) output.onimport.init(output, msg, cb, target, action, option); }, msg) - return output.target = target, target.Output = output + return output }), }, Config.libs.concat(Config.list), function(can) { can[Config.main] = can.Page(can, Config.main, Config, function(chat) { @@ -297,4 +279,6 @@ var can = Volcanos("chat", { chat.Header.Import(event||{}, user.name, "username") }) }, document.body) + + can.require(["page/"+(can.user.Search(can, "topic")||Config.topic)+".css"], function() {}) }) diff --git a/lib/page.js b/lib/page.js index 496ab817..ccc05ede 100644 --- a/lib/page.js +++ b/lib/page.js @@ -42,6 +42,7 @@ Volcanos("page", {help: "网页模块", // 基本结构: type name data list var type = item.type || "div", data = item.data || {}; var name = item.name || data.name; + name && (data.name = data.name || item.name); // 数据调整 can.core.Item(item, function(key, value) { @@ -93,6 +94,7 @@ Volcanos("page", {help: "网页模块", }) data.className = list[0][0] || ""; data.title = data.title || name; + data.name = name; } else if (item.input) {var list = can.core.List(item.input); type = "input", name = name || list[0] || ""; @@ -100,6 +102,7 @@ Volcanos("page", {help: "网页模块", data.className = data.className || data.name; data.placeholder = data.placeholder || data.name; data.title = data.title || data.placeholder; + data.autocomplete = "none" data.onkeydown = function(event) { typeof list[1] == "function" && list[1](event); @@ -140,7 +143,7 @@ Volcanos("page", {help: "网页模块", // 创建节点 name = name || data.className || type; var node = can.page.Create(can, type, data); - value.last = node, value.first || (value.first = node), name && (value[name] = node); + value.last = node, value.first || (value.first = node), name && (value[name] = value[data.className||""] = value[type] = node); item.list && can.page.Append(can, node, item.list, value); target && target.append && target.append(node); }) @@ -189,14 +192,11 @@ Volcanos("page", {help: "网页模块", AppendField: shy("添加插件", function(can, target, type, item) { var dataset = {}; item && item.name && (dataset.names = item.name); var field = can.page.Append(can, target, [{view: [type, "fieldset"], list: [ - // {view: ["border-left"]}, {view: ["border-right"]}, item.pos? undefined: {text: [(item.nick||item.name||"")+"("+(item.help||"")+")", "legend"]}, {view: ["option", "form"], dataset: dataset, list: [{type: "input", style: {display: "none"}}]}, {view: ["action"]}, {view: ["output"]}, {view: ["status"]}, - // {view: ["border-bottom"]}, ]}]).first; - field.Meta = item - return field; + return field.Meta = item, field; }), AppendTable: shy("添加表格", function(can, target, msg, list, cb, cbs) { var table = can.page.Append(can, target, "table"); diff --git a/lib/user.js b/lib/user.js index b4b61219..748b4dc2 100644 --- a/lib/user.js +++ b/lib/user.js @@ -5,6 +5,34 @@ Volcanos("user", {help: "用户模块", reload: function(force) {(force || confirm("重新加载页面?")) && location.reload()}, title: function(text) {document.title = text}, + input: function(event, can, form, cb) { + var view = can.page.Append(can, document.body, [{view: ["input", "fieldset"], style: {left: event.clientX+"px", top: event.clientY+"px"}, list: [ + {view: ["option", "table"], list: can.core.List(form, function(item) { + return {type: ["tr"], list: [ + {type: "td", list: [{text: typeof item == "string"? + item: item.length > 0? item[0]: item.name || "", + }]}, + {type: "td", list: [typeof item == "string"? {input: item, data: {autofocus: true}}: + item.length > 0? {select: [item]}: item] + }, + ]} + })}, + {view: "action", list: [{button: ["提交", function(event, value) { + var data = {} + var list = can.page.Select(can, view.table, "select,input,textarea", function(item) { + return data[item.name] = item.value + }) + if (typeof cb == "function" && cb(event, value, data, list)) { + can.page.Remove(can, view.first) + } + }]}, {button: ["关闭", function(event, value) { + if (typeof cb == "function" && cb(event, value)) { + can.page.Remove(can, view.first) + } + }]}]}, + ]}]) + return view + }, toast: function(text) {}, carte: function(event, cb) {}, login: function(cb) {}, diff --git a/order.js b/order.js index 58e4feaa..84756fd6 100644 --- a/order.js +++ b/order.js @@ -29,7 +29,7 @@ var Config = {iceberg: "/chat/", volcano: "/static/volcanos/", {group: "index", name: "Action", pos: "bottom"}, {group: "index", name: "Footer", pos: "foot", state: ["ntxt", "ncmd"], title: 'shylinux@163.com'}, - ], title: "volcanos", layout: {def: "办公", list: ["工作", "办公", "聊天"], size: { + ], 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}, diff --git a/page/black.css b/page/black.css new file mode 100644 index 00000000..e9720c12 --- /dev/null +++ b/page/black.css @@ -0,0 +1,56 @@ +body, fieldset { + color: white; + background-color:black; +} + +fieldset.item:hover { + /* background-color:gold; */ + border:ridge 2px red; +} +fieldset.item.select { + /* background-color:gold; */ + border:ridge 2px red; +} + +fieldset.dialog { +} + +fieldset input { + font-size:12px; +} +fieldset input.args { + background-color:cyan; + font-weight:600; + width:80px; +} +fieldset input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { + color:green; +} + +fieldset table tr:hover { + background-color:#0fbd45; +} +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.over { + border:solid 2px red; +} +fieldset table td:hover { + background-color:red; +} +fieldset table td.select { + background-color:red; +} diff --git a/page/chat.js b/page/chat.js index ab3b9a69..6dbc1065 100644 --- a/page/chat.js +++ b/page/chat.js @@ -10,6 +10,12 @@ Volcanos("onimport", {help: "导入数据", list: [], }) Volcanos("onaction", {help: "组件交互", list: [], onkeydown: function(event, can) { + if (event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") { + return + } + if (event.target.getAttribute("contenteditable")) { + return + } switch (event.key) { case "k": can.Report(event, {x: 0, y: -30}, "scroll") @@ -21,12 +27,6 @@ Volcanos("onaction", {help: "组件交互", list: [], can.Action.escape && can.Action.escape(event) break case " ": - if (event.target.getAttribute("contenteditable")) { - break - } - if (event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") { - break - } can.Favor && can.page.Select(can, can.Favor.Show(), "input.cmd", function(item) { item.focus() }) diff --git a/page/gray.css b/page/gray.css new file mode 100644 index 00000000..6845a41b --- /dev/null +++ b/page/gray.css @@ -0,0 +1,40 @@ +body, fieldset { + background-color:#d8d8d8; +} + +fieldset.item:hover { + background-color:gold; + border:ridge 2px red; +} +fieldset.item.select { + background-color:gold; + border:ridge 2px red; +} + +fieldset.dialog { +} + +fieldset table tr:hover { + background-color:lightgreen; +} +fieldset table tr.select { + background-color:lightgreen; +} +fieldset table th { + font-family:monospace; + background-color:lightgreen; + 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; +} diff --git a/pane/Action.js b/pane/Action.js index 836bff02..78b151c5 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -5,10 +5,12 @@ Volcanos("onimport", {help: "导入数据", list: [], }) }, init: function(event, can, msg, cmd, target) {can.output.innerHTML = ""; - msg.Table(function(item, index) {if (!item.name) {return} - can._plugins.push(can[item.name] = can.Plugin(can, item.name, item, function(event, cmds, cbs) { + 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.group+" "+item.name, item))) + }, can.page.AppendField(can, can.output, "item "+item.name, item)) + return can._plugins.push(plugin), plugin }) }, layout: function(event, can, value, cmd, target) {can.layout = value; @@ -47,7 +49,7 @@ Volcanos("onimport", {help: "导入数据", list: [], can._plugin && can._plugin.Import(event, msg, cmd) }, }) -Volcanos("onaction", {help: "组件交互", list: [["layout", "最大", "工作", "办公", "聊天"], "刷新", "清屏", "并行","串行", +Volcanos("onaction", {help: "组件交互", list: [["layout", "工作", "办公", "聊天"], "刷新", "清屏", "并行","串行", ["action", "正常", "编辑", "编排", "定位"], {input: "pod"}, {input: "you"}, {input: "hot"}, {input: "top"}, ], diff --git a/pane/Carte.css b/pane/Carte.css index cb0750b0..149827b1 100644 --- a/pane/Carte.css +++ b/pane/Carte.css @@ -1,7 +1,7 @@ fieldset.dialog.Carte { padding:0; border:solid 2px red; - background-color:greenyellow; + /* background-color:greenyellow; */ position:absolute; display:none; z-index:200; diff --git a/pane/Toast.css b/pane/Toast.css index 76300c23..c3c2c555 100644 --- a/pane/Toast.css +++ b/pane/Toast.css @@ -1,6 +1,6 @@ fieldset.Toast { border:solid 2px red; - background-color:rgba(100,100,100,0.8); + /* background-color:rgba(100,100,100,0.8); */ position:absolute; display:none; z-index:200; @@ -15,7 +15,7 @@ fieldset.Toast>div.output { fieldset.Toast>div.output>div.title { font-size:12px; text-align:center; - color:gray; + /* color:gray; */ } fieldset.Toast>div.output>div.content { word-break:break-word; @@ -26,16 +26,16 @@ fieldset.Toast>div.output>div.content { font-size:16px; } fieldset.Toast>div.output table { - color:yellow + /* color:yellow */ } fieldset.Toast>div.output table th { - background:red; + /* background:red; */ } fieldset.Toast>div.output table td { white-space:pre; } fieldset.Toast>div.output>div.tick { font-size:12px; - color:gray; + /* color:gray; */ } diff --git a/plugin/input.js b/plugin/input.js index 8a3ebd1c..d4f0569f 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -37,6 +37,7 @@ Volcanos("onimport", {help: "导入数据", list: [], // (item.type == "text" || item.type == "textarea") && !target.placeholder && (target.placeholder = item.name || ""); item.type == "text" && !target.title && (target.title = item.placeholder || item.name || ""); item.type == "button" && item.action == "auto" && can.run && can.run({}); + item.type == "textarea" && can.page.Append(can, option, [{type: "br"}]) return target; }), path: function(event, can, value, cmd, target) { @@ -44,6 +45,25 @@ Volcanos("onimport", {help: "导入数据", list: [], }, }) Volcanos("onfigure", {help: "控件详情", list: [], + key: {click: function(event, can, value, cmd, target) { + function add(msg, list, update) { + can.page.Append(can, can.figure.output, [{view: "list", list: can.core.List(list, function(item) { + return {text: [item, "div", "label"], onclick: function(event) { + target.value = item; + update && can.history.unshift(item); + msg.Option("_refresh") && run() + }} + })}]) + } + function run() {can.figure.output.innerHTML = "" + can.Run(event, ["action", "input", can.item.name, target.value], function(msg) { + add(msg, can.history), can.core.List(msg.append, function(key) {add(msg, msg[key], true)}) + }, true) + } + + can.history = can.history || []; + can.onfigure._prepare(event, can, value, cmd ,target) && run() + }}, date: {click: function(event, can, value, cmd, target) {if (can.date) {return} target.style.width = "120px" function set(now) { @@ -162,7 +182,7 @@ Volcanos("onfigure", {help: "控件详情", list: [], _prepare: function(event, can, value, cmd, target) {if (can.figure) {return} can.figure = can.page.Append(can, document.body, [{view: ["input "+cmd, "fieldset"], style: { position: "absolute", left: "20px", top: event.clientY+10+"px", - }, list: [{view: ["action"]}, {view: ["output"]}], onmouseleave: function(event) { + }, list: [{text: [cmd, "legend"]}, {view: ["action"]}, {view: ["output"]}], onmouseleave: function(event) { !can.figure.stick && can.onfigure._release(event, can, value, cmd, target) }}]) return can.figure @@ -176,6 +196,9 @@ Volcanos("onaction", {help: "控件交互", list: [], var figure = can.onfigure[can.item.cb] || can.onfigure[can.item.figure] figure? figure.click(event, can, can.item, can.item.name, event.target): 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) { can.page.oninput(event, can, function(event) { switch (event.key) { diff --git a/plugin/team/plan.js b/plugin/team/plan.js index 3cf8c72a..77860b81 100644 --- a/plugin/team/plan.js +++ b/plugin/team/plan.js @@ -8,9 +8,19 @@ Volcanos("onimport", {help: "导入数据", list: [], var table = can.page.AppendTable(can, output, msg, msg.append); table.onclick = function(event) {switch (event.target.tagName) { case "TD": - can.onimport.which(event, table, msg.append, function(index, key) { - can.ondetail["复制"](event, can, msg, event.target.innerHTML, index, key, event.target); - can.Export(event, event.target.innerHTML.trim(), key, index) + var input = can.user.input(event, can, ["group", "type", "name", "text"], function(event, value, data) { + switch (value) { + case "提交": + can.run(event, ["action", "insert", data.group, data.type, data.name, data.text, "begin_time", can.base.Time()], function(msg) { + can.page.Remove(can, input.first) + can.user.toast("添加成功") + can.Runs(event) + return true + }, true) + console.log(data) + break + case "取消": return true; + } }) break case "TH": @@ -20,6 +30,8 @@ Volcanos("onimport", {help: "导入数据", list: [], }} table.oncontextmenu = function(event) {var target = event.target; switch (event.target.tagName) { + case "DIV": + break case "TD": can.onimport.which(event, table, msg.append, function(index, key) { can.user.carte(event, shy("", can.ondetail, can.feature.detail || can.ondetail.list, function(event, cmd, meta) {var cb = meta[cmd]; @@ -42,7 +54,7 @@ Volcanos("onimport", {help: "导入数据", list: [], } } - can.page.Select(can, table, "div.miss", function(item) { + can.page.Select(can, table, "div.task", function(item) { item.setAttribute("draggable", true) item.ondragstart = function(event) {can.drag = event.target} item.ondragover = function(event) {event.preventDefault()} diff --git a/plugin/wiki/word.js b/plugin/wiki/word.js index 71f68109..b074b3ff 100644 --- a/plugin/wiki/word.js +++ b/plugin/wiki/word.js @@ -28,7 +28,8 @@ Volcanos("onimport", {help: "导入数据", list: [], item.onclick = function(event) {can.node = item} item.oncontextmenu = function(event) {var target = event.target; can.user.carte(event, shy("", can.ondetail, figure.menu||can.ondetail.list, function(event, key, meta) {var cb = meta[key]; - typeof cb == "function" && cb(event, can, msg, 0, key, key, target); + cb? typeof cb == "function" && cb(event, can, msg, 0, key, key, target): + (cb = can.onchoice[key] || can.onaction[key], typeof cb == "function" && cb(event, can, key, key, target)) }), can), event.stopPropagation(), event.preventDefault()} figure && figure.init && figure.init({}, can, item.localName, "init", item) @@ -105,7 +106,7 @@ Volcanos("onfigure", {help: "图形绘制", list: [], return [{view: ["story", "p", "p"], dataset: {type: "spark", name: "", text: ""}, inner: "spark...."}] }, save: function(event, can, value, cmd, target) {var data = target.dataset; - return value? 'spark "'+data.name+'" `' + value + '`': "" + return value? 'spark "'+data.name+'" `' + value + '`': "spark" }, }, @@ -235,13 +236,26 @@ Volcanos("onfigure", {help: "图形绘制", list: [], }, }, }) -Volcanos("onaction", {help: "组件菜单", list: ["保存", ["操作", "只读", "排序", "编辑"], +Volcanos("onaction", {help: "组件菜单", list: ["刷新", "保存", ["操作", "只读", "排序", "编辑"], "插入", ["元素", "h1", "h2", "h3", "brief", "refer", "spark", "shell", "order", "table", "stack"]], + "刷新": function(event, can, value, cmd, target) { + can.run(event) + }, + "追加": function(event, can, value, cmd, target) { + can.user.input(event, can, [["type", "spark", "label", "section", "chapter", "title"], "name", {name: "text", type: "textarea"}], function(event, value, form, list) { + value == "提交" && can.run(event, ["action", cmd, can.Option("name")].concat(list), function(msg) { + can.user.confirm("是否刷新") && can.run({}) + }, true) + return true + }) + }, "保存": function(event, can, value, cmd, target) { var save = can.page.Select(can, target, ".story", function(story) { var figure = can.onfigure[story.dataset.type] || can.onfigure[story.localName]; - return figure && figure.save && figure.save(event, can, story.innerHTML, cmd, story) || story.innerHTML + var text = figure && figure.save && figure.save(event, can, story.innerText||story.innerHTML, cmd, story) || story.innerText||story.innerHTML + console.log(story.dataset.type, text) + return text }).join("\n\n") can.run(event, ["action", cmd, can.Option("name"), save], function(msg) { @@ -273,27 +287,12 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", ["操作", "只读" can.page.Append(can, can.preview, figure.push(event, can, value, cmd, target)).first.setAttribute("contenteditable", true) }, }) -Volcanos("onchoice", {help: "组件交互", list: ["保存", "清空", ["rect", "rect", "line", "circle"]], +Volcanos("onchoice", {help: "组件交互", list: ["刷新", "保存", "追加", "清空", ["rect", "rect", "line", "circle"]], "清空": function(event, can, msg, cmd, target) { console.log("choice", cmd) }, }) -Volcanos("ondetail", {help: "组件详情", list: ["编辑", "删除"], - "编辑": function(event, can, msg, index, key, cmd, target) { - can.user.prompt("文字", function(text) { - if (target.tagName == "text") {return target.innerHTML = text} - - var data = {"text-anchor": "middle", "dominant-baseline": "middle"} - var figure = can.onfigure[target.tagName] - figure.text(event, can, data, target) - - var p = can.onaction.push(event, can, data, "text", can.svg) - p.innerHTML = text; - - target.Text && can.page.Remove(can, target.Text) && delete(target.Text) - target.Text = p - }, target.Text && target.Text.innerText || "") - }, +Volcanos("ondetail", {help: "组件详情", list: ["刷新", "追加", "编辑", "删除", "插入"], "删除": function(event, can, msg, index, key, cmd, target) { can.page.Remove(can, target) }, diff --git a/proto.js b/proto.js index 3369f3a1..ec574f87 100644 --- a/proto.js +++ b/proto.js @@ -31,7 +31,7 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 meta.cache[name] = [] for (var i = meta.index; i < list.length; i++) {var item = list[i]; - if (item._name == can._name || item._type == "local") {continue} + if (item._name == can._name || item._type == "local"|| item._type == "input" || item._type == "output") {continue} can[item._name] = item; meta.cache[name].push(item); } diff --git a/style.css b/style.css index 5b033420..0ded58bd 100644 --- a/style.css +++ b/style.css @@ -1,5 +1,4 @@ html, body { - background-color:#d8d8d8; padding:0px; height:100%; width:100%; @@ -7,7 +6,6 @@ html, body { } fieldset { position:relative; - background-color:#d8d8d8; padding:0px; min-width:10px; overflow:auto; @@ -67,6 +65,16 @@ fieldset>div.action div.space { display:inline-block; width:10px; } +fieldset>div.action input { + width:60px; + margin-left:5px; +} +fieldset>div.action input:focus { + width:120px; +} +fieldset>div.action input:hover { + width:120px; +} fieldset>div.output { clear:both; /* max-height:800px; */ @@ -105,7 +113,6 @@ fieldset>div.output table.edit { } fieldset.dialog { - background-color:lightgray; padding:10px; display:none; position:absolute; @@ -134,14 +141,6 @@ fieldset.dialog>div.create table { fieldset.item { float:left; } -fieldset.item:hover { - background-color:gold; - border:ridge 2px red; -} -fieldset.item.select { - background-color:gold; - border:ridge 2px red; -} fieldset.item>form.option>div.item { padding:0; border:0; @@ -178,11 +177,9 @@ fieldset.item>div.output>div.status>input.cmd { font-size:16px; width:250px; } - fieldset.item>div.output>div.code svg { border: solid 2px red; } - fieldset.item div.border-left { position:absolute; width:2px; @@ -209,6 +206,32 @@ fieldset.item div.border-bottom { cursor:ns-resize; } +fieldset.input { + z-index: 10000; + border:solid 2px yellow; + position:absolute; +} +fieldset.input.date table tr:hover { + background-color:yellow; +} +fieldset.input.date table td:hover { + background-color:red; + cursor:pointer; +} +fieldset.input.date table td.now { + background-color:red; +} +fieldset.input div.output div.list { + clear:both; +} +fieldset.input div.output div.label { + padding: 10px; + float:left; +} +fieldset.input div.output div.label:hover { + background-color:red; +} + fieldset table { font-size:14px; overflow: auto; @@ -222,36 +245,15 @@ fieldset table caption { fieldset table tbody { overflow:auto; } -fieldset table tr:hover { - background-color:lightgreen; -} -fieldset table tr.select { - background-color:lightgreen; -} -fieldset table th { - font-family:monospace; - background-color:lightgreen; - cursor:pointer; - padding: 0 6px; -} fieldset table th.order { background-color:red; cursor:pointer; } -fieldset table td { - max-width:1200px; - font-family:monospace; - padding: 0 6px; - /* white-space: pre; */ -} fieldset table td.clip { background-color:red; } -fieldset table td:hover { - background-color:red; -} -fieldset table td.select { - background-color:red; +fieldset table td sup.more { + color:red; } fieldset div.code { @@ -278,12 +280,13 @@ fieldset .story { fieldset .story:hover { border:solid 2px red; } - +fieldset p.story { + white-space:pre; +} fieldset ul.story li:hover { border:solid 2px red; cursor:pointer; } - fieldset code.story { display:block; color:white; @@ -315,25 +318,3 @@ fieldset ul.stack:hover { border:solid 2px red; } -fieldset td.over { - border:solid 2px red; -} - -sup.more { - color:red; -} - -fieldset.input { - z-index: 10000; - border:solid 2px yellow; -} -fieldset.input.date table tr:hover { - background-color:yellow; -} -fieldset.input.date table td:hover { - background-color:red; - cursor:pointer; -} -fieldset.input.date table td.now { - background-color:red; -}