diff --git a/frame.js b/frame.js index b2d3073c..d82fb88c 100644 --- a/frame.js +++ b/frame.js @@ -250,7 +250,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { tools: function(can, msg, cb, target) { can.onimport.tool(can, can.base.Obj(msg.Option(ice.MSG_TOOLKIT), []), cb, target) }, _plugin: function(can, value, meta, cb, target, field) { can.base.Copy(meta, value, true) - meta.type = meta.type||chat.PLUGIN, meta.height = meta.height||can.ConfHeight(), meta.width = meta.width||can.ConfWidth() + meta.type = meta.type||chat.STORY, meta.height = meta.height||can.ConfHeight(), meta.width = meta.width||can.ConfWidth() meta.args = can.base.getValid(can.base.Obj(meta.args), can.base.Obj(meta.arg), can.base.Obj(value.args), can.base.Obj(value.arg))||[] meta.inputs = can.base.getValid(meta.inputs, can.base.Obj(value.list))||[], meta.feature = can.base.getValid(meta.feature, can.base.Obj(value.meta))||{} if (can.misc.Debug(can, chat.PLUGIN, meta.index, meta.args, meta)) { debugger } diff --git a/panel/action.js b/panel/action.js index 63723bc5..61df9d40 100644 --- a/panel/action.js +++ b/panel/action.js @@ -1,7 +1,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can) var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM); can.core.Next(msg.Table(), function(item, next) { - item.inputs = can.base.Obj(item.inputs||item.list), item.feature = can.base.Obj(item.feature||item.meta) - if (can.misc.Debug(can, "plugin", item.index, item.args, item)) { debugger } + item.type = chat.PLUGIN, item.inputs = can.base.Obj(item.inputs||item.list), item.feature = can.base.Obj(item.feature||item.meta) + if (can.misc.Debug(can, chat.PLUGIN, item.index, item.args, item)) { debugger } can.onappend.plugin(can, item, function(sub, meta, skip) { can.onimport._run(can, sub, function(event, cmds, cb) { return can.run(event, can.misc.concat(can, [river, storm, meta.id||meta.index], cmds), cb) }), can.onimport._tabs(can, sub, meta), skip || next() }) @@ -13,8 +13,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can) can.Conf(chat.RIVER, web.SHARE, chat.STORM, share), can.onimport._init(can, msg) can.user.mod.isCmd = true }) }, - _cmd: function(can, item, next) { can.base.Copy(item, {mode: chat.CMD, opts: can.misc.Search(can)}), can.onengine.signal(can, chat.ONACTION_CMD) - if (can.misc.Debug(can, "plugin", item.index, item.args, item)) { debugger } + _cmd: function(can, item, next) { can.base.Copy(item, {type: chat.PLUGIN, mode: chat.CMD, opts: can.misc.Search(can)}), can.onengine.signal(can, chat.ONACTION_CMD) + if (can.misc.Debug(can, chat.PLUGIN, item.index, item.args, item)) { debugger } can.onappend.plugin(can, item, function(sub, meta, skip) { can.onimport._run(can, sub, function(event, cmds, cb) { return can.runActionCommand(event, sub._index, cmds, cb) }), can.user.title(meta.name), skip || next() }) diff --git a/plugin/local/code/inner/syntax.js b/plugin/local/code/inner/syntax.js index f8d37ee6..8f1405e0 100644 --- a/plugin/local/code/inner/syntax.js +++ b/plugin/local/code/inner/syntax.js @@ -173,7 +173,10 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", }, go: { split: { - operator: "{([:.,*])}", + operator: "{([-+:.,*])}", + }, + regexp: { + "[0-9]+": code.CONSTANT, }, prefix: { "//": code.COMMENT, @@ -334,10 +337,11 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", }, css: { split: { - operator: ".>{:;}", + operator: ".[]()>,{:;}", }, regexp: { - "[0-9]+px": code.CONSTANT, + "[-0-9]+px": code.CONSTANT, + "#[^ ;]+": code.CONSTANT, }, keyword: { "body": code.KEYWORD, diff --git a/plugin/local/team/plan.css b/plugin/local/team/plan.css index c7527b0f..5781cebb 100644 --- a/plugin/local/team/plan.css +++ b/plugin/local/team/plan.css @@ -1,11 +1,13 @@ -fieldset.plan>div.output td { vertical-align:top; } fieldset.plan>div.output td.content { position:relative; } -fieldset.plan>div.output td.over { border:solid 2px red; } -fieldset.plan>div.output td div.date { color:gray; } -fieldset.plan>div.output div.prepare { background-color:blue; color:white; } -fieldset.plan>div.output div.process { background-color:green; color:white; } -fieldset.plan>div.output div.cancel { background-color:red; color:white; } -fieldset.plan>div.output div.finish { background-color:gray; color:white; } - -fieldset.plan>div.output div.content th:first-child { width:40px; position:sticky; left:2px; } -fieldset.plan>div.output div.content table.content>tr:first-child { height:30px; position:sticky; top:2px; } \ No newline at end of file +fieldset.plan>div.output table.content.plan th { font-family:unset; } +fieldset.plan>div.output table.content.plan td { vertical-align:top; } +fieldset.plan>div.output table.content.plan td.over { border:solid 2px red; } +fieldset.plan>div.output table.content.plan td.today { background-color:cornflowerblue; } +fieldset.plan>div.output table.content.plan td div { color:white; } +fieldset.plan>div.output table.content.plan td div.date { color:gray; } +fieldset.plan>div.output table.content.plan td div.prepare { background-color:blue; } +fieldset.plan>div.output table.content.plan td div.process { background-color:green; } +fieldset.plan>div.output table.content.plan td div.cancel { background-color:red; } +fieldset.plan>div.output table.content.plan td div.finish { background-color:gray; } +fieldset.plan>div.output table.content.plan tr:first-child { height:30px; position:sticky; top:2px; } +fieldset.plan>div.output table.content.plan th:first-child { width:40px; position:sticky; left:2px; } \ No newline at end of file diff --git a/plugin/local/team/plan.js b/plugin/local/team/plan.js index 94e7edcf..f769ac61 100644 --- a/plugin/local/team/plan.js +++ b/plugin/local/team/plan.js @@ -1,25 +1,28 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(can, target), can._display_heights = {} can.ui = can.onlayout.profile(can), can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.profile) - can.onimport[can.Option("scale")||"week"](can, msg), can.onimport.layout(can) + can.onimport[can.Option("scale")||team.WEEK](can, msg), can.onimport.layout(can) }, - _content: function(can, msg, head, list, key, get, set) { var begin_time = can.base.Date(can.Option(team.BEGIN_TIME)) + _content: function(can, msg, head, list, key, get, set) { var begin_time = can.base.Date(can.Option(team.BEGIN_TIME)); can.sup.task && (can.sup.task._target = null) var hash = {}; msg.Table(function(value, index) { var k = key(can.base.Date(value.begin_time)); hash[k] = (hash[k]||[]).concat([value]) }) - can.sup.task && (can.sup.task._target = null) - can.ui.table = can.page.Append(can, can.ui.content, [{view: [chat.CONTENT, html.TABLE], list: can.core.List(list, function(hour, row) { + can.ui.table = can.page.Append(can, can.ui.content, [{view: [[chat.CONTENT, team.PLAN], html.TABLE], list: can.core.List(list, function(hour, row) { return {type: html.TR, list: can.core.List(head, function(week, col) { if (row == 0) { return {text: [can.user.trans(can, week), html.TH]} } if (col == 0) { return {text: [hour, html.TH]} } return can.onimport._task(can, msg, get(begin_time, col, row, hash), set(begin_time, col, row)) })} - }) }])._target; if (!can.sup.task) { return } - can.onmotion.delay(can, function() { var target = can.sup.task._target; target && target.click(), can.Status(mdb.COUNT, msg.Length()) }) + }) }])._target, can.onmotion.delay(can, function() { var target = can.sup.task && can.sup.task._target; target && target.click(), can.Status(mdb.COUNT, msg.Length()) + can.user.isMobile || can.isCmdMode() && can.page.Append(can, can._action, [{view: [["item", "time", "select"]], style: {"float": html.RIGHT, "padding": 5, "height": 21}, _init: function(target) { + can.onappend.figure(can, {action: "date"}, target, function(sub, value) { }), target.onmouseenter = target.click + can.core.Timer({interval: 100}, function() { can.page.Appends(can, target, [{text: can.base.Time()}]) }) + }}]) + }) }, - _task: function(can, msg, list, time) { return {text: ["", html.TD], - ondblclick: function(event) { can.onaction.insertTask(event, can, time+can.base.Time(null, "%y-%m-%d %H:%M:%S").slice(time.length)) }, + _task: function(can, msg, list, time) { return {type: html.TD, className: time == can.base.Time().slice(0, time.length)? "today": "", + ondblclick: function(event) { can.onaction.insertTask(event, can, time+can.base.Time().slice(time.length)) }, ondrop: function(event) { can.onkeymap.prevent(event), can.drop(event, event.target, time) }, ondragover: function(event) { can.onkeymap.prevent(event), can.page.Select(can, can.ui.content, html.TD, function(td) { can.page.ClassList.set(can, td, "over", td == event.target) }) }, - list: can.core.List(list, function(task) { - return can.base.isString(task)? {text: [task, html.DIV, "date"]}: {text: [can.onexport[can.Action(ice.VIEW)||mdb.TEXT](can, task), html.DIV, can.onexport.style(can, task)], + list: can.core.List(list, function(task) { return can.base.isString(task)? {text: [task, html.DIV, "date"]}: + {text: [can.onexport[can.Action(ice.VIEW)||mdb.TEXT](can, task), html.DIV, can.onexport.style(can, task)], ondragstart: function(event) { var target = event.target; can.drop = function(event, td, time) { td.append(target) can.onaction.modifyTask(event, can, task, team.BEGIN_TIME, time+task.begin_time.slice(time.length), task.begin_time) } }, draggable: time != undefined, title: can.onexport.title(can, task), _init: function(target) { @@ -28,50 +31,40 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( }) }, null, can.ui.project); task._target = target, target.onclick = function(event) { item.click() } can.sup.task && can.sup.task.zone == task.zone && can.sup.task.id == task.id && (can.sup.task._target = target) var ls = can.misc.SearchHash(can); if (ls[0] == task.zone && ls[1] == task.id) { can.sup.task = task } - }, - } + }} }), } }, - _profile: function(can, task) { can.onexport.hash(can, task), can.onmotion.toggle(can, can.ui.profile, true) + _profile: function(can, task) { can.onmotion.toggle(can, can.ui.profile, true), can.onexport.hash(can, task) if (can.onmotion.cache(can, function() { return can.sup.task = task, can.Status(task), [task.pod, task.zone, task.id].join(ice.PT) }, can.ui.profile, can.ui.display)) { return can.onimport.layout(can) } task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task["extra."+key] = value }), delete(task.extra) - var table = can.page.Appends(can, can.ui.profile, [{view: [chat.CONTENT, html.TABLE], list: [{th: [mdb.KEY, mdb.VALUE]}]}]).first + var table = can.page.Appends(can, can.ui.profile, [{view: [chat.CONTENT, html.TABLE], list: [{th: [can.user.trans(can, mdb.KEY, "字段"), can.user.trans(can, mdb.VALUE, "属性")]}]}]).first can.core.Item(task, function(key, value) { key != "_target" && can.page.Append(can, table, [{ td: [key, key == ice.POD && value != ""? can.page.Format(html.A, can.misc.MergeURL(can, {pod: value}), value): value], - onclick: function(event) { if (can.page.tagis(event.target, html.INPUT) && event.target.type == html.BUTTON) { - can.run(can.request(event, task), [ctx.ACTION, event.target.name]) - } }, + onclick: function(event) { can.page.tagis(event.target, html.INPUT) && event.target.type == html.BUTTON && can.run(can.request(event, task), [ctx.ACTION, event.target.name]) }, ondblclick: function(event) { if ([ice.POD, mdb.ZONE, mdb.ID].indexOf(key) > -1) { return } - can.onmotion.modify(can, event.target, function(sub, value) { - can.onaction.modifyTask(event, can, task, key, value) - }, {name: key, action: key.indexOf(mdb.TIME) > 0? "date": "key"}) + can.onmotion.modify(can, event.target, function(sub, value) { can.onaction.modifyTask(event, can, task, key, value) }, {name: key, action: key.indexOf(mdb.TIME) > 0? "date": "key"}) }, - }]) }), task["extra.index"]? can.onimport._display(can, task): can.onimport.layout(can) - can.onmotion.story.auto(can, can.ui.profile) + }]) }), can.onmotion.story.auto(can, can.ui.profile), task[ctx.EXTRA_INDEX]? can.onimport._display(can, task): can.onimport.layout(can) }, _display: function(can, task) { can.onmotion.toggle(can, can.ui.display, true) - can.onappend.plugin(can, {type: chat.STORY, index: task["extra.index"], args: task["extra.args"], height: can.ConfHeight()/2-2*html.ACTION_HEIGHT}, function(sub, meta) { - sub.run = function(event, cmds, cb) { can.request(event, kit.Dict("task.pod", task.pod, "task.zone", task.zone, "task.id", task.id)) - can.page.style(can, sub._output, html.MAX_HEIGHT, "") - can.runAction(event, ice.RUN, [task[mdb.ZONE], task[mdb.ID]].concat(cmds), cb) + can.onappend.plugin(can, {index: task[ctx.EXTRA_INDEX], args: task[ctx.EXTRA_ARGS], height: can.ConfHeight()/2-2*html.ACTION_HEIGHT}, function(sub, meta) { + sub.run = function(event, cmds, cb) { can.request(event, kit.Dict(team.TASK_POD, task.pod, team.TASK_ZONE, task.zone, team.TASK_ID, task.id)) + can.page.style(can, sub._output, html.MAX_HEIGHT, ""), can.runAction(event, ice.RUN, [task[mdb.ZONE], task[mdb.ID]].concat(cmds), cb) }, can._plugins_display = (can._plugins_display||[]).concat([sub]) - sub.onaction._output = function() { - can.onmotion.delay(can, function() { - can._display_heights[[task.zone, task.id].join(ice.FS)] = can.base.Max(sub._target.offsetHeight, can.ConfHeight()/2), can.onimport.layout(can) - }) - }, sub.onaction.close = function() { can.onmotion.toggle(can, can.ui.display), can.onimport.layout(can) } - can.onimport.layout(can) + sub.onaction._output = function() { can.onmotion.delay(can, function() { + can._display_heights[[task.zone, task.id].join(ice.FS)] = can.base.Max(sub._target.offsetHeight, can.ConfHeight()/2), can.onimport.layout(can) + }) }, sub.onaction.close = function() { can.onmotion.toggle(can, can.ui.display), can.onimport.layout(can) }, can.onimport.layout(can) }, can.ui.display) }, - day: function(can, msg) { var head = ["hour", "task"] + day: function(can, msg) { var head = [team.HOUR, team.TASK] var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) } function key(time) { return can.base.Number(time.getHours(), 2) } function get(begin_time, col, row, hash) { return hash[list[row]] } function set(begin_time, col, row) { return can.base.Time(begin_time, "%y-%m-%d ")+list[row] } can.onimport._content(can, msg, head, list, key, get, set) }, - week: function(can, msg) { var head = can.onexport.head(can, "hour") + week: function(can, msg) { var head = can.onexport.head(can, team.HOUR) var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) } function key(time) { return time.getDay()+" "+can.base.Number(time.getHours(), 2) } function get(begin_time, col, row, hash) { return hash[col-1+" "+list[row]] } @@ -95,7 +88,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( } can.onimport._content(can, msg, head, list, key, get, set) }, - year: function(can, msg) { var head = can.onexport.head(can, "month") + year: function(can, msg) { var head = can.onexport.head(can, team.MONTH) var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) } function key(time) { return can.base.Time(time, "%y-%m ")+time.getDay() } function get(begin_time, col, row, hash) { return hash[begin_time.getFullYear()+"-"+can.base.Number(row, 2)+" "+(col-1)] } @@ -103,31 +96,25 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( can.onimport._content(can, msg, head, list, key, get, set) }, long: function(can, msg) { - var begin_time = can.base.Date(can.base.Time(can.Option(team.BEGIN_TIME), "%y-%m-%d %H:%M:%S")) - var begin = begin_time.getFullYear() - 5 - - var head = ["month"]; for (var i = 0; i < 10; i++) { head.push(begin+i) } + var begin_time = can.base.Date(can.base.Time(can.Option(team.BEGIN_TIME), "%y-%m-%d %H:%M:%S")), begin = begin_time.getFullYear() - 5 + var head = [team.MONTH]; for (var i = 0; i < 10; i++) { head.push(begin+i) } var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) } function key(time) { return can.base.Time(time, "%y-%m") } function get(begin_time, col, row, hash) { return hash[begin+col-1+"-"+can.base.Number(row, 2)] } function set(begin_time, col, row) { return begin+col-1+"-"+can.base.Number(row, 2) } can.onimport._content(can, msg, head, list, key, get, set) }, - layout: function(can) { - can.page.styleWidth(can, can.ui.content, can.ConfWidth()-can.ui.project.offsetWidth-can.ui.profile.offsetWidth) + layout: function(can) { can.page.styleHeight(can, can._output, can.ConfHeight()), can.page.styleHeight(can, can.ui.project, can.ConfHeight()) + var height = can._display_heights[can.sup.task? [can.sup.task.zone, can.sup.task.id].join(ice.FS): ""]||html.ACTION_HEIGHT + if (!can.ui.display.innerHTML || can.ui.display.style.display == html.NONE) { height = 0 } + can.page.styleHeight(can, can.ui.table, can.ConfHeight()-height) + can.page.styleHeight(can, can.ui.content, can.ConfHeight()-height) + can.page.styleHeight(can, can.ui.profile, can.ConfHeight()-height) can.page.styleWidth(can, can.ui.table, can.ConfWidth()-can.ui.project.offsetWidth-can.ui.profile.offsetWidth) - if (true || !can.isAutoMode() || can.isStoryType()) { can.page.styleHeight(can, can._output, can.ConfHeight()) - var height = can._display_heights[can.sup.task? [can.sup.task.zone, can.sup.task.id].join(ice.FS): ""]||html.ACTION_HEIGHT - if (!can.ui.display.innerHTML || can.ui.display.style.display == html.NONE) { height = 0 } - can.page.style(can, can.ui.table, html.HEIGHT, can.ConfHeight()-height) - can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight()-height) - - can.ui.display.innerHTML && can.ui.display.style.display != html.NONE && can.core.List(can._plugins_display, function(sub) { - sub.onimport.size(sub, can.ConfHeight()-can.ui.content.offsetHeight-html.ACTION_HEIGHT-sub.onexport.statusHeight(sub), sub.ConfWidth(can.ConfWidth()-can.ui.project.offsetWidth), true) - }) - } - can.page.style(can, can.ui.profile, html.MAX_HEIGHT, can.ui.content.offsetHeight) - can.page.style(can, can.ui.project, html.MAX_HEIGHT, can.ui.content.offsetHeight+can.ui.display.offsetHeight) + can.page.styleWidth(can, can.ui.content, can.ConfWidth()-can.ui.project.offsetWidth-can.ui.profile.offsetWidth) + height == 0 || can.core.List(can._plugins_display, function(sub) { + sub.onimport.size(sub, height-html.ACTION_HEIGHT-sub.onexport.statusHeight(sub), sub.ConfWidth(can.ConfWidth()-can.ui.project.offsetWidth), true) + }) } }, [""]) Volcanos(chat.ONACTION, {list: [mdb.PREV, mdb.NEXT, mdb.INSERT, mdb.EXPORT, mdb.IMPORT, @@ -165,9 +152,9 @@ Volcanos(chat.ONACTION, {list: [mdb.PREV, mdb.NEXT, mdb.INSERT, mdb.EXPORT, mdb. view: function(event, can, key, value) { can.Action(key, value), can.onmotion.clear(can, can.ui.project), can.onmotion.clear(can, can.ui.content), can.onimport[can.Option("scale")](can, can._msg) }, }) Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, team.BEGIN_TIME, mdb.ZONE, mdb.ID, mdb.TYPE, mdb.NAME, mdb.TEXT], - span: function(can) { return {"day": 24*3600*1000, "week": 7*24*3600*1000, "month": 30*24*3600*1000, "year": 365*24*3600*1000, "long": 365*24*3600*1000}[can.Option("scale")]||0 }, + span: function(can) { return kit.Dict(team.DAY, 24*3600*1000, team.WEEK, 7*24*3600*1000, team.MONTH, 30*24*3600*1000, team.YAER, 365*24*3600*1000, team.LONG, 365*24*3600*1000)[can.Option("scale")]||0 }, hash: function(can, task) { if (!can.isCmdMode()) { return } location.hash = [task.zone, task.id].join(ice.FS) }, - head: function(can, scale) { if (["year", "long"].indexOf(scale) > -1) { return } return [scale].concat(can.user.time(can, "", "%W")) }, + head: function(can, scale) { if ([team.YEAR, team.LONG].indexOf(scale) > -1) { return } return [scale].concat(can.user.time(can, "", "%W")) }, name: function(can, task) { return task.name }, text: function(can, task) { return task.name+": "+(task.text||"") }, level: function(can, task) { return "l-"+(task.level||3)+": "+(task.name||"") }, diff --git a/proto.js b/proto.js index 83d1697b..165f0811 100644 --- a/proto.js +++ b/proto.js @@ -55,6 +55,7 @@ var ice = { var ctx = { CONTEXT: "context", COMMAND: "command", CONFIG: "config", INPUTS: "inputs", FEATURE: "feature", INDEX: "index", ARGS: "args", STYLE: "style", DISPLAY: "display", ACTION: "action", + EXTRA_INDEX: "extra.index", EXTRA_ARGS: "extra.args", } var cli = { DAEMON: "daemon", START: "start", STOP: "stop", OPEN: "open", CLOSE: "close", BEGIN: "begin", END: "end", @@ -177,6 +178,8 @@ var chat = { var team = { TASK: "task", PLAN: "plan", BEGIN_TIME: "begin_time", + LONG: "long", YEAR: "year", MONTH: "month", WEEK: "week", DAY: "day", HOUR: "hour", + TASK_POD: "task.pod", TASK_ZONE: "task.zone", TASK_ID: "task.id", } var mall = { COUNT: "count", PRICE: "price",