diff --git a/panel/header.js b/panel/header.js index 61733abd..5ba3add3 100644 --- a/panel/header.js +++ b/panel/header.js @@ -63,10 +63,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }}, "", target, "title search").parentNode can.user.isMobile && can.page.Modify(can, ui, {style: {float: "right"}}) }, - _background: function(can, msg) { if (can.user.isLocalFile) { return } + _background: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } msg.Option(aaa.BACKGROUND) && can.onlayout.background(can, "/share/local/background", document.body) }, - _avatar: function(can, msg) { if (can.user.isLocalFile) { return } + _avatar: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } msg.Option(aaa.AVATAR) && can.page.Modify(can, "div.output div.state.avatar>img", {src: "/share/local/avatar"}) }, _menus: function(can, msg, target) { @@ -89,10 +89,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, time: function(can, target) { can.onlayout.topic(can) target.innerHTML = can.user.time(can, null, "%w %H:%M:%S") }, - background: function(event, can, url) { if (can.user.isLocalFile) { return } + background: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return } can.run(event, [ctx.ACTION, aaa.BACKGROUND, url], function(msg) { can.onimport._background(can, msg) }) }, - avatar: function(event, can, url) { if (can.user.isLocalFile) { return } + avatar: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return } can.run(event, [ctx.ACTION, aaa.AVATAR, url], function(msg) { can.onimport._avatar(can, msg) }) }, menu: function(can, cmds, cb) { diff --git a/plugin/input/province.js b/plugin/input/province.js index 09aecfbc..4b5d5822 100644 --- a/plugin/input/province.js +++ b/plugin/input/province.js @@ -1,5 +1,5 @@ Volcanos("onfigure", {help: "控件详情", list: [], province: {onclick: function(event, can, meta, cb, target) { - can.require(["/require/github.com/shylinux/echarts/echarts.js", "/require/github.com/shylinux/echarts/china.js"], function() { + can.require(["/require/shylinux.com/x/echarts/echarts.js", "/require/shylinux.com/x/echarts/china.js"], function() { can.onappend._action(can, [cli.CLOSE, cli.CLEAR], can._action, { close: function(event) { can.page.Remove(can, can._target) }, clear: function(event) { target.value = "" }, diff --git a/plugin/local/team/plan.css b/plugin/local/team/plan.css new file mode 100644 index 00000000..dbab07fa --- /dev/null +++ b/plugin/local/team/plan.css @@ -0,0 +1,30 @@ +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:yellow; + color:white; +} +fieldset.plan>div.output div.finish { + background-color:red; + color:white; +} + +fieldset.plan>div.output td { + vertical-align:top; +} +fieldset.plan>div.output td.over { + border:solid 2px red; +} +fieldset.plan>div.output td div.date { + color:gray; +} +fieldset.plan>div.output div.project { + max-height:400px; + overflow:auto; +} diff --git a/plugin/local/team/plan.js b/plugin/local/team/plan.js new file mode 100644 index 00000000..f4d9191b --- /dev/null +++ b/plugin/local/team/plan.js @@ -0,0 +1,208 @@ +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + can.onmotion.clear(can, target) + can.ui = can.onlayout.profile(can) + can.onmotion.hidden(can, can._action) + can.onimport[can.Option("scale")||"week"](can, msg) + can.page.Modify(can, can.ui.project, {style: {"max-height": can.ui.content.offsetHeight}}) + can.page.Modify(can, can.ui.profile, {style: {"max-height": can.ui.content.offsetHeight}}) + can.page.Modify(can, can.ui.profile, {style: {display: "block"}}) + can.base.isFunc(cb) && cb(msg) + }, + _content: function(can, msg, head, list, key, get, set) { + 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) + var begin_time = can.base.Date(can.Option("begin_time")) + can.page.Append(can, can.ui.content, [{view: [chat.CONTENT, 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: [week, html.TH]} } + if (col == 0) { return {text: [hour, html.TD]} } + return can.onimport._task(can, msg, get(begin_time, col, row, hash), set(begin_time, col, row)) + })} + }) }]) + can.core.Timer(10, function() { if (!can.sup.task) { return } + var target = can.sup.task._target||can.task._target + can.sup.task = null, target.click() + can.Status("count", msg.Length()) + }) + }, + _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)) + }, + ondrop: function(event) { event.preventDefault() + can.drop(event, event.target, time) + }, + ondragover: function(event) { event.preventDefault() + can.page.Select(can, can.ui.content, html.TD, function(item) { + can.page.ClassList[event.target == item? "add": "del"](can, item, "over") + }) + }, + list: can.core.List(list, function(task) { return can.base.isString(task)? {text: [task, html.DIV, "date"]}: + {text: [can.onexport[can.Action("view")||"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, "begin_time", time+task.begin_time.slice(time.length), task.begin_time) + } }, draggable: time != undefined, + + title: can.onexport.title(can, task), _init: function(target) { + var item = can.onappend.item(can, html.ITEM, {nick: task.name+":"+task.text}, function() { + can.core.Timer(10, function() { can.onmotion.select(can, can.ui.content, html.TD, target.parentNode) }) + can.onimport._profile(can, task) + }, function() { + + }, can.ui.project); task._target = target, can.task = can.task||task, can.sup.task = can.sup.task||task + can.sup.task.zone == task.zone && can.sup.task.id == task.id && (can.sup.task._target = target) + target.onclick = function(event) { item.click() } + }, + } + }), + } }, + _profile: function(can, task) { + function keys(task, key) { return [task.pod, task.zone, task.id, key].join(".") } + + if (can.sup.task) { if (can.sup.task.id == task.id) { return } + can.page.Cache(keys(can.sup.task, chat.PROFILE), can.ui.profile, can.sup.task.id) + can.page.Cache(keys(can.sup.task, chat.DISPLAY), can.ui.display, can.sup.task.id) + } + + can.sup.task = task, can.Status(task) + var profile = can.page.Cache(keys(task, "profile"), can.ui.profile) + var display = can.page.Cache(keys(task, "display"), can.ui.display) + if (profile || display) { return } + + 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: ["key", "value"]}]}]).first + can.core.Item(task, function(key, value) { key != "_target" && can.page.Append(can, table, [{ + td: [key, key == "pod" && value != ""? can.page.Format("a", can.user.MergeURL(can, {pod: value}), value): value], + onclick: function(event) { if (event.target.type == "button") { var msg = can.request(event, can.sup.task) + can.run(event, [ctx.ACTION, event.target.name], function(msg) { can.Update() }, true) + } }, + ondblclick: function(event) { can.onmotion.modify(can, event.target, function(ev, value, old) { + can.onaction.modifyTask(event, can, task, key, value) + }) }, + }]) }), can.onimport._display(can, task) + }, + _display: function(can, task) { if (!task["extra.cmd"]) { return } + can.onappend.plugin(can, {type: "story", ctx: task["extra.ctx"], cmd: task["extra.cmd"], arg: task["extra.arg"]}, function(sub, meta) { + sub.run = function(event, cmds, cb) { var msg = can.request(event, {"task.zone": task.zone, "task.id": task.id}) + can.run(event, can.misc.Concat([ctx.ACTION, cli.RUN, task["zone"], task["id"]], cmds), cb, true) + } + }, can.ui.display) + can.page.Modify(can, can.ui.display, {style: {display: "block"}}) + }, + + day: function(can, msg) { + var head = ["hour", "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 = ["hour"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]) + 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]] } + function set(begin_time, col, row) { return can.base.Time(can.base.TimeAdd(begin_time, -begin_time.getDay()+col-1), "%y-%m-%d ")+list[row] } + + can.onimport._content(can, msg, head, list, key, get, set) + }, + month: function(can, msg) { + var head = ["order"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]) + var list = [0]; for (var i = 1; i < 6; i++) { list.push(i) } + + function key(time) { return can.base.Time(time, "%y-%m-%d") } + function get(begin_time, col, row, hash) { + var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)) + var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay()) + var day = can.base.TimeAdd(last, (row-1)*7+col) + return [day.getDate()+""].concat(hash[key(day)]||[]) + } + function set(begin_time, col, row) { + var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)) + var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay()) + var day = can.base.TimeAdd(last, (row-1)*7+col) + return key(day) + } + + can.onimport._content(can, msg, head, list, key, get, set) + }, + year: function(can, msg) { + var head = ["month"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]); + 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)] } + function set(begin_time, col, row) { return begin_time.getFullYear()+"-"+can.base.Number(list[row], 2) } + + 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("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 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) + }, +}, [""]) +Volcanos("onaction", {help: "组件交互", list: [ + ["level", "all", "l1", "l2", "l3", "l4", "l5"], + ["status", "all", "prepare", "process", "cancel", "finish"], + ["score", "all", "s1", "s2", "s3", "s4", "s5"], + ["view", "", "name", "text", "level", "score"], + ], + insertTask: function(event, can, time) { var msg = can.sup.request(event, {begin_time: time}) + can.user.input(event, can, can.Conf("feature.insert"), function(event, button, data, list) { + can.run(event, can.base.Simple(ctx.ACTION, mdb.INSERT, "begin_time", time, data)) + }) + }, + modifyTask: function(event, can, task, key, value) { var msg = can.request(event, task) + can.run(event, [ctx.ACTION, mdb.MODIFY, key, value, task[key]]) + }, + + _filter: function(event, can, key, value) { var count = 0 + if (value == "all") { + can.page.Select(can, can.ui.content, "div.item", function(item) { + can.page.ClassList.del(can, item, "hidden"), count++ + }) + } else { + can.page.Select(can, can.ui.content, "div.item", function(item) { + can.page.ClassList.add(can, item, "hidden") + }) + can.page.Select(can, can.ui.content, "div."+value, function(item) { + can.page.ClassList.del(can, item, "hidden"), count++ + }) + } + can.Action(key, value), can.Status("count", count) + }, + level: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, + status: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, + score: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, + 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("onexport", {help: "导出数据", list: ["count", "begin_time", "zone", "id", "type", "name", "text"], + 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||"") }, + score: function(can, task) { return "s-"+(task.level||3)+": "+(task.name||"") }, + title: function(can, task) { return task.zone+": "+(task.type||"") }, + style: function(can, task) { return ["item", task.status, "id"+task.id, "l"+(task.level||""), "s"+(task.score||"")].join(" ") }, +}) + diff --git a/proto.js b/proto.js index 3816c325..75d37519 100644 --- a/proto.js +++ b/proto.js @@ -167,11 +167,12 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: var meta = arguments.callee.meta, list = arguments.callee.list if (typeof name == lang.OBJECT) { var Config = name; Config.panels = Config.panels||[], Config.main = Config.main||{} libs = [], meta.libs = ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"] + meta.iceberg = Config.iceberg||meta.iceberg // 预加载 for (var i = 0; i < Config.panels.length; i++) { var panel = Config.panels[i] panel && (libs = libs.concat(panel.list = panel.list||["/panel/"+panel.name+".css", "/panel/"+panel.name+".js"])) - }; libs = libs.concat(Config.plugin, Config.main.list, meta.volcano) + }; libs = libs.concat(Config.plugin, Config.main.list) // 根模块 name = Config.name, can = {_follow: Config.name, _target: Config.target||document.body}, cb = function(can) { @@ -239,7 +240,7 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: for (var i = 0; i < libs.length; i++) { if (libs[i] == "") { libs[i] = _can_path.replace(".js", ".css") - } else if (libs[i][0] != "/") { + } else if (libs[i][0] != "/" && libs[i].indexOf("http") != 0) { libs[i] = _can_path.slice(0, _can_path.lastIndexOf("/")+1)+libs[i] } } diff --git a/publish/chrome/contexts.js b/publish/chrome/contexts.js index d737717e..8de13456 100644 --- a/publish/chrome/contexts.js +++ b/publish/chrome/contexts.js @@ -1,4 +1,6 @@ +setTimeout(function() { Volcanos("chrome", { + _follow: "chrome", pwd: function(can, msg, arg) { msg.Push("hi", "hello") msg.Echo("hello") @@ -87,7 +89,7 @@ Volcanos("chrome", { }, document.body) }, Option: function() { return [] }, -}, ["/frame.js"], function(can) { +}, [], function(can) { chrome.extension.onMessage.addListener(function(req, sender, cb) { var msg = can.request(); msg.Copy(req); can.misc.Log(req.detail, msg) can.core.CallFunc([can, req.detail[3]||"spide"], {can: can, msg: msg, arg: req.detail.slice(4), cb: function() { delete(msg._event), delete(msg._can), cb(msg) @@ -102,4 +104,4 @@ Volcanos("chrome", { msg.result && msg.result[0] && can.field(can, msg, msg.result) }) }) - +}, 100)