diff --git a/frame.js b/frame.js index 573a8f9b..0959ceec 100644 --- a/frame.js +++ b/frame.js @@ -104,7 +104,7 @@ Volcanos("onengine", { _init: function(can, meta, list, cb, target) { }, }) Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { meta.name = meta.name.split(" ")[0] - field = field || can.onappend.field(can, target, meta.type||"plugin", meta); + field = field || can.onappend.field(can, target, meta.type||"plugin", meta).first; var legend = can.page.Select(can, field, "legend")[0]; var option = can.page.Select(can, field, "form.option")[0]; var action = can.page.Select(can, field, "div.action")[0]; @@ -116,9 +116,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met _target: field, _inputs: {}, _outputs: [], _history: [], _option: option, _action: action, _output: output, Option: function(key, value) { - if (typeof key == "object") { - return sub.core.Item(key, function(key, value) { sub.Option(key, value) }), key - } + if (typeof key == "object") { return sub.core.Item(key, can.Option), key } if (key == undefined) { value = {} sub.page.Select(sub, option, "select.args,input.args", function(item) { value[item.name] = item.value @@ -137,6 +135,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met return value }, Status: function(key, value) { + if (typeof key == "object") { return sub.core.Item(key, sub.Status), key } sub.page.Select(sub, status, "div."+key+">span", function(item) { item.innerHTML = value }) @@ -206,7 +205,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met } can.core.Item(input.onaction, function(key, value) { - input._target && key.indexOf("on") == 0 && (input._target[key] = function(event) { + input._target && key.indexOf("on") == 0 && (input._target[key] = input._target[key] || function(event) { value(event, input); }) }), next(); @@ -258,8 +257,8 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met location.href = can.user.Share(can, args, true) }) }, - _action: function(can, action) { // [string [class item...] {}] - action && (action.innerHTML = ""), can.onaction && can.core.List(can.onaction.list, function(item) { + _action: function(can, action, list) { // [string [class item...] {}] + action && (action.innerHTML = ""), can.onaction && can.core.List(list||can.onaction.list, function(item) { item === ""? can.page.Append(can, action, [{view: "item space"}]): typeof item == "string"? can.onappend.input(can, action, "input", {type: "button", value: item, onclick: function(event) { (can.onaction[item] || can.onkeymap && can.onkeymap._remote)(event, can, item) @@ -304,8 +303,8 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met item.pos? undefined: {text: [(item.nick||item.name||"")+"("+(item.help||"")+")", "legend"]}, {view: ["option", "form"], dataset: dataset, list: []}, {view: ["action"]}, {view: ["output"]}, {view: ["status"]}, - ]}]).first; - return field.Meta = item, field; + ]}]); + return field.first.Meta = item, field; }, input: function(can, option, type, item, value) { item.name && item.name.indexOf("@") == 0 && (item.name = item.name.slice(1)) && (item.position = item.position || "opts") @@ -343,7 +342,10 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met item.value == "auto" && (item.value = "") item.action == "auto" && (input.dataset.action = "auto") var target = can.page.Append(can, option, [{view: ["item "+item.type], list: [item.position && {text: item.name+": "}, input]}])[item.name] - item.figure && item.figure.indexOf("@") == 0 && (item.figure = item.figure.slice(1)) && can.require(["/plugin/input/"+item.figure], function() { + item.figure && item.figure.indexOf("@") == 0 && (item.figure = item.figure.slice(1)) && can.require(["/plugin/input/"+item.figure], function(can) { + can.core.Item(can.onfigure[item.figure], function(key, value) { if (key.startsWith("on")) { + target[key] = function(event) { value(event, can, item, target) } + } }) target.type != "button" && (target.value = "") }) @@ -372,7 +374,6 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met switch (item) { case "编辑": var ui = can.page.Appends(can, td, [{type: "input", value: back, onkeydown: function(event) { - console.log("key", event.key) switch (event.key) { case "Enter": td.innerHTML = event.target.value @@ -431,7 +432,6 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met var ls = can._follow.split(".") - console.log(ls.length, can) var left = (ls.length > 2) && can.run({}, ["search", can._follow.split(".")[1]+".onexport.left"]) || 0 var top = (ls.length == 3) && can.run({}, ["search", can._follow.split(".")[1]+".onexport.top"]) || 0 var top = (ls.length > 3)? event.y: top @@ -521,6 +521,24 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met }, true); }) }, + + modify: function(can, target, cb) { var back = target.innerHTML + var ui = can.page.Appends(can, target, [{type: "input", value: back, onkeydown: function(event) { + switch (event.key) { + case "Enter": + target.innerHTML = event.target.value + if (event.target.value != back) { + cb(event, event.target.value, back) + } + break + case "Escape": + td.innerHTML = back + break + } + }, onkeyup: function(event) { + + }}]); ui.input.focus(), ui.input.setSelectionRange(0, -1) + }, }, [], function(can) {}) Volcanos("onlayout", { _init: function(can, meta, list, cb, target) { var width = can._width, height = can._height; diff --git a/lib/page.js b/lib/page.js index 03dc2a43..86d9be47 100644 --- a/lib/page.js +++ b/lib/page.js @@ -147,8 +147,13 @@ var page = Volcanos("page", {help: "网页模块", data.src = list[0]; } else if (item.row) {type = "tr"; - item.list = item.row.map(function(text) {return {text: [text, item.sub||"td"]}}); - } else if (item.include) {var list = can.core.List(item.include); + item.list = item.row.map(function(text) {return {text: [text, item.sub||"td"]}}) + } else if (item.th) {type = "tr"; + item.list = item.th.map(function(text) {return {text: [text, "th"]}}) + } else if (item.td) {type = "tr"; + item.list = item.td.map(function(text) {return {text: [text, "td"]}}) + + } else if (item.include) {var list = can.core.List(item.include) type = "script"; data.src = list[0]; data.onload = list[1]; @@ -170,7 +175,7 @@ var page = Volcanos("page", {help: "网页模块", return target.innerHTML = "", can.page.Append(can, target, key, value) }), Remove: shy("删除节点", function(can, target) { - target.parentNode && target.parentNode.removeChild(target) + target && target.parentNode && target.parentNode.removeChild(target) }), CopySub: shy("复制节点", function(can, target, source) { diff --git a/plugin/input/date.js b/plugin/input/date.js index f3618719..9278f5f6 100644 --- a/plugin/input/date.js +++ b/plugin/input/date.js @@ -1,41 +1,46 @@ Volcanos("onfigure", {help: "控件详情", list: [], - date: {click: function(event, can, value, cmd, target, figure) { + date: {onclick: function(event, can, item, target) { + can._figure && can.page.Remove(can, can._figure.fieldset) + can._figure = can.onappend.field(can, can._target, "input date", {}) // 设置输入 - target.style.width = "120px" - function set(now) { + target.style.width = "120px"; function set(now) { target.value = can.base.Time(now); - can.item.action == "auto" && can.run({}); + item.action == "auto" && can.run({}); } // 添加插件 + var figure = can._figure figure.table = can.page.Append(can, figure.output, [{type: "table"}]).first + can.page.Modify(can, figure.fieldset, {style: {top: target.offsetTop+20, left: target.offsetLeft}}) + can.page.Remove(can, figure.legend) // 添加控件 - can.now = target.value? new Date(target.value): new Date(); + var now = target.value? new Date(target.value): new Date(); var control = can.page.AppendAction(can, figure.action, ["今天", "随机", ["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)), {view: ["", "br"]}, - {type: "hr", style: {margin: 0}}, {type: "br"}, - "上一月", ["year"].concat(can.core.List(can.now.getFullYear() - 20, can.now.getFullYear() + 20)), + "关闭", {type: "hr", style: {margin: 0}}, + "上一月", ["year"].concat(can.core.List(now.getFullYear() - 20, now.getFullYear() + 20)), ["month"].concat(can.core.List(1, 13)), "下一月", {view: ["", "br"]}, ], function(event, value, cmd) {can.stick = true; // 设置时间 switch (cmd) { - case "year": can.now.setFullYear(parseInt(value)); show(can.now); return; - case "month": can.now.setMonth(parseInt(value)-1); show(can.now); return; - case "hour": can.now.setHours(parseInt(value)); set(show(can.now)); return; - case "minute": can.now.setMinutes(parseInt(value)); set(show(can.now)); return; - case "second": can.now.setSeconds(parseInt(value)); set(show(can.now)); return; + case "year": now.setFullYear(parseInt(value)); show(now); return; + case "month": now.setMonth(parseInt(value)-1); show(now); return; + case "hour": now.setHours(parseInt(value)); set(show(now)); return; + case "minute": now.setMinutes(parseInt(value)); set(show(now)); return; + case "second": now.setSeconds(parseInt(value)); set(show(now)); return; } // 设置日期 switch (value) { - case "今天": can.now = new Date(); set(show(can.now)); break; - case "随机": can.now.setDate((Math.random() * 100 - 50) + can.now.getDate()); set(show(can.now)); break; + case "关闭": can.page.Remove(can, figure.fieldset); break; + case "今天": now = new Date(); set(show(now)); break; + case "随机": now.setDate((Math.random() * 100 - 50) + now.getDate()); set(show(now)); break; case "关闭": can.page.Remove(can, figure.first); delete(can.figure); - case "前一年": can.now.setFullYear(can.now.getFullYear()-1); show(can.now); break; - case "后一年": can.now.setFullYear(can.now.getFullYear()+1); show(can.now); break; - case "上一月": can.now.setMonth(can.now.getMonth()-1); show(can.now); break; - case "下一月": can.now.setMonth(can.now.getMonth()+1); show(can.now); break; + case "前一年": now.setFullYear(now.getFullYear()-1); show(now); break; + case "后一年": now.setFullYear(now.getFullYear()+1); show(now); break; + case "上一月": now.setMonth(now.getMonth()-1); show(now); break; + case "下一月": now.setMonth(now.getMonth()+1); show(now); break; } }) @@ -51,7 +56,7 @@ Volcanos("onfigure", {help: "控件详情", list: [], can.page.Appends(can, figure.table, [{type: "tr", list: can.core.List(["日", "一", "二", "三", "四", "五", "六"], function(day) {return {text: [day, "th"]}})}]) var tr; function add(day, type) {if (day.getDay() == 0) {tr = can.page.Append(can, figure.table, [{type: "tr"}]).tr} can.page.Append(can, tr, [{text: [day.getDate(), "td", can.base.Time(day).split(" ")[0] == can.base.Time(now).split(" ")[0]? "select": type], - dataset: {date: day.getTime()}, click: function(event) {set(can.now = new Date(parseInt(event.target.dataset.date)))}, + dataset: {date: day.getTime()}, click: function(event) {set(now = new Date(parseInt(event.target.dataset.date)))}, }]) } @@ -66,8 +71,6 @@ Volcanos("onfigure", {help: "控件详情", list: [], for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) {add(day, "main")} for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) {add(day, "next")} return now - } - - set(show(can.now)); + }; set(show(now)); }}, -}) +}, ["/plugin/input/date.css"]) diff --git a/plugin/local/team/miss.js b/plugin/local/team/miss.js index ec8b41d4..4ab6d167 100644 --- a/plugin/local/team/miss.js +++ b/plugin/local/team/miss.js @@ -6,7 +6,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onimport[can.Option("scale")](can, msg) }, - _task: function(can, msg, time, values) { + _task: function(can, msg, time, list, view) { return {text: ["", "td"], ondragover: function(event) { event.preventDefault() can.page.Select(can, can.ui.content, "td", function(item) { @@ -14,43 +14,66 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }), can.page.ClassList.add(can, event.target, "over") }, ondrop: function(event) { event.preventDefault() - can.run(event, ["action", "modify", "begin_time", time, ""], function(msg) { - value.begin_time = begin_time - can.onimport._display(can, msg, value) - can.onappend.toast(can, "修改成功") - }, true) - - event.target.append(can.task) + can.drop(event, event.target, time) }, - list: can.core.List(values, function(value) { - return {view: [value.status, "div", value.name], draggable: true, - ondragstart: function(event) { can.task = event.target }, - ondragover: function(event) { event.preventDefault() }, - ondrop: function(event) { event.preventDefault() }, + list: can.core.List(list, function(task) { + return {view: [task.status, "div", view!="detail"? task.name: task.name+": "+task.text], title: task.text, draggable: true, + ondragstart: function(event) { var target = event.target; can.drop = function(event, td, time) { + var msg = can.request(event); msg.Option(task) + td.append(target), can.run(event, ["action", "modify", "begin_time", time, task.begin_time], function(msg) { + task.begin_time = time, can.onimport._display(can, msg, task) + can.onappend.toast(can, "修改成功") + }, true) + } }, onclick: function(event) { - can.onimport._display(can, msg, value) + can.onimport._display(can, msg, task) }, oncontextmenu: function(event) { var target = event.target can.onappend.carte(can, can.ondetail, can.ondetail.list, function(event, item) { - var msg = can.request(event); msg.Option(value) - can.run(event, ["action", "modify", "status", item, value.status], function(msg) { - target.className = value.status = item - can.onimport._display(can, msg, value) + var msg = can.request(event); msg.Option(task) + can.run(event, ["action", "modify", "status", item, task.status], function(msg) { + target.className = task.status = item + can.onimport._display(can, msg, task) can.onappend.toast(can, "修改成功") }, true) }) }} - }) } - }, - _display: function(can, msg, value) { can.ui.display.innerHTML = "" - can.page.Append(can, can.ui.display, [{type: "tr", list: [{text: ["key", "th"]}, {text: ["value", "th"]}]}]) - can.core.Item(value, function(key, value) { - can.page.Append(can, can.ui.display, [{type: "tr", list: [{text: [key, "td"]}, {text: [value, "td"]}]}]) + _display: function(can, msg, task) { can.ui.display.innerHTML = "" + can.Status(task) + + can.page.Append(can, can.ui.display, [{th: ["key", "value"]}]) + can.core.Item(task, function(key, value) { + can.page.Append(can, can.ui.display, [{td: [key, value], oncontextmenu: function(event) { var target = event.target + can.onappend.carte(can, can.ondetail, ["编辑"].concat(can.ondetail.list), function(event, item, meta) { + var res = can.request(event); res.Option(task) + switch (item) { + case "编辑": + can.onappend.modify(can, target, function(ev, value, old) { + can.run(event, ["action", "modify", key, value, old], function(res) { + task[key] = value + can.onimport._display(can, msg, task) + can.onappend.toast(can, "修改成功") + }, true) + }) + break + default: + can.run(event, ["action", "modify", "status", item, task.status], function(res) { + task.status = item + can.onimport._display(can, msg, task) + can.onappend.toast(can, "修改成功") + }, true) + } + }) + }}]) }) }, - day: function(can, msg) { - var hash = {}; msg.Table(function(value) { var time = new Date(value.time) + day: function(can, msg) { var begin_time = new Date(can.base.Time(can.Option("begin_time"))) + function set(hour) { + return can.base.Time(new Date(begin_time-((begin_time.getHours()-hour))*60*60*1000)) + } + + var hash = {}; msg.Table(function(value) { var time = new Date(value.begin_time) var key = time.getHours(); hash[key] = (hash[key]||[]).concat([value]) }) @@ -59,12 +82,16 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, var table = can.page.Append(can, can.ui.content, [{type: "table", list: can.core.List(list, function(hour, index) { if (index == 0) { return {type: "tr", list: [{text: ["time", "th"]}, {text: ["text", "th"]}]} } - return {type: "tr", list: [{text: [can.base.Number(hour), "td"]}, can.onimport._task(can, msg, "2020-06-08 "+hour+":00:00", hash[hour])]} + return {type: "tr", list: [{text: [can.base.Number(hour), "td"]}, can.onimport._task(can, msg, set(hour), hash[hour], "detail")]} }) }]).table }, - week: function(can, msg) { - var hash = {}; msg.Table(function(value) { var time = new Date(value.time) + week: function(can, msg) { var begin_time = new Date(can.base.Time(can.Option("begin_time"))) + function set(week, hour) { + return can.base.Time(new Date(begin_time-((begin_time.getDay()-week)*24+(begin_time.getHours()-hour))*60*60*1000)) + } + + var hash = {}; msg.Table(function(value) { var time = new Date(value.begin_time) var key = time.getDay()+" "+time.getHours() hash[key] = (hash[key]||[]).concat([value]) }) @@ -76,9 +103,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.core.List(list, function(hour, index) { if (index == 0) { return {type: "tr", list: can.core.List(head, function(head) { return {text: [head, "th"]} })} } return {type: "tr", list: can.core.List(head, function(head, index) { if (index == 0) { return {text: [hour, "td"]} } - return {text: ["", "td"], list: can.core.List(hash[index-1+" "+hour], function(value) { - return can.onimport._task(can, msg, value) - })} + return can.onimport._task(can, msg, set(index-1, hour), hash[index-1+" "+hour]) })} }) }]).table @@ -92,10 +117,28 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, long: function(can, msg) { }, }, ["/plugin/local/team/miss.css"]) -Volcanos("onaction", {help: "组件交互", list: [], +Volcanos("onaction", {help: "组件交互", list: ["添加"], + "添加": function(event, can, key) { + can.require(["/plugin/input/date"], function(can) { + console.log("waht") + }) + function time(event) { + can.onfigure.date.onclick(event, can, {}, event.target) + } + can.user.input(event, can, [ + "zone", "type", "name", "text", + {name: "begin_time", type: "input", value: can.base.Time(), onclick: time}, + {name: "end_timem", type: "input", value: can.base.Time(), onclick: time}, + ], function(event, button, data, list) { + can.run(event, ["action", "insert"].concat(list), function(msg) { + + }, true) + return true + }) + }, }) Volcanos("ondetail", {help: "菜单交互", list: ["prepare", "process", "finish", "cancel"], }) -Volcanos("onexport", {help: "导出数据", list: [], +Volcanos("onexport", {help: "导出数据", list: ["begin_time", "zone", "id", "type", "name"], })