diff --git a/frame.js b/frame.js index 5a49257d..3fad4034 100644 --- a/frame.js +++ b/frame.js @@ -320,6 +320,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { if (item.type == html.SELECT && (value || item.value)) { input._init = function(target) { target.value = value||item.value } } if (item.type == html.TEXT) { input.onkeydown = item.onkeydown||function(event) { can.onkeymap.input(event, can), can.onkeymap.selectOutput(event, can), event.key == lang.ENTER && can.onkeymap.prevent(event) + }, input.onfocus = input.onfocus||function(event) { + can.onmotion.selectRange(event.target) }, icon.push({text: can.page.unicode.delete, className: "icon delete", onclick: function(event) { _input.value = ""; item.name == html.FILTER && can.page.Select(can, can._output, html.TR, function(tr) { can.page.ClassList.del(can, tr, html.HIDE) }) }}) } diff --git a/lib/misc.js b/lib/misc.js index eaa2118b..d1d2960e 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -1,5 +1,5 @@ Volcanos("misc", {Message: function(event, can) { var msg = {} - var proto = {_event: event, _can: can, + var proto = {_event: event, _can: can, _target: can._target, RunAction: function(event, sub, cmds, meta) { var msg = can.request(event); meta = meta || sub&&sub.onaction || {} if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } if (cmds && cmds[0] == ctx.ACTION && can.base.isFunc(meta[cmds[1]])) { msg.Option(ice.MSG_HANDLE, ice.TRUE) diff --git a/panel/action.css b/panel/action.css index b934d928..6b896f81 100644 --- a/panel/action.css +++ b/panel/action.css @@ -22,4 +22,4 @@ fieldset.Action.grid>div.output>fieldset.plugin>div.action { display:none; } fieldset.Action.grid>div.output>fieldset.plugin>div.status { display:none; } fieldset.Action.grid>div.output>fieldset.plugin>form.option input[type=text] { width:80px; } fieldset.Action>div.project.toggle { font-size:32px; cursor:pointer; padding-top:50px; height:150px; position:fixed; top:30%; border-top-right-radius:20px; border-bottom-right-radius:20px; } -fieldset.Action>div.project.toggle { background-color:#4a566e6e; } +fieldset.Action>div.project.toggle { background-color:#4a566e6e; color:white; } diff --git a/panel/action.js b/panel/action.js index 24d856ad..e5b6a849 100644 --- a/panel/action.js +++ b/panel/action.js @@ -1,4 +1,4 @@ -(function() { var TABS = "tabs", TABVIEW = "tabview", HORIZON = "horizon", VERTICAL = "vertical", GRID = "grid", FREE = "free", FLOW = "flow", PAGE = "page" +(function() { const TABS = "tabs", TABVIEW = "tabview", HORIZON = "horizon", VERTICAL = "vertical", GRID = "grid", FREE = "free", FLOW = "flow", PAGE = "page", CAN_LAYOUT = "can.layout" Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can) var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM); can.core.Next(msg.Table(), function(item, next) { item.type = chat.PLUGIN, item.mode = can.Mode() can.onappend.plugin(can, item, function(sub, meta, skip) { @@ -9,14 +9,14 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can) }, function() { can.isCmdMode() || can.onmotion.delay(can, function() { can.onaction.layout(can) }) }) }, _share: function(can, share) { share && can.runAction({}, web.SHARE, [share], function(msg) { - can.user.title(msg.SearchOrOption(chat.TITLE)), can.setHeader(chat.THEME, msg.SearchOrOption(chat.THEME)), msg.Length() == 1 && can.onaction._onaction_cmd(can) + can.user.title(msg.SearchOrOption(chat.TITLE)), can.setHeader(chat.THEME, msg.SearchOrOption(chat.THEME)), can.Mode(web.SHARE), msg.Length() == 1 && can.onaction._onaction_cmd(can) can.Conf(chat.RIVER, web.SHARE, chat.STORM, share), can.onimport._init(can, msg) }) }, _tabs: function(can, sub, meta) { var tabs = [{view: [html.TABS, html.DIV, meta.name], onclick: function(event) { can.onmotion.select(can, can._header_tabs, html.DIV_TABS, sub._header_tabs) can.onmotion.select(can, can._action, html.DIV_TABS, sub._tabs), can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target) if (sub._delay_refresh) { sub._delay_refresh = false, sub.onimport.size(sub, can.ConfHeight(), can.ConfWidth(), can.onexport.isauto(can)) } - can._output.scrollTop = sub._target.offsetTop-html.PLUGIN_MARGIN + can.onexport.layout(can) == FREE || (can._output.scrollTop = sub._target.offsetTop-html.PLUGIN_MARGIN) }, 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 }, _menu: function(can, msg) { if (can.user.isMobile) { return } @@ -31,10 +31,10 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { onsize: function(can, msg, height, width) { can.Conf({height: height-can.Conf(html.MARGIN_Y), width: width-can.Conf(html.MARGIN_X)}) }, onmain: function(can, msg) { can.onimport._share(can, can.misc.Search(can, web.SHARE)) }, onlogin: function(can, msg) { can.ondaemon._init(can), can.onimport._menu(can, msg), can.onkeymap._build(can) - can._root.River && can.onmotion.delay(can, function() { var gt = can.page.unicode.gt, lt = can.page.unicode.lt, river = can._root.River._target + can._root.River && can.onmotion.delay(can, function() { var gt = can.page.unicode.gt, lt = can.page.unicode.lt, river = can._root.River._target; if (can.Mode()) { return } var target = can.page.Append(can, can._target, [{view: [[html.TOGGLE, chat.PROJECT], html.DIV, can.page.isDisplay(river)? lt: gt], onclick: function(event) { can.page.Modify(can, target, (can._river_show = can.onmotion.toggle(can, river))? lt: gt), can.onaction.layout(can) - }}])._target + }}])._target; can._toggle = target }); if (!can.Conf(chat.TOOL) && !can.user.mod.isCmd) { return } can._names = location.pathname can.Conf(chat.TOOL)? can.onappend.layout(can, can._output, FLOW, can.core.List(can.Conf(chat.TOOL), function(item, index, list) { item.type = chat.PLUGIN if (list.length == 1) { can.onaction._onaction_cmd(can), item.mode = chat.CMD, item.opts = can.misc.Search(can) } return item @@ -62,8 +62,8 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output) }, onresize: function(can, height, width) { can.onaction.layout(can), window.setsize && window.setsize(can.page.width(), can.page.height()) }, - layout: function(can, button) { can.page.ClassList.del(can, can._target, can._layout||can.misc.localStorage(can, "can.layout")), can._header_tabs && can.onmotion.hidden(can, can._header_tabs) - button = (can.misc.localStorage(can, "can.layout", can._layout = button == ice.AUTO? "": button))||can.misc.SearchOrConf(can, html.LAYOUT), can.page.ClassList.add(can, can._target, button) + layout: function(can, button) { can.page.ClassList.del(can, can._target, can._layout||can.misc.localStorage(can, CAN_LAYOUT)), can._header_tabs && can.onmotion.hidden(can, can._header_tabs) + button = (can.misc.localStorage(can, CAN_LAYOUT, can._layout = button == ice.AUTO? "": button))||can.misc.SearchOrConf(can, html.LAYOUT), can.page.ClassList.add(can, can._target, button) can.onengine.signal(can, chat.ONLAYOUT, can.request({}, {layout: button})), can._root.River && can._river_show === false && can.onmotion.hidden(can, can._root.River._target), can.onlayout._init(can) 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) @@ -103,7 +103,9 @@ Volcanos(chat.ONEXPORT, { }, layout: function(can) { return can._layout||can.misc.SearchOrConf(can, html.LAYOUT)||"" }, isauto: function(can) { return ["", FLOW, PAGE].indexOf(can.onexport.layout(can)) > -1 }, - args: function(can, msg, cb) { can.core.Next(can._plugins, function(sub, next, index, array) { cb(sub.Option(), sub, next, index, array) }) }, + args: function(can, msg, cb) { can.core.Next(can._plugins, function(sub, next, index, array) { + cb(can.base.trim(can.page.SelectArgs(can, sub._option, "", function(item) { return item.value })), sub, next, index, array) + }) }, plugin: function(can, msg, arg, fields) { can.core.List(can._plugins, function(sub) { var meta = sub.Conf(); if (!can.base.contains(meta.index, arg[1])) { return } var data = {ctx: ice.CAN, cmd: can._name, type: chat.PLUGIN, name: sub._index, text: shy(sub._legend.innerHTML, function(event) { sub._target.click() })} if (meta.index) { data.context = "", data.command = meta.index } else if (meta.cmd) { data.context = meta.ctx, data.command = meta.cmd } else { return } msg.Push(data, fields) @@ -130,6 +132,8 @@ Volcanos(chat.ONKEYMAP, { t: function(event, can) { can.onkeymap.toggleLayout(can, TABVIEW) }, h: function(event, can) { can.onkeymap.toggleLayout(can, HORIZON) }, v: function(event, can) { can.onkeymap.toggleLayout(can, VERTICAL) }, + g: function(event, can) { can.onkeymap.toggleLayout(can, GRID) }, + f: function(event, can) { can.onkeymap.toggleLayout(can, FREE) }, b: function(event, can) { can.onkeymap.toggleTheme(can, cli.BLACK) }, w: function(event, can) { can.onkeymap.toggleTheme(can, cli.WHITE) }, l: function(event, can) { can.onkeymap.toggleTheme(can, html.LIGHT) }, diff --git a/panel/footer.js b/panel/footer.js index 0149ae19..f7ce7bde 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -1,12 +1,13 @@ -(function() { var NTIP = "ntip", NCMD = "ncmd", NLOG = "nlog" +(function() { var NTIP = "ntip", NCMD = "ncmd", NLOG = "nlog", NKEY = "nkey" Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.ui = {}, can.db = {} + can.Conf(NKEY, can.core.Item(can.misc.localStorage(can)).length) can.onimport._title(can, msg, target), can.onimport._state(can, msg, target), can.onimport._toast(can, msg, target), can.onimport._command(can, msg, target) }, _title: function(can, msg, target) { can.user.isMobile || can.core.List(can.Conf(chat.TITLE)||msg.result, function(item) { can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "联系站长"}]) }) }, - _state: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), [NTIP, NCMD, NLOG]).reverse(), function(item) { - can.page.Append(can, target, [{view: [chat.STATE, html.DIV, can.Conf(item)], list: [ + _state: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), [NTIP, NLOG, NKEY, NCMD]).reverse(), function(item) { + can.page.Append(can, target, [{view: [chat.STATE, html.DIV], list: [ {text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", html.SPAN, item]}, ], onclick: function(event) { can.onexport[item](can) }}]) }) }, @@ -41,6 +42,7 @@ Volcanos(chat.ONEXPORT, {height: function(can) { return can._target.offsetHeight ntip: function(can) { can.onexport._float(can, NTIP, "can.toast") }, ncmd: function(can) { can.onexport._float(can, NCMD, "can.debug", [chat.ONREMOTE]) }, nlog: function(can) { can.onexport._float(can, NLOG, "can.debug") }, + nkey: function(can) { can.onexport._float(can, NLOG, "can.localStorage") }, _float: function(can, name, index, args, cb) { can.ui[name]? (can.ui[name].onaction.close(), delete(can.ui[name])): can.onappend._float(can, index, args||[], function(sub) { can.ui[name] = sub can.page.style(can, sub._target, {left: "", top: "", right: 0, bottom: can.onexport.height(can)}), can.base.isFunc(cb) && cb(sub) }) }, @@ -90,7 +92,7 @@ Volcanos(chat.ONPLUGIN, { can.page.AppendData(can, can._output, "", can._root._name, can._root, function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click() }), view: shy("网页元素", [mdb.KEY], function(can, msg, arg, cb) { var can = msg._can - if (arg[0]) { can.page.Append(can, can._output, [can.page.AppendView(can, can.page.SelectOne(can, document.body, arg[0]||document.body)]) } else { + if (arg[0]) { can.page.Append(can, can._output, [can.page.AppendView(can, can.page.SelectOne(can, document.body, arg[0]||document.body))]) } else { var ui = can.page.Append(can, can._output, [can.page.AppendView(can, document, "html", [ can.page.AppendView(can, document.head, "head"), can.page.AppendView(can, document.body, "body", null, false, function(target) { var list = []; for (var p = target; p && p.tagName && p != document.body; p = p.parentNode) { diff --git a/panel/header.js b/panel/header.js index 97f788bb..23c1261e 100644 --- a/panel/header.js +++ b/panel/header.js @@ -28,7 +28,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { background: function(event, can, background) { can.user.isExtension || can.user.isLocalFile || can.runAction(event, aaa.BACKGROUND, [background], function(msg) { can.user.info.background = background, can.onimport._background(can, msg), can.user.toastSuccess(can) }) }, - language: function(can, language) { can.runAction(event, aaa.LANGUAGE, [language], function(msg) { can.user.reload() }) }, + language: function(can, language) { can.runAction(event, aaa.LANGUAGE, [language == ice.AUTO? "": language], function(msg) { can.user.reload() }) }, theme: function(can, theme) { theme && (can.misc.localStorage(can, "can.theme", can._theme = theme == ice.AUTO? "": can.base.Obj(theme).join(ice.SP))), can.user.theme(can, can.onexport.theme(can)) }, menu: function(can, cmds, cb, trans) { can.base.isString(cmds) && (cmds = [cmds]) return can.page.Append(can, can._output, [{view: cmds[0], list: can.core.List(can.base.getValid(cmds.slice(1), [cmds[0]]), function(item) { @@ -70,7 +70,7 @@ Volcanos(chat.ONACTION, {_init: function(can) { var themeMedia = window.matchMed usernick: function(event, can) { can.user.mod.isPod || can.user.isExtension || can.user.isLocalFile || can.onaction.carte(event, can, can.onaction._menus) }, shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN]) }, 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) }, + 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) { 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) }) }) }, @@ -83,7 +83,7 @@ Volcanos(chat.ONACTION, {_init: function(can) { var themeMedia = window.matchMed _params: [chat.TITLE, chat.THEME], _menus: ["shareuser", [chat.THEME, ice.AUTO, html.DARK, html.LIGHT, "print", cli.WHITE, cli.BLACK], - [aaa.LANGUAGE, "zh", "en"], + [aaa.LANGUAGE, ice.AUTO, "zh", "en"], [nfs.SAVE, web.TOIMAGE, code.WEBPACK], [aaa.USER, "setnick", aaa.PASSWORD, cli.CLEAR, aaa.LOGOUT], ], diff --git a/panel/river.css b/panel/river.css index 6e8e212c..a021f048 100644 --- a/panel/river.css +++ b/panel/river.css @@ -1,4 +1,4 @@ -fieldset.River { width:180px; overflow:auto; float:left; } +fieldset.River { width:180px; float:left; } fieldset.River>div.action { padding:0 12px; display:block; } fieldset.River>div.output { width:180px; } fieldset.River>div.output div.item { padding:3px 16px; border-left:solid 3px #00ffae; } diff --git a/panel/river.js b/panel/river.js index 804843e5..68c3eaf3 100644 --- a/panel/river.js +++ b/panel/river.js @@ -1,42 +1,31 @@ -Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var select; can.page.Append(can, can._output, msg.Table(function(item, index) { - return can.onimport._river(can, item, function(target) { (index == 0 || item.hash == can._main_river) && (select = target) }) - })), select && select.click() }, - _main: function(can, msg) { can.river_list = {}, can.storm_list = {}, can.sublist = {} - var ls = []; can.user.isExtension && (ls = (can.misc.localStorage(can, "main")||"").split(",")) - 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" +(function() { const CAN_RIVER = "can.river", CAN_STORM = "can.storm" +Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can), can.onimport._main(can, msg) + var select; can.page.Append(can, can._output, msg.Table(function(item, index) { + 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) }, - _menu: function(can, msg) { if (can.user.mod.isPod) { return } return - can.setHeaderMenu(can.base.Obj(can.Conf(chat.MENUS)||msg.Option(chat.MENUS), can.ondetail._menus), function(event, button) { - can.core.CallFunc([can.ondetail, button], [event, can, button, can.Conf(chat.RIVER), can.Conf(chat.STORM)]) - }), can.onappend._action(can, can.Conf(ctx.ACTION)||can.onaction.list) + _main: function(can, msg) { can.ui = {river_list: {}, storm_list: {}, sublist: {}} + can._main_river = can.misc.SearchOrConf(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||"project" + can._main_storm = can.misc.SearchOrConf(can, chat.STORM)||msg.Option(ice.MSG_STORM)||"studio" }, - _river: function(can, meta, cb) { return {text: [meta.name, html.DIV, html.ITEM], - onclick: function(event) { can.onaction.storm(event, can, meta.hash) }, - onmouseenter: function(event) { can.onimport._carte(can, can.ondetail.list, meta.hash) }, - _init: function(target) { can.river_list[meta.hash] = target, cb(target) }, + _river: function(can, meta, cb) { return {text: [meta.name, html.DIV, html.ITEM], _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) }, } }, - _storm: function(can, meta, river) { return {text: [meta.name, html.DIV, html.ITEM], - onclick: function(event) { can.onaction.action(event, can, river, meta.hash) }, - onmouseenter: function(event) { can.onimport._carte(can, can.ondetail.sublist, river, meta.hash) }, - _init: function(target) { can.storm_list[can.core.Keys(river, meta.hash)] = target }, + _storm: function(can, meta, river) { return {text: [meta.name, html.DIV, html.ITEM], _init: function(target) { can.ui.storm_list[can.core.Keys(river, meta.hash)] = target }, + onclick: function(event) { can.onaction.action(event, can, river, meta.hash) }, oncontextmenu: function(event) { can.onaction.carte(event, can, can.ondetail._menu, river, meta.hash) }, } }, - _carte: function(can, list, river, storm) { if (can.user.isMobile) { return } if (can.core.Value(can._root, can.core.Keys(chat.RIVER, river))) { return } - can.onaction.carte(event, can, list, function(event, button, meta) { meta[button](event, can, button, river, storm) }) - }, + _menu: function(can, msg) { can.user.mod.isPod || can.onappend._action(can, can.onaction.list, can._action) }, }) -Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.REFRESH], _init: function(can) { can.onmotion.hidden(can) }, - onsize: function(can) { can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth) }, - onlogin: function(can, msg) { can.run({}, [], function(msg) { if (msg.Option(ice.MSG_RIVER) == "_share") { return } - can.onmotion.clear(can), can.onimport._main(can, msg), can.onimport._init(can, msg), can.onimport._menu(can, msg) - can.user.isMobile || can.user.isExtension || can.onmotion.toggle(can, can._target, true) +Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.REFRESH, web.SHARE], _init: function(can) { can.onmotion.hidden(can) }, + onlogin: function(can, msg) { can.run({}, [], function(msg) { if (msg.Option(ice.MSG_RIVER)) { return can.page.Remove(can, can._target) } + can.onimport._init(can, msg); if (can.user.isMobile || can.user.isExtension) { return } + can.onmotion.toggle(can, can._target, true), can.onlayout._init(can) }) }, onaction_touch: function(can, msg) { can.user.isMobile && can.onmotion.hidden(can) }, onaction_notool: function(can, msg, river, storm) { can.ondetail["添加工具"](msg._event, can, "添加工具", river, storm) }, onsearch: function(can, msg, arg) { if (arg[0] == mdb.FOREACH || arg[0] == chat.STORM) { can.onexport.storm(can, msg, arg) } }, + onlayout: function(can, layout) { can.user.isMobile || can._hidden || can.onmotion.toggle(can, can._target, !layout || layout == "tabs") }, onresize: function(can, msg) { can.user.isMobile && can.onmotion.hidden(can, can._target) }, - onprint: function(can, msg) { can.page.styleHeight(can, can._target, "") }, - onlayout: function(can, layout) { can.user.isMobile || can.onmotion.toggle(can, can._target, !layout || layout == "tabs") }, create: function(event, can) { can.user.input(event, can, [{name: mdb.TYPE, values: [aaa.TECH, aaa.VOID], _trans: "类型"}, {name: mdb.NAME, value: "hi", _trans: "群名"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}], function(args) { can.runAction(event, mdb.CREATE, args, function(msg) { can.misc.Search(can, {river: msg.Result()}) }) @@ -44,59 +33,55 @@ Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.REFRESH], _init: function(can) { refresh: function(event, can) { can.misc.Search(can, {river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), layout: can.getAction(html.LAYOUT)}) }, share: function(event, can) { can.onmotion.share(event, can, [{name: chat.TITLE, value: can.Conf(chat.STORM)}], [mdb.TYPE, chat.STORM, RIVER, can.Conf(RIVER), STORM, can.Conf(STORM)]) }, - storm: function(event, can, river) { can.onmotion.select(can, can._output, html.DIV_ITEM, can.river_list[river]) - var list = can.sublist[river]; if (list) { return can.onmotion.toggle(can, list) } + storm: function(event, can, river) { can.onmotion.select(can, can._output, html.DIV_ITEM, can.ui.river_list[river]) + var list = can.ui.sublist[river]; if (list) { return can.onmotion.toggle(can, list) } can.run({}, [river, chat.STORM], function(msg) { 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) - }) }])._target, can.sublist[river] = list, list.children.length > 0 && list.children[select].click(), event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling) }) + }) }])._target, can.ui.sublist[river] = list, list.children.length > 0 && list.children[select].click(), event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling) }) }, - action: function(event, can, river, storm) { can.onmotion.select(can, can._output, html.DIV_ITEM, can.river_list[river]) - can.onmotion.select(can, can._output, [html.DIV_LIST, html.DIV_ITEM], can.storm_list[can.core.Keys(river, storm)]), can.onmotion.toggle(can, can.sublist[river], true) - can.onmotion.delay(can, function() { can.onengine.signal(can, chat.ONSTORM_SELECT, can.request(event, {river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm)})) }) - can.user.isExtension && can.misc.localStorage(can, "main", river+","+storm) + action: function(event, can, river, storm) { can.onmotion.select(can, can._output, html.DIV_ITEM, can.ui.river_list[river]) + can.onmotion.select(can, can._output, [html.DIV_LIST, html.DIV_ITEM], can.ui.storm_list[can.core.Keys(river, storm)]), can.onmotion.toggle(can, can.ui.sublist[river], true) + can.onengine.signal(can, chat.ONSTORM_SELECT, can.request(event, {river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm)})) + can.misc.localStorage(can, CAN_RIVER, river), can.misc.localStorage(can, CAN_STORM, storm) }, - carte: function(event, can, list, cb) { can.user.carteRight(event, can, can.ondetail, list, cb) }, -}) -Volcanos(chat.ONDETAIL, {list: ["添加应用", "重命名群组", "删除群组"], - sublist: ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], - - "创建群组": function(event, can) { can.onaction.create(event, can) }, - "重命名群组": function(event, can, button, river) { can.user.input(event, can, [mdb.NAME], function(args) { - can.runAction(event, mdb.MODIFY, [mdb.HASH, river].concat(args), function(msg) { can.page.Modify(can, can.river_list[river], args[1]), can.user.toastSuccess(can) }) - }) }, - "删除群组": function(event, can, button, river) { can.runAction(event, mdb.REMOVE, [mdb.HASH, river], function(msg) { can.misc.Search(can, {river: "", storm: ""}) }) }, - + carte: function(event, can, list, river, storm) { if (can.core.Value(can._root, can.core.Keys(chat.RIVER, river))) { return can.onkeymap.prevent(event) } + can.user.carteRight(event, can, {}, list, function(event, button) { (storm? can.ondetail: can.onaction)[button](event, can, button, river, storm) }) + }, + _menu: ["添加应用", "重命名群组", "删除群组"], "添加应用": function(event, can, button, river) { can.ondetail.create(event, can, button, river) }, - "共享应用": function(event, can, button, river, storm) { can.onmotion.share(event, can, [{name: chat.TITLE, value: can.user.title()}, {name: chat.THEME, values: [cli.WHITE, cli.BLACK]}], [mdb.TYPE, chat.STORM, chat.RIVER, river, chat.STORM, storm]) }, + "重命名群组": function(event, can, button, river) { can.user.input(event, can, [mdb.NAME], function(args) { + can.runAction(event, mdb.MODIFY, [mdb.HASH, river].concat(args), function(msg) { can.page.Modify(can, can.ui.river_list[river], args[1]), can.user.toastSuccess(can) }) + }) }, + "删除群组": function(event, can, button, river) { can.runAction(event, mdb.REMOVE, [mdb.HASH, river], function(msg) { can.misc.Search(can, {river: "", storm: ""}) }) }, +}) +Volcanos(chat.ONDETAIL, { + _menu: ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], + "共享应用": function(event, can, button, river, storm) { can.onmotion.share(event, can, [{name: chat.TITLE, value: can.user.title()}, {name: chat.THEME, values: [ice.AUTO, html.DARK, html.LIGHT, cli.WHITE, cli.BLACK]}], [mdb.TYPE, chat.STORM, chat.RIVER, river, chat.STORM, storm]) }, "添加工具": function(event, can, button, river, storm) { can.user.select(event, can, ctx.COMMAND, ctx.INDEX, function(item, next) { - can.run({}, [river, storm, chat.STORM, ctx.ACTION, mdb.INSERT].concat([web.SPACE, can.misc.Search(can, ice.POD)||"", ctx.INDEX, item[0]]), function(msg) { next() }) - }, function() { can.misc.Search(can, {river: river, storm: storm}) }) }, + can.run({}, [river, storm, chat.STORM, ctx.ACTION, mdb.INSERT].concat([web.SPACE, can.misc.Search(can, ice.POD)||"", ctx.INDEX, item[0]]), function(msg) { next() }) + }, function() { can.misc.Search(can, {river: river, storm: storm}) }) }, "保存参数": function(event, can, button, river, storm) { can.getAction(ctx.ARGS, function(args, sub, next, index, array) { var toast = can.user.toast(can, (index+1)+ice.PS+array.length, button, 10000, (index+1)*100/array.length) - can.run({}, [river, storm, chat.STORM, ctx.ACTION, mdb.MODIFY, mdb.ID, sub.Conf(mdb.ID), ctx.ARGS, JSON.stringify(args)], function() { - can.onmotion.delay(can, function() { toast.close(), next(), index == array.length-1 && can.user.toastSuccess(can) }) - }) - }) }, + can.run({}, [river, storm, chat.STORM, ctx.ACTION, mdb.MODIFY, mdb.ID, sub.Conf(mdb.ID), ctx.ARGS, JSON.stringify(args)], function() { + can.onmotion.delay(can, function() { toast.close(), next(), index == array.length-1 && can.user.toastSuccess(can) }) + }) + }) }, "重命名应用": function(event, can, button, river, storm) { can.user.input(event, can, [mdb.NAME], function(args) { - can.run(event, [river, storm, chat.STORM, ctx.ACTION, mdb.MODIFY].concat(args), function() { can.page.Modify(can, can.storm_list[can.core.Keys(river, storm)], args[1]), can.user.toastSuccess(can) }) - }) }, + can.run(event, [river, storm, chat.STORM, ctx.ACTION, mdb.MODIFY].concat(args), function() { can.page.Modify(can, can.ui.storm_list[can.core.Keys(river, storm)], args[1]), can.user.toastSuccess(can) }) + }) }, "删除应用": function(event, can, button, river, storm) { can.run(event, [river, storm, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) { can.misc.Search(can, {river: river, storm: ""}) }) }, - create: function(event, can, button, river) { can.user.input(event, can, [{name: mdb.NAME, value: "hi", _trans: "名称"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}], function(args) { can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) { can.misc.Search(can, {river: river, storm: msg.Result()}) }) }) }, }) Volcanos(chat.ONEXPORT, {width: function(can) { return can._target.offsetWidth }, storm: function(can, msg, arg) { can.core.Item(can._root.river, function(river, value) { can.core.Item(value.storm, function(storm, item) { if (arg[1] != "" && storm.indexOf(arg[1]) == -1 && item.name.indexOf(arg[1]) == -1) { return } - msg.Push({ctx: ice.CAN, cmd: can._name, type: river, name: storm, text: shy("跳转", function(event) { - can.onaction.action(event, can, river, storm) - })}) + msg.Push({ctx: ice.CAN, cmd: can._name, type: river, name: storm, text: shy("跳转", function(event) { can.onaction.action(event, can, river, storm) })}) }) }) }, }) Volcanos(chat.ONENGINE, {_engine: function(event, can, msg, panel, cmds, cb) { var list = can.river cmds.length == 0 && can.core.ItemOrder(list, "order", function(key, value) { can.core.Item(value.storm).length > 0 && msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) }) - if (cmds.length != 1 && cmds[1] != chat.STORM) { return false } - - var river = list[cmds[0]]; if (!river) { return 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, "order", function(key, value) { msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) }) can.base.isFunc(cb) && cb(msg); return true }}) +})() \ No newline at end of file diff --git a/panel/search.css b/panel/search.css index ff867371..3f43d3d3 100644 --- a/panel/search.css +++ b/panel/search.css @@ -1,5 +1,4 @@ fieldset.Search { background-color:#041a25bd; padding:10px; display:none; position:fixed; left:0; top:31px; } -fieldset.Search input.word { width:100%; } -fieldset.Search>div.output table { width:100%; } +fieldset.Search>div.action>div.item.filter>input { width:320px; } fieldset.Search>div.status { display:block; } fieldset.Search.panel fieldset.story>form.option input[type=button][name=close] { display:block; } diff --git a/panel/search.js b/panel/search.js index d3a3d452..3cda19f9 100644 --- a/panel/search.js +++ b/panel/search.js @@ -1,57 +1,47 @@ -Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can, can.ui.content), can._plugins = [], can.list = msg.Table() - var table = can.onappend.table(can, msg, function(value, key, index, line) { can.Status(mdb.TOTAL, index+1) - return {text: [key == mdb.TEXT && can.base.isFunc(line.text) && line.text.help || value, html.TD], onclick: function(event) { if (can.page.tagis(event.target, html.A)) { return } - can.onaction[can.type == mdb.FOREACH || event.ctrlKey? mdb.PLUGIN: mdb.SELECT](event, can, index) +Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can, can.ui.content), can.list = msg.Table() + var table = can.onappend.table(can, msg, function(value, key, index, line) { + return {text: [key == mdb.TEXT && can.base.isFunc(line.text) && line.text.help || value, html.TD], onclick: function(event) { + can.page.tagis(event.target, html.A) || can.onaction[can.type == mdb.FOREACH || event.ctrlKey? mdb.PLUGIN: mdb.SELECT](event, can, index) }} - }, can.ui.content, can.core.List((msg.Option("sort")||msg.Option(ice.MSG_FIELDS)).split(ice.FS))); can.onmotion.story.auto(can) - can.onappend._status(can, can.base.Obj(msg.Option(ice.MSG_STATUS), []).concat({name: mdb.SELECT, value: "0"})) + }, can.ui.content, can.base.getValid(msg.Option(ice.MSG_FIELDS).split(ice.FS), msg.append)); can.onmotion.story.auto(can), can.onimport._size(can, msg) can.onmotion.focus(can, can.ui.word), msg.Length() == 1 && can.ui.profile.innerHTML == "" && can.page.Select(can, table, html.TD)[0].click() }, - _word: function(can, msg, arg, fields) { if (arg[1].indexOf(";") > -1) { var ls = can.core.Split(arg[1], "\t ;", "\t ;"); arg[0] = ls[0], arg[1] = ls[1] } + _size: function(can, msg) { + can.getActionSize(function(left, top, width, height) { can.page.style(can, can._target, {left: left||0, top: top||0, width: width}) + can.ConfHeight(can.base.Max(height-2*html.PLUGIN_MARGIN-2*html.ACTION_HEIGHT-can.ui.content.offsetHeight-can.ui.display.offsetHeight, 480)), can.ConfWidth(width-2*html.PLUGIN_MARGIN) + can.core.List([can.ui.content, can.ui.display], function(target) { can.page.style(can, target, html.MAX_WIDTH, can.ConfWidth()) }) + can.page.style(can, can._output, html.MAX_HEIGHT, height-2*html.PLUGIN_MARGIN-2*html.ACTION_HEIGHT+1) + }), can.onappend._status(can, can.base.Obj(msg.Option(ice.MSG_STATUS), []).concat({name: mdb.SELECT, value: "0"})) + }, + _word: function(can, msg, arg, fields) { if (can.base.contains(arg[1], ";")) { var ls = can.core.Split(arg[1], "\t ;", "\t ;"); arg[0] = ls[0], arg[1] = ls[1] } can.run(can.request({}, {fields: fields.join(ice.FS)}, msg), arg, function(res) { res.Option(ice.ARG, arg) can.onengine.signal(can, chat.ONSEARCH, res), can.type = arg[0], can.onimport._init(can, res) }), can.onmotion.show(can) }, - select: function(can, msg, cmds, cb) { can.getActionSize(function(left, top, width, height) { - can.page.style(can, can._target, {left: left||0, top: top||0, width: width}), can.onaction.onsize(can, height, width) - }) + select: function(can, msg, cmds, cb) { can.ui.word.value = cmds[1], can.input = function(event, word) { cmds[1] = word||cmds[1]; can.onimport._word(can, msg, cmds, fields) } var fields = (cmds[2]||msg.Option(ice.MSG_FIELDS)||"ctx,cmd,type,name,text").split(ice.FS); can.page.Appends(can, can.ui.display, [{th: fields}]), can.onmotion.hidden(can, can.ui.display) - can.ui.word.value = cmds[1], can.input = function(event, word) { cmds[1] = word||cmds[1]; can.onimport._word(can, msg, cmds, fields) } - can.cb = function() { can.base.isFunc(cb) && cb(can.onexport.select(can)), can.onmotion.hide(can) } - can.onimport._word(can, msg, cmds, fields) + can.cb = function() { can.base.isFunc(cb) && cb(can.onexport.select(can)), can.onmotion.hide(can) }, can._plugins = [], can.onimport._word(can, msg, cmds, fields) }, }) Volcanos(chat.ONACTION, {_init: function(can) { can.onmotion.hidden(can) }, list: [cli.CLOSE, cli.CLEAR, cli.DONE], - onlogin: function(can, msg) { can.onappend._action(can, can.Conf(html.ACTION)||can.onaction.list) - can.ui = can.page.Append(can, can._output, [chat.CONTENT, {view: [[chat.DISPLAY, chat.CONTENT], html.TABLE]}, chat.PROFILE]) - can.ui.word = can.page.Append(can, can._action, [{input: ["word", function(event) { - if (event.key == lang.ESCAPE) { return can.onmotion.hide(can) } + onlogin: function(can, msg) { can.ui = can.page.Append(can, can._output, [chat.CONTENT, {view: [[chat.DISPLAY, chat.CONTENT], html.TABLE]}, chat.PROFILE]) + can.onappend._action(can, (can.Conf(html.ACTION)||can.onaction.list).concat({type: html.TEXT, name: html.FILTER, _init: function(target) { can.ui.word = target }, onkeydown: function(event) { if (event.key == lang.ENTER) { can.onkeymap.prevent(event) - if (event.shiftKey) { var first = can.page.Select(can, can.ui.content, html.TR)[1] - return can.onaction[can.type == mdb.FOREACH? mdb.PLUGIN: html.SELECT](event, can, first.dataset.index) - } return event.ctrlKey? can.onaction[cli.DONE](event, can): can.input(event, event.target.value) - } - if (event.ctrlKey) { if (event.key == "0") { return can.onaction.clear(event, can) } - return can.onkeymap.selectCtrlN(event, can, can.ui.content, [html.TBODY, html.TR], function(target) { target.firstChild.click() }) - } event.key.length == 1 && can.onmotion.tableFilter(can, can.ui.content, event.target.value+event.key) - }] }])._target + if (event.shiftKey) { var first = can.page.Select(can, can.ui.content, html.TR)[1]; return can.onaction[can.type == mdb.FOREACH? mdb.PLUGIN: html.SELECT](event, can, first.dataset.index) } + return event.ctrlKey? can.onaction[cli.DONE](event, can): can.input(event, event.target.value) + } if (event.key == lang.ESCAPE) { return can.onmotion.hide(can) } + if (event.ctrlKey) { return event.key == "0"? can.onaction.clear(event, can): can.onkeymap.selectCtrlN(event, can, can.ui.content, [html.TBODY, html.TR], function(target) { target.firstChild.click() }) } + event.key.length == 1 && can.onmotion.delayOnce(can, function() { can.onmotion.tableFilter(can, can.ui.content, event.target.value+event.key) }, 300, can._delay_filter = can._delay_filter||[]) + }})) }, onopensearch: function(can, msg, type, word) { can.onimport.select(can, msg, [type||mdb.FOREACH, word||""]) }, - onkeydown: function(can, msg) { msg._event.key == lang.ESCAPE && can.onmotion.hidden(can, can._target) }, - onsize: function(can, height, width) { can.ConfHeight(height-2*html.PLUGIN_MARGIN-2*html.ACTION_HEIGHT), can.ConfWidth(width-2*html.PLUGIN_MARGIN) - can.ui && can.core.List([can.ui.content, can.ui.display, can.ui.profile], function(target) { can.page.style(can, target, html.MAX_WIDTH, can.ConfWidth()) }) - can.core.List(can._plugins, function(sub) { sub.onimport.size(sub, can.base.Min(320, can.ConfHeight()-html.ACTION_HEIGHT-can.ui.content.offsetHeight-can.ui.display.offsetHeight)-2*html.ACTION_HEIGHT-1, can.ConfWidth()-1, true) }) - can.page.style(can, can._output, html.MAX_HEIGHT, can.ConfHeight()-html.ACTION_HEIGHT) - }, - close: function(event, can) { can.onmotion.hide(can) }, clear: function(event, can) { can.onmotion.clear(can, can.ui.profile) }, done: function(event, can) { can.base.isFunc(can.cb) && can.cb() }, - plugin: function(event, can, index) { var line = can.list[index]; if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) } var cmd = line.cmd == ctx.COMMAND? can.core.Keys(line.type, line.name.split(ice.SP)[0]): can.core.Keys(line.ctx, line.cmd) can.onappend.plugin(can, {index: cmd||msg.Option(mdb.INDEX), args: cmd == web.WIKI_WORD? [line.name]: []}, function(sub, meta) { can._plugins = (can._plugins||[]).concat(sub) - sub.onimport.size(sub, can.base.Min(320, can.ConfHeight()-html.ACTION_HEIGHT-can.ui.content.offsetHeight-can.ui.display.offsetHeight)-2*html.ACTION_HEIGHT-1, can.ConfWidth()-1, true) + sub.onimport.size(sub, can.ConfHeight(), can.ConfWidth(), true) can.onmotion.delay(can, function() { sub.Focus() }) }, can.ui.profile) },