diff --git a/frame.js b/frame.js index 9016fb25..3c12cc4d 100644 --- a/frame.js +++ b/frame.js @@ -236,10 +236,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }, _output: function(can, msg, display, output, action, cb) { display = display||chat.PLUGIN_TABLE_JS, output = output||can._output can.misc.Search(can, log.DEBUG) == ice.TRUE && can.base.beginWith(display, "/require/src/") && delete(Volcanos.meta.cache[display]) - Volcanos(display, {_root: can._root, _follow: can.core.Keys(can._follow, display), _fields: can._target, _target: output, - _path: display||chat.PLUGIN_TABLE_JS, + Volcanos(display, {_root: can._root, _follow: can.core.Keys(can._follow, display), _fields: can._target, _target: output, _path: display||chat.PLUGIN_TABLE_JS, _legend: can._legend, _option: can._option, _action: can._action, _output: output, _status: can._status, - Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, + Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, db: {}, ui: {}, }, [display, chat.PLUGIN_TABLE_JS], function(sub) { sub.Conf(can.Conf()) var last = can.core.Value(can, chat._OUTPUTS_CURRENT); last && can.core.CallFunc([last, "onaction.hidden"], {can: last}) sub.run = function(event, cmds, cb, silent) { diff --git a/index.css b/index.css index a72473eb..c0583671 100644 --- a/index.css +++ b/index.css @@ -16,14 +16,12 @@ table.content th { padding:2px 5px; } table.content td { padding:2px 5px; } table.content.action th:last-child { position:sticky; right:2px; } table.content.action td:last-child { position:sticky; right:2px; } -// table.content.action td:last-child { max-width:200px; position:sticky; right:2px; } h1 { text-align:center; margin:20px 0; } h2 { margin:20px 0; } h3 { margin:20px 0; } ul { padding-left:40px; margin:20px 0; } hr, td.hr { border-bottom:gray dashed 1px; margin:5px; } img { margin-bottom:-8px; } /* fieldset */ fieldset>legend { margin-right:10px; } fieldset>form.option>div.item { margin-right:10px; } -// fieldset>form.option>div.item { margin-right:10px; height:32px; } fieldset>form.option>div.item.select>input { min-width:80px; } fieldset>div.action>div.item { margin-right:10px; height:32px; } fieldset.input>legend { display:none; } @@ -285,11 +283,10 @@ fieldset.draw div.output svg { margin-bottom:-4px; } fieldset.draw.trend div.output svg { background-color:#1b5b738c; } fieldset.draw.spide div.output svg text { cursor:pointer; } fieldset.draw.spide div.output svg path { stroke-width:1; } -// fieldset.web.chat.iframe>div.output { overflow:hidden; } fieldset.web.code.git.status>div.output table.content { width:100%; } fieldset.can.view { font-size:14px; } fieldset.can.data { font-size:14px; } -img, iframe { margin-bottom:-4px; } +img, iframe { margin-bottom:-3px; } /* scrollbar */ div.scrollbar { background-color:#0000ff66; width:10px; position:absolute; right:0; top:0; transition:width .3s 1s; visibility:hidden; } div.scrollbar:hover { width:50px; transition:width .1s;} diff --git a/panel/action.js b/panel/action.js index f6e3f997..9b6d1d98 100644 --- a/panel/action.js +++ b/panel/action.js @@ -3,11 +3,11 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var river = can.Conf(chat.R can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { item.type = chat.PLUGIN, item.mode = can.Mode() can.onappend.plugin(can, item, function(sub, meta, skip) { can._plugins = (can._plugins||[]).concat([sub]), can.onimport._tabs(can, sub, meta), skip || next() sub.run = function(event, cmds, cb) { return can.run(event, (river == web.SHARE? [ctx.ACTION]: []).concat([river, storm, meta.id||meta.index], cmds), cb) } - sub._target.onclick = function(event) { event.target == sub._target && can.onmotion.scrollHold(can, function() { sub._tabs.click() }) } + // sub._target.onclick = function(event) { event.target == sub._target && can.onmotion.scrollHold(can, function() { sub._tabs.click() }) } }) }, function() { can.isCmdMode() || can.onmotion.delay(can, function() { can.onaction.layout(can) can.onexport.layout(can) && list[0] == river && list[1] == storm && can.core.List(can._plugins, function(sub) { sub.Conf(ctx.INDEX) == list[2] && can.onmotion.delay(can, function() { sub._tabs.click() }) }) - }) }) + }, 300) }) }, _share: function(can, share) { share && can.runAction({}, web.SHARE, [share], function(msg) { can.user.title(msg.SearchOrOption(chat.TITLE)), can.setHeader(chat.THEME, msg.SearchOrOption(chat.THEME)), can.Mode(web.SHARE), msg.Length() == 1 && can.onaction._onaction_cmd(can) diff --git a/plugin/story/trend.js b/plugin/story/trend.js index 3d77fc84..48e8d848 100644 --- a/plugin/story/trend.js +++ b/plugin/story/trend.js @@ -1,10 +1,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(can, function() { can.base.isFunc(cb) && cb(msg) can.Conf(ice.VIEW) && can.Action(ice.VIEW, can.Conf(ice.VIEW)), can.onmotion.toggle(can, can._option, !can.user.isMobile || !can.isFullMode()) - can.data = msg.Table(), can.onimport.layout(can) + can.db.data = msg.Table(), can.onimport.layout(can) }) }, - _sum: function(can) { if (can.list) { return can.list } + _sum: function(can) { if (can.db.list) { return can.db.list } var begin = "", count = 0, rest = 0, add = 0, del = 0, max = 0 - can.max = 0, can.min = 0, can.list = can.core.List(can.data, function(value, index) { + can.max = 0, can.min = 0, can.db.list = can.core.List(can.db.data, function(value, index) { var item = {date: value[can._msg.append[0]], text: value[can._msg.append[4]], add: parseInt(value[can._msg.append[1]]), del: parseInt(value[can._msg.append[2]]), hash: value.hash} item.begin = rest, item.max = rest + item.add, item.min = rest - item.del, item.close = rest + item.add - item.del begin = begin || item.date, count++, rest = item.close, add += item.add, del += item.del @@ -13,7 +13,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca if (item.min < can.min) { can.min = item.min } return item }), can.Status({"from": begin, "commit": count, "total": add+del, "max": max}) - return can.list + return can.db.list }, _layout: function(can) { var height = can.onexport.height(can), width = parseInt(can.ConfWidth()) can.onmotion.clear(can, can.svg), can.svg.Val(html.HEIGHT, height), can.svg.Val(html.WIDTH, width) @@ -21,7 +21,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca can.page.style(can, can._output, html.MAX_HEIGHT, "") return {height: height, width: width, margin: margin, step: step} }, - layout: function(can) { can.data && can.core.CallFunc(can.onaction[can.Action(ice.VIEW)], [{}, can]) }, + layout: function(can) { can.db.data && can.core.CallFunc(can.onaction[can.Action(ice.VIEW)], [{}, can]) }, // transform: function(can, target) { target.Value("transform", "scale(1, -1)") }, transform: function(can, target) { target.Value("transform", "translate(0, "+parseInt(can.ConfHeight())+") scale(1, -1)") }, }) @@ -48,18 +48,18 @@ Volcanos(chat.ONACTION, {list: [[ice.VIEW, "趋势图", "柱状图", "折线图" can.onimport.transform(can, black), can.onimport.transform(can, white), can.core.List(color, function(color) { can.onimport.transform(can, color) }) var max, min; can.core.List(can.core.List(can.base.Obj(can.Conf(mdb.FIELD), can._msg.append), function(field) { if (can.base.isIn(field, "time", "id")) { return } return field - }), function(field, index) { max = can.data[0][field], min = can.data[0][field] - for (var i = 1; i < can.data.length; i += 1) { var value = can.data[i][field]; if (value > max) { max = value } if (value < min) { min = value } } + }), function(field, index) { max = can.db.data[0][field], min = can.db.data[0][field] + for (var i = 1; i < can.db.data.length; i += 1) { var value = can.db.data[i][field]; if (value > max) { max = value } if (value < min) { min = value } } max = parseFloat(can.Conf("max")||max), min = parseFloat(can.Conf("min")||min) function order(i) { return i*args.step+args.margin } function scale(y) { return (y - min)/(max - min)*(args.height-2*args.margin)+args.margin } - for (var i = 1; i < can.data.length; i += 1) { can.onimport.draw(can, {shape: svg.LINE, points: [{x: order(i-1), y: scale(can.data[i-1][field])}, {x: order(i), y: scale(can.data[i][field])}]}, color[index]||group) } + for (var i = 1; i < can.db.data.length; i += 1) { can.onimport.draw(can, {shape: svg.LINE, points: [{x: order(i-1), y: scale(can.db.data[i-1][field])}, {x: order(i), y: scale(can.db.data[i][field])}]}, color[index]||group) } }), can.onappend._status(can, can._msg.Option(ice.MSG_STATUS)) var gray = can.onimport.group(can, cli.WHITE, kit.Dict(svg.STROKE, cli.GRAY, svg.FILL, cli.GRAY)); can.onimport.transform(can, gray) var vline = can.onimport.draw(can, {shape: svg.LINE, points: [{x: 0, y: 0}, {x: 0, y: can.ConfHeight()}]}, gray) var hline = can.onimport.draw(can, {shape: svg.LINE, points: [{x: 0, y: 0}, {x: can.ConfWidth(), y: 0}]}, gray) can.svg.onmousemove = function(event) { var p = can._output.getBoundingClientRect(); p = {x: event.clientX - p.x, y: event.clientY - p.y} vline.Val("x1", p.x), vline.Val("x2", p.x), hline.Val("y1", can.ConfHeight()-p.y), hline.Val("y2", can.ConfHeight()-p.y) - var item = can.data[parseInt((p.x - args.margin)/args.step)] + var item = can.db.data[parseInt((p.x - args.margin)/args.step)] item && can.Status(item), can.Status("cursor", parseInt((can.ConfHeight()-p.y-args.margin)/(can.ConfHeight()-2*args.margin)*max)) } }, @@ -68,10 +68,10 @@ Volcanos(chat.ONACTION, {list: [[ice.VIEW, "趋势图", "柱状图", "折线图" var white = can.onimport.group(can, cli.WHITE, kit.Dict(svg.STROKE, cli.WHITE, svg.FILL, cli.WHITE)) var group = can.getHeaderTheme() == cli.BLACK? black: white can.onimport.transform(can, black), can.onimport.transform(can, white) - can.core.List(can.base.Obj(can.Conf(mdb.FIELD), can._msg.append), function(field) { var max = can.data[0][field], min = can.data[0][field] - for (var i = 1; i < can.data.length; i += 1) { var value = can.data[i][field]; if (value > max) { max = value } if (value < min) { min = value } } + can.core.List(can.base.Obj(can.Conf(mdb.FIELD), can._msg.append), function(field) { var max = can.db.data[0][field], min = can.db.data[0][field] + for (var i = 1; i < can.db.data.length; i += 1) { var value = can.db.data[i][field]; if (value > max) { max = value } if (value < min) { min = value } } function order(i) { return i*args.step+args.margin } function scale(y) { return (y - min)/(max - min)*(args.height-2*args.margin)+args.margin } - can.core.Next(can.data, function(item, next, i) { can.core.Timer(parseInt(can.Action(html.SPEED)), next) + can.core.Next(can.db.data, function(item, next, i) { can.core.Timer(parseInt(can.Action(html.SPEED)), next) can.onimport.draw(can, {shape: svg.RECT, style: {rx: 0, ry: 0}, points: [{x: order(i)+args.step/8.0, y: args.margin}, {x: order(i)+args.step/8.0*7, y: scale(item[field])}], _init: function(target) { can.core.ItemCB(can.ondetail, function(key, cb) { target[key] = function(event) { can.misc.Event(event, can, function(msg) { cb(event, can, item) }) } }) }}, group)