diff --git a/index.css b/index.css index bb754e07..40a7560e 100644 --- a/index.css +++ b/index.css @@ -274,7 +274,7 @@ div.item.text { position:relative; } div.item.text>input { width:var(--input-width); height:var(--action-height); } div.item.text.id>input { width:var(--button-width); } div.item.text.url>input { width:var(--river-width); } -fieldset.Action:not(.horizon):not(.grid) div.item.text.path>input { width:var(--project-width); } +fieldset.Action:not(.horizon):not(.grid)>fieldset.plugin>form.option>div.item.text.path>input { width:var(--project-width); } fieldset.story>form.option>div.item.text.path>input { width:var(--input-width); } div.item.text.line>input { width:var(--button-width) !important; } div.item.text.limit>input { width:var(--button-width); } @@ -588,6 +588,7 @@ fieldset.vimer>div.output>div.project>div.zone.space div.item.stop { color:var(- fieldset.xterm>div.action>div.tabs:only-child { display:none; } fieldset.xterm.story>form.option>div.item.hash input { width:320px; } fieldset.cmd>div.output>fieldset.xterm.story>form.option>div.item.hash input { width:var(--plug-width); } +fieldset.cmd>div.output>fieldset.iframe.story>form.option>div.item.hash input { width:var(--plug-width); } fieldset.xterm>div.layout { clear:both; } fieldset.xterm div.layout div.output { border-left:var(--box-border); border-top:var(--box-border); } fieldset.xterm div.layout div.output.select { border:var(--box-border)} diff --git a/lib/user.js b/lib/user.js index 7e2bfb19..4e9f5a98 100644 --- a/lib/user.js +++ b/lib/user.js @@ -271,12 +271,13 @@ Volcanos("user", { }, ui.output) } } else if (value.type == cli.QRCODE) { _list.push(value.name), list[value.name] = function(target) { can.page.Modify(can, target, arg[2]) } } }) var ui = can.onappend.tabview(can, list, _list, can.page.Append(can, document.body, [{view: "input login float flex"}])._target) - can.page.style(can, ui._target, {left: (window.innerWidth-ui._target.offsetWidth)/2, top: can.user.isMobile? can.user.isLandscape()? 0 :48 :window.innerHeight/8}) var _cmd = "space login "+arg[0]; ui.display = can.page.Append(can, ui._target, [html.DISPLAY])._target, can.onappend.style(can, html.FLEX, ui.display) can.page.Appends(can, ui.display, [{text: ["或命令行授权: ", html.LABEL]}, {text: ["$ "+_cmd, "", html.ITEM], title: "点击复制,并后台执行此命令,即可登录", style: {cursor: "copy"}, onclick: function() { can.user.copy(event, can, _cmd) }}]) can.page.Append(can, ui.display, [{text: ["或第三方授权: ", html.LABEL]}, {view: [["sso", html.FLEX]], list: _msg.Table(function(value) { return value.type == "oauth" && {view: [[html.ITEM, html.FLEX]], title: "点击跳转,授权登录", list: [{img: can.misc.Resource(can, value.icons)}, {text: value.name}], onclick: function() { can.user.jumps(value.link) }} - }) }]), cb && cb(); return true + }) }]) + can.page.style(can, ui._target, {left: (window.innerWidth-ui._target.offsetWidth)/2, top: can.base.Min((window.innerHeight-ui._target.offsetHeight-html.HEADER_HEIGHT-html.ACTION_HEIGHT)/2, 0)+html.HEADER_HEIGHT}) + cb && cb(); return true } else if (cmd == ice.MSG_SESSID) { if (!can.misc.CookieSessid(can, arg[0])) { can.user.info.sessid = arg[0] } check(), cb && cb(); return true } diff --git a/panel/action.css b/panel/action.css index 1594a1df..bb670927 100644 --- a/panel/action.css +++ b/panel/action.css @@ -6,7 +6,7 @@ fieldset.Action.tabs>div.action { display:block; } fieldset.Action.tabs>div.output>fieldset>legend { display:none; } fieldset.Action.tabs>div.output>fieldset.plugin:not(.select) { display:none; } fieldset.Header div.Action { display:contents; } -fieldset.Action.tabview:not(.cmd)>div.output>fieldset.plugin>legend { display:none; } +fieldset.Action.tabview:not(.cmd)>div.output>fieldset.plugin>legend { float:left !important; background-color:transparent; } fieldset.Action.tabview>div.output>fieldset.plugin:not(.select) { display:none; } fieldset.Action.vertical>div.output>fieldset.plugin { float:left; } fieldset.Action.horizon>div.output>fieldset.plugin { float:left; } diff --git a/panel/action.js b/panel/action.js index 72cfcad4..b6310790 100644 --- a/panel/action.js +++ b/panel/action.js @@ -4,7 +4,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var river = can.Conf(chat.R item.width = can.ConfWidth()-can.Conf(html.MARGIN_X); if (item.style == html.OUTPUT) { item.width = can.ConfWidth()-2*html.PLUGIN_MARGIN-2*html.PLUGIN_PADDING } if (msg.Length() == 1) { item.height = can.ConfHeight()-can.Conf(html.MARGIN_Y) } list.length == 0 && item.index == "web.dream" && (list = [river, storm, item.index]) can.onappend.plugin(can, item, function(sub, meta, skip) { - sub.onexport.output = function() { can.page.style(can, sub._output, html.MAX_HEIGHT, "") } + sub.onexport.output = function() { can.onexport.isauto(can) && can.page.style(can, sub._output, html.HEIGHT, "", html.MAX_HEIGHT, "") } sub.onaction._close = function() { can.onengine.signal(can, chat.ONACTION_REMOVE, can.request({river: river, storm: storm}, item)), can.page.Remove(can, sub._target) } sub.run = function(event, cmds, cb) { return can.run(can.request(event, {pod: meta.space||meta.pod}), (can.base.beginWith(meta.index, "can.")? []: [river, storm, meta.id||meta.index]).concat(cmds), cb) } can.user.isChrome && (can.ondaemon._list[sub._daemon = can.core.Keys(river, storm, index)] = sub) @@ -12,14 +12,16 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var river = can.Conf(chat.R }) }, function() { if (can.isCmdMode()) { return } can.user.mod.isCmd = false, can.page.ClassList.del(can, document.body, ice.CMD) can.onaction.layout(can, list[3]); if (can.user.isMobile) { return } - can.onexport.layout(can) && list[0] == river && list[1] == storm && can.core.List(can._plugins, function(sub) { sub.Conf(ctx.INDEX) == list[2] && (sub._tabs.click()) }) + can.onexport.layout(can) && list[0] == river && list[1] == storm && can.core.List(can._plugins, function(sub) { + can.base.isIn(list[2], sub.Conf(ctx.INDEX), sub.Conf("_command")||sub.Conf(ctx.INDEX)) && sub._tabs.click() + }) }) }, _tabs: function(can, sub, meta) { var tabs = [{view: [html.ITEM, "", can.user.trans(can, meta.name, meta.help)], title: meta.help, onclick: function(event) { can._current = sub can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target), can.onmotion.select(can, can._action, html.DIV_ITEM, sub._tabs), can.onmotion.select(can, can._header_tabs, html.DIV_ITEM, sub._header_tabs) var layout = can.onexport.layout(can); layout == FREE || (can._output.scrollTop = sub._target.offsetTop-10) - can.misc.SearchHash(can, can.Conf(chat.RIVER), can.Conf(chat.STORM), meta.index, layout) + can.misc.SearchHash(can, can.Conf(chat.RIVER), can.Conf(chat.STORM), sub.Conf("_command")||meta.index, layout) sub.onimport.size(sub, can.ConfHeight()-can.Conf(html.MARGIN_Y), can.ConfWidth()-can.Conf(html.MARGIN_X), can.onexport.isauto(can)) }, oncontextmenu: sub._legend.onclick}]; sub._header_tabs = can.page.Append(can, can._header_tabs, tabs)._target, sub._tabs = can.page.Append(can, can._action, tabs)._target }, @@ -63,13 +65,7 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { if (can.onmotion.cache(can, function(save, load) { save({plugins: can._plugins, current: can._current}), can._plugins = [] return load(can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm)), function(bak) { can._plugins = bak.plugins, can._current = bak.current }) }, can._output, can._action, can._header_tabs)) { - if (msg.Option(web.REFRESH) != ice.TRUE) { - can._current._tabs.click() - can.onmotion.delay(can, function() { - can.onaction.layout(can) - }) - return - } + if (msg.Option(web.REFRESH) != ice.TRUE) { return can._current && can._current._tabs.click(), can.onaction.layout(can) } } can.run(can.request({}, {_method: http.GET}), [river, storm], function(msg) { if (msg.Length() == 0) { return can.user.isLocalFile? can.user.toastFailure(can, "miss data"): can.onengine.signal(can, chat.ONACTION_NOTOOL, can.request({}, {river: river, storm: storm})) } diff --git a/panel/header.css b/panel/header.css index 62aa07ad..da5de6e5 100644 --- a/panel/header.css +++ b/panel/header.css @@ -23,6 +23,7 @@ fieldset.Header>div.output div.search>input { padding-left:25px; } fieldset.Header>div.output div.search>span.icon { padding:var(--input-padding) var(--button-padding); } fieldset.Header>div.output div.Action>div.tabs { padding-left:40px; height:100%; overflow:auto; } fieldset.Header>div.output div.Action>div.tabs div.item { font-style:italic; } +fieldset.Header>div.output div.Action>div.tabs div.item:only-child { display:none; } body:not(.mobile) fieldset.Header>div.output div.title:first-child { width:var(--river-width); } body:not(.mobile) fieldset.Header>div.output div.title img { margin-right:var(--button-margin); } body:not(.mobile) fieldset.Header.tabview>div.output div.title:first-child { padding-left:var(--button-padding); width:unset; } @@ -30,12 +31,15 @@ body:not(.width6) fieldset.Header.tabview>div.output>div.Action>div.item.dream { body:not(.width6) fieldset.Header.tabview>div.output>div.Action>div.item.desktop { display:none; } body:not(.width6) fieldset.Header.tabview>div.output>div.Action>div.item.portal { display:none; } body:not(.width6) fieldset.Header.tabview>div.output>div.item.language { display:none; } -body:not(.width6) fieldset.Header.tabview>div.output div.item:not(.usernick):not(.avatar) { padding:13.5px 8px; } body:not(.width6)>fieldset.Header>div.output div.item.menu.search { padding-left:0 !important; margin-left:0; } +body.width2>fieldset.Header.tabview>div.output div.item:not(.usernick):not(.avatar) { padding:13.5px 8px; } +body.width3>fieldset.Header.tabview>div.output div.item:not(.usernick):not(.avatar) { padding:13.5px 8px; } body.width3>fieldset.Header>div.output>div.item.time { display:none; } +body.width3>fieldset.Header>div.output>div.item.avatar { margin-right:var(--plugin-margin); } +body.width3>fieldset.Header>div.output div.Action>div.tabs { padding-left:0; } body.width2>fieldset.Header>div.output div.item.title:first-child img { margin-right:0; } body.width2>fieldset.Header>div.output div.item.title:first-child span { display:none; } -body.width2>fieldset.Header>div.output>div.item.avatar { margin-right:var(--button-padding); } +body.width2>fieldset.Header>div.output>div.item.avatar { margin-right:var(--plugin-margin); } body.width2>fieldset.Header>div.output>div.item.theme { display:none; } body.width2>fieldset.Header>div.output>div.item.time { display:none; } body.width2>fieldset.Footer>div.output div.item.cmd { display:none; } diff --git a/panel/river.js b/panel/river.js index 5a1333f2..48c376e5 100644 --- a/panel/river.js +++ b/panel/river.js @@ -4,9 +4,11 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onimport._main(can, msg return can.onimport._river(can, item, function(target) { (index == 0 || item.hash == can._main_river) && (select = target) }) })), select && select.click(), can.onimport._menu(can, msg) }, - _main: function(can, msg) { can.ui = {river_list: {}, storm_list: {}, sublist: {}}; var ls = location.hash.slice(1).split(nfs.DF) - can._main_river = can.misc.SearchOrConf(can, chat.RIVER)||ls[0]||msg.Option(ice.MSG_RIVER)||"project" - can._main_storm = can.misc.SearchOrConf(can, chat.STORM)||ls[1]||msg.Option(ice.MSG_STORM)||"studio" + _main: function(can, msg) { can.ui = {river_list: {}, storm_list: {}, sublist: {}} + var ls = can.misc.SearchHash(can); msg.Table(function(item) { item.main && (can._main_river = item.hash) }) + can._main_river = ls[0]||can.misc.SearchOrConf(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||can._main_river||"project" + can._main_storm = ls[1]||can.misc.SearchOrConf(can, chat.STORM)||msg.Option(ice.MSG_STORM) + // ||can._main_storm||"studio" }, _river: function(can, meta, cb) { return {view: html.ITEM, title: meta.name, list: [{icon: meta.icon}, {text: meta.name}, {icon: icon.CHEVRON_DOWN}], _init: function(target) { can.ui.river_list[meta.hash] = target, cb(target) }, onclick: function(event) { can.onaction.storm(event, can, meta.hash) }, oncontextmenu: function(event) { can.onaction.carte(event, can, can.onaction._menu, meta.hash) }, @@ -62,14 +64,16 @@ Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH], _init: func can.onmotion.hidden(can, can._root.Footer._target, list.length > 1) var menu = can.setFooterMenu(list, function(event, button, list) { can.onaction.action(event, can, river, button) }) can.page.SelectChild(can, menu, html.DIV_ITEM, function(target, index) { can.page.ClassList.set(can, target, html.SELECT, list[index].hash == can.Conf("storm")) }) - }) + }, 300) } var list = can.ui.sublist[river]; if (list) { return can.onmotion.toggle(can, list), _menu(list) } can.run({}, [river, chat.STORM], function(msg) { var next = can.ui.river_list[river].nextSibling if (msg.Length() == 0) { return can.user.isLocalFile? can.user.toastFailure(can, "miss data"): can.onengine.signal(can, chat.ONACTION_NOSTORM, can.request({}, {river: river})) } can.db.storm_list[river] = msg.Table() + var _main_storm; msg.Table(function(item) { item.main && (_main_storm = item.hash) }), _main_storm = can._main_storm || _main_storm || "studio" var select = 0; list = can.page.Append(can, can._output, [{view: html.LIST, list: msg.Table(function(item, index) { - return river == can._main_river && item.hash == can._main_storm && (select = index), can.onimport._storm(can, item, river) + river == can._main_river && (item.hash == _main_storm) && (select = index) + return can.onimport._storm(can, item, river) }) }])._target, next && can._output.insertBefore(list, next), can.ui.sublist[river] = list, _menu(list), list.children.length > 0 && list.children[select].click() }) }, @@ -136,13 +140,13 @@ Volcanos(chat.ONENGINE, {_engine: function(event, can, msg, panel, cmds, cb) { var list = can.river cmds.length == 0 && can.core.ItemOrder(list, mdb.ORDER, function(key, value) { if (can.user.info.userrole == aaa.ROOT || can.base.isIn(value.type||"", "", aaa.VOID, can.user.info.userrole)) { - can.core.Item(value.storm).length > 0 && msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name, icon: value.icon||""}) + can.core.Item(value.storm).length > 0 && msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name, icon: value.icon||"", main: value.main||false}) } }) if (cmds.length != 1 && cmds[1] != chat.STORM) { return false } var river = list[cmds[0]]; if (!river) { return false } can.core.ItemOrder(river.storm, mdb.ORDER, function(key, value) { if (can.user.info.userrole == aaa.ROOT || can.base.isIn(value.type||"", "", aaa.VOID, can.user.info.userrole)) { - msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name, icon: value.icon||""}) + msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name, icon: value.icon||"", main: value.main||false}) } }), can.base.isFunc(cb) && cb(msg); return true }}) diff --git a/plugin/state.js b/plugin/state.js index 0bf0a8cb..32ad6ef4 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -268,14 +268,11 @@ Volcanos(chat.ONEXPORT, { output: function(can, msg) {}, action: function(can, button, data) {}, record: function(can, value, key, data) {}, title: function(can, title) { can.isCmdMode() && can.user.title(title) }, marginTop: function() { return 0 }, marginBottom: function() { return 0 }, - actionHeight: function(can) { - return (can._option.childElementCount == 1 && can._action.childElementCount == 0 || can.page.ClassList.has(can, can._target, html.OUTPUT))? 0: html.ACTION_HEIGHT - }, - outputHeight: function(can) { - var height = can.ConfHeight() - can.onexport.outputMargin(can) - if (can.user.isMobile) { return can.ConfHeight() - can.onexport.actionHeight(can) - can.onexport.statusHeight(can) } + actionHeight: function(can) { return (can._option.childElementCount == 1 && can._action.childElementCount == 0 || can.page.ClassList.has(can, can._target, html.OUTPUT))? 0: html.ACTION_HEIGHT }, + outputHeight: function(can) { var height = can.ConfHeight() - can.onexport.actionHeight(can) - can.onexport.statusHeight(can) + if (can.user.isMobile) { return height } height -= can.onexport.outputMargin(can) can.page.SelectChild(can, can._output, html.TABLE, function(target) { height -= target.offsetHeight }) - return can.base.Max(can.base.Min(height, can.ConfHeight()/2), can.ConfHeight()-html.ACTION_HEIGHT, 320) + return can.base.Max(can.base.Min(height, can.ConfHeight()/2), can.ConfHeight()-2*html.ACTION_HEIGHT, 320) }, outputMargin: function(can) { return 0 }, statusHeight: function(can) { return can.page.ClassList.has(can, can._target, html.OUTPUT) || !can.page.isDisplay(can._status) || can._status.innerHTML == "" || (can._target.offsetHeight > 0 && can._status.offsetHeight == 0)? 0: html.STATUS_HEIGHT },