From 0c3f6033a3292b536f9bfd6afd92e2c8466b98b6 Mon Sep 17 00:00:00 2001 From: shaoying Date: Mon, 17 May 2021 00:18:54 +0800 Subject: [PATCH] opt frame.js --- frame.js | 331 +++++++++++++++--------------------------------- lib/base.js | 6 + lib/core.js | 14 +- lib/user.js | 11 +- page/index.js | 120 +++++++++++++++++- page/print.css | 11 -- page/share.html | 1 - page/share.js | 27 +++- panel/Action.js | 5 +- panel/Header.js | 10 +- panel/River.js | 11 +- plugin/table.js | 6 +- proto.js | 41 ++---- 13 files changed, 289 insertions(+), 305 deletions(-) delete mode 100644 page/print.css diff --git a/frame.js b/frame.js index 687564fa..5aade20a 100644 --- a/frame.js +++ b/frame.js @@ -3,25 +3,24 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, can.core.Next(list, function(item, next) { item.type = "panel" can.onappend._init(can, item, item.list, function(panel) { panel.onaction && panel.onappend._action(panel, item.action||panel.onaction.list) - panel.Status = panel.Status || function(key, value) { panel.search({}, ["Footer.onimport."+key, value]) } + panel.Status = panel.Status || function(key, value) { panel.set("Footer", key, value) } panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds || [] - return (can.onengine[cmds[0]]||can.onengine[meta.main.engine]||can.onengine.remote)(event, can, msg, panel, cmds, cb) + return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, panel, cmds, cb) }, can[item.name] = panel, next() }, target) - }, function() { - var panel = can[meta.main.name], msg = can.request() - panel.onmotion._init(panel, target), panel.onkeypop._init(panel, target) - panel.onaction._init(panel, msg, [], cb, panel._target) + }, function() { can.base.Copy(can.onengine.river, can.Conf("river")) + var panel = can[meta.main.name]; panel.onaction._init(panel, can.request(), [], function(msg) { cb(msg) + panel.onmotion._init(panel, target), panel.onkeypop._init(panel, target) + can.misc.Log(can.user.title(), "run", can) + }, panel._target) }) }, - search: function(event, can, msg, panel, cmds, cb) { + _search: function(event, can, msg, panel, cmds, cb) { var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split("."), function(value) { fun && (sub = mod, mod = fun, fun = mod[value], key = value) - }); if (!sub || !mod || !fun) { - can.misc.Warn("not found", cmds) - can.base.isFunc(cb) && cb(msg.Echo("warn: ", "not found: ", cmds[1])) - return + }); if (!sub || !mod || !fun) { can.misc.Warn("not found", cmds) + return can.base.isFunc(cb) && cb(msg.Echo("warn: ", "not found: ", cmds)) } return can.core.CallFunc(fun, { @@ -30,173 +29,51 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, "list": cmds.slice(2), "cb": cb, "target": sub._target, }, mod) }, - remote: function(event, can, msg, panel, cmds, cb) { - delete(msg._handle), delete(msg._toast) + _remote: function(event, can, msg, panel, cmds, cb) { if (panel.onengine.engine(event, can, msg, panel, cmds, cb)) { return } var key = panel._name+"."+cmds.join(",") if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear("append") var res = Volcanos.meta.pack[key]; res? msg.Copy(res): can.user.toast(can, "缺失数据") - return typeof cb == "function" && cb(msg) + return can.base.isFunc(cb) && cb(msg) } can.misc.Run(event, can, {names: (can.Conf("iceberg")||"/chat/")+panel._name, daemon: can.ondaemon._list[0]+"."+msg._daemon}, cmds, function(msg) { + delete(msg._handle), delete(msg._toast) Volcanos.meta.pack[key] = msg can.base.isFunc(cb) && cb(msg) }) - - panel.search(event, ["Footer.onimport.ncmd"]) }, engine: function(event, can, msg, panel, cmds, cb) { return false }, - listen: shy("事件回调", {}, [], function(can, name, cb) { + + listen: shy("监听事件", {}, [], function(can, name, cb) { arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) }), - signal: shy("事件触发", function(can, name, msg) { msg = msg || can.request() + signal: shy("触发事件", function(can, name, msg) { msg = msg || can.request() can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {msg: msg}) }) }), - _merge: function(can, sub) { - typeof sub._init == "function" && can.core && sub._init(can, sub) + river: {}, _merge: function(can, sub) { for (var k in sub["river"]) { can.onengine["river"] = sub["river"]; break } }, - river: { - "serivce": {name: "运营群", storm: { - "wx": {name: "公众号 wx", action: [ - {name: "微信公众号", help: "wx", index: "web.wiki.word", args: ["usr/icebergs/misc/wx/wx.shy"]}, - ]}, - "mp": {name: "小程序 mp", action: [ - {name: "微信小程序", help: "mp", index: "web.wiki.word", args: ["usr/icebergs/misc/mp/mp.shy"]}, - ]}, - "lark": {name: "机器人 lark", action: [ - {name: "飞书机器人", help: "lark", index: "web.wiki.word", args: ["usr/icebergs/misc/lark/lark.shy"]}, - ]}, - "share": {name: "上下文 share", action: [ - {name: "系统上下文", help: "shylinux/contexts", index: "web.wiki.word", args: ["usr/learning/社会/管理/20200724.shy"]}, - ]}, - }}, - "product": {name: "产品群", storm: { - "office": {name: "办公 office", action: [ - {name: "feel", help: "影音媒体", index: "web.wiki.feel"}, - {name: "draw", help: "思维导图", index: "web.wiki.draw"}, - {name: "data", help: "数据表格", index: "web.wiki.data"}, - {name: "plan", help: "计划任务", index: "web.team.plan"}, - {name: "think", help: "智库", index: "web.wiki.word", args: ["usr/learning/"]}, - {name: "index", help: "索引", index: "web.wiki.word", args: ["usr/learning/index.shy"]}, - {name: "context", help: "编程", index: "web.wiki.word", args: ["usr/learning/自然/编程/index.shy"]}, - ]}, - "english": {name: "英汉 english", action: [ - {name: "english", help: "英汉", index: "web.wiki.alpha.alpha", args: ["word", "hi"]}, - {name: "chinese", help: "汉英", index: "web.wiki.alpha.alpha", args: ["line", "你好"]}, - {name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["word", "wqvb"]}, - {name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["line", "你好"]}, - ]}, - "learning": {name: "学习 learning", action: [ - {name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]}, - {name: "tmux", help: "粘贴", index: "web.code.tmux.text"}, - {name: "study", help: "学习", index: "web.wiki.word", args: ["usr/learning/study.shy"]}, - ]}, - "chrome": {name: "爬虫 chrome", action: [ - {name: "feel", help: "网页爬虫", index: "web.wiki.feel", args: ["spide/"], feature: { - display: "/plugin/local/wiki/feel.js", - height: 200, limit: 3, - }}, - {name: "cached", help: "爬虫缓存", index: "web.code.chrome.cache", args: []}, - {name: "spided", help: "网页爬虫", index: "web.code.chrome.spide", args: location && location.protocol && location.protocol=="chrome-extension:"? ["1", "", "spide"]: ["1"]}, - ]}, - }}, - "project": {name: "研发群", storm: { - "studio": {name: "研发 studio", action: [ - {name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"]}, - {name: "repos", help: "代码库", index: "web.code.git.status"}, - {name: "plan", help: "任务表", index: "web.team.plan"}, - {name: "contexts", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]}, - ]}, - "cli": {name: "命令 cli", action: [ - {name: "bash", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/bash/bash.shy"]}, - {name: "tmux", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/tmux/tmux.shy"]}, - {name: "git", help: "代码库", index: "web.wiki.word", args: ["usr/icebergs/misc/git/git.shy"]}, - {name: "vim", help: "编辑器", index: "web.wiki.word", args: ["usr/icebergs/misc/vim/vim.shy"]}, - {name: "ssh", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/base/ssh/ssh.shy"]}, - {name: "zsh", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/bash/zsh.shy"]}, - ]}, - "web": {name: "网页 web", action: [ - {name: "HTML5", help: "浏览器", index: "web.wiki.word", args: ["usr/icebergs/misc/chrome/chrome.shy"]}, - ]}, - "linux": {name: "系统 linux", action: [ - {name: "idc", help: "平台", index: "web.wiki.word", args: ["usr/linux-story/idc/idc.shy"]}, - {name: "iso", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/iso/iso.shy"]}, - {name: "iot", help: "设备", index: "web.wiki.word", args: ["usr/linux-story/iot/iot.shy"]}, - {name: "linux", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/src/main.shy"]}, - ]}, - "nginx": {name: "代理 nginx", action: [ - {name: "nginx", help: "代理", index: "web.wiki.word", args: ["usr/nginx-story/src/main.shy"]}, - ]}, - "context": {name: "编程 context", action: [ - {name: "grafana", help: "可视化", index: "web.wiki.word", args: ["usr/golang-story/src/grafana/grafana.shy"]}, - {name: "gogs", help: "代码库", index: "web.wiki.word", args: ["usr/golang-story/src/gogs/gogs.shy"]}, - {name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]}, - ]}, - "redis": {name: "缓存 redis", action: [ - {name: "redis", help: "缓存", index: "web.wiki.word", args: ["usr/redis-story/src/main.shy"]}, - ]}, - "mysql": {name: "数据 mysql", action: [ - {name: "mysql", help: "数据存储", index: "web.wiki.word", args: ["usr/mysql-story/src/main.shy"]}, - ]}, - }}, - "profile": {name: "测试群", storm: { - "release": {name: "发布 release", index: [ - "web.code.publish", "web.code.compile", "web.code.autogen", - ]}, - "research": {name: "测试 research", index: [ - "web.code.favor", "web.code.bench", "web.code.pprof", - ]}, - }}, - "operate": {name: "运维群", storm: { - "ctx": {name: "模块 ctx", index: [ - "context", "command", "config", - ]}, - "cli": {name: "系统 cli", index: [ - "system", "daemon", "python", "output", - "runtime", "process", - ]}, - "web": {name: "网络 web", index: [ - "route", "serve", "space", "dream", - "spide", "share", "cache", "story", - ]}, - "aaa": {name: "权限 aaa", index: [ - "user", "sess", "role", "totp", - ]}, - - "nfs": {name: "文件 nfs", index: [ - "nfs.cat", "nfs.dir", "nfs.tail", "nfs.trash", - ]}, - "ssh": {name: "脚本 ssh", index: [ - "aaa.totp", "web.code.tmux.session", - "connect", "session", "service", "channel", - ]}, - }}, - }, }) Volcanos("ondaemon", {help: "推荐引擎", list: [], _init: function(can) { if (can.user.isLocalFile) { return } can.misc.WSS(can, {type: "chrome", name: can.user.Search(can, "daemon")||""}, function(event, msg, cmd, arg) { if (!msg) { return } if (can.base.isFunc(can.ondaemon[cmd])) { can.core.CallFunc(can.ondaemon[cmd], { - "can": can, "msg": msg, - "cmd": cmd, "arg": arg, + "can": can, "msg": msg, "cmd": cmd, "arg": arg, "cb": function() { msg.Reply() }, }) } else { - can.onengine.search({}, can, msg, can, ["search", cmd].concat(arg), function() { + can.onengine._search({}, can, msg, can, ["_search", cmd].concat(arg), function() { msg.Reply() }) } }) - }, - _list: [""], + }, _list: [""], toast: function(can, msg, arg) { arg[0] = can - Volcanos.meta.float.toast && can.page.Remove(can, Volcanos.meta.float.toast._target) - Volcanos.meta.float.toast = can.core.CallFunc(can.user.toast, {can: can, msg: msg, cmds: arg}) + can.onmotion.float.add(can, "float", can.core.CallFunc(can.user.toast, {can: can, msg: msg, cmds: arg})) }, grow: function(can, msg, arg) { var sub = can.ondaemon._list[msg.Option("_target")] @@ -387,12 +264,6 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) }, can._outputs.push(table), table._msg = msg - if (table.onimport && table.onimport._require) { var ls = display.split("/"); ls.pop() - can.require(can.core.List(table.onimport._require, function(item) { - return ls.join("/")+"/"+item - })) - } - 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("_action"), meta._action||table.onaction.list)) @@ -537,7 +408,8 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, (meta.run||can.run)(event, cmds, cb, true) }, sub.Conf(meta) - Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target), Volcanos.meta.float.input = sub + can.onmotion.float.add(can, "input", sub) + meta.style && sub.page.Modify(sub, sub._target, {style: meta.style}) cb(event, sub, meta, target) }, document.body) @@ -575,10 +447,12 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }, target) }, }, [], function(can) {}) -Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can) { - var target = document.body, width = window.innerWidth, height = window.innerHeight - can.user.isMobile && can.page.ClassList.add(can, document.body, "mobile") - can.user.isMobile && can.page.ClassList.set(can, document.body, "landscape", width > height) +Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, target) { target = document.body + var width = window.innerWidth, height = window.innerHeight + can.user.isMobile && can.page.ClassList.add(can, target, "mobile") + can.user.isMobile && can.page.ClassList.set(can, target, "landscape", width > height) + + document.body.onresize = function() { can.onlayout._init(can, target) } can.page.Select(can, target, ["fieldset.head", "fieldset.foot"], function(field) { height -= field.offsetHeight @@ -678,52 +552,52 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe }) }) }, - show: function(can, time, cb, target) { target = target || can._target - time = typeof time == "object"? time: {value: 10, length: time||20} - - can.page.Modify(can, target, {style: {opacity: 0, display: "block"}}) - can.core.Timer(time, function(event, value, index) { - can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}}) - }, cb) - }, - hide: function(can, time, cb, target) { target = target || can._target - time = typeof time == "object"? time: {value: 10, length: time||20} - - can.page.Modify(can, target, {style: {opacity: 1}}) - can.core.Timer(time, function(event, value, index) { - can.page.Modify(can, target, {style: {opacity: 1-(index+1)/time.length}}) - }, function() { - can.page.Modify(can, target, {style: {display: "none"}}) - can.base.isFunc(cb) && cb() - }) - }, - - focus: function(can, target) { - target.setSelectionRange(0, -1) - target.focus() - }, clear: function(can, target) { can.page.Modify(can, target||can._output, "") }, - story: function(can, target) { - can.page.Select(can, target||can._output, ".story", function(story) { var data = story.dataset - can.page.Modify(can, story, {style: can.base.Obj(data.style)}) + focus: function(can, target) { + target.setSelectionRange(0, -1), target.focus() + }, + float: { + _hash: {}, + del: function(can, key) { + this._hash[key] && can.page.Remove(can, this._hash[key]._target) + }, + add: function(can, key, value) { + this.del(can, key), this._hash[key] = value + }, - switch (data.type) { - case "spark": - if (data["name"] == "inner") { - story.title = "点击复制", story.onclick = function(event) { - can.user.copy(event, can, story.innerText) - } - } else { - can.page.Select(can, story, "span", function(item) { - item.title = "点击复制", item.onclick = function(event) { - can.user.copy(event, can, item.innerText) - } - }) + auto: function(can, target, key) { var that = this + can.page.Modify(can, target, {onmouseover: function(event) { + if (event.target.tagName == "img") { return } + can.core.List(arguments, function(key, index) { + index > 1 && that.del(can, key) + }) + }}) + }, + }, + story: { + _hash: { + spark: function(can, meta, target) { + if (meta["name"] == "inner") { + target.title = "点击复制", target.onclick = function(event) { + can.user.copy(event, can, target.innerText) } - } - }) + } else { + can.page.Select(can, target, "span", function(item) { + item.title = "点击复制", item.onclick = function(event) { + can.user.copy(event, can, item.innerText) + } + }) + } + }, + }, + auto: function(can, target) { var that = this + can.page.Select(can, target||can._output, ".story", function(item) { var meta = item.dataset + can.page.Modify(can, item, {style: can.base.Obj(meta.style)}) + can.core.CallFunc(that._hash[meta.type], [can, meta, target]) + }) + }, }, hidden: function(can, target) { @@ -780,13 +654,27 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe } }}]); ui.first.focus(), ui.first.setSelectionRange(0, -1) }, - autosize: function(can, msg, list, cb, target) { - can.page.Select(can, target, "div.output", function(item, index) { - index == 0 && (item.style.height = "") - }), target.style.height = "" - can.base.isFunc(cb) && cb(msg) - }, + autosize: function(can, target, max, min) { + can.page.Modify(can, target, { + onfocus: function(event) { + can.onmotion.resize(can, target, max, 10) + }, onmouseenter: function(event) { + can.onmotion.resize(can, target, max, 10) + }, onmouseleave: function(event) { + can.onmotion.resize(can, target, min, 5) + }, onblur: function(event) { + can.onmotion.resize(can, target, min, 5) + }, + }) + }, + resize: function(can, target, width, speed) { + var begin = target.offsetWidth + var space = (width - begin) / 30 + can.core.Timer({interval: speed||10, length: 30}, function() { + can.page.Modify(can, target, {style: {width: begin+=space}}) + }) + }, move: function(can, target, layout) { var begin target.onmousedown = function(event) { begin = {x: event.x, y: event.y, left: layout.left, top: layout.top, width: layout.width, height: layout.height} @@ -804,32 +692,23 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe } } }, + show: function(can, time, cb, target) { target = target || can._target + time = typeof time == "object"? time: {value: 10, length: time||20} - downward: function(can, target, top, speed) { - var begin = target.offsetTop - var space = (top - begin) / 30 - can.core.Timer({interval: speed||10, length: 30}, function() { - can.page.Modify(can, target, {style: {top: begin+=space}}) - }) + can.page.Modify(can, target, {style: {opacity: 0, display: "block"}}) + can.core.Timer(time, function(event, value, index) { + can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}}) + }, cb) }, - resize: function(can, target, width, speed) { - var begin = target.offsetWidth - var space = (width - begin) / 30 - can.core.Timer({interval: speed||10, length: 30}, function() { - can.page.Modify(can, target, {style: {width: begin+=space}}) - }) - }, - autosize: function(can, target, max, min) { - can.page.Modify(can, target, { - onfocus: function(event) { - can.onmotion.resize(can, target, max, 10) - }, onmouseenter: function(event) { - can.onmotion.resize(can, target, max, 10) - }, onmouseleave: function(event) { - can.onmotion.resize(can, target, min, 5) - }, onblur: function(event) { - can.onmotion.resize(can, target, min, 5) - }, + hide: function(can, time, cb, target) { target = target || can._target + time = typeof time == "object"? time: {value: 10, length: time||20} + + can.page.Modify(can, target, {style: {opacity: 1}}) + can.core.Timer(time, function(event, value, index) { + can.page.Modify(can, target, {style: {opacity: 1-(index+1)/time.length}}) + }, function() { + can.page.Modify(can, target, {style: {display: "none"}}) + can.base.isFunc(cb) && cb() }) }, diff --git a/lib/base.js b/lib/base.js index 878deed8..e46fd5e3 100644 --- a/lib/base.js +++ b/lib/base.js @@ -10,6 +10,11 @@ Volcanos("base", {help: "数据类型", } }, Copy: function(to, from, fields) { + if (arguments.length == 2) { + for (var k in from) { to[k] = from[k] } + return to + } + var list = []; for (var i = 2; i < arguments.length; i++) { list.push(arguments[i]) } @@ -17,6 +22,7 @@ Volcanos("base", {help: "数据类型", for (var i = 0; i < list.length; i++) { to[list[i]] = from[list[i]] } + return to }, Eq: function(to, from) { var self = arguments.callee if (typeof to != typeof from) { return false } diff --git a/lib/core.js b/lib/core.js index 7abd856e..507e07bf 100644 --- a/lib/core.js +++ b/lib/core.js @@ -80,20 +80,26 @@ Volcanos("core", {help: "数据结构", return res }), CallFunc: shy("调用器", function(func, args, mod) { args = args || {} + var can = args["can"]||args[0], msg = args["msg"]||args[1], cmds = args["cmds"]||[] + + // 查找调用 func = typeof func == "function"? func: typeof func == "string"? this.Value(mod||can, func): typeof func == "object" && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): null if (typeof func != "function") { return } - var can = args["can"]||args[0], msg = args["msg"]||args[1], cmds = args["cmds"]||[] - + // 解析参数 var list = [], echo = false, cb = args["cb"] this.List(func.toString().split(")")[0].split("(")[1].split(","), function(item, index) { item = item.trim() - list.push(args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) || cmds[index] || args[index] || null) + var arg = args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) || cmds[index] || args[index] || null if (item == "cb") { echo = true } + list.push(arg) }) + // 执行调用 var res = func.apply(mod||can, list) - if (!echo && typeof cb == "function") { res && msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) } + + // 执行回调 + if (!echo && typeof cb == "function") { res && msg && msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) } return res }), diff --git a/lib/user.js b/lib/user.js index f9f322f9..aed0a8df 100644 --- a/lib/user.js +++ b/lib/user.js @@ -67,7 +67,7 @@ Volcanos("user", {help: "用户操作", agent: { timer: can.core.Timer({interval: 100, length: (parseInt(meta.duration||1000))/100}, function(event, interval, index) { if (index > 30) { ui.duration.innerHTML = parseInt(index/10)+"."+(index%10)+"s..." } }, function() { action.close() }), _target: ui._target, ui: ui, - }); can.onmotion.story(can, ui._target) + }); can.onmotion.story.auto(can, ui._target) can.search(can.request({}, { title: meta.title, content: meta.content, @@ -149,14 +149,11 @@ Volcanos("user", {help: "用户操作", agent: { } }] } }) }] ); can.onlayout.figure(event, can, ui._target) - Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target) - return event.stopPropagation(), event.preventDefault(), Volcanos.meta.float.carte = ui, {_target: ui._target} + can.onmotion.float.add(can, "carte", ui) + return event.stopPropagation(), event.preventDefault(), {_target: ui._target} }, input: function(event, can, form, cb, button) { // form [ string, array, object, {_input: "select", values: []} var msg = can.request(event, can.Option()) - var option = {}; can.core.List(msg.Option(), function(key) { - option[key] = msg.Option(key) - }) var ui = can.page.Append(can, document.body, [{view: ["input"], style: {left: 0, top: 0}, list: [ {view: ["option", "table"], list: can.core.List(form, function(item) { item._input == "select" && (item = {select: [[item.name].concat(item.values)], data: item, name: item.name}) @@ -165,7 +162,7 @@ Volcanos("user", {help: "用户操作", agent: { item._init = function(target) { item.run = function(event, cmds, cb) { - var res = can.request(event, msg, option, function() { var value = {_handle: "true"} + var res = can.request(event, msg, function() { var value = {_handle: "true"} can.page.Select(can, ui.table, "textarea,input,select", function(item) { item.name && item.value && (value[item.name] = item.value) }); return value diff --git a/page/index.js b/page/index.js index 67815bbc..223762f3 100644 --- a/page/index.js +++ b/page/index.js @@ -5,7 +5,7 @@ Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js", {name: "River", help: "群聊组", pos: "left", action: ["创建", "刷新"]}, {name: "Action", help: "工作台", pos: "main"}, {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]}, - ], main: {name: "Header", engine: "remote", list: ["/publish/order.js"]}, plugin: [ + ], main: {name: "Header", list: ["/publish/order.js"]}, plugin: [ "/plugin/state.js", "/plugin/input.js", "/plugin/table.js", @@ -19,5 +19,121 @@ Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js", "/plugin/local/wiki/draw.js", "/plugin/local/wiki/word.js", "/plugin/local/team/plan.js", - ], + ], river: { + "serivce": {name: "运营群", storm: { + "wx": {name: "公众号 wx", action: [ + {name: "微信公众号", help: "wx", index: "web.wiki.word", args: ["usr/icebergs/misc/wx/wx.shy"]}, + ]}, + "mp": {name: "小程序 mp", action: [ + {name: "微信小程序", help: "mp", index: "web.wiki.word", args: ["usr/icebergs/misc/mp/mp.shy"]}, + ]}, + "lark": {name: "机器人 lark", action: [ + {name: "飞书机器人", help: "lark", index: "web.wiki.word", args: ["usr/icebergs/misc/lark/lark.shy"]}, + ]}, + "share": {name: "上下文 share", action: [ + {name: "系统上下文", help: "shylinux/contexts", index: "web.wiki.word", args: ["usr/learning/社会/管理/20200724.shy"]}, + ]}, + }}, + "product": {name: "产品群", storm: { + "office": {name: "办公 office", action: [ + {name: "feel", help: "影音媒体", index: "web.wiki.feel"}, + {name: "draw", help: "思维导图", index: "web.wiki.draw"}, + {name: "data", help: "数据表格", index: "web.wiki.data"}, + {name: "plan", help: "计划任务", index: "web.team.plan"}, + {name: "think", help: "智库", index: "web.wiki.word", args: ["usr/learning/"]}, + {name: "index", help: "索引", index: "web.wiki.word", args: ["usr/learning/index.shy"]}, + {name: "context", help: "编程", index: "web.wiki.word", args: ["usr/learning/自然/编程/index.shy"]}, + ]}, + "english": {name: "英汉 english", action: [ + {name: "english", help: "英汉", index: "web.wiki.alpha.alpha", args: ["word", "hi"]}, + {name: "chinese", help: "汉英", index: "web.wiki.alpha.alpha", args: ["line", "你好"]}, + {name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["word", "wqvb"]}, + {name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["line", "你好"]}, + ]}, + "learning": {name: "学习 learning", action: [ + {name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]}, + {name: "tmux", help: "粘贴", index: "web.code.tmux.text"}, + {name: "study", help: "学习", index: "web.wiki.word", args: ["usr/learning/study.shy"]}, + ]}, + "chrome": {name: "爬虫 chrome", action: [ + {name: "feel", help: "网页爬虫", index: "web.wiki.feel", args: ["spide/"], feature: { + display: "/plugin/local/wiki/feel.js", + height: 200, limit: 3, + }}, + {name: "cached", help: "爬虫缓存", index: "web.code.chrome.cache", args: []}, + {name: "spided", help: "网页爬虫", index: "web.code.chrome.spide", args: location && location.protocol && location.protocol=="chrome-extension:"? ["1", "", "spide"]: ["1"]}, + ]}, + }}, + "project": {name: "研发群", storm: { + "studio": {name: "研发 studio", action: [ + {name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"]}, + {name: "repos", help: "代码库", index: "web.code.git.status"}, + {name: "plan", help: "任务表", index: "web.team.plan"}, + {name: "contexts", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]}, + ]}, + "cli": {name: "命令 cli", action: [ + {name: "bash", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/bash/bash.shy"]}, + {name: "tmux", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/tmux/tmux.shy"]}, + {name: "git", help: "代码库", index: "web.wiki.word", args: ["usr/icebergs/misc/git/git.shy"]}, + {name: "vim", help: "编辑器", index: "web.wiki.word", args: ["usr/icebergs/misc/vim/vim.shy"]}, + {name: "ssh", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/base/ssh/ssh.shy"]}, + {name: "zsh", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/bash/zsh.shy"]}, + ]}, + "web": {name: "网页 web", action: [ + {name: "HTML5", help: "浏览器", index: "web.wiki.word", args: ["usr/icebergs/misc/chrome/chrome.shy"]}, + ]}, + "linux": {name: "系统 linux", action: [ + {name: "idc", help: "平台", index: "web.wiki.word", args: ["usr/linux-story/idc/idc.shy"]}, + {name: "iso", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/iso/iso.shy"]}, + {name: "iot", help: "设备", index: "web.wiki.word", args: ["usr/linux-story/iot/iot.shy"]}, + {name: "linux", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/src/main.shy"]}, + ]}, + "nginx": {name: "代理 nginx", action: [ + {name: "nginx", help: "代理", index: "web.wiki.word", args: ["usr/nginx-story/src/main.shy"]}, + ]}, + "context": {name: "编程 context", action: [ + {name: "grafana", help: "可视化", index: "web.wiki.word", args: ["usr/golang-story/src/grafana/grafana.shy"]}, + {name: "gogs", help: "代码库", index: "web.wiki.word", args: ["usr/golang-story/src/gogs/gogs.shy"]}, + {name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]}, + ]}, + "redis": {name: "缓存 redis", action: [ + {name: "redis", help: "缓存", index: "web.wiki.word", args: ["usr/redis-story/src/main.shy"]}, + ]}, + "mysql": {name: "数据 mysql", action: [ + {name: "mysql", help: "数据存储", index: "web.wiki.word", args: ["usr/mysql-story/src/main.shy"]}, + ]}, + }}, + "profile": {name: "测试群", storm: { + "release": {name: "发布 release", index: [ + "web.code.publish", "web.code.compile", "web.code.autogen", + ]}, + "research": {name: "测试 research", index: [ + "web.code.favor", "web.code.bench", "web.code.pprof", + ]}, + }}, + "operate": {name: "运维群", storm: { + "ctx": {name: "模块 ctx", index: [ + "context", "command", "config", + ]}, + "cli": {name: "系统 cli", index: [ + "system", "daemon", "python", "output", + "runtime", "process", + ]}, + "web": {name: "网络 web", index: [ + "route", "serve", "space", "dream", + "spide", "share", "cache", "story", + ]}, + "aaa": {name: "权限 aaa", index: [ + "user", "sess", "role", "totp", + ]}, + + "nfs": {name: "文件 nfs", index: [ + "nfs.cat", "nfs.dir", "nfs.tail", "nfs.trash", + ]}, + "ssh": {name: "脚本 ssh", index: [ + "aaa.totp", "web.code.tmux.session", + "connect", "session", "service", "channel", + ]}, + }}, + }, }) diff --git a/page/print.css b/page/print.css deleted file mode 100644 index 2461de4e..00000000 --- a/page/print.css +++ /dev/null @@ -1,11 +0,0 @@ - -fieldset.Header.head { - display:none; -} -fieldset.River.left { - display:none; -} -fieldset.Footer.foot { - display:none; -} - diff --git a/page/share.html b/page/share.html index 74b5e2bf..5a99b282 100644 --- a/page/share.html +++ b/page/share.html @@ -7,7 +7,6 @@ - diff --git a/page/share.js b/page/share.js index f089a304..aaa51c03 100644 --- a/page/share.js +++ b/page/share.js @@ -1,11 +1,24 @@ Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js", libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], panels: [ + {name: "Header", help: "标题栏", pos: "head", state: ["time", "username", "avatar"]}, + {name: "Search", help: "搜索框", pos: "auto"}, + {name: "River", help: "群聊组", pos: "left", action: ["创建", "刷新"]}, {name: "Action", help: "工作台", pos: "main"}, - ], main: {name: "Action", engine: "remote", list: ["/publish/order.js"]}, plugin: [ - "/plugin/state.js", - "/plugin/input.js", - "/plugin/table.js", - "/plugin/input/key.js", - "/plugin/input/date.js", - ], + {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]}, + ], main: {name: "Header"}, river: { + "serivce": {name: "运营群", storm: { + "wx": {name: "公众号 wx", action: [ + {name: "微信公众号", help: "wx", index: "web.wiki.word", args: ["usr/icebergs/misc/wx/wx.shy"]}, + ]}, + "mp": {name: "小程序 mp", action: [ + {name: "微信小程序", help: "mp", index: "web.wiki.word", args: ["usr/icebergs/misc/mp/mp.shy"]}, + ]}, + "lark": {name: "机器人 lark", action: [ + {name: "飞书机器人", help: "lark", index: "web.wiki.word", args: ["usr/icebergs/misc/lark/lark.shy"]}, + ]}, + "share": {name: "上下文 share", action: [ + {name: "系统上下文", help: "shylinux/contexts", index: "web.wiki.word", args: ["usr/learning/社会/管理/20200724.shy"]}, + ]}, + }}, + }, }) diff --git a/panel/Action.js b/panel/Action.js index 8b441124..b895d5e8 100644 --- a/panel/Action.js +++ b/panel/Action.js @@ -16,10 +16,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) can.onaction._layout(can, can.Conf(can._LAYOUT)||can.user.Search(can, can._LAYOUT)) }) - can.page.Modify(can, can._output, {onmouseover: function(event) { - Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target) - // Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target) - }}) + can.onmotion.float.auto(can, can._output, "carte") }, _plugin: function(can, river, storm, sub, item) { sub.run = function(event, cmds, cb) { var msg = sub.request(event) diff --git a/panel/Header.js b/panel/Header.js index 9cee0bb6..ca086599 100644 --- a/panel/Header.js +++ b/panel/Header.js @@ -33,15 +33,12 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.base.isFunc(cb) && cb(msg) - can.page.Modify(can, can._output, {onmouseover: function(event) { - Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target) - Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target) - }}) + can.onmotion.float.auto(can, can._output, "carte", "input") }, _title: function(can, msg, target) { can.user.title(can.user.Search(can, can._TITLE)||can.user.Search(can, "pod")) !can.user.isMobile && can.core.List(msg.result||["github.com/shylinux/contexts"], function(item) { - can.page.Append(can, target, [{view: [can._TITLE, "div", item], onclick: function(event) { + can.page.Append(can, target, [{view: [can._TITLE, "div", item], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}]) }) @@ -128,9 +125,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, _time: function(can, target) { can.core.Timer({interval: 1000}, function() { can.onimport.time(can, target) }) can.onappend.figure(can, {style: {"min-width": 306}}, "@date", target) + target.onmouseenter = function(event) { target.click() can.core.Timer(10, function() { - can.onlayout.figure(event, can, Volcanos.meta.float.input._target) + // can.onlayout.figure(event, can, Volcanos.meta.float.input._target) }) } }, diff --git a/panel/River.js b/panel/River.js index 176618a7..4c77c19f 100644 --- a/panel/River.js +++ b/panel/River.js @@ -13,10 +13,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, select && select.click() - can.page.Modify(can, can._output, {onmouseover: function(event) { - Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target) - Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target) - }}) + can.onlayout._init(can) + can.onmotion.float.auto(can, can._output, "carte", "input") }, _main: function(can, msg) { can._main_river = "project", can._main_storm = "studio" @@ -114,7 +112,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, can.onengine.listen(can, "action.touch", function() { can.user.isMobile && can.onmotion.hidden(can) - Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target) + can.onmotion.float.del(can, "carte") }) }, storm: function(event, can, river) { @@ -130,7 +128,8 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, can.sublist[river] = list }) }, - action: function(event, can, river, storm) { can.onlayout._init(can) + action: function(event, can, river, storm) { + // can.onlayout._init(can) can.onengine.signal(can, "storm.select", can.request(event, { river: can.Conf(can._RIVER, river), storm: can.Conf(can._STORM, storm), })) diff --git a/plugin/table.js b/plugin/table.js index 9e67bdb6..5d368e9c 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -7,7 +7,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.base.isFunc(cb) && cb(msg) can.onappend.board(can, msg.Result()) - can.onmotion.story(can, can._output) + can.onmotion.story.auto(can, can._output) }, _table: function(can, value, key, index, line, array, cb) { return {text: [value, "td"], onclick: function(event) { var target = event.target @@ -53,7 +53,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, can._output) can.onappend.board(can, msg.Result(), can._output) - can.onmotion.story(can, can._output) + can.onmotion.story.auto(can, can._output) can.page.Modify(can, can._output, {style: {display: "block"}}) return true }, @@ -122,7 +122,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }).length == 0) { can.onappend.board(can, str) } - // can.onmotion.story(can, can._output) + // can.onmotion.story.auto(can, can._output) }, }) Volcanos("onaction", {help: "控件交互", list: []}) diff --git a/proto.js b/proto.js index 0df77e20..37e6a53f 100644 --- a/proto.js +++ b/proto.js @@ -11,7 +11,7 @@ function shy(help, meta, list, cb) { cb.list = next("object") || [] return cb }; var _can_name = "" -var Volcanos = shy("火山架", {args: {}, pack: {}, libs: [], cache: {}, float: {}}, [], function(name, can, libs, cb) { +var Volcanos = shy("火山架", {args: {}, pack: {}, libs: [], cache: {}}, [], function(name, can, libs, cb) { var meta = arguments.callee.meta, list = arguments.callee.list if (typeof name == "object") { var Config = name; _can_name = "" meta.libs = Config.libs, meta.volcano = Config.volcano @@ -24,9 +24,7 @@ var Volcanos = shy("火山架", {args: {}, pack: {}, libs: [], cache: {}, float: // 根模块 name = Config.name, can = {_follow: Config.name, _target: document.body} libs = Preload.concat(Config.main.list, Config.libs), cb = function(can) { - can.onengine._init(can, can.Conf(Config), Config.panels, function(msg) { can.misc.Log(can.user.title(), "run", can) - document.body.onresize = function() { can.onlayout._init(can, can._target) } - }, can._target) + can.onengine._init(can, can.Conf(Config), Config.panels, function(msg) {}, can._target) } } @@ -50,12 +48,6 @@ var Volcanos = shy("火山架", {args: {}, pack: {}, libs: [], cache: {}, float: return // 加载完成 } - if (libs && libs[0] && libs[0][0] != "/" && libs[0].indexOf("http") == -1) { - can._require = can._require||[], can._require.push(libs[0]) - can.require(libs.slice(1), cb, each) - return - } - // 请求模块 function next() { can._load(libs[0], each), can.require(libs.slice(1), cb, each) } meta.cache[libs[0]]? next(): meta._load(libs[0], next) @@ -70,33 +62,26 @@ var Volcanos = shy("火山架", {args: {}, pack: {}, libs: [], cache: {}, float: }); return event._msg }, - const: function() { - can.core.List(arguments, function(v) { - can["_"+v.toUpperCase()] = v - }) + + get: function(name, key) { var event = {} + return can.search(event, [name+".onexport."+key]) }, - get: function(target, field) { - return can.search({}, [target+".onexport."+field]) + set: function(name, key, value) { var event = {} + var msg = can.request(event); msg.Option(key, value) + return can.search(event, [name+".onimport."+key]) }, - set: function(target, field, value) { var event = {} - var msg = can.request(event, {}); msg.Option(field, value) - return can.search(event, [target+".onimport."+field]) - }, - cmd: function(target, field) { - return can.search({}, [target+".onaction."+field]) - }, - search: function(event, cmds, cb) { can.run && can.run(event, ["search"].concat(cmds), cb, true) }, + search: function(event, cmds, cb) { can.run && can.run(event, ["_search"].concat(cmds), cb, true) }, + + const: function() { can.core.List(arguments, function(v) { can["_"+v.toUpperCase()] = v }) }, Conf: function(key, value) { return can.core.Value(can._conf, key, value) }, _conf: {}, - // }; can = can || {}; for (var k in proto) { can.hasOwnProperty(k) || (can[k] = proto[k]) } }; can = can || {}; can.__proto__ = proto - if (_can_name) { + if (_can_name) { // 加入缓存 meta.cache[_can_name] = meta.cache[_can_name] || [] meta.cache[_can_name].push(can) - } else { + } else { // 加入队列 list.push(can) } - return can.require(libs, cb), can }) Volcanos.meta._load = function(url, cb) {