1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-26 01:04:06 +08:00

opt search.js

This commit is contained in:
harveyshao 2023-01-29 23:18:46 +08:00
parent 6dda44645e
commit 95aae74d9c
10 changed files with 99 additions and 117 deletions

View File

@ -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) })
}}) }

View File

@ -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)

View File

@ -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; }

View File

@ -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) },

View File

@ -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) {

View File

@ -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],
],

View File

@ -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; }

View File

@ -1,42 +1,31 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var select; can.page.Append(can, can._output, msg.Table(function(item, index) {
(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() },
_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"
})), 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,30 +33,30 @@ 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) },
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) { 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) })
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: ""}) }) },
"添加应用": 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]) },
})
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}) }) },
@ -77,26 +66,22 @@ Volcanos(chat.ONDETAIL, {list: ["添加应用", "重命名群组", "删除群组
})
}) },
"重命名应用": 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
}})
})()

View File

@ -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; }

View File

@ -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)
},