diff --git a/const.js b/const.js index f29aab1c..63494a68 100644 --- a/const.js +++ b/const.js @@ -108,6 +108,7 @@ var web = {CHAT: "chat", } var aaa = { USER: "user", + EMAIL: "email", LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token", USERNICK: "usernick", USERNAME: "username", PASSWORD: "password", USERROLE: "userrole", BACKGROUND: "background", AVATAR: "avatar", LANGUAGE: "language", ENGLISH: "english", CHINESE: "chinese", @@ -211,7 +212,7 @@ var chat = { "local/team/plan.js", "local/mall/goods.js", ].map(function(p) { return "/volcanos/plugin/"+p }), PLUGIN_INPUT: "/volcanos/plugin/input/", PLUGIN_STORY: "/volcanos/plugin/story/", PLUGIN_LOCAL: "/volcanos/plugin/local/", - PLUGIN_STATE_JS: "/volcanos/plugin/state.js", PLUGIN_INPUT_JS: "/volcanos/plugin/input.js", PLUGIN_TABLE_JS: "/volcanos/plugin/table.js", FRAME_JS: "/volcanos/frame.js", + PLUGIN_INPUT_JS: "/volcanos/plugin/input.js", PLUGIN_TABLE_JS: "/volcanos/plugin/table.js", PLUGIN_STATE_JS: "/volcanos/plugin/state.js", FRAME_JS: "/volcanos/frame.js", ONENGINE: "onengine", ONDAEMON: "ondaemon", ONAPPEND: "onappend", ONLAYOUT: "onlayout", ONMOTION: "onmotion", ONKEYMAP: "onkeymap", ONIMPORT: "onimport", ONACTION: "onaction", ONDETAIL: "ondetail", ONEXPORT: "onexport", ONSYNTAX: "onsyntax", ONFIGURE: "onfigure", ONPLUGIN: "onplugin", diff --git a/frame.js b/frame.js index d0eac69d..4927914e 100644 --- a/frame.js +++ b/frame.js @@ -1,6 +1,6 @@ -Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.require([can.volcano], null, function(can, key, sub) { can[key] = sub }) +Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { if (!can.user.isMailMaster) { if (can.misc.Search(can, ice.MSG_SESSID)) { can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID)); return can.misc.Search(can, ice.MSG_SESSID, "") } } - can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb) } + can.Option = function() {}, can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb) } can.user.title(can.misc.SearchOrConf(can, chat.TITLE)||can.misc.Search(can, ice.POD)||location.host) can.core.Next(list, function(item, next) { item.type = chat.PANEL can.onappend._init(can, item, item.list, function(sub) { can[item.name] = sub @@ -29,7 +29,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.requ if (sub._daemon) { msg.Option(ice.MSG_DAEMON, can.core.Keys(can.ondaemon._list[0], sub._daemon)) } } if (!can.misc.CookieSessid(can) && can.user.info.sessid) { msg.Option(ice.MSG_SESSID, can.user.info.sessid) } can.onengine.signal(panel, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) - var names = msg.Option(chat._NAMES)||panel._names||((can.Conf("iceberg")||Volcanos.meta.iceberg)+panel._name) + var names = msg.Option(chat._NAMES)||panel._names||((can.Conf("iceberg")||Volcanos.meta.iceberg)+"/chat/"+panel._name) can.misc.Run(event, can, {names: names, daemon: msg[ice.MSG_DAEMON]}, cmds, function(msg) { toast && toast.close(), toast = true can.base.isFunc(cb) && cb(msg), Volcanos.meta.pack[can.core.Keys(panel._name, cmds.join(mdb.FS))] = msg }) diff --git a/lib/user.js b/lib/user.js index 1dbfa802..4226f0b9 100644 --- a/lib/user.js +++ b/lib/user.js @@ -274,5 +274,11 @@ Volcanos("user", { avatar: {view: [[html.ITEM, aaa.AVATAR]], list: [{img: can.user.info.avatar}], onclick: function(event) { header && header.onaction.avatar(event, header) }}, usernick: {view: [[html.ITEM, aaa.USERNICK], "", can.user.info.usernick], onclick: function(event) { header && header.onaction.usernick(event, header) }}, }; return can.core.List(can.base.getValid(can.core.List(arguments).slice(1), [html.SPACE, mdb.TIME, aaa.AVATAR, aaa.USERNICK]), function(item) { return meta[item] }) - } + }, + email: function(can) { + can.page.Select(can, document.body, "iframe", function(target) { + can.page.style(can, target, html.HEIGHT, can.page.height()) + can.page.style(can, target, html.WIDTH, can.page.width()) + }) + }, }) diff --git a/panel/action.js b/panel/action.js index 48479221..630c7482 100644 --- a/panel/action.js +++ b/panel/action.js @@ -100,6 +100,7 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { mail: function(can) { can.user.opens("/chat/pod/20230511-golang-story/cmd/web.chat.mail.client") }, repos: function(can) { can.user.opens("https://repos.shylinux.com/explore/repos") }, + cloud: function(can) { can.user.opens("https://cloud.shylinux.com/") }, portal: function(can) { can.user.opens(can.misc.MergePodCmd(can, {cmd: web.WIKI_PORTAL})) }, desktop: function(can) { can.user.opens(can.misc.MergePodCmd(can, {cmd: web.CHAT_MACOS_DESKTOP})) }, layout: function(can, button, skip) { can.page.ClassList.del(can, can._target, can._layout||can.onlayout._storage(can)), can._header_tabs && can.onmotion.hidden(can, can._header_tabs) @@ -108,8 +109,8 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can.isCmdMode() || can.core.List(can._plugins, function(sub) { sub._delay_refresh = false, can.page.ClassList.set(can, sub._target, html.OUTPUT, [TABVIEW, HORIZON, VERTICAL].indexOf(button) > -1) }) var cb = can.onlayout[button]; can.base.isFunc(cb) && cb(can) || can.onlayout._plugin(can, button) }, - _menus: [[html.LAYOUT, ice.AUTO, TABS, TABVIEW, HORIZON, VERTICAL, GRID, FREE, FLOW, PAGE], "desktop", "portal", "repos", "mail"], - _trans: kit.Dict("mail", "邮箱", "repos", "资源", "portal", "官网", "desktop", "桌面", html.LAYOUT, "布局", ice.AUTO, "默认布局", TABS, "标签布局", TABVIEW, "标签分屏", HORIZON, "左右分屏", VERTICAL, "上下分屏", GRID, "网格布局", FREE, "自由布局", FLOW, "流动布局", PAGE, "网页布局"), + _menus: [[html.LAYOUT, ice.AUTO, TABS, TABVIEW, HORIZON, VERTICAL, GRID, FREE, FLOW, PAGE], "desktop", "mail", "cloud", "repos", "portal"], + _trans: kit.Dict("mail", "邮箱", "cloud", "网盘", "repos", "资源", "portal", "官网", "desktop", "桌面", html.LAYOUT, "布局", ice.AUTO, "默认布局", TABS, "标签布局", TABVIEW, "标签分屏", HORIZON, "左右分屏", VERTICAL, "上下分屏", GRID, "网格布局", FREE, "自由布局", FLOW, "流动布局", PAGE, "网页布局"), }) Volcanos(chat.ONLAYOUT, { tabs: function(can) { can.getActionSize(function(height, width) { can.ConfHeight(height-can.Conf(html.MARGIN_Y)+html.ACTION_MARGIN), can.ConfWidth(width-can.Conf(html.MARGIN_X)) }) diff --git a/panel/header.js b/panel/header.js index 4f65cbaf..8823f452 100644 --- a/panel/header.js +++ b/panel/header.js @@ -59,6 +59,7 @@ Volcanos(chat.ONACTION, {_init: function(can) { if (location.pathname == "/login" && p) { return location.replace(can.base.MergeURL(p, ice.MSG_SESSID, can.misc.CookieSessid(can))) } can.user.info.usernick = can.Conf(aaa.USERNICK), can.user.info.userrole = msg.Option(ice.MSG_USERROLE), can.user.info.avatar = msg.Option(aaa.AVATAR), can.user.info.background = msg.Option(aaa.BACKGROUND) can.user.info.repos = msg.Option("spide.hub") + can.user.info.email = msg.Option("email") msg.Option(nfs.SCRIPT) && can.require(can.base.Obj(msg.Option(nfs.SCRIPT)), function(can) { can.onaction.source(can, msg) }) lang(msg, function() { can.onmotion.clear(can), can.onimport._init(can, can.request(), can._output), can.onengine.signal(can, chat.ONLOGIN) }) } @@ -105,12 +106,17 @@ Volcanos(chat.ONACTION, {_init: function(can) { }) }, clear: function(event, can) { can.onimport.background(event, can, ""), can.onimport.avatar(event, can, "") }, logout: function(event, can) { can.user.logout(can) }, + email: function(event, can) { + can.user.input(can.request(event, {to: can.user.info.email, subject: can.user.title()}), can, ["to", "subject","content"], function(args) { + can.runAction(event, aaa.EMAIL, args, function() { can.user.toastSuccess(can) }) + }) + }, _params: [log.DEBUG, chat.TITLE], _menus: ["shareuser", [chat.THEME, ice.AUTO], [aaa.LANGUAGE, ice.AUTO], - [nfs.SAVE, web.TOIMAGE, code.WEBPACK], + [nfs.SAVE, aaa.EMAIL, web.TOIMAGE, code.WEBPACK], [aaa.USER, "setnick", aaa.PASSWORD, cli.CLEAR, aaa.LOGOUT], ], _trans: kit.Dict( diff --git a/proto.js b/proto.js index 617f72f8..3b1e2bf4 100644 --- a/proto.js +++ b/proto.js @@ -4,13 +4,20 @@ function shy(help, meta, list, cb) { var arg = arguments, i = 0; function next(t } else if (i < arg.length && (!type || type == typeof arg[i])) { return arg[i++] } } return cb = typeof arg[arg.length-1] == code.FUNCTION? arg[arg.length-1]: function() {}, cb.help = next(code.STRING)||"", cb.meta = next(code.OBJECT)||{}, cb.list = next(code.ARRAY)||[], cb }; var _can_name = "", _can_path = "" -var Volcanos = shy({iceberg: "/chat/", volcano: chat.FRAME_JS, cache: {}, pack: {}, args: {}}, function(name, can, libs, cb) { +var Volcanos = shy({ + iceberg: "", volcano: "", frame: chat.FRAME_JS, + cache: {}, pack: {}, args: {}}, function(name, can, libs, cb) { var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == code.OBJECT) { if (name.length > 0) { return Volcanos({panels: [{name: chat.HEADER, style: html.HIDE, state: [mdb.TIME, aaa.USERNICK]}, {name: chat.ACTION, style: html.MAIN, tool: name}, {name: chat.FOOTER, style: html.HIDE}]}) } var Config = name; name = Config.name||ice.CAN, _can_name = "" - meta.iceberg = Config.iceberg||meta.iceberg, meta.libs = (Config.libs||chat.libs).concat(Config.list), panels = Config.panels||chat.panel_list, delete(Config.panels) - libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/volcanos/panel/"+p.name+nfs._JS, "/volcanos/panel/"+p.name+nfs._CSS])) }), libs = libs.concat(Config.plugin||chat.plugin_list) - cb = can||function(can) { can.onengine._init(can, can.Conf(Config), panels, Config._init||meta._init, can._target) } + meta.iceberg = Config.iceberg||meta.iceberg, meta.volcano = Config.volcano||meta.volcano + meta.libs = (Config.libs||chat.libs).concat(Config.list), panels = Config.panels||chat.panel_list, delete(Config.panels) + libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/volcanos/panel/"+p.name+nfs._JS, "/volcanos/panel/"+p.name+nfs._CSS])) }), libs = libs.concat(Config.plugins||chat.plugin_list) + cb = can||function(can) { + can.require([can.frame], function() { + can.onengine._init(can, can.Conf(Config), panels, Config._init||meta._init, can._target) + }, function(can, key, sub) { can[key] = sub }) + } can = Config, can._follow = name, can._target = Config.target||meta.target, can._height = Config.height||meta._height, can._width = Config.width||meta._width } can = kit.proto(can||{}, kit.proto({_name: name, _path: _can_name, _load: function(name, cbs) { var cache = meta.cache[name]||[] @@ -30,7 +37,10 @@ var Volcanos = shy({iceberg: "/chat/", volcano: chat.FRAME_JS, cache: {}, pack: if (libs[0][0] != nfs.PS && libs[0].indexOf(web.HTTP) != 0) { libs[0] = can._path.slice(0, can._path.lastIndexOf(ice.PS)+1)+libs[0] } var name = (libs[0].indexOf(web.HTTP) == 0 || libs[0].indexOf("?pod=") > -1? libs[0]: libs[0].split(ice.QS)[0]).toLowerCase() function next() { can._load(name, cbs), can.require(libs.slice(1), cb, cbs) } - meta.cache[name]||name==""? next(): (meta._load(name, next)) + if (meta.cache[name] || name == "") { return next() } + if (name.indexOf("/volcanos/") == 0 && meta.volcano) { name = meta.volcano+name } + if (name.indexOf("/require/") == 0 && meta.iceberg) { name = meta.iceberg+name } + meta._load(name, next) }, request: function(event) { event = event||{}, event = event._event||event var msg = event._msg||can.misc.Message(event, can); event._msg = msg @@ -94,7 +104,7 @@ var Volcanos = shy({iceberg: "/chat/", volcano: chat.FRAME_JS, cache: {}, pack: } return can.base.isUndefined(res) && key.indexOf(ctx.FEATURE+nfs.PT) == -1? can.Conf(can.core.Keys(ctx.FEATURE, key)): res }, _conf: {}, }, meta)); if (_can_name) { meta.cache[_can_name] = meta.cache[_can_name]||[], meta.cache[_can_name].push(can) } else { list.push(can) } - setTimeout(function() { can.require(can._follow? libs.concat(meta.libs, meta.volcano): libs, cb) }, 1) + setTimeout(function() { can.require(can._follow? libs.concat(meta.libs, meta.frame): libs, cb) }, 1) return can }) try { if (typeof(window) == code.OBJECT) { var meta = Volcanos.meta