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

opt onappend

This commit is contained in:
harveyshao 2022-01-11 12:30:46 +08:00
parent 72907b43b7
commit 02c53dc63b
26 changed files with 379 additions and 411 deletions

8
.gitignore vendored
View File

@ -1,8 +1,8 @@
*.swp *.swp
*.swo *.swo
cmd.js
cmd.css
cache.js
cache.css
.DS_Store .DS_Store
page/can.js
page/can.css
page/cache.js
page/cache.css
pack/ pack/

189
frame.js
View File

@ -137,7 +137,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
}, },
Action: function(key, value) { return sub.page.SelectArgs(sub, action, key, value)[0] }, Action: function(key, value) { return sub.page.SelectArgs(sub, action, key, value)[0] },
Option: function(key, value) { return sub.page.SelectArgs(sub, option, key, value)[0] }, Option: function(key, value) { return sub.page.SelectArgs(sub, option, key, value)[0] },
Update: function(event, cmds, cb, silent) { sub.onappend._output(sub, sub.Conf(), event||{}, cmds||sub.Input(), cb, silent) }, Update: function(event, cmds, cb, silent) { sub.onappend._output0(sub, sub.Conf(), event||{}, cmds||sub.Input(), cb, silent) },
Input: function(cmds, silent) { Input: function(cmds, silent) {
cmds = cmds && cmds.length > 0? cmds: sub.page.SelectArgs(sub, option, ""), cmds = can.base.trim(cmds) cmds = cmds && cmds.length > 0? cmds: sub.page.SelectArgs(sub, option, ""), cmds = can.base.trim(cmds)
silent || cmds[0] == ctx.ACTION || sub.base.Eq(sub._history[sub._history.length-1], cmds) || sub._history.push(cmds) silent || cmds[0] == ctx.ACTION || sub.base.Eq(sub._history[sub._history.length-1], cmds) || sub._history.push(cmds)
@ -153,19 +153,26 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"") sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"")
sub.page.Modify(sub, sub._legend, {onmouseenter: function(event) { sub.page.Modify(sub, sub._legend, {onmouseenter: function(event) {
sub.user.carte(event, sub, sub.onaction, sub.onaction.list.concat([["所有 ->"].concat(can.core.Item(meta.feature._trans))], ["close"])) sub.user.carte(event, sub, sub.onaction, sub.onaction.list.concat([["所有 ->"].concat(can.core.Item(meta.feature._trans))], [cli.CLOSE]))
}}), meta.inputs && sub.onappend._option(sub, meta, sub._option) }})
if (meta.msg) { var msg = sub.request(); msg.Copy(sub.base.Obj(meta.msg))
sub.onappend._output(sub, msg, msg.Option(ice.MSG_DISPLAY))
meta.inputs && sub.onappend._option(sub, meta, sub._option, true)
} else {
meta.inputs && sub.onappend._option(sub, meta, sub._option)
}
can.base.isFunc(cb) && cb(sub) can.base.isFunc(cb) && cb(sub)
}); return sub }); return sub
}, },
_option: function(can, meta, option) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {}) _option: function(can, meta, option, skip) { meta = meta||{}; var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {})
function add(item, next) { item.type != html.BUTTON && index++ function add(item, next) { item.type != html.BUTTON && index++
return Volcanos(item.name, {_follow: can.core.Keys(can._follow, item.name), return Volcanos(item.name, {_follow: can.core.Keys(can._follow, item.name),
_target: can.onappend.input(can, item, args[index]||opts[item.name], option), _target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option),
_option: can._option, _action: can._action, _output: can._output, _status: can._status, _option: can._option, _action: can._action, _output: can._output, _status: can._status,
Option: can.Option, Action: can.Action, Status: can.Status, Option: can.Option, Action: can.Action, Status: can.Status, CloneField: function() { can.Clone() },
CloneInput: function() { can.onmotion.focus(can, add(item)._target) }, CloneField: function() { can.Clone() }, CloneInput: function() { can.onmotion.focus(can, add(item)._target) },
}, [item.display||"/plugin/input.js"], function(input) { input.Conf(item) }, [item.display||"/plugin/input.js"], function(input) { input.Conf(item)
input.run = function(event, cmds, cb, silent) { var msg = can.request(event) input.run = function(event, cmds, cb, silent) { var msg = can.request(event)
if (msg.RunAction(event, input, cmds)) { return } if (msg.RunAction(event, input, cmds)) { return }
@ -175,14 +182,14 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.core.ItemCB(input.onaction, function(key, cb) { can.core.ItemCB(input.onaction, function(key, cb) {
input._target[key] = function(event) { cb(event, input) } input._target[key] = function(event) { cb(event, input) }
}), can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]); }), skip? next(): can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]);
(item.action||meta.feature["inputs"]) && can.onappend.figure(input, item, input._target) (item.action||can.core.Value(meta, "feature.inputs")) && can.onappend.figure(input, item, input._target)
}) })
}; can.core.Next(can.base.Obj(meta.inputs, []).concat(meta.type == chat.FLOAT? [{type: html.BUTTON, name: cli.CLOSE}]: []), add) }; can.core.Next(can.base.Obj(meta.inputs, can.core.Value(can, "onimport.list")).concat(meta.type == chat.FLOAT? [{type: html.BUTTON, name: cli.CLOSE}]: []), add)
}, },
_action: function(can, list, action, meta) { action = action||can._action, meta = meta||can.onaction _action: function(can, list, action, meta) { meta = meta||can.onaction, action = action||can._action, can.onmotion.clear(can, action)
can.core.List(list||can.onaction.list, function(item) { can.onappend.input(can, item == ""? /*空白*/ {type: html.SPACE}: can.core.List(can.base.Obj(list, can.core.Value(can, "onaction.list")), function(item) { can.onappend.input(can, item == ""? /*空白*/ {type: html.SPACE}:
can.base.isString(item)? /*按键*/ {type: html.BUTTON, value: can.user.trans(can, item), onclick: function(event) { can.base.isString(item)? /*按键*/ {type: html.BUTTON, value: can.user.trans(can, item), onclick: function(event) {
var cb = meta[item]||meta["_engine"] var cb = meta[item]||meta["_engine"]
cb? can.core.CallFunc(cb, {event: event, can: can, button: item}): can.run(event, [ctx.ACTION, item].concat(can.sup.Input())) cb? can.core.CallFunc(cb, {event: event, can: can, button: item}): can.run(event, [ctx.ACTION, item].concat(can.sup.Input()))
@ -196,7 +203,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
, "", action)}) , "", action)})
return meta return meta
}, },
_output: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event) _output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event)
if (msg.RunAction(event, can, cmds)) { return } if (msg.RunAction(event, can, cmds)) { return }
if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { can.request(event, {action: cmds[1]}) if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { can.request(event, {action: cmds[1]})
@ -205,18 +212,23 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
}) })
} }
can.base.isUndefined(can._daemon) && (can._daemon = can.ondaemon._list.push(can)-1), msg._daemon = msg._daemon||can._daemon if (can.base.isUndefined(msg._daemon)) {
can.base.isUndefined(can._daemon) && can.ondaemon._list[0] && (can._daemon = can.ondaemon._list.push(can)-1)
if (can._daemon) { msg._daemon = can._daemon }
}
return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg
var process = msg._can == can || msg._can == sub var process = msg._can == can || msg._can == sub
if (process && can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return } if (process && can.core.CallFunc([sub, "onimport._process"], {can: sub, msg: msg, cb: cb})) { return }
if (process && can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return } if (process && can.core.CallFunc([can, "onimport._process"], {can: can, msg: msg, cb: cb})) { return }
if (can.base.isFunc(cb) && can.core.CallFunc(cb, {can: can, msg: msg})) { return } if (can.base.isFunc(cb) && can.core.CallFunc(cb, {can: can, msg: msg})) { return }
if (silent) { return } if (silent) { return }
var display = msg.Option(ice.MSG_DISPLAY)||meta.display||meta.feature.display||"/plugin/table.js" can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY)||meta.display||meta.feature.display)
})
Volcanos(display, {_follow: can.core.Keys(can._follow, display), _display: display, _target: can._output, _fields: can._target, },
_output: function(can, msg, display, output) { display = display||"/plugin/table.js", output = output||can._output
Volcanos(display, {_follow: can.core.Keys(can._follow, display), _display: display, _target: output, _fields: can._target,
_option: can._option, _action: can._action, _output: can._output, _status: can._status, _option: can._option, _action: can._action, _output: can._output, _status: can._status,
Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status,
}, [display, "/plugin/table.js"], function(table) { table.Conf(can.Conf()) }, [display, "/plugin/table.js"], function(table) { table.Conf(can.Conf())
@ -225,27 +237,25 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
return can.Update(event, can.Input(cmds, silent), cb, silent) return can.Update(event, can.Input(cmds, silent), cb, silent)
}, can._outputs.push(table), table.sup = can, table._msg = msg }, can._outputs.push(table), table.sup = can, table._msg = msg
table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function(msg) { table.onimport && can.core.CallFunc(table.onimport._init, {can: table, msg: msg, list: msg.result||msg.append||[], cb: function(msg) {
can.page.Modify(can, can._action, ""), can.page.Modify(can, can._status, "") table.onappend._action(table, msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION))
table.onaction && table.onappend._action(table, can.base.Obj(msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION), table.onaction.list)) table.onappend._status(table, msg.Option(ice.MSG_STATUS))
table.onexport && table.onappend._status(table, can.base.Obj(msg.Option(ice.MSG_STATUS), table.onexport.list)) }, target: output})
}, can._output)
})
}) })
}, },
_status: function(can, list, status) { status = status||can._status, can.onmotion.clear(can, status) _status: function(can, list, status) { status = status||can._status, can.onmotion.clear(can, status)
can.core.List(list, function(item) { item = can.base.isObject(item)? item: {name: item} can.core.List(can.base.Obj(list, can.core.Value(can, "onexport.list")), function(item) { item = can.base.isObject(item)? item: {name: item}
can.page.Append(can, status, [{view: can.base.join([html.ITEM, item.name]), title: item.name, list: [ can.page.Append(can, status, [{view: can.base.join([html.ITEM, item.name]), title: item.name, list: [
{text: [item.name, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [(item.value||"")+"", html.SPAN, item.name]}, {text: [item.name, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [(item.value||"")+"", html.SPAN, item.name]},
], }]) ], }])
}) })
}, },
list: function(can, root, cb, target) { list: function(can, root, cb, target) { target = target||can._output
can.core.List(root.list, function(item) { can.core.List(root.list, function(item) {
var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, item.meta.name], onclick: function(event) { var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, item.meta.name], onclick: function(event) {
can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list) can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list)
can.onmotion.select(can, nav, "div.item", event.target) can.onmotion.select(can, target, "div.item", event.target)
}}, {view: html.LIST}]); can.onappend.list(can, item, cb, ui.list) }}, {view: html.LIST}]); can.onappend.list(can, item, cb, ui.list)
}) })
}, },
@ -257,7 +267,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
}]); return ui.first }]); return ui.first
}, },
tree: function(can, list, field, split, cb, target, node) { tree: function(can, list, field, split, cb, target, node) {
node = node || {"": target}; can.core.List(list, function(item) { node = node||{"": target}; can.core.List(list, function(item) {
item[field] && can.core.List(item[field].split(split), function(value, index, array) { if (!value) { return } item[field] && can.core.List(item[field].split(split), function(value, index, array) { if (!value) { return }
var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split) var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split)
@ -306,11 +316,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
if (target.tagName == "INPUT" && target.type == html.BUTTON) { var msg = can.sup.request(event, line, can.Option()) if (target.tagName == "INPUT" && target.type == html.BUTTON) { var msg = can.sup.request(event, line, can.Option())
return can.run(event, [ctx.ACTION, target.name], function(msg) { can.run() }, true) return can.run(event, [ctx.ACTION, target.name], function(msg) { can.run() }, true)
} }
if (key == mdb.HASH && can.user.mod.isDiv) { return can.user.jumps("/chat/div/"+value) }
if (key == mdb.HASH && can.user.mod.isDiv) {
can.user.jumps("/chat/div/"+value)
return
}
can.sup.onaction.change(event, can.sup, key, value) can.sup.onaction.change(event, can.sup, key, value)
}, ondblclick: function(event) { if ([mdb.KEY].indexOf(key) > -1) { return } }, ondblclick: function(event) { if ([mdb.KEY].indexOf(key) > -1) { return }
var item = can.core.List(can.Conf("feature.insert"), function(item) { var item = can.core.List(can.Conf("feature.insert"), function(item) {
@ -324,7 +330,6 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
}, item) }, item)
}} }}
}); table && can.page.Modify(can, table, {className: chat.CONTENT}) }); table && can.page.Modify(can, table, {className: chat.CONTENT})
return sort && can.page.RangeTable(can, table, sort), table return sort && can.page.RangeTable(can, table, sort), table
}, },
board: function(can, text, target) { text && text.Result && (text = text.Result()); if (!text) { return } board: function(can, text, target) { text && text.Result && (text = text.Result()); if (!text) { return }
@ -337,38 +342,6 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
return code.scrollBy(0, 10000), code return code.scrollBy(0, 10000), code
}, },
figure: function(can, meta, target, cb) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return }
var input = meta.action||mdb.KEY; input != "auto" && can.require(["/plugin/input/"+input+".js"], function(can) {
can.core.ItemCB(can.onfigure[input], function(key, on) {
target[key] = function(event) {
can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, [], function(sub) { sub.Conf(meta)
sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option());
(meta.run||can.run)(event, cmds, cb, true)
}
meta.style && sub.page.Modify(sub, sub._target, {style: meta.style})
can.onmotion.float.add(can, chat.INPUT, sub)
on(event, sub, meta, cb, target)
}, document.body)
}
})
})
},
plugin: function(can, meta, cb, target) { meta = meta||{}, meta.index = meta.index||can.core.Keys(meta.ctx, meta.cmd)
var p = can.onengine.plugin.meta[meta.index]
var res = {}; function cbs(sub, meta, skip) { res.__proto__ = sub, cb(sub, meta, skip) }
(meta.meta || meta.inputs && meta.inputs.length > 0)? can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cbs, target):
p? can.onappend._plugin(can, {name: meta.index, help: p.help, meta: p.meta, list: p.list}, meta, function(sub, meta, skip) {
can.base.isFunc(cbs) && cbs(sub, meta, skip)
sub.run = function(event, cmds, cb) {
can.core.CallFunc(p, {msg: can.request(event), cmds: cmds, cb: cb})
}
}, target):
can.run(can.request({}, meta)._event, [ctx.ACTION, ctx.COMMAND, meta.index], function(msg) { msg.Table(function(value) {
can.onappend._plugin(can, value, meta, cbs, target)
}) }, true)
return res
},
_plugin: function(can, value, meta, cb, target) { _plugin: function(can, value, meta, cb, target) {
meta.feature = meta.feature||can.base.Obj(value.meta, {}) meta.feature = meta.feature||can.base.Obj(value.meta, {})
meta.inputs = meta.inputs||can.base.Obj(value.list, []) meta.inputs = meta.inputs||can.base.Obj(value.list, [])
@ -385,45 +358,70 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.base.isFunc(cb) && cb(sub, meta, skip) can.base.isFunc(cb) && cb(sub, meta, skip)
}, target||can._output) }, target||can._output)
}, },
plugin: function(can, meta, cb, target) { meta = meta||{}, meta.index = meta.index||can.core.Keys(meta.ctx, meta.cmd)
var p = can.onengine.plugin.meta[meta.index]
var res = {}; function cbs(sub, meta, skip) { res.__proto__ = sub, cb(sub, meta, skip) }
(meta.meta || meta.inputs && meta.inputs.length > 0)? /* 局部命令 */ can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cbs, target):
p? /* 前端命令 */ can.onappend._plugin(can, {name: meta.index, help: p.help, meta: p.meta, list: p.list}, meta, function(sub, meta, skip) {
sub.run = function(event, cmds, cb) { can.core.CallFunc(p, {msg: can.request(event), cmds: cmds, cb: cb}) }
can.base.isFunc(cbs) && cbs(sub, meta, skip)
}, target): /* 后端命令 */ can.run(can.request({}, meta)._event, [ctx.ACTION, ctx.COMMAND, meta.index], function(msg) { msg.Table(function(value) {
can.onappend._plugin(can, value, meta, cbs, target)
}) }, true)
return res
},
figure: function(can, meta, target, cbs) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return }
var input = meta.action||mdb.KEY; input != ice.AUTO && can.require(["/plugin/input/"+input+".js"], function(can) {
can.core.ItemCB(can.onfigure[input], function(key, on) { target[key] = function(event) { on(event, can, meta, function(cb) {
can.sub? can.base.isFunc(cb) && cb(can.sub, cbs): can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, ["/plugin/input/"+input+".js"], function(sub) { sub.Conf(meta)
sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option());
(meta.run||can.run)(event, cmds, cb, true)
}, can.sub = sub
sub.close = function() { sub.page.Remove(sub, sub._target), delete(can.sub) }
sub.onappend._action(sub, [cli.CLOSE, cli.CLEAR], sub._action, kit.Dict(
cli.CLOSE, function(event) { sub.close() },
cli.CLEAR, function(event) { target.value = "" },
)), sub.onappend._status(sub, [mdb.TOTAL, mdb.INDEX])
meta.style && sub.page.Modify(sub, sub._target, {style: meta.style})
can.base.isFunc(cb) && cb(sub, cbs)
}, document.body)
}, target) } })
})
},
float: function(can, msg, cb) { float: function(can, msg, cb) {
var ui = can.onappend.field(can, "story toast float", {}, document.body) var ui = can.onappend.field(can, "story toast float", {}, document.body)
ui.close = function() { can.page.Remove(can, ui.first), can.onengine.signal(can, "keymap.focus") } ui.close = function() { can.page.Remove(can, ui.first) }
can.onmotion.float.auto(can, ui.output, chat.CARTE, chat.INPUT)
can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) { can.getActionSize(function(left, top, height, width) {
can.page.Modify(can, ui.output, {style: {"max-height": height-28, "max-width": width}}) can.page.Modify(can, ui.output, {style: kit.Dict(html.MAX_HEIGHT, height-28, html.MAX_WIDTH, width)})
can.page.Modify(can, ui.first, {style: {top: top, left: left}}) can.page.Modify(can, ui.first, {style: {left: left, top: top}})
}) })
can.onappend._action(can, [cli.CLOSE, cli.REFRESH, {input: "text", placeholder: "filter", style: {position: ""}, _init: function(input) { can.onappend._action(can, [cli.CLOSE, cli.REFRESH, {input: html.TEXT, placeholder: "filter", _init: function(input) {
can.onengine.signal(can, "keymap.focus", can.request({}, {cb: function(event) { can.onengine.signal(can, "keymap.focus", can.request({}, {cb: function(event) {
if (event.target.tagName == "INPUT") { return } if (event.target.tagName == "INPUT") { return }
if (event.key == lang.ESCAPE) { ui.close(); return } if (event.key == lang.ESCAPE) { ui.close(); return }
if (event.key == ice.SP) { input.focus(), event.stopPropagation(), event.preventDefault() } if (event.key == ice.SP) { input.focus(), event.stopPropagation(), event.preventDefault() }
}})) }}))
}, onkeydown: function(event) { }, onkeydown: function(event) { can.onkeypop.input(event, can)
can.onkeypop.input(event, can)
if (event.key != lang.ENTER) { return } if (event.key != lang.ENTER) { return }
event.target.setSelectionRange(0, -1) event.target.setSelectionRange(0, -1)
can.page.Select(can, ui.output, html.TR, function(tr, index) { if (index == 0) { return } can.page.Select(can, ui.output, html.TR, function(tr, index) { if (index == 0) { return }
can.page.Modify(can, tr, {style: {display: html.NONE}}) can.page.ClassList.add(can, tr, html.HIDDEN)
can.page.Select(can, tr, html.TD, function(td) { can.page.Select(can, tr, html.TD, function(td) { if (td.innerText.indexOf(event.target.value) > -1) {
if (td.innerText.indexOf(event.target.value) > -1) { can.page.ClassList.del(can, tr, html.HIDDEN)
can.page.Modify(can, tr, {style: {display: ""}}) } })
}
})
})
}}], ui.action, {"close": ui.close,
"refresh": function(event) { ui.close(), can.toast.click() },
}) })
}}], ui.action, kit.Dict(cli.CLOSE, ui.close, cli.REFRESH, function(event) { ui.close(), can.toast.click()}))
can.onappend.table(can, msg, function(value, key, index, line, list) { can.onappend.table(can, msg, function(value, key, index, line, list) {
return {text: [value, html.TD], onclick: function(event) { return {text: [value, html.TD], onclick: function(event) {
can.base.isFunc(cb) && cb(value, key, index, line, list) can.base.isFunc(cb) && cb(value, key, index, line, list)
}} }}
}, ui.output) }, ui.output), can.onappend.board(can, msg.Result(), ui.output)
can.onappend.board(can, msg.Result(), ui.output)
return ui return ui
}, },
}, [], function(can) {}) }, [], function(can) {})
@ -468,20 +466,22 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe
background: function(can, url, target) { background: function(can, url, target) {
can.page.Modify(can, target||document.body, {style: {background: url == "" || url == "void"? "": 'url("'+url+'")'}}) can.page.Modify(can, target||document.body, {style: {background: url == "" || url == "void"? "": 'url("'+url+'")'}})
}, },
figure: function(event, can, target, right) { target = target||can._target; if (!event || !event.target) { return } figure: function(event, can, target, right, layout) { target = target||can._target
if (!layout) { if (!event || !event.target) { return }
var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight-5; if (right) { var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight-5; if (right) {
var left = event.clientX-event.offsetX+event.target.offsetWidth, top = event.clientY-event.offsetY var left = event.clientX-event.offsetX+event.target.offsetWidth, top = event.clientY-event.offsetY
} }
if (left+target.offsetWidth>window.innerWidth) { left = window.innerWidth - target.offsetWidth } if (left+target.offsetWidth>window.innerWidth) { left = window.innerWidth - target.offsetWidth }
if (top+target.offsetHeight>window.innerHeight-100) { top = window.innerHeight - target.offsetHeight - 100 } if (top+target.offsetHeight>window.innerHeight-100) { top = window.innerHeight - target.offsetHeight - 100 }
var layout = {left: left, top: top}
layout = {left: left, top: top}
if (layout.left < 0) { layout.left = 0 } if (layout.left < 0) { layout.left = 0 }
if (layout.top < 0) { layout.top = 0 } if (layout.top < 0) { layout.top = 0 }
}
can.page.Modify(can, target, {style: layout}) can.page.Modify(can, target, {style: layout})
can.onmotion.move(can, target, layout) can.onmotion.move(can, target, layout)
return layout
}, },
display: function(can, target) { target = target||can._target display: function(can, target) { target = target||can._target
@ -652,6 +652,15 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
}}]) }}])
}, },
link: function(can, target, text) {
if (target.innerText == "") { target.innerText = target.href }
can.page.Modify(can, target, {target: "_blank"})
},
copy: function(can, target, text) {
target.title = "点击复制", target.onclick = function(event) {
can.user.copy(event, can, text||target.innerText)
}
},
move: function(can, target, layout, cb) { var begin move: function(can, target, layout, cb) { var begin
target.onmousedown = function(event) { target.onmousedown = function(event) {
layout.height = target.offsetHeight, layout.width = target.offsetWidth layout.height = target.offsetHeight, layout.width = target.offsetWidth

View File

@ -37,7 +37,7 @@ Volcanos("core", {help: "数据结构",
// 字符定义 // 字符定义
function _list(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res } function _list(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res }
var space = _list(arg[0]||"\t ,;\n") // 空白符 var space = _list(arg[0]||"\t ,;\n") // 空白符
var block = _list(arg[1]||"{[(.:)]}") // 分隔符 var block = _list(arg[1]||"{[()]}") // 分隔符
var quote = _list(arg[2]||"'\"`") // 引用符 var quote = _list(arg[2]||"'\"`") // 引用符
var trans = _list(arg[3]||"\\") // 转义符 var trans = _list(arg[3]||"\\") // 转义符
@ -174,6 +174,7 @@ Volcanos("core", {help: "数据结构",
}), }),
Timer300ms: function(cb) { this.Timer(300, cb) }, Timer300ms: function(cb) { this.Timer(300, cb) },
Timer300: function(cb) { this.Timer(300, cb) },
Timer3s: function(cb) { this.Timer(3000, cb) }, Timer3s: function(cb) { this.Timer(3000, cb) },
Timer: shy("定时器, value, [1,2,3,4], {interval, length}", function(interval, cb, cbs) { Timer: shy("定时器, value, [1,2,3,4], {interval, length}", function(interval, cb, cbs) {
var timer = {stop: false}; function loop(i) { var timer = {stop: false}; function loop(i) {

View File

@ -208,9 +208,10 @@ Volcanos("page", {help: "用户界面", ClassList: {
}) })
}]) }])
can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) { can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) {
return {type: html.TR, dataset: {index: index}, list: can.core.List(list, function(key) { if (key.indexOf("_") == 0) { return } var _list = can.core.List(list, function(key) { if (key.indexOf("_") == 0) { return }
return cb(can.page.Color(line[key]).trim(), key, index, line, array) return cb(can.page.Color(line[key]).trim(), key, index, line, array)
})} })
return _list.length > 0? {type: html.TR, dataset: {index: index}, list: _list}: undefined
})) }))
return can.page.OrderTable(can, table) return can.page.OrderTable(can, table)
}), }),

