diff --git a/frame.js b/frame.js index 715a2bb4..82b0700f 100644 --- a/frame.js +++ b/frame.js @@ -82,7 +82,6 @@ Volcanos(chat.ONDAEMON, {_init: function(can, name, type, cbs) { if (can.user.is }, _list: [""], pwd: function(can, arg) { can.misc.sessionStorage(can, "can.daemon", can._wss_name = can.ondaemon._list[0] = arg[0]) }, close: function(can, msg, sub) { can.user.close() }, exit: function(can, msg, sub) { can.user.close() }, toast: function(can, sub, arg, cb) { can.core.CallFunc(can.user.toast, [sub].concat(arg)) }, - online: function(can, sub) { debugger }, refresh: function(can, msg, sub, arg) { if (arg[0] == "confirm") { can.user.toastConfirm(can, arg[1]||"reload?", sub.ConfIndex(), function(event, button) { @@ -116,6 +115,26 @@ Volcanos(chat.ONDAEMON, {_init: function(can, name, type, cbs) { if (can.user.is can.core.CallFunc(can.core.Value(can, arg[0]), kit.Dict({can: can}, arg.slice(1))) }, input: function(can, msg, sub, arg) { can.page.Select(can, sub._target, "input:focus", function(target) { target.value += arg[0] }) }, + online: function(can, sub) { debugger }, + _online: function(can, delay) { can.onmotion.delay(can, function() { can = can._fields? can.sup: can + if (can.ui._online) { return } can.ui._online = true + if (!can.ui.online) { + if (can.isCmdMode()) { + can.ui.online = can.page.Append(can, can.ui.head? can.ui.head: can._action, ["item online state"])._target + } else { + var p = can.page.SelectOne(can, can._action, "div.item._space"); p = p? p.nextSibling: p + can.ui.online = can.page.insertBefore(can, ["item online state"], p, can._action) + } + } + can._root.Header.run(can.request({}, {_space: can.ConfSpace()||can.misc.Search(can, ice.POD), _index: can.ConfIndex()}), [ctx.ACTION, web.ONLINE], function(msg) { + can.page.Appends(can, can.ui.online, msg.Table(function(value, index) { + return index < 5 && {img: can.misc.Resource(can, value.username == can.user.info.username? value.icons: value.avatar||"usr/icons/contexts.png"), + title: [[value.usernick, value.username].join(lex.SP), [value.agent, value.system, value.ip].join(lex.SP)].join(lex.NL)} + })) + msg.Length() > 0 && can.page.Append(can, can.ui.online, [{text: msg.Length()+""}]) + can.onmotion.orderShow(can, can.ui.online, "*", 10, 300) + }), can.ondaemon._online(can, 30000) + }, delay) }, }) Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { meta.index && (meta.name = meta.index), meta.name = can.core.Split(meta.name||"", "\t .\n").pop()||can.Conf(mdb.NAME) @@ -170,7 +189,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }) }) }), can.base.isFunc(cb) && cb(sub) if (sub.isOutputStyle()) { return } if (can.user.isMobile && !can.user.isLandscape()) { return } - sub.isCmdMode() && !can.base.isIn(meta.index, web.CODE_VIMER, web.CODE_INNER, web.CHAT_MACOS_DESKTOP) && can.page.insertBefore(can, can.user.header(sub), sub._output, sub._fields||sub._target) + sub.isCmdMode() && !can.base.isIn(meta.index, web.CODE_VIMER, web.CODE_INNER, web.CHAT_MACOS_DESKTOP) && can.page.insertBefore(can, [{view: "header", list: can.user.header(sub)}], sub._output, sub._fields||sub._target) }); return sub }, _option: function(can, meta, option, skip) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {}) @@ -313,6 +332,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action) sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS), null, msg), can.user.isMobile || sub.onappend.tools(sub, msg) can.core.Item(can.Action(), function(key) { var value = can.misc.sessionStorage(can, [can.ConfIndex(), ctx.ACTION, key]); value && can.Action(key, value[0]) }) + if (msg.Option("sess.online") == ice.TRUE) { can.ondaemon._online(can) } } can.onappend.style(sub, sub.Conf(ctx.STYLE)), can.onmotion.story.auto(can, can._output) if (can.onimport.size) { can.page.ClassList.has(can, can._target, html.FLOAT) && !can.page.ClassList.has(can, can._target, html.PLUG)? diff --git a/index.css b/index.css index 12ecfdb0..5e261796 100644 --- a/index.css +++ b/index.css @@ -203,12 +203,16 @@ div.content>div.toggle.display { left:20%; bottom:-52px; rotate:90deg; border-to div.project:not(.toggle) { width:var(--project-width); flex:0 0 var(--project-width); } div.profile:not(.toggle) { width:50%; flex:0 0 50%; } /* fieldset */ -fieldset>div.action>div.online { margin-left:var(--button-margin) !important; display:block; } -fieldset>div.action>div.online.state { box-shadow:none; margin-right:var(--button-margin) !important; display:block; overflow:hidden; position:relative; } -fieldset>div.action>div.online span { background-color:var(--hover-bg-color); color:var(--hover-fg-color); font-size:var(--status-font-size); position:absolute; bottom:0; } -fieldset>div.action>div.online img { height:var(--action-height); transition:margin-right 1s; float:right; } -fieldset>div.action>div.online img:hover { background-color:var(--hover-bg-color); } -fieldset>div.action>div.online:not(:hover) img:not(:first-child) { margin-right:-20px; } +div.item.online.state { margin-left:var(--button-margin) !important; display:block; } +div.item.online.state { box-shadow:none; margin-right:var(--button-margin) !important; display:block; overflow:hidden; position:relative; } +div.item.online.state span { background-color:var(--hover-bg-color); color:var(--hover-fg-color); font-size:var(--status-font-size); position:absolute; bottom:0; } +div.item.online.state img { height:var(--action-height); transition:margin-right 1s; float:right; } +div.item.online.state img:hover { background-color:var(--hover-bg-color); } +div.item.online.state:not(:hover) img:not(:first-child) { margin-right:-20px; } +fieldset>div.header { display:contents; } +fieldset>div.header>div { line-height:22px; padding:var(--input-padding); float:right; } +fieldset>div.header div.online { padding:0; } +fieldset>div.header img { height:var(--action-height); float:right; } fieldset>div.action>div.online { margin-left:var(--button-margin) !important; display:block; } fieldset>div.action>div.online.state { box-shadow:none; margin-right:var(--button-margin) !important; display:block; overflow:hidden; position:relative; } @@ -754,6 +758,7 @@ fieldset.iframe.float>form.option>div.item.hash input { width:var(--form-width); fieldset.iframe>form.option>div.item.hash input { width:var(--form-width); } fieldset.Action:not(.horizon):not(.grid)>fieldset.plugin>form.option>div.item.text.path>input { width:var(--project-width); } fieldset.inner.float>div.status { display:none; } +fieldset.user>form.option>div.item.username input { width:var(--form-width); } fieldset.inner>div.output>div.project div.item.modify { background-color:#00800036; } fieldset.vimer>div.output>div.project div.item.modify { background-color:#00800036; } fieldset.vimer>div.output>div.project>div.zone.space div.item.stop { color:var(--disable-fg-color); } diff --git a/lib/user.js b/lib/user.js index 9b95c9c7..91248824 100644 --- a/lib/user.js +++ b/lib/user.js @@ -324,7 +324,9 @@ Volcanos("user", { can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%H:%M:%S %w")) }) }}, avatar: {view: [[html.ITEM, "state", aaa.AVATAR]], list: [{img: can.user.info.avatar}], onclick: function(event) { header && header.onaction.avatar(event, header) }}, - usernick: {view: [[html.ITEM, "state", aaa.USERNICK, html.FLEX], "", can.user.info.usernick], onclick: function(event) { header && header.onaction.usernick(event, header) }}, + usernick: {view: [[html.ITEM, "state", aaa.USERNICK, html.FLEX], "", can.user.info.usernick], onclick: function(event) { header && header.onaction.usernick(event, header) }, _init: function(target) { + can.ui.head = target.parentNode + }}, qrcode: {view: [[html.ITEM, "state", cli.QRCODE]], list: [{icon: icon.qrcode}], onclick: function(event) { var _can = can._fields? can.sup: can; _can.onaction["生成链接"](event, _can) }}, }; return can.core.List(can.base.getValid(can.core.List(arguments).slice(1), [html.SPACE, mdb.TIME, aaa.AVATAR, aaa.USERNICK, cli.QRCODE]), function(item) { return meta[item] }) }, diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 0c7ab9ea..87ec0ee1 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -55,7 +55,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp }, _tabs: function(can) { if (!can.isCmdMode()) { - can.onimport._online(can) return can.ui._tabs = can._action } var ui = can.page.Append(can, can.ui.tabs, ["icon", "tabs", "head"]); can.ui._tabs = ui.tabs @@ -66,7 +65,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp can.onappend.style(can, html.FLEX, ui.head) can.onappend.style(can, html.FLEX, ui.tabs) can.onappend.style(can, html.FLEX, ui.icon) - can.ui.online = can.page.Append(can, ui.head, ["online"])._target, can.onimport._online(can) can.page.Append(can, ui.head, can.user.header(can).reverse()) }, __tabPath: function(can, cache) { var target = can.ui.path; can.onappend.style(can, html.FLEX, can.ui.path) diff --git a/plugin/local/team/plan.js b/plugin/local/team/plan.js index 2a3b5215..ef2f21e2 100644 --- a/plugin/local/team/plan.js +++ b/plugin/local/team/plan.js @@ -4,7 +4,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( can.onmotion.hidden(can, can.ui.project) can.onimport[can.Option("scale")||team.WEEK](can, msg), can.Status(mdb.COUNT, msg.Length()), can.ui.filter.placeholder = `search in ${ msg.Length() } items`, can.onimport.layout(can) var item; if (can.isCmdMode() && ls.length > 0) { item = can.list[can.core.Keys(ls)] } else if (can.sup.task) { item = can.list[can.core.Keys(can.sup.task.space, can.sup.task.zone, can.sup.task.id)] } item && item.click() - can.onimport._online(can) }, _content: function(can, msg, head, list, key, get, set) { var begin_time = can.base.Date(can.Option(team.BEGIN_TIME)); can.sup.task && (can.sup.task._target = null) var hash = {}; msg.Table(function(value, index) { var k = key(can.base.Date(value.begin_time)); hash[k] = (hash[k]||[]).concat([value]) }) @@ -36,6 +35,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task[key] = value }), delete(task.extra) var table = can.page.Appends(can, can.ui.profile, [{view: [[chat.CONTENT, mdb.DETAIL], html.TABLE], list: [{th: [can.user.trans(can, mdb.KEY, "字段"), can.user.trans(can, mdb.VALUE, "属性")]}]}])._target can.core.Item(task, function(key, value) { key != "_target" && can.page.Append(can, table, [{ + className: key, td: [can.user.trans(can, key, null, html.INPUT), key == web.SPACE && value != ""? can.page.Format(html.A, can.misc.MergeURL(can, {pod: value}), value): value], onclick: function(event) { can.page.tagis(event.target, html.INPUT) && event.target.type == html.BUTTON && can.run(can.request(event, task), [ctx.ACTION, event.target.name]) }, ondblclick: function(event) { if ([web.SPACE, mdb.ZONE, mdb.ID].indexOf(key) > -1) { return } diff --git a/plugin/table.js b/plugin/table.js index 1cf12896..d09a7ada 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -7,7 +7,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { } else { can.onappend.table(can, msg, null, target), can.onappend.board(can, msg, target), can.onmotion.story.auto(can, target) } - if (msg.Option("sess.online") == ice.TRUE) { can.onimport._online(can) } }, card: function(can, msg, target) { target = target||can.ui.content||can._output var list = msg.Table(function(value) { value.icon = value.icons||value.icon||value.image @@ -24,7 +23,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { }) can.onimport.layout = can.onimport.layout||function() { var height = can.onlayout.expand(can, target); can.sup.onexport.outputMargin = function() { return height } } can.page.Append(can, target, list), can.onmotion.orderShow(can, target) - can.onimport._online(can) }, _vimer_zone: function(can, msg, target) { msg.Table(function(value) { var action = can.page.parseAction(can, value) can.onimport.item(can, {type: value.type, status: value.status, icon: can.misc.Resource(can, value.icon||value.icons||value.avatar_url), name: can.page.Color(value[can.Conf(mdb.FIELD)||mdb.VIEW]||value[mdb.NAME]||value[mdb.TEXT]||value[mdb.TYPE]), title: value[mdb.TEXT]||value.description}, function(event) { @@ -228,24 +226,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { }, sub.onaction.close = function() { can.onmotion.hidden(can, target) }, can.base.isFunc(cb) && cb(sub) }, target, field) }, - _online: function(can, delay) { can.onmotion.delay(can, function() { - if (!can.ui.online) { - if (can.isCmdMode()) { - can.ui.online = can.page.Append(can, can._action, ["item online state"])._target - } else { - var p = can.page.SelectOne(can, can._action, "div.item._space"); p = p? p.nextSibling: p - can.ui.online = can.page.insertBefore(can, ["item online state"], p, can._action) - } - } - can._root.Header.run(can.request({}, {_space: can.ConfSpace()||can.misc.Search(can, ice.POD), _index: can.ConfIndex()}), [ctx.ACTION, web.ONLINE], function(msg) { - can.page.Appends(can, can.ui.online, msg.Table(function(value, index) { - return index < 5 && {img: can.misc.Resource(can, value.username == can.user.info.username? value.icons: value.avatar||"usr/icons/contexts.png"), - title: [[value.usernick, value.username].join(lex.SP), [value.agent, value.system, value.ip].join(lex.SP)].join(lex.NL)} - })) - msg.Length() > 0 && can.page.Append(can, can.ui.online, [{text: msg.Length()+""}]) - can.onmotion.orderShow(can, can.ui.online, "*", 10, 300) - }), can.onimport._online(can, 30000) - }, delay) }, }) Volcanos(chat.ONLAYOUT, { _init: function(can, height, width) {