1
0
mirror of https://shylinux.com/x/volcanos synced 2025-07-01 03:54:43 +08:00

Compare commits

...

45 Commits

Author SHA1 Message Date
shy
77245fa035 add some 2025-06-30 19:36:02 +08:00
shy
f0da4d2e79 add some 2025-06-28 00:22:23 +08:00
shy
981532715d add some 2025-06-27 20:38:20 +08:00
shy
c907a95149 add some 2025-06-27 17:35:21 +08:00
shy
ac5a9f1597 add some 2025-06-26 22:35:04 +08:00
shy
a6bd1a5c41 add some 2025-06-24 16:29:03 +08:00
shy
273dc46c08 add some 2025-06-23 21:48:47 +08:00
shy
8360c62d23 add some 2025-06-19 19:20:04 +08:00
shy
ed2ca72604 add some 2025-06-17 14:54:55 +08:00
shy
80d7b2e24a add some 2025-06-16 13:39:10 +08:00
shy
e7deec9752 add some 2025-06-13 09:19:51 +08:00
shy
2c4462b4c2 add some 2025-06-13 09:18:14 +08:00
shy
f791f747f9 add some 2025-06-12 08:22:15 +08:00
shy
8b88dfbee0 add some 2025-06-11 19:43:52 +08:00
shy
0002ed933f add some 2025-06-10 12:54:54 +08:00
shy
673a14f2d5 add some 2025-06-09 12:23:04 +08:00
shy
11573fdc39 add some 2025-06-07 14:27:23 +08:00
shy
bb60f2ae2e add some 2025-06-02 19:17:22 +08:00
shy
69987767ad add some 2025-06-02 19:13:26 +08:00
shy
37f36f37a7 add some 2025-05-31 20:13:58 +08:00
shy
6a59762387 add some 2025-05-31 12:53:35 +08:00
shy
e13ae78993 opt some 2025-05-30 08:42:07 +08:00
shy
ff1fe91b76 add some 2025-05-30 08:36:27 +08:00
shy
b4009485ad add some 2025-05-28 13:58:13 +08:00
shy
a142baab60 add some 2025-05-27 10:33:14 +08:00
shy
ad718ee5a0 add some 2025-05-22 17:36:08 +08:00
shy
77a3fbf696 add some 2025-05-20 10:18:39 +08:00
shy
b2f7fa9a9c add some 2025-05-19 18:57:53 +08:00
shy
760fd56d05 add some 2025-05-19 18:57:48 +08:00
shy
cb0d850d86 add some 2025-05-18 07:49:57 +08:00
shy
e7cb410910 add some 2025-05-14 17:41:03 +08:00
shy
6bd47645a4 add some 2025-05-13 11:51:48 +08:00
shy
0a8d79aef0 add some 2025-05-12 11:10:48 +08:00
shy
42b032c451 add some 2025-05-08 11:58:57 +08:00
shy
1cac223148 add some 2025-05-05 14:15:33 +08:00
shy
db241ed5b1 add some 2025-05-04 08:48:59 +08:00
shy
44b2d6d643 add some 2025-05-02 01:37:01 +08:00
shy
138cc4da33 add some 2025-04-29 00:56:31 +08:00
shy
b9db5b8b8d add some 2025-04-25 18:23:50 +08:00
shy
b24bdc33f2 add some 2025-03-22 12:54:03 +08:00
shy
4fba3f0a65 opt some 2025-03-15 10:32:07 +08:00
shy
58c1f57814 add some 2025-03-10 18:38:42 +08:00
shy
fb526f0c8e add some 2025-03-08 08:38:23 +08:00
shy
7426ac64cb add some 2025-03-05 23:33:52 +08:00
shy
27b6505a44 add some 2025-03-04 09:58:28 +08:00
22 changed files with 701 additions and 256 deletions

View File