View File

@ -37,7 +37,7 @@ Volcanos("user", {help: "用户操作", agent: {
alert: function(text) { alert(JSON.stringify(text)) }, alert: function(text) { alert(JSON.stringify(text)) },
confirm: function(text) { return confirm(JSON.stringify(text)) }, confirm: function(text) { return confirm(JSON.stringify(text)) },
prompt: function(text, cb, def, silent) { (text = silent? def: prompt(text, def||"")) != undefined && typeof cb == lang.FUNCTION && cb(text); return text }, prompt: function(tip, def, cb, silent) { (text = silent? def: prompt(tip, def||"")) != undefined && typeof cb == lang.FUNCTION && cb(text); return text },
reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() }, reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() },
jumps: function(url) { location.href = url }, jumps: function(url) { location.href = url },
open: function(url) { window.open(url) }, open: function(url) { window.open(url) },
@ -65,6 +65,7 @@ Volcanos("user", {help: "用户操作", agent: {
if (can.base.isFunction(text)) { text = text.name||"" } if (can.base.isFunction(text)) { text = text.name||"" }
return can._trans&&can._trans[text] || can.Conf("trans."+text) || can.Conf("feature._trans."+text) || { return can._trans&&can._trans[text] || can.Conf("trans."+text) || can.Conf("feature._trans."+text) || {
"create": "创建", "remove": "删除", "insert": "添加", "delete": "删除", "modify": "编辑", "create": "创建", "remove": "删除", "insert": "添加", "delete": "删除", "modify": "编辑",
"inputs": "补全", "prunes": "清理", "export": "导出", "import": "导入",
"list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享", "list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享",
"edit": "编辑", "save": "保存", "copy": "复制", "show": "显示", "hide": "隐藏", "edit": "编辑", "save": "保存", "copy": "复制", "show": "显示", "hide": "隐藏",
"project": "项目", "profile": "详情", "actions": "参数", "project": "项目", "profile": "详情", "actions": "参数",
@ -218,7 +219,7 @@ Volcanos("user", {help: "用户操作", agent: {
} }
return event.stopPropagation(), event.preventDefault(), carte return event.stopPropagation(), event.preventDefault(), carte
}, },
cartes: function(event, can, meta, list, cb, parent) { carteRight: function(event, can, meta, list, cb, parent) {
var carte = can.user.carte(event, can, meta, list, cb, parent) var carte = can.user.carte(event, can, meta, list, cb, parent)
can.page.Modify(can, carte._target, {style: { can.page.Modify(can, carte._target, {style: {
left: event.clientX-event.offsetX+event.target.offsetWidth-3, left: event.clientX-event.offsetX+event.target.offsetWidth-3,
@ -226,6 +227,11 @@ Volcanos("user", {help: "用户操作", agent: {
}}) }})
return carte return carte
}, },
carteClient: function(event, can, meta, list, cb, parent) {
var ui = can.user.carte(event, can, meta, list, cb, parent)
can.page.Modify(can, ui._target, {style: {left: event.clientX, top: event.clientY}})
},
input: function(event, can, form, cb, button) { // form [ string, array, object, {type: "select", values: []} input: function(event, can, form, cb, button) { // form [ string, array, object, {type: "select", values: []}
var msg = can.request(event) var msg = can.request(event)
var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [ var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [

View File

@ -1,10 +0,0 @@
<!DOCTYPE html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=0.8,user-scalable=no">
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/page/cmd.css">
</head>
<body>
<script src="/page/cmd.js"></script>
<script>cmd()</script>
</body>

View File

@ -9,12 +9,18 @@ a {
h1, h2, h3 { h1, h2, h3 {
clear:both; clear:both;
} }
tr.show {
background:red;
}
h1:hover, h2:hover, h3:hover { h1:hover, h2:hover, h3:hover {
background:green; cursor:pointer; background:green; cursor:pointer;
} }
.hide { .hide {
display:none; display:none;
} }
.hidden {
display:none;
}
div.item { div.item {
cursor:pointer; cursor:pointer;
} }
@ -35,7 +41,7 @@ div.story[data-type=spark] {
box-shadow:4px 4px 10px 1px #626bd0; box-shadow:4px 4px 10px 1px #626bd0;
margin:10px 0px; padding:4px 10px; margin:10px 0px; padding:4px 10px;
border-left:solid 4px blue; border-left:solid 4px blue;
cursor:copy; overflow:auto; cursor:copy;
} }
div.story[data-type=spark] span:hover { div.story[data-type=spark] span:hover {
box-shadow: 4px 4px 10px 1px #29318e; box-shadow: 4px 4px 10px 1px #29318e;

View File

View File

@ -1,21 +0,0 @@
<!DOCTYPE html>
<head>
<link rel="apple-touch-icon-precomposed" href="/publish/app.png"/>
<link rel="apple-touch-startup-image" href="/publish/splash.png"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/>
<meta name="viewport" content="width=device-width,initial-scale=0.8,user-scalable=no">
<meta charset="utf-8">
<title>volcanos</title>
<link rel="shortcut icon" type="image/ico" href="/favicon.ico">
<link rel="stylesheet" type="text/css" href="/page/index.css">
<link rel="stylesheet" type="text/css" href="/page/share.css">
</head>
<body>
<script src="/proto.js"></script>
<script src="/frame.js"></script>
<script src="/page/share.js"></script>
</body>

View File

@ -1,24 +0,0 @@
Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js",
libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], panels: [
{name: "Header", help: "标题栏", pos: "head", state: ["time", "username", "avatar"]},
{name: "Search", help: "搜索框", pos: "auto"},
{name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]},
{name: "Action", help: "工作台", pos: "main"},
{name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]},
], main: {name: "Header"}, river: {
"serivce": {name: "运营群", storm: {
"wx": {name: "公众号 wx", action: [
{name: "微信公众号", help: "wx", index: "web.wiki.word", args: ["usr/icebergs/misc/wx/wx.shy"]},
]},
"mp": {name: "小程序 mp", action: [
{name: "微信小程序", help: "mp", index: "web.wiki.word", args: ["usr/icebergs/misc/mp/mp.shy"]},
]},
"lark": {name: "机器人 lark", action: [
{name: "飞书机器人", help: "lark", index: "web.wiki.word", args: ["usr/icebergs/misc/lark/lark.shy"]},
]},
"share": {name: "上下文 share", action: [
{name: "系统上下文", help: "shylinux/contexts", index: "web.wiki.word", args: ["usr/learning/社会/管理/20200724.shy"]},
]},
}},
},
})

View File

@ -75,3 +75,22 @@ fieldset.Action div.output fieldset.plugin legend {
fieldset.Action div.output fieldset.plugin legend:hover { fieldset.Action div.output fieldset.plugin legend:hover {
background:red; background:red;
} }
fieldset.panel.cmd>div.legend {
display:none;
}
fieldset.panel.cmd>div.output>fieldset.plugin {
margin:0; padding:0;
}
fieldset.panel.cmd>div.output>fieldset.plugin>legend {
display:none;
}
fieldset.panel.cmd>div.output>fieldset.plugin>div.legend {
float:left; padding:0 10px; margin-right:3px;
height:25px; font-size:18px;
background-color:darkcyan;
cursor:pointer;
}
body.white fieldset.panel.cmd>div.output>fieldset.plugin>div.legend {
background-color:honeydew;
}

View File

@ -1,7 +1,7 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) { Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) {
var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM) var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM)
can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { item.type = chat.PLUGIN can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { item.type = chat.PLUGIN
item.height = parseInt(can.Conf(html.HEIGHT))-40, item.width = parseInt(can.Conf(html.WIDTH))-40 item.height = parseInt(can.Conf(html.HEIGHT))-240, item.width = parseInt(can.Conf(html.WIDTH))-40
item.feature = can.base.Obj(item.feature||item.meta), item.inputs = can.base.Obj(item.inputs||item.list) item.feature = can.base.Obj(item.feature||item.meta), item.inputs = can.base.Obj(item.inputs||item.list)
can.onappend.plugin(can, item, function(sub, meta, skip) { can.onappend.plugin(can, item, function(sub, meta, skip) {
@ -46,7 +46,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg)
can.user.title(can.misc.Search(can, chat.TITLE)||msg.Option(chat.TITLE)) can.user.title(can.misc.Search(can, chat.TITLE)||msg.Option(chat.TITLE))
can.onaction.layout(can, "auto") can.onaction.layout(can, "auto")
if (msg[mdb.INDEX].length == 1) { can.require(["/panel/cmd.css"]) if (msg[mdb.INDEX].length == 1) {
can.user.mod.isCmd = true, can.page.ClassList.add(can, can._target, "cmd") can.user.mod.isCmd = true, can.page.ClassList.add(can, can._target, "cmd")
can.page.Select(can, document.body, "fieldset.panel", function(item) { can.page.Select(can, document.body, "fieldset.panel", function(item) {
item != can._target && can.onmotion.hidden(can, item) item != can._target && can.onmotion.hidden(can, item)
@ -61,6 +61,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg)
}, },
}) })
Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, page, msg, can, cmds, cb) { Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, page, msg, can, cmds, cb) {
if (!can._root.river) { return false }
var list = can._root.river; var river = list[cmds[0]] var list = can._root.river; var river = list[cmds[0]]
var storm = river && river.storm[cmds[1]] var storm = river && river.storm[cmds[1]]
if (!storm || cmds.length != 2) { return false } if (!storm || cmds.length != 2) { return false }
@ -91,6 +92,22 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg,
can.onimport._share(can, can.misc.Search(can, web.SHARE)) can.onimport._share(can, can.misc.Search(can, web.SHARE))
can.onkeypop._init(can) can.onkeypop._init(can)
}, },
onlogin: function(can) { if (!can.user.mod.isCmd) { return }
can.page.ClassList.add(can, can._target, "cmd")
can._names = location.pathname
can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(item, next) {
can.core.Timer(500, function() { can.onaction._plugin(can, item, next) })
}): can.run(can.request()._event, [ctx.ACTION, ctx.COMMAND], function(msg) {
can.core.Next(msg.Table(), function(item, next) {
can.onaction._plugin(can, item, next)
})
})
},
_plugin: function(can, item, next) {
can.base.Copy(item, {height: window.innerHeight, width: window.innerWidth, opts: can.misc.Search(can)})
can.onappend.plugin(can, item, function(sub, meta) { can.user.title(meta.name), next() })
},
onstorm_select: function(can, msg, river, storm) { can.onlayout._init(can) onstorm_select: function(can, msg, river, storm) { can.onlayout._init(can)
function key(name) { return can.core.Keys(can.Conf(chat.RIVER), can.Conf(chat.STORM), name) } function key(name) { return can.core.Keys(can.Conf(chat.RIVER), can.Conf(chat.STORM), name) }
can.page.Cache(key(html.ACTION), can._action, can._output.scrollTop+1) can.page.Cache(key(html.ACTION), can._action, can._output.scrollTop+1)

View File

@ -1,18 +0,0 @@
fieldset.panel.cmd>div.legend {
display:none;
}
fieldset.panel.cmd>div.output>fieldset.plugin {
margin:0; padding:0;
}
fieldset.panel.cmd>div.output>fieldset.plugin>legend {
display:none;
}
fieldset.panel.cmd>div.output>fieldset.plugin>div.legend {
float:left; padding:0 10px; margin-right:3px;
height:25px; font-size:18px;
background-color:darkcyan;
cursor:pointer;
}
body.white fieldset.panel.cmd>div.output>fieldset.plugin>div.legend {
background-color:honeydew;
}

View File

@ -1,20 +0,0 @@
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) {
can.page.ClassList.add(can, can._target, "Action")
can.base.isFunc(cb) && cb()
},
onlogin: function(can) { can._names = location.pathname
can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(item, next) {
can.core.Timer(500, function() { can.onaction._plugin(can, item, next) })
}): can.run(can.request()._event, [ctx.ACTION, ctx.COMMAND], function(msg) {
can.core.Next(msg.Table(), function(item, next) {
can.onaction._plugin(can, item, next)
})
})
},
_plugin: function(can, item, next) {
can.base.Copy(item, {height: window.innerHeight, width: window.innerWidth, opts: can.misc.Search(can)})
can.onappend.plugin(can, item, function(sub, meta) { can.user.title(meta.name), next() })
},
})

View File

@ -72,7 +72,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
msg.Option(aaa.BACKGROUND) && can.onlayout.background(can, "/share/local/background", document.body) msg.Option(aaa.BACKGROUND) && can.onlayout.background(can, "/share/local/background", document.body)
}, },
_avatar: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } _avatar: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return }
msg.Option(aaa.AVATAR) && can.page.Modify(can, "div.output div.state.avatar>img", {src: "/share/local/avatar"}) msg.Option(aaa.AVATAR) && can.page.Modify(can, "div.state.avatar>img", {src: "/share/local/avatar"})
}, },
_menus: function(can, msg, target) { _menus: function(can, msg, target) {
var menus = can.base.Obj(msg.Option(chat.MENUS)||can.Conf(chat.MENUS), [chat.HEADER, ["setting", chat.BLACK, chat.WHITE, chat.PRINT]]) var menus = can.base.Obj(msg.Option(chat.MENUS)||can.Conf(chat.MENUS), [chat.HEADER, ["setting", chat.BLACK, chat.WHITE, chat.PRINT]])
@ -87,7 +87,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.core.Timer({interval: 500}, function() { can.onimport.time(can, target) }) can.core.Timer({interval: 500}, function() { can.onimport.time(can, target) })
can.onappend.figure(can, {action: "date", style: {"min-width": 306}}, target, function(sub) { can.onappend.figure(can, {action: "date", style: {"min-width": 306}}, target, function(sub) {
can.get("Action", "size", function(msg, top) { can.get("Action", "size", function(msg, top) {
can.page.Modify(can, sub._target, {style: {top: top, left: window.innerWidth-sub._target.offsetWidth}}) can.page.Modify(can, sub._target, {style: {top: top, right: 0, left: null}})
}) })
}), target.onmouseenter = target.click }), target.onmouseenter = target.click
}, },

