diff --git a/frame.js b/frame.js index 357bb15b..137d3fad 100644 --- a/frame.js +++ b/frame.js @@ -79,7 +79,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { }, }) Volcanos(chat.ONDAEMON, {_init: function(can, name) { if (can.user.isLocalFile) { return } - can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, cli.DAEMON)||name||"", text: location.pathname, module: "shylinux.com/x/volcanos", version: can.base.trimPrefix(window._version, "?_v=")}, function(event, msg, cmd, arg, cb) { + can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, cli.DAEMON)||name||""}, function(event, msg, cmd, arg, cb) { var sub = can.ondaemon._list[msg.Option(ice.MSG_TARGET)]||can; can.base.isFunc(sub.ondaemon[cmd])? can.core.CallFunc(sub.ondaemon[cmd], {can: can, msg: msg, sub: sub, cmd: cmd, arg: arg, cb: cb}): can.onengine._search({}, can, msg, can, [chat._SEARCH, cmd].concat(arg), cb) @@ -267,7 +267,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }, field: function(can, type, item, target) { type = type||html.STORY, item = item||{} - var name = can.core.Split(item.nick||item.name||"").pop()||""; can.base.isIn(name, tcp.SERVER, tcp.CLIENT, web.STUDIO) && (name = (item.index||"").split(".").slice(-2).join(".")), name = can.core.Keys(item.space, name) + var name = can.core.Split(item.nick||item.name||"").pop()||""; can.base.isIn(name, tcp.SERVER, tcp.CLIENT, web.STUDIO, mdb.SEARCH) && (name = (item.index||"").split(".").slice(-2).join(".")), name = can.core.Keys(item.space, name) var title = item.help && item.help != name && !can.user.isEnglish(can)? name+"("+can.core.Split(item.help)[0]+")": name target = can.base.isFunc(target)? target(): target return can.page.Append(can, target||can._output, [{view: [type, html.FIELDSET], list: [{type: html.LEGEND, list: [item.icon && {icon: item.icon}, {text: title}]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS]}]) @@ -509,6 +509,7 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||can._ro can.user.isMobile && can.user.isLandscape() || can.page.style(can, document.body, kit.Dict(html.OVERFLOW, html.HIDDEN)) }, expand: function(can, target, width) { var n = parseInt(target.offsetWidth/(width+20)); width = target.offsetWidth/n - 20 + if (width+20 >= target.offsetWidth) { n = 1, width = target.offsetWidth - 20 } can.page.SelectChild(can, target, html.DIV_ITEM, function(target) { can.page.styleWidth(can, target, width) }) }, background: function(can, url, target) { can.page.style(can, target||can._root._target, "background-image", url == "" || url == "void"? "": 'url("'+url+'")') }, diff --git a/index.css b/index.css index 04782643..cc36fc96 100644 --- a/index.css +++ b/index.css @@ -363,6 +363,46 @@ div.carte div.item { background-color:var(--carte-bg-color); } div.carte div.item:hover { background-color:var(--hover-bg-color); } div.carte div.item.danger:hover { background-color:var(--danger-bg-color); color:var(--danger-fg-color); } div.carte div.item.notice:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } +/* mobile */ +body.mobile table.content { width:100%; } +body.mobile form.option>div.item { margin:0; } +body.mobile form.option>div.item.button>input { display:none; } +body.mobile fieldset>div.status { max-height:32px; overflow:hidden; } +body.mobile fieldset:not(.panel):not(.input):not(.play)>div.action>div:not(.icons) { display:none; } +body.mobile fieldset.plugin:not(.float):not(.full):not(.cmd)>form.option>div.icon:not(.delete) { display:block; } +body.mobile fieldset.plugin:not(.float):not(.full):not(.cmd)>form.option>div.button>span.icon { display:block; } +body.mobile fieldset.plugin:not(.float):not(.full):not(.cmd)>div.action>div.button>span.icon { display:inline-block; } +body.mobile fieldset.plugin:not(.float):not(.full):not(.cmd)>div.action>div.button>input { display:none; } +body.mobile fieldset.plugin:not(.float):not(.full):not(.cmd) { margin:10px 0; } +body.mobile { --header-height:48px; } +body.mobile fieldset.Header { padding:0; width:100%; position:fixed; top:0; } +body.mobile fieldset.Header>div.output { font-size:1.4rem; line-height:var(--header-height); height:var(--header-height); } +body.mobile fieldset.Header div.output div.item.text.title.search { display:none; } +body.mobile fieldset.Header div.output div.item:not(.avatar) { padding:0px 10px; } +body.mobile fieldset.Search>div.action>div.item.filter>input { width:100%; } +body.mobile fieldset.Search>div.action>div.item.filter>span { position:absolute; } +body.mobile fieldset.Search>div.action>div.item.filter { width:100%; position:relative; } +body.mobile fieldset.Search>div.output>div.content { height:400px; } +body.mobile fieldset.River { position:fixed; top:var(--header-height); z-index:100; } +body.mobile fieldset.River>div.output { font-size:1.4rem; min-width:240px; } +body.mobile fieldset.Action { margin-top:var(--header-height); } +body.mobile fieldset.Action.cmd { margin-top:0; } +body.mobile fieldset.Action>div.output { overflow-x:hidden; } +body.mobile fieldset.Action>div.output>fieldset.plugin:not(.float):not(.full):not(.cmd)>legend { margin:10px; } +body.mobile fieldset.Action>div.output>fieldset.plugin:not(.output):not(.float):not(.full):not(.cmd) { padding:0px; } +body.mobile fieldset.Footer { display:none; } +body.mobile.landscape fieldset.Header { position:unset; } +body.mobile.landscape fieldset.Action { margin-top:0; } +body.mobile fieldset.word.float>div.output>div.project { top:32px; } +body.mobile fieldset.word>div.output>fieldset.story>form.option>div.text { display:none; } +body.mobile fieldset.word>div.output { overflow-x:hidden; } +body.mobile fieldset.web.code.inner.cmd>div.output { overflow:hidden; } +body.mobile fieldset.web.wiki.portal>div.output>div.layout { display:block; } +body.mobile fieldset.web.wiki.portal>div.output>div.layout>div.nav { padding:10px; height:unset; } +body.mobile fieldset.web.wiki.portal>div.output>div.layout>div.main { padding:10px; height:unset; min-width:unset; } +body.mobile fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] div.item { padding:10px; } +body.mobile fieldset.word>div.output div.story.flex { display:block; } +body.mobile fieldset.word>div.output div.story.flex>* { padding:unset; } /* print */ body.print { -webkit-filter: grayscale(100%); } body.print { background-color:white; color:black; } diff --git a/lib/misc.js b/lib/misc.js index 808dca60..20708259 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -102,10 +102,11 @@ Volcanos("misc", { } try { xhr.send(data) } catch(e) { can.misc.Warn(e), cbs && cbs(e) } }, WSS: function(can, args, cb, onopen, onclose, onerror, _msg) { if (can.user.isIE) { return } - var msg = can.request(); can.page.exportValue(can, msg) + var msg = can.request(); can.page.exportValue(can, msg), args[ice.MSG_THEME] = can.getHeaderTheme() can.core.List(msg.Option(), function(value) { args[value] = msg.Option(value) }) var url = location.protocol.replace(ice.HTTP, "ws")+"//"+location.host+"/space/" if (url.indexOf(html.CHROME) == 0) { url = "ws://localhost:9020/space/" } + args.text = location.pathname+location.search, args.module = "shylinux.com/x/volcanos", args.version = can.base.trimPrefix(window._version, "?_v=") try { var socket = new WebSocket(can.base.MergeURL(url, args)); _msg = _msg || can.request()._caller() } catch {} can._socket = socket, socket.onclose = function() { can.misc.Log(html.WSS, cli.CLOSE, args) can.base.isFunc(onclose)? onclose(socket): can.core.Timer(can.base.random(3000, 100), function() { @@ -127,6 +128,7 @@ Volcanos("misc", { can.core.CallFunc(cb, {event: event, msg: msg, cmd: msg.detail[0], arg: msg.detail.slice(1), cb: function() { msg.Reply() }}) } catch (e) { can.misc.Warn(e), msg.Reply() } }) } + return socket }, Resource(can, path, pod) { if (path.indexOf(nfs.PS) == 0 || path.indexOf(ice.HTTP) == 0) { return path } diff --git a/lib/user.js b/lib/user.js index 6f51f42e..d51469b7 100644 --- a/lib/user.js +++ b/lib/user.js @@ -246,13 +246,13 @@ Volcanos("user", { }) can.misc.CookieSessid(can, "") var ui = can.onappend.tabview(can, { - "扫码授权": function(target) { can.misc.WSS(can, {type: aaa.LOGIN, name: "", "sess.theme": can.getHeaderTheme()}, function(cmd, arg) { + "扫码授权": function(target) { var socket = can.misc.WSS(can, {type: aaa.LOGIN}, function(cmd, arg) { if (cmd == cli.PWD) { var _cmd = " space login "+arg[0]; return can.page.Modify(can, target, arg[2]), can.page.Append(can, target, [ {text: "
或命令授权: "+_cmd, title: "点击复制,并后台执行此命令,即可登录", style: {cursor: "copy"}, onclick: function() { can.user.copy(event, can, _cmd) }}, ].concat(_sso)), can.onmotion.delay(can, function() { layout() }, 10) } - if (cmd == ice.MSG_SESSID) { + if (cmd == ice.MSG_SESSID) { can.onmotion.delay(can, function() { socket.close() }) if (!can.misc.CookieSessid(can, arg[0])) { can.user.info.sessid = arg[0] } - return can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb() + return can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb(), cb = null } }) }, "密码登录": function(target) { diff --git a/panel/header.js b/panel/header.js index fac4e975..cbc14e98 100644 --- a/panel/header.js +++ b/panel/header.js @@ -15,8 +15,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { }) }, _avatar: function(can, msg) { can.user.isExtension || can.user.isLocalFile || can.page.Modify(can, "div.state.avatar>img", {src: can.onexport.avatar(can)}) }, _background: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } - // can.onlayout.background(can, can.onexport.background(can)) - // window.parent == window? can.onlayout.background(can, can.onexport.background(can)): can.page.style(can, document.body, html.BACKGROUND_COLOR, "transparent") + window.parent == window? can.onlayout.background(can, can.onexport.background(can)): can.page.style(can, document.body, html.BACKGROUND_COLOR, "transparent") }, _search: function(can, msg, target) { can._search = can.onappend.input(can, {type: html.TEXT, icon: icon.SEARCH, name: mdb.SEARCH, value: can.misc.Search(can, "_search"), onkeydown: function(event) { can.onkeymap.input(event, can) @@ -58,14 +57,13 @@ Volcanos(chat.ONACTION, {_init: function(can) { function show(msg) { var p = can.misc.Search(can, "redirect_uri") 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") + can.user.info.email = msg.Option(aaa.EMAIL), can.user.info.repos = msg.Option(nfs.REPOS) 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) }) } can.run(can.request({}, {_method: web.GET}), [], function(msg) { lang(msg) can.require(can.core.List(msg["theme.list"], function(item) { return "src/template/web.chat.header/theme/"+item })) - can.onaction._menus[1] = [chat.THEME, ice.AUTO].concat(can.core.List(msg["theme.list"], function(item) { if (item == "mobile.css") { return } return can.base.trimSuffix(item, ".css") })) + can.onaction._menus[1] = [chat.THEME, ice.AUTO].concat(can.core.List(msg["theme.list"], function(item) { return can.base.trimSuffix(item, ".css") })) can.onaction._menus[2] = [aaa.LANGUAGE, ice.AUTO].concat(can.core.List(msg["language.list"], function(item) { return can.base.trimSuffix(item, ".js") })) if (can.base.beginWith(location.pathname, "/wiki/portal/", "/chat/cmd/web.wiki.portal/", "/chat/cmd/web.chat.oauth.client", "/chat/pod/20230511-golang-story/cmd/web.code.gitea.client")) { return show(msg) } if (location.pathname == "/" && can.base.beginWith(msg.Option(ice.MAIN)||"", "/wiki/portal/", "/chat/cmd/web.wiki.portal/")) { return show(msg) } @@ -98,7 +96,7 @@ Volcanos(chat.ONACTION, {_init: function(can) { shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN, mdb.NAME, can.user.title(), mdb.TEXT, location.href]) }, toimage: function(event, can) { can.onmotion.clearCarte(can), can.user.toimage(can, can.user.title(), can._target.parentNode) }, webpack: function(event, can) { can.onengine.signal(can, chat.ONWEBPACK, can.request(event)) }, - setnick: function(event, can) { can.user.input(event, can, [{name: aaa.USERNICK, value: can.Conf(aaa.USERNICK)}], function(list) { can.runAction(event, aaa.USERNICK, [list[0]], function(msg) { + usernick: function(event, can) { can.user.input(event, can, [{name: aaa.USERNICK, value: can.Conf(aaa.USERNICK)}], function(list) { can.runAction(event, aaa.USERNICK, [list[0]], function(msg) { can.page.Select(can, can._output, can.core.Keys(html.DIV, aaa.USERNICK), function(item) { can.page.Modify(can, item, can.Conf(aaa.USERNICK, list[0])) }), can.user.toastSuccess(can) }) }) }, password: function(event, can) { var ui = can.user.input(event, can, [{name: html.PASSWORD, type: html.PASSWORD, action: ice.AUTO}, {name: html.PASSWORD, type: html.PASSWORD, action: ice.AUTO}], function(list) { @@ -111,20 +109,18 @@ Volcanos(chat.ONACTION, {_init: function(can) { can.runAction(event, aaa.EMAIL, args, function() { can.user.toastSuccess(can) }) }) }, - fullscreen: function(event, can) { document.body.requestFullscreen() }, _params: [log.DEBUG, chat.TITLE], _menus: ["shareuser", [chat.THEME, ice.AUTO], [aaa.LANGUAGE, ice.AUTO], [nfs.SAVE, aaa.EMAIL, web.TOIMAGE, code.WEBPACK], - [aaa.USER, "setnick", aaa.PASSWORD, cli.CLEAR, aaa.LOGOUT], - "fullscreen", + [aaa.USER, aaa.USERNICK, aaa.PASSWORD, cli.CLEAR, aaa.LOGOUT], ], _trans: kit.Dict( - "shareuser", "共享用户", chat.THEME, "界面主题", aaa.LANGUAGE, "语言地区", nfs.SAVE, "保存网页", web.TOIMAGE, "生成图片", code.WEBPACK, "打包页面", - aaa.USER, "用户信息", "setnick", "设置昵称", aaa.PASSWORD, "修改密码", web.CLEAR, "清除背景", aaa.LOGOUT, "退出登录", - aaa.EMAIL, "发送邮件", + "shareuser", "共享用户", chat.THEME, "界面主题", aaa.LANGUAGE, "语言地区", + nfs.SAVE, "保存网页", aaa.EMAIL, "发送邮件", web.TOIMAGE, "生成图片", code.WEBPACK, "打包页面", + aaa.USER, "用户信息", aaa.USERNICK, "设置昵称", aaa.PASSWORD, "修改密码", web.CLEAR, "清除背景", aaa.LOGOUT, "退出登录", ), })