From 7d0876c419df5f0b2efbfcd8c8dbc3c739ffee16 Mon Sep 17 00:00:00 2001 From: shaoying Date: Tue, 30 Jun 2020 18:10:22 +0800 Subject: [PATCH] opt chat --- frame.js | 132 ++--------------------------- history/pane/float/Login.js | 4 +- index.css | 19 +++-- lib/page.js | 2 +- lib/user.js | 161 +++++++++++++++++++++++++++++------- pane/Action.js | 6 +- pane/Header.js | 45 +++++----- pane/River.js | 46 +++++++++-- pane/Search.css | 6 +- pane/Search.js | 58 ++++++++++++- pane/Storm.js | 58 +++++++++++-- plugin/input/upload.js | 2 +- plugin/local/code/inner.css | 4 +- plugin/local/code/inner.js | 55 +++++++----- plugin/local/team/plan.js | 8 +- plugin/local/wiki/data.js | 4 +- plugin/local/wiki/draw.js | 4 +- plugin/local/wiki/feel.js | 2 +- 18 files changed, 382 insertions(+), 234 deletions(-) diff --git a/frame.js b/frame.js index a7ec7ab6..faf81747 100644 --- a/frame.js +++ b/frame.js @@ -105,6 +105,7 @@ Volcanos("onengine", { _init: function(can, meta, list, cb, target) { can.core.Item(river.storm, function(key, value) { msg.Push("key", key) msg.Push("name", value.name) + msg.Push("count", (value.index||value.action).length) }) typeof cb == "function" && cb(msg) return true @@ -199,6 +200,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met meta.detail = meta.feature["detail"] || {} sub.onimport._init(sub, sub.Conf(meta), list, function() {}, field) + sub.onappend._status(sub, status) // 添加控件 function add(item, next, index) { @@ -332,7 +334,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met }, _detail: function(can, msg, list, target) { can.ondetail && can.ondetail.list && can.ondetail.list.length > 0 && (target.oncontextmenu = function(event) { - can.onappend.carte(can, can.ondetail||{}, list, function(ev, item, meta) { + can.user.carte(can, can.ondetail||{}, list, function(ev, item, meta) { (can.ondetail[item] || can.onaction[item] || can.onkeymap && can.onkeymap._remote)(event, can, item) }) }) @@ -355,7 +357,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met }, menu: function(can, msg, value) { can.ondetail && can.ondetail.list && can.ondetail.list.length > 0 && (can._target.oncontextmenu = function(event) { - can.onappend.carte(can, can.ondetail||{}, msg["_detail"] || can.Conf("detail"), function(ev, item, meta) { + can.user.carte(can, can.ondetail||{}, msg["_detail"] || can.Conf("detail"), function(ev, item, meta) { (can.ondetail[item]||can.onaction[item])(event, can, value, item) }) }) @@ -450,7 +452,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met run(event, "编辑", value) }) }, oncontextmenu: function(event) { - can.onappend.carte(can, can.ondetail||{}, msg["_detail"] || can.Conf("detail") || can.ondetail.list, function(event, item, meta) { + can.user.carte(can, can.ondetail||{}, msg["_detail"] || can.Conf("detail") || can.ondetail.list, function(event, item, meta) { switch (item) { case "编辑": can.onappend.modify(can, event.target, function(event, value, old) { @@ -469,124 +471,6 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met msg.result && can.page.AppendBoard(can, target, can.page.Display(msg.Result())) }, - carte: function(can, meta, list, cb) { meta = meta || can.ondetail, list = list && list.length > 0? list: meta.list; if (list.length == 0) { return } - can._carte = can._carte || can.page.Append(can, can._target, [{view: "carte", onmouseleave: function(event) { - can.page.Modify(can, can._carte, {style: {display: "none"}}) - }}]).last - - meta = meta||can.ondetail||{}, cb = cb||function(ev, item, meta) { - var cb = can.ondetail[item] || can.onaction[item] || can.onkeymap&&can.onkeymap._remote - cb && cb(event, can, item) - } - - can.page.Appends(can, can._carte, can.core.List(list, function(item) { - return {view: ["item"], list: [typeof item == "string"? {text: [item], click: function(event) { - typeof cb == "function" && cb(event, item, meta) - }}: item.args? {text: [item.name], click: function(event) { - can.user.input(event, can, item.args, function(event, cmd, form, list) { - var msg = can.Event(event) - can.core.Item(form, function(key, value) {msg.Option(key, value)}) - cmd == "提交" && typeof cb == "function" && cb(event, item.name, meta) - return true - }) - }}: {select: [item, function(event) { - typeof cb == "function" && cb(event, event.target.value, meta) - }], value: src[item[0]]||""}]} - })) - - - var ls = can._follow.split(".") - - 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 - var pos = {position: "absolute", display: "block", left: event.x-left, top: event.y-top} - // if (document.body.clientWidth - event.x < 60) { - // var pos = {display: "block", right: event.x, top: event.y} - // } - can.page.Modify(can, can._carte, {style: pos}) - console.log("carte ", can._carte.offsetLeft, "output", can._carte.parentNode.offsetLeft) - - event.stopPropagation() - event.preventDefault() - }, - toast: function(can, text, title, duration) { - var meta = typeof text == "object"? text: {text: text, title: title, duration: duration} - can._toast = can._toast || can.page.Append(can, can._target, [{view: "toast", onmouseleave: function(event) { - can.page.Modify(can, can._toast, {style: {display: "none"}}) - }}]).last - - var ui = can.page.Appends(can, can._toast, [ - {text: [meta.title||"", "div", "title"]}, - typeof meta.text == "object"? meta.text: {text: [meta.text||"执行成功", "div", "content"]}, - {view: ["button"], list: meta.button}, - {text: ["", "div", "duration"]}, - ]) - - var width = meta.width||200, height = meta.height||100 - var pos = {position: "absolute", display: "block", - width: width, bottom: 100, - left: document.body.clientWidth/2-width/2, - } - can.page.Modify(can, can._toast, {style: pos}) - - can.Timer({value: 1000, length: (meta.duration||3000)/1000}, function(event, interval, index) { - if (index > 2) { - ui.duration.innerHTML = index+"s..." - } - }, function() { - can.page.Modify(can, can._toast, {style: {display: "none"}}) - }) - ui.Close = function() { - can.page.Modify(can, can._toast, {style: {display: "none"}}) - } - return ui - }, - share: function(can, msg, cmd) { - can.run(msg._event, cmd||["action", "share"], function(msg) { - var src = can.user.Share(can, {_path: "/share/"+msg.Result()}, true) - var ui = can.onappend.toast(can, {title: can.page.Format("a", src, msg.Result()), text: can.page.Format("img", src+"/share"), - width: 300, height: 300, duration: 100000, button: [{button: ["确定", function(event) { - can.page.Modify(can, can._toast, {style: {display: "none"}}) - }]}] }) - }) - }, - - upload: function(can) { var begin = new Date() - can._upload = can._upload || can.page.Append(can, can._target, [{view: "upload", list: [{view: "action"}, {view: "output"}]}]) - - function show(event, value, total, loaded) { - var now = new Date(); can.page.Appends(can, can._upload.output, [ - {view: ["progress"], style: {height: "10px", border: "solid 2px red"}, list: [{ - view: ["progress"], style: {height: "10px", width: value + "%", background: "red"}, - }]}, - {text: [value+"%", "div"], style: {"float": "right"}}, - {text: [can.base.Duration(now - begin), "div"], style: {"float": "left"}}, - {text: [can.base.Size(loaded)+"/"+can.base.Size(total), "div"], style: {"text-align": "center"}}, - ]) - } - - var action = can.page.AppendAction(can, can._upload.action, [ - {type: "input", data: {name: "upload", type: "file", onchange: function(event) { - var file = action.upload.files[0] - show(event, 0, file.size, 0) - }}, style: {width: "200px"}}, "上传", "关闭"], function(event, value, cmd) { - if (action.upload.files.length == 0) {return action.upload.focus()} - if (value == "关闭") {can._upload.stick = false; return can.page.Remove(can, can._upload.output.parentNode)} - - var msg = can.request(event) - can.core.Item(can.Option(), msg.Option) - - // 上传文件 - begin = new Date() - msg._progress = show - msg.upload = action.upload.files[0] - can.run(event, ["action", "upload"], function(msg) { - can.onappend.toast(can, "上传成功") - }, true) - }) - action.upload.click() - }, 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) { @@ -606,9 +490,9 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met }, daemon: function(can, name) { can.misc.WSS(can, "", {name: name, type: "chrome"}, function(event, msg) { - if (msg.Option("_handle")) {return can.onappend.toast(can, msg.result.join(""))} + if (msg.Option("_handle")) {return can.user.toast(can, msg.result.join(""))} - can.onappend.toast(can, msg.detail.join(" ")); switch (msg.detail[0]) { + can.user.toast(can, msg.detail.join(" ")); switch (msg.detail[0]) { case "pwd": msg.Echo("hello world"); break default: can.run(event, ["search"].concat(msg.detail), function(msg) { @@ -617,7 +501,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met msg.Reply(msg) } - }, function() {can.user.toast("wss connect", "iceberg")}) + }, function() {can.user.toast(can, "wss connect", "iceberg")}) }, }, [], function(can) {}) Volcanos("onlayout", { _init: function(can, meta, list, cb, target) { diff --git a/history/pane/float/Login.js b/history/pane/float/Login.js index b76d068e..4a66c872 100644 --- a/history/pane/float/Login.js +++ b/history/pane/float/Login.js @@ -53,11 +53,11 @@ Volcanos("onaction", {help: "组件交互", list: [], can.Hide(), can.onaction.check(event, can, cb, "check", target) return } - can.user.toast("用户或密码错误") + can.user.toast(can, "用户或密码错误") }) }]}, {button: ["扫码登录", function(event, cmd) { - can.user.toast({title: "请用微信扫码("+can._share+")", list: [{img: [can.user.Share(can, { + can.user.toast(can, {title: "请用微信扫码("+can._share+")", list: [{img: [can.user.Share(can, { path: "/share/"+can._share+"/value", }, true)]}]}) }]}, diff --git a/index.css b/index.css index eae2a109..aa457dd4 100644 --- a/index.css +++ b/index.css @@ -135,8 +135,12 @@ fieldset>div.output>div.profile>div.item:hover { } fieldset>div.output>pre.display { position:sticky; bottom:0; + max-height:120px; clear:both; } +fieldset>div.output>pre.display:hover { + max-height:640px; +} fieldset div.code { color:white; @@ -185,10 +189,11 @@ fieldset table td.select { } div.carte { + color:cyan; background:black; border:solid 2px red; - position:absolute; - z-index:10; + position:fixed; + z-index:100; } div.carte div.item { padding:0 5px; @@ -200,11 +205,11 @@ div.carte div.item:hover { } div.toast { + color:yellow; background:black; border:solid 2px red; - position:absolute; + position:fixed; padding:5px; - color:yellow; z-index:100; } div.toast div.title { @@ -220,14 +225,12 @@ div.toast div.duration { } div.upload { + color:yellow; background:black; border:solid 2px red; - position:absolute; + position:fixed; padding:5px; - color:yellow; z-index:100; - left:20px; - top:20px; } div.upload div.item { float:left; diff --git a/lib/page.js b/lib/page.js index 9fa8abca..ca5cc8cf 100644 --- a/lib/page.js +++ b/lib/page.js @@ -378,7 +378,7 @@ var page = Volcanos("page", {help: "网页模块", return text; }, Download: function(can, name, value) { - var timer = can.user.toast({title: "下载中...", width: 200, + var timer = can.user.toast(can, {title: "下载中...", width: 200, text:''+name+'', }) can.page.Select(can, timer.toast.content, "a", function(item) { diff --git a/lib/user.js b/lib/user.js index 13c8065d..0a6b0403 100644 --- a/lib/user.js +++ b/lib/user.js @@ -5,47 +5,153 @@ var user = Volcanos("user", {help: "用户模块", reload: function(force) {(force || confirm("重新加载页面?")) && location.reload()}, title: function(text) {return text && (document.title = text), document.title}, - input: function(event, can, form, cb) { var button - function cbs(event, button) { var data = {} - var list = can.page.Select(can, view.table, "select,input,textarea", function(item) { + login: function(can, cb) { + var ui = can.user.input({clientX: 200, clientY: 100}, can, [ + {username: "username", name: "用户"}, + {password: "password", name: "密码"}, + {button: [["登录", function(event) { + can.user.Cookie(can, "sessid", "") + can.run({}, ["login", ui["用户"].value, ui["密码"].value], function(msg) { + if (can.user.Cookie(can, "sessid")||msg.Option("user.name")||msg.Result()) { + can.page.Remove(can, ui.first); return typeof cb == "function" && cb() + } + can.user.alert("用户或密码错误") + }) + }], ["扫码", function(event) { + // TODO + }]]}, + ], function(event, button, data, list) { + // TODO + }) + }, + toast: function(can, text, title, duration) { + var meta = typeof text == "object"? text: {text: text, title: title, duration: duration} + var width = meta.width||200, height = meta.height||100 + + var ui = can.page.Append(can, document.body, [{view: "toast", style: { + width: width, bottom: 100, left: document.body.clientWidth/2-width/2, + }, list: [ + {text: [meta.title||"", "div", "title"]}, + typeof meta.text == "object"? meta.text: {text: [meta.text||"执行成功", "div", "content"]}, + {view: ["button"], list: meta.button}, + {text: ["", "div", "duration"]}, + ]}]) + + can.Timer({value: 1000, length: (meta.duration||3000)/1000}, function(event, interval, index) { + if (index > 2) { ui.duration.innerHTML = index+"s..." } + }, function() { can.page.Remove(can, ui.first) }) + + ui.Close = function() { can.page.Remove(can, ui.first) } + return ui + }, + share: function(can, msg, cmd) { + can.run(msg._event, cmd||["action", "share"], function(msg) { + var src = can.user.Share(can, {_path: "/share/"+msg.Result()}, true) + var ui = can.user.toast(can, {title: can.page.Format("a", src, msg.Result()), text: can.page.Format("img", src+"/share"), + width: 300, height: 300, duration: 100000, button: [{button: ["确定", function(event) { + ui.Close() + }]}] }) + }) + }, + carte: function(can, meta, list, cb) { meta = meta || can.ondetail, list = list && list.length > 0? list: meta.list; if (list.length == 0) { return } + meta = meta||can.ondetail||{}, cb = cb||function(ev, item, meta) { + var cb = can.ondetail[item] || can.onaction[item] || can.onkeymap&&can.onkeymap._remote + cb && cb(event, can, item) + } + + var x = event.clientX, y = event.clientY; y += 0; if (x > 600) { x -= 20 } + var ui = can.page.Append(can, document.body, [{view: "carte", style: {left: x+"px", top: y+"px"}, onmouseleave: function(event) { + can.page.Remove(can, ui.first) + }, list: can.core.List(list, function(item) { + return {view: "item", list: [typeof item == "string"? /* button */ {text: item, click: function(event) { + typeof cb == "function" && cb(event, item, meta) + }}: item.args? /* input */ {text: item.name, click: function(event) { + can.user.input(event, can, item.args, cb) + }}: /* select */ {select: [item, function(event) { + typeof cb == "function" && cb(event, event.target.value, meta) + }]} ]} + }) }]) + + event.stopPropagation() + event.preventDefault() + return ui + }, + input: function(event, can, form, cb) { + function cbs(event, button) { + var data = {}; var list = can.page.Select(can, ui.table, "select,input,textarea", function(item) { return data[item.name] = item.value }) if (typeof cb == "function" && cb(event, button, data, list)) { - can.page.Remove(can, view.first) + can.page.Remove(can, ui.first) } } - var view = can.page.Append(can, document.body, [{view: ["input", "fieldset"], style: {left: event.clientX+"px", top: event.clientY+"px"}, list: [ + var x = event.clientX, y = event.clientY; y += 10; if (x > 600) { x -= 160 } + var button; var ui = can.page.Append(can, document.body, [{view: ["input", "fieldset"], style: {left: x+"px", top: y+"px"}, list: [ {view: ["option", "table"], list: can.core.List(form, function(item) { - if (item.button) { button = can.core.List(item.button, function(item) { return {button: typeof item == "object"? item: [item, function(event) { - cbs(event, item) - } ]} } ); return } + if (item.button) { button = can.core.List(item.button, function(item) { + return {button: typeof item == "object"? item: [item, function(event) { cbs(event, item) }]} + }); return } return {type: ["tr"], list: [ - {type: "td", list: [{text: typeof item == "string"? - item: item.length > 0? item[0]: item.name || "", - }]}, - {type: "td", list: [typeof item == "string"? {input: item, data: {autofocus: true}}: - item.length > 0? {select: [item]}: - item._input == "select"? {select: [[item.name].concat(item.values)], data: item}: - item._input? {type: "input", data: (item.type = item._input, item)}: item, + {type: "td", list: [{text: typeof item == "string"? item: item.length > 0? item[0]: item.name || ""}]}, + {type: "td", list: [typeof item == "string"? /* input */ {input: item, data: {autofocus: true}}: + item.length > 0? /* select */ {select: [item]}: + item._input == "select"? /* select */ {select: [[item.name].concat(item.values)], data: item}: + item._input? /* input */ {type: "input", data: (item.type = item._input, item)}: + /* other */ item, ]}, ]} })}, {view: "action", list: button||[{button: ["提交", function(event) { cbs(event, "提交") }]}, {button: ["关闭", function(event, button) { - can.page.Remove(can, view.first) + can.page.Remove(can, ui.first) }]}]}, ]}]) - can.page.Select(can, view.first, "input", function(item, index) { + can.page.Select(can, ui.first, "input", function(item, index) { index == 0 && (item.setSelectionRange(0, -1), item.focus()) }) - return view + return ui }, + upload: function(event, can) { var begin = new Date() + var x = event.clientX, y = event.clientY; y += 10; if (x > 400) { x -= 200 } + var ui = can.page.Append(can, document.body, [{view: "upload", style: {left: x+"px", top: y+"px"}, list: [ + {view: "action"}, {view: "output"}, + ]}]) - toast: function(text) {}, - carte: function(event, cb) {}, - login: function(cb) {}, + function show(event, value, total, loaded) { + var now = new Date(); can.page.Appends(can, ui.output, [ + {view: ["progress"], style: {height: "10px", border: "solid 2px red"}, list: [{ + view: ["progress"], style: {height: "10px", width: value + "%", background: "red"}, + }]}, + {text: [value+"%", "div"], style: {"float": "right"}}, + {text: [can.base.Duration(now - begin), "div"], style: {"float": "left"}}, + {text: [can.base.Size(loaded)+"/"+can.base.Size(total), "div"], style: {"text-align": "center"}}, + ]) + } + + var action = can.page.AppendAction(can, ui.action, [ + {type: "input", data: {name: "upload", type: "file", onchange: function(event) { + var file = action.upload.files[0] + show(event, 0, file.size, 0) + }}, style: {width: "200px"}}, "上传", "关闭"], function(event, value, cmd) { + if (value == "关闭") { return can.page.Remove(can, ui.first) } + if (action.upload.files.length == 0) {return action.upload.focus()} + + var msg = can.request(event) + can.core.Item(can.Option(), msg.Option) + + // 上传文件 + begin = new Date() + msg._progress = show + msg.upload = action.upload.files[0] + can.run(event, ["action", "upload"], function(msg) { + can.user.toast(can, "上传成功") + }, true) + }) + action.upload.click() + return ui + }, Share: shy("共享链接", function(can, objs, clear) {var obj = objs || {}; var path = location.pathname; obj._path && (path = obj._path, delete(obj._path)) @@ -81,7 +187,6 @@ var user = Volcanos("user", {help: "用户模块", Searchs: shy("请求参数", function(can, key, def) { return can.user.Search(can, "active") == can._name? can.user.Search(can, key): def }), - Cookie: shy("会话变量", function(can, key, value, path) { function set(k, v) {document.cookie = k+"="+v+";path="+(path||"/")} @@ -101,12 +206,6 @@ var user = Volcanos("user", {help: "用户模块", var result = (new RegExp(key+"=([^;]*);?")).exec(document.cookie) return result && result.length > 0? result[1]: "" }), - - isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1, - isMobile: navigator.userAgent.indexOf("Mobile") > -1, - isIPhone: navigator.userAgent.indexOf("iPhone") > -1, - isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1, - isWindows: navigator.userAgent.indexOf("Windows") > -1, locals: function(can, key, value) { if (typeof key == "object") { can.core.Item(key, function(key, value) { @@ -121,5 +220,11 @@ var user = Volcanos("user", {help: "用户模块", return localStorage.getItem(key) } }, + + isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1, + isMobile: navigator.userAgent.indexOf("Mobile") > -1, + isIPhone: navigator.userAgent.indexOf("iPhone") > -1, + isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1, + isWindows: navigator.userAgent.indexOf("Windows") > -1, }) diff --git a/pane/Action.js b/pane/Action.js index 366bc913..778c88c2 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -12,7 +12,7 @@ Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"] value.pod||"", value.group||"", value.index, JSON.stringify(can.core.Item(sub.Option(), function(key, value) { return value })), JSON.stringify(sub.Option()) ]) - can.onappend.share(can, msg, list) + can.user.share(can, msg, list) }, }) Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "action"; @@ -37,12 +37,12 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, // 插件回调 return can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) { can.run(msg._event, ["search", "Footer.onaction.ncmd"]); - can.onappend.toast(can, "执行成功", value.name, 2000); + can.user.toast(can, "执行成功", value.name, 2000); typeof cb == "function" && cb(msg) }, silent) } sub._target.oncontextmenu = function(event) { - can.onappend.carte(can, can.ondetail, can.ondetail.list, function(event, item, meta) { + can.user.carte(can, can.ondetail, can.ondetail.list, function(event, item, meta) { // 菜单命令 meta[item] && meta[item](event, can, value, sub) }) diff --git a/pane/Header.js b/pane/Header.js index ac991012..5d576061 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -1,4 +1,25 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { + document.body.onkeydown = function(event) { if (event.target != document.body) { return } + switch (event.key) { + case "n": + can.run(event, ["search", "River.onaction.create"]) + break + case "m": + can.run(event, ["search", "Storm.onaction.create"]) + break + case " ": + can.search.focus() + can.search.setSelectionRange(0, -1) + break + default: + return + } + event.stopPropagation() + event.preventDefault() + } + document.body.onkeyup = function(event) { + console.log(event) + } }, demo: function(can, msg, cmd, cb) { msg.Echo("hello demo world") @@ -14,23 +35,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, }, target) } can.run({}, ["check"], function(msg) { if (msg.Result()) { return init() } - var ui = can.user.input({}, can, [ - {username: "username", name: "用户"}, - {password: "password", name: "密码"}, - {button: [["登录", function(event) { - can.user.Cookie(can, "sessid", "") - can.run({}, ["login", ui["用户"].value, ui["密码"].value], function(msg) { - if (can.user.Cookie(can, "sessid")||msg.Option("user.name")||msg.Result()) { - can.page.Remove(can, ui.first); return init() - } - can.user.alert("用户或密码错误") - }) - }], ["扫码", function(event) { - // TODO - }]]}, - ], function(event, button, data, list) { - // TODO - }) + can.user.login(can, init) }) }, title: function(event, can, key) { var msg = can.request(event) @@ -68,11 +73,11 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, }) }) - can.page.Append(can, can._output, [{view: "search", list: [{type: "input", onkeydown: function(event) { + can.search = can.page.Append(can, can._output, [{view: "search", list: [{type: "input", onkeydown: function(event) { switch (event.key) { case "Enter": can.run(event, ["search", "Search.onimport.input", event.target.value]); break } - }, }], }]) + }, }], }]).input var height = document.body.offsetHeight var ui = can.page.Append(can, can._output, can.core.List(["Search", "River", "Storm", "Footer"], function(item) { @@ -99,7 +104,7 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, ui.River.click() } else { // ui.River.click(), ui.Footer.click(), ui.Storm.click() - ui.River.click(), ui.Footer.click() + // ui.River.click(), ui.Footer.click() } typeof cb == "function" && cb() diff --git a/pane/River.js b/pane/River.js index f81d375f..87db3d5d 100644 --- a/pane/River.js +++ b/pane/River.js @@ -1,21 +1,57 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { }, }) -Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, list, cb, target) { +Volcanos("onaction", {help: "控件交互", list: ["创建", "刷新"], _init: function(can, msg, list, cb, target) { can.onexport._init(can, msg, list, cb, target) }, + create: function(can) { + can.user.input(event, can, [["type", "public", "protected", "private"], "name", "text"], function(event, button, meta, list) { + can.run(event, ["action", "create"].concat(list), function(msg) { + can.user.Search(can, {"river": msg.Result()}) + }) + return true + }) + }, + "创建": function(event, can) { + can.onaction.create(can) + }, + "刷新": function(event, can) { + can.user.Search(can, {"river": can.Conf("river")}) + }, }) -Volcanos("ondetail", {help: "菜单交互", list: ["添加用户", "重命名", "删除"], _init: function(can, msg, list, cb, target) { +Volcanos("ondetail", {help: "菜单交互", list: ["添加用户", "重命名", "共享", "删除"], _init: function(can, msg, list, cb, target) { can.onexport._init(can, msg, list, cb, target) }, "添加用户": function(event, can, river, button) { - console.log(river, button) + can.run(event, ["search", "Search.onimport.select", "", "", "user"], function(list) { + var args = []; can.core.List(list, function(item) { + args = args.concat([item[4]]) + }) + can.run(event, [can.Conf("river"), "action", "user"].concat(args), function(msg) { + can.user.Search(can, {"river": can.Conf("river")}) + }) + }) }, "重命名": function(event, can, river, button) { - console.log(river, button) + can.user.input(event, can, ["name"], function(event, button, meta, list) { + can.run(event, [river.key, "action", "rename", meta.name], function(msg) { + can.user.Search(can, {"river": can.Conf("river")}) + }) + return true + }) + }, + "共享": function(event, can, value) { + can.user.input(event, can, ["name"], function(event, button, meta, list) { + var msg = can.request(event) + can.user.share(can, msg, [value.key, "action", "share", meta.name]) + return true + }) + }, "删除": function(event, can, river, button) { - console.log(river, button) + can.run(event, [river.key, "action", "remove"], function(msg) { + can.user.Search(can, {}) + }) }, }) Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "river" diff --git a/pane/Search.css b/pane/Search.css index fbccddf6..5c7072c1 100644 --- a/pane/Search.css +++ b/pane/Search.css @@ -4,9 +4,13 @@ fieldset.Search { left:120px; top:40px; background:black; + z-index:102; +} +fieldset.Search div.output div.content:hover { + max-height:400px; } fieldset.Search div.output div.content { - max-width:1000px; + max-height:200px; overflow:auto; } fieldset.Search div.output div.display { diff --git a/pane/Search.js b/pane/Search.js index f82dfb0a..9a60dc28 100644 --- a/pane/Search.js +++ b/pane/Search.js @@ -3,6 +3,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, }, input: function(can, msg, cmd, cb) { can._output.innerHTML = "" + can.cb = cb can.ui = can.page.Append(can, can._output, [{view: "content"}, {view: "display"}]) can.page.Modify(can, can._target, {style: {display: "block"}}) @@ -10,6 +11,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, can.run({}, cmd, function(msg) { can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) { return {text: [value, "td"], onclick: function(event) { + can.Status("index", index) + can.Status("value", value) can.run(event, [line.type, line.name, line.text], function(msg) { can.ui.display.innerHTML = "" can.onappend.table(can, can.ui.display, "table", msg) @@ -18,22 +21,71 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, }} ca.run(event, [""]) }) + + can.Status("count", msg.append && msg.append[0] && msg[msg.append[0]].length || 0) can.onappend.board(can, can.ui.content, "board", msg) }) }, + + select: function(can, msg, cmd, cb) { can._output.innerHTML = "" + function search(word) { cmd[0] = word + can.run({}, [cmd.join(";")], function(msg) { can.ui.content.innerHTML = "" + can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) { + return {text: [value, "td"], onclick: function(event) { + can.Status("index", index) + can.Status("value", value) + + can.page.Append(can, can.ui.table, [{td: [line.pod, line.ctx, line.cmd, line.type, line.name, line.text], data: {index: index}, onclick: function(event) { + can.page.Remove(can, event.target.parentNode) + }}]) + }} + }) + }) + } + + can.cb = function() { + typeof cb == "function" && cb(can.page.Select(can, can.ui.display, "tr", function(tr) { + return can.page.Select(can, tr, "td", function(td) { + return td.innerHTML + }) + }).slice(1)) + can.onaction.close(can) + }, can.ui = can.page.Append(can, can._output, [ + {input: ["word", function(event) { + if (event.key == "Enter") { search(event.target.value) + var list = can.page.Select(can, can.ui.content, "tr") + if (list.length == 2) { + list[1].firstChild.click() + event.target.setSelectionRange(0, -1) + } + } + }]}, + {view: "content"}, {view: "display", list: [{type: "table", list: [{th: ["pod", "ctx", "cmd", "type", "name", "text"]}]}]}, + ]) + can.page.Modify(can, can._target, {style: {display: "block"}}) + can.ui.input.focus() + search(cmd[0]) + }, }) -Volcanos("onaction", {help: "交互操作", list: ["关闭", "清空", "下载", "渲染", "执行", "收藏", "搜索"], _init: function(can, msg, list, cb, target) { +Volcanos("onaction", {help: "交互操作", list: ["关闭", "清空", "完成"], _init: function(can, msg, list, cb, target) { can.onexport._init(can, msg, list, cb, target) }, - "关闭": function(event, can, key) { + close: function(can) { can.page.Modify(can, can._target, {style: {display: "none"}}) }, + "关闭": function(event, can, key) { + can.onaction.close(can) + }, + "清空": function(event, can, key) { + can._output.innerHTML = "" + }, + "完成": function(event, can, key) { can.cb() }, }) Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"], "共享": function(event, can, value, sub) { var msg = sub.request(event) }, }) -Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { +Volcanos("onexport", {help: "导出数据", list: ["count", "index", "value"], _init: function(can, msg, list, cb, target) { }, }) diff --git a/pane/Storm.js b/pane/Storm.js index e5fa8d54..bf08c5f7 100644 --- a/pane/Storm.js +++ b/pane/Storm.js @@ -1,17 +1,54 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { }, }) -Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { +Volcanos("onaction", {help: "交互操作", list: ["创建", "刷新"], _init: function(can, msg, list, cb, target) { can.onexport._init(can, msg, list, cb, target) }, + create: function(can) { + can.user.input(event, can, [["type", "public", "protected", "private"], "name", "text"], function(event, button, meta, list) { + can.run(event, [can.Conf("river"), can.Conf("storm"), "action", "create"].concat(list), function(msg) { + can.user.Search(can, {"river": can.Conf("river"), "storm": msg.Result()}) + }) + return true + }) + }, + "创建": function(event, can) { + can.onaction.create(can) + }, + "刷新": function(event, can) { + can.user.Search(can, {"river": can.Conf("river"), "storm": can.Conf("storm")}) + }, }) -Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"], +Volcanos("ondetail", {help: "交互菜单", list: ["添加工具", "重命名", "共享", "删除"], + "添加工具": function(event, can, value) { + can.run(event, ["search", "Search.onimport.select", "", "", "command"], function(list) { + var args = []; can.core.List(list, function(item) { + args = args.concat([item[0], item[5], item[4], ""]) + }) + can.run(event, [can.Conf("river"), can.Conf("storm"), "action", "tool"].concat(args), function(msg) { + can.user.Search(can, {"river": can.Conf("river"), "storm": can.Conf("storm")}) + }) + }) + }, + "重命名": function(event, can, value) { + can.user.input(event, can, ["name"], function(event, button, meta, list) { + can.run(event, [can.Conf("river"), value.key, "action", "rename", meta.name], function(msg) { + can.user.Search(can, {"river": can.Conf("river"), "storm": can.Conf("storm")}) + }) + return true + }) + }, "共享": function(event, can, value) { - var msg = can.request(event) - msg.Option("name", "storm") - msg.Option("storm", can.Conf("storm")) - msg.Option("river", can.Conf("river")) - can.onappend.share(can, msg) + can.user.input(event, can, ["name"], function(event, button, meta, list) { + var msg = can.request(event) + can.user.share(can, msg, [can.Conf("river"), value.key, "action", "share", meta.name]) + return true + }) + }, + "删除": function(event, can, value) { + can.run(event, [can.Conf("river"), value.key, "action", "remove"], function(msg) { + can.user.Search(can, {"river": can.Conf("river")}) + }) }, }) Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "storm" @@ -31,7 +68,12 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, can.onappend.menu(can, msg, value) }) - if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { select = view } + if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { + select = view + if (!value.count) { + can.ondetail["添加工具"]({}, can, value) + } + } }); select && select.click() }) }, key: function(can, msg) { msg.Option("storm", can.Conf("storm")) }, diff --git a/plugin/input/upload.js b/plugin/input/upload.js index b0dd7822..25ba92b3 100644 --- a/plugin/input/upload.js +++ b/plugin/input/upload.js @@ -31,7 +31,7 @@ Volcanos("onfigure", {help: "控件详情", list: [], msg._progress = show msg.upload = action.upload.files[0]; can.run(event, ["action", "upload"], function(msg) { - can.user.toast("上传成功") + can.user.toast(can, "上传成功") }, true); }) }}, diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index c6a23f00..32c8cc78 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -71,7 +71,7 @@ fieldset.editor>div.output div.content>pre.item span.string { } fieldset.editor>div.output pre.display { padding:6px; border:solid 1px red; - max-height:80px; overflow:auto; + max-height:120px; overflow:auto; position:sticky; bottom:0; display:none; clear:both; @@ -79,7 +79,7 @@ fieldset.editor>div.output pre.display { } fieldset.editor>div.output pre.display:hover { background-color:black; - max-height:360px; + max-height:640px; z-index:10; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 8cd52bc0..f74b72f1 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -54,7 +54,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, }, ondblclick: function(event) { can.onkeymap._remote(event, can, "运行") }, oncontextmenu: function(event) { - can.onappend.carte(can, null, ["保存", "运行"]) + can.user.carte(can, null, ["保存", "运行"]) }}]).first.click() }, true) }, @@ -102,7 +102,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], // plugin function init(p) { p.display && can.onkeymap._remote({}, can, "运行") typeof p.display == "object" && ( p.display.height && can.page.Modify(can, can.ui.display, {style: { - "max-height": p.display.height, + // "max-height": p.display.height, }})) }; var p = can.onsyntax[can.parse]; !p? can.run({}, ["action", "plug", can.Option("path"), can.Option("file")], function(msg) { p = can.onsyntax[can.parse] = can.base.Obj(msg.Result()), can.onsyntax._init(can, can._msg), init(p) @@ -316,8 +316,25 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], png: { line: function(can, line) { return can.page.Format("img", "/share/local/"+line) } }, + url: { + line: function(can, line) { + return {button: [line, function(event) { + can.page.Appends(can, can.ui.display, [{type: "iframe", data: {src: line}, style: { + height: "600px", width: can.Conf("width")-80+"px", + }}]) + }]} + // return {type: "iframe", data: {src: line}, style: {height: "200px", width: can.Conf("width")-80+"px"}} + } + }, + svg: { + show: function(can) { + can.page.Append(can, can.ui.display, can.core.List(can._msg.result, function(line) { + return {type: "iframe", data: {src: "/share/local/"+line}, style: {width: can.Conf("width")-80+"px"}} + })) + } + }, jpg: { - show: function(can, line) { + show: function(can) { can.page.Append(can, can.ui.display, can.core.List(can._msg.result, function(line) { return {img: "/share/local/"+line} })) @@ -339,20 +356,20 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], } }, }, - url: { - line: function(can, line) { var auto = true, loop = true, total = 0 - function cb(event) { console.log(event) } - return {className: "preview", type: "video", style: {height: can.Conf("height")-160+"px", width: can.Conf("width")-160+"px"}, - data: {src: line, controls: "controls", autoplay: auto, loop: loop}, - oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb, - onloadedmetadata: function(event) { total = event.timeStamp - event.target.currentTime = can._msg.currentTime || 0 - }, onloadeddata: cb, ontimeupdate: function(event) { - can.Status("当前行", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration)) - }, - } - }, - }, + // url: { + // line: function(can, line) { var auto = true, loop = true, total = 0 + // function cb(event) { console.log(event) } + // return {className: "preview", type: "video", style: {height: can.Conf("height")-160+"px", width: can.Conf("width")-160+"px"}, + // data: {src: line, controls: "controls", autoplay: auto, loop: loop}, + // oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb, + // onloadedmetadata: function(event) { total = event.timeStamp + // event.target.currentTime = can._msg.currentTime || 0 + // }, onloadeddata: cb, ontimeupdate: function(event) { + // can.Status("当前行", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration)) + // }, + // } + // }, + // }, }) Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"], _init: function(can, mode) { can.page.Modify(can, can.ui.command, {style: {display: "none", width: can._target.offsetWidth-20+"px"}}) @@ -601,11 +618,11 @@ Volcanos("onaction", {help: "控件交互", list: [ }, true) }, function() { - can.onappend.toast(can, "执行成功") + can.user.toast(can, "执行成功") }) }, "项目": function(event, can) { can.onlayout.project(can) }, - "上传": function(event, can) { can.onappend.upload(can) }, + "上传": function(event, can) { can.user.upload(event, can) }, "搜索": function(event, can) { can.onkeymap._remote(event, can, "搜索", ["action", "find", "vim.history", "", "id", "type", "name", "text"]) }, "记录": function(event, can) { var sub = can.request(event) can.core.Item(can.Option(), sub.Option) diff --git a/plugin/local/team/plan.js b/plugin/local/team/plan.js index 3cf3eee8..cc8c3d67 100644 --- a/plugin/local/team/plan.js +++ b/plugin/local/team/plan.js @@ -73,7 +73,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onaction.pluginTask(event, can, task) }, oncontextmenu: function(event) { var target = event.target - can.onappend.carte(can, can.ondetail, can.ondetail.list, function(event, item) { + can.user.carte(can, can.ondetail, can.ondetail.list, function(event, item) { can.onaction.modifyTask(event, can, task, "status", item) }) }, @@ -91,7 +91,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) }, oncontextmenu: function(event) { var target = event.target - can.onappend.carte(can, can.ondetail, ["编辑"].concat(can.ondetail.list), function(event, item, meta) { + can.user.carte(can, can.ondetail, ["编辑"].concat(can.ondetail.list), function(event, item, meta) { switch (item) { case "编辑": can.onappend.modify(can, target, function(ev, value, old) { @@ -244,7 +244,7 @@ Volcanos("onaction", {help: "组件交互", list: ["统计", "添加", "详情", {name: "end_time", type: "input", value: can.base.Time(can.base.TimeAdd(now, (now.getHours()+1)/24)), onclick: date}, ], function(event, button, data, list) { can.run(event, ["action", "insert"].concat(list), function(msg) { - can.onappend.toast(can, "添加成功") + can.user.toast(can, "添加成功") can.run({}) }, true) return true @@ -255,7 +255,7 @@ Volcanos("onaction", {help: "组件交互", list: ["统计", "添加", "详情", var msg = can.request(event); msg.Option(task) can.run(event, ["action", "modify", key, value, task[key]], function(msg) { task[key] = value, can.onimport._profile(can, can._msg, task) - can.onappend.toast(can, "修改成功") + can.user.toast(can, "修改成功") }, true) }, pluginTask: function(event, can, task, key) { diff --git a/plugin/local/wiki/data.js b/plugin/local/wiki/data.js index d236658c..d1f6da7a 100644 --- a/plugin/local/wiki/data.js +++ b/plugin/local/wiki/data.js @@ -4,7 +4,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, ]) can.table = can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) { return {text: [value, "td"], oncontextmenu: function(event) { - can.onappend.carte(can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) { + can.user.carte(can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) { var cb = meta[cmd]; cb && cb(event, can, cmd, value, key, index, line) }) }, ondblclick: function(event) { @@ -55,7 +55,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", ["mode", "正常", "保存": function(event, can, cmd) { can.run(event, ["action", cmd, can.Option("path"), can.onexport.file(can)], function(msg) { - can.user.toast("保存成功") + can.user.toast(can, "保存成功") }, true) }, "正常": function(event, can, cmd) { diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js index 01f722ab..ba5faa84 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -536,7 +536,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", "清空", "删除", "保存": function(event, can, key) { var msg = can.request(event) msg.Option("content", can.onexport.file(can, can.svg)) can.run(event, ["action", key, can.Option("path")], function() { - can.user.toast("保存成功") + can.user.toast(can, "保存成功") }, true) }, "清空": function(event, can) { @@ -731,7 +731,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", "清空", "删除", } }, _menu: function(event, can, target) { var figure = can.onaction._get(can, target) - can.onappend.carte(event, can.ondetail, figure.data.detail||can.ondetail.list, function(event, key, meta) { + can.user.carte(event, can.ondetail, figure.data.detail||can.ondetail.list, function(event, key, meta) { typeof cb == "function" && cb(event, can, figure, key, target) }) }, diff --git a/plugin/local/wiki/feel.js b/plugin/local/wiki/feel.js index 55b28271..4304a64e 100644 --- a/plugin/local/wiki/feel.js +++ b/plugin/local/wiki/feel.js @@ -82,7 +82,7 @@ Volcanos("onfigure", {help: "组件菜单", list: [], }) Volcanos("onaction", {help: "组件菜单", list: ["", "上传", "收藏"], - "上传": function(event, can) { can.onappend.upload(can) }, + "上传": function(event, can) { can.user.upload(event, can) }, "收藏": function(event, can) { chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { chrome.tabs.sendMessage(tabs[0].id, { action: "copy" }, function (response) {