View File

@ -101,7 +101,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg,
}, },
carte: function(event, can, list, cb) { carte: function(event, can, list, cb) {
can.user.cartes(event, can, can.ondetail, list, cb) can.user.carteRight(event, can, can.ondetail, list, cb)
}, },
storm: function(event, can, river) { can.sublist = can.sublist||{} storm: function(event, can, river) { can.sublist = can.sublist||{}
can.onmotion.select(can, can._output, "div.item", can.river_list[river]) can.onmotion.select(can, can._output, "div.item", can.river_list[river])

View File

@ -1,6 +1,3 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) {
},
})
Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, list, cb, target) { Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, list, cb, target) {
can.base.isFunc(cb) && cb(); switch (meta.type) { can.base.isFunc(cb) && cb(); switch (meta.type) {
case html.SELECT: meta.value && (target.value = meta.value); break case html.SELECT: meta.value && (target.value = meta.value); break
@ -23,18 +20,18 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta,
onchange: function(event, can) { onchange: function(event, can) {
if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) } if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) }
}, },
onkeydown: function(event, can) { onkeydown: function(event, can) { can.onkeypop.input(event, can, event.target)
if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } } if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } }
can.onkeypop.input(event, can, event.target); switch (event.key) { if (event.key == lang.ENTER) {
case lang.ENTER: can.run(event), event.target.setSelectionRange(0, -1)
switch (can.Conf(mdb.TYPE)) { event.stopPropagation(), event.preventDefault()
case html.TEXTAREA: if (!event.ctrlKey) { return } } if (!event.ctrlKey) { return }
case html.TEXT: event.target.setSelectionRange(0, -1); break
}; can.run(event), event.stopPropagation(), event.preventDefault(); break switch (event.key) {
case "b": if (event.ctrlKey) { can.CloneInput() } break case "b": can.CloneInput(); break
case "m": if (event.ctrlKey) { can.CloneField(), event.stopPropagation(), event.preventDefault() } break case "m": can.CloneField(); break
} default: return
} event.stopPropagation(), event.preventDefault()
}, },
}) })
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -1,7 +1,7 @@
fieldset.input.date div.action div.space { fieldset.input.date div.action div.space {
clear:both; width:0; clear:both; width:0;
} }
fieldset.input.date div.output td.last { fieldset.input.date div.output td.prev {
color:gray; color:gray;
} }
fieldset.input.date div.output td.next { fieldset.input.date div.output td.next {

View File

@ -1,16 +1,13 @@
Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(event, can, meta, cb, target) { Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) {
function set(now) { target.value = can.user.time(can, now), can.page.Remove(can, can._target) function set(now) { target.value = can.user.time(can, now), can.close(), meta && meta.action == ice.AUTO && can.run({}) }
meta && meta.action == ice.AUTO && can.run({})
}
// 添加控件 // 添加控件
var now = target.value? new Date(target.value): new Date() var now = target.value? new Date(target.value): new Date()
can.onappend._action(can, [cli.CLOSE, can.onmotion.clear(can, can._action), can.onappend._action(can, [cli.CLOSE,
["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)), ["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)),
"今天", "", "上一月", ["year"].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)), "今天", "", "上一月", ["year"].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)),
["month"].concat(can.core.List(1, 13)), "下一月", ["month"].concat(can.core.List(1, 13)), "下一月",
], can._action, { ], can._action, { close: function(event) { can.close() },
close: function(event) { can.page.Remove(can, can._target) },
"hour": function(event, can, key, value) { now.setHours(parseInt(value)||0), show(now) }, "hour": function(event, can, key, value) { now.setHours(parseInt(value)||0), show(now) },
"minute": function(event, can, key, value) { now.setMinutes(parseInt(value)||0), show(now) }, "minute": function(event, can, key, value) { now.setMinutes(parseInt(value)||0), show(now) },
"second": function(event, can, key, value) { now.setSeconds(parseInt(value)||0), show(now) }, "second": function(event, can, key, value) { now.setSeconds(parseInt(value)||0), show(now) },
@ -26,11 +23,12 @@ Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(e
"后一年": function(event) { now.setFullYear(now.getFullYear()+1), show(now) }, "后一年": function(event) { now.setFullYear(now.getFullYear()+1), show(now) },
}) })
can._table = can.page.Append(can, can._output, [{view: [chat.CONTENT, html.TABLE]}]).first can.onmotion.clear(can, can._status)
can._table = can.page.Appends(can, can._output, [{view: [chat.CONTENT, html.TABLE]}]).first
var today = new Date(); function show(now) { var today = new Date(); function show(now) {
// 设置控件 // 设置控件
can.Action("month", now.getMonth()+1)
can.Action("year", now.getFullYear()) can.Action("year", now.getFullYear())
can.Action("month", now.getMonth()+1)
can.Action("hour", now.getHours()) can.Action("hour", now.getHours())
can.Action("minute", parseInt(now.getMinutes()/5)*5) can.Action("minute", parseInt(now.getMinutes()/5)*5)
can.Action("second", parseInt(now.getSeconds()/5)*5) can.Action("second", parseInt(now.getSeconds()/5)*5)
@ -52,11 +50,11 @@ Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(e
var tail = new Date(end); tail.setDate(end.getDate()+7-end.getDay()) var tail = new Date(end); tail.setDate(end.getDate()+7-end.getDay())
// 时间序列 // 时间序列
for (var day = new Date(head); day < one; day.setDate(day.getDate()+1)) {add(day, "last")} for (var day = new Date(head); day < one; day.setDate(day.getDate()+1)) { add(day, mdb.PREV) }
for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) {add(day, "main")} for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) { add(day, mdb.MAIN) }
for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) {add(day, "next")} for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) { add(day, mdb.NEXT) }
return can.onlayout.figure(event, can), can.base.isFunc(cb) && cb(can), now return now
}; show(now) } show(now), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can)
}} }, ["/plugin/input/date.css"]) })}} }, [""])