@ -246,6 +246,7 @@ var cli = {
QRCODE: "qrcode", COLOR: "color", BLACK: "black", WHITE: "white", BLUE: "blue", RED: "red", GRAY: "gray", CYAN: "cyan", GREEN: "green", PURPLE: "purple", YELLOW: "yellow",
MAGENTA: "magenta", SILVER: "silver", ALICEBLUE: "aliceblue", TRANSPARENT: "transparent",
LINUX: "linux", DARWIN: "darwin", WINDOWS: "windows",
XTERM: "xterm",
SH: "sh",
}
var log = {

View File

@ -23,7 +23,7 @@ Volcanos(chat.ONENGINE, {
if (panel.onengine._plugin(event, can, msg, panel, cmds, cb)) { return }
if (panel.onengine._engine(event, can, msg, panel, cmds, cb)) { return }
if (panel.onengine._static(event, can, msg, panel, cmds, cb)) { return }
var toast, _toast = msg.Option(chat._TOAST); if (_toast) { can.onmotion.delay(can, function() {
var toast, _toast = msg.Option(chat._TOAST); if (_toast && !can.user.isMobile) { can.onmotion.delay(can, function() {
if (sub.__toast || sub._toast) { return } toast = toast||can.user.toastProcess(sub, can.user.trans(sub, _toast))
}, 0) }
if (can.base.isUndefined(msg[ice.MSG_DAEMON])) {
@ -35,7 +35,7 @@ Volcanos(chat.ONENGINE, {
names = can.base.MergeURL(names, ice.MSG_INDEX, sub.ConfIndex()), can.page.exportValue(sub, msg)
can.onengine.signal(panel, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds, names: names}))
can.misc.Run(event, can, {names: names}, cmds, function(msg) {
msg.IsErr() || toast && can.user.toastSuccess(msg._can, _toast), toast && toast.close && toast.close(), toast = true
msg.IsErr() || can.user.isMobile || toast && can.user.toastSuccess(msg._can, _toast), toast && toast.close && toast.close(), toast = true
// delete(sub._toast), delete(sub.__toast)
can.onmotion.delay(can, function() { can.page.ClassList.del(can, sub._target, "_process") }, 300)
can.base.isFunc(cb) && cb(msg), Volcanos.meta.pack[can.core.Keys(panel._name, cmds.join(mdb.FS))] = msg
@ -154,6 +154,7 @@ Volcanos(chat.ONAPPEND, {
var action = can.page.SelectOne(can, field, html.DIV_ACTION)
var output = can.page.SelectOne(can, field, html.DIV_OUTPUT)
var status = can.page.SelectOne(can, field, html.DIV_STATUS)
if (meta.index == "web.chat.wx.agent") { can.onmotion.hidden(can, field) }
can.isCmdMode() && meta.index && meta.index.indexOf("can.") != 0 && can.page.style(can, field, "visibility", "hidden")
can.isCmdMode() && meta.index && meta.index.indexOf("can.") != 0 && can.page.style(can, output, "visibility", "hidden")
can.isCmdMode() && meta.style != "float" && (can.base.isIn(meta.index, web.WIKI_PORTAL)) && can.onappend.style(can, html.OUTPUT, field)
@ -171,6 +172,7 @@ Volcanos(chat.ONAPPEND, {
Update: function(event, cmds, cb, silent) { event = event||{}, sub.request(event)._caller(), event.metaKey && sub.request(event, {metaKey: ice.TRUE})
var msg = sub.request(event), list = can.core.Value(sub, "sub.db._checkbox"); can.core.Item(list, function(key, value) { msg.Option(key, value) })
sub.request(event, sub.Option())
sub.request(event, sub.Conf("option"))
if (event.isTrusted && cmds && cmds.length > 0 && cmds[0] == ctx.ACTION) {
can.onengine.signal(can, "onrecord", can.request({}, {cmds: [sub.ConfSpace(), sub.ConfIndex()].concat(cmds||[])}))
} can.onengine.signal(can, "onevent", can.request(event))
@ -340,16 +342,21 @@ Volcanos(chat.ONAPPEND, {
if (msg.IsErr()) { return can.onappend.style(can, "warn", can.user.toastFailure(can, msg.Result())._target) }
can.misc.Search(can, log.DEBUG) == ice.TRUE && can.base.beginWith(display, "/p/") && delete(Volcanos.meta.cache[display])
can.misc.Search(can, log.DEBUG) == ice.TRUE && can.base.beginWith(display, "/p/") && delete(Volcanos.meta.cache[display.split(".")[0]])
var list = []; can.core.List(display.split(","), function(item) { list = can.base.AddUniq(list, item) })
list = can.base.AddUniq(list, chat.PLUGIN_TABLE_JS)
list = can.base.AddUniq(list, msg.Option(ice.MSG_DISPLAY_CSS)||can.Conf("display_css")||undefined)
Volcanos(display, {_root: can._root, _follow: can.core.Keys(can._follow, display), _fields: can._target, _target: output, _path: display||chat.PLUGIN_TABLE_JS,
_legend: can._legend, _option: can._option, _action: action||can._action, _output: output, _status: status||can._status,
sup: can,
Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, db: {hash: [""], value: {}}, ui: {layout: function() {}},
}, [display, msg.Option(ice.MSG_DISPLAY_CSS)||can.Conf("display_css")||undefined, chat.PLUGIN_TABLE_JS], function(sub) { sub.Conf(can.Conf())
sub.db.hash = can.base.getValid(can.isCmdMode()? can.misc.SearchHash(can): [], can.onexport.storage(can, "hash"))||[]
}, list, function(sub) { sub.Conf(can.Conf())
// sub.db.hash = can.base.getValid(can.isCmdMode()? can.misc.SearchHash(can): [], can.onexport.storage(can, "hash"))||[]
sub.db.hash = can.base.getValid(can.isCmdMode()? can.misc.SearchHash(can): [])||[]
var last = can.sub; last && can.core.CallFunc([last, "onaction.hidden"], {can: last})
sub.run = function(event, cmds, cb, silent) { var msg = sub.request(event)._caller()
msg.RunAction(event, sub, cmds) || can.Update(event, cmds||can.Input(cmds, !silent), cb, silent)
}, can._outputs = can._outputs||[], can._outputs.push(sub), sub.sup = can, can.sub = sub
sub._index = can._index, can._msg = sub._msg = msg, sub.Conf(sub._args = can.base.ParseURL(display))
sub._index = can._index, can._msg = sub._msg = msg, sub.Conf(sub._args = can.base.ParseURL(display.split(",")[0]))
sub._trans = can.base.Copy(can.base.Copy(sub._trans||{}, can._trans), can.core.Value(sub, [chat.ONACTION, chat._TRANS]))
if (sub.onimport && can.base.isArray(sub.onimport.list) && sub.onimport.list.length > 0) {
can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: can.page.inputs(can, sub.onimport.list, html.TEXT) })
@ -360,7 +367,7 @@ Volcanos(chat.ONAPPEND, {
if (can.page.tagis(can._target, "fieldset.cmd.form.output")) {
can.page.ClassList.del(can, can._target, html.FORM), can.page.ClassList.del(can, can._target, html.OUTPUT)
} can.page.ClassList.add(can, can._output, "_prepare")
can.onexport._output(sub, msg)
can.onexport._output && can.onexport._output(sub, msg)
can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) {
can.onappend.style(sub, sub.Conf(ctx.STYLE)), can.onmotion.story.auto(can, can._output), sub.onmotion.touchAction(sub)
if (action !== false) { can.onkeymap._build(sub)
@ -368,7 +375,9 @@ Volcanos(chat.ONAPPEND, {
can.onmotion.clear(can, can._action), sub.onappend._action(sub, [{view: "_space"}].concat(list), action||can._action)
sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS), null, msg), can.user.isMobile || sub.onappend.tools(sub, msg)
// if (msg.Option("sess.online") == ice.TRUE) { can.ondaemon._online(can) }
if (msg.Length() > 9 && !sub.ui.project && !can.user.isMobile) { can.onmotion.delay(can, function() { can.onappend._filter(can) }, 300) }
if (!msg.IsDetail() && msg.Length() > 9 && !sub.ui.project && !can.user.isMobile) {
can.base.endWith(sub.ConfIndex(), ".portal") || can.onmotion.delay(can, function() { can.onappend._filter(can) }, 300)
}
}
if (can.onimport.size) {
@ -444,7 +453,7 @@ Volcanos(chat.ONAPPEND, {
) && (name = (item.index||"").split(nfs.PT).slice(-2).join(nfs.PT))
type == html.PLUG || (type == html.STORY && item.style != html.FLOAT) ||
// can.base.isIn(can.ConfIndex(), web.DESKTOP, web.MESSAGE, web.VIMER) ||
(name = can.core.Keys(item.space||item._space, name))
(name = can.core.Keys(can.base.trimPrefix(item.space||item._space, can.ConfSpace()), name))
item.index && (item.help = item.help||can.user.trans(can, item.index.split(".").pop(), ""))
var title = item.title || can.user.isMobile && (can.user.isEnglish(can)? name: (item.help||name)) || (!item.help || name == item.help || can.user.isEnglish(can)? name: name+"("+can.core.Split(item.help)[0]+")")
target = can.base.isFunc(target)? target(): target
@ -540,6 +549,7 @@ Volcanos(chat.ONAPPEND, {
can.page.insertBefore(can, can.onappend.filter(can, can._action, can.ui.content||can._output).parentNode, (can.page.SelectOne(can, can._action, "div.item._space")||{}).nextSibling, can._action)
},
filter: function(can, target, output) { output = output||can.ui.content||target
if (can.page.SelectOne(can, target, "div.item.filter")) { return {} }
return can.onappend.input(can, {type: html.TEXT, name: web.FILTER, icon: icon.SEARCH, placeholder: can.user.trans(can, "search in n items", "搜索"), onkeydown: function() {}, onkeyup: function(event) {
var value = (event.currentTarget? event.currentTarget.value: "").trim()
if (can.sub && can.sub.onaction && can.sub.onaction.filter && can.sub.onaction.filter(event, can.sub, value)) {
@ -634,6 +644,7 @@ Volcanos(chat.ONAPPEND, {
}, function(name, icon) { var text = value[name]
if (name == nfs.VERSION && text) { text = text.split("-").slice(0, 2).join("-") }
if (name == mdb.TIME && text) { text = can.base.TimeTrim(text) }
if (name == "uid" || can.base.endWith(name, "_uid")) { text = text.slice(0, 6) }
return text && {view: [[html.ITEM, name]], list: [{icon: icon}, {text: text}]}
})}
},
@ -669,14 +680,14 @@ Volcanos(chat.ONAPPEND, {
function request(event) { delete(data.action); return can.request(event, data, can.Option()) }
function run(event, cmd, arg) { can.misc.Event(event, can, function(msg) { can.run(request(event), [ctx.ACTION, cmd].concat(arg)) }) }
function img(p) { return !msg.IsDetail()? can.page.Format(html.IMG, p, 48, 48): can.user.isMobile? can.page.Format(html.IMG, p, null, 320): can.page.Format(html.IMG, p, 320, null) }
if (key == mdb.ICON && value) { _value = can.base.contains(value, ".ico", ".png", ".jpg")? img(can.misc.Resource(can, data[key], data.pod||data.space||data.nodename)): "<i class='"+value+"'></i>" }
if (key == mdb.ICONS && value) { _value = img(can.misc.Resource(can, data[key])) }
if (key == aaa.AVATAR && value) { _value = img(can.misc.Resource(can, data[key])) }
if (key == aaa.BACKGROUND && value) { _value = img(can.misc.Resource(can, data[key])) }
if (key == "user_avatar" && value) { _value = img(can.misc.Resource(can, data[key])) }
if (key == "auth_avatar" && value) { _value = img(can.misc.Resource(can, data[key])) }
if ((key == mdb.ICON || can.base.endWith(key, "_icon")) && value) { _value = can.base.contains(value, ".ico", ".png", ".jpg", "jpeg")? img(can.misc.Resource(can, data[key], data.pod||data.space||data.nodename)): "<i class='"+value+"'></i>" }
if ((key == mdb.ICONS || can.base.endWith(key, "_icons")) && value) {
_value = can.base.contains(value, "bi ")? "<i class='"+value+"'></i>": img(can.misc.Resource(can, data[key]))
}
if ((key == aaa.AVATAR || can.base.endWith(key, "_avatar")) && value) { _value = img(can.misc.Resource(can, data[key])) }
if ((key == aaa.BACKGROUND || can.base.endWith(key, "_background")) && value) { _value = img(can.misc.Resource(can, data[key])) }
if (key == nfs.IMAGE && value) { _value = can.core.List(can.core.Split(data[key]), function(item) { return img(can.misc.ShareCache(can, item, data.space)) }).join("") }
if (key == mdb.HASH && can.base.isIn(can.ConfIndex(), web.TOKEN, aaa.SESS)) { _value = value.slice(0, 4)+"****" }
if (key == mdb.HASH && can.base.isIn(can.ConfIndex(), "share", "web.share", web.TOKEN, aaa.SESS)) { _value = value.slice(0, 4)+"****" }
if (key == "secret" && value) { _value = value.slice(0, 4)+"****" }
if (key == "secretKey" && value) { _value = value.slice(0, 4)+"****" }
if (key == "SecretKey" && value) { _value = value.slice(0, 4)+"****" }
@ -745,6 +756,9 @@ Volcanos(chat.ONAPPEND, {
can.Update(request(event)._event, [ctx.ACTION, target.name]), can.onkeymap.prevent(event)
}}], target.nextSibling, target.parentNode)
}), can.page.SelectOne(can, target, html.SPAN, function(span) { can.core.List(span.style, function(key) { target.style[key] = span.style[key] }) })
if (key == ctx.ACTION && msg.IsDetail() && value == "") {
can.onmotion.delay(can, function() { can.page.Remove(can, target.parentNode) })
}
}}
})
keys && can.page.RangeTable(can, table, can.core.List(keys, function(key) { return can.page.Select(can, table, html.TH, function(th, index) { if (th.innerHTML == key) { return index } })[0] }))
@ -801,6 +815,7 @@ Volcanos(chat.ONAPPEND, {
onmousemove: function(event) { if (!hbegin) { return } target.scrollLeft = hbegin.left+(event.x-hbegin.x)/target.offsetWidth*target.scrollWidth, can.onkeymap.prevent(event) },
onmouseup: function(event) { hbegin = null, delete(window._mousemove) },
}])._target
can.ui.vbar = vbar, can.ui.hbar = hbar
target.addEventListener("scroll", function(event) {
var height = can.base.Min(target.offsetHeight*target.offsetHeight/target.scrollHeight, target.offsetHeight/4)
vbar.innerHTML = `${(target.scrollTop*100/(target.scrollHeight-target.offsetHeight)).toFixed(2)}%`
@ -899,8 +914,8 @@ Volcanos(chat.ONAPPEND, {
can.onexport.session(can, "profile.show", can.page.isDisplay(can.ui.profile))
if (can.isCmdMode()) { var _width = can.ConfWidth()
can.page.SelectChild(can, can._fields, "legend,form.option,div.header", function(target) { _width -= target.offsetWidth })
can.page.SelectChild(can, can._fields, "div.action", function(target) { can.page.style(can, target, html.MAX_WIDTH, _width-1)
can.page.Select(can, target, "span.name", function(target, index, list) { can.page.style(can, target, html.MAX_WIDTH, (_width-50)/list.length-40) })
can.page.SelectChild(can, can._fields, html.DIV_ACTION, function(target) { can.page.style(can, target, html.MAX_WIDTH, _width-21)
// can.page.Select(can, target, "span.name", function(target, index, list) { can.page.style(can, target, html.MAX_WIDTH, (_width-50)/list.length-40) })
})
}
if (can.page.isDisplay(can.ui.display)) {
@ -959,7 +974,7 @@ Volcanos(chat.ONAPPEND, {
can.runAction(can.request({}, meta._commands, {_method: http.GET, pod: meta.space, _failure: function(msg) {
return can.misc.isDebug(can) && can.misc.Warn("not found", meta.index), _plugin({msg: msg, type: meta.type, index: "can._notfound", args: [meta.index, meta.space]})
}})._caller(), ctx.COMMAND, [meta.index], function(msg) { if (msg.Length() == 0) { return msg._failure() }
msg.Table(function(value) { value._prefix = msg["_prefix"], can.onappend._plugin(can, value, meta, _cb, target, field) })
msg.Table(function(value) { value._prefix = msg["_prefix"]||meta._prefix, can.onappend._plugin(can, value, meta, _cb, target, field) })
}); return res
},
_plugin: function(can, value, meta, cb, target, field) { can.base.Copy(meta, value, true)
@ -998,7 +1013,7 @@ Volcanos(chat.ONAPPEND, {
sub.Status(html.HEIGHT, sub._output.offsetHeight), sub.Status(html.WIDTH, sub._output.offsetWidth)
}
can.core.CallFunc(on, {event: event, can: can, meta: meta, cb: _cb, target: target, sub: target._can, mod: can.onfigure[input],last: last, cbs: function(cb) {
target._can? show(target._can, cb): can.onappend._init(can, {type: html.INPUT, name: input, style: can.core.Keys(can.ConfIndex(), meta.name), mode: chat.FLOAT}, [path, meta.display], function(sub) { sub.Conf(meta)
target._can? show(target._can, cb): can.onappend._init(can, {type: html.INPUT, name: input, style: can.core.Keys(can.ConfIndex(), meta.name), mode: chat.FLOAT}, ["/plugin/table.js", path, meta.display], function(sub) { sub.Conf(meta)
can.page.Append(can, sub._target, [{text: [can.page.unicode.remove, "", "close"], onclick: function() { sub.close() }}])
sub.run = function(event, cmds, cb) { var msg = sub.request(event)
if (meta.range) { for (var i = meta.range[0]; i < meta.range[1]; i += meta.range[2]||1) { msg.Push(mdb.VALUE, i) } cb(msg); return }
@ -1052,7 +1067,7 @@ Volcanos(chat.ONLAYOUT, {
can.page.styleHeight(can, target, height), can.page.styleWidth(can, target, width)
}); return height+margin
},
background: function(can, url, target) { can.page.style(can, target||can._root._target, "background-image", url == "" || url == "void"? "": 'url("'+url+'")') },
background: function(can, url, target) { can.page.style(can, target||can._root._target, "background-image", url == "" || url == "void"? "": url) },
figure: function(event, can, target, right, min, cb) { if (!event || !event.target) { return {} } target = target||can._fields||can._target
var rect = event.target == document.body? {left: can.page.width()/2, top: can.page.height()/2, right: can.page.width()/2, bottom: can.page.height()/2}: (event.currentTarget||event.target).getBoundingClientRect()
var layout = right? {left: rect.right, top: rect.top}: {left: rect.left, top: rect.bottom}
@ -1090,6 +1105,7 @@ Volcanos(chat.ONMOTION, {
if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return }
if (can.page.tagis(event.target, html.A) && can.user.isWebview) { return event.shiftKey? window.outopen(event.target.href): can.user.open(event.target.href) }
if (can.page.tagis(event.target, html.IMG) && can.base.beginWith(event.target.title, web.HTTP)) { return can.user.open(event.target.title) }
if (can.page.tagis(event.target, "img.qrcode")) { return can.user.open(event.target.title) }
can.onmotion.clearCarte(can)
}
},
@ -1120,15 +1136,19 @@ Volcanos(chat.ONMOTION, {
},
scrollHold: function(can, cb, target) { target = target || can._output; var left = target.scrollLeft; cb(), target.scrollLeft = left },
scrollIntoView: function(can, target, margin, parent) { if (!target) { return }
margin = margin||0, parent = parent||target.parentNode
if (!parent) { return }
if (parent._scroll) { return } parent._scroll = true
var offset = (target.offsetTop-margin) - parent.scrollTop, step = offset < 0? -20: 20
if (Math.abs(offset) > 3000) { return parent.scrollTop = (target.offsetTop-margin), delete(parent._scroll) }
can.core.Timer({interval: 10, length: offset/step}, function() { parent.scrollTop += step }, function() { parent.scrollTop = (target.offsetTop-margin), delete(parent._scroll) })
margin = margin||0, parent = parent||target.parentNode; if (!parent) { return } if (parent._scroll) { return } parent._scroll = true
if (target.offsetHeight == parent.offsetHeight) { margin = margin||10
var offset = (target.offsetLeft-margin) - parent.scrollLeft, step = offset < 0? -20: 20
if (Math.abs(offset) > 3000) { return parent.scrollLeft = (target.offsetLeft-margin), delete(parent._scroll) }
can.core.Timer({interval: 10, length: offset/step}, function() { parent.scrollLeft += step }, function() { parent.scrollLeft = (target.offsetLeft-margin), delete(parent._scroll) })
} else {
var offset = (target.offsetTop-margin) - parent.scrollTop, step = offset < 0? -20: 20
if (Math.abs(offset) > 3000) { return parent.scrollTop = (target.offsetTop-margin), delete(parent._scroll) }
can.core.Timer({interval: 10, length: offset/step}, function() { parent.scrollTop += step }, function() { parent.scrollTop = (target.offsetTop-margin), delete(parent._scroll) })
}
},
clearFloat: function(can) {
var list = ["fieldset.input.float", "div.input.float", "div.carte.float", "div.toast.float"]; for (var i = 0; i < list.length; i++) {
var list = ["fieldset.input.float", "div.input.float", "div.upload.float", "div.carte.float", "div.toast.float"]; for (var i = 0; i < list.length; i++) {
if (can.page.Select(can, document.body, list[i], function(target) { return target._close? target._close(): can.page.Remove(can, target) }).length > 0) { return true }
}
},
@ -1320,7 +1340,8 @@ Volcanos(chat.ONMOTION, {
can.onmotion.delay(can, function() { can._root.Action.onlayout._init(can) })
})
},
slideOut: function(can, cb) { var margin = 100
slideOut: function(can, cb, skip) { var margin = 100
if (skip) { return cb() }
var target = can._target
if (can._output.innerHTML == "") { return can.page.Remove(can, target), cb && cb() }
can.core.Timer({interval: 10, length: 30}, function(timer, interval, index, list) {
@ -1332,7 +1353,7 @@ Volcanos(chat.ONMOTION, {
},
slideAction: function(can, target) {
var action = can.page.Select(can, target.parentNode, html.DIV_ACTION)[0]
if (!action.innerHTML) { return }
if (!action || !action.innerHTML) { return }
var beginY, beginX, beginLeft, max = can.base.Max(action.offsetWidth, 240, 60)
target.addEventListener("touchstart", function(event) { max = can.base.Max(action.offsetWidth, 240, 60)
beginY = event.touches[0].clientY, beginX = event.touches[0].clientX, beginLeft = parseFloat(target.style.left)||0
@ -1388,6 +1409,10 @@ Volcanos(chat.ONMOTION, {
target.ontouchmove = function(event) { var msg = can.request(event)
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } msg.Option(ice.MSG_HANDLE, ice.TRUE)
spanY = event.touches[0].clientY-beginY, spanX = event.touches[0].clientX-beginX
if (can.page.tagis(event.target.parentNode, "div.tabs")) { return }
if (can.page.tagis(event.target, "table.content.scroll")) { return }
// if (can.page.tagis(event.target, "th")) { return }
// if (can.page.tagis(event.target, "td")) { return }
if (Math.abs(spanX) > Math.abs(spanY)) { can.onkeymap.prevent(event) }
can.onaction.onslidemove(event, can, data = {beginX: beginX, beginY: beginY, spanX: spanX, spanY: spanY}, direction())
}

150
index.css
View File

@ -1,15 +1,17 @@
/* variable */
body {
--code-bg-color:black; --code-fg-color:silver;
--disable-fg-color:gray; --notice-color:blue; --danger-color:red;
--shadow-color:var(--disable-fg-color); --border-color:var(--disable-fg-color);
--notice-color:blue; --danger-color:red; --label-fg-color:gray; --disable-fg-color:gray;
// --shadow-color:var(--disable-fg-color); --border-color:var(--disable-fg-color);
--shadow-color:transparent; --border-color:var(--disable-fg-color);
--notice-bg-color:var(--notice-color); --notice-fg-color:white;
--danger-bg-color:var(--danger-color); --danger-fg-color:var(--notice-fg-color);
--progress-bg-color:var(--danger-bg-color);
--hover-bg-color:#5066b961; --hover-fg-color:var(--notice-fg-color);
--body-font-family:sans-serif; --code-font-family:monospace;
--project-width:230px; --river-width:var(--project-width);
--float-height:640px; --float-width:1000px; --desktop-icon-size:80px;
--float-height:640px; --float-width:1000px;
--desktop-icon-size:80px;
}
body {
--body-bg-color:var(--panel-bg-color); --body-fg-color:var(--plugin-fg-color);
@ -46,7 +48,7 @@ body {
--header-height:48px; --footer-height:var(--action-height);
--action-height:32px; --status-height:32px; --textarea-height:96px;
--input-width:140px; --button-width:60px; --form-width:360px; --url-input-width:480px;
--card-width:300px; --card-height:160px; --qrcode-width:320px; --qrcode-height:323px;
--card-width:300px; --card-height:160px; --qrcode-width:240px; --qrcode-height:243px;
--story-height:var(--float-height); --iframe-height:480px;
--plug-height:480px; --plug-width:var(--float-width);
--desktop-height:684px; --desktop-width:var(--float-width);
@ -82,7 +84,8 @@ body {
body.light { --panel-bg-color:black; --panel-fg-color:silver; }
body.width6 { /* 1920-2240 大显示器 */
--project-width:280px; --river-width:280px; --input-width:180px; --url-input-width:1000px;
--qrcode-width:420px; --card-height:160px;
// --qrcode-width:420px;
--card-height:160px;
--float-width:1200px;
}
body.width5 { /* 1600-1920 */
@ -97,10 +100,12 @@ body.width2 { /* 640-960 手机横屏 平板竖屏 笔记本调试 */
body.width1 { /* 320-640 手机竖屏 */
--project-width:120px; --river-width:280px; --input-width:80px; --url-input-width:160px; --form-width:290px;
--river-margin:0; --plugin-margin:0; --legend-margin:5px; --button-margin:5px;
--table-button:2; --card-button:3;
--table-button:2;
// --card-button:3;
--desktop-icon-size:60px;
}
body.en { --card-button:3; }
body.mobile { --project-width:240px; --footer-height:60px; --svg-font-size:13px; --qrcode-width:320px; }
body.mobile { --project-width:240px; --footer-height:64px; --svg-font-size:13px; --qrcode-width:240px; }
body.mobile.dark { --body-bg-color:var(--output-bg-color); --action-output-bg-color:var(--output-bg-color); }
body.mobile.light { --body-bg-color:var(--output-bg-color); --action-output-bg-color:var(--output-bg-color); }
body.cmd.web.code.vimer { --code-line-height:24px; }
@ -137,7 +142,7 @@ table.content.action td:last-child input.danger:hover { background-color:var(--h
table.content.detail td:first-child { word-break:keep-all; white-space:pre; }
table.content.detail td:first-child { text-align:center; }
table.content.detail td:first-child { position:sticky; left:0; }
table.content.option td.option { position:sticky; left:2px; z-index:1; box-shadow:var(--box-shadow); background-color:var(--th-bg-color); }
table.content.option td.option { position:sticky; left:2px; z-index:1; background-color:var(--th-bg-color); }
table.content.option th.option { position:sticky; left:2px; z-index:2; }
table.content.option.checkbox td.option { left:50px; }
table.content.option.checkbox th.option { left:50px; }
@ -152,6 +157,23 @@ table.content.detail tr.action input.danger { color:var(--danger-bg-color); }
table.content.detail tr.action input.notice:not(:hover) { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
table.content.detail tr.action i { display:unset; color:var(--notice-bg-color); }
table.content.detail tr.action i.bi-trash { color:var(--danger-bg-color); }
body.width1 div.output div.video.width.bilibili iframe { height:200px; }
div.output div.code.qrcode { position:relative; }
div.output div.code.qrcode { text-align:center; display:inline-block; margin:10px 10px; }
div.output div.code.qrcode>img.qrcode:hover {
box-shadow:var(--notice-box-shadow);
}
div.output div.code.qrcode>img.qrcode {
box-shadow:var(--box-shadow); border-radius:10px;
margin:10px 10px; height:220px; width:220px;
cursor:pointer;
}
// div.output div.code>img.avatar { box-shadow:var(--box-shadow); border:solid 2px white; }
div.output div.code>img.avatar { --qrcode-icon-height:32px; object-fit:cover; border-radius:10px;
height:var(--qrcode-icon-height) !important; width:var(--qrcode-icon-height) !important;
position:absolute; top:calc(50% - var(--qrcode-icon-height) / 2 - 12px); left:calc(50% - var(--qrcode-icon-height) / 2);
}
fieldset.plugin.cmd.output>div.output { top:0; }
div.output._unload { position:absolute; }
fieldset._process input { background-color:transparent !important; color:var(--disable-fg-color) !important; }
@ -160,7 +182,7 @@ body.width1 table.content.checkbox td:first-child { padding:var(--table-padding)
body.width1 table.content.action th:last-child { padding:var(--table-padding) var(--input-padding); }
body.width1 table.content.action td:last-child { padding:var(--table-padding) var(--input-padding); }
body.width1 table.content.detail thead { display:none; }
table.content input { border:none; background-color:var(--th-bg-color); padding:var(--input-padding); }
table.content input { border:none; padding:var(--input-padding); }
table.content input:not(:last-child) { margin-right:var(--input-margin); }
body:not(.mobile) fieldset.Action:not(.tabview):not(.horizon):not(.grid) fieldset.plugin:not(.float):not(.full):not(.cmd)>div.output>table.content td i { display:none; }
body:not(.mobile) fieldset.Action:not(.tabview):not(.horizon):not(.grid) fieldset.plugin:not(.float):not(.full):not(.cmd)>div.output>table.content td input.icons { display:unset; }
@ -180,17 +202,17 @@ fieldset.store>div.output>fieldset.story:not(.float) { display:none; }
div.output.card>div.item { padding:var(--plugin-padding); margin:var(--plugin-padding); min-width:120px; position:relative; float:left; }
div.output.card>div.item:hover { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); }
div.output.card>div.item.stop { color:var(--disable-fg-color); }
div.output.card>div.item>div.title { border-bottom:var(--box-border); font-size:var(--legend-font-size); font-weight:bold; padding-bottom:var(--input-padding); display:flex; align-items:center; }
div.output.card>div.item>div.title>div.title { overflow:auto }
div.output.card>div.item>div.title>div.title>span { padding:var(--input-padding); white-space:pre; }
div.output.card>div.item>div.title { border-bottom:var(--box-border); font-size:var(--legend-font-size); font-weight:bold; padding-bottom:var(--input-padding); align-items:center; }
div.output.card>div.item>div.title>div.title { white-space:pre; overflow:auto }
div.output.card>div.item>div.title>div.title>span { padding:0 var(--input-padding); white-space:pre; }
div.output.card>div.item>div.title>div.title>span.exists { color:var(--notice-bg-color); }
div.output.card>div.item>div.title>img { height:var(--header-height); width:var(--header-height); margin:0; float:left; }
div.output.card>div.item>div.title>img.jpg { padding:var(--input-padding); }
div.output.card>div.item>div.title>img.jpg { border-radius:10px; padding:var(--input-padding); }
div.item.card:not(.hide) { position:relative; display:flex; align-items:center; padding:0; }
div.item.card img { height:60px; width:60px; margin:5px; }
div.item.card div.info { width:100%; }
div.item.card div.title { font-size:16px; }
div.item.card div.title span { margin-right:5px; white-space:pre; }
div.item.card div.title span:not(:last-child) { margin-right:5px; white-space:pre; line-height:22px; }
div.item.card div.title span.type { border:var(--box-notice); color:var(--notice-bg-color); font-size:12px; padding:0 5px; }
div.item.card div.title span.role { border:var(--box-notice); color:var(--notice-bg-color); font-size:12px; padding:0 5px; }
div.item.card div.title span.status { border:var(--box-notice); color:var(--notice-bg-color); font-size:12px; padding:0 5px; }
@ -203,12 +225,12 @@ body:not(.width1) div.item.card div.action { z-index:1; }
div.item.card div.action input[type=button] { background-color:transparent; border:none; color:var(--notice-bg-color); margin-left:5px; }
body:not(.mobile) div.item.card div.action input[type=button]:hover { background-color:var(--hover-bg-color); }
div.item.card div.action input[type=button].danger { color:var(--danger-bg-color) }
body:not(.mobile) div.item.card div.action input[type=button].notice:hover { border:var(--box-notice); }
// body:not(.mobile) div.item.card div.action input[type=button].notice:hover { border:var(--box-notice); }
div.item.card div.action input[type=button].notice:not(:hover) { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
div.item.card div.action input[type=button]:last-child { margin-right:5px; }
div.item.card div.output { padding:10px 0; display:flex; transition:left .2s; }
body.width1 div.item.card div.output { width:100%; }
body.width1 div.item.card div.output { background-color:var(--output-bg-color); }
body.width1 div.item.card>div.output { background-color:var(--output-bg-color); }
div.item.card.select div.title { font-weight:bold; }
div.item.card.select div.output { transition:left .5s; }
div.item img[src*=".ico"] { padding:3px; }
@ -227,11 +249,12 @@ div.output>div.code>div.form { text-align:center; font-size:15px; padding:60px 1
div.output>div.code>div.form>input[type=button] { min-width:200px; }
div.output>div.code>div.form>input[type=button][name=confirm] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); margin:var(--button-margin) 0; }
body.en span[lang^=zh] { display:none; } body.zh span[lang^=en] { display:none; }
fieldset>div.action { position:relative; }
fieldset.plugin.cmd:not(.output)>form.option { float:left; display:flex !important; }
fieldset.plugin.cmd:not(.output)>div.action { float:left; display:flex !important; flex-grow:1; height:var(--action-height); overflow:auto; }
fieldset.plugin.cmd:not(.output)>div.action div.tabs { margin-left:var(--button-margin); }
fieldset.plugin.cmd:not(.output)>div.action div.tabs:last-child { margin-right:var(--button-margin); }
fieldset.plugin.cmd:not(.output)>div.action div.tabs:first-child { margin-left:var(--button-margin); }
fieldset.plugin.cmd:not(.output)>div.action div.tabs.select { padding-top:2px; }
fieldset.plugin.cmd:not(.output)>div.action div.tabs.select { padding-top:2px; color:var(--hover-fg-color); }
fieldset.plugin.cmd:not(.output)>div.action div.tabs>span.name { overflow:hidden; }
fieldset.plugin.cmd:not(.output)>div.header { float:right; display:flex; flex-direction:row-reverse; }
body.width2 fieldset.plugin.cmd:not(.output)>div.header { display:none; }
@ -242,8 +265,10 @@ div.output>div.layout>div.layout { position:relative; }
/* project */
div.project { background-color:var(--plugin-bg-color); }
div.project div.action:not(.hide) { width:100%; display:flex; overflow:hidden; }
div.project div.action div.item input { border-right:var(--box-border); }
// div.project div.action div.item input { border-right:var(--box-border); }
div.project div.action div.item input:hover { border-right:var(--box-notice); }
div.project div.action div.item input { border-right:none; }
// div.project div.action div.item input:hover { border-right:none; }
div.project div.action div.item.icons input { display:none; }
div.project div.action div.item.icons { background-color:var(--plugin-bg-color); padding:0; }
div.project div.expand { margin-right:var(--input-margin); width:5px; float:left; transform: translate(1px, -1px) rotate(0deg); transition:all .5s; }
@ -332,12 +357,14 @@ fieldset.input.key div.output table.content td:first-child { padding-left:24px;
fieldset.input.key div.output table.content.checkbox td:nth-child(2) { cursor:pointer; }
fieldset.input.key div.output table.content:not(.checkbox) td:not(:first-child) { background-color:unset !important; color:var(--disable-fg-color); cursor:default; }
fieldset.input.key>div.output>div.item:not(.hide) { display:flex; align-items:center; }
fieldset.input.key>div.output>div.item img { height:var(--header-height); width:var(--header-height); }
fieldset.input.key>div.output>div.item img { border-radius:5px; padding:5px; height:var(--header-height); width:var(--header-height); }
fieldset.input.key>div.output>div.item img[src*=".jpg"] { padding:5px; }
fieldset.input.key>div.output>div.item div.title { padding:var(--input-padding) 0; }
fieldset.input.key>div.output>div.item div.status div.item { color:var(--disable-fg-color); font-size:var(--status-font-size); float:left; }
fieldset.input.key>div.output>div.item div.status div.item { color:var(--disable-fg-color); font-size:var(--status-font-size); line-height:18px; float:left; }
fieldset.input.key>div.output div.item.card>div.output img { height:48px; width:48px; }
fieldset.input.key>div.output>div.item div.status div.item span { padding:0 var(--input-padding); }
fieldset.input.key div.status:not(.hide) { background-color:var(--input-bg-color); display:block; position:sticky; bottom:0; }
fieldset.input.key div.status:not(.hide) { display:block; position:sticky; bottom:0; }
// fieldset.input.key div.status:not(.hide) { background-color:var(--input-bg-color); display:block; position:sticky; bottom:0; }
fieldset.input.key.simple th { display:none; }
fieldset.input.key.simple td { min-width:var(--button-width); }
fieldset.input.icon img { height:var(--desktop-icon-size); width:var(--desktop-icon-size); cursor:pointer; }
@ -348,7 +375,7 @@ fieldset.input.date>div.action>div>div:first-child { margin-left:0; }
fieldset.input.date>div.action>div { display:flex; justify-content:space-between; }
fieldset.input.date div.action>div.time div.item span { display:none; }
fieldset.input.date div.action span.close { display:none; }
fieldset.input.date>div.output { text-align:center; }
fieldset.input._date>div.output { text-align:center; }
fieldset.input.date>div.output table.content { text-align:center; border:var(--box-notice); width:100%; }
fieldset.input.date>div.output td.prev { color:var(--disable-fg-color); }
fieldset.input.date>div.output td.next { color:var(--disable-fg-color); }
@ -359,7 +386,8 @@ fieldset.input.date>div.output td { cursor:pointer; }
fieldset.input.date>div.output td.select { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
fieldset.input.date>div.status { text-align:center; border-top:unset; }
fieldset.input.date>div.status>div.today { padding:var(--input-padding); }
body.mobile fieldset.input.date { left:0 !important; width:100%; }
body.mobile fieldset.input._date { left:0 !important; width:100%; }
// body.mobile fieldset.input.web.team.production.date { left:23px !important; width:100%; }
fieldset.input.float { border-radius:0; padding:0; }
fieldset.input.float table.content th { padding:var(--input-padding); }
fieldset.input.float table.content td { padding:var(--input-padding); }
@ -375,7 +403,7 @@ div.toast.float>div.close { color:var(--notice-bg-color); float:right; cursor:po
div.toast.float>div.close:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
div.toast.float div.duration { color:var(--disable-fg-color); float:right; }
div.toast.float div.duration { font-size:var(--status-font-size); }
div.toast.float div.title { font-size:var(--status-font-size); }
div.toast.float div.title { font-size:var(--status-font-size); max-width:240px; }
div.toast.float div.content { color:var(--notice-bg-color); white-space:pre-line; text-align:center; padding:var(--input-padding); margin-bottom:var(--input-margin); min-height:28px; }
div.toast.float.warn div.content { white-space:pre-wrap; text-align:left; display:block; overflow:auto; }
div.toast.float div.progress { margin-left:0px; height:5px; }
@ -387,6 +415,7 @@ div.toast.float div.action>div.item input { padding:0 20px; }
div.toast.float div.action>div.item.danger input { border:var(--box-danger); }
div.toast.float div.action>div.item.notice input { border:var(--box-notice); }
div.toast.float div.action>div.item.open input { border:var(--box-notice); }
div.toast.float div.action>div.item.open:hover input { background-color:var(--notice-bg-color); }
body>div.loading { white-space:pre; text-align:center; padding:20px; width:100%; position:absolute; left:0; top:0; z-index:5; }
body>div.carte { border:0; padding:0; }
body>div.carte input[name=filter] { margin:var(--input-margin); width:calc(100% - 10px); position:sticky; top:var(--input-margin); }
@ -415,8 +444,11 @@ body div.input.float tr.img td:last-child>div.item { width:var(--river-width); f
body div.input.float tr.img td:last-child>div.item>div { background-color:gray; margin:var(--input-margin); }
body div.input.float tr.img td:last-child>div>span { font-size:var(--action-height); }
body div.input.float tr.img td:last-child>div>span.icon { display:none; }
// body div.input.float tr.img td:last-child>div>div>img { width:100% !important; height:100% !important; left:0 !important; top:0 !important;}
// body div.input.float tr.img td:last-child>div>div { position:relative; }
body div.input.float tr.img td:last-child>div { width:100% !important; justify-content:flex-start; }
body div.input.float tr.icon td:last-child { position:relative; }
body div.input.float tr.icon td:last-child img:first-child { height:28px; width:28px; position:absolute; left:12px; top:12px; }
body div.input.float tr.icon:not(.img) td:last-child img:first-child { height:28px; width:28px; position:absolute; left:12px; top:12px; }
body div.input.float tr.icon td:last-child input { padding-left:var(--action-height); }
body div.input.float tr.icons td:last-child img { height:28px; width:28px; position:absolute; left:2px; top:2px; }
body div.input.float tr.icons td:last-child span:not(.icon) { font-family:var(--code-font-family); position:absolute; left:33px; line-height:var(--action-height); }
@ -431,14 +463,24 @@ body div.input.float select { width:var(--form-width) !important; }
body div.input.float input.select[type=button] { width:var(--form-width) !important; }
body div.input.float input:not([type=button]) { width:var(--form-width) !important; padding:0 24px; }
body div.input.float input[type=text] { width:var(--form-width) !important; padding:0 24px; }
body div.input.float div.prompt { font-size:12px; color:gray; }
body:not(.mobile) div.input.float tr td:first-child {
line-height:32px;
vertical-align:top;
}
body div.input.float input[name=cancel] { border:var(--box-danger); background-color:transparent; color:var(--danger-bg-color); }
body.mobile div.input.float input[name=submit] { border:var(--box-notice); background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
body div.input.float input[name=submit]:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
body div.input.float input[name=cancel]:hover { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
body div.input.float div.action { padding:var(--table-padding); width:100%; position:sticky; bottom:0; flex-direction:row-reverse; cursor:move; }
body div.input.float div.action>div.item { margin-left:var(--button-margin); float:right; }
body div.input.float div.action>div.item>input[type=button] { min-width:112px; }
body>div.input.login { flex-direction:column; }
body div.input.float div.action {
padding:var(--table-padding); width:100%; position:sticky; bottom:0; flex-direction:row-reverse; cursor:move;
}
fieldset.input.key>div.action {
display:none !important;
}
body div.input.float div.action>div.item { margin-left:var(--button-margin); float:right; flex-grow:1; }
body div.input.float div.action>div.item>input[type=button] { min-width:112px; width:100%; }
body>div.input.login { flex-direction:column; border-radius:20px; }
body>div.input.login>div.action { border-bottom:var(--box-border); padding:0; flex-direction:row; }
body>div.input.login>div.action>div.tabs { padding:var(--button-padding); }
body>div.input.login>div.action>div.tabs.select { color:unset; }
@ -489,7 +531,8 @@ fieldset.vimer>div.output div.project fieldset.plug div.output.card>div.item { m
div.float { position:fixed; }
div.output { position:relative; }
div.output>div.code { position:sticky; left:0; }
div.output>div.code>img { margin:5px; max-width:100%; }
// div.output>div.code>img { margin:5px; max-width:100%; }
div.output>div.code>img { max-width:100%; }
div.output.flex { overflow:hidden; align-items:flex-start; justify-content: flex-start; }
div.layout.flex>* { float:left; clear:none; }
div.flex:not(.hide) { display:flex; align-items:center; justify-content:center; }
@ -544,7 +587,7 @@ span.keyword { color:var(--code-keyword); } span.function { color:var(--code-fun
span.item.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
span.item:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
span.icon:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body:not(.mobile):not(.pad) div.item:not(.text):hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body:not(.mobile):not(.pad) div.item:not(.text):not(.space):hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
div.item.select:not(.button):not(:only-child) { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body:not(.mobile) div.item.button.danger input:hover[type=button] { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
body:not(.mobile) div.item.button.notice input:hover[type=button] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
@ -562,7 +605,7 @@ body.mobile div.action div.tabs:not(.select) { display:none; }
div.zone>div.item { background-color:var(--th-bg-color); }
div.zone>div.list>div.zone>div.item { background-color:var(--th-bg-color); }
div.tabs div { background-color:var(--plugin-bg-color); }
div.tabs div:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body:not(.mobile) div.tabs div:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
div.tabs div.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
div.plug>legend { background-color:var(--output-bg-color); }
div.plug>legend:hover { background-color:var(--hover-bg-color); }
@ -581,13 +624,14 @@ fieldset.panel:not(.main):not(.auto) div.item.select { background-color:var(--pa
fieldset.panel:not(.main):not(.auto) div.tabs:hover { background-color:var(--panel-hover-bg-color); color:var(--panel-hover-fg-color); }
fieldset.panel:not(.main):not(.auto) div.tabs.select { background-color:var(--panel-hover-bg-color); color:var(--panel-hover-fg-color); }
fieldset.panel:not(.main):not(.auto) input { background-color:var(--panel-input-bg-color); color:var(--panel-input-fg-color); }
fieldset.panel:not(.main):not(.auto) input[name=create] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
fieldset.panel:not(.main):not(.auto) input:hover { background-color:var(--panel-hover-bg-color); color:var(--panel-hover-fg-color); }
fieldset.panel:not(.main):not(.auto) input::placeholder { background-color:var(--panel-input-bg-color); color:var(--disable-fg-color); }
fieldset.panel.auto { background-color:var(--panel-bg-color); color:var(--panel-fg-color); }
fieldset.panel.auto>div.output { background-color:var(--panel-bg-color); color:var(--panel-fg-color); }
fieldset.panel.main>div.output { background-color:var(--action-output-bg-color); }
fieldset:not(.panel) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); }
fieldset.input div.output { background-color:var(--input-bg-color); }
fieldset.input>div.output { background-color:var(--input-bg-color); }
fieldset.input div.output>table.content { border-collapse:collapse; }
fieldset.input tr:hover { background-color:var(--tr-hover-bg-color); }
fieldset.input td:hover { background-color:var(--td-hover-bg-color); }
@ -615,10 +659,12 @@ body>div.toast.float { z-index:12; }
fieldset.Action>div.toast { z-index:12; }
fieldset.desktop.cmd>div.output>fieldset.macos.dock { z-index:10; }
/* box-shadow */
div.float { box-shadow:var(--float-box-shadow); border:var(--plugin-border); }
div.float { box-shadow:var(--float-box-shadow); }
// div.float { box-shadow:var(--float-box-shadow); border:var(--plugin-border); }
div.float:hover { box-shadow:var(--notice-box-shadow); }
fieldset.plugin { box-shadow:var(--plugin-box-shadow); border-radius:var(--plugin-radius); }
fieldset.story { box-shadow:var(--plugin-box-shadow); border-radius:var(--plugin-radius); }
body.mobile fieldset.plugin:only-child { border-radius:0; }
// fieldset.story { box-shadow:var(--plugin-box-shadow); border-radius:var(--plugin-radius); }
fieldset.float { box-shadow:var(--float-box-shadow); border:var(--plugin-border); border-radius:var(--plugin-radius); }
fieldset.plugin:hover { box-shadow:var(--notice-box-shadow); }
body.light fieldset.plugin>legend { box-shadow:var(--legend-box-shadow); margin-right:var(--legend-margin); }
@ -635,7 +681,7 @@ fieldset>div.action div.item:not(.state) { box-shadow:var(--input-box-shadow); }
fieldset>div.action>div.tabs:not(.state).select { box-shadow:var(--legend-box-shadow); }
fieldset>div.action>div.tabs:not(.state) span.exists { color:var(--notice-bg-color); }
fieldset>div.action>div.cmds:not(.state) { box-shadow:var(--legend-box-shadow); }
div.output.card>div.item { box-shadow:var(--th-box-shadow); border:var(--plugin-border); border-radius:var(--plugin-radius); }
div.output.card>div.item { border:var(--plugin-border); border-radius:var(--plugin-radius); }
div.output.card>div.item:hover { box-shadow:var(--notice-box-shadow); }
fieldset>div.output.card>div.item>div.title { border-bottom:var(--box-border); }
fieldset>div.output.card>div.item>div.action>input { box-shadow:var(--input-box-shadow); }
@ -643,12 +689,12 @@ fieldset>div.status { border-top:var(--status-border); }
fieldset>div.status>legend.select { box-shadow:var(--legend-box-shadow); }
fieldset>div.status>legend:hover { box-shadow:var(--legend-box-shadow); }
fieldset.Action>div.toast>div.toast:hover { box-shadow:var(--notice-box-shadow); }
table.content th { box-shadow:var(--th-box-shadow); }
// table.content th { box-shadow:var(--th-box-shadow); }
fieldset.input.key table.content th { box-shadow:none; }
fieldset.input.key table.content.checkbox td:first-child { box-shadow:none; }
table.content.checkbox td:first-child { box-shadow:var(--th-box-shadow); }
table.content.action td:last-child { box-shadow:var(--th-box-shadow); }
table.content.detail tr.action td { box-shadow:var(--th-box-shadow); position:sticky; bottom:2px; }
// table.content.checkbox td:first-child { box-shadow:var(--th-box-shadow); }
// table.content.action td:last-child { box-shadow:var(--th-box-shadow); }
// table.content.detail tr.action td { box-shadow:var(--th-box-shadow); position:sticky; bottom:2px; }
div.project:not(.toggle) { border-right:var(--box-border); overflow-x:hidden; }
div.layout>div.profile:not(.toggle) { border-left:var(--box-border); }
div.layout>div.display:not(.toggle) { border-top:var(--box-border); }
@ -674,13 +720,14 @@ legend { font-size:var(--legend-font-size); line-height:30px; height:var(--actio
legend>img { margin-right:var(--input-margin); height:28px; display:block; float:left; }
legend>span.icon:first-child { margin-right:var(--input-margin); }
legend>i:first-child { margin-right:var(--input-margin); }
select, input { font-size:var(--body-font-size); height:var(--action-height); } input::placeholder, textarea::placeholder { font-style:italic; color:var(--disable-fg-color); }
select, input { font-size:var(--body-font-size); height:var(--action-height); } input::placeholder, textarea::placeholder { font-style:italic; color:var(--label-fg-color); }
input[type=checkbox] { height:16px; width:16px; cursor:pointer; }
textarea { font-family:var(--input-font-family); font-size:var(--body-font-size); padding:var(--input-padding); height:var(--textarea-height); width:100%; outline:none; resize:vertical; }
table.content.full { width:100%; }
table.content col.time { width:180px; }
table.content col.action { width:var(--project); }
table.content.detail td:first-child { width:var(--input-width); box-shadow:var(--th-box-shadow); }
table.content.detail td:first-child { width:var(--input-width); }
// table.content.detail td:first-child { width:var(--input-width); box-shadow:var(--th-box-shadow); }
body.mobile table.content.detail td:first-child { max-width:150px; word-break:break-all; white-space:break-spaces; }
table.content.detail td { min-width:90px; }
table.content.detail tr.option td { top:34px; z-index:2; }
@ -753,12 +800,13 @@ body:not(.width2):not(.mobile) fieldset.plugin.feel>form.option>div.item.text.fi
body:not(.width2) fieldset>div.action>div.item.text.filter>input { width:var(--input-width); height:30px; transition:all 1.2s; }
body:not(.width2) fieldset>div.action>div.item.text.filter>input:focus { width:var(--project-width); transition:all 0.5s; }
div.item.text.will>input { border:var(--box-notice); }
div.item.text>i:first-child { color:var(--disable-fg-color); position:absolute; left:0; padding:var(--input-padding); }
div.item.text>i:first-child { color:var(--label-fg-color); line-height:22px; padding:var(--input-padding); position:absolute; left:0; }
body:mobile(.mobile) div.item.text:hover>i:first-child { color:unset; }
div.item.text>span.icon { font-size:var(--icon-font-size); padding:var(--input-padding); position:absolute; right:0; visibility:hidden; }
body:not(.mobile) div.item.text:hover>span.icon { visibility:visible; }
div.item.button { position:relative; height:var(--action-height); }
div.item.button.icons.state { margin-right:var(--input-margin); }
body.mobile div.action div.item.button.icons.open { display:none; }
div.item.button.icons>i { font-size:20px; padding:var(--input-padding); }
div.item.button>span.icon { font-size:var(--icon-font-size); padding:0 var(--input-padding); }
div.item.button.select>span.icon { padding:var(--input-padding); visibility:hidden; position:absolute; right:0; }
@ -822,6 +870,10 @@ fieldset.story.float:not(.plug)>form.option>div.text.filter>span.value { display
fieldset.story.float:not(.plug)>form.option>div.text>span.icon { display:none; }
fieldset.story.float:not(.plug)>form.option>div.text>span.value { display:unset; }
/* svg */
div.output>svg {
display:block;
clear:both;
}
svg text { font-size:var(--svg-font-size); font-family:var(--svg-font-family); stroke:var(--body-fg-color); fill:var(--body-fg-color); cursor:pointer; }
svg g[font-size] text { font-size:unset; }
svg[font-size] text { font-size:unset; }
@ -871,7 +923,7 @@ body.mobile fieldset.Search>div.action>div.item.filter { width:100%; position:re
body.mobile fieldset.River { position:fixed; top:var(--header-height); z-index:11; }
body.mobile fieldset.River>div.output { font-size:1.4rem; min-width:var(--project-width); }
html:not(.login) body.mobile:not(.cmd) fieldset.Action { margin-top:var(--header-height); }
body.mobile fieldset.Action.cmd { margin-top:0; }
body.mobile fieldset.Action.cmd { margin-top:0; width:100%; }
body.mobile fieldset.Action { overflow:hidden; }
body.mobile fieldset.Action>div.output { overflow-x:hidden; }
body.mobile fieldset.word>div.output { overflow-x:hidden; }
@ -928,6 +980,7 @@ fieldset.desktop>div.status { display:none; }
fieldset.qrcode>div.output div.code { padding:0; }
fieldset.xterm>div.output>div.project { font-family:var(--code-font-family); }
fieldset.xterm>div.output>div.project div.item.offline { color:var(--disable-fg-color); }
fieldset.xterm.output { background-color:var(--output-bg-color); }
fieldset.xterm.float>div.status { display:none; }
fieldset.xterm.float>form.option>div.item.text { display:none; }
fieldset.full { position:fixed; bottom:unset; }
@ -947,7 +1000,7 @@ fieldset.plug.dream.zone>div.output>div.item { display:flex; padding:var(--input
fieldset.plug.dream.zone>div.output>div.item>img { margin-right:var(--input-margin); }
fieldset.plug.dream.zone>div.output>div.item>span { line-height:var(--action-height); }
fieldset.plug.dream.zone>div.output>div.item.origin.select { border-right:var(--box-danger3); }
fieldset.web.stats>div.output { align-items: normal; }
fieldset.web.stats>div.output { align-items:normal; }
fieldset.web.code.git>div.output>fieldset.web.code.inner>div.output { overflow:auto; }
fieldset.web.code.git.total.draw div.output { text-align:center; }
fieldset.web.code.git.trend>div.output rect { cursor:pointer; }
@ -966,12 +1019,15 @@ fieldset.web.chat.location>div.output>div.layout>div.layout { position:relative;
fieldset.web.chat.location>div.output .amap-toolbar { z-index:unset; }
fieldset.web.chat.location>div.output .amap-controls { z-index:unset; }
fieldset.web.chat.location>div.output .amap-maptypecontrol { z-index:unset; }
fieldset.web.code.compose.insight>div.output { max-height:unset !important; height:unset !important; overflow:hidden; }
fieldset.web.chat.location>div.output>div.layout>div.layout>div.profile { background-color:var(--plugin-bg-color); position:absolute; right:0; width:360px; z-index:2; border-left:none; }
fieldset.web.chat.color table.content { border-collapse:collapse; }
fieldset.web.mall.region>div.output>table.content td:nth-child(3) { text-align:right; }
fieldset.web.mall.region>div.output>table.content td:nth-child(4) { text-align:right; }
fieldset.web.mall.region>div.output>table.content td:nth-child(5) { text-align:right; }
fieldset.web.mall.region>div.output>fieldset.web.mall.region.float>div.action { display:none; }
fieldset.web.team.portal>form.option { display:none; }
fieldset.feel.play.float>div.output { justify-content:center; }
fieldset.user>form.option>div.item.username input { width:var(--project-width); }
fieldset.offer>div.output>table.content tr.invite { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
@ -1036,7 +1092,7 @@ fieldset.Search>div.output>div.profile { border-left:none; width:unset; }
fieldset.Search>div.output>div.content>table.content td { cursor:pointer; }
fieldset.Action.tabs table.content { width:100%; }
fieldset.Action:not(.cmd)>div.output>fieldset.plugin:not(.float):not(.full):not(.cmd) { padding:var(--plugin-padding); margin:var(--plugin-margin); }
fieldset.Action>div.output>fieldset.plugin:not(.float):not(.full):not(.cmd)>legend { float:none; }
// fieldset.Action>div.output>fieldset.plugin:not(.float):not(.full):not(.cmd)>legend { float:none; }
fieldset.Action>div.output>fieldset.plugin:not(.float):not(.full):not(.cmd)>legend:not(:hover) { background-color:var(--plugin-bg-color); }
fieldset.Action>div.output>fieldset.ssh.cloud.profile { box-shadow:none; background-color:transparent; }
fieldset.Action>div.output>fieldset.ssh.cloud.profile:hover { box-shadow:none; }

View File

@ -84,7 +84,7 @@ Volcanos("base", {
for (var k in val) { k && val[k] && res.push(k, val[k]) } break
default: res.push(val)
} } return res },
AddUniq: function(list, value) { list = list||[], list.indexOf(value) == -1 && list.push(value); return list },
AddUniq: function(list, value) { list = list||[], value && list.indexOf(value) == -1 && list.push(value); return list },
isIn: function(item) { var arg = arguments; for (var i = 1; i < arg.length; i++) {
if (typeof arg[i] == code.OBJECT && arg[i].length > 0 && arg[i].indexOf(item) > -1) { return true }
if (item == arg[i]) { return true }
@ -170,7 +170,7 @@ Volcanos("base", {
if (arg.length > 2) { for (var i = 1; i < arg.length; i++) { str = callee(str, arg[i]) } return str }
if (str.indexOf(pre) == -1) { return str } return str.slice(pre.length)
},
trimSuffix: function(str, end, once) { while (str) { var index = str.lastIndexOf(end)
trimSuffix: function(str, end, once) { while (str && end) { var index = str.lastIndexOf(end)
if (index == -1 || index+end.length != str.length) { break } str = str.slice(0, index)
if (once) { break }
} return str },

View File

@ -54,6 +54,9 @@ Volcanos("misc", {
IsDetail: function() {
return msg.Option("fields") == "detail" || msg.append && msg.append.length == 2 && msg.append[0] == "key" && msg.append[1] == "value"
},
IsTech: function() {
return can.user.isTechOrRoot(can)
},
Table: function(cb) { return can.core.List(msg.Length(), function(index) { var item = {}
can.core.List(msg.append, function(k) { item[k] = msg[k]&&msg[k][index]||"" })
return can.base.isFunc(cb)? cb(item, index): item
@ -121,7 +124,8 @@ Volcanos("misc", {
can.onmotion.clear(can, target), can.onappend.table(can, msg, null, target), can.onappend.board(can, msg, target), can.onmotion.story.auto(can)
},
Show: function(can) { can = can||msg._can; if (can.user.isNodejs) { return }
can.onmotion.clear(can), can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.story.auto(can)
// can.onmotion.clear(can),
can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.story.auto(can)
},
Defer: function(cb) { msg._defer = msg._defer||[]
if (arguments.length == 0) { msg._defer = can.core.List(msg._defer.reverse(), function(cb) { can.base.isFunc(cb) && cb() }) } else { msg._defer.push(cb) }
@ -199,7 +203,10 @@ Volcanos("misc", {
if (xhr.responseText.indexOf("warn: ")) { var res = {result: [xhr.responseText]} } else { var res = {result: [xhr.responseText]} }
} msg.Option("_cost", new Date() - begin), msg.detail || (msg.detail = res.detail), msg.Copy(res)
if (xhr.status == 200) { return can.base.isFunc(cb) && cb(msg) } typeof msg._failure == code.FUNCTION && msg._failure()
can.user.toastFailure(msg._can||can, msg.Result(), msg.Option(ice.MSG_TITLE)), can.misc.Warn(xhr.status, res, url, form), cbs && cbs(xhr)
var info = can.core.List(msg.result, function(res) {
return {"warn: ": "报错: ", "not right: ": "没有权限: ", "not valid: ": "非法操作: "}[res]||res
}).join("")
can.user.toastFailure(msg._can||can, info+msg.Option(ice.LOG_TRACEID), msg.Option(ice.MSG_TITLE)), can.misc.Warn(xhr.status, res, url, form), cbs && cbs(xhr)
}, xhr.setRequestHeader(http.Accept, msg._accept||http.ApplicationJSON)
if (msg._upload) { var data = new FormData(); can.core.ItemForm(form, function(v, i, k) { data.append(k, v) })
data.append(ice.MSG_UPLOAD, web.UPLOAD), data.append(web.UPLOAD, msg._upload)

View File

@ -36,6 +36,8 @@ Volcanos("page", {
key == "className" && can.base.isArray(val) && (val = val.join(lex.SP)), !can.base.isObject(val)? (target[key] = val): can.core.Item(val, function(k, v) {
if (can.base.isIn(k, "height", "width", "min-height", "max-height", "min-width", "max-width") && parseInt(v) < 0) { return target[key] && (target[key][k] = "") }
if (can.base.isIn(k, "height", "width", "min-height", "max-height", "min-width", "max-width", "left", "top", "right", "bottom", "margin-left", "margin-top", "margin", "padding", "font-size") && v && (can.base.isNumber(v) || !can.base.endWith(v, "px"))) { v += "px" }
if (can.base.isIn(k, "background-image")) { v = "url("+v+")" }
if (can.base.isIn(k, "background") && v) { v = "url("+v+")" }
target[key] && (target[key][k] = v)
})
}); return target
@ -205,6 +207,7 @@ Volcanos("page", {
can.page.Append(can, ui.tbody, can.core.List(msg.Table(), function(item, index, array) {
return {dataset: {index: index}, className: item[mdb.STATUS], td: can.core.List(list, function(key) { if (key[0] != "_") { return cb(can.page.Color(item[key]).trim(), key, index, item, array) } }) }
}))
can.page.Select(can, ui.tbody, html.TR, function(tr) { if (tr.innerHTML == "") { can.page.Remove(can, tr) } })
if (msg.Option(ice.TABLE_CHECKBOX) == ice.TRUE && !msg.IsDetail()) { can.onappend.checkbox(can, ui._target, msg), can.onappend.style(can, html.CHECKBOX, ui._target) }
return can.page.OrderTable(can, ui._target)
},
@ -416,11 +419,12 @@ Volcanos("page", {
return _list
},
button: function(can, name, cb) {
var icon = can.Conf("_icons."+name)
if (icon) { return {icon: icon, onclick: cb||function(event) { can.Update(event, [ctx.ACTION, name]) }} }
return {view: [["item.button"]], list: [
{type: html.INPUT, data: {type: html.BUTTON, name: name, value: can.user.trans(can, name)}, onclick: cb||function(event) { can.Update(event, [ctx.ACTION, name]) }},
{text: name},
var data = typeof name == "string"? {name: name}: name
var icon = can.Conf("_icons."+data.name)
if (icon) { return {icon: icon, onclick: cb||function(event) { can.Update(event, [ctx.ACTION, data.name]) }} }
return {view: [["item.button", data.className]], list: [
{type: html.INPUT, data: {type: html.BUTTON, name: data.name, value: data.value||can.user.trans(can, data.name)}, onclick: cb||function(event) { can.Update(event, [ctx.ACTION, name]) }},
{text: data.name},
]}
},
input: function(can, item, value) { var input = {type: html.INPUT, name: item.name, data: item, style: item.style||{}, dataset: {}, _init: item._init}

View File

@ -61,15 +61,15 @@ Volcanos("user", {
close: function(url) { return window.close() },
theme: function(can, name) { can.base.isString(name) && (name = [name]) || name || []
name.push(html.WIDTH+parseInt((can.page.width()+32)/320))
can.misc.isDebug(can) && name.push(log.DEBUG)
can.user.info.userrole && name.push(can.user.info.userrole)
can.user.language(can) && name.push(can.core.Split(can.user.language(can), "-_.")[0])
can.user.mod.isCmd && name.push(chat.CMD), can.user.mod.cmd && name.push(can.user.mod.cmd.replaceAll(".", " "))
can.user.isWeiXin && name.push("weixin")
can.user.mod.isCmd && name.push(chat.CMD), can.user.mod.cmd && name.push(can.base.replaceAll(can.user.mod.cmd, ".", " "))
// if (window.innerWidth <= 1080) { can.user.isIPad = true }
can.user.isIPad && name.push("pad") && can.user.isLandscape() && name.push(html.LANDSCAPE)
can.user.isMobile && name.push(html.MOBILE) && can.user.isLandscape() && name.push(html.LANDSCAPE)
can.user.isWindows && name.push(html.WINDOWS), can.user.isWebview && name.push(html.WEBVIEW)
can.user.isMobile && name.push(html.MOBILE) && can.user.isLandscape() && name.push(html.LANDSCAPE)
can.user.isWeiXin && name.push("weixin")
can.user.language(can) && name.push(can.core.Split(can.user.language(can), "-_.")[0])
can.user.info.userrole && name.push(can.user.info.userrole)
can.misc.isDebug(can) && name.push(log.DEBUG)
can.page.styleClass(can, document.body, name.join(lex.SP))
},
title: function(text) {
@ -125,7 +125,7 @@ Volcanos("user", {
meta.title = meta.title||can.user.trans(can, can.core.Keys(can.ConfSpace(), can.ConfIndex()), can.ConfHelp())||can._name.split(nfs.PS).slice(-2).join(nfs.PS)
meta.title = can.base.replaceAll(can.user.trans(can, meta.title||""), "%2F", "/")
meta.hash && can.misc.isDebug(can) && (meta.title += " "+meta.hash.slice(0, 6)), meta.action = meta.action||[""]
var width = meta.width||(html.QRCODE_WIDTH+2*html.PLUGIN_PADDING+10); if (width < 0) { width = can.page.width() + width }
var width = meta.width||(html.CARD_WIDTH+2*html.PLUGIN_PADDING+10); if (width < 0) { width = can.page.width() + width }
if (can.user.isMobile && !can.user.isLandscape()) { width = window.innerWidth }
var ui = can.page.Append(can, meta.action.list||meta.action.length > 1 || !can._root||!can._root.Action||!can._root.Action._toast? document.body: can._root.Action._toast,
[{view: [[chat.TOAST, can.ConfIndex(), meta.style, html.FLOAT]], style: {width: width}, list: [
@ -281,10 +281,15 @@ Volcanos("user", {
}
var target = can.page.Select(can, ui._target, "input.args[name="+key+"]")[0]
if (!target) { return }
if (value != undefined) { target.value = target.value||value }
// if (value != undefined) { target.value = target.value||value }
if (value != undefined) { target.value = value }
if (target.value && hidden) { can.onmotion.hidden(can, can.page.parentNode(can, target, html.TR)) }
return target.value
},
Prompt: function(key, value) {
var target = can.page.Select(can, ui._target, "div.item."+key)[0]
target && can.page.Append(can, target.parentNode, [{view: [[html.ITEM, "prompt"], "", value], style: {width: target.offsetWidth}}])
},
layout: function(event) {
if (event && event.target) { can.onlayout.figure(event, can, ui._target)
can.user.isMobile && can.page.style(can, ui._target, html.LEFT, (can.page.width()-ui._target.offsetWidth)/2, html.TOP, 40)
@ -294,6 +299,7 @@ Volcanos("user", {
},
cancel: function(event, can, button) {
can.onmotion.clearFloat(can)
can.page.ClassList.del(can, can._fields||can._target, "_process")
button == "cancel" && msg._cancel && msg._cancel(event), callback("afterInputs", button)
can.onengine.signal(can, "onremove", can.request(event, {query: can.page.getquery(can, ui._target)})), can.page.Remove(can, ui._target)
@ -318,7 +324,7 @@ Volcanos("user", {
title && can.page.Select(can, action._target, "input[name=submit]", function(target) { target.value = can.user.trans(can, title) })
action.layout(event), can.onmotion.delay(can, function() { action.focus() }, 300)
function callback(key, button) { var sub = can._fields? can: can.sub; sub && sub.onaction && sub.onaction[key] && sub.onaction[key](event, sub, button, action) }
callback("beforeInputs")
callback("beforeInputs", msg.Option(ctx.ACTION))
// ui._target._layout = action.layout
return button === true && action.submit(event, can, html.SUBMIT), action
},
@ -333,7 +339,11 @@ Volcanos("user", {
]}])
can.user.isMobile && can.page.style(can, ui._target, html.LEFT, 0, html.WIDTH, window.innerWidth)
can.onlayout.figure(event, can, ui._target)
var action = can.onappend._action(can, [{type: html.UPLOAD, onchange: function(event) { action.show(event, 0, event.target.files[0].size, 0) }}, {type: html.BUTTON, name: cli.CLOSE}], ui.action, {
var action = can.onappend._action(can, [{type: html.UPLOAD, onchange: function(event) {
action.show(event, 0, event.target.files[0].size, 0)
}, oncancel: function(event) {
can.page.Remove(can, ui._target)
}}, {type: html.BUTTON, name: cli.CLOSE}], ui.action, {
begin: function() { begin = new Date(), can.user.toastProcess(can, "upload")
var upload = can.page.Select(can, ui.action, html.INPUT_FILE)[0]; if (upload.files.length == 0) { return upload.focus() }
var msg = can.request(event, can.Option(), {_handle: ice.TRUE}); msg._upload = upload.files[0], msg._progress = action.show
@ -439,8 +449,7 @@ Volcanos("user", {
}},
avatar: {view: [[html.ITEM, "state", aaa.AVATAR]], list: [{img: can.misc.Resource(can, can.user.info.avatar)}], onclick: function(event) { header && header.onaction.avatar(event, header) }},
usernick: {view: [[html.ITEM, "state", aaa.USERNICK, html.FLEX], "", can.user.info.usernick], onclick: function(event) { header && header.onaction.usernick(event, header) }, _init: function(target) {
can = can._fields? can.sup: can
can.ui.head = target.parentNode
can = can._fields? can.sup: can; can.ui.head = target.parentNode
}},
qrcode: {view: [[html.ITEM, "state", cli.QRCODE]], list: [{icon: icon.qrcode}], onclick: function(event) { var _can = can._fields? can.sup: can; _can.onaction["生成链接"](event, _can) }},
}; return can.core.List(can.base.getValid(can.core.List(arguments).slice(1), [html.SPACE, mdb.TIME, aaa.AVATAR, aaa.USERNICK, cli.QRCODE]), function(item) { return meta[item] })

View File

@ -4,13 +4,12 @@ Volcanos(chat.ONIMPORT, {
var _select; can.onmotion.clear(can), can.onaction.layout(can, list[3])
can.core.Next(msg.Table(), function(item, next, index) { item.type = chat.PLUGIN, item.mode = can.Mode(); if (item.deleted == ice.TRUE) { return next() }
if (msg.Length() == 1) { item.height = can.ConfHeight()-can.Conf(html.MARGIN_Y), can.base.isIn(item.index, web.CHAT_MACOS_DESKTOP, web.CHAT_MESSAGE, web.WIKI_PORTAL) && (item.style = html.OUTPUT) }
can.base.isIn(item.index, ssh.CLOUD_PROFILE) && (item.style = html.OUTPUT)
// can.base.isIn(item.index, ssh.CLOUD_PROFILE) && (item.style = html.OUTPUT)
if (list.length == 0) {
can.user.info.nodetype == web.SERVER && item._command == web.DREAM && (list = [river, storm, item._command])
can.user.info.nodetype == web.WORKER && item._command == web.VIMER && (list = [river, storm, item._command])
}
can.onappend.plugin(can, item, function(sub, meta, skip) {
can.user.isMobile || sub.Conf(ice.AUTO, cli.DELAY)
can.onappend.plugin(can, item, function(sub, meta, skip) { can.user.isMobile || sub.Conf(ice.AUTO, cli.DELAY)
if (msg.detail && can.base.isIn(meta.index, "can._notfound")) { sub.Conf(ctx.INDEX, msg.detail[index+3]) }
sub.run = function(event, cmds, cb) { return can.run(can.request(event, {pod: meta.pod||meta.space}), (can.base.beginWith(meta.index, "can.")? [meta.index]: [river, storm, meta.id||meta.index]).concat(cmds), cb) }
sub.onexport.output = function() { msg.Length() > 1 && can.onexport.isauto(can) && can.page.style(can, sub._output, html.HEIGHT, "", html.MAX_HEIGHT, ""), can.onaction.layout(can, list[3]) }
@ -27,7 +26,7 @@ Volcanos(chat.ONIMPORT, {
can.user.mod.isPod && can.user.title(["后台", sub.ConfHelp(), can.user.info.titles].join(" "))
// can.onmotion.delay(can, function() { sub._header_tabs.scrollIntoViewIfNeeded() })
var layout = can.onexport.layout(can); layout == FREE || (can._output.scrollTop = sub._target.offsetTop-10)
can.isCmdMode() || can.misc.SearchHash(can, can.Conf(chat.RIVER), can.Conf(chat.STORM), sub.ConfIndex(), layout)
can.isCmdMode() || can.onexport.hash(can, can.Conf(chat.RIVER), can.Conf(chat.STORM), sub.ConfIndex(), layout)
sub.Conf(ice.AUTO) == cli.DELAY && sub._output.innerHTML == "" && sub.Update(event)
sub.onimport.size(sub, can.ConfHeight()-can.Conf(html.MARGIN_Y), can.ConfWidth()-can.Conf(html.MARGIN_X), can.onexport.isauto(can))
can.onengine.signal(can, "onindex", can.request(_init? {target: event.target, type: "click", isTrusted: true}: event, {index: sub.ConfIndex()})), _init = false
@ -73,7 +72,7 @@ Volcanos(chat.ONACTION, {
if (msg.Length() == 1) { can.onaction._onaction_cmd(can) } can.onimport._init(can, msg)
})
},
onstorm_select: function(can, msg, river, storm) { can.misc.SearchHash(can, river, storm)
onstorm_select: function(can, msg, river, storm) { can.onexport.hash(can, river, storm)
if (can.onmotion.cache(can, function(save, load) { save({plugins: can._plugins, current: can._current}), can._plugins = []
return load(can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm)), function(bak) { can._plugins = bak.plugins, can._current = bak.current })
}, can._output, can._action, can._header_tabs)) {
@ -107,7 +106,7 @@ Volcanos(chat.ONACTION, {
portal: function(can) { can.user.opens(can.misc.MergePodCmd(can, {cmd: web.PORTAL})) },
desktop: function(can) { can.user.opens(can.misc.MergePodCmd(can, {cmd: web.DESKTOP})) },
layout: function(can, button, skip) { var before = can._layout||can.onlayout._storage(can); button = button||before||(can.user.isMobile? ALL: TABVIEW)
var list = can.misc.SearchHash(can); list.length > 2 && (list[3] = button); can.isCmdMode() || can.misc.SearchHash(can, list[0], list[1], list[2], list[3])
var list = can.onexport.hash(can); list.length > 2 && (list[3] = button); can.isCmdMode() || can.onexport.hash(can, list[0], list[1], list[2], list[3])
can.page.ClassList.del(can, can._target, before), can._header_tabs && can.onmotion.hidden(can, can._header_tabs)
button = (can.onlayout._storage(can, can._layout = 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, before: before}))
@ -136,12 +135,30 @@ Volcanos(chat.ONLAYOUT, {
if (can.page.ClassList.has(can, sub._target, html.OUTPUT)) {
return sub.onimport.size(sub, can.ConfHeight()-(can.user.isMobile? 2*html.PLUGIN_PADDING: can.Conf(html.MARGIN_Y)-([ALL, TABS].indexOf(can.onexport.layout(can)) > -1? html.ACTION_HEIGHT: 0)), can.ConfWidth()-can.Conf(html.MARGIN_X), can.onexport.isauto(can))
}
sub.onimport.size(sub, can.ConfHeight()-can.Conf(html.MARGIN_Y)-(can._plugins.length == 1 || button && button != ALL || sub.isCmdMode()? 0: html.ACTION_MARGIN),
sub.onimport.size(sub, can.ConfHeight()-(can.user.isMobile? 2*html.PLUGIN_PADDING: can.Conf(html.MARGIN_Y))-(can._plugins.length == 1 || button && button != ALL || sub.isCmdMode()? 0: html.ACTION_MARGIN),
can.ConfWidth()-can.Conf(html.MARGIN_X), can._plugins.length > 1 && can.onexport.isauto(can)) && can.page.style(can, sub._output, html.HEIGHT, "", html.MAX_HEIGHT, "")
}) },
_storage: function(can, value) { return can.user.isMobile? "all": (can.misc.sessionStorage(can, can.core.Keys(CAN_LAYOUT, location.pathname), value)||[])[0] },
})
Volcanos(chat.ONEXPORT, {
hash: function(can) {
var hash = can.core.List(arguments).slice(1).join(":")
if (can.user.isMobile) {
if (arguments.length == 1) {
hash = can.misc.sessionStorage(can, "action:hash")
if (hash) {
return hash[0].split(":")
} else {
return []
}
}
var link = can.base.trimSuffix(location.href, location.hash)
can.user.agent.init(can, "", "", link+"#"+hash)
return can.misc.sessionStorage(can, "action:hash", hash)
}
if (arguments.length == 1) { return can.misc.SearchHash(can) }
return can.misc.SearchHash(can, hash.split(":"))
},
size: function(can, msg) {
msg.Option(html.LEFT, can._output.offsetLeft), msg.Option(html.TOP, can._output.offsetTop)
msg.Option(html.HEIGHT, can._output.offsetHeight||window.innerHeight), msg.Option(html.WIDTH, can._output.offsetWidth||window.innerWidth)

View File

@ -81,7 +81,8 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
if (window.parent == window && can.misc.Search(can, ice.MSG_SESSID) && can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID)) && !can.user.isMailMaster) {
return can.misc.Search(can, ice.MSG_SESSID, "")
} can.user.info.sessid = can.misc.Search(can, ice.MSG_SESSID)
function lang(msg, cb) { can.user.info.language = msg.SearchOrOption(aaa.LANGUAGE)||msg.Option(ice.MSG_LANGUAGE)
function lang(msg, cb) {
can.user.info.language = msg.SearchOrOption(aaa.LANGUAGE)||msg.Option(ice.MSG_LANGUAGE)
can.user.info.language? can.require([can.misc.Resource(can, nfs.SRC_TEMPLATE+web.CHAT_HEADER+"/language/"+can.user.info.language+".js")], cb, function(can, name, sub) { can.base.Copy(can.user._trans, sub._trans) }): cb && cb()
can.onmotion.delay(can, function() { can.onimport._language(can) })
}
@ -95,16 +96,13 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
can.user.info.usernick = can.Conf(aaa.USERNICK)
can.user.info.repos = msg.Option(nfs.REPOS)
can.user.info.email = msg.Option(aaa.EMAIL)
can.user.info.avatar = msg.Option(aaa.AVATAR)
can.user.info.avatar = msg.Option(aaa.AVATAR)||msg.Option("user.avatar")
can.user.info.background = msg.Option(aaa.BACKGROUND)
can.user.info.favicon = msg.Option("favicon")
can.user.info.titles = msg.Option("titles")||document.title
lang(msg, function() { can.onmotion.clear(can), can.onimport._init(can, can.request(), can._output), can.onengine.signal(can, chat.ONLOGIN) })
}
can.run(can.request({}, {_method: http.GET}), [], function(msg) { lang(msg)
if (msg.Option(ice.MSG_PROCESS) == "_open") {
// return can.user.jumps(msg.Option("_arg"))
}
can.ui.diy = can.base.Obj(msg.Option("diy"))||{}, can.__theme = can.onimport._theme(can, can.page.theme(function(theme) {
can.onengine.signal(can, chat.ONTHEMECHANGE, can.request(event, {theme: can.__theme = can.onimport._theme(can, theme)})), can.onimport.theme(can)
})), can.onimport.theme(can, can.misc.Search(can, "theme")||"")
@ -118,7 +116,7 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
msg.Option(mdb.PLUGIN) && can.onappend.plugin(can, {space: msg.plugin[1], index: msg.Option(mdb.PLUGIN)}, function(sub) { can.onmotion.hidden(can, sub._target) }, document.body)
msg.Option(nfs.SCRIPT) && can.require(can.base.Obj(msg.Option(nfs.SCRIPT)), function(can) { can.onaction.source(can, msg) })
var tool = can._root.Action._conf.tool
if (can.Conf(aaa.USERNICK, (msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME)).slice(0, 8))
if (can.Conf(aaa.USERNICK, (msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME)).slice(0, 16))
|| can.misc.Search(can, web.SHARE) || tool && can.base.isIn(can.user.info._cmd = tool[0]._command, "web.chat.oauth.client", web.PORTAL, aaa.OFFER, aaa.APPLY)) { return show(msg) }
can.onlayout._init(can), can.user.login(can, function() { can.onengine.signal(can, chat.ONMAIN, msg) }, msg)
})
@ -211,8 +209,14 @@ Volcanos(chat.ONPLUGIN, {
modify: shy(function(can, msg, arg) { if (arg[0] == mdb.VALUE) { can.misc.sessionStorage(can, msg.Option(mdb.NAME), arg[1]) } else {
can.misc.sessionStorage(can, arg[1], msg.Option(mdb.VALUE)), can.misc.sessionStorage(can, msg.Option(mdb.NAME), "")
} }),
}, [web.FILTER, ice.LIST, mdb.CREATE, mdb.PRUNES], function(can, msg, arg) { msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
can.core.Item(can.misc.sessionStorage(can), function(name, value) { can.base.contains(name, arg[0]) && msg.Push(mdb.NAME, name).Push(mdb.VALUE, value) })
}, [web.FILTER, ice.LIST, mdb.CREATE, mdb.PRUNES], function(can, msg, arg) {
// msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
can.core.Item(can.misc.sessionStorage(can), function(name, value) {
if (name == "can.daemon") { return }
can.base.contains(name, arg[0]) && msg.Push(mdb.NAME, name).Push(mdb.VALUE, value)
msg.PushButton(mdb.REMOVE)
})
msg.Sort(mdb.NAME)
}),
localStorage: shy("本地存储", {
create: shy([mdb.NAME, mdb.VALUE], function(can, name, value) { can.misc.localStorage(can, name, value) }),
@ -220,8 +224,13 @@ Volcanos(chat.ONPLUGIN, {
modify: shy(function(can, msg, arg) { if (arg[0] == mdb.VALUE) { can.misc.localStorage(can, msg.Option(mdb.NAME), arg[1]) } else {
can.misc.localStorage(can, arg[1], msg.Option(mdb.VALUE)), can.misc.localStorage(can, msg.Option(mdb.NAME), "")
} }),
}, [web.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
can.core.Item(can.misc.localStorage(can), function(name, value) { can.base.contains(name, arg[0]) && msg.Push(mdb.NAME, name).Push(mdb.VALUE, value) })
}, [web.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) {
// msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
can.core.Item(can.misc.localStorage(can), function(name, value) {
can.base.contains(name, arg[0]) && msg.Push(mdb.NAME, name).Push(mdb.VALUE, value)
can.base.beginWith(name, "sessid_")? msg.PushButton(): msg.PushButton(mdb.REMOVE)
})
msg.Sort(mdb.NAME)
}),
cookie: shy("会话参数", {
create: shy([mdb.NAME, mdb.VALUE], function(can, name, value) { can.misc.Cookie(can, name, value) }),
@ -229,8 +238,14 @@ Volcanos(chat.ONPLUGIN, {
modify: shy(function(can, msg, arg) { if (arg[0] == mdb.VALUE) { can.misc.Cookie(can, msg.Option(mdb.NAME), arg[1]) } else {
can.misc.Cookie(can, arg[1], msg.Option(mdb.VALUE)), can.misc.Cookie(can, msg.Option(mdb.NAME), "")
} }),
}, [web.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
can.core.Item(can.misc.Cookie(can), function(name, value) { can.base.contains(name, arg[0]) && msg.Push(mdb.NAME, name).Push(mdb.VALUE, value) })
}, [web.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) {
// msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
can.core.Item(can.misc.Cookie(can), function(name, value) {
if (can.base.beginWith(name, "sessid_")) { return }
can.base.contains(name, arg[0]) && msg.Push(mdb.NAME, name).Push(mdb.VALUE, value)
can.base.beginWith(name, "sessid_")? msg.PushButton(): msg.PushButton(mdb.REMOVE)
})
msg.Sort(mdb.NAME)
}),
language: shy("语言地区", {_init: function(can) { can.Option(aaa.LANGUAGE, can.user.info.language||ice.AUTO) }}, ["language:select=auto,zh,en", ctx.RUN], function(can, msg, arg) { can.onimport.language(can, arg[0]) }),
avatar: shy("用户头像", function(can, sub, cb) { can.page.Append(can, sub._output, [{img: can.user.info.avatar, style: kit.Dict(html.MAX_HEIGHT, sub.ConfHeight(), html.MAX_WIDTH, sub.ConfWidth())}]) }),

View File

@ -74,6 +74,7 @@ Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH],
})
},
action: function(event, can, river, storm) {
can.user.title([can.user.info.titles, can.ui.river_list[river].title, can.ui.storm_list[river+"."+storm].title].join(" "))
can._scrollTop = can._output.scrollTop
can.page.Select(can, can._output, [html.DIV_LIST, html.DIV_ITEM], function(target) { can.page.ClassList.del(can, target, html.SELECT) })
can.onmotion.toggle(can, can.ui.sublist[river], true)
@ -126,6 +127,24 @@ Volcanos(chat.ONDETAIL, {
], 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, {
hash: function(can) {
var hash = can.core.List(arguments).slice(1).join(":")
if (can.user.isMobile) {
if (arguments.length == 1) {
hash = can.misc.sessionStorage(can, "action:hash")
if (hash) {
return hash[0].split(":")
} else {
return []
}
}
var link = can.base.trimSuffix(location.href, location.hash)
can.user.agent.init(can, "", "", link+"#"+hash)
return can.misc.sessionStorage(can, "action:hash", hash)
}
if (arguments.length == 1) { return can.misc.SearchHash(can) }
return can.misc.SearchHash(can, hash)
},
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) })})

View File

@ -14,6 +14,7 @@ Volcanos(chat.ONFIGURE, {date: {
mdb.NEXT, function() { now.setMonth(now.getMonth()+1), show(now) }
)
var ui = can.page.Append(can, can._action, ["time", "date"])
can.onappend.style(can, "_date")
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)), TODAY], ui.time, meta)
can.onappend._action(can, [mdb.PREV, [YEAR].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)), [MONTH].concat(can.core.List(1, 13)), mdb.NEXT], ui.date, meta)
can._table = can.page.Appends(can, can._output, [{view: [chat.CONTENT, html.TABLE], list: [{type: html.TBODY}]}]).tbody

View File

@ -1,10 +1,11 @@
Volcanos(chat.ONFIGURE, {img: {
_init: function(can, meta, target) { target.value == meta.value && (target.value = ""); var images = can.core.Split(target.value)
var count = parseInt(meta.value||"1"), width = target.parentNode.offsetWidth; for (var n = 1; n < 10; n++) { if (n*n >= count) { width = (width/n-10); break } }
function add(target, hash) { target._hash = hash, can.page.Appends(can, target, [{img: can.base.MergeURL(can.misc.MergeURL(can, {_path: web.SHARE_CACHE+hash}, true), {pod: meta.space||undefined}), height: width, width: width}]) }
// function add(target, hash) { target._hash = hash, can.page.Appends(can, target, [{img: can.base.MergeURL(can.misc.MergeURL(can, {_path: web.SHARE_CACHE+hash}, true), {pod: meta.space||undefined}), height: width, width: width}]) }
width = can.base.Max(width, 120)
function add(target, hash) { target._hash = hash, can.page.Appends(can, target, [{img: hash, height: width, width: width}]) }
function set() { target.value = can.page.SelectChild(can, target.parentNode, html.DIV, function(target) { return target._hash }).join(mdb.FS) }
can.onmotion.hidden(can, target)
can.onappend.style(can, html.FLEX, target.parentNode)
can.onmotion.hidden(can, target), can.onappend.style(can, html.FLEX, target.parentNode)
for (var i = 0; i < count; i++) {
can.page.Append(can, target.parentNode, [{view: html.FLEX, style: {
"clear": i%n == 0? "both": "none", height: width, width: width,

View File

@ -3,8 +3,11 @@ Volcanos(chat.ONFIGURE, {key: {
if (target._done && target.value) { return can.onmotion.hidden(can, can._target, can.Status("total") > 0)} target._done = true
can.onmotion.focus(can, target), can.onmotion.hidden(can, can._target)
can.runAction(event, mdb.INPUTS, [name, value||""], function(msg) {
name == ctx.INDEX && can.core.Item(can.onengine.plugin.meta, function(key) { msg.Push(ctx.INDEX, can.core.Keys(ice.CAN, key)) })
if (can.sup.ConfIndex() != "web.team.production.case") {
name == ctx.INDEX && can.core.Item(can.onengine.plugin.meta, function(key) { msg.Push(ctx.INDEX, can.core.Keys(ice.CAN, key)) })
}
can._show(can, msg, cb, target, name)
})
},
_show: function(can, msg, cb, target, name) {
@ -24,17 +27,6 @@ Volcanos(chat.ONFIGURE, {key: {
}
if (msg.Length() == 0 || msg.Length() == 1 && msg.Append(name) == target.value && target.value != "") { return can.onmotion.hidden(can) }
if (can.base.isIn(msg.append[msg.append.length-1], ctx.ACTION, "cb")) { msg.append = msg.append.slice(0, -1) } var list = {}
can.onmotion.clear(can), can.onappend.table(can.sup, msg, function(value, key, index, item) { value = item[key]
if (msg.append.length == 1 && index < 100 && list[value]) { return } list[value] = true
return {text: [value, html.TD, [value == ""? html.HR: "", key]], style: msg.append && msg.append.length == 1? kit.Dict(html.MIN_WIDTH, target.offsetWidth-16): {}, onclick: function(event) {
can.onengine.signal(can, "onevent", can.request(event))
can.close(); if (msg.cb && msg.cb[index]) { return msg.cb[index](value) }
var _cb = can.Conf("select"); if (_cb) { return _cb(target.value = value) } can.base.isFunc(cb) && cb(can, value, target.value)
}, _init: function(target) {
can.onappend.style(can, "i-"+index, target.parentNode)
// can.onappend.style(can, "s-"+can.base.replaceAll(item[name], "/", "_"), target.parentNode)
}}
}, can._output)
can.showIcons = function(value, icons, title) { can.ui = can.ui||{}
if (!can.ui.img) {
can.ui.img = can.page.insertBefore(can, [{type: html.IMG}], target)
@ -46,6 +38,25 @@ Volcanos(chat.ONFIGURE, {key: {
can.ui.img.src = can.misc.Resource(can, icons), can.ui.span.innerText = title||value
target.value = value, can.onmotion.hidden(can, can._target)
}
if (msg.Option("_display") && !can.base.beginWith(msg.Option("_display"), "/plugin/input/key.js") && !can.base.contains(msg.Option("_display"), "src/gonganxitong/common.js")) {
target._selectonly = true, can.ConfWidth(target.offsetWidth)
can.run = function(event, cmds, cb) { var list = msg["_input_args"]||msg.append, _msg = can.request(event)
can.showIcons(_msg.Option(list[0]), _msg.Option(list[2]||mdb.ICONS)||_msg.Option(mdb.ICONS)||_msg.Option(mdb.ICON)||_msg.Option("user_avatar"), _msg.Option(list[1]))
}
can.onappend._output(can, msg, msg.Option("_display")+",/plugin/table.js", function(msg) { can.layout(msg) })
return
}
can.onmotion.clear(can), can.onappend.table(can.sup, msg, function(value, key, index, item) { value = item[key]
if (msg.append.length == 1 && index < 100 && list[value]) { return } list[value] = true
return {text: [value, html.TD, [value == ""? html.HR: "", key]], style: msg.append && msg.append.length == 1? kit.Dict(html.MIN_WIDTH, target.offsetWidth-16): {}, onclick: function(event) {
can.onengine.signal(can, "onevent", can.request(event))
can.close(); if (msg.cb && msg.cb[index]) { return msg.cb[index](value) }
var _cb = can.Conf("select"); if (_cb) { return _cb(target.value = value) } can.base.isFunc(cb) && cb(can, value, target.value)
}, _init: function(target) {
can.onappend.style(can, "i-"+index, target.parentNode)
// can.onappend.style(can, "s-"+can.base.replaceAll(item[name], "/", "_"), target.parentNode)
}}
}, can._output)
can.core.CallFunc([can.oninputs, "_show"], {event: event, can: can, msg: msg, target: target, name: name})
var display = msg.Option(ice.MSG_DISPLAY)? can.base.ParseURL(msg.Option(ice.MSG_DISPLAY)): {name: name}
if (display.title && !msg[display.title]) { display.title = msg.append[1] }
@ -65,6 +76,7 @@ Volcanos(chat.ONFIGURE, {key: {
meta.msg && meta.msg.Length() > 0? sub._show(sub, meta.msg, cb, target, meta.name): sub._load(event, sub, cb, target, meta.name, target.value)
}) },
onblur: function(event, can, sub, cb, target) {
return
if (target._hold) { return }
if (target._selectonly) { return }
// can.onengine.signal(can, "onevent", can.request(event, {query: can.page.getquery(can, target)+","+target.value}))

19
plugin/input/upload.js Normal file
View File

@ -0,0 +1,19 @@
Volcanos(chat.ONFIGURE, {upload: {
_init: function(can, meta, target) {
target.placeholder = "点击上传文件"
},
onkeydown: function(event, can, meta, target, cbs) {
can.onkeymap.prevent(event)
},
onkeyup: function(event, can, meta, target, cbs) {
can.onkeymap.prevent(event)
},
onclick: function(event, can, meta, target, cbs) {
can.user.upload(event, can, function(msg) {
target.value = msg.Result()
})
},
onfocus: function(event, can, meta, target, cbs, mod) {
can.onmotion.delay(can, function() { target.blur() })
},
}})

View File

@ -35,8 +35,8 @@ fieldset.inner>div.output>div.layout>div.layout>div.profile h2 { border-bottom:v
fieldset.inner>div.output>div.layout>div.layout>div.profile pre>code { padding-left:var(--table-padding); border-left:var(--box-notice3); display:block; }
fieldset.inner>div.output>div.layout>div.layout>div.profile>div.code { white-space:unset; padding:var(--table-padding); }
fieldset.inner>div.output>div.layout>div.layout>div.profile>div.status { background-color:var(--output-bg-color); height:var(--action-height); overflow:auto; position:sticky; bottom:0; }
fieldset.inner>div.output>div.layout>div.layout>div.profile fieldset>form.option>div.item.text input { max-width:80px; }
fieldset.inner>div.output>div.layout>div.layout>div.profile fieldset>div.action>div.item.text input { max-width:80px; }
// fieldset.inner>div.output>div.layout>div.layout>div.profile fieldset>form.option>div.item.text input { max-width:80px; }
// fieldset.inner>div.output>div.layout>div.layout>div.profile fieldset>div.action>div.item.text input { max-width:80px; }
fieldset.inner>div.output>div.layout>div.layout>div.profile div.status>div { font-style:italic; font-size:var(--status-font-size); padding:var(--input-padding); float:left; }
fieldset.inner>div.output>div.layout>div.layout>div.content div.tips { color:var(--disable-fg-color); font-style:italic; line-height:var(--code-line-height); position:absolute; top:0; right:10px; }
fieldset.inner>div.output>div.layout>div.layout>fieldset.story { box-shadow:unset; }

View File

@ -210,6 +210,7 @@ Volcanos(chat.ONIMPORT, {
item.display_css = msg.Option(ice.MSG_DISPLAY_CSS)
if (can.base.isIn(item.index, web.WIKI_WORD)) { item.style = html.OUTPUT }
can.onimport.plug(can, item, function(sub) {
sub._load_display_always = true
sub.onaction.close = function() { can.onmotion.hidden(can, target), can.onimport.layout(can) }
sub.onexport.output = function(_sub, _msg) { can.base.isFunc(cb) && cb(_sub.sup, _msg) }
}, target)
@ -225,7 +226,8 @@ Volcanos(chat.ONIMPORT, {
item.file && can.onimport.tabview(can, item.path, item.file||can.Option(nfs.FILE), item.line)
}} }, target), can.onappend.board(can, msg, target), msg.Option(ice.MSG_STATUS) && can.onappend._status(can, msg.Option(ice.MSG_STATUS), can.page.Append(can, target, [html.STATUS])._target)
} else {
return can.onmotion.toggle(can, target, false), can.onimport.layout(can), can.user.toastFailure(can, "nothing to display")
return can.onmotion.toggle(can, target, false), can.onimport.layout(can)
// can.user.toastFailure(can, "nothing to display")
} return can.onmotion.toggle(can, target, true), can.onimport.layout(can)
},
toolkit: function(can, meta, cb) { can.base.isString(meta) && (meta = {index: meta})
@ -261,13 +263,21 @@ Volcanos(chat.ONIMPORT, {
})
}) },
layout: function(can) {
if (can.Conf(ctx.STYLE) == html.OUTPUT) { return can.page.style(can, can.ui.content, html.WIDTH, (can.Conf("__width")||can.ConfWidth())-(can.user.isMobile? 4: 2)) }
if (can.Conf(ctx.STYLE) == html.OUTPUT) { return can.page.style(can, can.ui.content, html.WIDTH, can.base.ParseSize((can.Conf("__width")||can.ConfWidth()+""))-(can.user.isMobile? 5: 5)) }
if (can.isSimpleMode() && !can.page.tagis(can._fields, html.FIELDSET_FLOAT)) { can.page.style(can, can._output, html.MAX_HEIGHT, "") }
if (can.isSimpleMode()) { can.ui.layout(can.ConfHeight(), can.ConfWidth()); return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) }
if (can.isCmdMode()) { can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(can.page.height())) }
can.ui.size = {profile: can._msg.Option(html.WIDTH), display: can._msg.Option(html.HEIGHT)}
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) {
var sub = can._msg._profile_plugin; sub && can.page.isDisplay(can.ui.profile) && sub.onimport && sub.onimport.size(sub, can.ui.profile.offsetHeight, can.ui.profile.offsetWidth-1, false)
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) { var _width = width
var sub = can._msg._profile_plugin; if (sub && can.page.isDisplay(can.ui.profile)) { _width = (can.ConfWidth()-can.ui.project.offsetWidth)/2
can.page.style(can, can.ui.profile, html.WIDTH, _width, html.MAX_WIDTH, _width, html.FLEX, "0 0 "+_width+"px")
sub.onimport && sub.onimport.size(sub, can.ui.profile.offsetHeight, _width-1, false)
can.page.style(can, can.ui.vbar, html.RIGHT, _width)
} else {
can.page.style(can, can.ui.vbar, html.RIGHT, "0")
}
can.page.style(can, can.ui.content, html.FLEX, "0 0 "+_width+"px")
can.page.style(can, can.ui.hbar, html.BOTTOM, "0")
var sub = can.ui.content._plugin; if (!sub) { return } if (height == sub.ConfHeight()+sub.onexport.actionHeight(sub)+sub.onexport.statusHeight(sub) && width == sub.ConfWidth()) { return }
sub.onimport.size(sub, height, width, false), can.page.style(can, sub._target, html.HEIGHT, height)
})
@ -346,7 +356,8 @@ Volcanos(chat.ONSYNTAX, {
})
} p && include(p.include), p && p.prepare && can.core.ItemForm(p.prepare, function(value, index, key) { p.keyword = p.keyword||{}, p.keyword[value] = key })
if (can.db.history.length > 1) { can.ui.content = can.page.insertBefore(can, [{view: html.CONTENT, style: {width: can.ui.content.offsetWidth}}], can.ui._content), can.ui.content._cache_key = key }
can.ui.content._max = 0, can.ui.content._msg = msg, can.page.Appends(can, can.ui.content, [{view: ["tips", "", msg.Option(nfs.FILE).split(nfs.PS).slice(-2).join(nfs.PS)]}])
can.ui.content._max = 0, can.ui.content._msg = msg
// can.page.Appends(can, can.ui.content, [{view: ["tips", "", msg.Option(nfs.FILE).split(nfs.PS).slice(-2).join(nfs.PS)]}])
if (msg.Length() > 0) { can.onsyntax._change(can, msg), can.onaction.rerankLine(can, "tr.line:not(.delete)>td.line")
can.page.Select(can, can.ui.content, "tr.line.delete>td.line", function(target) { target.innerHTML = "" })
} else {

View File

@ -280,8 +280,10 @@ Volcanos(chat.ONSYNTAX, {
"not": code.DATATYPE, "first-child": code.DATATYPE, "last-child": code.DATATYPE, "nth-child": code.DATATYPE,
"placeholder": code.DATATYPE, "hover": code.DATATYPE, "focus": code.DATATYPE,
"$content": code.KEYWORD, "$profile": code.KEYWORD, "$display": code.KEYWORD, "$project": code.KEYWORD,
"$body": code.KEYWORD, "$fieldset": code.KEYWORD, "$input": code.KEYWORD,
"$option": code.KEYWORD, "$action": code.KEYWORD, "$output": code.KEYWORD, "$status": code.KEYWORD,
"$content": code.KEYWORD, "$profile": code.KEYWORD, "$display": code.KEYWORD, "$project": code.KEYWORD,
"output": code.KEYWORD,
"background-color": code.FUNCTION, "color": code.FUNCTION,

View File

@ -1,5 +1,7 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) { can.onappend.style(can, code.VIMER); if (can.user.mod.isPod) { delete(can.onfigure.space) }
can.misc.Search(can, html.TITLE) && can.Conf("help", can.misc.Search(can, html.TITLE))
can.misc.Search(can, html.TITLE) && can.sup.Conf("help", can.misc.Search(can, html.TITLE))
can.require(["/plugin/local/code/inner.js"], function(can) { can.onimport._last_init(can, msg, function() {
can.db.undo = [], can.db.redo = [], can.onimport._input(can), cb && cb(msg)
}) })
@ -156,6 +158,8 @@ Volcanos(chat.ONKEYMAP, {
_normal: function(can) { can.onkeymap._model(can, mdb.NORMAL), can.onkeymap.scrollHold(can) },
_insert: function(event, can, count, begin) { can.onkeymap._model(can, mdb.INSERT), can.onkeymap.scrollHold(can, count, begin), can.onkeymap.prevent(event) },
_complete: function(event, can, target) { if (event == undefined || event.type == "click") { return } target = target||can.ui.complete
var parse = can.onexport.parse(can)
if (parse == "go") { return }
var pre = can.ui.current.value.slice(0, can.ui.current.selectionStart), key = can.core.Split(pre, "\t .[]", lex.SP).pop()||"", end = can.ui.current.value.slice(can.ui.current.selectionStart)
function show() { can.current.line.appendChild(target), key && can.onmotion.toggle(can, target, true)
can.page.style(can, target, html.LEFT, can.ui.current.offsetLeft, html.MARGIN_TOP, can.user.isChrome? can.current.line.offsetHeight: 5)

View File

@ -46,6 +46,7 @@ Volcanos(chat.ONIMPORT, {
if (arg[1] == "~~~end~~~") { arg[0] == "current"? can.sup.onmotion._close({}, can.sup): can.sup.onimport._back(can.sup) } else { term.write(arg[1]) }
},
layout: function(can) {
can.page.style(can, can._output, html.HEIGHT, can.ConfHeight())
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function() {
can.core.Item(can.db, function(hash, term) { term._fit && term._fit.fit() })
can.db.value && can.db.value._term && can.onexport.term(can, can.db.value._term)

View File

@ -309,14 +309,29 @@ Volcanos(chat.ONACTION, {
navigator.clipboard? navigator.clipboard.readText().then(add).catch(function(err) { can.misc.Log(err) }):
can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT}], function(list) { add(list[0]) })
},
getLocation: function(event, can, button) { can.user.agent.getLocation(can, function(data) {
can.user.input(can.request(event, data), can, [mdb.TYPE, mdb.NAME, mdb.TEXT, aaa.LATITUDE, aaa.LONGITUDE], function(args) {
can.runAction(event, button, args, function() { can.Update() })
getLocation: function(event, can, button) { can.user.agent.getLocation(can, function(res) {
can.user.input(can.request(event, res), can, [mdb.NAME, mdb.TEXT], function(data, args) {
can.runAction(can.request(event, data, res), button, args, function(msg) {
can.user.agent.openLocation(can, msg), can.Update()
})
})
}) },
openLocation: function(event, can) { can.user.agent.openLocation(can, can.request(event)) },
openAddress: function(event, can, button) { can.user.agent.openAddress(can, function(res) {
can.runAction(can.request(event, res), button, [], function(msg) {
})
}) },
copyText: function(event, can, button) { var msg = can.request(event)
can.user.copy(event, can, msg.Option("text"))
},
scanQRCode0: function(event, can, button) { can.user.agent.scanQRCode(can) },
scanQRCode: function(event, can, button) { can.user.agent.scanQRCode(can, function(data) { can.runAction(event, button, can.base.Simple(data), function() { can.Update() }) }) },
scanQRCode: function(event, can, button) {
can.user.agent.scanQRCode(can, function(data) { can.sub.runAction(event, button, can.base.Simple(data)) })
return
can.user.agent.scanQRCode(can, function(data) { can.runAction(event, button, can.base.Simple(data), function() {
can.Update()
}) })
},
record0: function(event, can, name, cb) { can.user.input(event, can, [{name: nfs.FILE, value: name}], function(list) {
navigator.mediaDevices.getDisplayMedia({video: {height: window.innerHeight}}).then(function(stream) { var toast
can.core.Next([3, 2, 1], function(item, next) { toast = can.user.toast(can, item + "s 后开始截图"), can.onmotion.delay(can, next, 1000) }, function() { toast.close()
@ -359,7 +374,10 @@ Volcanos(chat.ONEXPORT, {
return can.misc.localStorage(can, [can.ConfSpace()||can.misc.Search(can, ice.POD), can.ConfIndex(), key], value)
},
hash: function(can, hash) {
can.misc.SearchHash(can, hash), can.onexport.storage(can, "hash", hash)
// if (can.user.isWeiXin) { return }
if (can.user.isMobile) { return }
can.misc.SearchHash(can, hash)
// can.onexport.storage(can, "hash", hash)
return hash
},
title: function(can, title) { if (!can.isCmdMode()) { return }

View File

@ -2,21 +2,25 @@ Volcanos(chat.ONIMPORT, {
_init: function(can, msg, target, cb) {
if (can.Mode() == html.ZONE) { return can.onimport._vimer_zone(can, msg, target), cb && cb(msg) }
if (msg.index && msg.meta && msg.list) { return cb && cb(msg), can.sup.onimport._field(can.sup, msg) }
can.page.ClassList.del(can, can._fields, html.FORM), can.page.ClassList.del(can, can._fields, html.OUTPUT)
// can.page.ClassList.del(can, can._fields, html.FORM), can.page.ClassList.del(can, can._fields, html.OUTPUT)
can.page.ClassList.del(can, can._fields, html.FORM)
if (can.isCmdMode() && can.Conf(ctx.STYLE) == html.FORM) { can.page.ClassList.add(can, can._fields, html.FORM), can.onappend.style(can, html.OUTPUT) }
var cbs = can.onimport[can.Conf(ctx.STYLE)||msg.Option(ctx.STYLE)]; if (can.base.isFunc(cbs)) {
can.onappend.style(can, can._args[ctx.STYLE], target), can.core.CallFunc(cbs, {can: can, msg: msg, target: target})
} else {
can.onappend.table(can, msg, null, target), can.onappend.board(can, msg, target), can.onmotion.story.auto(can, target)
} cb && cb(msg)
can.onappend.style(can, msg.Option("display.style"), can._fields)
},
card: function(can, msg, target, filter) { target = target||can.ui.content||can._output
can.page.Append(can, target, msg.Table(function(value) { if (filter && filter(value)) { return }
var img = can.misc.ResourceIcons(can, value.icon = value.icons||value.icon||value.image)
return {view: [[html.ITEM, value.type, value.status, "s-"+value.name]], list: [
{view: [wiki.TITLE, html.DIV], list: [
{view: ["title", html.DIV], list: [
img && {className: can.base.contains(img, ".jpg")? "jpg": "", img: img},
{view: wiki.TITLE, list: [{text: value.name}, value.exists == "true" && {text: ["●", "", "exists"]}, can.onappend.label(can, value)]},
{view: wiki.TITLE, list: [value.help && {text: value.help}, {text: value.name}, value.exists == "true" && {text: ["●", "", "exists"]}]},
// value.help && {view: wiki.TITLE, list: [{text: value.help}]},
can.onappend.label(can, value),
]}, {view: [wiki.CONTENT, html.DIV, value.text]},
{view: html.ACTION, inner: value.action, _init: function(target) { can.onappend.mores(can, target, value, html.CARD_BUTTON)
can.page.Select(can, target, html.INPUT, function(target) { can.onappend.style(can, target.name, target) })
@ -29,7 +33,10 @@ Volcanos(chat.ONIMPORT, {
},
icon: function(can, msg, target, cb) { msg.Table(function(value) {
var icon = can.misc.Resource(can, value.icons||value.icon||can.page.drawText(can, value.name, 80), value.space||msg.Option(ice.MSG_USERPOD), msg.Option(ice.MSG_USERWEB))
return can.page.Append(can, target, [{view: [[html.ITEM, value.status]], list: [{view: html.ICON, list: [{img: icon}]}, {view: [mdb.NAME, "", value.name]}], _init: function(target) {
return can.page.Append(can, target, [{view: [[html.ITEM, value.status, value.name]], list: [
{view: html.ICON, list: [{img: icon}]},
{view: [mdb.NAME, "", can.user.trans(can, value.name, can.base.trimPrefix(value.text||"", "ContextOS "))]},
], _init: function(target) {
cb && cb(target, value)
}, onclick: function(event) { can.sup.onexport.record(can.sup, value.name, mdb.NAME, value) }}])._target
}) },
@ -138,13 +145,13 @@ Volcanos(chat.ONIMPORT, {
return {view: [[html.ITEM, item.type, item.role, item.status]], title: item.title||item.nick, list: [
can.onimport._icons(can, item),
].concat(can.onimport._nick(can, item), item._label||[], [
item.action && {icon: "bi bi-three-dots", onclick: function(event) { can.onimport._menu(event, can, item, cbs) }},
(item.action||cbs) && {icon: "bi bi-three-dots", onclick: function(event) { can.onimport._menu(event, can, item, cbs) }},
]), _init: function(target) { target._item = item, item._item = target, can.ui[item.path] = target
item._select && can.onmotion.delay(can, function() { target.click() })
}, onclick: function(event) {
if (cb(event)) { return }
can.db.value = item, can.onexport.hash(can, item._hash)
item.__title? can.user.title(item.__title): can.onexport.title(can, item._title)
cb(event)
}, oncontextmenu: function(event) {
can.onimport._menu(event, can, item, cbs)
}}
@ -153,7 +160,8 @@ Volcanos(chat.ONIMPORT, {
return can.page.Append(can, _target||can.ui.project||can._output, [can.onimport._item(can, item, function(event) { var target = event.currentTarget
can.onmotion.select(can, target.parentNode, html.DIV_ITEM, target)
can.onengine.signal(can, "onproject", can.request(event, {type: "item", query: can.page.getquery(can, can._fields)+","+item.path}))
var show = target._list && can.onmotion.toggle(can, target._list); if (show === false) { return } cb(event, item, show, target)
var show = target._list && can.onmotion.toggle(can, target._list); if (show === false) { return true }
return cb(event, item, show, target)
}, cbs)])._target
},
_itemselect: function(can, target) {
@ -165,8 +173,9 @@ Volcanos(chat.ONIMPORT, {
if (!target._list) { target._list = can.page.insertBefore(can, [html.LIST], target.nextSibling, target.parentNode) }
return can.page.Append(can, target._list, can.core.List(list, function(item) {
return can.onimport._item(can, item, function(event) { var target = event.currentTarget
if (target._list && target._list.childElementCount > 0 && target._list && can.onmotion.toggle(can, target._list) == false) { return }
can.onimport._itemselect(can, target), cb && cb(event, item, target._list && true, target)
if (target._list && target._list.childElementCount > 0 && target._list && can.onmotion.toggle(can, target._list) == false) { return true }
if (cb && cb(event, item, target._list && true, target)) { return }
can.onimport._itemselect(can, target)
}, cbs)
})), target._list
},
@ -189,6 +198,17 @@ Volcanos(chat.ONIMPORT, {
if (node[name].childElementCount == 2) { can.onmotion.delay(can, function() { node[name].firstChild.click() }) }
}, oncontextmenu: function(event) {
can.onimport._menu(event, can, item, cbs)
}, ondragenter: function(event) {
can.onkeymap.prevent(event)
}, ondragover: function(event) {
can.onkeymap.prevent(event)
}, ondrop: function(event) { can.onkeymap.prevent(event)
var msg = can.request(event, can.Option(), item, {_handle: ice.TRUE})
can.core.List(event.dataTransfer.files, function(file) { msg._upload = file
can.runAction(event, html.UPLOAD, [], function(msg) {
can.user.toastSuccess(can, "上传成功")
})
})
}, _init: item._init}, {view: [[html.LIST, html.HIDE]]}]); node[name] = ui.list, item.expand && ui.item.click()
}) }); return node
},
@ -257,7 +277,7 @@ Volcanos(chat.ONIMPORT, {
can.page.Append(can, sub._legend,[{text: [can.page.unicode.remove, "", mdb.REMOVE], onclick: function(event) {
can.page.Remove(can, sub._target), can.page.Remove(can, sub._legend), can.onexport.tool(can), can.onkeymap.prevent(event)
}}]), sub._legend._target = sub._target, sub._legend._meta = {index: meta.index}
status.appendChild(sub._legend), sub._legend.oncontextmenu = sub._legend.onclick, sub._legend.onclick = function(event) { can.misc.Event(event, can, function(msg) {
sub.Conf("_role") == "ok" && status.appendChild(sub._legend), sub._legend.oncontextmenu = sub._legend.onclick, sub._legend.onclick = function(event) { can.misc.Event(event, can, function(msg) {
if (can.page.SelectOne(can, status, "legend.select", function(target) {
can.onmotion.hidden(can, target._target), can.page.ClassList.del(can, target, html.SELECT); return target }) == sub._legend) { return }
can.onmotion.select(can, status, html.LEGEND, sub._legend), can.onmotion.toggle(can, sub._target, true)
@ -284,26 +304,46 @@ Volcanos(chat.ONIMPORT, {
can.user.isMobile? can.user.jumps(can.misc.MergePodCmd(can, {cmd: index+"/"+args.join("/")})): can.onappend._float(can, index, args)
},
myOption: function(can) { var sub = can.sub; if (!sub) { return } var plugin = sub._stacks_current[0]; current = plugin.current||{}
if (plugin == sub._stacks_root) { var PLACE_UID = can.core.Item(can.Option())[0]
if (sub._stacks_current.length == 1) {
plugin.sub.onexport.hash(plugin.sub, can.Option(PLACE_UID))
} else {
plugin.sub.onexport.hash(plugin.sub, can.Option(PLACE_UID), can.ConfIndex(), can.Option(UID))
myOption: function(can) { var sub = can.sub; if (!sub) { return }
var PLACE_UID = can.core.Item(can.Option())[0]
var current = can.current||{}, msg = can._msg, plugin = can
if (sub._stacks_current) { var plugin = sub._stacks_current[0], current = plugin.current||{}
can.core.List(sub._stacks_current, function(p) { current = p.current||current, p.current && (plugin = p) })
if (plugin == sub._stacks_root) { var place_uid = can.Option(PLACE_UID)
// var place_uid = can.Option(PLACE_UID) == can.misc.Search(can, PLACE_UID)? "": can.Option(PLACE_UID)
if (sub._stacks_current.length == 1) {
plugin.sub.onexport.hash(plugin.sub, place_uid)
} else {
plugin.sub.onexport.hash(plugin.sub, place_uid, can.ConfIndex(), can.Option(UID))
}
}
sub._stacks_root.onexport.title(sub._stacks_root, current._name, can.ConfHelp(),
msg.Option("_share_title")||(msg.IsDetail()? msg.Append(html.TITLE)||msg.Append(mdb.NAME)||(msg.Append(UID)||"").slice(0, 6): "")
)
} else {
if (can.isCmdMode() && can.current) { var place_uid = can.current._uid
can.onexport.hash(can, place_uid)
}
}
sub._stacks_root.onexport.title(sub._stacks_root, current._name, can.ConfHelp(),
can._msg.Option("_share_title")||(can._msg && can._msg.IsDetail()? can._msg.Append(html.TITLE)||can._msg.Append(mdb.NAME)||(can._msg.Append(UID)||"").slice(0, 6): "")
// ||can.user.info.titles
)
var icons = ""; can.core.List([current.icons, can.ConfIcons(), plugin.ConfIcons()], function(p) {
if (p && p.indexOf("bi ") == -1) { icons = icons||can.misc.Resource(can, p, plugin.ConfSpace()) }
}), icons = icons||(can.user.info.nodetype == web.WORKER? can.misc.Resource(can, can.user.info.favicon, can.user.info.nodename): "")
var cmd = can.ConfIndex().split(".").slice(0, 3).concat("portal").join(".")
var keys = can.core.Item(can.Option(), function(key, value) { return key })
var args = can.core.Item(can.Option(), function(key, value) { return value })
var opts = {pod: can.ConfSpace()||plugin.ConfSpace(), cmd: cmd}; opts[keys[0]] = args[0]
var link = can.misc.MergePodCmd(can, opts)+"#"+args[0]+":"+can.ConfIndex()+":"+(args[1]||"")
can.user.agent.init(can,
can._msg.Option("_share_content")||(can._msg && can._msg.IsDetail()? can._msg.Append(html.CONTENT)||can._msg.Append(mdb.INFO)||"": "")||current.city_name+" "+current._street,
can._msg.Option("_share_icons")||(can.Conf(mdb.ICONS)? can.misc.Resource(can, can.Conf(mdb.ICONS)): can.user.info.nodetype == web.WORKER? can.misc.Resource(can, can.user.info.favicon, can.user.info.nodename): ""),
msg.Option("_share_content")||(msg.IsDetail()? msg.Append(html.CONTENT)||msg.Append(mdb.INFO)||"": "")||current.city_name+" "+current._street,
msg.Option("_share_icons")||msg.Option("auth_avatar")||(msg.IsDetail()? msg.Append("user_avatar"): "")||icons,
link,
)
},
myField: function(can, sub) {
sub.onexport._output = function(_sub) {
_sub._stacks_current = can._stacks_current, _sub._stacks_root = can._stacks_root
can.core.List(["_trans", "_style", "_icons", "_trans.input", "_trans.value"], function(key) {
var value = sub.Conf(key); value && can.core.Item(can.Conf(key), function(k, v) { value[k] = value[k]||v })
})
sub.onexport._output = function(_sub) { _sub._stacks_current = can._stacks_current, _sub._stacks_root = can._stacks_root
can.core.Item(can.onimport, function(key, value) { _sub.onimport[key] = _sub.onimport[key]||value })
can.core.Item(can.onaction, function(key, value) { _sub.onaction[key] = _sub.onaction[key]||value })
can.core.Item(can.onexport, function(key, value) { _sub.onexport[key] = _sub.onexport[key]||value })
@ -330,88 +370,186 @@ Volcanos(chat.ONIMPORT, {
myStory: function(can, value) { var ACTION_HEIGHT = 48
if (!can._stacks_current) { var sup = can.sup; can._stacks_root = sup, sup._stacks = {}
var key = [can.ConfSpace(), can.ConfIndex()].concat(can.base.trim(can.core.Item(can.Option(), function(key, value) { return value }))).join(",")
can._stacks_current = sup._stacks[key] = [can.sup]
sup._select = function() { can.onimport.myPluginSelect(can, sup, sup._target.parentNode) }
} var plugin = can._stacks_current[0], _action = plugin._action, _output = plugin._output; current = plugin.current||{}
value.index == "web.team.renzhengshouquan.profile" && (ACTION_HEIGHT = 0)
value.index.split(".").pop() == "credit" && (ACTION_HEIGHT = 0)
value.type = html.STORY, value.style = html.OUTPUT, value.height = (can.user.isMobile? window.innerHeight: can.ConfHeight())-ACTION_HEIGHT
can.onappend.plugin(can, value, function(sub) { can._stacks_current.push(sub)
can.core.List(["_trans", "_style", "_icons", "_trans.input", "_trans.value"], function(key) {
var value = sub.Conf(key); value && can.core.Item(can.Conf(key), function(k, v) { value[k] = value[k]||v })
})
can._stacks_current = sup._stacks[key] = [can.sup], sup._select = function() { can.onimport.myPluginSelect(can, sup, sup._target.parentNode) }
}
var portal = can._stacks_root
var plugin = can._stacks_current[0], _action = plugin._action, _output = plugin._output; current = plugin.current||{}
can.core.List(can._stacks_current, function(p) { current = p.current||current, p.current && (plugin = p, portal = p) })
if (value.space && can.base.endWith(value.index, ".portal")) { portal = can._root.Action }
value.type = html.STORY, value.style = html.OUTPUT, value.height = can._stacks_root.ConfHeight()-ACTION_HEIGHT
can.onappend.plugin(portal, value, function(sub) { can.onimport.myField(can, sub), can.onmotion.slideIn(sub)
var STREET_NAME = plugin.sub.Conf("_street_name"), PLACE_NAME = plugin.sub.Conf("_place_name")
var USER_PLACE_ROLE = plugin.sub.Conf("_user_place_role")
var run = sub.run; sub.run = function(event, cmds, cb) {
if (cmds[0] == ctx.ACTION && can.base.isIn(cmds[1], mdb.REMOVE, nfs.TRASH)) {
if (sub._msg.IsDetail()) { var cbs = cb; cb = function() { goback(event) } }
}
run(sub.request(event, {
city_name: current[CITY_NAME], street_name: current[STREET_NAME], place_name: current[PLACE_NAME],
dashboard_uid: current["dashboard_uid"], storage_uid: current["storage_uid"],
command_uid: sub.Conf("command_uid"), portal_name: can.ConfHelp(),
}, can.base.Obj(sub.Conf("field.option"))), cmds, cb)
}
can.onimport.myField(can, sub), can.onmotion.slideIn(sub)
sub.onexport.output = function(_sub, msg) {
sub._select(), msg.Option(ice.MSG_ACTION) && can.onappend._action(sub, msg.Option(ice.MSG_ACTION), _action, null, true)
sub.sub.onaction._goback = goback
}
sub.onimport._field = function(msg) { var sup = sub; can.onmotion.clear(can, sub._output)
msg.Table(function(value) { value.style = html.OUTPUT
can.onappend.plugin(can, value, function(sub) { can.onimport.myField(can, sub)
sub.onexport.output = function(_sub, msg) { can.onimport.myOption(sub)
can.user.isMobile && sub.onimport.size(sub, window.innerHeight-ACTION_HEIGHT, window.innerWidth, false)
}
var run = sub.run; sub.run = function(event, cmds, cb) {
run(sub.request(event, {
city_name: current[CITY_NAME], street_name: current[STREET_NAME], place_name: current[PLACE_NAME],
dashboard_uid: current["dashboard_uid"], storage_uid: current["storage_uid"],
command_uid: sub.Conf("command_uid"), portal_name: can.ConfHelp(),
}, can.base.Obj(sub.Conf("field.option")), sup.Option()), cmds, cb)
}
}, sub._output)
})
}
function goback(event, cb) { if (can._stacks_current.length == 1) { return cb && cb()}
if (sub._history.length > 1) { sub.request(event, {_toast: "reload"}); return sub.onimport.back(event, sub), cb && cb() }
function goback(event, cb) { if (can._stacks_current.length == 1) { return cb && cb() }
if (cb) { return cb() }
if (sub._history.length > 1 && sub.ConfIndex().split(".").pop() != "market") {
sub.request(event, {_toast: "reload"}); return sub.onimport.back(event, sub), cb && cb()
}
var _last = can._stacks_current.pop()
can.onmotion.slideOut(_last, function() { var last = can._stacks_current[can._stacks_current.length-1]; last._select()
can.onmotion.delay(can, function() { can._root.Action.onlayout._init(can) })
can.onmotion.slideOut(_last, function() { var last = can._stacks_current[can._stacks_current.length-1]
if (_last._index == "web.team.renzhengshouquan.profile" && last._index.split(".").pop() == "credit") {
can._stacks_current.pop(), last = can._stacks_current[can._stacks_current.length-1]
}
last._select(), can.onmotion.delay(can, function() { can._root.Action.onlayout._init(can) })
last.request(event, {_toast: "reload"})
if (last.ConfIndex().split(".").pop() == "message") { last.Update(event) }
can._stacks_current.length == 1 && last._output.innerHTML == "" && last.Update(event)
cb && cb()
if (last.ConfIndex().split(".").pop() == "market" && last.Option("uid")) { last.Option("uid", "") }
if (last.ConfIndex().split(".").pop() == "message") { last._history.pop(), last.Option("uid", ""), last.Update(event) }
if (can._stacks_current.length == 1) {
// var hash = can.base.Obj(can.misc.SearchHash(can), can.db.hash)
var hash = can.misc.SearchHash(can)||[]
if (hash.length > 1) { last._goback = true
last.Option(can.core.Item(last.Option())[0], hash[0])
last.Option("index", ""), last.Option("uid", "")
}
}
last._output.innerHTML == "" && last.Update(event), cb && cb()
})
}
function reload(event) {
sub.Update(sub.request(event, {_toast: "reload"}))
function reload(event) { sub.Update(sub.request(event, {_toast: "reload"})) }
sub.onimport._field = function(msg) { msg.Table(function(value) { can.onimport.myStory(can, value) }) }
sub.onexport.output = function(_sub, msg) { sub.sub.onaction._goback = goback, sub._select() }
function header(msg) {
if (!can.user.isMobile || msg.IsDetail() && msg.Append("user_uid") && msg.Append("user_uid") != msg.Option("user.uid")) { can.page.Append(can, _action, [{view: [[html.ITEM, html.SPACE]]}])
var value = {user_uid: msg.Option("user.uid"), user_name: msg.Option(ice.MSG_USERNICK), user_avatar: can.misc.Resource(can, msg.Option("user.avatar"))}
can.page.Append(can, _action, [{view: [[html.ITEM, "user_info"]], list: [
{view: html.NAME, list: [{text: can.user.isMobile? value.user_name.split("@")[0]: value.user_name}, can.onimport.timeView(can, value)]}, can.onimport.textView(can, value, USER_PLACE_ROLE), {img: value.user_avatar},
], onclick: function(event) {
sub.sub.run(sub.sub.request(event, {uid: value.user_uid}), [ctx.ACTION, "userInfo"])
}}])
}
}
sub._select = function() { can.onimport.myOption(sub)
sub._select = function() { can.onimport.myOption(sub), can.user.trans(can, {goback: "返回"})
can.page.SelectChild(can, _output, "*", function(target) { can.onmotion.toggle(can, target, target == sub._target) })
var list = [can.page.button(can, can.user.trans(can, "goback", "返回"), function(event) { goback(event) }), can.page.button(can, can.user.trans(can, "reload", "刷新"), function(event) { reload(event) })]
can.page.Appends(can, _action, list), can.page.style(can, _action, html.DISPLAY, html.BLOCK)
var list = [
can.page.button(can, {name: can.user.isMobile? "主页": plugin.current._name, className: "place"}, function(event) {
var last = can._stacks_current[can._stacks_current.length-1]; can.onmotion.slideOut(last, function() {
while (!last.current || last != plugin) { last = can._stacks_current.pop() }
can._stacks_current.push(last), last._select()
if (can.page.SelectChild(can, last._output, "div.header").length == 0) { last.Update(event) }
})
}),
can.user.isMobile || can.page.button(can, {name: can.user.trans(can, sub.ConfIndex().split(".").pop(), sub.ConfHelp()), className: "index"}, function(event) {
can._msg.IsTech() && sub._legend.onclick(event)
}),
can.page.button(can, "goback", function(event) { goback(event) }),
can.page.button(can, "reload", function(event) { reload(event) }),
]
can.page.style(can, _action, html.DISPLAY, html.FLEX)
can.user.isMobile && sub.onimport.size(sub, window.innerHeight-ACTION_HEIGHT, window.innerWidth, false)
}, sub._select()
can.page.Appends(can, _action, list)
var msg = sub._msg; if (!msg) { return }
msg.IsDetail() === false && can.onappend.filter(can, _action, sub._output)
msg.Option(ice.MSG_ACTION) && can.onappend._action(sub, msg.Option(ice.MSG_ACTION), _action, null, true)
header(msg)
}
can._stacks_current.push(sub), sub._select()
}, _output)
},
myTabs: function(can, key, list, target) { var last = can.misc.Cookie(can, key)
myTabs: function(can, key, list, target) { var last = can.sup.Conf("option."+key)||""
if (!target && !can.ui.tabs) { can.ui = can.page.Append(can, can._output, [html.TABS, html.LIST]) } target = target||can.ui.tabs
can.page.Append(can, target, can.core.List(list, function(value) {
return {text: [can.user.trans(can, value, "", "value."+key), "", [value, value == "all" && last == "" || value == last? html.SELECT: ""]], onclick: function(event) {
can.onmotion.select(can, target, "*", event.target), can.misc.Cookie(can, key, value == "all"? "": value), can.Update()
can.onmotion.select(can, target, "*", event.currentTarget)
can.sup.Conf("option."+key, value == "all"? "": value)
can.Update()
}}
}))
},
_myTabs: function(can, status, msg, target) { var trans = can.Conf("feature._trans.value."+status)
var stat = {}; msg.Table(function(value) { var key = value[status]; stat[key] = (stat[key]||0)+1 })
var list = can.core.Item(trans, function(key, value) { if (key == "style") { return }
if (stat[key]) { return {name: key.split("@")[0], value: value+"("+stat[key]+")", style: can.core.Value(trans, "style."+key) } }
})
if (list.length == 0) { var _list = [], stat = {}
msg.Table(function(value) { can.base.AddUniq(_list, value[status]), stat[value[status]] = (stat[value[status]]||0)+1 })
can.core.List(_list, function(status) { list.push({name: status, value: status+"("+stat[status]+")"}) })
}
if (list.length < 3) { return }
var last = can.sup.Conf("tabs."+status)
can.page.Append(can, target, [{view: [["tabs", status]], list: can.core.List([
{name: "all", value: "全部"+"("+msg.Length()+")", style: last == undefined? "select": ""},
].concat(list), function(value) {
return {view: [[html.ITEM].concat([value.name, value.style, value.name == last? "select": ""]), "", can.user.trans(can, value.name, value.value)], onclick: function(event) { var target = event.currentTarget
can.onmotion.select(can, target.parentNode, html.DIV_ITEM, target)
can.sup.Conf("tabs."+status, value.name == "all"? "": value.name)
can.page.Select(can, can._output, "div.item.card", function(target) {
var hide = can.core.Item(can.sup.Conf("tabs"), function(key, value) {
if (!can.page.ClassList.has(can, target, value)) { return key }
}).length > 0;
if (can.onmotion.hidden(can, target, !hide)) { return target }
}).length == 0 && can.user.toast(can, "没有条件的数据")
}}
})}])._target
},
myViewTabs: function(can, status, msg, cb, cbs, target) { typeof status == "string" && (status = [status])
if (!msg.IsDetail() && msg.Length() > 3) {
can.ui.tabs = can.page.Append(can, can._output, [{view: [[html.TABS, "multi"]]}])._target
can.core.List(status, function(status) { can.onimport._myTabs(can, status, msg, can.ui.tabs) })
can.page.Append(can, can.ui.tabs.lastChild, [{view: [[html.ITEM, "wrap"], "", can.user.trans(can, "expand", "展开")], onclick: function(event) {
event.target.innerHTML = can.page.ClassList.neg(can, can.ui.tabs, "wrap")? can.user.trans(can, "collapse", "折叠"): can.user.trans(can, "expand", "展开")
can.onimport.layout && can.onimport.layout(can), can.ui.list.scrollTop = 0
}}])
can.ui.list = can.page.Append(can, can._output, [{view: "list"}])._target; target = can.ui.list
var list = can.base.Obj(msg.Option(ice.MSG_ACTION))||[]
if (can.user.isMobile && list.length > 0) {
can.ui.todo = can.page.Append(can, can._output, [{view: "todo"}])._target
can.user.isMobile && can.onappend._action(can, can.base.Obj(msg.Option(ice.MSG_ACTION))||[], can.ui.todo)
}
} else if (msg.Option(ice.MSG_ACTION)) {
var list = can.base.Obj(msg.Option(ice.MSG_ACTION))||[]
if (can.user.isMobile && list.length > 0) {
can.ui.list = can.page.Append(can, can._output, [{view: "list"}])._target; target = can.ui.list
can.ui.todo = can.page.Append(can, can._output, [{view: "todo"}])._target
can.onappend._action(can, list, can.ui.todo)
}
}
can.onimport.myView(can, msg, function(value) { value._style = can.core.List(status, function(status) { return value[status] }); return cb(value) }, cbs, target)
can.ui.tabs && can.page.Select(can, can.ui.tabs, html.DIV_ITEM_SELECT, function(target) { target.click() })
// can.onimport.myView(can, msg, function(value) { return cb(value) }, cbs, target)
},
myView: function(can, msg, cb, cbs, target) {
if (msg.Option("market_uid")) { can.onimport.myPlaceInfo(can, msg, "marketPlaceInfo") }
if (msg.Option("message_uid")) { can.onimport.myPlaceInfo(can, msg, "messagePlaceInfo") }
can.onimport.itemcards(can, msg, cb, cbs, target||can.ui.list)
msg.Option("otherList") && can.onimport.otherList && can.onimport.otherList(can, msg, can.core.Split(msg.Option("otherList")))
can.page.Select(can, can._output, html.IFRAME, function(target) {
can.page.style(can, target, html.HEIGHT, !msg.IsDetail() && can.user.isMobile? 220: can.ConfHeight()-200)
})
},
itemcards: function(can, msg, cb, cbs, target) { target = target||can.ui.list||can._output
if (msg.IsDetail()) { var value = msg.TableDetail(); msg.Show(can)
can.page.Select(can, target, html.TR, function(target) {
if (msg.IsDetail()) { var value = msg.TableDetail(); var _msg = can.request(); _msg.Push(value)
if (!msg.Option("market_uid") && !msg.Option("message_uid")) {
value.user_avatar && can.page.Append(can, target, [{view: "place_info", _init: function(target) {
_msg.action = [], _msg.PushButton("userInfo")
if (can.base.endWith(can.ConfIndex(), ".member") && !_msg.Append("auth_name")) { _msg.action = [] }
can.onimport.itemcards(can, _msg, function(value) { value.icons = value.auth_avatar||value.user_avatar; return [
{view: html.TITLE, list: [value.user_name, can.onimport.authView(can, value), !value.to_user_avatar && can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value)]},
] }, function(event, value) {
can.run(can.request(event, value), [ctx.ACTION, "userInfo"])
}, target)
}}])
}
can.onappend.table(can, msg), can.page.Select(can, target, html.TR, function(target) {
target.className.indexOf("_uid") > -1 && can.page.ClassList.add(can, target, "hide")
})
} else {
can.onappend.style(can, msg.Option(ctx.STYLE))
can.page.Append(can, target, msg.Table(function(value) {
return can.onimport.itemcard(can, value, cb(value), cbs)
})), msg.Result() && can.onappend.board(can, msg), can.onappend.style(can, msg.Option(ctx.STYLE))
}))
}
msg.Result() && can.onappend.board(can, msg), can.onmotion.story.auto(can)
can.page.Select(can, target, html.INPUT_BUTTON, function(target) {
var style = can.Conf("_style."+target.name); style && can.page.ClassList.add(can, target, style)
})
@ -423,22 +561,34 @@ Volcanos(chat.ONIMPORT, {
})
cb = cb|| function(event) { var done = false
if (can.onaction.carddetail && can.onaction.carddetail(event, can, value)) { return }
if (value.uid) { return can.Option(UID, value.uid), can.Update() }
if (value.uid) {
if (can.page.tagis(can._fields, "fieldset.input.key.float")) {
return can.Option(UID, value.uid), can.Update(can.request(event, value))
}
can.onimport.myStory(can, {space: can.ConfSpace(), index: can.ConfIndex(), args: can.core.Item(can.Option(), function(key, value) {
return value
}).slice(0, 1).concat([value.uid]) })
return
return can.Option(UID, value.uid), can.Update(can.request(event, value))
}
can.core.Item(can.Option(), function(k, v) {
if (!done && !v) { done = true, can.Option(k, value[k]), can.Update() }
})
}
return {view: [[html.ITEM_CARD, value._uid? "uid-"+value._uid: ""].concat(value._style||[])], list: [
{view: html.ACTION, _init: function(target) { can.page.appendAction(can, value, target)
!value.to_user_avatar && {view: html.ACTION, _init: function(target) {
can.page.appendAction(can, value, target)
can.user.isMobile && can.page.Select(can, target, "input.notice", function(target) { can.page.Remove(can, target) })
}},
{view: html.OUTPUT, list: [
{img: can.misc.ResourceIcons(can, value.icons||value.icon||value.avatar||
value.auth_avatar||value.command_icon||value.service_icon||value.user_avatar||can.Conf(mdb.ICONS), value.nodename,
{img: can.misc.ResourceIcons(can, value.icons||value.icon||value.avatar||value.auth_avatar||value.user_avatar||
value.command_icon||value.service_icon||can.ConfIcons(), value.nodename||value.space||can.ConfSpace(),
), onclick: function(event) { can.onkeymap.prevent(event)
can.onaction.updateAvatar && can.onaction.updateAvatar(event, can)
}},
{view: html.CONTAINER, list: list},
value.to_user_avatar && value.to_user_avatar != value.user_avatar? {img: can.misc.ResourceIcons(can, value.to_user_avatar)}:
value.from_user_avatar && value.from_user_avatar != value.user_avatar? {img: can.misc.ResourceIcons(can, value.from_user_avatar)}: null,
], _init: function(target) {
value.action && can.onmotion.slideAction(can, target)
}},
@ -446,24 +596,51 @@ Volcanos(chat.ONIMPORT, {
can.onmotion.select(can, event.currentTarget.parentNode, html.DIV_ITEM, event.currentTarget)
}}
},
textView: function(can, value, key, type) {
key || can.core.Item(value, function(k, v) { if (k == "status" || can.base.endWith(k, "_status")) { key = k } }); if (!type) { type = key.split("_").pop() }
return value[key] && !can.base.isIn(value[key], "finish", "done") && {text: [can.user.transValue(can, value, key), "", [type, value[key], can.Conf("_trans.value."+key+".style."+value[key])||""]]}
myPlaceInfo: function(can, msg, action) { if (!can.user.isMobile) { return }
can.core.List(can._stacks_current.concat([]).reverse(), function(sub) {
if (sub._output == can._target) { can.onappend.style(can, "market_uid", can._fields)
can.page.Append(can, can._output, [{view: "place_info", _init: function(target) {
can.run({}, [ctx.ACTION, action], function(msg) {
can.onimport.itemcards(can, msg, function(value) { return [
{view: html.TITLE, list: [value.user_name, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.city_name, value.street_name, value.place_name, value.service_name]},
] }, function(event, value) {
can.onimport.myStory(can, {
index: can.ConfIndex().split(".").slice(0, 3).concat("portal").join("."), args: [value.place_uid],
})
}, target)
can.page.Select(can, target, html.INPUT_BUTTON, function(target) {
target.onclick = function(event) {
can.onimport.myStory(can, {
index: can.ConfIndex().split(".").slice(0, 3).concat("portal").join("."), args: [msg.Append("place_uid")],
})
}
})
})
}}])
}
})
},
authView: function(can, value) { return can.base.isIn(value.auth_status, "issued", "2") && {view: [aaa.AUTH, html.SPAN], list: [{icon: "bi bi-patch-check-fill", style: {color: "var(--notice-bg-color)"}}]} },
timeView: function(can, value, key) {
if (key) { return {text: [can.user.trans(can, key, null, html.INPUT)+": "+can.base.TimeTrim(value[key]), "", mdb.TIME]} }
return {text: [can.base.TimeTrim(value[key]||value.browse_time||value.updated_at||value.created_at||value.time), "", mdb.TIME]}
otherList: function(can, msg, action) { if (!msg.IsDetail()) { return } typeof action == "string" && (action = [action])
can.core.Next(action, function(action, next) {
can.run(can.request({}, {uid: msg.Append(UID)}, msg.TableDetail()), action, function(msg) { if (msg.Length() == 0) { return next() }
can.page.Append(can, can._output, [{view: [[html.ITEM, html.TITLE, action], "", can.user.trans(can, action)]}])
can.onappend.plugin(can, {index: can.ConfIndex()}, function(sub) { can.onimport.myField(can, sub), can.onappend.style(sub, "otherList")
sub.run = function(event, cmds, cb) { if (!cmds || cmds.length == 0) { cb(msg) } else { can.run(event, cmds, cb) } }, next()
sub.onexport.output = function(_sub, msg) {
_sub.onaction.carddetail = function(event, _sub, value) {
can.onimport.myStory(can, {index: msg.Option("_other_cmd"), args: [value.place_uid||msg.Option("place_uid"), value.uid]})
return true
}
}
})
})
})
},
unitView: function(can, value, key, unit) { if (!value[key]) { return }
return {text: [[can.user.trans(can, key, null, html.INPUT)+":", value[key]].concat(unit? [unit]: []).join(" "), "", key]}
},
typeStyle: function(can, value, key) { return can.Conf("_trans.value."+key+".style."+value[key])||"" },
roleStyle: function(can, value, key) { return can.Conf("_trans.value."+key+".style."+value[key])||"" },
shareTitle: function(can, msg, title, content, icons) { if (msg.IsDetail()) { var value = msg.TableDetail()
msg.Option("_share_title", msg.Option("_share_title")||(value[title]||value.title||value.name||value.uid).slice(0, 6))
msg.Option("_share_content", msg.Option("_share_content")||value[content]||value.content||value.info)
shareTitle: function(can, msg, icons, title, content) { if (msg.IsDetail()) { var value = msg.TableDetail()
msg.Option("_share_icons", msg.Option("_share_icons")||value[icons]||value.icons||value.avatar)
msg.Option("_share_title", msg.Option("_share_title")||(value[title]||value.title||value.name||value.uid.slice(0, 6)))
msg.Option("_share_content", msg.Option("_share_content")||value[content]||value.content||value.info)
} },
titleAction: function(can, value, filter) { var filter = can.core.List(arguments).slice(2)
return {view: html.ACTION, _init: function(target) {
@ -479,6 +656,43 @@ Volcanos(chat.ONIMPORT, {
})
}}
},
uidView: function(can, value) { return value.uid.slice(0, 6) },
metaView: function(can, value) {
return {view: html.STATUS, list: [
can.onimport.uidView(can, value), can.onimport.timeView(can, value), value.user_name,
]}
},
shipView: function(can, value) {
return {view: html.STATUS, list: [value.city_name, value.city_name? "|": "",
value.street_name, value.street_name? "|": "",
value.place_name, value.place_name? "|": "",
value.service_name.replace(" ", " | ")]}
},
spaceView: function(can, value) { return {view: "space"} },
imageView: function(can, value) {
return can.base.contains(value.icons, "bi ")? {view: [value.icons, "i"]}: {img: can.misc.ResourceIcons(can, value.icons)}
},
timeView: function(can, value, key) {
if (key) { return {text: [can.user.trans(can, key, null, html.INPUT)+": "+can.base.TimeTrim(value[key]), "", mdb.TIME]} }
return {text: [can.base.TimeTrim(value[key]||value.browse_time||value.updated_at||value.created_at||value.time), "", mdb.TIME]}
},
unitView: function(can, value, key, unit) { if (!value[key] || value[key] == "0") { return }
return {text: [[can.user.trans(can, key, null, html.INPUT)+":", value[key]].concat(unit? [unit]: []).join(" "), "", key]}
},
typeStyle: function(can, value, key) { return can.Conf("_trans.value."+key+".style."+value[key])||"" },
roleStyle: function(can, value, key) { return can.Conf("_trans.value."+key+".style."+value[key])||"" },
authView: function(can, value) { return can.base.isIn(value.auth_status, "issued", "2") && {view: [aaa.AUTH, html.SPAN], list: [{icon: "bi bi-patch-check-fill", style: {color: "var(--notice-bg-color)"}}]} },
textView: function(can, value, key, type) {
key || can.core.Item(value, function(k, v) { if (k == "status" || can.base.endWith(k, "_status")) { key = k } }); if (!type) { type = key.split("_").pop() }
return value[key] && !can.base.isIn(value[key], "finish", "done") && {text: [can.user.transValue(can, value, key), "", [type, value[key], can.Conf("_trans.value."+key+".style."+value[key])||""]]}
},
contentView: function(can, value) {
return value.content.indexOf("<iframe") > -1? {view: html.OUTPUT, inner: value.content}: {view: html.OUTPUT, list: [value.content]}
},
beginTime: function(can, value) {
return (value.process_time||value.begin_time||"").split(" ")[0]+" ~ "+(value.finish_time||value.end_time||"").split(" ")[0]
},
moneyView: function(can, value, key) { return {text: ["¥ "+(value[key]||value.price||value.amount)+" 元", "", "price"]} },
})
Volcanos(chat.ONLAYOUT, {
_init: function(can, height, width) { can.core.CallFunc([can.onimport, html.LAYOUT], {can: can, height: height, width: width}) },
@ -491,20 +705,21 @@ Volcanos(chat.ONLAYOUT, {
cmd: function(can, height, width) { can.onlayout._init(can, height, width) },
})
Volcanos(chat.ONEXPORT, {
title: function(can, title) { can.sup.onexport.title.apply(can.sup.onexport, [can.sup].concat(can.core.List(arguments).slice(1))) },
action_value: function(can, key, def) { var value = can.Action(key); return can.base.isIn(value, ice.AUTO, key, undefined)? def: value },
tabs: function(can) {},
tool: function(can) { can.misc.sessionStorage(can, [can.ConfIndex(), "tool"], JSON.stringify(can.page.Select(can, can._status, html.LEGEND, function(target) { return target._meta }))) },
hash: function(can, hash) { hash = typeof hash == code.STRING? hash.split(":").concat(can.core.List(arguments).slice(2)||[]): hash || can.core.Item(can.Option(), function(key, value) { return value||"" })
return can.sup.onexport.hash(can.sup, hash)
},
session: function(can, key, value) { return can.sup.onexport.session(can.sup, key, value) },
storage: function(can, key, value) { return can.sup.onexport.storage(can.sup, key, value) },
table: function(can) { var msg = can._msg; if (msg.Length() == 0) { return } var res = [msg.append && msg.append.join(mdb.FS)]
msg.Table(function(line, index, array) { res.push(can.core.Item(line, function(key, value) { return value }).join(ice.FS)) })
return res.join(lex.NL)
},
board: function(can) { var msg = can._msg; return msg.Result() },
tabs: function(can) {},
tool: function(can) { can.onexport.session(can, "tool", JSON.stringify(can.page.Select(can, can._status, html.LEGEND, function(target) { return target._meta }))) },
hash: function(can, hash) {
hash = typeof hash == code.STRING? hash.split(":").concat(can.core.List(arguments).slice(2)||[]): hash || can.core.Item(can.Option(), function(key, value) { return value||"" })
return can.sup.onexport.hash(can.sup, hash)
},
title: function(can, title) { can.sup.onexport.title.apply(can.sup.onexport, [can.sup].concat(can.core.List(arguments).slice(1))) },
session: function(can, key, value) { return can.sup && can.sup.onexport.session(can.sup, key, value) },
storage: function(can, key, value) { return can.sup && can.sup.onexport.storage(can.sup, key, value) },
})
Volcanos(chat.ONACTION, {
onkeydown: function(event, can) {
@ -514,25 +729,23 @@ Volcanos(chat.ONACTION, {
onslidemove: function(event, can, data, direction) {
// can.user.toast(can, [direction, data.spanX, data.spanY].join(","))
},
onslideright: function(event, can, data, direction) {
can.onaction._goback && can.onaction._goback(event)
},
onslideleft: function(event, can, data, direction) {
return
var button = can.base.Obj(can._msg.Option("_action"), [])[0]; if (!button) { return }
can.run({}, [ctx.ACTION, button].concat(can.base.trim(can.core.Item(can.Option(), function(key, value) { return value }))))
},
onslideright: function(event, can, data, direction) {
can.onaction._goback && can.onaction._goback(event)
},
onslidedown: function(event, can, data, direction) {
return
var target = can.ui.list||can.ui.output||can._output
if (target.scrollTop == 0) {
if (target.scrollTop < -100) {
can.Update(can.request(event, {_toast: "reload"}))
}
},
onslideup: function(event, can, data, direction) {
return
var target = can.ui.list||can._output
if (target.offsetHeight+target.scrollTop == target.scrollHeight) {
var target = can.ui.list||can.ui.output||can._output
if (target.offsetHeight+target.scrollTop > target.scrollHeight+100) {
can.Update(can.request(event, {_toast: "reload"}))
}
},
@ -568,10 +781,17 @@ Volcanos(chat.ONINPUTS, {
_nameicon: function(event, can, msg, target, name, title) { name = name||mdb.NAME
can.page.Appends(can, can._output, msg.Table(function(value) {
var _title = can.user.trans(can.sup, value[title]||value[name]||value[mdb.NAME], null, "value."+name)
var icons = can.sup.Conf("_trans.value."+name+".icons."+value[name])||can.sup.Conf("_trans.value."+name+".icons."+value[title])||value.icons||"usr/icons/icebergs.png"
var icons = can.misc.ResourceIcons(can,
value.icons||value.icon||value.user_avatar||
can.sup.Conf("_trans.value."+name+".icons."+value[name])||
can.sup.Conf("_trans.value."+name+".icons."+value[title])
)
return {view: html.ITEM, list: [{img: can.misc.Resource(can, icons), },
{view: html.CONTAINER, list: [{view: [html.TITLE, "", _title]},
can.onappend.label(can, value, kit.Dict("version", icon.version, "time", icon.compile, name, icon.data)),
can.onappend.label(can, value, kit.Dict(
"version", icon.version, "time", icon.compile, name, icon.data,
"user_name", icon.username,
)),
]},
], onclick: function(event) { can.showIcons(value[name]||value[mdb.NAME], icons, _title) }}
}))

View File

@ -43,7 +43,7 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
if (name.indexOf("/require/") == 0 && meta.iceberg) { name = meta.iceberg+name }
if (name.indexOf("/p/") == 0 && meta.iceberg) { name = meta.iceberg+name }
if (name.indexOf("/v/") == 0 && meta.iceberg) { name = meta.iceberg+name }
meta.cache[name]? next(): meta._load(name, next)
(!can._follow || can._follow.indexOf("/plugin/local/code/vimer.js") == -1) && meta.cache[name]? next(): meta._load(name, next)
},
request: function(event) { event = event||{}, event = event._event||event
var msg = event._msg||can.misc.Message(event, can); event._msg = msg
@ -127,7 +127,7 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
} return can.base.isUndefined(res) && key.indexOf(ctx.FEATURE+nfs.PT) == -1? can.Conf(can.core.Keys(ctx.FEATURE, key)): res
}, _conf: {},
}, meta)); if (_can_name) { meta.cache[_can_name] = meta.cache[_can_name]||[], meta.cache[_can_name].push(can) } else { list.push(can) }
setTimeout(function() { can.require(can._follow? libs.concat(meta.libs, meta.frame): libs, cb) }, 1)
libs && setTimeout(function() { can.require(can._follow? libs.concat(meta.libs, meta.frame): libs, cb) }, 1)
return can
})
try { if (typeof(window) == code.OBJECT) { var meta = Volcanos.meta
@ -145,6 +145,9 @@ try { if (typeof(window) == code.OBJECT) { var meta = Volcanos.meta
default: var item = document.createElement(nfs.SCRIPT); item.src = url, item.onerror = _cb, item.onload = _cb, document.body.appendChild(item)
}
}
document.ondrop = function(event) {
debugger
}
meta.target = document.body, meta._height = window.innerHeight, meta._width = window.innerWidth
meta._init = function(can) { var last = can.page.width() < can.page.height()
window.onresize = function(event) { can.misc.Event(event, can, function(msg) {