diff --git a/frame.js b/frame.js index 2f54288e..9fbafe57 100644 --- a/frame.js +++ b/frame.js @@ -205,7 +205,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function(msg) { can.page.Modify(can, can._action, ""), can.page.Modify(can, can._status, "") - table.onaction && table.onappend._action(table, can.base.Obj(msg.Option(ice.MSG_ACTION), table.onaction.list)) + table.onaction && table.onappend._action(table, can.base.Obj(msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION), table.onaction.list)) table.onexport && table.onappend._status(table, can.base.Obj(msg.Option(ice.MSG_STATUS), table.onexport.list)) }, can._output) }) diff --git a/lib/base.js b/lib/base.js index 1baa16f2..13913e18 100644 --- a/lib/base.js +++ b/lib/base.js @@ -5,7 +5,7 @@ Volcanos("base", {help: "数据类型", Obj: function(value, def) { try { value = typeof value == lang.STRING && value != ""? JSON.parse(value): value - if (def && def.length > 0 && value.length == 0) { return def } + if (value && value.length == 0 && def && def.length > 0) { return def } return value||def } catch (e) { return [value] diff --git a/page/index.js b/page/index.js index 3e7aa1ba..6d620caa 100644 --- a/page/index.js +++ b/page/index.js @@ -64,7 +64,7 @@ Volcanos({name: "chat", panels: [ }}, project: {name: "研发群", storm: { studio: {name: "研发 studio", action: [ - {name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"]}, + {name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"], _action: ["autogen", "compile", "binpack"]}, {name: "repos", help: "代码库", index: "web.code.git.status"}, {name: "plan", help: "任务表", index: "web.team.plan"}, {name: "ctx", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]}, diff --git a/panel/action.js b/panel/action.js index dd276b63..c19b855e 100644 --- a/panel/action.js +++ b/panel/action.js @@ -83,6 +83,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, p msg.Push("feature", JSON.stringify(value.feature)) msg.Push("index", value.index||"") msg.Push("args", value.args||"[]") + msg.Push("_action", value._action||"") }), can.base.isFunc(cb) && cb(msg) } return true diff --git a/panel/cmd.js b/panel/cmd.js index b2573201..b4a78872 100644 --- a/panel/cmd.js +++ b/panel/cmd.js @@ -3,7 +3,7 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, can.onmotion.float.auto(can, window, chat.CARTE) can.base.isFunc(cb) && cb() }, - onmain: function(can) { can._names = location.pathname + onlogin: function(can) { can._names = location.pathname var msg = can.request({}) can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(item, next) { can.core.Timer(500, function() { diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 989b96df..5ed263f0 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -3,7 +3,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, can.ui = can.onlayout.profile(can) can.onimport._content(can, target) can.onimport._output(can, target) - can.onimport._favor(can, target) + // can.onimport._favor(can, target) // can.onimport._search(can, target) can.history = can.history||[] diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 745aab08..9bda1081 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -297,7 +297,7 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" can.onaction.rerankLine(can) }, }) -Volcanos("onaction", {help: "控件交互", list: ["autogen", "compile", "binpack"], +Volcanos("onaction", {help: "控件交互", list: ["run"], save: function(event, can) { var msg = can.request(event, {content: can.onexport.content(can)}) can.run(event, [ctx.ACTION, "save", can.parse, can.Option("file"), can.Option("path")], function(msg) { can.user.toast(can, "保存成功") diff --git a/plugin/local/team/plan.js b/plugin/local/team/plan.js index 74345579..3a8e036f 100644 --- a/plugin/local/team/plan.js +++ b/plugin/local/team/plan.js @@ -81,7 +81,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, } }, ondblclick: function(event) { can.onmotion.modify(can, event.target, function(ev, value, old) { can.onaction.modifyTask(event, can, task, key, value) - }) }, + }, {name: key, action: key.indexOf("time") > 0? "date": "key"}) }, }]) }), can.onimport._display(can, task) }, _display: function(can, task) { if (!task["extra.cmd"]) { return } diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js index 7adcea88..38d0f2cd 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -2,14 +2,19 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onmotion.clear(can) can.onkeypop._build(can) can.onmotion.hidden(can, can._action) - can.ui = can.onlayout.profile(can) can.base.isFunc(cb) && cb(msg) // 交互数据 can.svg = null, can.group = null - can.point = [], can.temp = null , can.current = null + can.temp = null , can.current = null can.keylist = [] + can.onimport._show(can, msg) + }, + _show: function(can, msg) { + can.ui = can.onlayout.profile(can) + can.point = [] + // 加载绘图 can.page.Modify(can, can.ui.content, msg.Result()||can.onexport.content(can)) can.page.Select(can, can.ui.content, "svg", function(svg) { @@ -94,6 +99,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, var data = figure.draw(event, can, value.point, value.style) can.core.Item(value.style, function(key, value) { data[key] = value }) var item = can.onfigure._push(can, data, value.shape, can.group||can.svg) + can.core.ItemCB(value, function(key, cb) { item[key] = cb }) value._init && value._init(item) return item }, @@ -600,7 +606,7 @@ Volcanos("onexport", {help: "导出数据", list: ["分组", "图形", "坐标"] "stroke-width", "stroke", "fill", "font-size", ], function(item) { return svg.Value(item)? ' ' + item + '="' + svg.Value(item) + '"': "" - }): [" width=600 height=200 "]).concat(['>', svg? svg.innerHTML: "", ""]).join("") + }): [" width="+(can.Conf(chat.WIDTH)||600)+" height="+((can.Conf(chat.HEIGHT)||440)-40)]).concat(['>', svg? svg.innerHTML: "", ""]).join("") }, }) diff --git a/plugin/state.js b/plugin/state.js index 0a77b28f..a0f80102 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -94,7 +94,8 @@ Volcanos("onaction", {help: "交互操作", list: [ "生成链接": function(event, can) { var meta = can.Conf() var pre = "/chat/cmd/"; if (can.user.mod.isPod) { pre = "/chat/pod/"+can.user.Search(can, ice.POD)+"/cmd/" } var args = can.Option(); args._path = pre+(meta.index||can.core.Keys(meta.ctx, meta.cmd)) - args._path.indexOf("/cmd/web.wiki.word") > -1 && (args._path = pre+args.path) + args._path.indexOf("/cmd/web.wiki.word") > -1 && (args = {_path: pre+args.path}) + var msg = can.request(event, {link: can.user.MergeURL(can, args)}) can.search(event, ["Header.onaction.share"]) }, diff --git a/plugin/story/pie.js b/plugin/story/pie.js new file mode 100644 index 00000000..66ff259c --- /dev/null +++ b/plugin/story/pie.js @@ -0,0 +1,40 @@ +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() { + can.onmotion.clear(can), can.onimport._show(can, msg) + var r = 200, margin = 20; can.svg.Val(chat.WIDTH, 2*(r+margin)), can.svg.Val(chat.HEIGHT, 2*(r+margin)) + can.onimport._draw(can, msg, "value", r+margin, r+margin, r, margin, 0) + can.onmotion.clear(can, can.ui.project), can.onappend.table(can, msg, null, can.ui.project) + can.page.Modify(can, can.ui.project, {style: {"max-width": 480}}) + can.page.Select(can, can.ui.project, html.TR, function(tr, index) { + can.page.Modify(can, tr, {onmouseenter: function(event) { + can.onmotion.clear(can, can.svg), can.onimport._draw(can, msg, "value", r+margin, r+margin, r, margin, index-1) + }}) + }) + }) + }, + _draw: function(can, msg, field, x, y, r, margin, which) { + function join(list) { + for (var i = 0; i < list.length; i++) { list[i] = list[i].join(ice.SP) } + return list.join(ice.FS) + } + function pos(x, y, r, angle) { angle -= 90 + return [x + r * Math.cos(angle * Math.PI / 180), y + r * Math.sin(angle * Math.PI / 180)] + } + function pie(x, y, r, begin, span, color, cb) { can.onimport.draw({}, can, {shape: "path", style: { + "stroke-width": 1, stroke: color, fill: color, d: join([ + ["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0 0 1"].concat(pos(x, y, r, begin+span)), ["Z"] + ]), + }, onmouseenter: function(event) { can.base.isFunc(cb) && cb(event)} }) } + + var total = 0; msg.Table(function(value) { total += parseInt(value[field]) }) + var color = [cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.MAGENTA, cli.WHITE, cli.BLACK] + var begin = 0; msg["color"] = [], msg["weight"] = [], msg.Table(function(value, index) { var span = parseInt(value[field])/total*360 + var p = index==which? pos(x, y, margin, begin+span/2): [x, y]; index == which && can.Status(value) + var c = color[index%color.length]; pie(p[0], p[1], r, begin, span, c, function(event) { + can.onmotion.clear(can, can.svg), can.onimport._draw(can, msg, field, x, y, r, margin, index) + }), begin += span, msg.Push("color", ' ') + msg.Push("weight", parseInt(parseInt(value[field])*10000/total)/100) + }) + }, +}) + diff --git a/plugin/story/spide.js b/plugin/story/spide.js index f771387a..3cb5c463 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -8,19 +8,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can._tree[""].name = can.dir_root.split(ice.PS).slice(-2)[0] can.size = 30, can.margin = 30 - can.onappend.plugin(can, {type: chat.OUTPUT, index: "web.wiki.draw"}, function(sub) { - sub.run = function(event, cmds, cb) { sub.Action("go", "run") - can.base.isFunc(cb) && cb(sub.request()) - - can.core.Timer300ms(function() { can.draw = sub._outputs[0] - can.draw.onmotion.hidden(can.draw, can.draw.ui.project) - can.draw.require(["/plugin/local/wiki/draw/path.js"], function() { - var p = can.sup.view||can.Action("view"); - can.Action("view", p) - can.onaction[p](event, can, p) - }) - }) - } + can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() { + can.onimport._show(can, msg), can.onmotion.hidden(can, can.ui.project) + var p = can.Action("view", can.sup.view||can.Action("view")) + can.onaction[p](event, can, p) }) }, @@ -50,7 +41,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, _width: function(can, tree) { if (!tree) { return 0 } if (tree.list.length == 0 || tree.hide) { - tree.view = can.draw.onimport.draw({}, can.draw, { + tree.view = can.onimport.draw({}, can, { shape: "text", point: [{x: 0, y: 0}], style: { "stroke-width": 1, "text-anchor": "middle", inner: tree.name, }, @@ -66,31 +57,31 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, [""]) Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向", "纵向"]], "编辑": function(event, can) { - can.onmotion.toggle(can, can.draw._action) - can.onmotion.toggle(can, can.draw._status) + can.onmotion.toggle(can, can._action) + can.onmotion.toggle(can, can._status) }, "横向": function(event, can, button) { can.sup.view = button - can.onmotion.clear(can, can.draw.svg) + can.onmotion.clear(can, can.svg) can.onimport._height(can, can._tree[""]) - can.draw.svg.Val(chat.HEIGHT, can._tree[""].height*can.size+2*can.margin) + can.svg.Val(chat.HEIGHT, can._tree[""].height*can.size+2*can.margin) can.width = 0, can.onaction._draw(can, can._tree[""], can.margin, can.margin) - can.draw.svg.Val(chat.WIDTH, can.width+can.margin) + can.svg.Val(chat.WIDTH, can.width+can.margin) }, "纵向": function(event, can, button) { can.sup.view = button can.onimport._width(can, can._tree[""]) - can.onmotion.clear(can, can.draw.svg) + can.onmotion.clear(can, can.svg) - can.draw.svg.Val(chat.WIDTH, can._tree[""].width+2*can.margin) - can.draw.svg.Value("font-family", "monospace") + can.svg.Val(chat.WIDTH, can._tree[""].width+2*can.margin) + can.svg.Value("font-family", "monospace") can.height = 0, can.onaction._draw_vertical(can, can._tree[""], can.margin, can.margin+can.size) - can.draw.svg.Val(chat.HEIGHT, can.height+can.margin) + can.svg.Val(chat.HEIGHT, can.height+can.margin) }, _draw_vertical: function(can, tree, x, y) { tree.x = x, tree.y = y var color = tree.meta&&tree.meta.color||cli.YELLOW - tree.view = can.draw.onimport.draw({}, can.draw, { + tree.view = can.onimport.draw({}, can, { shape: "text", point: [ {x: x+tree.width/2, y: y} ], style: { @@ -111,7 +102,7 @@ Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向", } var offset = 0; can.core.List(tree.list, function(item) { - can.draw.onimport.draw({}, can.draw, { + can.onimport.draw({}, can, { shape: "path", point: [], style: { "stroke-width": 1, "stroke": cli.CYAN, "fill": html.NONE, d: line( {x: x+tree.width/2, y: y+tree.height-can.margin/2}, @@ -127,7 +118,7 @@ Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向", _draw: function(can, tree, x, y) { tree.x = x, tree.y = y var color = tree.meta&&tree.meta.color||cli.YELLOW - tree.view = can.draw.onimport.draw({}, can.draw, { + tree.view = can.onimport.draw({}, can, { shape: "text", point: [ {x: x, y: y+tree.height*can.size/2} ], style: { @@ -149,7 +140,7 @@ Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向", } var offset = 0; can.core.List(tree.list, function(item) { - can.draw.onimport.draw({}, can.draw, { + can.onimport.draw({}, can, { shape: "path", point: [], style: { "stroke-width": 1, "stroke": cli.CYAN, "fill": html.NONE, d: line( {x: x+tree.width+can.margin/8, y: y+tree.height*can.size/2}, @@ -165,7 +156,7 @@ Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向", }) Volcanos("ondetail", {help: "用户交互", list: [], onmouseenter: function(event, can, tree) { var y = tree.y+tree.height*can.size/2 - can.page.Remove(can, can.pos), can.pos = can.draw.onimport.draw({}, can.draw, { + can.page.Remove(can, can.pos), can.pos = can.onimport.draw({}, can, { shape: "rect", point: [ {x: tree.x-can.margin/4, y: y-can.size/2}, {x: tree.x+tree.width+can.margin/8, y: y+can.size/2}, diff --git a/plugin/story/trend.js b/plugin/story/trend.js index a03d65a1..a992d261 100644 --- a/plugin/story/trend.js +++ b/plugin/story/trend.js @@ -7,15 +7,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.Action(chat.HEIGHT, msg.Option(chat.HEIGHT)||can.user.mod.isCmd? "max": can.user.isMobile&&can.user.isLandscape()? "200": "400") can.Action("speed", parseInt(msg.Option("speed")||"100")) - can.onappend.plugin(can, {type: chat.OUTPUT, index: "web.wiki.draw"}, function(sub) { - sub.run = function(event, cmds, cb) { sub.Action("go", "run") - can.base.isFunc(cb) && cb(sub.request()) - - can.core.Timer300ms(function() { can.draw = sub._outputs[0] - can.draw.onmotion.hidden(can.draw, can.draw.ui.project) - can.onaction[can.Action("view")](event, can) - }) - } + can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() { + can.onimport._show(can, msg), can.onmotion.hidden(can, can.ui.project) + can.onaction[can.Action("view")](event, can) }) }, _sum: function(can) { @@ -46,8 +40,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图", "柱状图", "数据源"], ["height", "100", "200", "400", "600", "800", "max"], ["speed", "10", "20", "50", "100"]], "编辑": function(event, can) { - can.onmotion.toggle(can, can.draw._action) - can.onmotion.toggle(can, can.draw._status) + can.onmotion.toggle(can, can._action) + can.onmotion.toggle(can, can._status) }, "趋势图": function(event, can) { var height = can.Action(chat.HEIGHT) if (height == "max") { height = can.Conf(chat.HEIGHT) - chat.CMD_MARGIN } @@ -56,15 +50,15 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图 var space = 10, width = parseInt(can.Conf(chat.WIDTH)) var step = parseInt((width-2*space) / can.list.length) - can.onmotion.clear(can, can.draw.svg) - can.draw.svg.Val(chat.HEIGHT, height) - can.draw.svg.Val(chat.WIDTH, width) + can.onmotion.clear(can, can.svg) + can.svg.Val(chat.HEIGHT, height) + can.svg.Val(chat.WIDTH, width) function scale(y) { return (y - can.min)/(can.max - can.min)*(height-2*space) } function order(index, x, y) { return {x: space+step*index+x, y: height-space-scale(y)} } can.core.Next(can.list, function(line, next, index) { can.Status(line, ["date", "text", "add", "del"]) - can.draw.onimport.draw({}, can.draw, { + can.onimport.draw({}, can, { shape: "line", point: [ order(index, step/2, line.min), order(index, step/2, line.max), ], style: { @@ -72,7 +66,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图 }, }) - can.draw.onimport.draw({}, can.draw, { + can.onimport.draw({}, can, { shape: "rect", point: [ order(index, step/4, line.close), order(index, step/4*3, line.begin), ], style: can.base.Copy({"stroke-width": 1, "rx": 0, "ry": 0}, line.begin < line.close? { @@ -107,9 +101,9 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图 var space = 10, width = parseInt(can.Conf(chat.WIDTH)) var step = parseInt((width-2*space) / can.list.length) - can.onmotion.clear(can, can.draw.svg) - can.draw.svg.Val(chat.HEIGHT, height) - can.draw.svg.Val(chat.WIDTH, width) + can.onmotion.clear(can, can.svg) + can.svg.Val(chat.HEIGHT, height) + can.svg.Val(chat.WIDTH, width) function scale(key, y) { return (y - min[key])/(max[key] - min[key])*(height-2*space) } function order(index, key, x, y) { return {x: space+step*index+x, y: space+scale(key, y)} } @@ -118,7 +112,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图 can.core.List(can.msg.append, function(key, which) { max[key] != min[key] && can.core.Next(can.data, function(line, next, index) { var y = scale(key, parseFloat(line[key])) - y && can.draw.onimport.draw({}, can.draw, { + y && can.onimport.draw({}, can, { shape: "rect", point: [ order(index, key, width*which+2, 0), order(index, key, width*which+2+width, y), ], style: { @@ -136,9 +130,9 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图 }) }, "数据源": function(event, can) { - can.onmotion.clear(can, can.draw.ui.display) - can.onappend.table(can, can.msg, null, can.draw.ui.display) - can.onmotion.show(can, can.draw.ui.display) + can.onmotion.clear(can, can.ui.display) + can.onappend.table(can, can.msg, null, can.ui.display) + can.onmotion.show(can, can.ui.display) }, height: function(event, can) { diff --git a/proto.js b/proto.js index 33add85c..9a61c526 100644 --- a/proto.js +++ b/proto.js @@ -58,8 +58,9 @@ var cli = { START: "start", STOP: "stop", CLEAR: "clear", REFRESH: "refresh", - YELLOW: "yellow", CYAN: "cyan", - RED: "red", + RED: "red", GREEN: "green", BLUE: "blue", + YELLOW: "yellow", CYAN: "cyan", MAGENTA: "magenta", + WHITE: "white", BLACK: "black", } var web = { SHARE: "share",