View File

@ -1,22 +1,67 @@
Volcanos("onfigure", {help: "控件详情", list: [], key: {onclick: function(event, can, meta, cb, target) { Volcanos("onfigure", {help: "控件详情", list: [], key: {
can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { _init: function(can, msg, target) { var call = arguments.callee
if (msg.Length() == 0) { return can.page.Remove(can, can._target) } can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, line) {
return {text: [value, html.TD], onclick: function(event) { target.value = line[key]
can.onappend._action(can, [cli.CLOSE, cli.CLEAR], can._action, { if (msg.Option(ice.MSG_PROCESS) != ice.PROCESS_AGAIN) { return can.close() }
close: function(event) { can.page.Remove(can, can._target) }, can.run(event, [ctx.ACTION, mdb.INPUTS, can.Conf(mdb.NAME), target.value], function(msg) {
clear: function(event) { target.value = "" }, call(can, msg, target)
}) })
function show(msg) { can.onmotion.clear(can)
can.onappend.table(can, msg, function(value, key, index, line) {
return {text: [value, html.TD], onclick: function() { target.value = line[key]
msg.Option(ice.MSG_PROCESS) == ice.PROCESS_AGAIN? can.run({}, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) {
show(msg)
}): can.page.Remove(can, can._target)
}} }}
}), can.Status(mdb.COUNT, msg.Length())
}
show(msg), can.onlayout.figure(event, can)
}) })
}}}) },
_select: function(event, can, target) {
function select(order) { if (order == 0) { target.value = target._value }
var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) {
if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return }
can.page.ClassList.del(can, tr, html.SELECT); if (order != index++) { return tr }
can.page.ClassList.add(can, tr, html.SELECT), can.page.Select(can, tr, html.TD, function(td, index) {
target._value = target._value||target.value, index == 0 && (target.value = td.innerText)
}); return tr
}).length
}
switch (event.key) {
case "n":
var total = select(target._index)
select(target._index = ((target._index)+1) % total)
break
case "p":
var total = select(target._index)
select(target._index = (target._index-1) < 0? total-1: (target._index-1))
break
default: target._index = 0, target._value = ""
}
},
onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) {
can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) {
if (msg.Length() == 0) { return can.close() }
can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length())
target._msg = msg, target._figure = can.onlayout.figure(event, can)
can.base.isFunc(cbs) && cbs(can)
})
}) },
onkeydown: function(event, can, meta, cb, target) {
var msg = target._msg; msg && cb(function(can, cbs) {
if (event.ctrlKey) { can.onfigure.key._select(event, can, target) } else {
target._index = 0, target._value = ""
switch (event.key) { case lang.ENTER: can.close(); return }
can.page.Select(can, can._output, html.TR, function(tr, index) {
var has = false; can.page.Select(can, tr, html.TD, function(td) {
has = has || td.innerText.indexOf(target.value)>-1
}), can.page.ClassList.set(can, tr, html.HIDDEN, !has && index != 0)
})
}
can.onlayout.figure(event, can, can._target, false, target._figure)
var total = can.page.Select(can, can._output, html.TR, function(tr) {
if (!can.page.ClassList.has(can, tr, html.HIDDEN)) { return tr}
}).length-1
can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index))
can.base.isFunc(cbs) && cbs(can)
})
if (event.ctrlKey && ["n", "p"].indexOf(event.key) > -1) {
return event.stopPropagation(), event.preventDefault()
} can.onaction.onkeydown(event, can)
},
}})

