diff --git a/frame.js b/frame.js index 05c54c6c..30745613 100644 --- a/frame.js +++ b/frame.js @@ -474,7 +474,7 @@ Volcanos(chat.ONLAYOUT, {help: "页面布局", _init: function(can, target) { ta if (layout) { return can.page.style(can, target, layout), can.onmotion.move(can, target, layout), layout } if (!event || !event.target || !event.clientX) { return {} } - var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight-1; if (right) { + var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight-3; if (right) { var left = event.clientX-event.offsetX+event.target.offsetWidth, top = event.clientY-event.offsetY } diff --git a/lib/page.js b/lib/page.js index 65d14784..c2918eee 100644 --- a/lib/page.js +++ b/lib/page.js @@ -425,6 +425,8 @@ Volcanos("page", {help: "用户界面", ClassList: { while (item) { res += item.offsetLeft||0, item = item.parentNode } return res }, + editable: function(can, item, ok) { item.setAttribute("contenteditable", ok) }, + draggable: function(can, item, ok) { item.setAttribute("draggable", ok) }, AppendVue: function(can, meta, list, target) { can.require(["https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"], function() { @@ -434,6 +436,7 @@ Volcanos("page", {help: "用户界面", ClassList: { }) }, + insertBefore: function(can, list, before) { var item = can.page.Append(can, before.parentNode, list).first before.parentNode.insertBefore(item, before) diff --git a/page/index.css b/page/index.css index bc11fb6c..adc709ae 100644 --- a/page/index.css +++ b/page/index.css @@ -43,13 +43,14 @@ table.content td { padding:2px 6px; } table.content.action td:last-child, table.content.action th:last-child { background-color:#7dc6d7eb; position:sticky; right:0; } table.content thead { position:sticky; top:-1px; } -td>input[type=button][name=create] { background-color:blue; } -td>input[type=button][name=remove] { background-color:red; } -td>input[type=button][name=start] { background-color:#52ce78; } -td>input[type=button][name=open] { background-color:blue; } -td>input[type=button][name=stop] { background-color:red; } -td>input[type=button][name=delete] { background-color:red; } -td>input[type=button][name=insert] { background-color:blue; } +input[type=button][name=start] { background-color:#52ce78; } +input[type=button][name=open] { background-color:blue; } +input[type=button][name=stop] { background-color:red; } +input[type=button][name=create] { background-color:blue; } +input[type=button][name=remove] { background-color:red; } +input[type=button][name=delete] { background-color:red; } +input[type=button][name=insert] { background-color:blue; } +input[type=button][name=trash] { background-color:red; } div.tabs { background-color:#00000038; color:white; padding:5px; margin:0 1px; } div.code { background-color:#343a3445; color:white; padding:10px; border:solid 3px green; } @@ -151,7 +152,7 @@ body.white fieldset.word.float { background-color:#3d5569; color:black; } body.white legend { border-radius:10px 10px 10px 10px; } body.white select { background-color:#99CC66; color:white; border:2px solid #99CC66; border-radius:10px 10px 10px 10px; } -body.white input[type=button] { background-color:#FF9900; color:white; border:2px solid #FF9900; border-radius:10px; } +body.white input[type=button] { background-color:#FF9900; color:white; border:none; border-radius:10px; } body.white input[type=text] { background-color:white; color:black; border:2px solid #14a58e; border-radius:6px; } body.white input[type=password] { background-color:white; color:black; border:2px solid #14a58e; border-radius:6px; } body.white input[name=cmd] { background-color:black; color:white; width:240px; } @@ -160,14 +161,15 @@ body.white table.content { color:black; } body.white table.content tr { background-color:#e1f1ff1f; } body.white table.content th { background-color:#99CCFF; } -body.white td>input[type=button][name=结束] { background-color:red; } -body.white td>input[type=button][name=stop] { background-color:red; } -body.white td>input[type=button][name=open] { background-color:blue; } -body.white td>input[type=button][name=start] { background-color:#52ce78; } -body.white td>input[type=button][name=create] { background-color:blue; } -body.white td>input[type=button][name=remove] { background-color:red; } -body.white td>input[type=button][name=insert] { background-color:blue; } -body.white td>input[type=button][name=delete] { background-color:red; } +body.white input[type=button][name=结束] { background-color:red; } +body.white input[type=button][name=stop] { background-color:red; } +body.white input[type=button][name=open] { background-color:blue; } +body.white input[type=button][name=start] { background-color:#52ce78; } +body.white input[type=button][name=create] { background-color:blue; } +body.white input[type=button][name=remove] { background-color:red; } +body.white input[type=button][name=insert] { background-color:blue; } +body.white input[type=button][name=delete] { background-color:red; } +body.white input[type=button][name=trash] { background-color:red; } body.print { background-color:white; color:black; } body.print legend, body.print select, body.print input[type=text] { box-shadow:0px 0px 0px 0px #626bd0; } @@ -270,6 +272,7 @@ body.mobile.landscape div.output.card div.item { width:auto; float:left; } div.output.card div.item { padding:10px; border:solid 1px #e7e7e7; margin:10px; height:120px; width:240px; float:left; position:relative; } div.output.card div.item>div.title { font-size:1.2rem; font-weight:bold; padding:10px; border-bottom: solid 1px #e7e7e7; } div.output.card div.item>div.content { padding:10px; height:24px; } +div.output.card div.item.stop { color:gray; } body.simple { background-color:white; } body.simple fieldset.Header { border-bottom:solid 1px #e7e7e7; height:60px; display:block; } diff --git a/panel/action.js b/panel/action.js index c62e8d3f..afcad4ff 100644 --- a/panel/action.js +++ b/panel/action.js @@ -150,6 +150,7 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target) var gt = "❯", lt = "❮"; function toggle(view) { return !can.setRiver("display") } can.page.Append(can, target, [{view: [[html.TOGGLE, chat.PROJECT]], list: [{text: [gt, html.DIV]}], onclick: function(event) { event.target.innerHTML = toggle()? gt: lt + can.onaction.refresh(can) }}]) } @@ -219,14 +220,15 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target) can.onlayout._init(can) }, help: function(can, button) { can.user.open("/help/"+button+".shy") }, - refresh: function(can, button) { + refresh: function(can) { can._root._height = window.innerHeight, can._root._width = window.innerWidth can.onlayout._init(can) var width = can.ConfWidth()-can.Conf(html.MARGIN_X) - can.core.List(can._plugins, function(sub) { + can.core.List(can._plugins, function(sub) { var table = can.core.Value(sub, chat._OUTPUT_CURRENT) can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth(width)-(can.user.isWindows? 20: 0)) - can.onappend._output(sub, can.core.Value(sub, chat._OUTPUT_CURRENT)._msg, sub._display) + table.ConfWidth(width) + table.onimport.layout? table.onimport.layout(table): can.onappend._output(sub, table._msg, sub._display) }) }, }) diff --git a/plugin/local/wiki/data.js b/plugin/local/wiki/data.js index 4682c2cd..947bb4a7 100644 --- a/plugin/local/wiki/data.js +++ b/plugin/local/wiki/data.js @@ -1,34 +1,32 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb) { - can.ui = can.onlayout.display(can) can.base.isFunc(cb) && cb(msg) + can.ui = can.onlayout.display(can) can.table = can.onappend.table(can, msg, function(value, key, index, line) { - return {text: [value, "td"], oncontextmenu: function(event) { + return {text: [value, html.TD], oncontextmenu: function(event) { can.user.carte(event, can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) { var cb = meta[cmd]; cb && cb(event, can, cmd, value, key, index, line) }) - }, ondblclick: function(event) { - can.page.Modify(can, event.target, {contenteditable: true}) }, onclick: function(event) { - if (key == "path") { can.run(event, [can.Option("path", value)]) } + key == nfs.PATH && can.run(event, [can.Option(nfs.PATH, value)]) + }, ondblclick: function(event) { + can.page.editable(can, event.target, true) }} }, can.ui.content) - can.onexport.list = msg.append + can.onappend._status(can, msg.append) can.onaction._compute(event, can) }, -}) +}, [""]) Volcanos(chat.ONFIGURE, {help: "组件菜单", "求和": function(event, can, res, td, index) { res[index] = parseInt(td.innerText) + (res[index]||0); }, "最大": function(event, can, res, td, index) { - var n = parseInt(td.innerText); - n > (res[index]||-10000) && (res[index] = n); + (res[index] === undefined || parseInt(td.innerText) > parseInt(res[index])) && (res[index] = parseInt(td.innerText)) }, "最小": function(event, can, res, td, index) { - var n = parseInt(td.innerText); - n < (res[index]||10000) && (res[index] = n); + (res[index] === undefined || parseInt(td.innerText) < parseInt(res[index])) && (res[index] = parseInt(td.innerText)) }, "平均": function(event, can, res, td, ncol, cols, rows, nrow) { res[ncol] = parseInt(td.innerText) + (res[ncol]||0); @@ -37,104 +35,98 @@ Volcanos(chat.ONFIGURE, {help: "组件菜单", } }, }) -Volcanos(chat.ONACTION, {help: "组件菜单", list: ["保存", ["mode", "全选", "块选", "反选", "多选", "拖动", "编辑"], ["some", "求和", "最大", "最小", "平均"]], +Volcanos(chat.ONACTION, {help: "组件菜单", list: [ice.SAVE, [ice.MODE, "全选", "块选", "反选", "多选", "拖动", "编辑"], [ice.EXEC, "求和", "最大", "最小", "平均"]], _compute: function(event, can) { - var mul = "tr" + (can.Action("mode") == "全选"? "": ".select") - var method = can.onfigure[can.Action("some")], res = {} + var mul = html.TR + (can.Action(ice.MODE) == "全选"? "": ".select") + var method = can.onfigure[can.Action(ice.EXEC)], res = {} can.page.Select(can, can.ui.content, mul, function(tr, nrow, rows) { - (mul != "tr" || nrow > 0) && can.page.Select(can, tr, "td", function(td, ncol, cols) { + (mul != html.TR || nrow > 0) && can.page.Select(can, tr, html.TD, function(td, ncol, cols) { method && method(event, can, res, td, ncol, cols, rows, nrow) }) }) + can.core.Item(res, function(key, value) { can.Status(can._msg.append[key], value||"") }) + }, - can.core.Item(res, function(key, value) { - can.Status(can._msg.append[key], value||"") + save: function(event, can, button) { can.runAction(event, button, [can.Option(nfs.PATH), can.onexport.file(can)]) }, + exec: function(event, can, button) { can.onaction._compute(event, can) }, + + _foreach: function(can, button, cb) { + button && can.Action(ice.MODE, button) + can.page.Select(can, can.ui.content, html.TR, function(item) { + cb(item) }) }, - "保存": function(event, can, cmd) { - can.runAction(event, cmd, [can.Option("path"), can.onexport.file(can)]) - }, - some: function(event, can, cmd) { - can.onaction._compute(event, can) - }, - - "全选": function(event, can, cmd) { - cmd && can.Action("mode", cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { + "全选": function(event, can, button) { + can.onaction._foreach(can, button, function(item) { + can.page.editable(can, item, false) + can.page.draggable(can, item, false) + item.onmouseenter = null, item.onclick = null + can.page.ClassList.del(can, item, html.SELECT) can.page.ClassList.del(can, item, "over") - can.page.ClassList.del(can, item, "select") - item.setAttribute("contenteditable", false) - item.setAttribute("draggable", false) - item.onmouseenter = null - item.onclick = null }) can.onaction._compute(event, can) }, - "块选": function(event, can, cmd) { - cmd && can.Action("mode", cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { + "块选": function(event, can, button) { + can.onaction._foreach(can, button, function(item) { item.onmouseenter = function() { - can.page.ClassList.add(can, item, "select") + can.page.ClassList.add(can, item, html.SELECT) can.onaction._compute(event, can) } }) }, - "反选": function(event, can, cmd) { - cmd && can.Action("mode", cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { + "反选": function(event, can, button) { + can.onaction._foreach(can, button, function(item) { item.onmouseenter = function() { - can.page.ClassList.del(can, item, "select") + can.page.ClassList.del(can, item, html.SELECT) can.onaction._compute(event, can) } }) }, - "多选": function(event, can, cmd) { - cmd && can.Action("mode", cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { + "多选": function(event, can, button) { + can.onaction._foreach(can, button, function(item) { + item.onmouseenter = function() {} item.onclick = function() { - can.page.ClassList.neg(can, item, "select") + can.page.ClassList.neg(can, item, html.SELECT) can.onaction._compute(event, can) } }) }, - "拖动": function(event, can, cmd) { - can.onaction["全选"](event, can, cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { - item.setAttribute("draggable", true) + "拖动": function(event, can, button) { + can.onaction["全选"](event, can, button) + can.onaction._foreach(can, "", function(item) { + can.page.draggable(can, item, true) item.ondragstart = function(event) { can.drag = item } item.ondragover = function(event) { event.preventDefault(), can.page.ClassList.add(can, item, "over")} item.ondragleave = function(event) { can.page.ClassList.del(can, item, "over") } item.ondrop = function(event) { event.preventDefault() - can.page.Select(can, can.ui.content, "table", function(table) { + can.page.Select(can, can.ui.content, html.TABLE, function(table) { table.insertBefore(can.drag, item) }) } }) }, - "编辑": function(event, can, cmd) { - cmd && can.Action("mode", cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { - item.setAttribute("contenteditable", true) + "编辑": function(event, can, button) { + can.onaction._foreach(can, button, function(item) { + can.page.editable(can, item, true) }) }, }) Volcanos(chat.ONDETAIL, {help: "组件详情", list: ["复制", "删除"], - "复制": function(event, can, cmd, value, key, index, line) { - var end = can.page.Append(can, can.table, [{type: "tr", list: can.core.List(can._msg.append, function(key) { - return {text: [line[key], "td"]} - })}]).tr - can.table.insertBefore(end, event.target.parentNode) + "复制": function(event, can, button, value, key, index, line) { + var end = can.page.Append(can, can.table, [{type: html.TR, list: can.core.List(can._msg.append, function(key) { + return {text: [line[key], html.TD]} + })}]).tr; can.table.insertBefore(end, event.target.parentNode) }, - "删除": function(event, can, cmd) { + "删除": function(event, can, button) { can.page.Remove(can, event.target.parentNode) }, }) Volcanos(chat.ONEXPORT, {help: "导出数据", file: function(can) { - return can.page.Select(can, can.ui.content, "tr", function(tr) { - return can.page.Select(can, tr, "th,td", function(td) {return td.innerHTML}).join(",") - }).join("\n") + return can.page.Select(can, can.ui.content, html.TR, function(tr) { + return can.page.Select(can, tr, can.page.Keys(html.TH, html.TD), function(td) {return td.innerHTML}).join(ice.FS) + }).join(ice.NL) }, }) diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 2bc6c216..ce60f8a1 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -126,6 +126,8 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }) }, can._output, target) }, + // layout: function(can) { + // }, }, [""]) Volcanos(chat.ONKEYMAP, {help: "键盘交互", _mode: { diff --git a/plugin/table.js b/plugin/table.js index 340b3ccf..186c0026 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -13,7 +13,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }, card: function(can, msg, target) { can.page.Appends(can, target, msg.Table(function(value) { - return {view: html.ITEM, list: [ + return {view: html.ITEM+" "+(value.status||""), list: [ {view: [wiki.TITLE, html.DIV, value.name]}, {view: [wiki.CONTENT, html.DIV, value.text]}, {view: html.ACTION, inner: value.action, onclick: function(event) {