View File

@ -1,15 +1,9 @@
Volcanos("onfigure", {help: "控件详情", list: [], province: {onclick: function(event, can, meta, cb, target) { Volcanos("onfigure", {help: "控件详情", list: [], province: {onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) {
can.require(["/require/shylinux.com/x/echarts/echarts.js", "/require/shylinux.com/x/echarts/china.js"], function() { can.require(["/require/shylinux.com/x/echarts/echarts.js", "/require/shylinux.com/x/echarts/china.js"], function() {
can.onappend._action(can, [cli.CLOSE, cli.CLEAR], can._action, { var china_chart = echarts.init(can.page.Append(can, can._output, [{type: html.DIV, style: {width: 600, height: 400}}]).first)
close: function(event) { can.page.Remove(can, can._target) }, china_chart.setOption({geo: {map: 'china'}}), china_chart.on(html.CLICK, function (params) {
clear: function(event) { target.value = "" }, target.value = params.name, can.close()
}), can.Status(mdb.TOTAL, 34), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can)
}) })
}) }}, })
var china_chart = echarts.init(can.page.Append(can, can._output, [{type: html.DIVk, style: {width: "600px", height: "400px"}}]).first)
china_chart.setOption({geo: {map: 'china'}}), china_chart.on('click', function (params) {
target.value = params.name, can.page.Remove(can, can._target)
}), can.Status(mdb.COUNT, 34)
can.onlayout.figure(event, can)
})
}}, })

View File

@ -40,7 +40,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
return (name || target == can.svg) && can.onappend.item(can, html.ITEM, {name: name||html.SVG}, function(event) { show(event) return (name || target == can.svg) && can.onappend.item(can, html.ITEM, {name: name||html.SVG}, function(event) { show(event)
can.onaction.show(event, can) can.onaction.show(event, can)
}, function(event) { }, function(event) {
can.user.cartes(event, can, can.onaction, [ice.HIDE, ice.SHOW, mdb.CREATE, cli.CLEAR, mdb.REMOVE]) can.user.carteRight(event, can, can.onaction, [ice.HIDE, ice.SHOW, mdb.CREATE, cli.CLEAR, mdb.REMOVE])
}, can.ui.project) }, can.ui.project)
}, },
_block: function(can, target) { _block: function(can, target) {
@ -286,7 +286,7 @@ Volcanos("onaction", {help: "组件菜单", list: [
show: function(event, can) { can.onmotion.show(can, {interval: 100, length: 10}, null, can.group) }, show: function(event, can) { can.onmotion.show(can, {interval: 100, length: 10}, null, can.group) },
hide: function(event, can) { can.onmotion.hide(can, {interval: 100, length: 10}, null, can.group) }, hide: function(event, can) { can.onmotion.hide(can, {interval: 100, length: 10}, null, can.group) },
create: function(event, can) { create: function(event, can) {
can.user.prompt("group", function(name) { can.user.prompt("group", "some", function(name) {
var group = document.createElementNS('http://www.w3.org/2000/svg', svg.G) var group = document.createElementNS('http://www.w3.org/2000/svg', svg.G)
can.group.append(group), can.onimport._block(can, group) can.group.append(group), can.onimport._block(can, group)
group.Value(html.CLASS, name), can.core.List([html.STROKE_WIDTH, html.STROKE, html.FILL, html.FONT_SIZE], function(name) { group.Value(html.CLASS, name), can.core.List([html.STROKE_WIDTH, html.STROKE, html.FILL, html.FONT_SIZE], function(name) {
@ -425,7 +425,7 @@ Volcanos("ondetail", {help: "组件详情", list: [cli.START, ice.RUN, ice.COPY,
var def = target.Value(mdb.TEXT); def && can.page.Select(can, can.svg, ice.PT+def, function(item) { var def = target.Value(mdb.TEXT); def && can.page.Select(can, can.svg, ice.PT+def, function(item) {
def = item.Value(html.INNER) def = item.Value(html.INNER)
}) })
can.user.prompt(html.LABEL, function(text) { can.user.prompt(html.LABEL, def, function(text) {
if (target.tagName == html.TEXT) { return target.innerHTML = text } if (target.tagName == html.TEXT) { return target.innerHTML = text }
if (def && can.page.Select(can, can.svg, ice.PT+def, function(item) { if (def && can.page.Select(can, can.svg, ice.PT+def, function(item) {
@ -438,7 +438,7 @@ Volcanos("ondetail", {help: "组件详情", list: [cli.START, ice.RUN, ice.COPY,
var data = can.onexport._text(can, target, figure, {inner: text}) var data = can.onexport._text(can, target, figure, {inner: text})
var item = can.onfigure._push(can, html.TEXT, data, target.Group()) var item = can.onfigure._push(can, html.TEXT, data, target.Group())
target.Value(mdb.TEXT, can.onfigure._pid(can, item)) target.Value(mdb.TEXT, can.onfigure._pid(can, item))
}, def) })
}, },
modify: function(event, can) { can.onimport._profile(can, event.target) }, modify: function(event, can) { can.onimport._profile(can, event.target) },
"delete": function(event, can) { var target = event.target "delete": function(event, can) { var target = event.target

View File

@ -104,7 +104,7 @@ fieldset.word.float>div.output {
overflow:auto; overflow:auto;
padding:20px; padding:20px;
} }
fieldset.word.float div.project { fieldset.word.float>div.output>div.project {
background:cornsilk; background:cornsilk;
left:0; top:25px; left:0; top:25px;
position:fixed; position:fixed;
@ -116,7 +116,7 @@ fieldset.word.float div.content div.page {
margin-top:30px; margin-top:30px;
display:none; display:none;
} }
fieldset.word.float div.content div.page.select { fieldset.word.float div.content div.page.show {
display:block; display:block;
} }
fieldset.word.float div.content.grid div.page { fieldset.word.float div.content.grid div.page {

View File

@ -1,4 +1,4 @@
Volcanos("onimport", {H6help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target) {
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
if (msg.Length() > 0) { return can.onappend.table(can, msg) } if (msg.Length() > 0) { return can.onappend.table(can, msg) }
@ -6,39 +6,32 @@ Volcanos("onimport", {H6help: "导入数据", list: [], _init: function(can, msg
can.page.Select(can, target, ".story", function(item) { var data = item.dataset||{} can.page.Select(can, target, ".story", function(item) { var data = item.dataset||{}
can.core.CallFunc([can.onimport, data.type], [can, data, item]) can.core.CallFunc([can.onimport, data.type], [can, data, item])
can.page.Modify(can, item, {style: can.base.Obj(data.style)}) can.page.Modify(can, item, {style: can.base.Obj(data.style)})
}), can.onimport._navmenu(can) })
},
_navmenu: function(can) { if (!can.sup._navmenu) { return }
if (can.user.mod.isCmd) { can.page.ClassList.add(can, can._fields, "cmd")
can.Conf(html.WIDTH, can.Conf(html.WIDTH)-can.sup._navmenu.offsetWidth-10)
can.page.Modify(can, can.sup._navmenu, {style: {height: window.innerHeight}})
can.page.Modify(can, can._output, {style: {"max-width": can.Conf(html.WIDTH)}})
can.page.Modify(can, can._output, {style: {height: window.innerHeight}})
} else {
can.Conf(html.WIDTH, can.Conf(html.WIDTH)-can.sup._navmenu.offsetWidth-20)
can.page.Modify(can, can.sup._navmenu, {style: {height: window.innerHeight-240}})
can.page.Modify(can, can._output, {style: {height: window.innerHeight-240}})
}
}, },
navmenu: function(can, data, target) { var nav = can.sup._navmenu navmenu: function(can, data, target) { var nav = can.sup._navmenu
nav = nav||can.page.Append(can, can._fields, [{view: "navmenu"}]).first nav = nav||can.page.Append(can, can._fields, [{view: wiki.NAVMENU}]).first
can.onmotion.clear(can, nav), can._fields.insertBefore(nav, can._output) can.onmotion.clear(can, nav), can._fields.insertBefore(nav, can._output)
can.sup._navmenu = nav
can.page.Modify(can, can._output, {style: {float: html.LEFT, clear: html.NONE}})
can.page.Modify(can, nav, {style: {height: can.Conf(html.HEIGHT)}})
can.onappend.list(can, can.base.Obj(data.data), function(event, item) { can.onappend.list(can, can.base.Obj(data.data), function(event, item) {
var link = item.meta.link, cmd = link.split(ice.PS).pop() var link = item.meta.link, list = can.core.Split(item.meta.link)
if (can.onaction[cmd]) { return can.onaction[cmd](event, can) } if (can.core.Value(can, list[0])) { return can.core.CallFunc([can, list[0]], list.slice(1)) }
if (!link || link == can.Option(nfs.PATH)) { return } if (!link || link == can.Option(nfs.PATH)) { return false }
can.page.Cache(can.Option(nfs.PATH), can._output, "some") can.page.Cache(can.Option(nfs.PATH), can._output, can._output.scrollTop+1)
can.Option(nfs.PATH, link) can.Option(nfs.PATH, link), can.user.mod.isCmd && can.user.title(item.meta.name)
var some = can.page.Cache(can.Option(nfs.PATH), can._output) var position = can.page.Cache(can.Option(nfs.PATH), can._output)
if (!some) { can.sup.Update(event, [link]) } if (position) { can._output.scrollTo(0, position-1); return true }
can.user.title(item.meta.name)
can.sup.Update(event, [link])
return true return true
}, nav) }, nav), can.sup._navmenu = nav
can.Conf(html.WIDTH, can.Conf(html.WIDTH)-nav.offsetWidth-(can.user.mod.isCmd? 10: 20))
can.page.Modify(can, can._output, {style: kit.Dict(
html.HEIGHT, can.sup._navmenu.offsetHeight, html.MAX_WIDTH, can.Conf(html.WIDTH),
html.FLOAT, html.LEFT, html.CLEAR, html.NONE
)})
}, },
premenu: function(can, data, target) { premenu: function(can, data, target) {
can.page.Select(can, can._output, "h2.story, h3.story", function(item) { can.page.Select(can, can._output, "h2.story, h3.story", function(item) {
@ -51,54 +44,34 @@ Volcanos("onimport", {H6help: "导入数据", list: [], _init: function(can, msg
can.user.mod.isCmd && can.user.title(data.text) can.user.mod.isCmd && can.user.title(data.text)
}, },
spark: function(can, data, target) { spark: function(can, data, target) {
if (data[mdb.NAME] == html.INNER) { if (data[mdb.NAME] == html.INNER) { return can.onmotion.copy(can, target) }
target.title = "点击复制", target.onclick = function(event) { can.page.Select(can, target, html.A, function(item) { can.onmotion.link(can, item) })
can.user.copy(event, can, target.innerText) can.page.Select(can, target, html.SPAN, function(item) { can.onmotion.copy(can, item) })
}
return
}
can.page.Select(can, target, html.SPAN, function(item) {
item.title = "点击复制", item.onclick = function(event) {
can.user.copy(event, can, item.innerText)
}
})
can.page.Select(can, target, html.A, function(item) {
if (item.innerText == "") { item.innerText = item.href }
can.page.Modify(can, item, {target: "_blank"})
})
}, },
chart: function(can, data, target) { chart: function(can, data, target) {
target.oncontextmenu = function(event) { target.oncontextmenu = function(event) {
var ui = can.user.carte(event, can, kit.Dict(mdb.EXPORT, function(event, can, button) { can.user.carteClient(event, can, kit.Dict(mdb.EXPORT, function(event, can, button) {
can.user.toPNG(can, can.user.prompt("file name", null, "hi.png"), target.outerHTML, can.user.toPNG(can, can.user.prompt("please input file name", "hi")+".png", target.outerHTML,
parseInt(target.getAttribute(html.HEIGHT)), parseInt(target.getAttribute(html.WIDTH))) parseInt(target.getAttribute(html.HEIGHT))||200, parseInt(target.getAttribute(html.WIDTH))||200)
}), [mdb.EXPORT]) }), [mdb.EXPORT])
can.page.Modify(can, ui._target, {style: {left: event.clientX, top: event.clientY}})
} }
}, },
table: function(can, data, target) { table: function(can, data, target) {
can.page.OrderTable(can, target) can.page.OrderTable(can, target), can.page.ClassList.add(can, target, chat.CONTENT)
can.page.ClassList.add(can, target, chat.CONTENT) can.page.Select(can, target, html.TD, function(item) { can.onmotion.copy(can, item) })
can.page.Select(can, target, html.TD, function(item) {
item.title = "点击复制", item.onclick = function(event) {
can.user.copy(event, can, item.innerText)
}
})
}, },
field: function(can, data, target, width) { var item = can.base.Obj(data.meta) field: function(can, data, target, width) { var item = can.base.Obj(data.meta)
can.onappend._init(can, item, ["/plugin/state.js"], function(sub) { can.onappend._init(can, item, ["/plugin/state.js"], function(sub) {
sub.run = function(event, cmds, cb, silent) { sub.run = function(event, cmds, cb, silent) {
can.run(event, can.misc.concat([ctx.ACTION, chat.STORY, data.type, data.name, data.text], cmds), cb, true) can.run(event, can.misc.concat([ctx.ACTION, chat.STORY, data.type, data.name, data.text], cmds), cb, true)
} }, sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20)
sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20)
can.core.Value(item, "auto.cmd") && can.core.Timer(100, function() { can.core.Value(item, "auto.cmd") && can.core.Timer300ms(function() {
var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option("_handle", "true") var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option("_handle", ice.TRUE)
sub.Update(msg._event, [ctx.ACTION, can.core.Value(item, "auto.cmd")]) sub.Update(msg._event, [ctx.ACTION, can.core.Value(item, "auto.cmd")])
}) })
}, can._output, target) }, can._output, target)
}, },
iframe: function(can, data, target) { var meta = can.base.Obj(data.meta) iframe: function(can, data, target) { var meta = can.base.Obj(data.meta)
can.page.Modify(can, target, {width: can.Conf(html.WIDTH)-200}) can.page.Modify(can, target, {width: can.Conf(html.WIDTH)-200})
}, },
@ -106,15 +79,15 @@ Volcanos("onimport", {H6help: "导入数据", list: [], _init: function(can, msg
Volcanos("onkeypop", {help: "键盘交互", list: [], Volcanos("onkeypop", {help: "键盘交互", list: [],
_mode: { _mode: {
normal: { normal: {
"n": function(event, can) { can.onaction.next(can.sub) }, "n": function(event, can) { can.ondetail.next(can.sub) },
"j": function(event, can) { can.onaction.next(can.sub) }, "j": function(event, can) { can.ondetail.next(can.sub) },
"ArrowRight": function(event, can) { can.onaction.next(can.sub) }, "ArrowRight": function(event, can) { can.ondetail.next(can.sub) },
"ArrowLeft": function(event, can) { can.onaction.prev(can.sub) }, "ArrowLeft": function(event, can) { can.ondetail.prev(can.sub) },
"k": function(event, can) { can.onaction.prev(can.sub) }, "k": function(event, can) { can.ondetail.prev(can.sub) },
"p": function(event, can) { can.onaction.prev(can.sub) }, "p": function(event, can) { can.ondetail.prev(can.sub) },
"q": function(event, can) { can.onaction["结束"](event, can.sub) }, "q": function(event, can) { can.ondetail["结束"](event, can.sub) },
"h": function(event, can) { can.onaction["隐藏"](event, can.sub) }, "h": function(event, can) { can.ondetail["隐藏"](event, can.sub) },
}, },
}, _engine: {}, }, _engine: {},
}) })
@ -136,7 +109,7 @@ Volcanos("onaction", {help: "控件交互", list: [],
["布局", "开讲", "快闪", "网格"], "大纲", "首页", "上一页", ["布局", "开讲", "快闪", "网格"], "大纲", "首页", "上一页",
["菜单"].concat(can.core.List(list, function(page) { return page[0].innerHTML })), ["菜单"].concat(can.core.List(list, function(page) { return page[0].innerHTML })),
"下一页", "隐藏", "结束", "下一页", "隐藏", "结束",
], sub._action, can.onaction) ], sub._action, can.ondetail)
can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) { can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) {
can.keylist = can.onkeypop._parse(event, can, "normal", can.keylist) can.keylist = can.onkeypop._parse(event, can, "normal", can.keylist)
@ -149,76 +122,72 @@ Volcanos("onaction", {help: "控件交互", list: [],
can.core.List(sub.list = list, function(page, index) { can.core.List(sub.list = list, function(page, index) {
can.onappend.item(can, html.ITEM, {name: page[0].innerHTML}, function(event) { can.onappend.item(can, html.ITEM, {name: page[0].innerHTML}, function(event) {
can.onaction.show(sub, index) can.ondetail.show(sub, index)
}, function(event) {}, sub.ui.project) }, function(event) {}, sub.ui.project)
sub.page.Append(sub, sub.ui.content, [{view: "page"+(index==0? " first": ""), list: can.core.List(page, function(item) { var data = item.dataset||{} sub.page.Append(sub, sub.ui.content, [{view: "page"+(index==0? " first": ""), list: can.core.List(page, function(item) { var data = item.dataset||{}
switch (data.type) { switch (data.type) {
case "premenu": item = item.cloneNode(false); break case wiki.PREMENU: item = item.cloneNode(false); break
case chat.FIELD: item = can.onappend.field(can, chat.STORY, can.base.Obj(data.meta), sub.ui.content).first; break case chat.FIELD: item = can.onappend.field(can, chat.STORY, can.base.Obj(data.meta), sub.ui.content).first; break
default: item = item.cloneNode(true) default: item = item.cloneNode(true)
} }
return can.core.CallFunc([can.onimport, data.type], [sub, data, item, window.innerWidth-40]), item return can.core.CallFunc([can.onimport, data.type], [sub, data, item, window.innerWidth-40]), item
}), }]) }), }])
}), can.onmotion.hidden(can, sub.ui.project), can.onaction.show(sub, 0) }), can.onmotion.hidden(can, sub.ui.project), can.ondetail.show(sub, 0)
sub.onappend._status(sub, ["page", "from", "cost"]), sub.Status("from", can.base.Time()) sub.onappend._status(sub, [mdb.PAGE, cli.FROM, cli.COST]), sub.Status(cli.FROM, can.base.Time())
var from = new Date(); can.core.Timer({interval: 100}, function() { var now = new Date() var from = new Date(); can.core.Timer({interval: 100}, function() { var now = new Date()
sub.Status("cost", can.base.Duration(now-from)) sub.Status(cli.COST, can.base.Duration(now-from))
}) })
}, document.body) }, document.body)
}, },
"开讲": function(event, can) { can.sup.onaction.show(can, 0) }, })
"快闪": function(event, can) { can.sup.onaction.flash(can) }, Volcanos("ondetail", {help: "交互操作", list: ["删除"], _init: function(can, msg, list, cb, target) {
"网格": function(event, can) { can.sup.onaction.grid(can) },
"大纲": function(event, can) { can.onmotion.toggle(can, can.ui.project) },
"首页": function(event, can) { can.sup.onaction.show(can, 0) },
"上一页": function(event, can) { can.sup.onaction.prev(can, can.ui.content) },
"菜单": function(event, can) { can.sup.onaction.show(can, event.target.selectedIndex) },
"下一页": function(event, can) { can.sup.onaction.next(can, can.ui.content) },
"隐藏": function(event, can) { can.onmotion.toggle(can, can._output) },
"结束": function(event, can) { can.page.Remove(can, can._target)
can.onengine.signal(can, "keymap.focus", can.request(event, {cb: null}))
}, },
show: function(sub, which) { sub.page.Modify(sub, sub.ui.content, {className: chat.CONTENT}) show: function(sub, which) { sub.page.Modify(sub, sub.ui.content, {className: chat.CONTENT})
sub.page.Select(sub, sub.ui.content, "div.page", function(page, index) { sub.page.Select(sub, sub.ui.content, "div.page", function(page, index) {
if (index == which || page == which) { if (index == which || page == which) {
sub.page.Select(sub, page, "h1,h2,h3", function(item) { sub.Action("菜单", item.innerHTML) }) sub.page.Select(sub, page, "h1,h2,h3", function(item) { sub.Action("菜单", item.innerHTML) })
sub.onmotion.select(sub, sub.ui.project, "div.item", index) sub.onmotion.select(sub, sub.ui.project, "div.item", index)
sub.Status("page", index+1+ice.PS+sub.list.length) sub.Status(mdb.PAGE, index+1+ice.PS+sub.list.length)
sub.page.ClassList.add(sub, page, "select") sub.page.ClassList.add(sub, page, html.SHOW)
} else { } else {
sub.page.ClassList.del(sub, page, "select") sub.page.ClassList.del(sub, page, html.SHOW)
} }
}) })
}, },
next: function(sub) { next: function(sub) {
sub.page.Select(sub, sub.ui.content, "div.page.select", function(page) { sub.page.Select(sub, sub.ui.content, "div.page.show", function(page) {
page.nextSibling? sub.sup.onaction.show(sub, page.nextSibling): page.nextSibling? sub.sup.ondetail.show(sub, page.nextSibling):
sub.user.toast(sub, "end") sub.user.toast(sub, "end")
}) })
}, },
prev: function(sub) { prev: function(sub) {
sub.page.Select(sub, sub.ui.content, "div.page.select", function(page) { sub.page.Select(sub, sub.ui.content, "div.page.show", function(page) {
page.previousSibling? sub.sup.onaction.show(sub, page.previousSibling): page.previousSibling? sub.sup.ondetail.show(sub, page.previousSibling):
sub.user.toast(sub, "end") sub.user.toast(sub, "end")
}) })
}, },
flash: function(sub) { flash: function(sub) {
sub.core.Next(sub.page.Select(sub, sub.ui.content, "div.page"), function(page, next) { sub.core.Next(sub.page.Select(sub, sub.ui.content, "div.page"), function(page, next) {
sub.core.Timer(500, function() { next() }) sub.core.Timer(500, function() { next() })
sub.sup.onaction.show(sub, page) sub.sup.ondetail.show(sub, page)
}) })
}, },
grid: function(sub) { sub.page.Modify(sub, sub.ui.content, {className: "content grid"}) }, grid: function(sub) { sub.page.Modify(sub, sub.ui.content, {className: "content grid"}) },
})
Volcanos("ondetail", {help: "交互操作", list: ["删除"], _init: function(can, msg, list, cb, target) { "开讲": function(event, can) { can.sup.ondetail.show(can, 0) },
}, "快闪": function(event, can) { can.sup.ondetail.flash(can) },
"删除": function(event, sub) { "网格": function(event, can) { can.sup.ondetail.grid(can) },
sub.page.Remove(sub, sub._target)
}, "大纲": function(event, can) { can.onmotion.toggle(can, can.ui.project) },
"首页": function(event, can) { can.sup.ondetail.show(can, 0) },
"上一页": function(event, can) { can.sup.ondetail.prev(can, can.ui.content) },
"菜单": function(event, can) { can.sup.ondetail.show(can, event.target.selectedIndex) },
"下一页": function(event, can) { can.sup.ondetail.next(can, can.ui.content) },
"隐藏": function(event, can) { can.onmotion.toggle(can, can._output) },
"结束": function(event, can) { can.page.Remove(can, can._target) },
"删除": function(event, sub) { sub.page.Remove(sub, sub._target) },
}) })

View File

@ -186,23 +186,18 @@ Volcanos("onaction", {help: "交互操作", list: [
can.Update(event, [ctx.ACTION, "prev", can.Status("total")||0, can.Option("limit"), can.Option("offend")]) can.Update(event, [ctx.ACTION, "prev", can.Status("total")||0, can.Option("limit"), can.Option("offend")])
}, },
listTags: function(event, can, button) { listTags: function(event, can, button) { var list = []
var list = [] can.core.List([can.base, can.core, can.misc, can.page, can.user,
can.core.List([ can.onengine, can.ondaemon, can.onappend, can.onlayout, can.onmotion, can.onkeypop,
can.base, can.core, can.misc, can.page, can.user,
can.onengine, can.ondaemon,
can.onappend, can.onlayout,
can.onmotion, can.onkeypop,
], function(lib) { ], function(lib) {
can.core.Item(lib, function(key, value) { if (!lib.hasOwnProperty(key)) { return } can.core.Item(lib, function(key, value) { if (key.indexOf("_") == 0 || !lib.hasOwnProperty(key)) { return }
if (key.indexOf("_") == 0) { return } list.push({zone: lib._name, type: typeof value, name: key, text: can.base.isObject(value)? "": (value+"").split(ice.NL)[0],
list.push({zone: lib._name, type: typeof value, name: key, text: can.base.isObject(value)? "": (value+"").split(ice.NL)[0], file: lib._path}) path: "usr/volcanos/", file: lib._path, line: 1,
}) })
}) })
var msg = can.request(event, {_handle: true, content: can.base.Format(list)})
can.run(event, [button], function() {
can.user.toastSuccess(can)
}) })
var msg = can.request(event, {_handle: true, text: can.base.Format(list)})
can.run(event, [ctx.ACTION, button], function() { can.user.toastSuccess(can) })
}, },
getClipboardData: function(event, can, button) { getClipboardData: function(event, can, button) {
function add(text) { function add(text) {

View File

@ -56,11 +56,10 @@ var ctx = {
INDEX: "index", ARGS: "args", INDEX: "index", ARGS: "args",
} }
var cli = { var cli = {
OPEN: "open", CLOSE: "close", CODE: "code", COST: "cost", FROM: "from", BACK: "back",
START: "start", STOP: "stop", OPEN: "open", CLOSE: "close", BEGIN: "begin", END: "end",
DONE: "done", ERROR: "error", START: "start", STOP: "stop", DONE: "done", ERROR: "error",
CLEAR: "clear", REFRESH: "refresh", CLEAR: "clear", REFRESH: "refresh",
BACK: "back",
RED: "red", GREEN: "green", BLUE: "blue", RED: "red", GREEN: "green", BLUE: "blue",
YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta", YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta",
@ -75,23 +74,26 @@ var aaa = {
LOGIN: "login", LOGOUT: "logout", INVITE: "invite", LOGIN: "login", LOGOUT: "logout", INVITE: "invite",
} }
var mdb = { var mdb = {
PLUGIN: "plugin", RENDER: "render", SEARCH: "search", INPUTS: "inputs", DICT: "dict", META: "meta", HASH: "hash", LIST: "list",
CREATE: "create", REMOVE: "remove", INSERT: "insert", DELETE: "delete",
MODIFY: "modify", SELECT: "select",
META: "meta", HASH: "hash", LIST: "list",
ID: "id", KEY: "key", TIME: "time", ZONE: "zone", TYPE: "type", NAME: "name", TEXT: "text", ID: "id", KEY: "key", TIME: "time", ZONE: "zone", TYPE: "type", NAME: "name", TEXT: "text",
LINK: "link", SCAN: "scan", SHOW: "show", HELP: "help", LINK: "link", SCAN: "scan", SHOW: "show", HELP: "help",
SHORT: "short", FIELD: "field", COUNT: "count", LIMIT: "limit", SHORT: "short", FIELD: "field", TOTAL: "total", COUNT: "count", LIMIT: "limit",
INDEX: "index", VALUE: "value", EXTRA: "extra", EXPIRE: "expire", INDEX: "index", VALUE: "value", EXTRA: "extra", ALIAS: "alias", EXPIRE: "expire",
CREATE: "create", REMOVE: "remove", INSERT: "insert", DELETE: "delete",
MODIFY: "modify", SELECT: "select",
INPUTS: "inputs", PRUNES: "prunes", EXPORT: "export", IMPORT: "import",
PLUGIN: "plugin", RENDER: "render", SEARCH: "search", ENGINE: "engine",
NEXT: "next", PREV: "prev", PAGE: "page", MAIN: "main",
} }
var ssh = { var ssh = {
SCRIPT: "script", SCRIPT: "script",
} }
var nfs = { var nfs = {
HTML: "html", CSS: "css", JS: "js", GO: "go", SH: "sh", CSV: "csv", JSON: "json", HTML: "html", CSS: "css", JS: "js", GO: "go", SH: "sh", CSV: "csv", JSON: "json",
PATH: "path", FILE: "file", LINE: "line", PATH: "path", FILE: "file", LINE: "line", SIZE: "size",
DIR: "dir", CAT: "cat", TRASH: "trash", DIR: "dir", CAT: "cat", TRASH: "trash",
DIR_ROOT: "dir_root", DIR_ROOT: "dir_root",
} }
@ -107,11 +109,12 @@ var wiki = {
TITLE: "title", BRIEF: "brief", REFER: "refer", SPARK: "spark", TITLE: "title", BRIEF: "brief", REFER: "refer", SPARK: "spark",
ORDER: "order", TABLE: "table", CHART: "chart", IMAGE: "image", VIDEO: "video", ORDER: "order", TABLE: "table", CHART: "chart", IMAGE: "image", VIDEO: "video",
FIELD: "field", SHELL: "shell", LOCAL: "local", PARSE: "parse", FIELD: "field", SHELL: "shell", LOCAL: "local", PARSE: "parse",
NAVMENU: "navmenu", PREMENU: "premenu",
} }
var chat = { var chat = {
LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", INPUT: "input", UPLOAD: "upload",
TOAST: "toast", CARTE: "carte", INPUT: "input", UPLOAD: "upload", STORY: "story", FLOAT: "float", CONTEXTS: "contexts", CARTE: "carte", TOAST: "toast",
STORY: "story", FLOAT: "float", CONTEXTS: "contexts",
LEGNED: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status", LEGNED: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status",
LAYOUT: "layout", PROJECT: "project", CONTENT: "content", DISPLAY: "display", PROFILE: "profile", LAYOUT: "layout", PROJECT: "project", CONTENT: "content", DISPLAY: "display", PROFILE: "profile",
@ -137,8 +140,8 @@ var chat = {
{name: "Header", help: "标题栏", pos: "head", state: ["time", "usernick", "avatar"]}, {name: "Header", help: "标题栏", pos: "head", state: ["time", "usernick", "avatar"]},
{name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]}, {name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]},
{name: "Action", help: "工作台", pos: "main"}, {name: "Action", help: "工作台", pos: "main"},
{name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]},
{name: "Search", help: "搜索框", pos: "auto"}, {name: "Search", help: "搜索框", pos: "auto"},
{name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]},
], ],
plugin_list: [ plugin_list: [
"/plugin/state.js", "/plugin/state.js",
@ -180,10 +183,11 @@ var html = {
TABLE: "table", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li", TABLE: "table", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li",
A: "a", LABEL: "label", INNER: "inner", TITLE: "title", A: "a", LABEL: "label", INNER: "inner", TITLE: "title",
CLASS: "class", BLOCK: "block", NONE: "none", CLASS: "class", BLOCK: "block", NONE: "none", FLOAT: "float", CLEAR: "clear",
STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", MONOSPACE: "monospace", STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", MONOSPACE: "monospace",
SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom", SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom",
MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width", MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width",
HIDDEN: "hidden", SELECT: "select",
WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome", WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome",
LIST: "list", ITEM: "item", MENU: "menu", NODE: "node", LIST: "list", ITEM: "item", MENU: "menu", NODE: "node",
@ -192,7 +196,7 @@ var html = {
var lang = { var lang = {
STRING: "string", NUMBER: "number", STRING: "string", NUMBER: "number",
OBJECT: "object", FUNCTION: "function", OBJECT: "object", FUNCTION: "function",
ESCAPE: "Escape", ENTER: "Enter", ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab",
} }
function shy(help, meta, list, cb) { function shy(help, meta, list, cb) {
var index = 0, args = arguments; function next(type) { var index = 0, args = arguments; function next(type) {
@ -317,9 +321,9 @@ Volcanos.meta._load = function(url, cb) {
return document.body.appendChild(item), item return document.body.appendChild(item), item
} }
} }
function cmd(tool) { function can(tool) {
Volcanos({name: "chat", panels: [ Volcanos({name: "chat", panels: [
{name: "Header", help: "标题栏", pos: "hide", state: ["time", "usernick", "avatar"]}, {name: "Header", help: "标题栏", pos: "hide", state: ["time", "usernick", "avatar"]},
{name: "cmd", help: "工作台", pos: chat.MAIN, tool: tool}, {name: "Action", help: "工作台", pos: chat.MAIN, tool: tool},
]}) ]})
} }