Compare commits
180 Commits
Author | SHA1 | Date | |
---|---|---|---|
b24bdc33f2 | |||
4fba3f0a65 | |||
58c1f57814 | |||
fb526f0c8e | |||
7426ac64cb | |||
27b6505a44 | |||
2da6711ce3 | |||
d95a8e99b4 | |||
6ce0e580de | |||
87841a9e2f | |||
82b234b002 | |||
4a81d5e87b | |||
68f8c3b873 | |||
![]() |
71fd4be1c9 | ||
![]() |
ebeecd3423 | ||
![]() |
a34814261a | ||
![]() |
647dbf6d91 | ||
6b0fc20430 | |||
c76ef839aa | |||
ee60a8b9bc | |||
39fcf84f40 | |||
7a44753dca | |||
31f888755f | |||
a63f1d4dab | |||
b70e92c19d | |||
![]() |
d442e0c168 | ||
![]() |
044d57c509 | ||
![]() |
7aaf056db8 | ||
![]() |
37b896bed1 | ||
![]() |
34686ad781 | ||
![]() |
808124b782 | ||
1aa5603a82 | |||
39499d7f4b | |||
![]() |
0fb76d1569 | ||
4d59ba0b77 | |||
d409358c30 | |||
47d96e5e0a | |||
9fa440245a | |||
98916131e3 | |||
9f6650df0d | |||
![]() |
943c1ec129 | ||
![]() |
33bb1ef07b | ||
81f8598691 | |||
a6a2b12072 | |||
af2222ca55 | |||
32abbf3a70 | |||
6263444d07 | |||
4d9d3a6bda | |||
6313d57ff6 | |||
e354cf4d2f | |||
69c73c5593 | |||
3a3def6e96 | |||
e70b727c94 | |||
cb5d5d992e | |||
b06d344082 | |||
f893b961a6 | |||
![]() |
29d9275a65 | ||
1020f41d5d | |||
33a7151166 | |||
![]() |
0f61c3acbd | ||
9d89082b3e | |||
![]() |
d87ec7d9c4 | ||
![]() |
d5e5e2747f | ||
![]() |
1ca51e3895 | ||
![]() |
ec5d230bd9 | ||
![]() |
e7c8114430 | ||
46d4aaf0f4 | |||
![]() |
c9d4795809 | ||
![]() |
8577dd764d | ||
![]() |
1ead9f4b25 | ||
![]() |
b4dbf11528 | ||
![]() |
fb9687dd55 | ||
![]() |
daba956955 | ||
![]() |
78af0b3d1c | ||
![]() |
d7c0a536ea | ||
![]() |
b11fba0426 | ||
b8eefca8f5 | |||
![]() |
284c73cff2 | ||
![]() |
a158908876 | ||
![]() |
4f80806c45 | ||
![]() |
76a97837f3 | ||
0e28e0c39b | |||
912f0133f3 | |||
97e784c584 | |||
f34d04c775 | |||
20f812aff3 | |||
3bfb3f7af3 | |||
4b4acce081 | |||
e31dcbad3d | |||
02e368768b | |||
df5510d467 | |||
0cdd17355f | |||
d377063c0f | |||
eeea6f5a77 | |||
134235b106 | |||
ff1a17fcdf | |||
15e9e790be | |||
8ba9cefd0f | |||
5f3ccc5c65 | |||
aec86f5d34 | |||
7ca69339be | |||
833b44685e | |||
e30eb0bfd5 | |||
d6d648ff90 | |||
a4437facdb | |||
f15c99f3bd | |||
aca43dd83b | |||
d27c8223b2 | |||
e44c12376c | |||
cafaf8a308 | |||
7f93fb9f88 | |||
4bd2db3315 | |||
e695611fd7 | |||
7430e2b312 | |||
d8d9ba3b24 | |||
459cb45bf4 | |||
2e63b0259f | |||
904bb34a06 | |||
![]() |
f394b6f97c | ||
![]() |
134e960e64 | ||
5f202a293e | |||
6032d02915 | |||
75245d87cb | |||
8671f50f74 | |||
4ef7126abc | |||
f392e90f37 | |||
29415a6eb2 | |||
5f2e629b12 | |||
b601a77be5 | |||
e035f043ee | |||
a23ab72753 | |||
118dbaa70c | |||
58182dc2a2 | |||
68edc8fa54 | |||
![]() |
c9c365e8b0 | ||
f87f4686c9 | |||
fe3eb04c7b | |||
c6a90754c3 | |||
968f15104c | |||
50cfffbf2a | |||
d6987088c3 | |||
d5f0783828 | |||
a5c441a574 | |||
ebab2d09ac | |||
ff0189dcf4 | |||
c2111a2f51 | |||
2261a365a7 | |||
ad98d694d2 | |||
4ef839d9b3 | |||
a3469971d1 | |||
0bf940b4df | |||
2d79b9871b | |||
a52eecd1c3 | |||
91c12528f2 | |||
a843684da8 | |||
bf970aa2a7 | |||
5b9f0bdb66 | |||
1e2dce32ad | |||
533d4cbf5f | |||
78e18b47b3 | |||
ad17b22061 | |||
20950d875f | |||
c67fc1a905 | |||
23f1142ae7 | |||
d9e09c0dc3 | |||
a0032c60ba | |||
9cec65ee5f | |||
a8d158616b | |||
f2475b7ecc | |||
923ba3ff64 | |||
e99a96006f | |||
42b2905107 | |||
fe30334244 | |||
3774877186 | |||
119465db1d | |||
8d5f3edf7a | |||
68eedc76f1 | |||
8fcb2dfdfa | |||
7622ca567f | |||
c2b6b3825e |
2
LICENSE
@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 shylinux
|
||||
Copyright (c) 2017-2025 shylinux
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
76
const.js
@ -19,6 +19,7 @@ var ice = {
|
||||
MAIN: "main", AUTO: "auto",
|
||||
LIST: "list", BACK: "back",
|
||||
MODE: "mode", EXEC: "exec",
|
||||
INFO: "info",
|
||||
|
||||
APP: "app", CAN: "can", CAN_PLUGIN: "can._plugin",
|
||||
OPS: "ops", DEV: "dev", POD: "pod", CTX: "ctx", CMD: "cmd", ARG: "arg",
|
||||
@ -40,8 +41,8 @@ var ice = {
|
||||
MSG_RIVER: "sess.river", MSG_STORM: "sess.storm",
|
||||
|
||||
MSG_COST: "sess.cost", MSG_MODE: "sess.mode",
|
||||
MSG_NODETYPE: "node.type", TABLE_CHECKBOX: "table.checkbox",
|
||||
FROM_DAEMON: "from.daemon",
|
||||
MSG_NODETYPE: "node.type", MSG_NODENAME: "node.name",
|
||||
TABLE_CHECKBOX: "table.checkbox", FROM_DAEMON: "from.daemon",
|
||||
|
||||
PROCESS_REWRITE: "_rewrite",
|
||||
PROCESS_FIELD: "_field",
|
||||
@ -70,17 +71,22 @@ var mdb = {FOREACH: "*", RANDOMS: "%",
|
||||
TIME: "time", ZONE: "zone", ID: "id",
|
||||
TYPE: "type", NAME: "name", TEXT: "text", ICON: "icon", ICONS: "icons",
|
||||
KEY: "key", VALUE: "value", STATUS: "status", EXTRA: "extra",
|
||||
INDEX: "index", EXPIRE: "expire",
|
||||
ORDER: "order", WEIGHT: "weight",
|
||||
ENABLE: "enable", DISABLE: "disable",
|
||||
RENAME: "rename",
|
||||
KEYWORD: "keyword",
|
||||
CURRENT: "current",
|
||||
SWITCH: "switch",
|
||||
NOTFOUND: "notfound",
|
||||
NICK: "nick",
|
||||
DATA: "data", VIEW: "view",
|
||||
ENABLE: "enable", DISABLE: "disable",
|
||||
INDEX: "index", ORDER: "order", WEIGHT: "weight",
|
||||
DATA: "data", VIEW: "view", INFO: "info", HELP: "help",
|
||||
INPUTS: "inputs", CREATE: "create", REMOVE: "remove", UPDATE: "update",
|
||||
INSERT: "insert", DELETE: "delete", MODIFY: "modify", SELECT: "select",
|
||||
PRUNES: "prunes", EXPORT: "export", IMPORT: "import",
|
||||
SEARCH: "search", ENGINE: "engine", RENDER: "render", PLUGIN: "plugin",
|
||||
DETAIL: "detail", NORMAL: "normal", PRUNE: "prune",
|
||||
RENAME: "rename", CANCEL: "cancel", EXPIRE: "expire", FINISH: "finish",
|
||||
BEGIN_TIME: "begin_time", END_TIME: "end_time",
|
||||
CANCEL_TIME: "cancel_time", EXPIRE_TIME: "expire_time", FINISH_TIME: "finish_time",
|
||||
MAIN: "main", PAGE: "page", NEXT: "next", PREV: "prev", LIMIT: "limit", OFFEND: "offend",
|
||||
QS: ice.QS, AT: ice.AT,
|
||||
EQ: ice.EQ, FS: ice.FS,
|
||||
@ -89,7 +95,7 @@ var web = {
|
||||
SERVE: "serve", SPACE: "space", DREAM: "dream", ROUTE: "route",
|
||||
SHARE: "share", TOKEN: "token", STATS: "stats", COUNT: "count",
|
||||
SPIDE: "spide", STORE: "store", ADMIN: "admin", MATRIX: "matrix",
|
||||
GRANT: "grant",
|
||||
GRANT: "grant", CHAT_GRANT: "web.chat.grant",
|
||||
|
||||
WORKER: "worker", SERVER: "server", ORIGIN: "origin", VENDOR: "vendor",
|
||||
GATEWAY: "gateway", ONLINE: "online", OFFLINE: "offline",
|
||||
@ -100,6 +106,7 @@ var web = {
|
||||
CANCEL: "cancel", SUBMIT: "submit", CONFIRM: "confirm", REFRESH: "refresh",
|
||||
UPLOAD: "upload", DOWNLOAD: "download", PREVIEW: "preview", TOIMAGE: "toimage",
|
||||
|
||||
CLIENT_NAME: "client.name",
|
||||
SHARE_CACHE: "/share/cache/", SHARE_LOCAL: "/share/local/", BASIC_LOGIN: "/basic/login",
|
||||
CHAT_SSO: "/chat/sso/", CHAT_POD: "/chat/pod/", CHAT_CMD: "/chat/cmd/",
|
||||
|
||||
@ -107,8 +114,10 @@ var web = {
|
||||
PORTAL: "portal", DESKTOP: "desktop",
|
||||
STUDIO: "studio", SERVICE: "service",
|
||||
MESSAGE: "message",
|
||||
WORD: "word",
|
||||
STATUS: "status",
|
||||
VIMER: "vimer",
|
||||
WORD: "word",
|
||||
PLAN: "plan",
|
||||
|
||||
CODE_GIT_SEARCH: "web.code.git.search",
|
||||
CODE_GIT_STATUS: "web.code.git.status",
|
||||
@ -170,6 +179,7 @@ var tcp = {
|
||||
SERVICE: "service", HOSTNAME: "hostname",
|
||||
WIFI: "wifi", SSID: "ssid",
|
||||
LOCALHOST: "localhost",
|
||||
DIAL: "dial",
|
||||
DIRECT: "direct", SEND: "send", RECV: "recv",
|
||||
}
|
||||
var nfs = {
|
||||
@ -222,6 +232,8 @@ var nfs = {
|
||||
CHAT_RIVER: "/chat/river/", CHAT_ACTION: "/chat/action/",
|
||||
|
||||
DF: ice.DF, PS: ice.PS, PT: ice.PT,
|
||||
BACKGROUND_JPG: "usr/icons/background.jpg",
|
||||
AVATAR_JPG: "usr/icons/avatar.jpg",
|
||||
}
|
||||
var cli = {
|
||||
RUNTIME: "runtime", SYSTEM: "system", DAEMON: "daemon",
|
||||
@ -234,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 = {
|
||||
@ -244,7 +257,7 @@ var code = {
|
||||
FAVOR: "favor", XTERM: "xterm", INNER: "inner", VIMER: "vimer",
|
||||
WEBPACK: "webpack", BINPACK: "binpack", AUTOGEN: "autogen", COMPILE: "compile", PUBLISH: "publish", UPGRADE: "upgrade",
|
||||
TEMPLATE: "template", COMPLETE: "complete", NAVIGATE: "navigate", CURRENT: "current",
|
||||
PULL: "pull", PUSH: "push",
|
||||
STATUS: "status", PULL: "pull", PUSH: "push",
|
||||
INSTALL: "install",
|
||||
COMMENT: "comment", KEYWORD: "keyword", DATATYPE: "datatype", PACKAGE: "package",
|
||||
FUNCTION: "function", CONSTANT: "constant", STRING: "string", NUMBER: "number", BOOLEAN: "boolean",
|
||||
@ -254,6 +267,7 @@ var code = {
|
||||
}
|
||||
var wiki = {
|
||||
DRAW: "draw", WORD: "word", PORTAL: "portal",
|
||||
FEEL: "feel",
|
||||
TITLE: "title", BRIEF: "brief", REFER: "refer", SPARK: "spark", SHELL: "shell",
|
||||
ORDER: "order", TABLE: "table", CHART: "chart", IMAGE: "image", VIDEO: "video",
|
||||
FIELD: "field", LOCAL: "local", PARSE: "parse",
|
||||
@ -268,20 +282,19 @@ var chat = {
|
||||
SHARE: "share", RIVER: "river", STORM: "storm", FIELD: "field", TOOL: "tool",
|
||||
STATE: "state", MENUS: "menus", SSO: "sso", LOCATION: "location", IFRAME: "iframe", DESKTOP: "desktop",
|
||||
OUTPUT: "output", SIMPLE: "simple", FLOAT: "float", FULL: "full", CMD: "cmd",
|
||||
MESSAGE: "message",
|
||||
MESSAGE: "message", REQUEST: "request", RESPONSE: "response",
|
||||
MATRIX: "matrix",
|
||||
TUTOR: "tutor",
|
||||
FLOWS: "flows",
|
||||
ADMIN: "admin",
|
||||
|
||||
HEADER: "Header", ACTION: "Action", FOOTER: "Footer",
|
||||
libs: ["base.js", "core.js", "date.js", "misc.js", "page.js", "user.js"].map(function(p) { return "/lib/"+p }),
|
||||
panel_list: [{name: "Header", style: "head"}, {name: "River", style: "left"}, {name: "Action", style: "main"}, {name: "Search", style: "auto"}, {name: "Footer", style: "foot"}],
|
||||
plugin_list: [
|
||||
"state.js",
|
||||
"input.js",
|
||||
"table.js",
|
||||
plugin_list: ["state.js", "input.js", "table.js",
|
||||
"input/key.js",
|
||||
"input/date.js",
|
||||
].concat(navigator.userAgent.indexOf("Mobile") > -1? []: [
|
||||
"story/json.js",
|
||||
"story/stats.js",
|
||||
"story/spides.js",
|
||||
@ -295,7 +308,7 @@ var chat = {
|
||||
"local/wiki/feel.js",
|
||||
"local/wiki/word.js",
|
||||
"local/team/plan.js",
|
||||
].map(function(p) { return "/v/plugin/"+p }),
|
||||
]).map(function(p) { return "/v/plugin/"+p }),
|
||||
PLUGIN_LOCAL: "/plugin/local/", PLUGIN_STORY: "/plugin/story/", PLUGIN_INPUT: "/plugin/input/",
|
||||
PLUGIN_INPUT_JS: "/plugin/input.js", PLUGIN_TABLE_JS: "/plugin/table.js", PLUGIN_STATE_JS: "/plugin/state.js",
|
||||
FRAME_JS: "/v/frame.js",
|
||||
@ -314,12 +327,22 @@ var chat = {
|
||||
_INIT: "_init", _DELAY_INIT: "_delay_init",
|
||||
_TRANS: "_trans", _STYLE: "_style", _ENGINE: "_engine", _SEARCH: "_search", _NAMES: "_names", _TOAST: "_toast",
|
||||
|
||||
PAGES_RIVER: "/pages/river/river",
|
||||
PAGES_HOME: "/pages/action/home",
|
||||
PAGES_DREAM: "/pages/action/dream",
|
||||
PAGES_DESKTOP: "/pages/action/desktop",
|
||||
PAGES_MY: "/pages/action/my",
|
||||
PAGES_SEARCH: "/pages/action/search",
|
||||
PAGES_ACTION: "/pages/action/action",
|
||||
PAGES_INSERT: "/pages/insert/insert",
|
||||
PAGES_RIVER: "/pages/river/river",
|
||||
PAGES_GRANT: "/pages/web-chat/grant",
|
||||
|
||||
WX_LOGIN_SESS: "/chat/wx/login/action/sess",
|
||||
WX_LOGIN_USER: "/chat/wx/login/action/user",
|
||||
WX_LOGIN_SCAN: "/chat/wx/login/action/scan",
|
||||
API_HEADER: "/chat/header/",
|
||||
API_SEARCH: "/chat/search/",
|
||||
API_ACTION: "/chat/action/",
|
||||
}
|
||||
var team = {
|
||||
TASK: "task", PLAN: "plan", ASSET: "asset",
|
||||
@ -336,11 +359,13 @@ var http = {
|
||||
GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE",
|
||||
Accept: "Accept", ContentType: "Content-Type", ApplicationJSON: "application/json", ApplicationFORM: "application/x-www-form-urlencoded",
|
||||
}
|
||||
var html = {value: {
|
||||
var html = {
|
||||
value: {
|
||||
PROJECT_WIDTH: 230, RIVER_WIDTH: 230,
|
||||
FLOAT_HEIGHT: 480, FLOAT_WIDTH: 1200,
|
||||
PLUGIN_PADDING: 0, PLUGIN_MARGIN: 0,
|
||||
|
||||
IFRAME_HEIGHT: 420,
|
||||
HEADER_HEIGHT: 48, ACTION_HEIGHT: 32, STATUS_HEIGHT: 32,
|
||||
QRCODE_HEIGHT: 363, QRCODE_WIDTH: 360,
|
||||
CARD_HEIGHT: 160, CARD_WIDTH: 280,
|
||||
@ -353,7 +378,7 @@ var html = {value: {
|
||||
RIVER_MARGIN: 80, ACTION_MARGIN: 200,
|
||||
ORDER_SHOW_LIMIT: 30, ORDER_SHOW_DELAY: 150,
|
||||
CODE_FONT_SIZE: 14, CODE_LINE_HEIGHT: 20,
|
||||
},
|
||||
},
|
||||
STORY: "story",
|
||||
FIELDSET: "fieldset", LEGEND: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status",
|
||||
OPTION_ARGS: "select.args,input.args,textarea.args", INPUT_ARGS: "input.args,textarea.args", INPUT_BUTTON: "input[type=button]", INPUT_FILE: "input[type=file]",
|
||||
@ -373,6 +398,8 @@ var html = {value: {
|
||||
CONFIRM: "confirm", CLOSE: "close", CLICK: "click", FOCUS: "focus", BLUR: "blur",
|
||||
TABLE: "table", THEAD: "thead", TBODY: "tbody", TR: "tr", TH: "th", TD: "td",
|
||||
HEADER: "header", NAV: "nav", MAIN: "main", ASIDE: "aside", FOOTER: "footer",
|
||||
NEED: "need", MUST: "must",
|
||||
TAIL: "tail",
|
||||
FAVICON: "favicon",
|
||||
|
||||
BACKGROUND_COLOR: "background-color", COLOR: "color",
|
||||
@ -407,12 +434,16 @@ var html = {value: {
|
||||
DIV_LAYOUT: "div.layout", DIV_LAYOUT_HEAD: "div.layout.head", DIV_LAYOUT_FOOT: "div.layout.foot", DIV_LAYOUT_LEFT: "div.layout.left",
|
||||
DIV_FLOAT: "div.float", DIV_TOAST: "div.toast", DIV_CARTE: "div.carte",
|
||||
DESKTOP: "desktop", DIV_DESKTOP: "div.desktop", DIV_EXPAND: "div.expand",
|
||||
ITEM_CARD: "item.card",
|
||||
DIV_ITEM_TEXT: "div.item.text",
|
||||
DIV_ITEM_SELECT: "div.item.select",
|
||||
DIV_TABS_SELECT: "div.tabs.select",
|
||||
DIV_PROFILE: "div.profile", DIV_DISPLAY: "div.display",
|
||||
|
||||
IMAGE_PNG: "image/png", VIDEO_WEBM: "video/webm",
|
||||
BACKGROUND_JPG: "usr/icons/background.jpg",
|
||||
BACKGROUND_PNG: "usr/icons/background.png",
|
||||
AVATAR_JPG: "usr/icons/avatar.jpg",
|
||||
}
|
||||
var icon = {
|
||||
CHEVRON_DOWN: "bi bi-chevron-down", SEARCH: "bi bi-search", TERMINAL: "bi bi-terminal", SUN: "bi bi-sun", MOON: "bi bi-moon-stars",
|
||||
@ -446,10 +477,13 @@ var icon = {
|
||||
modify: "bi bi-pencil-square",
|
||||
rename: "bi bi-pencil-square",
|
||||
remove: "bi bi-trash",
|
||||
detail: "bi bi-file-earmark-text",
|
||||
enable: "bi bi-toggle-off", disable: "bi bi-toggle-on",
|
||||
expire: "bi bi-clock-history",
|
||||
|
||||
name: "bi bi-sort-alpha-down",
|
||||
time: "bi bi-clock-history",
|
||||
size: "bi bi-calculator",
|
||||
sess: "bi bi-telephone-forward",
|
||||
path: "bi bi-folder2", file: "bi bi-file-earmark-text", line: "bi bi-sort-numeric-down",
|
||||
start: "bi bi-play-circle", stop: "bi bi-stop-circle",
|
||||
@ -483,6 +517,7 @@ var icon = {
|
||||
data: "bi bi-database",
|
||||
branch: "bi bi-diagram-3", commit: "bi bi-hash",
|
||||
message: "bi bi-wechat",
|
||||
address: "bi bi-pin-map",
|
||||
|
||||
plugin: "bi bi-window-stack",
|
||||
preview: "bi bi-window-stack", show: "bi bi-window-stack",
|
||||
@ -495,6 +530,7 @@ var icon = {
|
||||
host: "bi bi-pc-display",
|
||||
port: "bi bi-hash",
|
||||
arch: "bi bi-cpu", os: "bi bi-ubuntu",
|
||||
cpu: "bi bi-cpu",
|
||||
role: "bi bi-person-square",
|
||||
title: "bi bi-textarea-t",
|
||||
type: "bi bi-card-list",
|
||||
@ -530,3 +566,5 @@ try { module.exports = {
|
||||
code: code, wiki: wiki, chat: chat, team: team, mall: mall,
|
||||
http: http, html: html, icon: icon, svg: svg
|
||||
} } catch (e) {}
|
||||
|
||||
var UID = "uid"
|
||||
|
340
frame.js
@ -1,12 +1,14 @@
|
||||
Volcanos(chat.ONENGINE, {
|
||||
_init: function(can, meta, list, cb, target) {
|
||||
can.user.isMobile && (can.Inputs = can.page.Append(can, document.body, ["inputs"])._target)
|
||||
can.Option = function() {}, can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb) }
|
||||
can.core.Next(list, function(item, next) { item.type = chat.PANEL
|
||||
can.onappend._init(can, item, item.list, function(sub) { can[item.name] = sub, sub.db = {}, sub.ui = {}, sub.db._boot = can.misc._time()
|
||||
sub.run = function(event, cmds, cb) { var msg = sub.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, sub, cmds, cb) }
|
||||
can.core.Item(sub.onplugin, function(key, cmd) { sub.onplugin.hasOwnProperty(key) && can.base.isFunc(cmd) && can.onengine.plugin(sub, can.core.Keys(ice.CAN, key), cmd) })
|
||||
can.core.ItemCB(sub.onaction, function(key, cb) { can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {event: msg._event, can: sub, msg: msg}) }) })
|
||||
can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, cb: next, target: sub._target}), delete(sub._history), delete(sub._conf.feature)
|
||||
// can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, cb: next, target: sub._target}), delete(sub._history), delete(sub._conf.feature)
|
||||
next(), can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, cb: function() {}, target: sub._target}), delete(sub._history), delete(sub._conf.feature)
|
||||
}, target)
|
||||
}, function() { can.onlayout._init(can, target), can.onmotion._init(can, target), can.onkeymap._init(can, target)
|
||||
can.onengine.signal(can, chat.ONMAIN, can.request()), can.base.isFunc(cb) && cb(can)
|
||||
@ -22,7 +24,8 @@ Volcanos(chat.ONENGINE, {
|
||||
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() {
|
||||
if (sub.__toast || sub._toast) { return } toast = toast||can.user.toastProcess(sub, _toast) }, 30) }
|
||||
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])) {
|
||||
can.base.isUndefined(sub._daemon) && can.ondaemon._list[0] && (sub._daemon = can.ondaemon._list.push(sub)-1)
|
||||
if (sub._daemon) { msg.Option(ice.MSG_DAEMON, can.core.Keys(can.ondaemon._list[0], sub._daemon)) }
|
||||
@ -32,7 +35,9 @@ 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) {
|
||||
toast && can.user.toastSuccess(msg._can, msg.Option(ctx.ACTION)+lex.SP+ice.SUCCESS), toast && toast.close && toast.close(), toast = true
|
||||
msg.IsErr() || 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
|
||||
})
|
||||
},
|
||||
@ -92,6 +97,9 @@ Volcanos(chat.ONDAEMON, {
|
||||
can.base.isFunc(sub.Update) && sub.Update()
|
||||
}
|
||||
},
|
||||
cookie: function(can, msg, arg) {
|
||||
can.misc.Cookie(can, arg[1], arg[0])
|
||||
},
|
||||
grant: function(can, msg, sub, arg) {
|
||||
var toast = can.user.toast(can, {duration: arg[1]||10000, content: "grant "+arg[0], action: shy({
|
||||
confirm: function(event) { toast.close(), can.run(can.request(event, {name: arg[0]}), [ctx.ACTION, ctx.RUN, web.SPACE, aaa.LOGIN]) },
|
||||
@ -148,7 +156,7 @@ Volcanos(chat.ONAPPEND, {
|
||||
var status = can.page.SelectOne(can, field, html.DIV_STATUS)
|
||||
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() && (can.base.isIn(meta.index, web.WIKI_PORTAL)) && can.onappend.style(can, html.OUTPUT, field)
|
||||
can.isCmdMode() && meta.style != "float" && (can.base.isIn(meta.index, web.WIKI_PORTAL)) && can.onappend.style(can, html.OUTPUT, field)
|
||||
var sub = Volcanos(meta.name, {_root: can._root||can, _follow: can.core.Keys(can._follow, meta.name), _target: field,
|
||||
_legend: legend, _option: option, _action: action, _output: output, _status: status, _history: [], db: {hash: [""]}, ui: {},
|
||||
Status: function(key, value) { if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } try {
|
||||
@ -158,13 +166,8 @@ Volcanos(chat.ONAPPEND, {
|
||||
return can.base.isUndefined(value)? (value = target.innerText): (target.innerHTML = value.trim? value.trim(): value+"")
|
||||
}); return value
|
||||
} catch (e) {} },
|
||||
Action: function(key, value) {
|
||||
// value && (value = can.user.trans(sub, value, null, html.INPUT))
|
||||
return can.page.SelectArgs(can, action, key, value)[0]
|
||||
},
|
||||
Option: function(key, value) {
|
||||
// value && (value = can.user.trans(sub, value, null, html.INPUT));
|
||||
return can.page.SelectArgs(can, option, key, value)[0] },
|
||||
Action: function(key, value) { return can.page.SelectArgs(can, action, key, value)[0] },
|
||||
Option: function(key, value) { return can.page.SelectArgs(can, option, key, value)[0] },
|
||||
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())
|
||||
@ -180,7 +183,10 @@ Volcanos(chat.ONAPPEND, {
|
||||
},
|
||||
Clone: function() { meta.args = can.page.SelectArgs(can), can.onappend._init(can, meta, list, function(sub) { can.base.isFunc(cb) && cb(sub, true), can.onmotion.delay(can, sub.Focus) }, target) },
|
||||
}, list, function(sub) { meta.feature = can.base.Obj(meta.feature, {}), sub.Conf(meta), field._can = sub
|
||||
can.onappend.style(sub, meta.index? meta.index.split(nfs.PT): meta.name), can.onappend.style(sub, sub.Conf(ctx.STYLE)), can.onappend.style(sub, sub.Mode())
|
||||
can.onappend.style(sub, meta.index? meta.index.split(nfs.PT): meta.name)
|
||||
can.onappend.style(sub, sub.Conf(ctx.STYLE))
|
||||
can.onappend.style(sub, sub.Conf("_style"))
|
||||
can.onappend.style(sub, sub.Mode())
|
||||
sub.isCmdMode() && can.onappend.style(sub, can.misc.Search(can, ctx.STYLE)), sub.isCmdMode() && sub.Conf(can.misc.Search(can))
|
||||
sub._trans = can.base.Copy(sub._trans||{}, can.core.Value(sub, [chat.ONACTION, chat._TRANS]))
|
||||
can.core.Item(meta.feature, function(key, cb) { cb.help && sub.user.trans(sub, kit.Dict(key, cb.help)) })
|
||||
@ -194,7 +200,9 @@ Volcanos(chat.ONAPPEND, {
|
||||
}) })
|
||||
}), can.base.isFunc(cb) && cb(sub)
|
||||
if (sub.isOutputStyle()) { return } if (can.user.isMobile && !can.user.isLandscape()) { return }
|
||||
sub.isCmdMode() && !can.base.isIn(meta.index, web.CODE_VIMER, web.CODE_INNER, web.CHAT_MACOS_DESKTOP) && can.page.insertBefore(can, [{view: "header", list: can.user.header(sub)}], sub._output, sub._fields||sub._target)
|
||||
if (!sub.isCmdMode()) { return }
|
||||
!can.base.isIn(meta.index, web.CODE_VIMER, web.CODE_INNER, web.CHAT_MACOS_DESKTOP) && can.page.insertBefore(can, [{view: "header", list: can.user.header(sub)}], sub._output, sub._fields||sub._target)
|
||||
can.user.agent.cmd = sub, can.user.agent.init && can.user.agent.init(sub)
|
||||
}); return sub
|
||||
},
|
||||
_option: function(can, meta, option, skip) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {})
|
||||
@ -213,8 +221,9 @@ Volcanos(chat.ONAPPEND, {
|
||||
}[item.name||item||""]; if (!icon) { return } item.style = "icons"
|
||||
can.page.Append(can, option, [{view: [[html.ITEM, html.ICON, icon.name, item.name], html.DIV, can.page.unicode[icon.name]], title: can.user.trans(can, item.name), onclick: function(event) {
|
||||
can.onengine.signal(can, "onevent", can.request(event, {_type: html.OPTION}))
|
||||
var msg = can.request(event, {_toast: can.base.isIn(item.name, "list", "back")? "reload": item.name}), cmds = [ctx.ACTION, item.name];
|
||||
if (icon.cb) { return icon.cb(event) }
|
||||
var msg = can.request(event), cmds = [ctx.ACTION, item.name]; msg.RunAction(event, can.sub, cmds) || msg.RunAction(event, can, cmds) || can.Update(event, cmds)
|
||||
msg.RunAction(event, can.sub, cmds) || msg.RunAction(event, can, cmds) || can.Update(event, cmds)
|
||||
}}])
|
||||
})
|
||||
while (args.length > 0) { if (args[args.length-1] != "") { break } args.pop() }
|
||||
@ -244,6 +253,7 @@ Volcanos(chat.ONAPPEND, {
|
||||
var auto; can.core.Next(can.core.Value(can, [chat.ONIMPORT, mdb.LIST])||meta.inputs, add, function() {
|
||||
var p = can.misc.Search(can, ctx.ACTION); auto || can.page.style(can, can._target, "visibility", "")
|
||||
can.isCmdMode() || can.page.style(can, can._target, "visibility", "")
|
||||
if (can.Conf("feature.mode") == "result") { return }
|
||||
if (can.Conf("_ismain") && !can.Conf("_role") && can.misc.Search(can, log.DEBUG) != ice.TRUE) {
|
||||
|
||||
} else if (p && can.isCmdMode()) {
|
||||
@ -266,11 +276,14 @@ Volcanos(chat.ONAPPEND, {
|
||||
}})
|
||||
}
|
||||
can.core.List(list, function(item) {
|
||||
var value = can.sup && can.sup.onexport.session && can.sup.onexport.session(can.sup, "action:"+item.name||item[0]) || item.value
|
||||
if (value) { item.value = value }
|
||||
can.base.isUndefined(item) || can.onappend.input(can, item == ""? /* 1.空白 */ {type: html.BR}:
|
||||
can.base.isString(item)? /* 2.按键 */ {type: html.BUTTON, name: item, value: can.user.trans(can, item, meta._trans), onclick: function(event) {
|
||||
run(event, item)
|
||||
}}: item.length > 0? /* 3.列表 */ {type: html.SELECT, name: item[0], values: item.slice(1), onchange: function(event) { can.misc.Event(event, can, function(msg) {
|
||||
var button = event.target.value; can.onexport.session && can.onexport.session(can, "action:"+item[0], button)
|
||||
}}: item.length > 0? /* 3.列表 */ {type: html.SELECT, name: item[0], value: item.value, values: item.slice(1), onchange: function(event) { can.misc.Event(event, can, function(msg) {
|
||||
if (!can.onexport) { return }
|
||||
var button = event.target.value; can.onexport.session && can.onexport.session(can, "action:"+(item.name||item[0]), button)
|
||||
can.onaction._select && can.onaction._select(event, can, item[0], button)
|
||||
meta[item[0]]? can.core.CallFunc(meta[item[0]], [event, can, item[0], button]):
|
||||
meta[button]? can.core.CallFunc(meta[button], [event, can, button]): can.Action(item[0], button)
|
||||
@ -290,9 +303,10 @@ Volcanos(chat.ONAPPEND, {
|
||||
open: !can.isCmdMode() && "打开链接",
|
||||
// chat: "发送聊天",
|
||||
}: {_space: "",
|
||||
qrcode: !can.isCmdMode() && "生成链接",
|
||||
full: !can.isCmdMode() && "切换全屏",
|
||||
open: !can.isCmdMode() && "打开链接",
|
||||
chat: can.user.isTechOrRoot(can) && can.ConfIndex() != chat.MESSAGE && "发送聊天",
|
||||
// chat: can.user.isTechOrRoot(can) && can.ConfIndex() != chat.MESSAGE && "发送聊天",
|
||||
// help: can.page.ClassList.has(can, can._fields||can._target, html.PLUGIN) && can.Conf("_help") && can.Conf("_help") != "" && "查看文档",
|
||||
}, function(key, value) {
|
||||
return (value || value === "") && {view: [[html.ITEM, html.BUTTON, key, mdb.ICONS, "state"]], list: [{icon: icon[key]}],
|
||||
@ -310,10 +324,14 @@ Volcanos(chat.ONAPPEND, {
|
||||
var p = can._history[can._history.length-1]; p && p._opts && can.request(event, p._opts)
|
||||
return can.onengine._plugin(event, can, msg, can, cmds, cb) || can.run(event, cmds, function(msg) { var _can = can._fields? can.sup: can
|
||||
if (can.base.isFunc(cb) && !cb(msg)) { return } if (silent) { return }
|
||||
if (_can == (msg._can._fields? msg._can.sup: msg._can)) { if (can.core.CallFunc([_can, chat.ONIMPORT, ice.MSG_PROCESS], {can: _can, msg: msg})) { return } }
|
||||
if (_can == (msg._can._fields? msg._can.sup: msg._can)) { if (can.core.CallFunc([_can, chat.ONIMPORT, ice.MSG_PROCESS], {can: _can, msg: msg})) {
|
||||
can.onmotion.delay(can, function() { can.page.style(can, can._target, "visibility", ""), can.page.style(can, can._output, "visibility", "") }, 300)
|
||||
return
|
||||
} }
|
||||
if (cmds && cmds[0] == ctx.ACTION) { if (can.base.isIn(cmds[1], mdb.CREATE, mdb.INSERT, mdb.PRUNES, mdb.EXPORT, mdb.IMPORT, "exports", "imports", nfs.TRASH) || msg.Length() == 0 && !msg.Result()) {
|
||||
if (can.base.isIn(cmds[1], ctx.COMMAND)) { return }
|
||||
return can._toast || can.user.toastSuccess(can, cmds[1], ice.SUCCESS), can.Update()
|
||||
return can._toast || can.user.isMobile || can.user.toastSuccess(can, can.user.trans(can, cmds[1]), ice.SUCCESS), can.Update()
|
||||
return can.Update()
|
||||
} }
|
||||
can.onappend._output(can, msg, meta.display||msg.Option(ice.MSG_DISPLAY)||meta.feature.display)
|
||||
})
|
||||
@ -325,11 +343,11 @@ Volcanos(chat.ONAPPEND, {
|
||||
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,
|
||||
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)||undefined, chat.PLUGIN_TABLE_JS], function(sub) { sub.Conf(can.Conf())
|
||||
sub.db.hash = can.base.getValid(can.isCmdMode()? can.misc.SearchHash(can): [], can.misc.localStorage(can, [sub.ConfSpace()||can.misc.Search(can, ice.POD), sub.ConfIndex(), "hash"]))||[]
|
||||
}, [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"))||[]
|
||||
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, can.Input(cmds, !silent), cb, silent)
|
||||
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._trans = can.base.Copy(can.base.Copy(sub._trans||{}, can._trans), can.core.Value(sub, [chat.ONACTION, chat._TRANS]))
|
||||
@ -337,36 +355,44 @@ Volcanos(chat.ONAPPEND, {
|
||||
can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: can.page.inputs(can, sub.onimport.list, html.TEXT) })
|
||||
} can.onmotion.toggle(can, can._action, true), delete(can._status._cache), delete(can._status._cache_key)
|
||||
var output_old = can._output; sub._target = sub._output = can._output = output = can.page.insertBefore(can, [html.OUTPUT], can._status)
|
||||
can.page.style(can, can._output, "visibility", "hidden", "position", "fixed")
|
||||
can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight(), html.MAX_WIDTH, can.ConfWidth())
|
||||
if (sub.Mode() == ice.MSG_RESULT) { can._output.innerHTML = output_old.innerHTML }
|
||||
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.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)
|
||||
var list = can.base.Obj(msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION), [])||[]
|
||||
can.onmotion.clear(can, can._action), sub.onappend._action(sub, list, action||can._action)
|
||||
var list = can.base.Obj(msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION), sub.onaction.list||[])
|
||||
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.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) }
|
||||
} can.onappend.style(sub, sub.Conf(ctx.STYLE)), can.onmotion.story.auto(can, can._output)
|
||||
}
|
||||
|
||||
if (can.onimport.size) {
|
||||
can.page.ClassList.has(can, can._target, html.FLOAT) && !can.page.ClassList.has(can, can._target, html.PLUG)?
|
||||
can.onimport.size(can, can.ConfHeight(), can.base.Min(can.ConfWidth(), can._target.offsetWidth), can.Conf("_auto"), can.Mode()):
|
||||
can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), can.Conf("_auto"), can.Mode())
|
||||
can.isCmdMode() && can.page.style(can, can._output, html.HEIGHT, sub.ConfHeight())
|
||||
can.onexport.output(sub, msg); if (can.Conf("_output")) { can.Conf("_output")(sub, msg) }
|
||||
} msg.Defer(), can.base.isFunc(cb) && cb(msg), can.page.style(can, can._target, "visibility", ""),
|
||||
} msg.Defer(), can.base.isFunc(cb) && cb(msg)
|
||||
|
||||
// can.isCmdMode() && can.user.agent.init(can, can.user.info.titles)
|
||||
can._output.scrollTop = output_old.scrollTop, can._output.scrollLeft = output_old.scrollLeft
|
||||
can.page.style(can, can._output, "visibility", "", "position", ""), can.page.Remove(can, output_old)
|
||||
can.page.style(can, can._target, "visibility", ""), can.page.style(can, can._output, "visibility", "")
|
||||
can.page.ClassList.del(can, can._output, "_prepare"), can.page.style(can, can._output, html.LEFT, 0)
|
||||
can.page.Remove(can, output_old)
|
||||
}, target: output}), msg.Defer()
|
||||
})
|
||||
},
|
||||
_status: function(can, list, status, msg) { list && list.Option && (list = list.Option(ice.MSG_STATUS)||[])
|
||||
var keys = {}, fileline = can.Conf("_fileline")||""
|
||||
status = status||can._status, can.onmotion.clear(can, status)
|
||||
var keys = {}
|
||||
var fileline = can.Conf("_fileline")||""
|
||||
can.core.List((can.base.Obj(list, can.core.Value(can, [chat.ONEXPORT, mdb.LIST]))||[]).concat([
|
||||
can.ConfSpace() && {name: web.SPACE, value: can.ConfSpace()},
|
||||
], can.misc.Search(can, log.DEBUG) == ice.TRUE? [
|
||||
], can.misc.Search(can, log.DEBUG) == ice.TRUE && can.ConfIndex() != code.VIMER? [
|
||||
fileline && {name: nfs.SOURCE, value: can.base.trimPrefix(fileline.split("?")[0], nfs.REQUIRE, nfs.P), onclick: function(event) { can.onkeymap.prevent(event)
|
||||
var ls = can.misc.SplitPath(can, fileline); if (event.metaKey) {
|
||||
can.user.open(can.misc.MergePodCmd(can, {pod: can.ConfSpace(), cmd: web.CODE_VIMER, path: ls[0], file: ls[1]}))
|
||||
@ -412,14 +438,13 @@ Volcanos(chat.ONAPPEND, {
|
||||
|
||||
field: function(can, type, item, target) { type = type||html.STORY, item = item||{}
|
||||
var name = can.core.Split(item.nick||item.index||"", " .").pop()||""; can.base.isIn(name,
|
||||
"cluster",
|
||||
"launchTemplate",
|
||||
"cluster", "launchTemplate",
|
||||
tcp.SERVER, tcp.CLIENT, web.STUDIO, mdb.SEARCH, web.SERVICE,
|
||||
can.core.Split(can.ConfIndex(), nfs.PT).pop()
|
||||
) && (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
|
||||
@ -427,8 +452,14 @@ Volcanos(chat.ONAPPEND, {
|
||||
can.page.icons(can, item.icons||item.icon||name, item.space||item._space), {text: title},
|
||||
]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS]}])
|
||||
},
|
||||
input: function(can, item, value, target, style) { if ([html.BR, html.HR].indexOf(item.type) > -1) { return can.page.Append(can, target, [item]) }
|
||||
input: function(can, item, value, target, style) {
|
||||
if (["_space"].indexOf(item.view) > -1) { return can.page.Append(can, target, [item]) }
|
||||
if ([html.BR, html.HR].indexOf(item.type) > -1) { return can.page.Append(can, target, [item]) }
|
||||
if (item.type == html.SELECT) { item._selectonly = true, item.type = html.TEXT
|
||||
if (item.values && item.values.length > 0) { item._selectonly = false, item.type = html.SELECT }
|
||||
}
|
||||
var _icon = [], _item = can.base.Copy({className: "", type: "", name: ""}, item), input = can.page.input(can, _item, value)
|
||||
if (item._selectonly) { input._selectonly = true }
|
||||
if (item.type == html.SELECT) {
|
||||
can.core.List(input.list, function(item) { item.inner = can.user.trans(can, item.inner, item._trans, html.INPUT) })
|
||||
item.icon = item.icon||icon[item.name]
|
||||
@ -441,9 +472,15 @@ Volcanos(chat.ONAPPEND, {
|
||||
}
|
||||
}
|
||||
input.onclick = item.onclick
|
||||
if (item.type == html.TEXT) {
|
||||
if (item.type == html.PASSWORD) {
|
||||
input.placeholder = can.user.trans(can, input.placeholder||input.name, item._trans, html.INPUT)
|
||||
input.title = can.user.trans(can, input.title||input.placeholder||input.name, item._trans, html.INPUT)
|
||||
}
|
||||
if (item.type == html.TEXT) {
|
||||
if (!can.user.isMobile) {
|
||||
input.placeholder = can.user.trans(can, input.placeholder||input.name, item._trans, html.INPUT)
|
||||
input.title = can.user.trans(can, input.title||input.placeholder||input.name, item._trans, html.INPUT)
|
||||
}
|
||||
input.onkeydown = item.onkeydown||function(event) { if (event.key == code.ENTER) { return can.Update(), can.onkeymap.prevent(event) }
|
||||
can.onkeymap.input(event, can), can.onkeymap.selectOutput(event, can)
|
||||
}
|
||||
@ -454,13 +491,13 @@ Volcanos(chat.ONAPPEND, {
|
||||
can.core.CallFunc([event.target.previousSibling, "_clear"], {})
|
||||
}})
|
||||
if (item.name == html.FILTER) { item.icon = item.icon||icon.search }
|
||||
item.icon = item.icon||can.Conf(["_icons", item.name])||icon[item.name]
|
||||
item.icon = item.icon||can.Conf(["_trans.input.icons", item.name])||can.Conf(["_icons", item.name])||icon[item.name]
|
||||
}
|
||||
if (item.type == html.MULTIPLE) {
|
||||
input.data.type = html.BUTTON, input.value = can.user.trans(can, item.name)
|
||||
}
|
||||
if (item.range) { input._init = function(target) { can.onappend.figure(can, item, target, function(sub, value, old) { target.value = value, can.core.CallFunc([can.onaction, item.name], [event, can, item.name]) }) } }
|
||||
var _style = can.page.buttonStyle(can, item.name)
|
||||
var _style = can.Conf("_style."+item.name)||can.page.buttonStyle(can, item.name)
|
||||
var _input = can.page.Append(can, target, [{view: [[html.ITEM].concat(style, [item.type, item.name, item._className, item.icon? "_icon": ""], _style)], list: [item.icon && {icon: item.icon}, input].concat(_icon), _init: function(target, _input) {
|
||||
if (item.type == html.MULTIPLE) {
|
||||
can.onappend.multiple(can, item, _input.input)
|
||||
@ -486,7 +523,7 @@ Volcanos(chat.ONAPPEND, {
|
||||
can.user.trans(can, kit.Dict(target.name, target.value))
|
||||
return {type: html.BUTTON, name: target.name, value: target.value, style: _style}
|
||||
})
|
||||
function run(event, button) { button && can.run(can.request(event, value, can.Option())._event, [ctx.ACTION, button]), can.onkeymap.prevent(event) }
|
||||
function run(event, button) { button && can.run(can.request(event, value, can.Option(), {_toast: can.user.trans(can, button)})._event, [ctx.ACTION, button]), can.onkeymap.prevent(event) }
|
||||
if (list.length <= limit) {
|
||||
target.onclick = function(event) { run(event, event.target.name) }
|
||||
} else {
|
||||
@ -503,8 +540,8 @@ 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
|
||||
return can.onappend.input(can, {type: html.TEXT, name: web.FILTER, icon: icon.SEARCH, placeholder: "search in n items", onkeydown: function() {}, onkeyup: function(event) {
|
||||
var value = event.currentTarget? event.currentTarget.value: ""
|
||||
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)) {
|
||||
return
|
||||
}
|
||||
@ -528,12 +565,15 @@ Volcanos(chat.ONAPPEND, {
|
||||
var carte = can.user.carte(event, can, {}, can.core.List(item.values, function(item) {
|
||||
return can.user.trans(can, item, null, html.VALUE)
|
||||
}), function(event, button) { carte.close()
|
||||
if (target.value != button) { target.value = button, select.value = trans[button], select.onchange && select.onchange({target: select}) }
|
||||
if (target.value != button) { target.value = button, select.value = trans[button], select.onchange && select.onchange(event) }
|
||||
return true
|
||||
}); can.onappend.style(can, [html.SELECT, item.name], carte._target), can.page.style(can, carte._target, html.MIN_WIDTH, event.target.offsetWidth)
|
||||
can.page.Select(can, carte._target, html.DIV_ITEM, function(item) {
|
||||
if (target.value == item.innerText) {
|
||||
can.onappend.style(can, html.SELECT, item)
|
||||
can.onmotion.delay(can, function() {
|
||||
can.onmotion.scrollIntoView(can, item)
|
||||
}, 300)
|
||||
}
|
||||
})
|
||||
}, _init: function(target) { can.page.style(can, target, html.WIDTH, (select.offsetWidth||80)+30), can.onappend.style(can, html.HIDE, select) }}, {icon: mdb.SELECT}])
|
||||
@ -557,7 +597,10 @@ Volcanos(chat.ONAPPEND, {
|
||||
checkbox: function(can, table, msg) {
|
||||
can.page.Select(can, table, "tr>th:first-child,tr>td:first-child", function(target) {
|
||||
can.page.insertBefore(can, [{type: target.tagName, list: [{type: html.INPUT, data: {type: html.CHECKBOX}, onchange: function(event) {
|
||||
can.page.tagis(target, html.TH) && can.page.Select(can, table, "tr>td:first-child>input[type=checkbox]", function(target) { target.checked = event.target.checked })
|
||||
can.page.tagis(target, html.TH) && can.page.Select(can, table, "tr>td:first-child>input[type=checkbox]", function(target) {
|
||||
if (can.page.ClassList.has(can, can.page.parentNode(can, target, html.TR), html.HIDE)) { return }
|
||||
target.checked = event.target.checked
|
||||
})
|
||||
var list = {}, key = can.page.SelectArgs(can, can._option, "", function(target) { if (target.value == "") { return target.name } })
|
||||
can.page.Select(can, table, "tr>td:first-child>input[type=checkbox]", function(target) { can.page.ClassList.set(can, can.page.parentNode(can, target, html.TR), html.SELECT, target.checked)
|
||||
target.checked && can.core.List(key, function(key) { if (!msg[key]) { return } list[key] = (list[key]||[]).concat([msg[key][can.page.parentNode(can, target, html.TR).dataset.index]]) })
|
||||
@ -598,24 +641,47 @@ Volcanos(chat.ONAPPEND, {
|
||||
if (can.user.isMobile) { can.base.toLast(msg.append, mdb.TIME) } can.base.toLast(msg.append, web.LINK), can.base.toLast(msg.append, ctx.ACTION)
|
||||
if (msg.append[msg.append.length-1] == ctx.ACTION && can.core.List(msg[ctx.ACTION], function(item) { if (item) { return item } }).length == 0) { msg.append.pop() }
|
||||
if (msg.append[msg.append.length-1] == ctx.ACTION && (!msg[ctx.ACTION] || msg[ctx.ACTION].length == 0)) { msg.append.pop() }
|
||||
if (msg.IsDetail()) {
|
||||
for (var i = 0; i < msg[mdb.KEY].length; i++) {
|
||||
if (msg[mdb.KEY][i] == "action") { var action = msg[mdb.VALUE][i]
|
||||
for (var j = i; j < msg[mdb.KEY].length-1; j++) { msg[mdb.KEY][j] = msg[mdb.KEY][j+1], msg[mdb.VALUE][j] = msg[mdb.VALUE][j+1] }
|
||||
msg[mdb.KEY][j] = "action", msg[mdb.VALUE][j] = action
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
var option = can.core.Item(can.Option())
|
||||
if (can.core.List(option).length == 1) {
|
||||
if (msg.IsDetail()) {
|
||||
var key = can.core.List(option)[0], i = msg.key.indexOf(key)
|
||||
if (i > 0) { var k = msg.key[i], v = msg.value[i]; for (i; i > 0; i--) { msg.key[i] = msg.key[i-1], msg.value[i] = msg.value[i-1] } msg.key[0] = k, msg.value[0] = v }
|
||||
} else {
|
||||
var key = can.core.List(option)[0], i = msg.append.indexOf(key)
|
||||
if (i > 0) { var v = msg.append[i]; for (i; i > 0; i--) { msg.append[i] = msg.append[i-1] } msg.append[0] = v }
|
||||
}
|
||||
}
|
||||
var table = can.page.AppendTable(can, msg, target||can.ui.content||can._output, msg.append, cb||function(value, key, index, data, list) { var _value = value
|
||||
if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) {
|
||||
if (key == mdb.VALUE) { key = data.key } data = {}, can.core.List(list, function(item) { data[item.key] = item.value })
|
||||
if (msg.IsDetail()) { if (key == mdb.VALUE) { key = data.key } data = {}
|
||||
can.core.List(list, function(item) { data[item.key] = item.value })
|
||||
if (can.user.isMobile && key == mdb.KEY && !data[value]) { return }
|
||||
if (can.user.isMobile && key != mdb.KEY && !data[key]) { return }
|
||||
}
|
||||
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[ice.POD]||data[web.SPACE])): "<i class='"+value+"'></i>" }
|
||||
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 == 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 == web.SPACE && value) { _value = can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: value}), value) }
|
||||
// if (key == mdb.NAME && value) { _value = can.user.trans(can, value, null, html.INPUT) }
|
||||
if (key == mdb.HASH && can.ConfIndex() == web.TOKEN) { _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)+"****" }
|
||||
if (key == web.TOKEN && value) { _value = value.slice(0, 4)+"****" }
|
||||
if (key == aaa.PASSWORD && value) { _value = "********" }
|
||||
|
||||
function onclick() { return false }
|
||||
if (key == mdb.STATUS && can.base.isIn(value, mdb.DISABLE, ice.FALSE)) { _value = `<i class="${icon.enable}">`
|
||||
function onclick() { run(event, mdb.MODIFY, [mdb.STATUS, mdb.ENABLE]); return true }
|
||||
@ -623,30 +689,31 @@ Volcanos(chat.ONAPPEND, {
|
||||
if (key == mdb.STATUS && can.base.isIn(value, mdb.ENABLE, ice.TRUE)) { _value = `<i class="${icon.disable}">`
|
||||
function onclick() { run(event, mdb.MODIFY, [mdb.STATUS, mdb.DISABLE]); return true }
|
||||
}
|
||||
if (key == mdb.ENABLE) {
|
||||
if (key == mdb.DISABLE) {
|
||||
if (value == ice.TRUE) { _value = `<i class="${icon.disable}">`
|
||||
function onclick() { run(event, mdb.MODIFY, [key, ice.FALSE]); return true }
|
||||
} else { _value = `<i class="${icon.enable}">`
|
||||
function onclick() { run(event, mdb.MODIFY, [key, ice.TRUE]); return true }
|
||||
}
|
||||
}
|
||||
if (key == mdb.DISABLE) {
|
||||
if (key == mdb.ENABLE) {
|
||||
if (value == ice.FALSE) { _value = `<i class="${icon.enable}">`
|
||||
function onclick() { run(event, mdb.MODIFY, [key, ice.TRUE]); return true }
|
||||
} else { _value = `<i class="${icon.disable}">`
|
||||
function onclick() { run(event, mdb.MODIFY, [key, ice.FALSE]); return true }
|
||||
}
|
||||
}
|
||||
if (key == mdb.STATUS && value) { _value = can.user.trans(can, value, "", key) }
|
||||
return {className: option.indexOf(key) > -1? ice.MSG_OPTION: key == ctx.ACTION? ctx.ACTION: "", text: [
|
||||
msg.IsDetail() && key == mdb.KEY? can.user.trans(can, _value, null, html.INPUT): _value, html.TD,
|
||||
msg.IsDetail() && key == mdb.KEY? can.user.trans(can, _value, null, html.INPUT): can.user.trans(can, _value, null, "value."+key), html.TD,
|
||||
], onclick: function(event) { if (onclick()) { return } var target = event.target
|
||||
if (key == cli.QRCODE && can.page.tagis(event.target, html.IMG)) { can.user.opens(event.target.title) }
|
||||
if (can.page.tagis(target, html.INPUT) && target.type == html.BUTTON) { can.requestAction(request(event), target.name)
|
||||
if (can.page.tagis(target, html.INPUT) && target.type == html.BUTTON) { can.requestAction(request(event, {_toast: can.user.trans(can, target.name)}), target.name)
|
||||
meta && meta[target.name]? can.user.input(event, can, meta[target.name], function(args) { run(event, target.name, args) }, data): run(event, target.name)
|
||||
} else {
|
||||
can.sup.onimport.change(event, can.sup, key, value, null, data) || can.sup.onexport.record(can.sup, value, key, data, event)
|
||||
}
|
||||
}, ondblclick: function(event) { if (can.base.isIn(key, mdb.KEY, mdb.HASH, mdb.ID)) { return }
|
||||
}, ondblclick: function(event) { if (can.base.isIn(key, mdb.KEY, mdb.HASH, mdb.ID)) { return } if (can.user.isMobile) { return }
|
||||
var item = can.core.List(can.Conf([ctx.FEATURE, mdb.INSERT]), function(item) { if (item.name == key) { return item } })[0]||{name: key, value: value}
|
||||
item.run = function(event, cmds, cb) { can.run(request(event), cmds, cb, true) }
|
||||
item._enter = function(event, value) { if (event.ctrlKey) { run(event, mdb.MODIFY, [key, value.trimRight()]) } }
|
||||
@ -656,11 +723,15 @@ Volcanos(chat.ONAPPEND, {
|
||||
}, onmouseover: function(event) {
|
||||
can.page.SelectChild(can, can._option, html.DIV_ITEM_TEXT, function(target) { can.page.ClassList.set(can, target, "will", can.page.ClassList.has(can, target, key)) })
|
||||
}, _init: function(target) {
|
||||
if (option.indexOf(key) > -1) { can.onappend.style(can, "k-"+value, target.parentNode) }
|
||||
if (msg.IsDetail() && key != "key") { can.onappend.style(can, key, target.parentNode) }
|
||||
if (option.indexOf(key) > -1) {
|
||||
can.onappend.style(can, "k-"+(value.split(">").pop()), target.parentNode)
|
||||
if (msg.IsDetail()) { can.onappend.style(can, html.OPTION, target.parentNode) }
|
||||
}
|
||||
if (key == mdb.TYPE) { can.onappend.style(can, value, target.parentNode) }
|
||||
if (key == mdb.STATUS) { can.onappend.style(can, value, target.parentNode) }
|
||||
if (key == mdb.ENABLE) { can.onappend.style(can, value == ice.TRUE? mdb.ENABLE: mdb.DISABLE, target.parentNode) }
|
||||
if (key == mdb.DISABLE) { can.onappend.style(can, value == ice.FALSE? mdb.DISABLE: mdb.ENABLE, target.parentNode) }
|
||||
if (key == mdb.ENABLE) { can.onappend.style(can, value == ice.FALSE? mdb.DISABLE: mdb.ENABLE, target.parentNode) }
|
||||
if (key == mdb.DISABLE) { can.onappend.style(can, value == ice.TRUE? mdb.ENABLE: mdb.DISABLE, target.parentNode) }
|
||||
if (key == ctx.ACTION && msg.IsDetail()) { can.onappend.style(can, ctx.ACTION, target.parentNode) }
|
||||
key == ctx.ACTION && can.onappend.mores(can, target, data, msg.IsDetail()? 20: html.TABLE_BUTTON)
|
||||
var list = can.page.Select(can, target, html.INPUT, function(target) { var _icon = (can.page.icons(can, target.name)||{}).icon
|
||||
@ -668,6 +739,7 @@ Volcanos(chat.ONAPPEND, {
|
||||
})
|
||||
can.core.List(list, function(target) { can.onappend.style(can, html.ICONS, target);
|
||||
var _icon = (can.page.icons(can, target.name)||{}).icon; if (target.name == mdb.DELETE) { _icon = icon.trash }
|
||||
target.value = can.user.trans(can, target.name)
|
||||
can.page.insertBefore(can, [{icon: _icon+(" "+(can.page.buttonStyle(can, target.name)||"")), title: can.user.trans(can, target.name), onclick: target.onclick||function(event) {
|
||||
can.onengine.signal(can, "onevent", can.request(event, {_type: html.BUTTON}))
|
||||
can.Update(request(event)._event, [ctx.ACTION, target.name]), can.onkeymap.prevent(event)
|
||||
@ -677,6 +749,7 @@ Volcanos(chat.ONAPPEND, {
|
||||
})
|
||||
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] }))
|
||||
can.onappend.style(can, chat.CONTENT, table), msg.append && msg.append[msg.append.length-1] == ctx.ACTION && can.onappend.style(can, ctx.ACTION, table)
|
||||
if (can.core.List(option).length == 1) { can.onappend.style(can, html.OPTION, table) }
|
||||
if (msg.IsDetail()) { can.onappend.style(can, mdb.DETAIL, table), can.onappend.style(can, msg.Append(mdb.TYPE), table), can.onappend.style(can, msg.Append(mdb.STATUS), table) }
|
||||
can.onappend.style(can, html.FULL, table)
|
||||
return table
|
||||
@ -692,17 +765,24 @@ Volcanos(chat.ONAPPEND, {
|
||||
var height = can.base.Max(720, can.ConfHeight()); can.page.style(can, target, html.HEIGHT, height, html.WIDTH, can.ConfWidth())
|
||||
}) } else if (text.indexOf("<svg") > 0) { can.page.Select(can, code, html.SVG, function(target) {
|
||||
can.page.style(can, target, html.MIN_HEIGHT, can.ConfHeight(), html.MIN_WIDTH, can.ConfWidth())
|
||||
}) } else { can.page.Select(can, code, html.INPUT_BUTTON, function(target) {
|
||||
}) } else {
|
||||
can.page.Select(can, code, html.INPUT_BUTTON, function(target) {
|
||||
target.onclick = function(event) {
|
||||
if (can.page.ClassList.has(can, target, "disable")) { return } can.page.ClassList.add(can, target, "disable")
|
||||
can.misc.Event(event, can, function(msg) { can.Update(can.request(event, can.Option(), {_toast: target.name}), [ctx.ACTION, target.name], function(msg) {
|
||||
can.Update(can.request(event, can.Option(), {_toast: target.name, _cancel: function(event) {
|
||||
can.page.ClassList.del(can, target, "disable")
|
||||
}}), [ctx.ACTION, target.name], function(msg) {
|
||||
can.page.ClassList.del(can, target, "disable")
|
||||
can.page.ClassList.del(can, can._fields, "form")
|
||||
can.page.ClassList.del(can, can._fields, "output")
|
||||
var sup = can._fields? can.sup: can; if (sup.onimport._process(sup, msg)) { return }
|
||||
}) })
|
||||
})
|
||||
}
|
||||
}) } return code.scrollBy && code.scrollBy(0, 10000), code
|
||||
var style = can.page.buttonStyle(can, target.name)
|
||||
can.onappend.style(can, style, target)
|
||||
})
|
||||
can.page.Select(can, code, html.A, function(target) {
|
||||
target.target = "_blank"
|
||||
})
|
||||
} return code.scrollBy && code.scrollBy(0, 10000), code
|
||||
},
|
||||
tools: function(can, msg, cb, target) { can.onimport.tool(can, can.base.Obj(msg.Option(ice.MSG_TOOLKIT))||[], cb, target) },
|
||||
style: function(can, style, target) { if (!style) { return }
|
||||
@ -797,7 +877,7 @@ Volcanos(chat.ONAPPEND, {
|
||||
if (target.innerHTML == "") { return }
|
||||
var h = calc(item, target.offsetHeight, height), w = meta.width||width
|
||||
if (h > _height/2) { h = _height/2, can.page.style(can, target, html.HEIGHT, h) }
|
||||
can.page.style(can, target, html.WIDTH); if (can.page.isDisplay(target)) { height -= h }
|
||||
can.page.style(can, target, html.WIDTH, w); if (can.page.isDisplay(target)) { height -= h }
|
||||
if (can.base.isObject(meta) && meta.layout) { meta.layout(h = _height/list.length, w) }
|
||||
}
|
||||
}), can.core.List(list, function(item) {
|
||||
@ -819,8 +899,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)) {
|
||||
@ -918,7 +998,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: 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}, [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 }
|
||||
@ -930,7 +1010,7 @@ Volcanos(chat.ONAPPEND, {
|
||||
msg.append.length == 1 && can.page.ClassList.add(can, sub._target, chat.SIMPLE)
|
||||
can.page.style(can, sub._target, html.MAX_HEIGHT, can.page.height()/2, html.MIN_WIDTH, target.offsetWidth, html.MAX_WIDTH, can.page.width()/2)
|
||||
can.onlayout.figure({target: target}, can, sub._target, false, 200, function(height, width) {
|
||||
can.page.style(can, sub._output, html.MAX_HEIGHT, height-sub._status.offsetHeight)
|
||||
can.page.style(can, sub._output, html.MAX_HEIGHT, height-sub._status.offsetHeight-sub._action.offsetHeight)
|
||||
sub.Status(html.HEIGHT, parseInt(height-sub._status.offsetHeight)), sub.Status(html.WIDTH, parseInt(width))
|
||||
})
|
||||
}
|
||||
@ -976,6 +1056,7 @@ Volcanos(chat.ONLAYOUT, {
|
||||
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}
|
||||
can.page.tagis(target, "div.input") && can.user.isMobile && (layout.top = 40)
|
||||
can.getActionSize(function(left, top, width, height) {
|
||||
left = left||0, top = top||0, height = can.base.Max(height, can.page.height()-top)-html.ACTION_HEIGHT-(can.isCmdMode()? 0: 20)
|
||||
if (layout.top+target.offsetHeight > top+height) {
|
||||
@ -1039,15 +1120,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
|
||||
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"]; for (var i = 0; i < list.length; i++) {
|
||||
var list = ["fieldset.input.float", "div.input.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 }
|
||||
}
|
||||
},
|
||||
@ -1066,12 +1151,12 @@ Volcanos(chat.ONMOTION, {
|
||||
},
|
||||
select: function(can, target, name, which, cb) { var old = can.page.SelectOne(can, target, name+".select")
|
||||
can.base.isUndefined(which) || can.page.SelectChild(can, target, name, function(target, index) {
|
||||
if (can.page.ClassList.set(can, target, html.SELECT, target == which || index == which)) { can.base.isFunc(cb) && cb(target) }
|
||||
if (can.page.ClassList.set(can, target, html.SELECT, target == which || index == which || decodeURI(target.src) == which)) { can.base.isFunc(cb) && cb(target) }
|
||||
}); return old
|
||||
},
|
||||
modify: function(can, target, cb, item) { var back = target.innerHTML, _target = target
|
||||
if (back.length > 120 || back.indexOf(lex.NL) > -1) { return can.onmotion.modifys(can, target, cb) }
|
||||
var ui = can.page.Appends(can, target, [{type: html.INPUT, value: target.innerText, style: {width: can.base.Max(target.offsetWidth-20, 400)}, onkeydown: function(event) { switch (event.key) {
|
||||
var ui = can.page.Appends(can, target, [{type: html.INPUT, value: target.innerText, style: {width: can.base.Max(target.offsetWidth-20, can.ConfWidth())}, onkeydown: function(event) { switch (event.key) {
|
||||
case code.ENTER: target.innerHTML = event.target.value, event.target.value == back || cb(event, event.target.value.trim(), back); break
|
||||
case code.ESCAPE: target.innerHTML = back; break
|
||||
default: can.onkeymap.input(event, can)
|
||||
@ -1081,7 +1166,7 @@ Volcanos(chat.ONMOTION, {
|
||||
},
|
||||
modifys: function(can, target, cb, item) { var back = target.innerHTML
|
||||
var ui = can.page.Appends(can, target, [{type: html.TEXTAREA, value: target.innerText, style: {
|
||||
height: can.base.Min(target.offsetHeight-20, 60), width: can.base.Max(target.offsetWidth-20, 400),
|
||||
height: can.base.Min(target.offsetHeight-20, 60), width: can.base.Max(target.offsetWidth-20, can.ConfWidth()),
|
||||
}, onkeydown: function(event) { switch (event.key) {
|
||||
case code.ENTER: if (event.ctrlKey) { target.innerHTML = event.target.value, event.target.value == back || cb(event, event.target.value.trim(), back) } break
|
||||
case code.ESCAPE: target.innerHTML = back; break
|
||||
@ -1122,11 +1207,10 @@ Volcanos(chat.ONMOTION, {
|
||||
return can.core.Timer(interval||30, function() { cb(self, last, can._delay_list.meta[key]) })
|
||||
},
|
||||
float: function(can) { var target = can._fields||can._target, sup = can._fields? can.sup: can
|
||||
var margin = (can.getFooterHeight()||html.ACTION_HEIGHT)+(can.user.isMobile? html.ACTION_HEIGHT: 0)+html.PLUGIN_MARGIN
|
||||
var height = can.base.Max(html.FLOAT_HEIGHT, can.page.height()-can.getHeaderHeight()-margin), width = can.base.Max(html.FLOAT_WIDTH, can.page.width()-can.getRiverWidth()-2*html.PLUGIN_MARGIN)
|
||||
var height = can.base.Max(can.Conf("_height")||html.FLOAT_HEIGHT, can.page.height()-can.getHeaderHeight()-can.getFooterHeight()-2*html.PLUGIN_MARGIN), width = can.base.Max(can.Conf("_width")||html.FLOAT_WIDTH, can.page.width()-can.getRiverWidth()-2*html.PLUGIN_MARGIN)
|
||||
sup.onimport.size(sup, height, width, false), can.onappend.style(can, html.FLOAT)
|
||||
can.onmotion.resize(can, target, function(height, width) { sup.onimport.size(sup, height, width, false) }, can.getHeaderHeight(), can.getRiverWidth())
|
||||
var left = can.page.width()-width-html.PLUGIN_MARGIN, top = can.page.height()-height-margin
|
||||
var left = can.page.width()-width-html.PLUGIN_MARGIN, top = can.page.height()-height-can.getFooterHeight()-html.PLUGIN_MARGIN
|
||||
can.page.style(can, target, html.LEFT, left, html.TOP, top)
|
||||
target.onclick = function(event) {
|
||||
can.page.Select(can, document.body, html.FIELDSET_FLOAT, function(_target) {
|
||||
@ -1146,13 +1230,16 @@ Volcanos(chat.ONMOTION, {
|
||||
can.user.toast(can, "filter out "+count+" lines")
|
||||
}, 300)
|
||||
},
|
||||
cacheClear: function(can, key) { delete(can._cache_data[key])
|
||||
can.core.List(arguments, function(target, index) { index > 1 && target && target._cache && delete(target._cache[key]) })
|
||||
cacheClear: function(can, key, target) {
|
||||
if (key) { delete(can._cache_data[key]) } else { delete(can._cache_data) }
|
||||
can.core.List(arguments, function(target, index) { if (index > 1 && target && target._cache) {
|
||||
if (key) { delete(target._cache[key]) } else { delete(target._cache), delete(target._cache_key) }
|
||||
} })
|
||||
},
|
||||
cache: function(can, next) { var list = can.base.getValid(can.base.Obj(can.core.List(arguments).slice(2)), [can._output])
|
||||
var data = can._cache_data = can._cache_data||{}, old = list[0]._cache_key
|
||||
var key = next(function(save) { if (old) { data[old] = save } }, function(hash, load) { var bak = data[hash]; if (bak) { load(bak) } return hash })
|
||||
if (key == old) { return true }
|
||||
if (can.base.isArray(key)) { key = key.join(":") } if (key == old) { return true }
|
||||
can.core.List(list, function(target) { target && target._cache_key && can.page.Cache(target._cache_key, target, target.scrollTop+1) })
|
||||
return key && can.core.List(list, function(target) { if (!target) { return }
|
||||
var pos = can.page.Cache(target._cache_key = key, target); if (pos) { target.scrollTo && target.scrollTo(0, pos-1); return target }
|
||||
@ -1228,6 +1315,91 @@ Volcanos(chat.ONMOTION, {
|
||||
can.page.style(can, target, html.HEIGHT, begin += height/list.length)
|
||||
}, function() { can.page.style(can, target, html.HEIGHT, "") })
|
||||
},
|
||||
slideIn: function(can) { var margin = 100
|
||||
var target = can._target
|
||||
can.page.style(can, target, html.LEFT, margin)
|
||||
can.core.Timer({interval: 10, length: 30}, function(timer, interval, index, list) {
|
||||
can.page.style(can, target, html.LEFT, margin-(index+1)*(margin/list.length))
|
||||
}, function() {
|
||||
can.onmotion.delay(can, function() { can._root.Action.onlayout._init(can) })
|
||||
})
|
||||
},
|
||||
slideOut: function(can, cb) { var margin = 100
|
||||
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) {
|
||||
can.page.style(can, target, html.LEFT, (index+1)*(margin/list.length))
|
||||
}, function() {
|
||||
can.page.Remove(can, target), cb && cb()
|
||||
can.onmotion.delay(can, function() { can._root.Action.onlayout._init(can) })
|
||||
})
|
||||
},
|
||||
slideAction: function(can, target) {
|
||||
var action = can.page.Select(can, target.parentNode, html.DIV_ACTION)[0]
|
||||
if (!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
|
||||
})
|
||||
target.addEventListener("touchmove", function(event) {
|
||||
if (Math.abs(event.touches[0].clientY - beginY) > Math.abs(event.touches[0].clientX - beginX)) { return }
|
||||
var left = event.touches[0].clientX - beginX + beginLeft; target._left = left
|
||||
if (beginLeft == 0 && left > 0) { return }
|
||||
if (left < 0 && left > -max) { can.page.style(can, event.currentTarget, {left: left}) }
|
||||
can.onmotion.select(can, target.parentNode.parentNode, html.DIV_ITEM, target.parentNode)
|
||||
can.onkeymap.prevent(event)
|
||||
})
|
||||
target.addEventListener("touchend", function(event) { var left = target._left
|
||||
var msg = can.request(event)
|
||||
if (event.currentTarget.offsetLeft < 0) {
|
||||
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } msg.Option(ice.MSG_HANDLE, ice.TRUE)
|
||||
|
||||
}
|
||||
if (left < -max/2) {
|
||||
can.page.style(can, event.currentTarget, {left: -max})
|
||||
} else {
|
||||
can.page.style(can, event.currentTarget, {left: 0})
|
||||
}
|
||||
can.page.Select(can, target.parentNode.parentNode, html.DIV_ITEM+">div.output", function(_target) {
|
||||
if (_target != target) { can.page.style(can, _target, {left: 0}), _target._left = 0 }
|
||||
})
|
||||
})
|
||||
},
|
||||
touchAction: function(can, target) { target = target||can.ui.list||can.ui.output||can._output
|
||||
var beginY = 0, beginX = 0, spanY = 0, spanX = 0, data
|
||||
function direction() {
|
||||
if (Math.abs(spanX) > Math.abs(spanY)) {
|
||||
if (Math.abs(spanX) < 100) {
|
||||
return "move"
|
||||
} else if (spanX > 0) {
|
||||
return "right"
|
||||
} else {
|
||||
return "left"
|
||||
}
|
||||
} else {
|
||||
if (Math.abs(spanY) < 150) {
|
||||
return "move"
|
||||
} else if (spanY > 0) {
|
||||
return "down"
|
||||
} else {
|
||||
return "up"
|
||||
}
|
||||
}
|
||||
}
|
||||
target.ontouchstart = function(event) {
|
||||
beginY = event.touches[0].clientY, beginX = event.touches[0].clientX, spanY = 0, spanX = 0
|
||||
}
|
||||
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 (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())
|
||||
}
|
||||
target.ontouchend = function(event) { var msg = can.request(event)
|
||||
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } msg.Option(ice.MSG_HANDLE, ice.TRUE)
|
||||
data && can.onaction["onslide"+direction()](event, can, data, direction(), target)
|
||||
}
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONKEYMAP, {
|
||||
_init: function(can, target) { target = target||document.body, can.onkeymap._build(can)
|
||||
@ -1243,6 +1415,8 @@ Volcanos(chat.ONKEYMAP, {
|
||||
} }), can.onkeymap._engine[mode] = engine
|
||||
}) },
|
||||
_parse: function(event, can, mode, target, list) { mode = mode||mdb.PLUGIN, target = target||can._output; if (!list) { list = target._key_list||[], target._key_list = list }
|
||||
delete(event._msg)
|
||||
var msg = can.request(event)
|
||||
if (event.metaKey && !can.user.isWebview) { return list } if ([code.SHIFT, code.CONTROL, code.META, code.ALT].indexOf(event.key) > -1) { return list }
|
||||
list.push(event.key); for (var pre = 0; pre < list.length; pre++) { if ("0" <= list[pre] && list[pre] <= "9") { continue } break }
|
||||
var count = parseInt(list.slice(0, pre).join(""))||1, map = can.onkeymap._mode[mode]
|
||||
|
375
index.css
@ -1,40 +1,11 @@
|
||||
/* variable */
|
||||
@media (prefers-color-scheme: light) {
|
||||
body { --plugin-bg-color:white; --plugin-fg-color:black; }
|
||||
body {
|
||||
--code-keyword:darkblue; --code-comment:green;
|
||||
--code-function:darkcyan; --code-constant:gray; --code-string:brown;
|
||||
--code-package:blue; --code-datatype:cornflowerblue; --code-object:purple;
|
||||
}
|
||||
}
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body { --plugin-bg-color:black; --plugin-fg-color:silver; }
|
||||
body {
|
||||
--code-keyword:royalblue; --code-comment:green;
|
||||
--code-function:lightgreen; --code-constant:gray; --code-string:orange;
|
||||
--code-package:lightskyblue; --code-datatype:lavender; --code-object:silver;
|
||||
}
|
||||
}
|
||||
body.light {
|
||||
--plugin-bg-color:white; --plugin-fg-color:black;
|
||||
--code-keyword:darkblue; --code-comment:green;
|
||||
--code-function:darkcyan; --code-constant:gray; --code-string:brown;
|
||||
--code-package:blue; --code-datatype:cornflowerblue; --code-object:purple;
|
||||
}
|
||||
body.dark {
|
||||
--shadow-color:gray;
|
||||
--plugin-bg-color:black; --plugin-fg-color:silver;
|
||||
--code-keyword:dodgerblue; --code-comment:green;
|
||||
--code-function:lightgreen; --code-constant:gray; --code-string:orange;
|
||||
--code-package:lightskyblue; --code-datatype:lavender; --code-object:silver;
|
||||
}
|
||||
body {
|
||||
--shadow-color:var(--disable-fg-color); --border-color:var(--disable-fg-color);
|
||||
--notice-color:blue; --danger-color:red;
|
||||
--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-bg-color:var(--notice-color); --notice-fg-color:white;
|
||||
--danger-bg-color:var(--danger-color); --danger-fg-color:var(--notice-fg-color);
|
||||
--disable-fg-color:gray; --progress-bg-color:var(--danger-bg-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);
|
||||
@ -43,7 +14,7 @@ body {
|
||||
body {
|
||||
--body-bg-color:var(--panel-bg-color); --body-fg-color:var(--plugin-fg-color);
|
||||
--legend-bg-color:var(--plugin-bg-color); --legend-fg-color:var(--plugin-fg-color);
|
||||
--input-bg-color:var(--plugin-bg-color); --input-fg-color: var(--output-fg-color);
|
||||
--input-bg-color:var(--output-bg-color); --input-fg-color: var(--output-fg-color);
|
||||
--output-bg-color:var(--plugin-bg-color); --output-fg-color:var(--plugin-fg-color);
|
||||
--th-bg-color:var(--legend-bg-color); --th-fg-color:var(--legend-fg-color);
|
||||
--tr-hover-bg-color:var(--hover-bg-color); --td-hover-bg-color:var(--hover-bg-color);
|
||||
@ -61,6 +32,7 @@ body {
|
||||
--float-box-shadow:var(--box-shadow);
|
||||
--box-border:var(--border-color) solid 1px; --box-notice:var(--notice-bg-color) solid 1px; --box-danger:var(--danger-bg-color) solid 1px;
|
||||
--box-border3:var(--border-color) solid 3px; --box-notice3:var(--notice-bg-color) solid 3px; --box-danger3:var(--danger-bg-color) solid 3px;
|
||||
--item-notice:var(--box-notice);
|
||||
--plugin-border:var(--box-border); --input-border:var(--box-border); --status-border:var(--box-border);
|
||||
--plugin-radius:var(--plugin-padding); --button-radius:var(--input-padding);
|
||||
|
||||
@ -69,12 +41,13 @@ body {
|
||||
--button-padding:var(--plugin-padding); --button-margin:var(--button-padding);
|
||||
--input-padding:5px; --input-margin:var(--input-padding);
|
||||
--table-padding:var(--button-padding);
|
||||
--item-padding:10px; --item-margin:10px;
|
||||
|
||||
--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:360px; --qrcode-height:363px;
|
||||
--story-height:var(--float-height); --iframe-height:420px;
|
||||
--card-width:300px; --card-height:160px; --qrcode-width:320px; --qrcode-height:323px;
|
||||
--story-height:var(--float-height); --iframe-height:480px;
|
||||
--plug-height:480px; --plug-width:var(--float-width);
|
||||
--desktop-height:684px; --desktop-width:var(--float-width);
|
||||
--desktop-menu-height:25px; --desktop-width:var(--float-width);
|
||||
@ -89,6 +62,24 @@ body {
|
||||
--code-font-size:14px; --code-line-height:20px; --code-tabs-height:43px;
|
||||
--icon-font-size:var(--legend-font-size); --svg-font-size:24px; --svg-stroke-width:1;
|
||||
}
|
||||
@media (prefers-color-scheme: light) {
|
||||
body { --plugin-bg-color:white; --plugin-fg-color:black; }
|
||||
body {
|
||||
--code-keyword:darkblue; --code-comment:green;
|
||||
--code-function:darkcyan; --code-constant:gray; --code-string:brown;
|
||||
--code-package:blue; --code-datatype:cornflowerblue; --code-object:purple;
|
||||
|
||||
}
|
||||
}
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body { --plugin-bg-color:black; --plugin-fg-color:silver; }
|
||||
body {
|
||||
--code-keyword:royalblue; --code-comment:green;
|
||||
--code-function:lightgreen; --code-constant:gray; --code-string:orange;
|
||||
--code-package:lightskyblue; --code-datatype:lavender; --code-object:silver;
|
||||
}
|
||||
}
|
||||
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;
|
||||
@ -109,7 +100,9 @@ body.width1 { /* 320-640 手机竖屏 */
|
||||
--table-button:2; --card-button:3;
|
||||
}
|
||||
body.en { --card-button:3; }
|
||||
body.mobile { --footer-height:60px; --svg-font-size:13px; }
|
||||
body.mobile { --project-width:240px; --footer-height:60px; --svg-font-size:13px; --qrcode-width:320px; }
|
||||
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; }
|
||||
/* element */
|
||||
* { box-sizing:border-box; padding:0; border:0; margin:0; tab-size:4; }
|
||||
@ -127,10 +120,12 @@ table.content th.select[data-asc="0"] i.bi-sort-up { display:none; }
|
||||
table.content th.select[data-asc="1"] i.bi-sort-down-alt { display:none; }
|
||||
table.content td.option { cursor:pointer; }
|
||||
table.content td { padding:var(--table-padding); }
|
||||
fieldset.log.debug table.content td:last-child { white-space:pre; max-width:800px; min-width:600px; }
|
||||
table.content td i { padding:var(--input-padding); }
|
||||
table.content:not(.detail) td img { height:48px; width:auto; }
|
||||
table.content:not(.detail) td input.icons { display:none; }
|
||||
table.content.checkbox th:first-child { text-align:center; padding:var(--table-padding); position:sticky; left:2px; }
|
||||
table.content.checkbox td:first-child { text-align:center; padding:var(--table-padding); position:sticky; left:2px; }
|
||||
table.content.checkbox th:first-child { text-align:center; padding:var(--table-padding); position:sticky; left:2px; width:20px; }
|
||||
table.content.checkbox td:first-child { text-align:center; padding:var(--table-padding); position:sticky; left:2px; width:20px; }
|
||||
table.content.action th:last-child { text-align:center; padding:var(--table-padding); position:sticky; right:2px; }
|
||||
table.content.action td:last-child { text-align:center; padding:var(--table-padding); position:sticky; right:2px; }
|
||||
table.content.action td:last-child i { color:var(--notice-bg-color); }
|
||||
@ -141,18 +136,30 @@ table.content.action td:last-child input.danger { border:none; color:var(--dange
|
||||
table.content.action td:last-child input.danger:hover { background-color:var(--hover-bg-color); color:var(--danger-bg-color); }
|
||||
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 { background-color:var(--plugin-bg-color); position:sticky; left:0; }
|
||||
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 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; }
|
||||
table.content.detail tr td:first-child { background-color:var(--plugin-bg-color); cursor:default; }
|
||||
body:not(.mobile) table.content.detail tr:hover:not(.action) td:first-child { background-color:var(--hover-bg-color); }
|
||||
table.content.detail td i { display:none; }
|
||||
table.content.detail td { white-space:break-spaces; }
|
||||
table.content.detail tr.action { background-color:var(--plugin-bg-color); position:sticky; bottom:0; }
|
||||
table.content.detail tr.action input.icons { display:none; }
|
||||
table.content.detail tr.action input { color:var(--notice-bg-color); }
|
||||
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.mobile table.content.checkbox th:first-child { padding:var(--table-padding) var(--input-padding); }
|
||||
body.mobile table.content.checkbox td:first-child { padding:var(--table-padding) var(--input-padding); }
|
||||
body.mobile table.content.action th:last-child { padding:var(--table-padding) var(--input-padding); }
|
||||
body.mobile table.content.action td:last-child { padding:var(--table-padding) var(--input-padding); }
|
||||
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; }
|
||||
body.width1 table.content.checkbox th:first-child { padding:var(--table-padding) var(--input-padding); }
|
||||
body.width1 table.content.checkbox td:first-child { padding:var(--table-padding) var(--input-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: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; }
|
||||
@ -171,13 +178,39 @@ div.title>div.status>div.item.access { background-color:var(--danger-bg-color);
|
||||
div.title>div.status>div.item>i { margin-right:var(--input-margin); }
|
||||
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 { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); }
|
||||
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; overflow:hidden; }
|
||||
div.output.card>div.item>div.title>div.title>span { padding:var(--input-padding); }
|
||||
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>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.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.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; }
|
||||
div.item.card div.status { font-size:12px; color:gray; }
|
||||
div.item.card div.status span { margin-right:5px; }
|
||||
div.item.card div.action { max-width:100%; display:flex; align-items:center; }
|
||||
div.item.card div.action { position:absolute; right:0; }
|
||||
div.item.card div.title div.action { top:0; }
|
||||
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); }
|
||||
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); }
|
||||
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; }
|
||||
div.item img[src*=".jpg"] { padding:3px; }
|
||||
table.content tr>td img[src*=".jpg"] { padding:5px; }
|
||||
@ -194,11 +227,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; }
|
||||
@ -207,6 +241,7 @@ fieldset.studio>div.output>div.layout>div.layout>div.content>fieldset.story>form
|
||||
fieldset.studio>div.output>div.layout>div.layout>div.content>fieldset.story>div.action>div.item.state.button.full.icons { display:none; }
|
||||
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:hover { border-right:var(--box-notice); }
|
||||
@ -218,11 +253,11 @@ div.project div.list { margin-left:var(--button-margin); clear:both; }
|
||||
div.project div.list { border-left:var(--disable-fg-color) dashed 1px; }
|
||||
div.project div.list fieldset { position:static; }
|
||||
div.project div.item { position:relative; }
|
||||
div.project div.item.select { border-right:var(--box-notice); }
|
||||
div.project div.item.select { border-right:var(--item-notice); }
|
||||
div.project>div.item.select { position:sticky; top:32px; bottom:0; }
|
||||
div.project div.item:not(.hide) { white-space:pre; line-height:24px; cursor:pointer; padding:0 var(--input-padding); display:flex; align-items:center; }
|
||||
div.project div.item:not(.hide)>i:first-child { margin-right:var(--input-margin); }
|
||||
div.project div.item:not(:hover) input:not([type=button]) { border-right:0; }
|
||||
div.project>div.item:not(:hover) input:not([type=button]) { border-right:0; }
|
||||
div.project>div.item:not(:hover) input:not([type=button]) { border-left:0; }
|
||||
div.project>div.zone>div.action div.item:not(:hover) input:not([type=button]) { border-left:0; }
|
||||
div.project div.item.filter { background-color:var(--plugin-bg-color); padding:0; width:100%; position:sticky; top:0; z-index:1; }
|
||||
@ -230,14 +265,15 @@ div.project div.item.filter>input { padding:0 25px; width:100% !important; }
|
||||
div.project div.item.search { padding:0; width:100%; }
|
||||
div.project div.item.search>input { padding:0 25px; width:100%; }
|
||||
div.project div.item img { height:var(--action-height); width:var(--action-height); }
|
||||
div.project div.item img { margin:0; }
|
||||
div.project div.item img { margin:0; flex-shrink:0; }
|
||||
div.project div.item>div.name { padding:0 var(--input-padding); }
|
||||
div.project div.item>div.icon { position:absolute; right:var(--input-padding); }
|
||||
div.project div.item>div.icon:hover { background-color:var(--hover-bg-color); }
|
||||
div.project div.item:not(:hover)>div.icon { display:none; }
|
||||
div.project div.item>i:last-child { position:absolute; right:var(--input-padding); }
|
||||
div.project div.item>i:last-child:hover { background-color:var(--hover-bg-color); }
|
||||
div.project div.item:not(:hover)>i:last-child { display:none; }
|
||||
div.project div.item:not(.button)>i:last-child { position:absolute; right:var(--input-padding); }
|
||||
div.project div.item:not(.button)>i:hover { background-color:var(--hover-bg-color); }
|
||||
div.project div.item:not(.button):not(.select)>i:last-child { display:none; }
|
||||
body.mobile div.project div.item>i:last-child { display:none; }
|
||||
div.project div.zone>div.item { text-align:center; padding:var(--input-padding); display:flex; align-items:center; }
|
||||
div.project div.zone>div.item span:hover { background-color:var(--hover-bg-color); }
|
||||
div.project>div.zone>div.item span:first-child { font-style:italic; font-weight:bold; line-height:var(--action-height); }
|
||||
@ -290,9 +326,12 @@ fieldset>div.action>div.item { margin-right:var(--input-margin); }
|
||||
fieldset.input>legend { display:none; }
|
||||
fieldset.input.icons table { width:100%; text-align:center; }
|
||||
fieldset.input.key div.action { display:none; }
|
||||
fieldset.input.key div.action div.item.state { display:none; }
|
||||
fieldset.input.key div.output table.content { font-family:var(--code-font-family); width:100%; }
|
||||
fieldset.input.key div.output table.content td:first-child { cursor:pointer; }
|
||||
fieldset.input.key div.output table.content td:not(:first-child) { background-color:unset !important; color:var(--disable-fg-color); cursor:default; }
|
||||
fieldset.input.key div.output { padding:0 !important; }
|
||||
fieldset.input.key div.output table.content td:first-child { padding-left:24px; cursor:pointer; }
|
||||
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[src*=".jpg"] { padding:5px; }
|
||||
@ -310,6 +349,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 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); }
|
||||
@ -317,8 +357,10 @@ fieldset.input.date>div.output td span.lunar { font-size:8px; display:block; cle
|
||||
fieldset.input.date>div.output td span.lunar.term { color:green; }
|
||||
fieldset.input.date>div.output td span.lunar.fest { color:red; }
|
||||
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%; }
|
||||
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); }
|
||||
@ -327,7 +369,7 @@ fieldset.input.float.file table.content td { padding-left:22px; }
|
||||
body div.float { padding:var(--plugin-padding); }
|
||||
fieldset.Action>div.toast { height:fit-content; width:fit-content; overflow:auto; position:absolute; right:var(--plugin-margin); bottom:calc(var(--footer-height) + var(--action-height) + var(--plugin-margin)); }
|
||||
fieldset.Action>div.toast>div.toast { background-color:var(--plugin-bg-color); border:var(--plugin-border); margin:var(--plugin-margin); position:static; transition:all 1s; }
|
||||
body.mobile fieldset.Action>div.toast { bottom:calc(var(--footer-height) + var(--action-height)); }
|
||||
body.mobile fieldset.Action>div.toast { top:50%; }
|
||||
body.mobile fieldset.Action>div.toast>div.toast { margin-bottom:10px; }
|
||||
div.toast.float>div.title { color:var(--notice-bg-color); font-style:italic; white-space:pre; padding:0 var(--input-padding); max-width:300px; overflow:auto; float:left; cursor:copy; }
|
||||
div.toast.float>div.close { color:var(--notice-bg-color); float:right; cursor:pointer; margin-top:-3px; }
|
||||
@ -346,58 +388,62 @@ 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); }
|
||||
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); }
|
||||
body>div.carte div.item { white-space:pre; padding:var(--button-padding); display:flex; align-items:center; }
|
||||
body>div.carte div.item:not(.hide) { white-space:pre; padding:var(--button-padding); display:flex; align-items:center; }
|
||||
body>div.carte div.item i:first-child { margin-right:var(--button-margin); }
|
||||
body>div.carte div.item span.icon.next { line-height:22px; height:22px; float:right; }
|
||||
body>div.carte div.item span.name { flex-grow:1; }
|
||||
body>div.carte.select.float>div.item { text-align:center; }
|
||||
body>div.carte.header.avatar img { width:370px; }
|
||||
body>div.input.process input { background-color:var(--disable-bg-color) !important; color:var(--disable-fg-color); border:var(--box-border) !important; }
|
||||
body>div.input.process input:hover { background-color:var(--disable-bg-color) !important; color:var(--disable-fg-color); border:var(--box-border) !important; }
|
||||
body>div.input { padding:var(--plugin-padding); }
|
||||
body>div.input { padding:var(--plugin-padding); }
|
||||
body>div.input>legend { background-color:var(--input-bg-color); float:right; padding:0; }
|
||||
body>div.input tr { margin:var(--button-margin); }
|
||||
body>div.input td { padding:var(--table-padding); }
|
||||
body>div.input td:nth-child(2) { padding:var(--table-padding) 0; }
|
||||
body.mobile>div.input tr { display:flex; flex-direction:column; margin:var(--button-margin); }
|
||||
body.mobile>div.input td { padding:0 var(--button-padding); margin:var(--button-margin); }
|
||||
body.mobile>div.input td:nth-child(1) { color:var(--disable-fg-color); font-size:var(--status-font-size); padding-left:var(--button-padding); margin-bottom:0; }
|
||||
body.mobile>div.input td:nth-child(2) { display:none; }
|
||||
body>div.input tr.img td:last-child>span { display:none; }
|
||||
body>div.input tr.img td:last-child>div.item { width:var(--river-width); flex-wrap:wrap; }
|
||||
body>div.input tr.img td:last-child>div.item>div { background-color:gray; margin:var(--input-margin); }
|
||||
body>div.input tr.img td:last-child>div>span { font-size:var(--action-height); }
|
||||
body>div.input tr.img td:last-child>div>span.icon { display:none; }
|
||||
body>div.input tr.icon td:last-child { position:relative; }
|
||||
body>div.input tr.icon td:last-child img:first-child { height:28px; width:28px; position:absolute; left:12px; top:12px; }
|
||||
body>div.input tr.icon td:last-child input { padding-left:var(--action-height); }
|
||||
body>div.input tr.icons td:last-child img { height:28px; width:28px; position:absolute; left:2px; top:2px; }
|
||||
body>div.input tr.icons td:last-child span:not(.icon) { font-family:var(--code-font-family); position:absolute; left:33px; }
|
||||
body>div.input tr.icons td:last-child input { padding-left:var(--action-height); }
|
||||
body>div.input td span.icon { margin-left:-20px; visibility:hidden; }
|
||||
body>div.input td span.icons { margin-left:-20px; visibility:hidden; }
|
||||
body>div.input td label { font-family:var(--code-font-family); }
|
||||
body>div.input td:hover span.icon { visibility:visible; }
|
||||
body>div.input td:hover span.icons { visibility:visible; }
|
||||
body>div.input textarea { height:var(--textarea-height); width:var(--form-width) !important; }
|
||||
body>div.input select { width:var(--form-width) !important; }
|
||||
body>div.input input.select[type=button] { width:var(--form-width) !important; }
|
||||
body>div.input input:not([type=button]) { width:var(--form-width) !important; padding-left:24px; }
|
||||
body>div.input input[type=text] { width:var(--form-width) !important; padding-left:24px; }
|
||||
body>div.input input[name=cancel] { border:var(--box-danger); }
|
||||
body>div.input input[name=submit] { border:var(--box-notice); }
|
||||
body>div.input input[name=submit]:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
|
||||
body>div.input input[name=cancel]:hover { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
|
||||
body>div.input div.action { padding:var(--table-padding); width:100%; position:sticky; bottom:0; flex-direction:row-reverse; cursor:move; }
|
||||
body>div.input div.action>div.item { margin-left:var(--button-margin); float:right; }
|
||||
body>div.input div.action>div.item>input[type=button] { width:112px; }
|
||||
body div.input.float.process input { background-color:var(--disable-bg-color) !important; color:var(--disable-fg-color) !important; border:var(--box-border) !important; }
|
||||
body div.input.float.process input:hover { background-color:var(--disable-bg-color) !important; color:var(--disable-fg-color) !important; border:var(--box-border) !important; }
|
||||
body div.input.float { padding:var(--plugin-padding); }
|
||||
body div.input.float { padding:var(--plugin-padding); }
|
||||
body div.input.float>legend { background-color:var(--input-bg-color); float:right; padding:0; }
|
||||
body div.input.float tr { margin:var(--button-margin); }
|
||||
body div.input.float td { padding:var(--table-padding); }
|
||||
body div.input.float td span.must { color:red; padding:0 5px; }
|
||||
body div.input.float td:nth-child(2) { padding:var(--table-padding) 0; }
|
||||
body.width1 div.input.float table { width:100%; }
|
||||
body.width1 div.input.float tr:not(.hide) { display:flex; flex-direction:column; margin:var(--button-margin); }
|
||||
body.width1 div.input.float td { padding:0; margin:var(--button-margin); }
|
||||
body.widht1 div.input.float td:nth-child(1) { color:gray; font-size:var(--status-font-size); padding-left:var(--button-padding); margin-bottom:0; }
|
||||
body.width1 div.input.float td:nth-child(2) { display:none; }
|
||||
body div.input.float tr.img td:last-child>span { display:none; }
|
||||
body div.input.float tr.img td:last-child>div.item { width:var(--river-width); flex-wrap:wrap; }
|
||||
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.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 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); }
|
||||
body div.input.float tr.icons td:last-child input { padding-left:var(--action-height); }
|
||||
body div.input.float td span.icon { margin-left:-20px; visibility:hidden; }
|
||||
body div.input.float td span.icons { margin-left:-20px; visibility:hidden; }
|
||||
body div.input.float td label { font-family:var(--code-font-family); }
|
||||
body div.input.float td:hover span.icon { visibility:visible; }
|
||||
body div.input.float td:hover span.icons { visibility:visible; }
|
||||
body:not(.width1)>div.input.float textarea { height:var(--textarea-height); width:var(--form-width) !important; }
|
||||
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 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.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; }
|
||||
body>div.input.login>div.output { text-align:center; min-height:var(--qrcode-height); min-width:var(--iframe-height); overflow:hidden; clear:both; }
|
||||
body:not(.mobile)>div.input.login>div.output { text-align:center; min-height:var(--qrcode-height); min-width:var(--iframe-height); overflow:hidden; clear:both; }
|
||||
body>div.input.login>div.output>fieldset { box-shadow:unset; }
|
||||
body>div.input.login>div.output>fieldset>div.output { background-color:transparent; }
|
||||
body>div.input.login>div.display { padding-top:var(--button-padding); width:100%; flex-direction:column; }
|
||||
@ -405,6 +451,7 @@ body>div.input.login>div.display>label { color:var(--disable-fg-color); font-sty
|
||||
body>div.input.login>div.display>span.item { font-style:italic; word-break:break-all; border-left:var(--box-notice3); padding-left:var(--button-padding); margin:var(--button-margin) 0; }
|
||||
body>div.input.login>div.display div.sso { cursor:pointer; }
|
||||
body>div.input.login>div.display div.sso div.item { padding:var(--input-padding); }
|
||||
body.mobile>div.input.login>div.display div.sso div.item.relay { display:none; }
|
||||
body>div.input.login>div.display div.sso div.item:hover { background-color:var(--hover-bg-color); }
|
||||
body>div.input.login>div.display div.sso div.item>img { height:var(--action-height); width:var(--action-height); }
|
||||
body>div.input.login>div.display div.sso div.item>span { line-height:var(--action-height); padding:var(--input-padding); }
|
||||
@ -416,20 +463,20 @@ body>div.upload div.output div.progress { background-color:var(--progress-bg-col
|
||||
body>div.upload div.status div.cost { float:left; }
|
||||
body>div.upload div.status div.show { float:right; }
|
||||
body>div.upload div.status div.size { text-align:center; }
|
||||
body.width1>div.input { margin:10px; width:calc(100% - 20px); left:0 !important; }
|
||||
body.width1>div.input table { width:100%; }
|
||||
body.width1>div.input td { padding:0; }
|
||||
body.width1 div.input.float table input[type=text] { width:100% !important; }
|
||||
/* display */
|
||||
fieldset:not(.Action) { position:relative; }
|
||||
fieldset>form.option:not(.hide), fieldset>div.action:not(.hide):not(.flex) { display:contents; } .hide, .hidden { display:none; }
|
||||
body:not(.mobile) fieldset:not(.Action):not(.output):not(.cmd)>div.action:not(.hide):not(.flex) {
|
||||
display:flex;
|
||||
// align-items:flex-end;
|
||||
overflow:hidden;
|
||||
}
|
||||
fieldset>form.option:not(.hide) { float:left; display:contents; }
|
||||
fieldset>div.action:not(.hide):not(.flex) { display:contents; } .hide, .hidden { display:none; }
|
||||
body:not(.mobile) fieldset:not(.Action):not(.output):not(.cmd)>div.action:not(.hide):not(.flex) { display:flex; overflow:hidden; }
|
||||
fieldset.panel>legend, fieldset.panel>div.status { display:none; }
|
||||
fieldset.output>legend, fieldset.output>form.option, fieldset.output>div.action:not(.flex), fieldset.output>div.status, fieldset.output>div.item { display:none; }
|
||||
div.action, div.output, div.status, div.project, div.content, div.profile, div.display, table.content, table.content td, div.list, div.code, div.story, div.float, fieldset.float { overflow:auto; }
|
||||
legend, form.option>div.item:not(.hide), div.action>div.item, div.action>div.tabs, fieldset>div.status>div.item { float:left; display:flex; align-items:center; }
|
||||
fieldset.story, fieldset>div.output, fieldset>div.status, div.output>div.project div.item, div.content:not(.item), div.code, div.story[data-type=spark] { clear:both; }
|
||||
fieldset.story { position:sticky; left:0; }
|
||||
fieldset.auto, fieldset.full, fieldset.float { position:fixed; }
|
||||
fieldset.full { position:fixed; left:0; top:0; }
|
||||
fieldset.plug { position:absolute; bottom:calc(var(--action-height) + var(--plugin-padding)); right:var(--plugin-padding); }
|
||||
@ -441,9 +488,9 @@ fieldset.vimer>div.output div.project fieldset.plug:not(.hide) { position:static
|
||||
fieldset.vimer>div.output div.project fieldset.plug>div.output { height:100%; }
|
||||
fieldset.vimer>div.output div.project fieldset.plug div.output.card>div.item { min-width:120px; width:calc(100% - 2*var(--input-margin)); }
|
||||
div.float { position:fixed; }
|
||||
div.output { position:relative; } div.content { position:relative; }
|
||||
div.output { position:relative; }
|
||||
div.output>div.code { position:sticky; left:0; }
|
||||
div.output>div.code>img { margin:5px; }
|
||||
div.output>div.code>img { margin:5px; 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; }
|
||||
@ -463,31 +510,31 @@ textarea:hover { border:var(--box-notice); } textarea:focus { border:var(--box-n
|
||||
select { border-radius:var(--button-radius); }
|
||||
input { background-color:var(--input-bg-color); color:var(--input-fg-color); }
|
||||
input:not([type=button]) { border:var(--input-border); }
|
||||
input:not([type=button]):hover { border:var(--box-notice); }
|
||||
body:not(.mobile) input:not([type=button]):hover { border:var(--box-notice); }
|
||||
input:not([type=button]):focus { border:var(--box-notice); }
|
||||
input.disable { color:var(--disable-fg-color) !important; border:unset !important; }
|
||||
input.disable { border:var(--box-border) !important; background-color:var(--disable-bg-color) !important; color:var(--disable-fg-color) !important; }
|
||||
input.select[type=button]:hover { border:var(--box-notice); }
|
||||
input.select[type=button]:focus { border:var(--box-notice); }
|
||||
input.select[type=button] { border:var(--input-border); padding:0 var(--button-padding); }
|
||||
input[type=button] { border:var(--input-border); border-radius:var(--button-radius); }
|
||||
input[type=button]:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
|
||||
input[type=button].danger:hover { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
|
||||
body:not(.mobile) input[type=button]:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
|
||||
input[type=button].danger:hover { color:var(--danger-fg-color); }
|
||||
input[type=button].notice:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
|
||||
input[type=button].danger { border:var(--box-danger); }
|
||||
input[type=button].notice { border:var(--box-notice); }
|
||||
table.content tr:hover { background-color:var(--tr-hover-bg-color); }
|
||||
input[type=button].notice { border:var(--box-notice); color:var(--notice-bg-color); }
|
||||
input[type=button].danger { border:var(--box-danger); color:var(--danger-bg-color); }
|
||||
body:not(.mobile) table.content tr:hover { background-color:var(--tr-hover-bg-color); }
|
||||
table.content tr.select { background-color:var(--tr-hover-bg-color); }
|
||||
table.content tr.danger { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
|
||||
table.content tr.notice { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
|
||||
table.content tr.disable { color:var(--disable-fg-color); }
|
||||
table.content tr.offline { color:var(--disable-fg-color); }
|
||||
table.content tr.invalid { color:var(--disable-fg-color); }
|
||||
table.content tr.expired { color:var(--disable-fg-color); }
|
||||
table.content th { background-color:var(--th-bg-color); color:var(--th-fg-color); }
|
||||
table.content td:hover { background-color:var(--td-hover-bg-color); color:var(--hover-fg-color); }
|
||||
body:not(.mobile) table.content tr:not(.action) td:hover { background-color:var(--td-hover-bg-color); color:var(--hover-fg-color); }
|
||||
table.content td.select { background-color:var(--td-hover-bg-color); color:var(--hover-fg-color); }
|
||||
table.content td i:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
|
||||
table.content td.action { background-color:var(--th-bg-color); color:var(--th-fg-color); }
|
||||
table.content.checkbox td:first-child { background-color:var(--th-bg-color); }
|
||||
table.content:hover td.option:not(:hover) { background-color:var(--tr-hover-bg-color); color:var(--hover-fg-color); }
|
||||
body:not(.mobile) table.content:not(.option):hover td.option:not(:hover) { background-color:var(--tr-hover-bg-color); color:var(--hover-fg-color); }
|
||||
hr, td.hr { border-bottom:var(--box-border); margin:var(--input-margin); }
|
||||
h1:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
|
||||
h2:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
|
||||
@ -498,13 +545,13 @@ 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); }
|
||||
div.item:not(.text):hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
|
||||
div.item.select:not(.button) { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
|
||||
div.item.button.danger input:hover[type=button] { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
|
||||
div.item.button.notice input:hover[type=button] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
|
||||
div.item.button.danger input { border:var(--box-danger); }
|
||||
div.item.button.notice input { border:var(--box-notice); }
|
||||
div.action div.tabs.select { background-color:var(--output-bg-color); border-top:var(--box-notice); }
|
||||
body:not(.mobile):not(.pad) div.item:not(.text):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); }
|
||||
div.item.button.danger input { border:var(--box-danger); color:var(--danger-bg-color); }
|
||||
div.item.button.notice input { border:var(--box-notice); color:var(--notice-bg-color); }
|
||||
div.action div.tabs.select { background-color:var(--output-bg-color); border-top:var(--item-notice); }
|
||||
fieldset.vimer>div.action div.tabs.select { border-top:var(--box-border3); }
|
||||
fieldset.vimer.normal>div.action div.tabs.select { border-top:var(--box-notice3); }
|
||||
fieldset.vimer.insert>div.action div.tabs.select { border-top:var(--box-danger3); }
|
||||
@ -545,13 +592,16 @@ 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); }
|
||||
fieldset.input>span.close { padding:var(--input-padding); position:absolute; top:0; right:0; line-height:16px; }
|
||||
fieldset.input table.checkbox.content td:first-child { box-shadow:none; }
|
||||
fieldset.input table.checkbox.content th.select { border:none; }
|
||||
fieldset.input>span.close { line-height:16px; padding:var(--input-padding); position:absolute; top:0; right:0; z-index:5; }
|
||||
fieldset.input>span.close:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); cursor:pointer; }
|
||||
div.float { background-color:var(--float-bg-color); }
|
||||
div.carte div.item:hover { background-color:var(--hover-bg-color); }
|
||||
div.carte div.item.notice:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
|
||||
div.carte div.item.danger:hover { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
|
||||
div.carte div.item.notice:hover { background-color:var(--notice-bg-color) !important; color:var(--notice-fg-color) !important; }
|
||||
div.carte div.item.danger:hover { background-color:var(--danger-bg-color) !important; color:var(--danger-fg-color) !important; }
|
||||
/* z-index */
|
||||
table.content.action th:last-child { z-index:2; }
|
||||
table.content.action td:last-child { z-index:1; }
|
||||
table.content.checkbox td:first-child { z-index:1; }
|
||||
table.content.checkbox th:first-child { z-index:2; }
|
||||
@ -571,10 +621,12 @@ 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); }
|
||||
fieldset.float { box-shadow:var(--float-box-shadow); border:var(--plugin-border); border-radius:var(--plugin-radius); }
|
||||
fieldset:not(.panel):hover { box-shadow:var(--notice-box-shadow); }
|
||||
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); }
|
||||
body.light fieldset.story>legend { box-shadow:var(--legend-box-shadow); margin-right:var(--legend-margin); }
|
||||
body.light fieldset.vimer fieldset.story>legend { margin-right:var(--input-margin); padding:0 var(--input-padding); }
|
||||
fieldset.story>legend { border-top-left-radius:var(--plugin-radius); }
|
||||
fieldset.story.float>legend { padding:0 10px; }
|
||||
fieldset>form.option div.item:not(.icon) { box-shadow:var(--input-box-shadow); }
|
||||
fieldset>form.option div.item.select { border-radius:var(--button-radius); }
|
||||
fieldset>form.option div.item.button { border-radius:var(--button-radius); }
|
||||
@ -582,6 +634,7 @@ fieldset>div.action div.item.button { border-radius:var(--button-radius); }
|
||||
fieldset.input.date.float>div.action div.item.button:last-child { margin-right:0; }
|
||||
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:hover { box-shadow:var(--notice-box-shadow); }
|
||||
@ -592,10 +645,11 @@ 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.select { border:var(--box-notice); }
|
||||
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); }
|
||||
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); }
|
||||
@ -609,7 +663,6 @@ body { font-family:var(--body-font-family); }
|
||||
legend { font-family:var(--legend-font-family); font-style:italic; }
|
||||
input { font-family:var(--input-font-family); }
|
||||
kbd { font-family:var(--code-font-family); line-height:var(--code-line-height); }
|
||||
kbd:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
|
||||
table.content { font-family:var(--table-font-family); }
|
||||
table.content th { font-family:var(--input-font-family); font-style:italic; }
|
||||
body div.output>div.code { font-family:var(--table-font-family); padding:var(--table-padding); }
|
||||
@ -623,18 +676,21 @@ legend>img { margin-right:var(--input-margin); height:28px; display:block; float
|
||||
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); }
|
||||
input[type=checkbox] { height:16px; width:16px; }
|
||||
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 { min-width:80px; }
|
||||
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; }
|
||||
fieldset.web.chat.island.portal>div.output>table.content.detail td { min-width:80px; text-align:center; }
|
||||
body.void fieldset.web.chat.island.portal>div.status { display:none; }
|
||||
table.content, div.code, div.story[data-type=spark] { white-space:pre; margin:0; }
|
||||
div.output>div.code video { max-width:100%; }
|
||||
div.story[data-type=spark] { border-left:var(--box-notice3); padding:var(--input-padding) var(--table-padding); }
|
||||
fieldset.inner.result>div.output { border-left:var(--box-danger3); }
|
||||
iframe { height:var(--iframe-height); width:100%; }
|
||||
fieldset>form.option>div.item.text.cmd { width:100%; }
|
||||
fieldset>form.option>div.item.text.cmd>input { width:100%; }
|
||||
@ -678,7 +734,7 @@ body.windows form.option>div.item.icon.refresh { font-size:24px; line-height:28p
|
||||
body.windows form.option>div.item.icon.goback { font-size:24px; line-height:28px; }
|
||||
body.windows div.item.button.refresh>span.icon { font-size:22px; line-height:28px; }
|
||||
body.windows div.item.button.create>span.icon { line-height:28px; }
|
||||
div.item.text { position:relative; display:flex; align-items:center; }
|
||||
div.item.text { position:relative; align-items:center; }
|
||||
div.item.text.filter input { padding-left:24px; }
|
||||
div.item.text._icon input { padding-left:24px; }
|
||||
div.item.select._icon i:first-child { color:var(--disable-fg-color); position:absolute; left:0; padding:var(--input-padding); }
|
||||
@ -688,17 +744,20 @@ div.item.text.id>input { width:80px; }
|
||||
div.item.text.url>input { width:var(--river-width); }
|
||||
div.item.text.port>input { width:80px; }
|
||||
div.item.text.line>input { width:80px; }
|
||||
fieldset.plugin>form.option>div.item.text.path>input { width:var(--project-width); }
|
||||
body:not(.mobile) div.item.text.hash>input { width:320px; }
|
||||
div.item.text.limit>input { width:var(--button-width); }
|
||||
div.item.text.offend>input { width:var(--button-width); }
|
||||
body:not(.width2):not(.mobile) fieldset.plugin.vimer>form.option>div.item.text.path>input { width:var(--input-width); }
|
||||
body:not(.width2):not(.mobile) fieldset.plugin.vimer>form.option>div.item.text.file>input { width:var(--project-width); }
|
||||
body:not(.width2):not(.mobile) fieldset.plugin>form.option>div.item.text.path>input { width:var(--project-width); }
|
||||
body:not(.width2):not(.mobile) fieldset.plugin.feel>form.option>div.item.text.file>input { width:var(--project-width); }
|
||||
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:hover>i:first-child { color:unset; }
|
||||
div.item.text>i:first-child { color:var(--disable-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; }
|
||||
div.item.text:hover>span.icon { visibility:visible; }
|
||||
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); }
|
||||
div.item.button.icons>i { font-size:20px; padding:var(--input-padding); }
|
||||
@ -763,7 +822,6 @@ fieldset.story.float:not(.plug)>form.option>div.text:not(.filter)>input { displa
|
||||
fieldset.story.float:not(.plug)>form.option>div.text.filter>span.value { display:none; }
|
||||
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; }
|
||||
// fieldset.float>div.action>div.item.button._space.icons { margin-left:0; }
|
||||
/* svg */
|
||||
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; }
|
||||
@ -797,8 +855,6 @@ body.mobile fieldset.plugin>legend { box-shadow:none; }
|
||||
body.mobile:not(.landscape) fieldset.plugin.cmd:not(.output)>div.header { display:none !important; }
|
||||
body.mobile div.output.card { overflow-x:hidden; }
|
||||
body.mobile div.output>div.project { position:absolute; left:0; top:0; z-index:2; }
|
||||
body.mobile div.output>div.project { flex:0 0 240px; width:240px; }
|
||||
body.mobile div.output>div.project div.item { height:var(--action-height); }
|
||||
body.mobile div.output>div.project { background-color:var(--plugin-bg-color); }
|
||||
body.mobile fieldset>div.output>div.code>img { max-width:390px; }
|
||||
body.mobile fieldset>div.output>div.code>div.form input[type=button] { width:100%; }
|
||||
@ -815,7 +871,7 @@ body.mobile fieldset.Search>div.action>div.item.filter>span { position:absolute;
|
||||
body.mobile fieldset.Search>div.action>div.item.filter { width:100%; position:relative; }
|
||||
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); }
|
||||
body.mobile:not(.cmd) fieldset.Action { margin-top:var(--header-height); }
|
||||
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 { overflow:hidden; }
|
||||
body.mobile fieldset.Action>div.output { overflow-x:hidden; }
|
||||
@ -832,7 +888,6 @@ body.mobile.landscape fieldset.Action { margin-top:0; }
|
||||
body.mobile.landscape>div.input.login { padding:0; }
|
||||
body.mobile.landscape>div.input.login>div.output { height:290px; }
|
||||
body.mobile.landscape>div.input.login>div.output img { max-height:280px; }
|
||||
html.login body.mobile>fieldset.panel.Action>div.output { background-color:var(--panel-bg-color); }
|
||||
/* print */
|
||||
body.print { -webkit-filter: grayscale(100%); }
|
||||
body.print { background-color:white; color:black; }
|
||||
@ -854,12 +909,18 @@ body.print fieldset.draw div.output { background-color:lightgray; }
|
||||
body.print fieldset.draw div.output div.content svg { background-color:lightgray; }
|
||||
/* misc */
|
||||
fieldset.iframe>form.option>div.item.hash input { width:var(--form-width); }
|
||||
fieldset.iframe.float>form.option>div.item:not(.delete) { display:none; }
|
||||
fieldset.iframe.float>form.option>div.item:not(.delete):not(.refresh):not(.back) { display:none; }
|
||||
fieldset.iframe.float>form.option>div.item.hash input { width:var(--form-width); }
|
||||
fieldset.iframe>div.status { display:none; }
|
||||
fieldset.iframe.float { border:0; }
|
||||
fieldset.iframe.float { background-color:var(--panel-bg-color); color:var(--panel-fg-color); }
|
||||
fieldset.iframe.float>legend { background-color:var(--panel-bg-color); color:var(--panel-fg-color); }
|
||||
fieldset.iframe.float.portal { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
|
||||
fieldset.iframe.float.portal>legend { background-color:var(--notice-bg-color); color:var(--notice-fg-color); margin-right:10px; }
|
||||
fieldset.iframe.float.portal>div.action>div.item.full { display:none; }
|
||||
fieldset.iframe.float.portal>form.option>div.item.icon.goback { display:none; }
|
||||
fieldset.desktop { border:0; }
|
||||
fieldset.desktop>legend { background-color:transparent; color:silver; }
|
||||
fieldset.desktop>legend:not(:hover) { background-color:transparent; color:white; }
|
||||
fieldset.desktop>form.option>div.item:not(.delete) { display:none; }
|
||||
fieldset.desktop>form.option>div.item.delete { color:silver; }
|
||||
fieldset.desktop>div.action>div.item.text { display:none; }
|
||||
@ -868,6 +929,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; }
|
||||
@ -887,7 +949,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; }
|
||||
@ -906,6 +968,7 @@ 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; }
|
||||
@ -918,6 +981,7 @@ fieldset.offer>div.output>table.content tr.invite { background-color:var(--notic
|
||||
fieldset.apply>div.output>table.content.detail.apply tr.action td.action { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
|
||||
fieldset.trans>div.output>fieldset { margin:var(--button-margin); }
|
||||
fieldset.config form.option input[name=key] { width:var(--project-width); }
|
||||
body.dark fieldset.spides>div.output>svg>text:hover { fill:white; }
|
||||
fieldset.rich>div.output>table.content { font-family:var(--code-font-family); }
|
||||
fieldset.plan div.output div.content>table.content { height:100%; width:100%; }
|
||||
fieldset.plan>div.output>div.layout>div.layout>div.profile:not(.toggle) { width:unset; flex:unset; }
|
||||
@ -927,12 +991,12 @@ fieldset.plan>div.output>div.layout>div.layout { align-items:flex-start; }
|
||||
fieldset.plan>div.output>div.layout { height:100%; }
|
||||
fieldset.draw>form.option>div.item.pid>input { width:var(--button-width) !important; }
|
||||
fieldset.draw>div.output>div.layout>div.layout>div.profile table { width:100%; }
|
||||
fieldset.draw>div.output>div.layout>div.layout>div.profile { width:var(--project-width); flex:0 0 var(--project-width); }
|
||||
fieldset.draw>div.output>div.layout>div.layout>div.profile { width:var(--project-width); flex:0 0 var(--project-width); flex-grow:1; }
|
||||
fieldset.draw>div.output>svg { margin-bottom:-5px; }
|
||||
fieldset.draw>div.output>svg { min-height:100%; }
|
||||
body.dark fieldset.float { background-color:#000c; }
|
||||
body.dark fieldset.float:not(.iframe) { background-color:#000c; }
|
||||
body.dark fieldset.float>div.output { background-color:transparent; }
|
||||
body.light fieldset.float { background-color:#fffc; }
|
||||
body.light fieldset.float:not(.iframe) { background-color:#fffc; }
|
||||
body.light fieldset.float>div.output { background-color:transparent; }
|
||||
fieldset.draw.spides>div.output>svg text { cursor:pointer; }
|
||||
fieldset.draw.spides>div.output>svg path { stroke-width:1; }
|
||||
@ -953,13 +1017,13 @@ fieldset.can.view>div.output div.item>span.toggle { width:var(--code-font-size);
|
||||
fieldset.can.view>div.output div.item>span.inner { color:var(--disable-fg-color); }
|
||||
fieldset.can.view>div.output div.list { border-left:var(--disable-fg-color) dashed 1px; padding-left:10px; margin-left:4px; }
|
||||
fieldset.form>div.output>div.code { display:flex; flex-direction:column; justify-content:center; align-items:center; }
|
||||
fieldset.form>div.output>div.code>div.info { font-size:20px; text-align:center; padding:20px; overflow:auto; white-space:break-spaces; }
|
||||
fieldset.form>div.output>div.code>div.info { font-size:20px; text-align:center; padding:20px; margin-top:32px; overflow:auto; white-space:break-spaces; }
|
||||
fieldset.form>div.output>div.code>div.info>span.title { font-style:italic; }
|
||||
fieldset.form>div.output>div.code>input[type=button] { font-size:24px; border:var(--box-notice); height:48px; width:240px; margin:20px; display:block; }
|
||||
fieldset>div.output.form { padding:20px; display:flex; flex-direction:column; align-items:center; }
|
||||
fieldset>div.output.form>div.item { text-align:left; margin:10px; height:unset; }
|
||||
fieldset>div.output.form>div.item>div.item { height:unset; }
|
||||
fieldset>div.output.form>div.item>span { padding:var(--input-padding); }
|
||||
fieldset>div.output.form>div.item>span { padding:var(--input-padding); white-space:pre; }
|
||||
fieldset>div.output.form>div.item>span.need { color:red; }
|
||||
fieldset>div.output.form>div.item>div.item>input { font-size:20px; height:38px; width:var(--form-width); }
|
||||
fieldset>div.output.form>div.item>div.item>input[type=button] { font-size:20px; height:48px; border:var(--box-notice); }
|
||||
@ -982,7 +1046,7 @@ fieldset.Action>div.output>fieldset.ssh.cloud.profile:hover { box-shadow:none; }
|
||||
fieldset.Action>div.output>fieldset.ssh.cloud.profile>div.output { background-color:transparent; }
|
||||
fieldset.Action:not(.horizon):not(.grid)>fieldset.plugin>form.option>div.item.text.path>input { width:var(--project-width); }
|
||||
body:not(.debug) fieldset.plugin.can._notfound { display:none; }
|
||||
body:not(.cmd) fieldset.Action>div.output>fieldset.plugin>legend { border-top:var(--box-notice3); border-top-left-radius:0; margin-right:var(--legend-margin); }
|
||||
body:not(.cmd) fieldset.Action>div.output>fieldset.plugin>legend { border-left:var(--box-notice3); border-top-left-radius:0; margin-right:var(--legend-margin); }
|
||||
body:not(.cmd) fieldset.Action>div.output>fieldset.plugin>legend:not(:hover) { background-color:var(--output-bg-color); }
|
||||
body:not(.dark) fieldset.draw.trends div.output svg { background-color:#1b5b738c; }
|
||||
body.width6 fieldset.plugin.word>form.option>div.item.text>input { width:var(--project-width); }
|
||||
@ -999,7 +1063,7 @@ body.mobile fieldset.word fieldset.inner>form.option input[type=text] { display:
|
||||
body.mobile fieldset.vimer>form.option div.item.path input { width:var(--input-width); }
|
||||
body.mobile fieldset.vimer>form.option div.item.line { display:none; }
|
||||
body.mobile fieldset.Action>div.output>fieldset.plugin:not(.output):not(.float):not(.full):not(.cmd):not(:first-child) { margin:20px 0; }
|
||||
body.mobile table.content.detail { word-break:break-all; white-space:unset; }
|
||||
body.mobile table.content.detail { word-break:break-all; white-space:unset; overflow-y:hidden; }
|
||||
body.windows fieldset.inner>div.output { overflow:hidden; }
|
||||
body.windows fieldset.inner>div.output>div.layout>div.layout>div.profile { overflow:hidden; }
|
||||
body.white fieldset.inner.cmd>div.output>div.layout>div.tabs div:not(.select):not(:hover) { background-color:transparent; }
|
||||
@ -1037,6 +1101,5 @@ fieldset.input.key>div.output::-webkit-scrollbar { width:0 !important; height:0
|
||||
fieldset.word>div.output::-webkit-scrollbar { width:0 !important; height:0 !important; }
|
||||
fieldset.xterm div.xterm-viewport::-webkit-scrollbar { width:0 !important; height:0 !important; }
|
||||
fieldset.web.code.git.search>div.output::-webkit-scrollbar { width:0 !important; height:0 !important; }
|
||||
|
||||
body.windows *::-webkit-scrollbar { width:0 !important; height:0 !important; }
|
||||
body.windows * { scrollbar-width:none; }
|
||||
|
13
lib/base.js
@ -35,7 +35,9 @@ Volcanos("base", {
|
||||
} return to === from
|
||||
},
|
||||
|
||||
Ext: function(path) { return path.split(nfs.PS).pop().split(nfs.PT).pop().toLowerCase() },
|
||||
Ext: function(path) {
|
||||
return (path||"").split("?")[0].split("#")[0].split("/").pop().split(".").pop().toLowerCase()
|
||||
},
|
||||
Dir: function(path) { return path.endsWith(nfs.PS)? path: path.slice(0, path.lastIndexOf(nfs.PS)+1) },
|
||||
|
||||
Path: function(path) { var res = "", arg = arguments; for (var i = 0; i < arg.length; i++) { if (!arg[i]) { continue }
|
||||
@ -88,15 +90,19 @@ Volcanos("base", {
|
||||
if (item == arg[i]) { return true }
|
||||
} },
|
||||
TimeTrim: function(value) { var prefix = ""
|
||||
if (!value) { return }
|
||||
var now = new Date(), year = now.getFullYear()+"-", pre = this.Time(now, "%y-%m-%d ")
|
||||
if (value.indexOf(pre) == -1) { var list = ["昨天", "前天", "", "", "", "", ""]
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
var yestoday = this.Time(new Date(now - (i+1)*24*60*60*1000), "%y-%m-%d ")
|
||||
if (value.indexOf(yestoday) == 0) {
|
||||
prefix = (list[i] || ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"][new Date(value).getDay()])+" ", pre = yestoday; break
|
||||
prefix = (list[i] || ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"][new Date(value.replaceAll("-", "/").split(".")[0]).getDay()])+" ", pre = yestoday; break
|
||||
}
|
||||
}
|
||||
}
|
||||
if (value.indexOf(year) == -1) {
|
||||
return value.split(" ")[0]
|
||||
}
|
||||
return prefix+this.trimPrefix(value.split(":").slice(0, 2).join(":"), pre, year)
|
||||
},
|
||||
Time: function(time, fmt) { var now = this.Date(time)
|
||||
@ -164,8 +170,9 @@ 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) { while (str) { var index = str.lastIndexOf(end)
|
||||
trimSuffix: function(str, end, once) { while (str) { var index = str.lastIndexOf(end)
|
||||
if (index == -1 || index+end.length != str.length) { break } str = str.slice(0, index)
|
||||
if (once) { break }
|
||||
} return str },
|
||||
trim: function(arg) { if (this.isString(arg)) { return arg.trim() }
|
||||
if (this.isArray(arg)) { for (var i = arg.length-1; i >= 0; i--) { if (!arg[i]) { arg.pop() } else { break } } } return arg
|
||||
|
@ -23,7 +23,7 @@ Volcanos("core", {
|
||||
}
|
||||
}
|
||||
}
|
||||
var node = data, keys = key.split(nfs.PT); while (node && keys.length > 0) {
|
||||
var node = data, keys = key.split(nfs.PT); while (node && keys.length > 0) { if (typeof node == "string") { return }
|
||||
if (keys[0] == "-1") { keys[0] = node.length-1 } node = node[keys[0]], keys = keys.slice(1)
|
||||
} return node == undefined? data[key]: node
|
||||
},
|
||||
|
105
lib/misc.js
@ -73,6 +73,28 @@ Volcanos("misc", {
|
||||
res._option && (msg._option = res._option) && res._option.forEach(function(key) { res[key] && (msg[key] = res[key]) })
|
||||
return msg
|
||||
},
|
||||
Sort: function(key, swap) { var n = msg.Length()
|
||||
key = key||msg.append[0], swap = swap||function(i, j) { return msg[key][i] > msg[key][j] }
|
||||
switch (swap) {
|
||||
case "str": swap = function(i, j) { return msg[key][i] > msg[key][j] }; break
|
||||
case "str_r": swap = function(i, j) { return msg[key][i] < msg[key][j] }; break
|
||||
case "int": swap = function(i, j) { return can.base.ParseSize(msg[key][i]) > can.base.ParseSize(msg[key][j]) }; break
|
||||
case "int_r": swap = function(i, j) { return can.base.ParseSize(msg[key][i]) < can.base.ParseSize(msg[key][j]) }; break
|
||||
}
|
||||
for (var i = 0; i < n-1; i++) {
|
||||
for (var j = i+1; j < n; j++) { var _swap = swap(i, j)
|
||||
if (_swap === true) {
|
||||
can.core.List(msg.append, function(k) {
|
||||
var temp = msg[k][i]; msg[k][i] = msg[k][j], msg[k][j] = temp
|
||||
})
|
||||
} else if (_swap === false) {
|
||||
continue
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
Push: function(key, value, detail) {
|
||||
if (can.base.isObject(key)) { can.core.List(value||msg.append||can.base.Obj(msg.Option(ice.MSG_FIELDS))||can.core.Item(key), function(item) {
|
||||
detail? msg.Push(mdb.KEY, item).Push(mdb.VALUE, key[item]||""): msg.Push(item, key[item]||"")
|
||||
@ -94,8 +116,9 @@ Volcanos("misc", {
|
||||
}); return msg
|
||||
},
|
||||
Echo: function(res) { msg.result = (msg.result||[]).concat(can.core.List(arguments)); return msg._hand = true, msg },
|
||||
Dump: 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)
|
||||
Dump: function(can, target) { can = can||msg._can; if (can.user.isNodejs) { return }
|
||||
target = target||can._output
|
||||
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)
|
||||
@ -107,26 +130,23 @@ Volcanos("misc", {
|
||||
_caller: function(skip) { msg.Option("log.caller") || msg.Option("log.caller", can.misc.fileLine((skip||2)+3).link); return msg },
|
||||
isDebug: function() { return msg.Option(log.DEBUG) == ice.TRUE },
|
||||
}); return msg },
|
||||
Inputs: function(can, msg, cmds, cb, meta) {
|
||||
var event = msg._event
|
||||
if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) {
|
||||
// var msg = can.request(event, {action: cmds[1]})
|
||||
msg.Option(ctx.ACTION, cmds[1])
|
||||
Inputs: function(can, msg, cmds, cb, meta) { var event = msg._event
|
||||
if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { msg.Option(ctx.ACTION, cmds[1])
|
||||
var action = meta.feature[cmds[1]]; if (can.base.isFunc(action)) { cb = cb||function() { can.Update() }
|
||||
return action.list && action.list.length > 0? can.user.input(event, can, action.list, function(data) {
|
||||
can.core.CallFunc(action, {can: can, msg: can.request(event, data), arg: cmds.slice(2), cb: cb})
|
||||
}): can.core.CallFunc(action, {sup: meta.can, can: can, msg: can.request(event), arg: cmds.slice(2), cb: cb})
|
||||
}
|
||||
var input = can.user.input(event, can, meta.feature[cmds[1]], function(args) {
|
||||
can.page.ClassList.add(can, input._target, html.PROCESS)
|
||||
can.Update(can.request(event, {_handle: ice.TRUE}, msg, can.Option()), cmds.slice(0, 2).concat(args), function(msg) {
|
||||
var input = can.user.input(event, can, meta.feature[cmds[1]], function(args) { msg.result = []
|
||||
can.onmotion.delay(can, function() { can.page.ClassList.add(can, input._target, html.PROCESS) })
|
||||
can.Update(can.request(event, can.Option(), {_handle: ice.TRUE, _cancel: function(event) {
|
||||
can.page.ClassList.del(can, input._target, html.PROCESS)
|
||||
if (msg.IsErr()) {
|
||||
}}, msg), cmds.slice(0, 2).concat(args), function(msg) { can.page.ClassList.del(can, input._target, html.PROCESS)
|
||||
if (msg.IsErr()) { input.focus()
|
||||
can.onappend.style(can, "warn", can.user.toastFailure(can, msg.Result())._target)
|
||||
input.focus()
|
||||
} else {
|
||||
if (cb && cb(msg)) { return }
|
||||
input.cancel()
|
||||
input.cancel({}, can)
|
||||
return true
|
||||
}
|
||||
}); return true
|
||||
@ -151,12 +171,12 @@ Volcanos("misc", {
|
||||
input.values = input.values || can.core.Split(input.value)
|
||||
}
|
||||
if (can.base.isIn(input.type, html.TEXT, html.TEXTAREA)) {
|
||||
input.placeholder = can.user.trans(can, input.placeholder||input.name, field, html.INPUT)
|
||||
// input.placeholder = can.user.trans(can, input.placeholder||input.name, field, html.INPUT)
|
||||
}
|
||||
if (input.type == html.BUTTON) {
|
||||
input.value = can.user.trans(can, input.value||input.name, field)
|
||||
} else {
|
||||
cbs(input, index, field, order)
|
||||
cbs && cbs(input, index, field, order)
|
||||
}
|
||||
input.type == html.BUTTON && input.action == ice.AUTO && can.onmotion.delay(can, function() { cb(field, order) })
|
||||
})
|
||||
@ -213,6 +233,7 @@ Volcanos("misc", {
|
||||
res.Option(ice.LOG_TRACEID, msg.Option(ice.LOG_TRACEID))
|
||||
res.Option(ice.MSG_DEBUG, msg.Option(ice.MSG_DEBUG))
|
||||
socket.send(JSON.stringify(res))
|
||||
msg.Option("space.noecho", ice.TRUE)
|
||||
}, msg.detail = data.detail||[], msg.Copy(data), msg[ice.MSG_TARGET] = data[ice.MSG_TARGET]||[]
|
||||
try { msg.Option(ice.LOG_DISABLE) != ice.TRUE && can.misc.Log(html.WSS, ice.MSG_DETAIL, msg.detail, msg, _msg)
|
||||
can.core.CallFunc(cb, {event: event, msg: msg, cmd: msg.detail[0], arg: msg.detail.slice(1), cb: function() { msg.Reply() }})
|
||||
@ -220,11 +241,21 @@ Volcanos("misc", {
|
||||
}) }
|
||||
return socket
|
||||
},
|
||||
ResourceFavicon: function(can, path) { return can.misc.Resource(can, path||can.user.info.favicon||nfs.SRC_MAIN_ICO) },
|
||||
Resource: function(can, path, space, serve) {
|
||||
if (!can.base.beginWith(path, web.HTTP, nfs.PS)) { path = nfs.P+path+_version }
|
||||
ResourceFavicon: function(can, path, space) { return can.misc.Resource(can, path||can.user.info.favicon||nfs.SRC_MAIN_ICO, space) },
|
||||
ResourceIcons: function(can, path, space, serve) {
|
||||
if (!path) {
|
||||
if (can.user.info.nodetype == web.WORKER) {
|
||||
return can.misc.Resource(can, can.user.info.favicon, can.user.info.nodename)
|
||||
}
|
||||
}
|
||||
return can.misc.Resource(can, path||(can.page.isDark(can)? "usr/icons/volcanos.png": "usr/icons/icebergs.png"), space, serve)
|
||||
},
|
||||
Resource: function(can, path, space, serve) { if (!path) { return "" }
|
||||
if (!can.base.beginWith(path, web.HTTP, nfs.PS)) { path = nfs.P+path+(path.indexOf("usr/icons/") == -1? (space? can.core.Split(_version, "&")[0]: _version): "") }
|
||||
if (!can.base.beginWith(path, web.HTTP)) { if (serve && serve.indexOf(location.origin) == -1) { var u = can.base.ParseURL(serve); path = u.origin + path } }
|
||||
if (path.indexOf("pod=") > 0) { return path }
|
||||
if (!space && !can.base.beginWith(path, web.HTTP)) { return location.origin+path }
|
||||
if (!space && path.indexOf("pod=") > 0) { return path }
|
||||
if (can.base.beginWith(path, "/") && path.indexOf("pod=") > 0) { return path }
|
||||
return can.base.MergeURL(path, ice.POD, space||can.ConfSpace()||can.misc.Search(can, ice.POD))
|
||||
},
|
||||
ShareLocal: function(can, path, space) { if (can.base.beginWith(path, web.HTTP, nfs.PS)) { return path }
|
||||
@ -275,6 +306,9 @@ Volcanos("misc", {
|
||||
return dir+file+(ext? nfs.PT+ext: "")
|
||||
},
|
||||
isDebug: function(can) { return can.misc.Search(can, log.DEBUG) == ice.TRUE },
|
||||
isImage: function(can, path) { return can.base.isIn(can.base.Ext(path), "png", "jpg", "jpeg") },
|
||||
isVideo: function(can, path) { return can.base.isIn(can.base.Ext(path), "mp4", "m4v", "mov", "webm") },
|
||||
isAudio: function(can, path) { return can.base.isIn(can.base.Ext(path), "mp3") },
|
||||
Search: function(can, key, value) { var args = this.ParseURL(can, location.href)
|
||||
if (can.base.isUndefined(key)) { return args } else if (can.base.isObject(key)) {
|
||||
can.core.Item(key, function(k, v) { v === ""? delete(args[k]): (args[k] = v) })
|
||||
@ -289,16 +323,17 @@ Volcanos("misc", {
|
||||
SearchHash: function(can) { var hash = location.hash
|
||||
if (arguments.length > 1) {
|
||||
hash = can.core.List(arguments, function(item) {
|
||||
if (can.base.isArray(item)) {
|
||||
return item.join(nfs.DF)
|
||||
}
|
||||
return can.base.replaceAll(item, ":", "%3A") }).slice(1).join(nfs.DF)
|
||||
if (can.base.isArray(item)) { return item.join(nfs.DF) }
|
||||
return can.base.replaceAll(item, ":", "%3A")
|
||||
}).slice(1).join(nfs.DF)
|
||||
if (can.isCmdMode() || can._name == "River" || can._name == "Action") { location.hash = hash }
|
||||
}
|
||||
return can.core.List(can.core.Split(can.base.trimPrefix(location.hash, "#"), nfs.DF)||[], function(item) { return decodeURIComponent(item) })
|
||||
},
|
||||
SearchOrConf: function(can, key, def) { return can.misc.Search(can, key)||Volcanos.meta.args[key]||can.misc.sessionStorage(can, "can."+key)||can.misc.localStorage(can, "can."+key)||can.Conf(key)||def },
|
||||
CookieSessid: function(can, value, path) { return can.misc.Cookie(can, ice.MSG_SESSID+"_"+(location.port||(location.protocol == "https:"? "443": "80")), value, path) },
|
||||
CookieSessid: function(can, value, path) {
|
||||
return can.misc.Cookie(can, ice.MSG_SESSID+"_"+(location.port||(location.protocol == "https:"? "443": "80")), value, path)||can.misc.Cookie(can, ice.MSG_SESSID, value, path)
|
||||
},
|
||||
Cookie: function(can, key, value, path) {
|
||||
function set(k, v) { var expires = new Date(); expires.setTime(expires.getTime() + 30*24*3600000)
|
||||
document.cookie = k+mdb.EQ+v+";path="+(path||nfs.PS)+";expires="+expires.toGMTString()
|
||||
@ -310,10 +345,6 @@ Volcanos("misc", {
|
||||
} can.base.isUndefined(value) || set(key, value)
|
||||
var val = (new RegExp(key+"=([^;]*);?")).exec(document.cookie); return val && val.length > 1? val[1]: ""
|
||||
},
|
||||
localStorage: function(can, key, value) {
|
||||
if (can.base.isUndefined(key)) { var res = {}; can.core.Item(localStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res }
|
||||
if (!can.base.isUndefined(value)) { if (value === "") { return localStorage.removeItem(key) } localStorage.setItem(key, value) } return can.base.Obj(localStorage.getItem(key))
|
||||
},
|
||||
sessionStorage: function(can, key, value) {
|
||||
if (can.base.isUndefined(key)) { var res = {}; can.core.Item(sessionStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res }
|
||||
if (can.base.isArray(key)) { key = key.join(":") }
|
||||
@ -321,17 +352,17 @@ Volcanos("misc", {
|
||||
if (value === "") { return sessionStorage.removeItem(key) } sessionStorage.setItem(key, value)
|
||||
} return can.base.Obj(sessionStorage.getItem(key))||sessionStorage.getItem(key)
|
||||
},
|
||||
Log: function() {
|
||||
var args = this._args("", arguments)
|
||||
localStorage: function(can, key, value) {
|
||||
if (can.base.isUndefined(key)) { var res = {}; can.core.Item(localStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res }
|
||||
if (!can.base.isUndefined(value)) { if (value === "") { return localStorage.removeItem(key) } localStorage.setItem(key, value) } return can.base.Obj(localStorage.getItem(key))
|
||||
},
|
||||
Log: function() { var args = this._args("", arguments)
|
||||
if (arguments[0].indexOf && arguments[0].indexOf("on") == 0) { args[1] = this.FileLine((arguments[0] == "onremote"? 1: 1)+this._skip) }
|
||||
for (var i in arguments) { var arg = arguments[i]; if (arg && arg.Option && arg.Option("log.caller")) { args[1] = arg.Option("log.caller") } }
|
||||
console.log.apply(console, args), this._signal(args)
|
||||
},
|
||||
Info: function() { var args = this._args(log.INFO, arguments); console.info.apply(console, args), this._signal(args) },
|
||||
Warn: function() {
|
||||
var args = this._args(log.WARN, arguments); console.warn.apply(console, args), this._signal(args);
|
||||
// debugger
|
||||
},
|
||||
Warn: function() { var args = this._args(log.WARN, arguments); console.warn.apply(console, args), this._signal(args); },
|
||||
Error: function() { var args = this._args(log.ERROR, arguments); args.push(lex.NL, this._stacks().slice(1).join(lex.NL)), console.error.apply(console, args), this._signal(args); debugger },
|
||||
Debug: function() { var args = this._args(log.DEBUG, arguments); args.push(lex.NL, this._stacks().slice(1, 4).join(lex.NL)), console.debug.apply(console, args), this._signal(args) },
|
||||
Trace: function() { var output = false
|
||||
@ -352,7 +383,8 @@ Volcanos("misc", {
|
||||
},
|
||||
_stacks: function(n, s) { var list = ((s||(new Error())).stack||"").split(lex.NL).slice(typeof n == "undefined"? 2: n)
|
||||
for (var i = 0; i < list.length; i++) { var ls = list[i].trim().split(lex.SP)
|
||||
list[i] = ls.pop().trim(); if (list[i][0] == "(") { list[i] = list[i].slice(1, -1) }
|
||||
list[i] = ls.pop().trim()
|
||||
if (list[i][0] == "(") { list[i] = list[i].slice(1, -1) } // ")"
|
||||
list[i] = " "+list[i]; if (ls.length > 1) { list[i] += " "+ls.pop() }
|
||||
list[i] = list[i].replace(/\?[^:]+/, "").replace(location.origin, "")
|
||||
} return list
|
||||
@ -368,5 +400,4 @@ Volcanos("misc", {
|
||||
for (var i in arg) { arg[i] != undefined && args.push(arg[i]) } return args
|
||||
},
|
||||
_signal: function(args) { this._list.push(args) }, _list: [], _skip: navigator && navigator.userAgent.indexOf("Chrome") > -1? 3: 3,
|
||||
})
|
||||
|
||||
})
|
||||
|
129
lib/page.js
@ -85,22 +85,29 @@ Volcanos("page", {
|
||||
data.className = list[1]||data.className||name, data.type = html.PASSWORD
|
||||
} else if (item.img) {
|
||||
var list = can.core.List(item.img); type = html.IMG, data.src = list[0]
|
||||
if (can.base.contains(data.src, ".jpg")) {
|
||||
data.className = data.className||"jpg"
|
||||
}
|
||||
if (can.base.contains(data.src, ".jpg")) { data.className = data.className||"jpg" }
|
||||
} else if (item.row) { type = html.TR, item.list = item.row.map(function(text) { return {text: [text, item.sub||html.TD]} })
|
||||
} else if (item.th) { type = html.TR, item.list = item.th.map(function(text) { return {text: [text, html.TH]} })
|
||||
} else if (item.td) { type = html.TR, item.list = item.td.map(function(text) { return can.base.isObject(text)? text: {text: [text||"", html.TD]} }) }
|
||||
// if (type == html.SELECT) { data.title = can.user.trans(can, data.title||name) }
|
||||
if (type == html.INPUT) {
|
||||
if (data.type == html.TEXT || data.type == html.PASSWORD || !data.type) { data.autocomplete = data.autocomplete||"off"
|
||||
if (data.type == html.TEXT || data.type == html.PASSWORD || !data.type) {
|
||||
// data.autocomplete = data.autocomplete||"new-password"
|
||||
if (!can.user.isMobile) {
|
||||
data.placeholder = (data.placeholder||name||"").split(nfs.PT).pop(), data.title = can.user.trans(can, data.title||data.placeholder, null, html.INPUT)
|
||||
}
|
||||
} else if (data.type == html.BUTTON) {
|
||||
// data.value = can.user.trans(can, data.value)
|
||||
}
|
||||
} if (type == html.TEXTAREA) { data.placeholder = can.user.trans(can, (data.placeholder||name||"").split(nfs.PT).pop(), null, html.INPUT) }
|
||||
}
|
||||
if (type == html.TEXTAREA) {
|
||||
if (!can.user.isMobile) {
|
||||
data.placeholder = can.user.trans(can, (data.placeholder||name||"").split(nfs.PT).pop(), null, html.INPUT)
|
||||
}
|
||||
}
|
||||
can.core.List(["className", "placeholder", "title"], function(key) { data[key] || delete(data[key]) })
|
||||
name && (data.name = name); var node = can.page.Create(can, type, data)
|
||||
value[data.type] = node
|
||||
value[type] = value[name] = value[can.core.Split(data.className)[0]] = node, value._target = value._target||node, value.first = value.first||node, value.last = node
|
||||
item.list && can.page.Append(can, node, item.list, value), target && target.appendChild && target.appendChild(node), can.base.isFunc(item._init) && item._init(node, value)
|
||||
}); return value },
|
||||
@ -191,8 +198,9 @@ Volcanos("page", {
|
||||
if (value == undefined) { return {view: [key, "col"]} } return {view: [[key, "option"], "col"]}
|
||||
} }) }, {type: html.THEAD}, {type: html.TBODY},
|
||||
]}])
|
||||
var option = can.core.Item(can.Option())
|
||||
can.page.Append(can, ui.thead, [{type: html.TR, data: {dataset: {index: -1}}, list: can.core.List(list, function(key) {
|
||||
if (key[0] != "_") { return {type: html.TH, list: [{text: can.user.trans(can, key, null, html.INPUT)}, {icon: "bi bi-sort-down-alt"}, {icon: "bi bi-sort-up"}]} }
|
||||
if (key[0] != "_") { return {className: option.indexOf(key) > -1? ice.MSG_OPTION: key == ctx.ACTION? ctx.ACTION: "", type: html.TH, list: [{text: can.user.trans(can, key, null, html.INPUT)}, {icon: "bi bi-sort-down-alt"}, {icon: "bi bi-sort-up"}]} }
|
||||
}) }])
|
||||
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) } }) }
|
||||
@ -273,8 +281,9 @@ Volcanos("page", {
|
||||
],
|
||||
Color: function(text) { if (typeof text != code.STRING) { return "" } text = text.replace(/\\n/g, "<br>")
|
||||
if (text.indexOf(ice.HTTP) == 0 && text.length > 10) { var ls = text.split(lex.SP); text = "<a href='"+ls[0]+"' target='_blank'>"+decodeURI(ls[0])+"</a>"+ls.slice(1).join(lex.SP) }
|
||||
if (text.indexOf("export ctx_dev=") == 0 && text.length > 10) { return "<div class='story' data-type='spark' data-name='shell'><div>"+"<span>"+text+"</span>"+"</div></div>" }
|
||||
if (text.indexOf("\033\[") == -1) { return text }
|
||||
if (text.indexOf("export ctx_dev=") == 0 && text.length > 10) {
|
||||
return "<div class='story' data-type='spark' data-name='shell'><div>"+"<span>"+text+"</span>"+"</div></div>"
|
||||
} if (text.indexOf("\033\[") == -1) { return text }
|
||||
text = text.replace(/\033\[41m/g, "<span style='background-color:#f00'>")
|
||||
text = text.replace(/\033\[31m/g, "<span style='color:#f00'>")
|
||||
text = text.replace(/\033\[32m/g, "<span style='color:#0f0'>")
|
||||
@ -287,7 +296,7 @@ Volcanos("page", {
|
||||
text = text.replace(/\033\[1m/g, "<span style='font-weight:bold'>")
|
||||
text = text.replace(/\033\[0m/g, "</span>")
|
||||
text = text.replace(/\033\[m/g, "</span>")
|
||||
return text
|
||||
return text // }
|
||||
},
|
||||
Keys: function() { var list = []; /* FS SP GT PT */ for (var i = 0; i < arguments.length; i++) { var v = arguments[i]; if (typeof v == code.OBJECT) {
|
||||
for (var j = 0; j < v.length; j++) { if (typeof v[j] == code.OBJECT) {
|
||||
@ -337,6 +346,9 @@ Volcanos("page", {
|
||||
}
|
||||
},
|
||||
tagClass: function(target) { return target.tagName.toLowerCase()+(target.className? nfs.PT+target.className.replaceAll(lex.SP, nfs.PT): "") },
|
||||
isDark: function(can) {
|
||||
return can.page.tagis(document.body, "body.dark")
|
||||
},
|
||||
isDisplay: function(target) { return target && target.style.display != html.NONE && target.className.indexOf(html.HIDE) == -1 },
|
||||
isSelect: function(target) { return target && target.className.indexOf(html.SELECT) > -1 },
|
||||
isIconInput: function(can, name) {
|
||||
@ -363,7 +375,9 @@ Volcanos("page", {
|
||||
favor: "\u2606",
|
||||
help: "\u2753",
|
||||
},
|
||||
inputs: function(can, list, type) { var _list = []; for (var i = 0; i < list.length; i++) { switch (list[i]) {
|
||||
inputs: function(can, list, type) {
|
||||
var _list = []; for (var i = 0; i < list.length; i++) {
|
||||
switch (list[i]) {
|
||||
case "": _list.push(""); break
|
||||
case ice.AUTO:
|
||||
_list.push({type: html.BUTTON, name: ice.LIST})
|
||||
@ -386,17 +400,30 @@ Volcanos("page", {
|
||||
}})
|
||||
_list.push(mdb.NEXT, mdb.PREV)
|
||||
break
|
||||
default:
|
||||
(function() { var item = can.core.SplitInput(list[i], type||html.BUTTON)
|
||||
if (item.type == html.SELECT) { item._init = function(target) { target.value = item.value||item.values[0], target.onchange = function(event) { can.misc.Event(event, can, function(msg) {
|
||||
can.run(event)
|
||||
}) } } } item.action && (function() { item._init = function(target) {
|
||||
default: (function() { var item = can.core.SplitInput(list[i], type||html.BUTTON)
|
||||
if (item.type == html.SELECT) {
|
||||
item._init = function(target) { target.value = item.value||item.values[0]
|
||||
target.onchange = function(event) { can.misc.Event(event, can, function(msg) { can.run(event) }) }
|
||||
}
|
||||
}
|
||||
item.action && (function() { item._init = function(target) {
|
||||
can.onappend.figure(can, item, target, function() { can.Update({}, ) })
|
||||
} })()
|
||||
_list.push(item), type = item.type
|
||||
})()
|
||||
} } return _list },
|
||||
input: function(can, item, value) { var input = {type: html.INPUT, name: item.name, data: item, style: item.style||{}, dataset: {}, _init: item._init}
|
||||
}
|
||||
}
|
||||
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},
|
||||
]}
|
||||
},
|
||||
input: function(can, item, value) { var input = {type: html.INPUT, name: item.name, data: item, style: item.style||{}, dataset: {}, _init: item._init}
|
||||
item.value == ice.AUTO && (item.value = "", item.action = ice.AUTO), item.action == ice.AUTO && (input.dataset.action = ice.AUTO)
|
||||
switch (item.type = item.type||html.TEXT) {
|
||||
case html.SELECT: input.type = html.SELECT, item.className||can.page.ClassList.add(can, item, ctx.ARGS)
|
||||
@ -412,46 +439,46 @@ input: function(can, item, value) { var input = {type: html.INPUT, name: item.na
|
||||
case html.TEXT:
|
||||
case html.FILTER:
|
||||
item.className||can.page.ClassList.add(can, item, ctx.ARGS), item.name = item.name||item.type, item.value = value||item.value||"";
|
||||
item.placeholder = item.placeholder||item.name
|
||||
//item.placeholder = item.placeholder||item.name
|
||||
break
|
||||
case html.UPLOAD: item.type = html.FILE, input.name = html.UPLOAD; break
|
||||
case html.BUTTON: item.value = item.value||item.name||mdb.LIST; break
|
||||
} return input
|
||||
},
|
||||
icons: function(can, name, space) { if (!name) { return }
|
||||
if (can.base.contains(name, ".ico", ".png", ".jpg")) { return {img: can.misc.Resource(can, (name.indexOf(nfs.PS) == -1? nfs.USR_ICONS: "")+name, space)} }
|
||||
},
|
||||
icons: function(can, name, space) { if (!name) { return }
|
||||
if (can.base.contains(name, "/") && can.misc.isImage(can, name)) { return {img: can.misc.Resource(can, name, space)} }
|
||||
// if (can.page.unicode[name]) { return {text: [can.page.unicode[name], "", "icon"]} }
|
||||
if (name == mdb.DELETE) { return {icon: "bi bi-trash"} }
|
||||
if (can.base.beginWith(name, "bi ")) { return {icon: name} }
|
||||
if (name == mdb.DELETE) { return {icon: "bi bi-trash"} }
|
||||
var _icon = can.base.getValid(can.Conf("_icons."+name), can.Conf("_trans.icons."+name), can.core.Value(can.onaction, ["_trans.icons."+name]), icon[name])
|
||||
if (_icon) { return {icon: _icon} }
|
||||
},
|
||||
requireChina: function(can, title, list, name, path) {
|
||||
},
|
||||
requireChina: function(can, title, list, name, path) {
|
||||
can.onappend.plugin(can, {title: title, display: "/plugin/story/china.js", style: html.FLOAT, height: can.ConfHeight(), width: can.ConfHeight()}, function(sub) {
|
||||
sub.run = function(event, cmds, cb) { var msg = can.request(event, {title: title, name: name, path: path})
|
||||
can.core.List(list, function(item) { msg.Push(mdb.NAME, item.name), msg.Push(mdb.VALUE, item.value) }), cb(msg)
|
||||
can.onmotion.resize(can, sub._target, function(height, width) { sub.onimport.size(sub, height, width, true) })
|
||||
}
|
||||
})
|
||||
},
|
||||
requireModules: function(can, libs, cb, cbs) { if (!libs || libs.length == 0) { return cb && cb() }
|
||||
},
|
||||
requireModules: function(can, libs, cb, cbs) { if (!libs || libs.length == 0) { return cb && cb() }
|
||||
for (var i = 0; i < libs.length; i++) { if (libs[i].indexOf(nfs.PS) == 0 || libs[i].indexOf(ice.HTTP) == 0) { continue }
|
||||
if (libs[i].indexOf(nfs._CSS) == -1 && libs[i].indexOf(nfs._JS) == -1) { libs[i] = libs[i]+"/lib/"+libs[i]+nfs._JS }
|
||||
libs[i] = nfs.M+libs[i]
|
||||
} can.require(libs, cb, cbs)
|
||||
},
|
||||
requireDraw: function(can, cb) { can.require([chat.PLUGIN_LOCAL+"wiki/draw.js", chat.PLUGIN_LOCAL+"wiki/draw/path.js"], function() {
|
||||
},
|
||||
requireDraw: function(can, cb) { can.require([chat.PLUGIN_LOCAL+"wiki/draw.js", chat.PLUGIN_LOCAL+"wiki/draw/path.js"], function() {
|
||||
can.onimport._last_init(can, can.request()), can.onappend.style(can, wiki.DRAW, can._fields), cb()
|
||||
}, function(can, mod, sub) { mod == chat.ONIMPORT && (can[mod]._last_init = sub._init) }) },
|
||||
drawText: function(can, text, size, margin, fonts) { text = text.slice(0, 1), size = size||80, margin = margin == undefined? 10: margin
|
||||
}, function(can, mod, sub) { mod == chat.ONIMPORT && (can[mod]._last_init = sub._init) }) },
|
||||
drawText: function(can, text, size, margin, fonts) { text = text.slice(0, 1), size = size||80, margin = margin == undefined? 10: margin
|
||||
var colors = ["rgb(239,150,26)", 'rgb(255,58,201)', "rgb(111,75,255)", "rgb(36,174,34)", "rgb(80,80,80)"]
|
||||
var canvas = can.page.Create(can, html.CANVAS, {width: size, height: size}), ctx = canvas.getContext("2d")
|
||||
ctx.fillStyle = colors[Math.floor(Math.random()*(colors.length))], ctx.fillRect(margin, margin, size-2*margin, size-2*margin)
|
||||
ctx.fillStyle = cli.WHITE, ctx.font = (fonts||can.base.Min(size/text.length-30, 16))+"px Arial", ctx.textAlign = "center", ctx.textBaseline = "middle", ctx.fillText(text, size/2, size/2)
|
||||
return canvas.toDataURL(html.IMAGE_PNG, 1)
|
||||
},
|
||||
position: function(event, target) { var p = target.getBoundingClientRect(); return {x: event.clientX - p.x, y: event.clientY - p.y} },
|
||||
getquery: function(can, target) {
|
||||
},
|
||||
position: function(event, target) { var p = target.getBoundingClientRect(); return {x: event.clientX - p.x, y: event.clientY - p.y} },
|
||||
getquery: function(can, target) {
|
||||
var list = []; for (var p = target; p; p = p.parentNode) {
|
||||
if (can.page.tagis(p, "body")) { list.pop(); break }
|
||||
list.push(can.core.Keys(p.tagName.toLowerCase(), can.core.List(p.classList).join(".")), ">")
|
||||
@ -461,29 +488,39 @@ getquery: function(can, target) {
|
||||
}
|
||||
}
|
||||
return list.reverse().join("")
|
||||
},
|
||||
theme: function(cb) { var themeMedia = window.matchMedia("(prefers-color-scheme: dark)")
|
||||
},
|
||||
theme: function(cb) { var themeMedia = window.matchMedia("(prefers-color-scheme: dark)")
|
||||
cb && themeMedia.addListener(function(event) { cb(event.matches? html.DARK: html.LIGHT) })
|
||||
cb && cb(themeMedia.matches? html.DARK: html.LIGHT)
|
||||
return themeMedia.matches? html.DARK: html.LIGHT
|
||||
},
|
||||
parseAction: function(can, value) { var action = []
|
||||
},
|
||||
appendAction: function(can, value, target) { if (!value.action) { return } target.innerHTML = value.action
|
||||
can.page.Select(can, target, html.INPUT_BUTTON, function(target) {
|
||||
var style = can.Conf(["_trans.input",can.ConfIndex().split(".").pop(), "style", target.name])||can.Conf("_style."+target.name)||can.page.buttonStyle(can, target.name); style && can.onappend.style(can, style, target)
|
||||
target.onclick = function(event) {
|
||||
if (can.page.ClassList.has(can, can._fields, "_process")) { return } can.onappend.style(can, "_process")
|
||||
can.onkeymap.prevent(event), can.Update(can.request(event, value, {_toast: can.user.trans(can, target.name)}), [ctx.ACTION, target.name])
|
||||
}
|
||||
})
|
||||
},
|
||||
parseAction: function(can, value) { var action = []
|
||||
can.page.Select(can, can.page.Create(can, html.DIV, value.action), html.INPUT, function(target) {
|
||||
action.push(target.name), target.name != target.value && can.user.trans(can, kit.Dict(target.name, target.value))
|
||||
})
|
||||
return action
|
||||
},
|
||||
buttonStyle: function(can, name) {
|
||||
return can.core.Value(can.onaction, ["_trans", "style", name])||(can.base.isIn(name, mdb.CREATE, mdb.INSERT, mdb.IMPORT, nfs.CLONE, cli.START, ctx.RUN, web.UPLOAD, web.CONFIRM, aaa.LOGIN, code.AUTOGEN, "sso", "add", "pull", "push", "commit", "preview", "auto-preview", ice.APP)? html.NOTICE:
|
||||
can.base.isIn(name, mdb.REMOVE, mdb.DELETE, mdb.PRUNES, mdb.PRUNE, nfs.TRASH, cli.RESTART, cli.STOP, cli.CLOSE, cli.REBOOT, web.CANCEL, code.UPGRADE, "del", "drop", "access", "kill", "prockill")? html.DANGER: "")
|
||||
},
|
||||
exportValue: function(can, msg, target) { target = target||can._output
|
||||
},
|
||||
buttonStyle: function(can, name) {
|
||||
return can.Conf(["_trans.input", can.ConfIndex().split(".").pop(), "style", name])||can.Conf("_style."+name)||
|
||||
can.core.Value(can.onaction, ["_trans", "style", name])||(can.base.isIn(name, mdb.CREATE, mdb.INSERT, mdb.IMPORT, nfs.CLONE, cli.START, ctx.RUN, web.UPLOAD, web.CONFIRM, aaa.LOGIN, code.AUTOGEN, "sso", "add", "pull", "push", "submit", "commit", "preview", "auto-preview", ice.APP)? html.NOTICE:
|
||||
can.base.isIn(name, mdb.REMOVE, "rename", mdb.DELETE, mdb.PRUNES, mdb.PRUNE, nfs.TRASH, cli.RESTART, cli.STOP, cli.CLOSE, cli.REBOOT, web.CANCEL, code.UPGRADE, "reject", "del", "drop", "access", "kill", "prockill")? html.DANGER: "")
|
||||
},
|
||||
exportValue: function(can, msg, target) { target = target||can._output
|
||||
msg.OptionDefault(ice.MSG_THEME, can.getHeaderTheme())
|
||||
msg.OptionDefault(ice.MSG_BG, can.page.styleValue(can, "--plugin-bg-color", target))
|
||||
msg.OptionDefault(ice.MSG_FG, can.page.styleValue(can, "--plugin-fg-color", target))
|
||||
can.user.info.language && msg.OptionDefault(ice.MSG_LANGUAGE, can.user.info.language)
|
||||
return msg
|
||||
},
|
||||
styleValue: function(can, key, target) { const styles = getComputedStyle(target||document.body); return styles.getPropertyValue(key) },
|
||||
styleValueInt: function(can, key, target) { return parseInt(can.base.trimSuffix(can.page.styleValue(can, key, target), "px")) }
|
||||
},
|
||||
styleValue: function(can, key, target) { const styles = getComputedStyle(target||document.body); return styles.getPropertyValue(key) },
|
||||
styleValueInt: function(can, key, target) { return parseInt(can.base.trimSuffix(can.page.styleValue(can, key, target), "px")) }
|
||||
})
|
||||
|
241
lib/user.js
@ -1,6 +1,5 @@
|
||||
Volcanos("user", {
|
||||
agent: {
|
||||
enableDebug: function(can) {},
|
||||
getLocation: function(can, cb) { var call = arguments.callee; if (call._res) { return cb(call._res) }
|
||||
navigator.geolocation.getCurrentPosition(function(res) {
|
||||
cb(call._res = {type: "ip", name: "当前位置", text: "某某大街", latitude: res.coords.latitude.toFixed(6), longitude: res.coords.longitude.toFixed(6)})
|
||||
@ -10,11 +9,16 @@ Volcanos("user", {
|
||||
window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option(mdb.TEXT))
|
||||
+"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option(mdb.TEXT)))
|
||||
},
|
||||
chooseImage: function(can, cb, count) { can.base.isFunc(cb) && cb([]) },
|
||||
uploadImage: function(can, id, cb) {},
|
||||
previewImage: function(can, url, list) {},
|
||||
scanQRCode: function(can, cb) { can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT, text: ""}], function(list) { cb(can.base.ParseJSON(list[0])) }) },
|
||||
connectWifi: function(can, ssid, password, cb, cbs) {},
|
||||
getClipboard: function(can, cb) {},
|
||||
scanQRCode: function(can, cb) { can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT, text: ""}], function(list) { cb(can.base.ParseJSON(list[0])) }) },
|
||||
chooseImage: function(can, cb) { can.base.isFunc(cb) && cb([]) },
|
||||
enableDebug: function(can) {},
|
||||
init: function(can, content, icons) { can.user.agent.cmd = can, can.user.agent._init_content = content, can.user.agent._init_icons = icons }, _init_content: [],
|
||||
}, info: {},
|
||||
isIPad: false,
|
||||
isTesla: navigator.userAgent.indexOf("Tesla") > -1,
|
||||
isChrome: navigator.userAgent.indexOf("Chrome") > -1,
|
||||
isSafari: navigator.userAgent.indexOf("Safari") > -1,
|
||||
@ -41,7 +45,9 @@ Volcanos("user", {
|
||||
confirm: function(text) { return confirm(JSON.stringify(text)) },
|
||||
prompt: function(tip, def, cb, silent) { (text = silent? def: prompt(tip, def||"")) != undefined && typeof cb == code.FUNCTION && cb(text); return text },
|
||||
reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() },
|
||||
jumps: function(url) { location.href = url },
|
||||
jumps: function(url) {
|
||||
location.href = url
|
||||
},
|
||||
opens: function(url) {
|
||||
if (window.parent && window.parent.openurl) { return window.parent.openurl(url) }
|
||||
window.openurl? window.openurl(url): this.open(url)
|
||||
@ -55,23 +61,38 @@ 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.isMobile && name.push(html.MOBILE) && can.user.isLandscape() && name.push(html.LANDSCAPE)
|
||||
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.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) { if (window.webview) { return title(text) } return text && (document.title = text), document.title },
|
||||
title: function(text) {
|
||||
if (window.webview) { return title(text) }
|
||||
return text && (document.title = text), document.title
|
||||
},
|
||||
language: function(can) { return (can.misc.SearchOrConf(can, aaa.LANGUAGE)||can.user.info.language||"") },
|
||||
isEnglish: function(can) { return can.base.isIn(can.core.Split(can.user.language(can).toLowerCase()||"en", "_-.")[0], "en", "en-us") },
|
||||
transValue: function(can, value, key) {
|
||||
if (value.Append) { return can.user.trans(can, value.Append(key), null, "value."+key) }
|
||||
if (value.Option) { return can.user.trans(can, value.Option(key), null, "value."+key) }
|
||||
return can.user.trans(can, value[key], null, "value."+key)
|
||||
},
|
||||
trans: function(can, text, list, zone) { if (can.base.isNumber(text)) { return text+"" } if (can.user.isEnglish(can)) { return text }
|
||||
if (can.base.isObject(text)) { return can.core.Item(text, function(k, v) { can.core.Value(can._trans, can.core.Keys(zone, k), v) }) }
|
||||
if (can.base.isFunc(text)) { text = text.name||"" } if (list && can.base.isString(list)) { return list }
|
||||
var key = can.core.Keys(zone, text)
|
||||
return can.core.Value(list, key) || can.core.Value(can._trans, key) ||
|
||||
can.Conf(["trans", key]) || can.Conf(["feature._trans", key]) ||
|
||||
if (text == can.Conf("index") && can.Conf("help")) { return can.Conf("help") }
|
||||
return can.core.Value(list, key) ||
|
||||
can.Conf(["feature._trans", zone||"input", (can.ConfIndex()||"").split(".").pop(), text]) ||
|
||||
can.Conf(["feature._trans", zone, (can.ConfIndex()||"").split(".").pop(), text]) ||
|
||||
can.Conf(["feature._trans", key]) || can.Conf(["trans", key]) ||
|
||||
can.core.Value(can._trans, key) ||
|
||||
can.core.Value(can.user._trans, key) || text
|
||||
}, _trans: {"_week_header": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]},
|
||||
time: function(can, time, fmt) {
|
||||
@ -83,53 +104,73 @@ Volcanos("user", {
|
||||
var carte = can.user.toast(can, {content: content, title: title, action: action||[cli.CLOSE], duration: -1})
|
||||
can.page.style(can, carte._target, html.TOP, 200, html.BOTTOM, ""); return carte
|
||||
},
|
||||
toastProcess: function(can, content, title, progress) { return can.user.toast(can, {content: "🕑 "+(content||ice.PROCESS), title: title, duration: -1, progress: progress}) },
|
||||
toastFailure: function(can, content, title) { return can.user.toast(can, {content: "❌ "+(content||ice.FAILURE), title: title, duration: -1}) },
|
||||
toastSuccess: function(can, content, title) { return can.user.toast(can, {content: "✅ "+(content||ice.SUCCESS), title: title, duration: 3000}) },
|
||||
toastProcess: function(can, content, title, progress) {
|
||||
content = can.user.trans(can, content||""), content += can.user.trans(can, " process", "中...")
|
||||
return can.user.toast(can, {content: "🕑 "+content, title: title, duration: -1, progress: progress})
|
||||
},
|
||||
toastFailure: function(can, content, title) {
|
||||
content = can.user.trans(can, content||"")
|
||||
if (content.length < 8) { content += can.user.trans(can, " failure", "失败") }
|
||||
return can.user.toast(can, {content: "❌ "+content, title: title, duration: -1})
|
||||
},
|
||||
toastSuccess: function(can, content, title, duration) {
|
||||
content = can.user.trans(can, content||""), content += can.user.trans(can, " success", "成功")
|
||||
return can.user.toast(can, {content: "✅ "+content, title: title, duration: duration||1000})
|
||||
},
|
||||
toast: function(can, content, title, duration, progress, hash) { can = can._fields? can.sup: can
|
||||
var meta = can.base.isObject(content)? content: {content: content, title: title, duration: duration, progress: progress, hash: hash}
|
||||
meta.title = meta.title||can.core.Keys(can.ConfSpace(), can.ConfIndex())||can._name.split(nfs.PS).slice(-2).join(nfs.PS)
|
||||
// var list = can.core.Split(content, " ", " ")
|
||||
// content = can.core.List(list, function(text) { return can.user.trans(can, text) }).join("")
|
||||
if (meta.title == can.ConfIndex()) { meta.title = can.user.trans(can, meta.title, can.ConfHelp()) }
|
||||
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 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.Conf(ctx.INDEX)||can.ConfIndex(), meta.style, chat.FLOAT]], style: {width: width}, list: [
|
||||
{view: [wiki.TITLE, "", meta.title||""], title: "点击复制", onclick: function(event) { can.user.copy(event, can, meta.title) }},
|
||||
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: [
|
||||
{view: [html.TITLE, "", meta.title], title: "点击复制", onclick: function(event) { can.user.copy(event, can, meta.title) }},
|
||||
{view: [cli.CLOSE, "", can.page.unicode.close], title: "点击关闭", onclick: function() { action.close() }},
|
||||
{view: "duration", title: "点击关闭", onclick: function() { action.close() }},
|
||||
can.base.isObject(meta.content)? meta.content: {view: [[nfs.CONTENT, html.FLEX], "", meta.content||""]},
|
||||
html.ACTION, !can.base.isUndefined(meta.progress) && {view: "progress", style: {width: width-2*html.PLUGIN_PADDING}, list: [
|
||||
{view: "current", style: {width: (meta.progress||0)*(width-2*html.PLUGIN_PADDING-2)/100}},
|
||||
]},
|
||||
] }]); can.onengine.signal(can, chat.ONTOAST, can.request({}, {time: can.misc._time(), title: meta.title, content: meta.content}))
|
||||
meta.action.meta && can.core.Item(meta.action.meta, function(key, cb) { cb.help && can.core.Value(meta.action.meta, ["_trans", key], cb.help) })
|
||||
]}]
|
||||
);
|
||||
can.onengine.signal(can, chat.ONTOAST, can.request({}, {time: can.misc._time(), title: meta.title, content: meta.content}))
|
||||
// meta.action.meta && can.core.Item(meta.action.meta, function(key, cb) { cb.help && can.core.Value(meta.action.meta, ["_trans", key], cb.help) })
|
||||
var action = can.onappend._action(can, meta.action.list? meta.action.list.reverse(): meta.action, ui.action, {_trans: meta.action.meta? meta.action.meta._trans: {},
|
||||
_engine: function(event, button) {
|
||||
can.core.CallFunc(meta.action.meta? meta.action.meta[button]: meta.action, [event, button])
|
||||
action.close(event)
|
||||
},
|
||||
_engine: function(event, button) { can.core.CallFunc(meta.action.meta? meta.action.meta[button]: meta.action, [event, button]), action.close(event) },
|
||||
open: function(event) { meta.content.indexOf(ice.HTTP) == 0 && can.user.open(meta.content), meta.title.indexOf(ice.HTTP) == 0 && can.user.open(meta.title) },
|
||||
close: function(event) {
|
||||
event && event.isTrusted && can.onengine.signal(can, "onevent", can.request(event, {_type: "close"}))
|
||||
action.timer.stop = true, can.page.Remove(can, ui._target) },
|
||||
cancel: function(event) { action.timer.stop = true, can.page.Remove(can, ui._target) },
|
||||
close: function() {
|
||||
// event && event.isTrusted && can.onengine.signal(can, "onevent", can.request(event, {_type: "close"}))
|
||||
action.timer.stop = true, can.page.Remove(can, ui._target), delete(can.__toast)
|
||||
can._toast && (typeof can._toast.close == code.FUNCTION) && delete(can._toast)
|
||||
},
|
||||
cancel: function() { action.close() },
|
||||
timer: can.core.Timer({interval: 100, length: (meta.duration||1000)/100}, function(event, interval, index) {
|
||||
if (index > 30) { ui.duration.innerHTML = index/10+(index%10==0?".0":"")+"s..." }
|
||||
}, function() { can.page.style(can, ui._target, "margin-right", "-400px"), delete(can.__toast)
|
||||
can.onmotion.delay(can, function() { can.page.Remove(can, ui._target) }, 1000)
|
||||
}, function() {
|
||||
can.page.style(can, ui._target, "margin-right", "-400px")
|
||||
can.onmotion.delay(can, function() { action.close() }, 1000)
|
||||
}), _target: ui._target,
|
||||
}); can.onmotion.story.auto(can, ui._target)
|
||||
if (action._target.parentNode == document.body) {
|
||||
can.onmotion.delay(can, function() {
|
||||
can.page.style(can, action._target, html.TOP, (can.page.height() - action._target.offsetHeight)/4, html.LEFT, (can.page.width()-action._target.offsetWidth)/2)
|
||||
})
|
||||
}
|
||||
if (meta.action && meta.action.length == 1 && meta.action[0] === "") {
|
||||
can.page.Select(can, action._target, html.DIV_ACTION, function(target) { can.onmotion.hidden(can, target) })
|
||||
} can._toast && (typeof can._toast.close == code.FUNCTION && can._toast.close(), delete(can._toast))
|
||||
}
|
||||
if (action._target.parentNode == document.body) { can.onmotion.delay(can, function() {
|
||||
can.page.style(can, action._target, html.TOP, (can.page.height() - action._target.offsetHeight)/2, html.LEFT, (can.page.width()-action._target.offsetWidth)/2)
|
||||
}) }
|
||||
can._toast && (typeof can._toast.close == code.FUNCTION && can._toast.close(), delete(can._toast))
|
||||
can._root && can._root.Action && can._root.Action._toast && (can._root.Action._toast.scrollTop += 10000)
|
||||
if (meta.hash) { var list = can._root.Action._toastList = can._root.Action._toastList||{}
|
||||
list[meta.hash] && can.page.insertBefore(can, action._target, list[meta.hash]._target), can.__toast = action
|
||||
list[meta.hash] && (can.page.Remove(can, list[meta.hash]._target), list[meta.hash].close(), delete(list[meta.hash])), list[meta.hash] = action
|
||||
} else { can._toast = action } return action
|
||||
} else {
|
||||
can._toast = action
|
||||
}
|
||||
return action
|
||||
},
|
||||
space: function(can) { return can.Conf(web.SPACE)||can.Conf(ice.POD)||can.misc.Search(can, ice.POD) },
|
||||
template: function(can, file) { return can.base.MergeURL(can.base.Path(nfs.SRC_TEMPLATE, can.Conf(ctx.INDEX), file), ice.POD, can.user.space(can)) },
|
||||
@ -144,7 +185,7 @@ Volcanos("user", {
|
||||
}
|
||||
var input = can.page.Append(can, document.body, [{type: html.TEXTAREA, value: text}])._target
|
||||
can.onmotion.focus(can, input), document.execCommand("Copy"), can.page.Remove(can, input)
|
||||
return can.user.toastSuccess(can, text, "copy success"), can.misc.Log(nfs.COPY, text), text
|
||||
return can.user.toastSuccess(can, text, can.user.trans(can, "copy success", "复制成功")), can.misc.Log(nfs.COPY, text), text
|
||||
},
|
||||
carte: function(event, can, meta, list, cb, parent, trans) { var msg = can.request(event); event = msg._event
|
||||
function remove_sub(carte) { carte._sub && can.page.Remove(can, carte._sub._target), delete(carte._sub) } parent? remove_sub(parent): can.onmotion.clearCarte(can)
|
||||
@ -159,8 +200,7 @@ Volcanos("user", {
|
||||
}) }
|
||||
var isinput = can.page.tagis(event.target, html.INPUT)
|
||||
var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE,
|
||||
can.Conf(ctx.INDEX)||can.ConfIndex(), msg.Option(ctx.ACTION), meta._style||msg.Option("_style"),
|
||||
chat.FLOAT,
|
||||
can.Conf(ctx.INDEX)||can.ConfIndex(), msg.Option(ctx.ACTION), meta._style||msg.Option("_style"), chat.FLOAT,
|
||||
]], list: can.core.List(list, function(item, index) {
|
||||
if (typeof item == code.FUNCTION) { item = item(can); if (!item) { return } }
|
||||
if (item === "") { return {type: html.HR} }
|
||||
@ -175,7 +215,8 @@ Volcanos("user", {
|
||||
var _style = can.page.buttonStyle(can, item)
|
||||
return {
|
||||
view: [[html.ITEM, item, _style]],
|
||||
list: [can.page.icons(can, item), {text: can.user.trans(can, item, trans)}],
|
||||
// list: [can.page.icons(can, item), {text: [can.user.trans(can, item, trans), "", "name"]}],
|
||||
list: [{text: [can.user.trans(can, item, trans), "", "name"]}],
|
||||
onclick: function(event) { click(event, item, index) },
|
||||
onmouseenter: function(event) { remove_sub(carte) },
|
||||
}
|
||||
@ -185,8 +226,8 @@ Volcanos("user", {
|
||||
can.onimport && can.onimport[item[0]]? can.onimport[item[0]](can, button, event): click(event, button, index)
|
||||
}, carte, trans); carte._sub = sub }
|
||||
return {view: html.ITEM, list: [
|
||||
can.page.icons(can, item[0]),
|
||||
{text: can.user.trans(can, item[0], trans)},
|
||||
// can.page.icons(can, item[0]),
|
||||
{text: [can.user.trans(can, item[0], trans), "", "name"]},
|
||||
{text: [lex.SP+can.page.unicode.next, "", [html.ICON, "next"]]}
|
||||
], onmouseenter: subs, onclick: subs}
|
||||
}
|
||||
@ -205,39 +246,69 @@ Volcanos("user", {
|
||||
},
|
||||
input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() }
|
||||
event = event||{}; var msg = can.request(event); event = event._event||event; var need = {}
|
||||
var title = msg.Option(wiki.TITLE)||msg.Option(ctx.ACTION)
|
||||
var title = can.user.trans(can, msg.Option(ctx.ACTION))
|
||||
var ui = can.page.Append(can, document.body, [{view: [[html.INPUT, can.Conf(ctx.INDEX)||can.ConfIndex(), msg.Option(ctx.ACTION), msg.Option(mdb.TYPE), chat.FLOAT]], list: [
|
||||
{view: html.OPTION, list: [{type: html.TABLE, list: can.core.List(form, function(item) {
|
||||
item = can.base.isString(item)? {type: html.TEXT, name: item}: item.length > 0? {type: html.SELECT, name: item[0], values: item.slice(1)}: item
|
||||
item.type = item.type||(item.values? html.SELECT: item.name == html.TEXT? html.TEXTAREA: html.TEXT), need[item.name] = item.need
|
||||
item._init = function(target) {
|
||||
if (item.name && item.name != ctx.ACTION) { target.value = item.value||msg.Option(item.name)||can.Option(item.name)||target.value||"" }
|
||||
item.mode = chat.SIMPLE, can.onappend.figure(can, can.base.Copy({space: msg.Option(web.SPACE), run: function(event, cmds, cb) { var _msg = can.request(event, {_handle: ice.TRUE, action: msg.Option(html.ACTION)}, msg, can.Option())
|
||||
// item.mode = chat.SIMPLE,
|
||||
can.onappend.figure(can, can.base.Copy({space: msg.Option(web.SPACE), run: function(event, cmds, cb) { var _msg = can.request(event, {_handle: ice.TRUE, action: msg.Option(html.ACTION)}, msg, can.Option())
|
||||
can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { item.name && item.value && _msg.Option(item.name, item.value) }); (item.run||can.run)(event, cmds, cb, true)
|
||||
}, _enter: function(event) { return action.submit(event, can, html.SUBMIT), true }}, item), target)
|
||||
}, item.onkeydown = function(event) { if (event.key == code.ESCAPE) { event.target.blur() } }
|
||||
item.placeholder = can.user.trans(can, item.placeholder||item.name, null, html.INPUT)
|
||||
item.title = can.user.trans(can, item.title||item.placeholder||item.name, null, html.INPUT)
|
||||
// item.placeholder = can.user.trans(can, item.placeholder||item.name, null, html.INPUT)
|
||||
// item.title = can.user.trans(can, item.title||item.placeholder||item.name, null, html.INPUT)
|
||||
return {view: [[item.name, item.type, item.action], html.TR], list: [
|
||||
{type: html.TD, list: [{text: [can.user.trans(can, item.name||"", item._trans, html.INPUT), html.LABEL]}]}, {type: html.TD, list: [{text: item.need == "must"? "*": "", style: {color: cli.RED}}]},
|
||||
{type: html.TD, _init: function(target) { can.onappend.input(can, item, msg.Option(item.name), target) }},
|
||||
]}
|
||||
{type: html.TD, list: [
|
||||
{text: [can.user.trans(can, item.name||"", item._trans, html.INPUT), html.LABEL]},
|
||||
item.need == "must" && {text: ["*", "", "must"]},
|
||||
]}, {type: html.TD, list: []},
|
||||
{type: html.TD, _init: function(target) { can.onappend.input(can, item, msg.Option(item.name)||(can._msg? can._msg.Option(item.name): ""), target) }},
|
||||
], onclick: function(event) {
|
||||
can.page.Select(can, event.currentTarget, "input", function(target) { target.focus() })
|
||||
}}
|
||||
})}]}, html.ACTION,
|
||||
], onclick: function(event) { if (!can.page.tagis(event.target, html.INPUT, html.TEXTAREA)) { can.onmotion.clearCarte(can) } }}])
|
||||
var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, {
|
||||
_trans: {submit: msg.Option(web.SUBMIT)},
|
||||
focus: function() { can.onmotion.focus(can, can.page.Select(can, ui._target, html.INPUT_ARGS)[0]) },
|
||||
cancel: function(event) {
|
||||
can.onengine.signal(can, "onremove", can.request(event, {query: can.page.getquery(can, ui._target)}))
|
||||
can.page.Remove(can, ui._target) },
|
||||
focus: function(key) { can.onmotion.focus(can, can.page.Select(can, ui._target, key? "input.args[name="+key+"]": html.INPUT_ARGS)[0]) },
|
||||
Option: function(key, value, hidden) {
|
||||
if (!key) { var data = kit.Dict(msg.OptionSimple())
|
||||
can.page.Select(can, ui._target, "input.args", function(target) { data[target.name] = target.value })
|
||||
return data
|
||||
}
|
||||
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 (target.value && hidden) { can.onmotion.hidden(can, can.page.parentNode(can, target, html.TR)) }
|
||||
return target.value
|
||||
},
|
||||
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)
|
||||
} else {
|
||||
can.getActionSize(function(left, top, height) { can.page.style(can, ui._target, html.LEFT, left||0, html.TOP, (height/4||0)) })
|
||||
} can.onmotion.resize(can, ui._target)
|
||||
|
||||
},
|
||||
cancel: function(event, can, button) {
|
||||
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)
|
||||
},
|
||||
submit: function(event, can, button) { var args = [], data = {}, err = false
|
||||
var list = can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) {
|
||||
var list = can.page.Select(can, ui._target, html.OPTION_ARGS, function(item) {
|
||||
if (item.value == "" && need[item.name] == "must") { err = true, item.focus(), can.user.toast(can, item.name+" 是必选字段, 请重新输入") }
|
||||
return item.name && args.push(item.name, item.value||""), data[item.name] = item.value||""
|
||||
}); if (err) { return } can.onkeymap.prevent(event)
|
||||
var _msg = can.request(event); _msg.Option(ctx.ACTION, msg.Option(ctx.ACTION))
|
||||
_msg.Option("_toast", msg.Option("_toast"))
|
||||
can.core.CallFunc(cb, {event: can.request(event, {_handle: ice.TRUE})._event, button: button, data: data, list: list, args: args, input: action}) || action.cancel()
|
||||
var _msg = can.request(event); _msg.Option(ctx.ACTION, msg.Option(ctx.ACTION)), _msg.Option("_toast", msg.Option("_toast"))
|
||||
if (can.core.CallFunc(cb, {event: can.request(event, {_handle: ice.TRUE})._event, button: button, data: data, list: list, args: args, input: action})) {
|
||||
callback("afterInputs", button)
|
||||
} else {
|
||||
action.cancel(event, can, button)
|
||||
}
|
||||
}, _target: ui._target, _engine: function(event, can, button) { action.submit(event, can, button) },
|
||||
});
|
||||
can.page.Select(can, action._target, "input", function(target) {
|
||||
@ -245,11 +316,10 @@ Volcanos("user", {
|
||||
var onclick = target.onclick; target.onclick = function(event) { can.onengine.signal(can, "onevent", can.request(event, {_type: target.name})), onclick && onclick(event) }
|
||||
})
|
||||
title && can.page.Select(can, action._target, "input[name=submit]", function(target) { target.value = can.user.trans(can, title) })
|
||||
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, can.getHeaderHeight(can))
|
||||
} else {
|
||||
can.getActionSize(function(left, top, height) { can.page.style(can, ui._target, html.LEFT, left||0, html.TOP, (height/4||0)) })
|
||||
} can.onmotion.resize(can, ui._target), can.onmotion.delay(can, function() { action.focus() }, 300)
|
||||
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")
|
||||
// ui._target._layout = action.layout
|
||||
return button === true && action.submit(event, can, html.SUBMIT), action
|
||||
},
|
||||
select: function(event, can, type, fields, cb, cbs) {
|
||||
@ -260,12 +330,20 @@ Volcanos("user", {
|
||||
upload: function(event, can, cb, silent) { var begin = new Date()
|
||||
var ui = can.page.Append(can, document.body, [{view: [[html.UPLOAD, can.Conf(ctx.INDEX)||can.ConfIndex(), chat.FLOAT]], list: [
|
||||
html.ACTION, {view: html.OUTPUT, list: ["progress"]}, {view: html.STATUS, list: [html.SHOW, cli.COST, nfs.SIZE]},
|
||||
]}]); can.onlayout.figure(event, can, ui._target)
|
||||
]}])
|
||||
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, {
|
||||
begin: function() { begin = new Date()
|
||||
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
|
||||
can.runAction(event, html.UPLOAD, [], function(msg) { can.base.isFunc(cb)? cb(msg): can.Update(), action.close(), can.user.toastSuccess(can) })
|
||||
can.runAction(event, html.UPLOAD, [], function(msg) {
|
||||
if (msg.IsErr()) {
|
||||
action.close(), can.user.toastFailure(can, msg.Result())
|
||||
return
|
||||
}
|
||||
can.base.isFunc(cb)? cb(msg): can.Update(), action.close(), can.user.toastSuccess(can, "upload")
|
||||
})
|
||||
}, close: function(event) { can.page.Remove(can, ui._target) },
|
||||
show: function (event, value, total, loaded) {
|
||||
ui.cost.innerHTML = can.base.Duration(new Date() - begin)
|
||||
@ -294,7 +372,8 @@ Volcanos("user", {
|
||||
}), resize: html.IMG,
|
||||
}) },
|
||||
login: function(can, _cb, _msg) {
|
||||
can.misc.CookieSessid(can, ""), can.page.ClassList.add(can, document.body.parentNode, aaa.LOGIN), can.onimport.theme(can)
|
||||
can.misc.CookieSessid(can, ""), can.misc.Cookie(can, "sessid", "")
|
||||
can.page.ClassList.add(can, document.body.parentNode, aaa.LOGIN), can.onimport.theme(can)
|
||||
function check() {
|
||||
if (can.misc.CookieSessid(can) || can.user.info.sessid) { can.page.ClassList.del(can, document.body.parentNode, aaa.LOGIN), can.onimport.theme(can)
|
||||
can.onmotion.clearFloat(can), can.onmotion.delay(can, function() { socket._close = true, socket.close() })
|
||||
@ -305,13 +384,17 @@ Volcanos("user", {
|
||||
if (cmd == ice.MSG_SESSID) {
|
||||
if (!can.misc.CookieSessid(can, arg[0])) { can.user.info.sessid = arg[0] } check()
|
||||
} else if (cmd == cli.PWD) { if (check() || ui) { return } can._wss_name = can.ondaemon._list[0] = arg[0]
|
||||
var hassso = false
|
||||
var _list = [], list = {}; _msg.Table(function(value) { if (!value.order) { return }
|
||||
can.user.trans(can, kit.Dict(value.name, value.help))
|
||||
if (value.type == "oauth") { hassso = true }
|
||||
if (value.type == cli.QRCODE) {
|
||||
_list.push(value.name), list[value.name] = function(target) { can.page.Modify(can, target, arg[2]) }
|
||||
_list.push(value.name), list[value.name] = function(target) {
|
||||
can.user.isWeiXin || can.page.Modify(can, target, arg[2])
|
||||
}
|
||||
} else if (value.type == mdb.PLUGIN) {
|
||||
_list.push(value.name), list[value.name] = function(target) {
|
||||
can.onappend.plugin(can, {space: value.space, index: value.index, args: can.core.Split(value.args), height: html.QRCODE_HEIGHT, width: 420, style: html.OUTPUT}, function(sub) {
|
||||
can.onappend.plugin(can, {space: value.space, index: value.index, args: can.core.Split(value.args), height: html.IFRAME_HEIGHT, width: html.IFRAME_HEIGHT, style: html.OUTPUT}, function(sub) {
|
||||
var run = sub.run; sub.run = function(event, cmds, cb) { var msg = can.request(event, {space: arg[0]}); can.page.exportValue(can, msg), run(event, cmds, cb) }
|
||||
}, ui.output)
|
||||
}
|
||||
@ -319,13 +402,14 @@ Volcanos("user", {
|
||||
})
|
||||
var _cmd = "space login "+arg[0]
|
||||
ui = can.onappend.tabview(can, list, _list, can.page.Append(can, document.body, [{view: "input login float flex"}])._target)
|
||||
can.user.title(can.user.info.titles)
|
||||
can.page.Append(can, ui._target, [{view: [[html.DISPLAY, html.FLEX]], list: [
|
||||
{text: [can.user.trans(can, "or command login", "或命令行授权: "), html.LABEL]},
|
||||
{text: ["$ "+_cmd, "", html.ITEM], title: "点击复制,并后台执行此命令,即可登录", style: {cursor: "copy"}, onclick: function() { can.user.copy(event, can, _cmd) }},
|
||||
{text: [can.user.trans(can, "or oauth login", "或第三方授权: "), html.LABEL]},
|
||||
{view: [["sso", html.FLEX]], list: _msg.Table(function(value) {
|
||||
return value.type == "oauth" && {view: [[html.ITEM, html.FLEX]], title: "点击跳转,授权登录", list: [
|
||||
{img: can.misc.Resource(can, value.icons)}, {text: value.name},
|
||||
hassso && {text: [can.user.trans(can, "or oauth login", "或第三方授权: "), html.LABEL]},
|
||||
hassso && {view: [["sso", html.FLEX]], list: _msg.Table(function(value) {
|
||||
return value.type == "oauth" && {view: [[html.ITEM, value.name, html.FLEX]], title: value.link, list: [
|
||||
{img: can.misc.Resource(can, value.icons)}, {text: can.user.trans(can, value.name, value.help)},
|
||||
], onclick: function() {
|
||||
can.user.jumps(can.base.MergeURL(value.link, ice.BACK, location.href))
|
||||
}, _init: function(target) {
|
||||
@ -334,21 +418,26 @@ Volcanos("user", {
|
||||
}
|
||||
}}
|
||||
}) },
|
||||
// {text: [can.user.info.titles]},
|
||||
]}]), window.parent != window && window.innerHeight < 480 && can.onmotion.hidden(can, ui.output)
|
||||
can.page.style(can, ui._target, {left: (can.page.width()-ui._target.offsetWidth)/2, top: can.page.height() < 640? (can.page.height()-ui._target.offsetHeight)/2: (can.page.height()-ui._target.offsetHeight-html.HEADER_HEIGHT-html.ACTION_HEIGHT)/4+html.HEADER_HEIGHT})
|
||||
can.page.style(can, ui._target, {
|
||||
left: (can.page.width()-ui._target.offsetWidth)/2,
|
||||
top: can.user.isMobile? 20: can.page.height() < 480? (can.page.height()-ui._target.offsetHeight)/2: (can.page.height()-can.base.Min(ui._target.offsetHeight, html.IFRAME_HEIGHT)-html.HEADER_HEIGHT-html.ACTION_HEIGHT)/4+html.HEADER_HEIGHT,
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
logout: function(can) { can.user.toastConfirm(can, aaa.LOGOUT, "", function() { can.runAction({}, aaa.LOGOUT, [], function(msg) {
|
||||
can.misc.Cookie(can, "user_uid", "")
|
||||
can.misc.CookieSessid(can, ""), can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true)
|
||||
}) }) },
|
||||
header: function(can) { if (!can._root) { return } var header = can._root.Header
|
||||
var meta = {
|
||||
time: !can.user.isMobile && {view: [[html.ITEM, "state", mdb.TIME, html.FLEX]], _init: function(target) {
|
||||
can.onappend.figure(can, {action: "date", _hold: true}, target, function(sub, value) {})
|
||||
can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%H:%M:%S %w")) })
|
||||
can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%w %H:%M:%S")) })
|
||||
}},
|
||||
avatar: {view: [[html.ITEM, "state", aaa.AVATAR]], list: [{img: can.user.info.avatar}], onclick: function(event) { header && header.onaction.avatar(event, header) }},
|
||||
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
|
||||
|
@ -25,4 +25,4 @@ fieldset.Action.grid>div.project.toggle { display:none; }
|
||||
fieldset.Action>div.toggle.project { padding-top:50px; height:150px; top:30%; }
|
||||
body:not(.mobile) fieldset.Action>div.project.toggle { display:none; }
|
||||
body.mobile fieldset.Action>div.project.toggle { top:60%; }
|
||||
body.mobile fieldset.Action>div.action div.item { display:none; }
|
||||
// body.mobile fieldset.Action>div.action div.item { display:none; }
|
||||
|
@ -7,9 +7,10 @@ Volcanos(chat.ONIMPORT, {
|
||||
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.WORD && (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)
|
||||
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]) }
|
||||
@ -18,22 +19,22 @@ Volcanos(chat.ONIMPORT, {
|
||||
})
|
||||
}, function() { can.onaction.layout(can, list[3]), _select._tabs.click() })
|
||||
},
|
||||
_tabs: function(can, sub, meta) {
|
||||
var _init = true
|
||||
_tabs: function(can, sub, meta) { var _init = true
|
||||
var tabs = [{view: [[html.TABS, meta.name], "", can.user.trans(can, meta.name, meta.help)], title: meta.help, onclick: function(event) { can._current = sub
|
||||
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target)
|
||||
can.onmotion.select(can, can._action, html.DIV_ITEM, sub._tabs)
|
||||
can.onmotion.select(can, can._header_tabs, html.DIV_TABS, sub._header_tabs)
|
||||
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)
|
||||
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
|
||||
// can.onengine.signal(can, "onevent", can.request(_init? {target: event.target, type: "click", isTrusted: true}: event)), _init = false
|
||||
}, oncontextmenu: sub._legend.onclick}]; sub._header_tabs = can.page.Append(can, can._header_tabs, tabs)._target, sub._tabs = can.page.Append(can, can._action, tabs)._target
|
||||
},
|
||||
_menu: function(can, msg) { if (can.user.isMobile) { return }
|
||||
if (!can.user.isTechOrRoot(can)) { return }
|
||||
_menu: function(can, msg) { if (can.user.isMobile) { return } if (!can.user.isTechOrRoot(can)) { return }
|
||||
var target = can.setHeaderMenu(can.base.Obj(can.Conf(chat.MENUS)||msg.Option(chat.MENUS), can.onaction._menus), function(event, button, list) { list && can.core.CallFunc([can.onaction, list[0]], [can, button]) })
|
||||
can.onmotion.hidden(can, can._header_tabs = can.page.Append(can, target, ["_tabs"])._target)
|
||||
},
|
||||
@ -143,7 +144,7 @@ Volcanos(chat.ONLAYOUT, {
|
||||
Volcanos(chat.ONEXPORT, {
|
||||
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), msg.Option(html.WIDTH, can._output.offsetWidth)
|
||||
msg.Option(html.HEIGHT, can._output.offsetHeight||window.innerHeight), msg.Option(html.WIDTH, can._output.offsetWidth||window.innerWidth)
|
||||
msg.Option(html.MARGIN_Y, can.Conf(html.MARGIN_Y)), msg.Option(html.MARGIN_X, can.Conf(html.MARGIN_X))
|
||||
},
|
||||
layout: function(can) { return can._layout||can.onlayout._storage(can)||can.misc.SearchOrConf(can, html.LAYOUT)||"" },
|
||||
|
@ -1,9 +1,9 @@
|
||||
fieldset.Footer>div.output { font-style:italic; height:var(--footer-height); display:flex; }
|
||||
fieldset.Footer>div.output div.item { padding:7px; height:var(--footer-height); display:flex; align-items:center; }
|
||||
fieldset.Footer>div.output div.item.button { padding:7px 0; }
|
||||
fieldset.Footer>div.output div.title:first-child { margin-left:var(--header-height); }
|
||||
fieldset.Footer>div.output div.title:first-child { margin-left:var(--header-height); white-space:pre; }
|
||||
fieldset.Footer:not(.tabview)>div.output div.title:first-child { font-weight:bold; text-align:center; width:var(--river-width); }
|
||||
fieldset.Footer>div.output input[type=button] { background-color:transparent; color:var(--panel-fg-color); border:0; }
|
||||
fieldset.Footer>div.output input[type=button] { background-color:transparent; color:var(--panel-fg-color); font-style:italic; border:0; }
|
||||
fieldset.Footer>div.output div.toast { font-family:var(--status-font-family); line-height:18px; text-align:right; overflow:auto; flex-grow:1; justify-content:flex-end; }
|
||||
fieldset.Footer>div.output div.state { font-family:var(--status-font-family); line-height:18px; white-space:pre; }
|
||||
fieldset.Footer>div.output div.state label { font-size:var(--status-font-size); }
|
||||
@ -32,6 +32,8 @@ div.item:not(.string):not(.number):not(.boolean)>span.value { color:var(--disabl
|
||||
span.item:not(.string):not(.number):not(.boolean)>span.value { color:var(--disable-fg-color); font-style:italic; }
|
||||
fieldset.debug div.output table.content * { font-size:14px; }
|
||||
fieldset.debug span.path { color:silver; font-style:italic; }
|
||||
html.login body.width1 fieldset.Footer { display:none; }
|
||||
html.login body.width1 fieldset.Header { display:none; }
|
||||
body.dark fieldset.debug span.path { color:gray; }
|
||||
body.dark fieldset.debug span.target { color:gray; }
|
||||
body.dark div.item:not(.string):not(.number):not(.boolean)>span.value { color:gray; }
|
||||
|
@ -10,9 +10,11 @@ Volcanos(chat.ONIMPORT, {
|
||||
can.onimport._title(can, msg, target)
|
||||
can.onimport._storm(can, msg, target)
|
||||
can.core.List([
|
||||
{index: chat.TUTOR},
|
||||
{index: chat.FLOWS, value: "流程"},
|
||||
{index: chat.MESSAGE},
|
||||
// {index: chat.TUTOR},
|
||||
// {index: chat.FLOWS, value: "流程"},
|
||||
// {index: chat.MESSAGE},
|
||||
{index: web.SPIDE, value: can.user.trans(can, "spide", "服务")},
|
||||
{index: web.SPACE, value: can.user.trans(can, "space", "空间")},
|
||||
{index: cli.RUNTIME},
|
||||
{index: code.XTERM, args: [cli.SH]},
|
||||
], function(value) { value.type = html.BUTTON, value.name = value.index
|
||||
@ -65,7 +67,14 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
onsize: function(can) { can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth)
|
||||
can.onimport.value(can, html.HEIGHT, can.page.height()), can.onimport.value(can, html.WIDTH, can.page.width())
|
||||
},
|
||||
onlogin: function(can, msg) { can.run(can.request({}, {_method: http.GET}), [], function(msg) { can.onmotion.clear(can), can.onimport._init(can, msg, can._output) }) },
|
||||
onmain: function(can) {
|
||||
can.run(can.request({}, {_method: http.GET}), [], function(msg) {
|
||||
can.page.Appends(can, can._output, [{view: "item title", list: [{text: msg.Result()}]}])
|
||||
})
|
||||
},
|
||||
onlogin: function(can, msg) {
|
||||
can.run(can.request({}, {_method: http.GET}), [], function(msg) { can.onmotion.clear(can), can.onimport._init(can, msg, can._output) })
|
||||
},
|
||||
ontoast: function(can, msg) { can.core.CallFunc(can.onimport.ntip, {can: can, msg: msg}) },
|
||||
onremote: function(can, msg) { can.core.CallFunc(can.onimport.ncmd, {can: can, msg: msg}) },
|
||||
onunload: function(can) { can._wss && can._wss.close() },
|
||||
|
@ -6,11 +6,11 @@ fieldset.Header>div.output div.item.state { padding:13.5px 10px; float:right; }
|
||||
fieldset.Header>div.output div.item.layout>i { margin-left:var(--input-padding); }
|
||||
fieldset.Header>div.output div.item.layout:not(:hover)>i { visibility:hidden; }
|
||||
fieldset.Header>div.output div.item.layout { padding-right:0; }
|
||||
fieldset.Header>div.output div.item.theme { user-select:none; }
|
||||
fieldset.Header>div.output div.item.theme { white-space:pre; user-select:none; }
|
||||
fieldset.Header>div.output div.item.theme>i { margin-right:0; }
|
||||
fieldset.Header>div.output div.item.theme>i:last-child { color:var(--disable-fg-color); }
|
||||
fieldset.Header>div.output div.item.theme>i.bi-moon-stars:last-child { font-size:12px; }
|
||||
fieldset.Header>div.output div.item.language { user-select:none; }
|
||||
fieldset.Header>div.output div.item.language { white-space:pre; user-select:none; }
|
||||
fieldset.Header>div.output div.item.language>span:last-child { color:var(--disable-fg-color); }
|
||||
fieldset.Header>div.output div.item.usernick>i { margin-left:var(--input-padding); }
|
||||
fieldset.Header>div.output div.item.usernick:not(:hover)>i { visibility:hidden; }
|
||||
@ -45,6 +45,6 @@ body.width2>fieldset.Header>div.output>div.item.avatar { margin-right:var(--plug
|
||||
body.width2>fieldset.Header>div.output>div.item.theme { display:none; }
|
||||
body.width2>fieldset.Header>div.output>div.item.time { display:none; }
|
||||
body.width2>fieldset.Header:not(.all):not(.tabs)>div.output div.item.title:first-child img { margin-right:0; }
|
||||
body.width2>fieldset.Header:not(.all):not(.tabs)>div.output div.item.title:first-child span { display:none; }
|
||||
// body.width2>fieldset.Header:not(.all):not(.tabs)>div.output div.item.title:first-child span { display:none; }
|
||||
body.width2>fieldset.Footer:not(.all):not(.tabs)>div.output div.item.cmd { display:none; }
|
||||
body.width2>fieldset.Footer:not(.all):not(.tabs)>div.output div.item.title { display:none; }
|
||||
|
@ -4,7 +4,10 @@ Volcanos(chat.ONIMPORT, {
|
||||
can.onimport._avatar(can, msg, target), can.onimport._background(can, msg, target)
|
||||
},
|
||||
_title: function(can, msg, target) {
|
||||
can.core.List(can.base.getValid(can.Conf(chat.TITLE)||msg.result, [decodeURIComponent(can.misc.Search(can, ice.POD)||location.host),]), function(item) {
|
||||
can.core.List(can.base.getValid(can.Conf(chat.TITLE)||msg.result, [
|
||||
// can.user.title()||
|
||||
decodeURIComponent((window == top? can.user.info.titles: "")||can.misc.Search(can, ice.POD)||location.host)
|
||||
]), function(item) {
|
||||
can.page.Append(can, target, [{view: [[html.ITEM, chat.TITLE, html.FLEX]], list: [{img: can.misc.ResourceFavicon(can)}, {text: item}], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}])
|
||||
})
|
||||
},
|
||||
@ -72,8 +75,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
})
|
||||
Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
onsize: function(can) {
|
||||
can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth)
|
||||
can.onimport.theme(can)
|
||||
can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth), can.onimport.theme(can)
|
||||
},
|
||||
onmain: 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) {
|
||||
@ -86,34 +88,39 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
function show(msg) { var p = can.misc.Search(can, "redirect_uri")
|
||||
if (p && location.pathname == web.BASIC_LOGIN) { return location.replace(can.base.MergeURL(p, ice.MSG_SESSID, can.misc.CookieSessid(can))) }
|
||||
var p = can.misc.Search(can, ice.BACK); if (p && location.pathname == web.CHAT_SSO) { return location.reload() }
|
||||
can.user.info.usernick = can.Conf(aaa.USERNICK)
|
||||
can.user.info.username = msg.Option(ice.MSG_USERNAME)
|
||||
can.user.info.userrole = msg.Option(ice.MSG_USERROLE)
|
||||
can.user.info.nodetype = msg.Option(ice.MSG_NODETYPE)
|
||||
can.user.info.nodename = msg.Option(ice.MSG_NODENAME)
|
||||
can.user.info.userrole = msg.Option(ice.MSG_USERROLE)
|
||||
can.user.info.username = msg.Option(ice.MSG_USERNAME)
|
||||
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.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)
|
||||
// can.page.requireModules(can, [msg.Option("icon.lib")])
|
||||
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.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")||"")
|
||||
can.onaction._menus[3] = [aaa.LANGUAGE, ice.AUTO].concat(can.core.List(msg["language.list"], function(item) { return can.base.trimSuffix(item, nfs._JS) }))
|
||||
can.user.isMobile && (msg["theme.list"] = ["dark.css", "light.css"])
|
||||
can.onaction._menus[2] = [chat.THEME, ice.AUTO].concat(can.core.List(msg["theme.list"], function(item) { return can.base.trimSuffix(item, nfs._CSS) }))
|
||||
can.require(can.core.List(msg["theme.list"], function(item) { return nfs.SRC_TEMPLATE+web.CHAT_HEADER+"/theme/"+item }), function() {
|
||||
can.user.info.titles = msg.Option("titles")||document.title
|
||||
if (can.base.beginWith(location.pathname, nfs.WIKI_PORTAL, web.CHAT_CMD+web.WIKI_PORTAL, web.CHAT_CMD+web.CHAT_OAUTH_CLIENT)) { return show(msg) }
|
||||
if (location.pathname == nfs.PS && can.base.beginWith(msg.Option(ice.MAIN)||"", nfs.WIKI_PORTAL, web.CHAT_CMD+web.WIKI_PORTAL)) { return show(msg) }
|
||||
msg.Option(mdb.PLUGIN) && can.onappend.plugin(can, {index: msg.Option(mdb.PLUGIN)}, function(sub) { can.onmotion.hidden(can, sub._target) }, document.body)
|
||||
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)) || can.misc.Search(can, web.SHARE)
|
||||
|| tool && can.base.isIn(tool[0]._command, 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)
|
||||
if (can.Conf(aaa.USERNICK, (msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME)).slice(0, 8))
|
||||
|| 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)
|
||||
})
|
||||
})
|
||||
},
|
||||
@ -134,7 +141,8 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
can.user.jumps(can.misc.MergeURL(can, args, true))
|
||||
},
|
||||
avatar: function(event, can) { if (can.user.isMobile) { return can.onaction.usernick(event, can) }
|
||||
var src = can.onexport.avatar(can); can.onaction.carte(can.request(event, {_style: "header avatar"}), can, ["<img src='"+src+"'>"]) },
|
||||
var src = can.onexport.avatar(can); can.onaction.carte(can.request(event, {_style: "header avatar"}), can, ["<img src='"+src+"'>"])
|
||||
},
|
||||
usernick: function(event, can) { can.onaction.carte(can.request(event, {_style: "header usernick"}), can, can.onaction._menus) },
|
||||
shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN, mdb.NAME, can.user.title()]) },
|
||||
theme: function(event, can) { can.page.Select(can, can._output, "div.item.theme>i:first-child", function(target) {
|
||||
@ -185,9 +193,9 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
})
|
||||
Volcanos(chat.ONEXPORT, {
|
||||
language: function(can) { return can.user.info.language },
|
||||
avatar: function(can) { return can.user.info.avatar == "void"? "": can.user.info.avatar },
|
||||
avatar: function(can) { return can.misc.Resource(can, can.user.info.avatar == "void"? "": can.user.info.avatar) },
|
||||
background: function(can) { return can.user.info.background == "void"? "": can.user.info.background },
|
||||
theme: function(can) { return can._theme || can.misc.SearchOrConf(can, chat.THEME) || can.__theme || (can.base.isNight()? html.DARK: html.LIGHT) },
|
||||
theme: function(can) { return can._theme || can.misc.SearchOrConf(can, chat.THEME) || can.__theme || "" },
|
||||
height: function(can) { return can._target.offsetHeight },
|
||||
})
|
||||
Volcanos(chat.ONPLUGIN, {
|
||||
|
@ -141,18 +141,23 @@ Volcanos(chat.ONEXPORT, {
|
||||
})
|
||||
Volcanos(chat.ONENGINE, {
|
||||
_engine: function(event, can, msg, panel, cmds, cb) {
|
||||
function right(role) { if (!role || role == aaa.VOID) { return true }
|
||||
return can.core.List(can.core.Split(can.user.info.userrole||aaa.VOID), function(userrole) {
|
||||
if (can.base.isIn(userrole, role, aaa.TECH, aaa.ROOT)) { return true }
|
||||
}).length > 0
|
||||
}
|
||||
if (typeof can.river == code.FUNCTION) { can.river = can.river(can) } var list = can.river
|
||||
cmds.length == 0 && can.core.ItemOrder(list, mdb.ORDER, function(key, value) { if (!value) { return }
|
||||
if (value.debug && can.misc.Search(can, ice.MSG_DEBUG) != ice.TRUE) { return }
|
||||
if (value.nodetype && value.nodetype != can.user.info.nodetype) { return }
|
||||
if (can.base.isIn(can.user.info.userrole, value.type||aaa.VOID, aaa.TECH, aaa.ROOT)) {
|
||||
if (right(value.type)) {
|
||||
can.core.Item(value.storm).length > 0 && msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name, icon: value.icon||"", main: value.main||false})
|
||||
}
|
||||
})
|
||||
if (cmds.length != 1 && cmds[1] != chat.STORM) { return false } var river = list[cmds[0]]; if (!river) { return false }
|
||||
can.core.ItemOrder(river.storm, mdb.ORDER, function(key, value) { if (!value) { return }
|
||||
if (value.nodetype && value.nodetype != can.user.info.nodetype) { return }
|
||||
if (can.base.isIn(can.user.info.userrole, value.type||aaa.VOID, aaa.TECH, aaa.ROOT)) {
|
||||
if (right(value.type)) {
|
||||
msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name||(can.user.trans(can, key)+" "+key), icon: value.icon||icon[key]||"", main: value.main||false})
|
||||
}
|
||||
}), can.base.isFunc(cb) && cb(msg); return true
|
||||
|
@ -2,7 +2,10 @@ Volcanos(chat.ONACTION, {
|
||||
run: function(event, can) { can.run(can.request(event, {_method: http.POST})) }, refresh: function(event, can) { can.run(can.request(event, {_method: http.GET})) },
|
||||
list: function(event, can) { can.sup.isSimpleMode() || can.run(can.request(event, {_toast: event.isTrusted? ice.PROCESS: "" , _method: http.GET})) }, back: function(event, can) { can.sup.onimport.back(event, can.sup) },
|
||||
onclick: function(event, can) { can.Conf(mdb.TYPE) == html.BUTTON && can.run(event, [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())), can.onkeymap.prevent(event) },
|
||||
onchange: function(event, can) { can.Conf(mdb.TYPE) == html.SELECT && can.run(event) },
|
||||
onchange: function(event, can) { if (can.Conf(mdb.TYPE) != html.SELECT) { return }
|
||||
can.sup.onexport.session && can.sup.onexport.session(can.sup, "action:"+can.Conf(mdb.NAME), event.target.value)
|
||||
can.run(can.request(event, {_toast: event.isTrusted? can.user.trans(can, ice.PROCESS, "处理"): "" , _method: http.GET}))
|
||||
},
|
||||
onkeydown: function(event, can) { can.onkeymap.input(event, can, event.target); if (can.Conf(mdb.TYPE) == html.TEXTAREA && !event.ctrlKey) { return }
|
||||
if (event.key == code.ENTER) { return can.onkeymap.prevent(event), can.run(event), can.onmotion.focus(can, event.target) }
|
||||
if (!event.ctrlKey) { return } switch (event.key) {
|
||||
|
@ -16,16 +16,24 @@ Volcanos(chat.ONFIGURE, {date: {
|
||||
var ui = can.page.Append(can, can._action, ["time", "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
|
||||
can.page.Append(can, can._output, [{text: "请先选择时间,再选择日期"}])
|
||||
target.value == "" && (now.setMinutes(now.getMinutes()>30? 30: 0), now.setSeconds(0))
|
||||
function show(now) { can.Action(YEAR, now.getFullYear()), can.Action(MONTH, now.getMonth()+1)
|
||||
can.Action(HOUR, now.getHours()), can.Action(MINUTE, parseInt(now.getMinutes()/5)*5), can.Action(SECOND, parseInt(now.getSeconds()/5)*5)
|
||||
can.page.Appends(can, can._table, can.date.List(can, function(event, day) { day.setHours(now.getHours()), day.setMinutes(now.getMinutes()), day.getSeconds(now.getSeconds()), _cb(day), can.close() }, now))
|
||||
can.Action(HOUR, now.getHours()), can.Action(MINUTE, parseInt(now.getMinutes()/30)*30), can.Action(SECOND, 0)
|
||||
can.page.Appends(can, can._table, can.date.List(can, function(event, day) {
|
||||
day.setHours(can.Action(HOUR)), day.setMinutes(can.Action(MINUTE)), day.getSeconds(can.Action(SECOND)), _cb(day), can.close()
|
||||
}, now))
|
||||
var l = can.date.solar2lunar(now); can.page.Appends(can, can._status, [{view: "today", inner: [l.gzYear, l.Animal+"年", l.cnMonth, l.cnDay, l.lunarFestival||l.festival||l.Term, l.Astro].join(lex.SP)}])
|
||||
return now
|
||||
} show(now), can._show = function(d) { d? _cb(show(now = new Date(now.getTime()+d*24*3600*1000))): _cb(show(now)) }
|
||||
})},
|
||||
onfocus: function(event, can, meta, target, cbs, mod) {
|
||||
if (target._selectonly) { can.onmotion.delay(can, function() { target.blur() }) }
|
||||
},
|
||||
onblur: function(event, can, sub, cb, target) {
|
||||
if (target._selectonly) { return }
|
||||
},
|
||||
onkeydown: function(event, can, meta, cb, target, sub, last) { if (sub && sub.hidden()) { return last(event) } switch (event.key) {
|
||||
case "n": can.page.SelectInput(can, sub._action, mdb.NEXT, function(target) { target.click(), sub._show() }); break
|
||||
case "p": can.page.SelectInput(can, sub._action, mdb.PREV, function(target) { target.click(), sub._show() }); break
|
||||
|
@ -1,10 +1,10 @@
|
||||
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}]) }
|
||||
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,
|
||||
|
@ -7,10 +7,24 @@ Volcanos(chat.ONFIGURE, {key: {
|
||||
can._show(can, msg, cb, target, name)
|
||||
})
|
||||
},
|
||||
_show: function(can, msg, cb, target, name) { msg.Option(ice.TABLE_CHECKBOX, "")
|
||||
_show: function(can, msg, cb, target, name) {
|
||||
// msg.Option(ice.TABLE_CHECKBOX, "")
|
||||
if (msg.Option(ice.TABLE_CHECKBOX) == ice.TRUE) { target._hold = true
|
||||
can.onappend._action(can, [html.CANCEL, html.CONFIRM, msg.Length() > 5? html.FILTER: ""], can._action, {
|
||||
cancel: function() { can.onmotion.focus(can, target), can.onmotion.hidden(can, can._target) },
|
||||
confirm: function() { var list = msg.Table()
|
||||
can.base.isFunc(cb) && cb(can, can.page.Select(can, can._output, html.TR, function(target) {
|
||||
if (can.page.ClassList.has(can, target, html.SELECT)) {
|
||||
return list[target.dataset.index][msg.append[0]]
|
||||
}
|
||||
}).join(","), target.value)
|
||||
can.onmotion.focus(can, target), can.onmotion.hidden(can, can._target)
|
||||
},
|
||||
})
|
||||
}
|
||||
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, msg, function(value, key, index, item) { value = item[key]
|
||||
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))
|
||||
@ -20,7 +34,7 @@ Volcanos(chat.ONFIGURE, {key: {
|
||||
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)
|
||||
@ -33,22 +47,29 @@ Volcanos(chat.ONFIGURE, {key: {
|
||||
target.value = value, can.onmotion.hidden(can, can._target)
|
||||
}
|
||||
can.core.CallFunc([can.oninputs, "_show"], {event: event, can: can, msg: msg, target: target, name: name})
|
||||
var style = msg.Option(ice.MSG_DISPLAY)? can.base.ParseURL(msg.Option(ice.MSG_DISPLAY)).style||name: name
|
||||
can.core.CallFunc([can.sup.sub, "oninputs", style], {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] }
|
||||
display.style && can.core.CallFunc([can.sup.sub, "oninputs", display.style], {event: event, can: can, msg: msg, target: target, name: display.name||name, title: display.title})
|
||||
can.layout(msg)
|
||||
},
|
||||
onfocus: function(event, can, meta, target, cbs, mod) {
|
||||
can.onengine.signal(can, "onevent", can.request(event));
|
||||
meta._force && mod.onclick(event, can, meta, target, cbs) },
|
||||
// can.onengine.signal(can, "onevent", can.request(event));
|
||||
if (target._selectonly) { can.onmotion.delay(can, function() { target.blur() }) }
|
||||
meta._force && mod.onclick(event, can, meta, target, cbs)
|
||||
},
|
||||
onclick: function(event, can, meta, target, cbs) {
|
||||
can.onengine.signal(can, "onevent", can.request(event));
|
||||
(target.value == "" || meta._force) && cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return }
|
||||
// can.onengine.signal(can, "onevent", can.request(event));
|
||||
if (target._selectonly) { can.onmotion.delay(can, function() { target.blur() }) }
|
||||
(target.value == "" || meta._force || target._selectonly) && cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return }
|
||||
sub.sup = can._fields? can.sup: can
|
||||
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) {
|
||||
can.onengine.signal(can, "onevent", can.request(event, {query: can.page.getquery(can, target)+","+target.value}));
|
||||
sub && can.onmotion.delay(can, sub.close, 300) },
|
||||
if (target._hold) { return }
|
||||
if (target._selectonly) { return }
|
||||
// can.onengine.signal(can, "onevent", can.request(event, {query: can.page.getquery(can, target)+","+target.value}))
|
||||
sub && can.onmotion.delay(can, sub.close, 300)
|
||||
},
|
||||
onkeyup: function(event, can, meta, cb, target, sub, last) { if (event.key == code.TAB) { return }
|
||||
if (event.key == code.ENTER) { return meta._enter && (!can.page.tagis(event.target, html.TEXTAREA) || event.ctrlKey) && meta._enter(event, target.value)? sub && sub.close(): last(event) }
|
||||
if (!sub) { return } can.onmotion.toggle(can, sub._target, true)
|
||||
|
@ -1,7 +1,9 @@
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.db.current = msg.TableDetail()
|
||||
can.ui.target = can.page.Appends(can, can._output, [{type: html.IFRAME, src: can.db.current.link, height: can.ConfHeight(), width: can.ConfWidth()}])._target
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) { can.db.current = msg.TableDetail()
|
||||
// can.Conf("_width") && can.sup.onimport.size(can.sup, can.Conf("_height"), can.Conf("_width"), false)
|
||||
can.page.style(can, can._output, "overflow-y", html.HIDDEN)
|
||||
can.sup.onexport.link = function() { return can.db.current.link }
|
||||
can.ui.target = can.page.Appends(can, can._output, [{type: html.IFRAME, src: can.db.current.link, height: can.ConfHeight(), width: can.ConfWidth()}])._target
|
||||
can.sup.onexport.link = function() { return can.base.beginWith(can.db.current.link, "/")? location.origin+can.db.current.link: can.db.current.link }
|
||||
},
|
||||
layout: function(can) {
|
||||
var item = can.db.current; can.sup.onexport.title(can, item.name||item.link.split(mdb.QS)[0])
|
||||
|
@ -1,3 +1,4 @@
|
||||
fieldset.inner>div.output div.content { position:relative; }
|
||||
fieldset.inner>div.output div.content td.text { height:var(--code-line-height); }
|
||||
fieldset.inner>div.output div.content td.text span.keyword { color:var(--code-keyword); box-shadow:var(--keyword-box-shadow); }
|
||||
fieldset.inner>div.output div.content td.text span.comment { color:var(--code-comment); }
|
||||
@ -34,6 +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 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; }
|
||||
@ -51,7 +54,7 @@ fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.avatar { padding:
|
||||
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.qrcode i { margin-top:3px; }
|
||||
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.avatar>img { height:32px; clip-path:circle(40%); }
|
||||
fieldset.inner.cmd>div.output>div.layout>div.path:not(.hide) { display:flex; }
|
||||
fieldset.inner.cmd>div.output>div.layout>div.plug { box-shadow:var(--th-box-shadow); height:var(--action-height); overflow:auto; }
|
||||
fieldset.inner.cmd>div.output>div.layout>div.plug { box-shadow:var(--th-box-shadow); background-color:var(--plugin-bg-color); height:var(--action-height); overflow:auto; }
|
||||
fieldset.inner.cmd>div.output>div.layout>div.plug>legend { padding:0 var(--input-padding); padding-right:0; margin-right:0; float:right; }
|
||||
fieldset.inner.cmd>div.output>div.layout>div.plug>legend:hover { box-shadow:var(--notice-box-shadow); }
|
||||
fieldset.inner.cmd>div.output>div.layout>div.plug>legend>span.remove { padding:0 var(--input-padding); }
|
||||
@ -81,6 +84,12 @@ tr.line>td.text { white-space:pre; line-height:var(--code-line-height); padding-
|
||||
tr.line:hover { background-color:var(--hover-bg-color); }
|
||||
tr.line.delete { background-color:#3c2626; }
|
||||
tr.line.insert { background-color:#283e2d; }
|
||||
body div.input.inner.find.float div.action>div.item {
|
||||
float:left;
|
||||
}
|
||||
body div.input.inner.find.float div.action>div.item>input {
|
||||
min-width:unset;
|
||||
}
|
||||
body.light tr.line.delete { background-color:#ffeef0; }
|
||||
body.light tr.line.insert { background-color:#e6ffed; }
|
||||
body.white tr.line.delete { background-color:#e6ffed; }
|
||||
|
@ -5,7 +5,11 @@ const CURRENT_FILE = "web.code.inner:currentFile", SELECT_LINE = "selectLine"
|
||||
const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove", LINE_SELECT = "tabview.line.select"
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg, cb) { can.onappend.style(can, code.INNER), can.Mode(msg.Option("mode")||can.Mode())
|
||||
if (can.Mode() == ice.MSG_RESULT) { msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE), can.sup.Mode(chat.SIMPLE) }
|
||||
if (can.Mode() == ice.MSG_RESULT) {
|
||||
can.Conf("_width", can.base.Max(can.ConfWidth(), window.innerWidth-12))
|
||||
msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE), can.sup.Mode(chat.SIMPLE)
|
||||
can.Option(nfs.FILE, can.Conf(nfs.FILE)||can.Option(nfs.FILE))
|
||||
}
|
||||
can.onmotion.clear(can, can._output), msg.result = msg.result||[""]
|
||||
var paths = can.core.Split(can.Option(nfs.PATH)); can.Option(nfs.PATH, paths[0])
|
||||
can.core.List([nfs.PATH, nfs.FILE, nfs.LINE], function(key) { msg.Option(key) && can.Option(key, msg.Option(key)) })
|
||||
@ -135,6 +139,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
})
|
||||
}
|
||||
function load(msg) { can.db.tabview[key] = msg; var name = file
|
||||
msg.result = msg.result||[""]
|
||||
if (can.base.beginWith(file, web.HTTP)) { name = decodeURI(file.split(web.QS)[0])
|
||||
var link = can.misc.ParseURL(can, name); if (link.pod) { name = link.pod }
|
||||
name = can.base.trimPrefix(name, location.origin)
|
||||
@ -182,10 +187,10 @@ Volcanos(chat.ONIMPORT, {
|
||||
can.onimport.process(can, msg, can.ui.profile, height, width-border, function(sub) {
|
||||
_msg._profile_plugin = sub
|
||||
can.ui.profile._plugin = sub, can.page.style(can, sub._output, html.MAX_WIDTH, "")
|
||||
sub.onaction.close = function() {
|
||||
can._msg._profile_hidden = true
|
||||
can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), ""),
|
||||
can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) }
|
||||
sub.onaction.close = function() { can._msg._profile_hidden = true
|
||||
can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), "")
|
||||
can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can)
|
||||
}
|
||||
sub.Conf(ctx.ARGS) && can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), JSON.stringify(sub.Conf(ctx.ARGS)))
|
||||
can.page.style(can, can.ui.profile, html.WIDTH, width+border, html.MAX_WIDTH, width+border), can.onimport.layout(can)
|
||||
})
|
||||
@ -200,7 +205,9 @@ Volcanos(chat.ONIMPORT, {
|
||||
},
|
||||
process: function(can, msg, target, height, width, cb) { can.onmotion.clear(can, target)
|
||||
if (msg.Option(ice.MSG_PROCESS) == ice.PROCESS_FIELD) {
|
||||
msg.Table(function(item) { item.type = chat.STORY, item.height = height, item.width = width, item.display = msg.Option(ice.MSG_DISPLAY)
|
||||
msg.Table(function(item) { item.type = chat.STORY, item.height = height, item.width = width
|
||||
item.display = msg.Option(ice.MSG_DISPLAY)
|
||||
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.onaction.close = function() { can.onmotion.hidden(can, target), can.onimport.layout(can) }
|
||||
@ -219,7 +226,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
}} }, 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, true), can.onmotion.delay(can, function() { can.onimport.layout(can), can.user.toastSuccess(can) }, 0)
|
||||
} return can.onmotion.toggle(can, target, true), can.onimport.layout(can)
|
||||
},
|
||||
toolkit: function(can, meta, cb) { can.base.isString(meta) && (meta = {index: meta})
|
||||
var key = [meta.index].concat(meta.args).join(","), sub = can.db.toolkit[key]; if (sub) { sub.select(); return }
|
||||
@ -254,7 +261,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
})
|
||||
}) },
|
||||
layout: function(can) {
|
||||
if (can.Conf(ctx.STYLE) == html.OUTPUT) { return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) }
|
||||
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.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())) }
|
||||
@ -349,7 +356,7 @@ Volcanos(chat.ONSYNTAX, {
|
||||
can.onmotion.delay(can, function() { can.onappend.scroll(can) })
|
||||
}
|
||||
can.require([chat.PLUGIN_LOCAL+"code/inner/syntax.js"], function() { var parse = can.onexport.parse(can); can.Conf(chat.PLUG) && (can.onsyntax[parse] = can.Conf(chat.PLUG))
|
||||
var p = can.onsyntax[parse]; !p? can.runAction({}, mdb.PLUGIN, [parse, msg.Option(nfs.FILE), msg.Option(nfs.PATH)], function(msg) { p = can.base.Obj(msg.Result())
|
||||
var p = can.onsyntax[parse]; !p && msg.Option(nfs.FILE)? can.runAction({}, mdb.PLUGIN, [parse, msg.Option(nfs.FILE), msg.Option(nfs.PATH)], function(msg) { p = can.base.Obj(msg.Result())
|
||||
p && p.script? can.require([p.script], function() { show(can.onsyntax[msg.Option(lex.PARSE)||parse]) }): show(can.onsyntax[parse] = p)
|
||||
}): show(p)
|
||||
})
|
||||
@ -457,19 +464,18 @@ Volcanos(chat.ONACTION, {
|
||||
(span == event.target || span.innerText == value) && can.runAction(can.request(event, {name: value, text: can.current.text(), offset: offset-1}, can.Option()), code.NAVIGATE, [], function(msg) {
|
||||
msg.Append(nfs.FILE)? can.onimport.tabview(can, msg.Append(nfs.PATH), msg.Append(nfs.FILE), msg.Append(nfs.LINE)): can.user.toastFailure(can, "not found "+value)
|
||||
})
|
||||
}), can.page.Select(can, tr, "td.text", function(td) { offset += td.innerText.length+1 })
|
||||
}) },
|
||||
show: function(event, can) { can._msg._profile_hidden = false, can.runAction(can.request(event, {_toast: "渲染中...", args: can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.RENDER, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.profile(can, msg) }) },
|
||||
exec: function(event, can) { can.runAction(can.request(event, {_toast: "执行中...", args: can.onexport.session(can, DISPLAY_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.ENGINE, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) }) },
|
||||
plug: function(event, can, button) {
|
||||
function show(index, args) { input.cancel(); can.onimport.toolkit(can, {index: index, args: can.core.Split(args||"")}, function(sub) { sub.select() }) }
|
||||
}), can.page.Select(can, tr, "td.text", function(td) { offset += td.innerText.length+1 }) }) },
|
||||
show: function(event, can) { can._msg._profile_hidden = false, can.runAction(can.request(event, {_toast: "渲染", args: can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.RENDER, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.profile(can, msg) }) },
|
||||
exec: function(event, can) { can.runAction(can.request(event, {_toast: "执行", args: can.onexport.session(can, DISPLAY_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.ENGINE, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) }) },
|
||||
plug: function(event, can, button) {
|
||||
function show(index, args) { input.cancel({}, can, "cancel"); can.onimport.toolkit(can, {index: index, args: can.core.Split(args||"")}, function(sub) { sub.select() }) }
|
||||
var input = can.user.input(can.request(event, {type: button}), can, [{type: html.TEXT, name: ctx.INDEX, run: function(event, cmds, cb) { can.run(event, cmds, function(msg) {
|
||||
if (cmds[0] == ctx.ACTION && cmds[1] == mdb.INPUTS && cmds[2] == ctx.INDEX) { var _msg = can.request({})
|
||||
can.core.Item(can.db.toolkit, function(index) { _msg.Push(ctx.INDEX, index) }), _msg.Push(ctx.INDEX, ""), _msg.Copy(msg), cb(_msg)
|
||||
} else { cb(msg) }
|
||||
}, true) }}, ctx.ARGS], function(list) { show(list[0], list[1]) })
|
||||
},
|
||||
open: function(event, can, button) {
|
||||
},
|
||||
open: function(event, can, button) {
|
||||
console.log(new Error())
|
||||
var left = can._output.offsetWidth/4, width = can._output.offsetWidth/2; if (can.user.isMobile) { left = 0, width = can.page.width()-40 }
|
||||
var input = can.user.input(can.request(event, {type: button}), can, [{name: nfs.FILE, style: {width: width}, _force: true, select: function(item) { input.submit(event, can, web.SUBMIT) }, run: function(event, cmds, cb) {
|
||||
@ -480,7 +486,7 @@ open: function(event, can, button) {
|
||||
can.core.Item(can.onengine.plugin.meta, function(key, value) { push(ctx.INDEX, "can."+key) }), cb(_msg)
|
||||
} else { cb(msg) }
|
||||
}, true)
|
||||
}}], function(list, input) { input.cancel(); var ls = can.core.Split(list[0], nfs.DF, nfs.DF); switch (ls[0]) {
|
||||
}}], function(list, input) { input.cancel({}, can, "cancel"); var ls = can.core.Split(list[0], nfs.DF, nfs.DF); switch (ls[0]) {
|
||||
case web.HTTP: return can.onimport.tabview(can, "", list[0], web.SPACE)
|
||||
case nfs.LINE: return can.onaction.selectLine(can, parseInt(ls[1]), true)
|
||||
case web.SPACE: return can.onimport.tabview(can, "", ls[1].indexOf(web.HTTP) == 0? list[0].slice(6): ls[1], web.SPACE)
|
||||
@ -490,8 +496,8 @@ open: function(event, can, button) {
|
||||
default: var ls = can.onexport.split(can, list[0]); can.onimport.tabview(can, ls[0], ls[1])
|
||||
} }); can.page.Modify(can, input._target, {className: "input inner open float"})
|
||||
can.page.style(can, input._target, html.LEFT, left, html.TOP, can._output.offsetHeight/4, html.RIGHT, "")
|
||||
},
|
||||
find: function(event, can) { var last = can.onexport.line(can, can.current.line)
|
||||
},
|
||||
find: function(event, can) { var last = can.onexport.line(can, can.current.line)
|
||||
var ui = can.page.Append(can, can._output, [{view: "input inner find float", list: [html.ACTION, html.OUTPUT],
|
||||
style: {left: can.ui.project.offsetWidth+can._output.offsetWidth/4-34, top: can._output.offsetHeight/2-60}}]); can.onmotion.move(can, ui._target)
|
||||
function find(begin, text) { for (begin; begin <= can.ui.content._max; begin++) { if (can.onexport.text(can, can.onaction._getLine(can, begin)).indexOf(text) > -1) {
|
||||
@ -529,13 +535,13 @@ find: function(event, can) { var last = can.onexport.line(can, can.current.line)
|
||||
can.current.text(text.replace(from.value, to.value)), can.current.text().indexOf(from.value) == -1, find(last+1, from.value)
|
||||
}, close: function() { can.page.Remove(can, ui._target) },
|
||||
})
|
||||
},
|
||||
clear: function(event, can) { if (can.onmotion.clearFloat(can)) { return }
|
||||
},
|
||||
clear: function(event, can) { if (can.onmotion.clearFloat(can)) { return }
|
||||
if (can.page.Select(can, document.body, "div.vimer.find.float", function(target) { return can.page.Remove(can, target) }).length > 0) { return }
|
||||
if (can.page.Select(can, can.ui.plug, "legend.select", function(target) { return target.click(), target }).length > 0) { return }
|
||||
if (can.page.isDisplay(can.ui.display)) { return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) }
|
||||
if (can.page.isDisplay(can.ui.profile)) { return can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) }
|
||||
},
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONEXPORT, {
|
||||
path: function(can) { return can.Option(nfs.PATH)+can.Option(nfs.FILE) },
|
||||
@ -545,7 +551,7 @@ Volcanos(chat.ONEXPORT, {
|
||||
keys: function(can, path, file) { return [path||can.Option(nfs.PATH), file||can.Option(nfs.FILE)].join(nfs.DF) },
|
||||
content: function(can) { var block = "()[]{}", deep = 0, parse = can.onexport.parse(can)
|
||||
return can.page.Select(can, can.current&&can.current.content||can.ui.content, "td.text", function(item) { var text = item.innerText.trimEnd()
|
||||
if (parse == "js" && !can.base.beginWith(text, block[0])) { var list = []
|
||||
if (can.base.isIn(parse, nfs.JS, nfs.CSS, nfs.JSON) && !can.base.beginWith(text, block[0])) { var list = []
|
||||
for (var i = 0; i < text.length; i++) {
|
||||
for (var j = 0; j < block.length; j += 2) {
|
||||
if (text[i] == block[j]) {
|
||||
@ -574,7 +580,9 @@ Volcanos(chat.ONEXPORT, {
|
||||
selection: function(can, str) { var s = document.getSelection().toString(), begin = str.indexOf(s), end = begin+s.length
|
||||
for (var i = begin; i >= 0; i--) { if (str[i].match(/[a-zA-Z0-9_.]/)) { s = str.slice(i, end) } else { break } } return s
|
||||
},
|
||||
parse: function(can) { return can._msg.Option(lex.PARSE)||can.base.Ext(can.Option(nfs.FILE)) },
|
||||
parse: function(can) {
|
||||
return can._msg.Option(lex.PARSE)||can.base.Ext(can.Option(nfs.FILE))
|
||||
},
|
||||
split: function(can, file) { var ls = file.split(nfs.PS); if (ls.length == 1) { return [nfs.PWD, ls[0]] }
|
||||
if (ls[0] == ice.USR) { return [ls.slice(0, 2).join(nfs.PS)+nfs.PS, ls.slice(2).join(nfs.PS)] }
|
||||
return [ls.slice(0, 1).join(nfs.PS)+nfs.PS, ls.slice(1).join(nfs.PS)]
|
||||
|
@ -1,5 +1,5 @@
|
||||
Volcanos(chat.ONIMPORT, {list: [mdb.VALUE, "close:button"],
|
||||
_init: function(can, msg) { msg.Defer(function() { can.onappend.scroll(can) })
|
||||
_init: function(can, msg) { msg.Defer(function() { can.onappend.scroll(can) }), can.page.style(can, can._output, html.VISIBILITY, "")
|
||||
can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.highlight(can, can.Option(mdb.VALUE, msg.Option(mdb.VALUE)))
|
||||
can.page.Select(can, can._option, "input[name=value]", function(target) { can.onmotion.hidden(can, target) })
|
||||
},
|
||||
|
@ -133,8 +133,7 @@ Volcanos(chat.ONSYNTAX, {
|
||||
regexp: {"[A-Z_0-9]+": code.CONSTANT},
|
||||
keyword: {
|
||||
"source": code.KEYWORD, "return": code.KEYWORD,
|
||||
"config": code.KEYWORD,
|
||||
"command": code.KEYWORD,
|
||||
"command": code.KEYWORD, "config": code.KEYWORD,
|
||||
"create": code.FUNCTION, "modify": code.FUNCTION, "insert": code.FUNCTION,
|
||||
"spide": code.DATATYPE, "serve": code.DATATYPE, "dream": code.DATATYPE,
|
||||
"user": code.DATATYPE,
|
||||
@ -145,6 +144,14 @@ Volcanos(chat.ONSYNTAX, {
|
||||
"field": code.KEYWORD, "image": code.KEYWORD, "video": code.KEYWORD, "audio": code.KEYWORD,
|
||||
"style": code.KEYWORD,
|
||||
"inner": code.KEYWORD,
|
||||
"project": code.KEYWORD,
|
||||
"product": code.KEYWORD,
|
||||
"material": code.KEYWORD,
|
||||
"publish": code.KEYWORD,
|
||||
|
||||
"username": code.FUNCTION, "usernick": code.FUNCTION,
|
||||
"repos": code.FUNCTION, "binary": code.FUNCTION,
|
||||
"language": code.FUNCTION, "avatar": code.FUNCTION,
|
||||
},
|
||||
func: function(can, push, text, indent, opts) { var ls = can.core.Split(text, "\t ")
|
||||
opts.chapter = opts.chapter||0
|
||||
@ -188,7 +195,7 @@ Volcanos(chat.ONSYNTAX, {
|
||||
case "package": opts.package = ls[1]; break
|
||||
case "func": if (ls[1] == "(") { var p = ls.indexOf(")"); push(prefix(ls[p+1])+ls[2]+nfs.PT+ls[p+1]+"()"); break }
|
||||
case "const":
|
||||
case "var": if (ls[1] == "(") { break }
|
||||
case "var": if (ls[1] == "(") { break } // ")"
|
||||
case "type": push(prefix(ls[1])+ls[1]+(ls[0]=="type"? "{}": ls[0]=="func"? "()": "")); break
|
||||
} opts.stack = [ls[0]] } else if (indent == 4 && opts.stack[0] == "func") {
|
||||
if (text.indexOf("MergeCommands(") > -1) { opts.block = "cmds" } else if (text.indexOf("}") == 0) { opts.block = "" }
|
||||
@ -199,8 +206,10 @@ Volcanos(chat.ONSYNTAX, {
|
||||
if (isKey()) { push("+ "+opts.cmds+lex.SP+ls[0]) }
|
||||
}
|
||||
},
|
||||
}, mod: {prefix: {"//": code.COMMENT}, split: {operator: "(=>)"}, keyword: {"go": code.KEYWORD, "module": code.KEYWORD, "require": code.KEYWORD, "replace": code.KEYWORD}}, sum: {},
|
||||
work: {keyword: {go: code.KEYWORD, use: code.KEYWORD}},
|
||||
},
|
||||
mod: {prefix: {"//": code.COMMENT}, split: {operator: "(=>)"}, keyword: {
|
||||
"go": code.KEYWORD, "module": code.KEYWORD, "require": code.KEYWORD, "replace": code.KEYWORD,
|
||||
}}, sum: {}, work: {keyword: {go: code.KEYWORD, use: code.KEYWORD}},
|
||||
js: {prefix: {"// ": code.COMMENT}, regexp: {"[A-Z_0-9]+": code.CONSTANT},
|
||||
keyword: {
|
||||
"let": code.KEYWORD, "const": code.KEYWORD, "var": code.KEYWORD,
|
||||
@ -271,9 +280,15 @@ 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,
|
||||
|
||||
"$body": code.KEYWORD, "$fieldset": 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,
|
||||
"font-family": code.FUNCTION, "font-weight": code.FUNCTION, "font-style": code.FUNCTION, "font-size": code.FUNCTION, "line-height": code.FUNCTION,
|
||||
"text-align": code.FUNCTION, "white-space": code.FUNCTION, "word-break": code.FUNCTION, "letter-space": code.FUNCTION, "tab-size": code.FUNCTION,
|
||||
"vertical-align": code.FUNCTION,
|
||||
"padding": code.FUNCTION, "padding-left": code.FUNCTION, "padding-top": code.FUNCTION, "padding-right": code.FUNCTION, "padding-bottom": code.FUNCTION,
|
||||
"border": code.FUNCTION, "border-left": code.FUNCTION, "border-top": code.FUNCTION, "border-right": code.FUNCTION, "border-bottom": code.FUNCTION,
|
||||
"margin": code.FUNCTION, "margin-left": code.FUNCTION, "margin-top": code.FUNCTION, "margin-right": code.FUNCTION, "margin-bottom": code.FUNCTION,
|
||||
|
@ -23,17 +23,30 @@ Volcanos(chat.ONFIGURE, {
|
||||
can.run({}, [ctx.ACTION, nfs.REPOS], function(msg) { var paths = can.db.paths
|
||||
can.core.List(paths.concat(msg.Table(function(value) { return value.path })), function(p) {
|
||||
if (can.base.beginWith(p, nfs.USR_LOCAL_WORK) || can.base.isIn(p,
|
||||
// nfs.USR_LEARNING, nfs.USR_INTSHELL,
|
||||
nfs.USR_ICONS, nfs.USR_GEOAREA, nfs.USR_PROGRAM, nfs.USR_NODE_MODULES,
|
||||
nfs.USR_WEBSOCKET, nfs.USR_GO_QRCODE, nfs.USR_GO_GIT
|
||||
nfs.USR_ICONS,
|
||||
"usr/material/",
|
||||
nfs.USR_NODE_MODULES,
|
||||
nfs.USR_WEBSOCKET,
|
||||
nfs.USR_GO_QRCODE,
|
||||
nfs.USR_GO_GIT,
|
||||
nfs.USR_GEOAREA,
|
||||
)) { return }
|
||||
if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) }
|
||||
})
|
||||
function show(target, zone, path) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [nfs.PWD], function(msg) {
|
||||
var cache, list = can.core.List(msg.Table(), function(value) {
|
||||
if (path == nfs.SRC && can.base.isIn(value.path, "main.ico", "main.svg", "version.go", "binpack.go", "binpack_usr.go")) { return }
|
||||
if (path == nfs.SRC && can.base.isIn(value.path,
|
||||
"main.svg",
|
||||
"main.ico",
|
||||
"main.png",
|
||||
"main.jpg",
|
||||
"qrcode.jpg",
|
||||
"version.go",
|
||||
"binpack.go",
|
||||
"binpack_usr.go",
|
||||
)) { return }
|
||||
if (path == nfs.USR_RELEASE && can.base.isIn(value.path, "conf.go", "binpack.go")) { return }
|
||||
if (path == args[0] && args[1].indexOf(value.path) == 0) { value.expand = true }
|
||||
if (path == args[0] && args[1] == value.path) { value.expand = true }
|
||||
return value
|
||||
}); can.onmotion.clear(can, target), zone._total(msg.Length())
|
||||
cache = can.onimport.tree(can, list, function(event, item, target) {
|
||||
@ -59,10 +72,10 @@ Volcanos(chat.ONACTION, {_trans: {input: {main: "程序", top: "顶域"}},
|
||||
_runs: function(event, can, button, cb) { var meta = can.Conf(), msg = can.request(event); msg.Option(ctx.ACTION, button)
|
||||
can.user.input(event, can, meta.feature[button], function(data, args) { msg.Option(data), can.onaction._run(event, can, button, args, cb) })
|
||||
},
|
||||
save: function(event, can, button) { var p = can.Option(nfs.PATH)+can.Option(nfs.FILE); can.user.toastProcess(can, p, button)
|
||||
can.request(event, {file: can.Option(nfs.FILE), content: can.onexport.content(can)})
|
||||
save: function(event, can, button) {
|
||||
can.request(event, {file: can.Option(nfs.FILE), content: can.onexport.content(can), _toast: button})
|
||||
can.onaction._run(event, can, button, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
|
||||
can.onaction.reload(can, msg), can.user.toastSuccess(can, p, button)
|
||||
can.onaction.reload(can, msg)
|
||||
})
|
||||
},
|
||||
reload: function(can, msg) {
|
||||
@ -77,7 +90,7 @@ Volcanos(chat.ONACTION, {_trans: {input: {main: "程序", top: "顶域"}},
|
||||
can.core.List(msg.Result().split(lex.NL), function(text) { can.onaction.appendLine(can, text) })
|
||||
can.onaction.selectLine(can, line+imports(msg.Result())-imports(msg.Option(nfs.CONTENT)))
|
||||
}
|
||||
if (can.onexport.parse(can) == nfs.JS) {
|
||||
if (can.base.isIn(can.onexport.parse(can), nfs.JS, nfs.JSON)) {
|
||||
var line = can.onaction.selectLine(can); can.onmotion.clear(can, can.ui.content), can.ui.content._max = 0
|
||||
can.core.List(msg.Option("content").split(lex.NL), function(text) { can.onaction.appendLine(can, text) })
|
||||
can.onaction.selectLine(can, line)
|
||||
@ -89,7 +102,7 @@ Volcanos(chat.ONACTION, {_trans: {input: {main: "程序", top: "顶域"}},
|
||||
script: function(event, can, button) { can.onaction._runs(event, can, button) },
|
||||
create: function(event, can, button) { can.onaction._runs(event, can, button) },
|
||||
module: function(event, can, button) { can.onaction._runs(can.request(event, {title: can.user.trans(can, button, "创建模块")}), can, button) },
|
||||
compile: function(event, can, button) { var msg = can.request(event); msg.Option(chat._TOAST, "")
|
||||
compile: function(event, can, button) { var msg = can.request(event, {_toast: button})
|
||||
can.runAction(event, button, [], function(msg) { can.ui.search && can.ui.search.hidden()
|
||||
if (msg.Length() > 0 || msg.Result()) { return can.onimport.exts(can, "inner/search.js", function(sub) { can.ui.search = sub, sub.select()
|
||||
can.onmotion.delay(can, function() { can.onappend._output(sub, msg, sub.Conf(ctx.DISPLAY)) })
|
||||
@ -174,9 +187,9 @@ Volcanos(chat.ONKEYMAP, {
|
||||
case lex.TB:
|
||||
case lex.SP:
|
||||
case nfs.PT:
|
||||
case "[":
|
||||
case "(":
|
||||
case "{": update(); break
|
||||
case "[": // ]
|
||||
case "(": // )
|
||||
case "{": update(); break // }
|
||||
case "":
|
||||
default: filter()
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
term.onCursorMove(function() { can.onexport.term(can, term) })
|
||||
var fitAddon = new FitAddon.FitAddon(); term.loadAddon(fitAddon), term._fit = fitAddon, can.onmotion.delay(can, function() { fitAddon.fit() })
|
||||
term.loadAddon(new WebLinksAddon.WebLinksAddon())
|
||||
can.onmotion.clear(can, target), term.open(target), term.focus()
|
||||
can.onmotion.clear(can, target), term.open(target), term.focus(), can.onmotion.delay(can, function() { term.focus() })
|
||||
can.onengine.listen(can, chat.ONTHEMECHANGE, function() { term.selectAll(), can.onimport._connect(can, item, target, can.base.trimSuffix(term.getSelection(), lex.NL)) })
|
||||
can.page.style(can, target, html.BACKGROUND_COLOR, term._publicOptions.theme.background||cli.BLACK)
|
||||
return can.db[item.hash] = term
|
||||
@ -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)
|
||||
|
@ -9,7 +9,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
can._temp = []
|
||||
if (can.ConfIndex() == web.WIKI_DRAW) { can.ui = can.onappend.layout(can), can.onexport.title(can, can.OptionPath())
|
||||
if (can.isCmdMode() && !can.user.isMobile) { can.onmotion.toggle(can, can.ui.profile, true) } else { can.onmotion.hidden(can, can._action), can.onmotion.hidden(can, can.ui.project) }
|
||||
} else { can.ui = {content: can._output} } can.page.Modify(can, can.ui.content, msg.Results()||can.onexport.content(can))
|
||||
} else { can.ui.content || (can.ui = {content: can._output}) } can.page.Modify(can, can.ui.content, msg.Results()||can.onexport.content(can))
|
||||
can.page.Select(can, can.ui.content, html.SVG, function(target) { can.ui.svg = can.ui.group = can.onimport._block(can, target), can.onimport._project(can, target), can.ui.profile && can.core.ItemCB(can.onaction, target, can)
|
||||
can.page.Select(can, target, "", function(target) { can.onimport._block(can, target), can.page.tagis(target, svg.G) && target.Value(html.CLASS) && can.onimport._project(can, target) })
|
||||
}), can.ondetail._select(can, can.db.hash[1]||can.OptionPid()||can.ui.svg.Value(svg.PID)), can.ui.points = []
|
||||
|
@ -1,15 +1,44 @@
|
||||
fieldset.feel>div.output>div.layout>div.display { position:relative; overflow-y:hidden; }
|
||||
fieldset.feel>form.option>div.item.file { display:none; }
|
||||
body.mobile fieldset.feel>form.option>div.item.file { display:none; }
|
||||
fieldset.feel.fullscreen>div.action>div.item:not(.fullscreen) { display:none; }
|
||||
fieldset.feel>div.output>div.project>div.albums { display:flex; flex-wrap:wrap; }
|
||||
fieldset.feel>div.output>div.project>div.albums>div.item.album { border-bottom:var(--box-notice3); border-color:transparent; width:33.3%; display:flex; flex-direction:column; }
|
||||
fieldset.feel>div.output>div.project>div.albums>div.item.album.select { border-bottom:var(--box-notice3); border-right:none; }
|
||||
fieldset.feel>div.output>div.project>div.albums>div.item.album.create { height:calc(var(--project-width)/3 - 10px); font-size:42px; display:flex; justify-content:center; align-items:center; }
|
||||
fieldset.feel>div.output>div.project>div.albums>div.item.album img { height:calc(var(--project-width)/3 - 10px); width:100%; object-fit:cover; }
|
||||
fieldset.feel>div.output>div.project>div.item.select { border-width:3px; }
|
||||
fieldset.feel>div.output>div.project>div.item>img { padding:5px; }
|
||||
fieldset.feel>div.output>div.project>div.item>span.name { flex-grow:1; overflow:hidden; }
|
||||
fieldset.feel>div.output>div.project>div.item>span.progress { color:var(--notice-bg-color); margin-left:10px; }
|
||||
fieldset.feel>div.output>div.project>div.item>span.size { color:var(--disable-fg-color); font-size:var(--status-font-size); margin-left:10px; }
|
||||
fieldset.feel>div.output>div.project>div.item>span.time { color:var(--disable-fg-color); font-size:var(--status-font-size); margin-left:10px; }
|
||||
fieldset.feel>div.output>div.layout>div.display { overflow:hidden; position:relative; }
|
||||
fieldset.feel>div.output>div.layout>div.display:not(.hide) { height:100px; display:flex; justify-content:center; align-items:center; gap:10px; }
|
||||
fieldset.feel>div.output>div.layout>div.display>.select { border:var(--box-notice); border-width:3px; }
|
||||
fieldset.feel>div.output>div.layout>div.display>img { height:100px; width:100px; object-fit:contain; }
|
||||
fieldset.feel>div.output>div.layout>div.display>video { height:100px; width:100px; object-fit:contain; }
|
||||
fieldset.feel>div.output>div.layout>div.display>div.audio { word-break:break-all; height:100px; width:100px; display:flex; align-items:end; }
|
||||
fieldset.feel>div.output>div.layout>div.display>div.audio:not(.select) { border:var(--box-border); }
|
||||
fieldset.feel>div.output>div.layout>div.display>div.audio img.cover { height:98px; width:98px; position:absolute; }
|
||||
fieldset.feel>div.output>div.layout>div.display>div.audio.select img.cover { height:94px; width:94px; position:absolute; }
|
||||
fieldset.feel>div.output>div.layout>div.display>div.audio span.name { background-color:var(--hover-bg-color); color:white; z-index:5; }
|
||||
fieldset.feel>div.output>div.layout>div.display>*.select { background-color:var(--hover-bg-color); }
|
||||
fieldset.feel>div.output>div.layout>div.display>*:hover { background-color:var(--hover-bg-color); cursor:pointer; }
|
||||
fieldset.feel>div.output>div.layout>div.display>img:hover { background-color:var(--hover-bg-color); cursor:pointer; }
|
||||
fieldset.feel>div.output>div.layout>div.display:not(.hide) { height:100px; display:flex; justify-content:center; align-items:normal; gap:10px; }
|
||||
fieldset.feel>div.output>div.layout>div.display:not(.hide) img { height:100px; }
|
||||
fieldset.feel>div.output>div.layout>div.display:not(:hover)>div.toggle { display:none; }
|
||||
fieldset.feel>div.output>div.layout>div.display>div.toggle { font-size:48px; padding:5px; position:absolute; height:100px; padding-top:20px; }
|
||||
fieldset.feel>div.output>div.layout>div.display>video:hover { background-color:var(--hover-bg-color); cursor:pointer; }
|
||||
fieldset.feel>div.output>div.layout>div.display>div.audio:hover { background-color:var(--hover-bg-color); cursor:pointer; }
|
||||
fieldset.feel>div.output>div.layout>div.display>div.toggle { font-size:32px; padding:5px; padding-top:32px; height:100px; position:absolute; }
|
||||
fieldset.feel>div.output>div.layout>div.display>div.toggle.prev { left:0; }
|
||||
fieldset.feel>div.output>div.layout>div.display>div.toggle.next { right:0; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content { text-align:center; overflow-y:hidden; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>img { cursor:pointer; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>img:hover { background-color:var(--hover-bg-color); }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content:not(:hover)>div.toggle { display:none; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>div.toggle { font-size:48px; padding:5px; padding-top:32px; top:40%; height:120px; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content { padding:0; overflow:hidden; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>img { height:100%; width:100%; object-fit:scale-down; cursor:pointer; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>video { height:100%; width:100%; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>div.audio { height:100%; width: 100%; display:flex; flex-direction:column; justify-content:center; align-items:center; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>div.audio img.cover { height:calc(100% - 120px); }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>div.audio span.name { padding:10px; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>div.progress { background-color:var(--notice-bg-color); height:3px; position:absolute; bottom:2px; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>div.toggle { font-size:32px; padding:5px; padding-top:32px; height:100px; top:40%; z-index:5; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>div.toggle.next { right:0; }
|
||||
body.mobile fieldset.feel>div.output>div.project { overflow-x:hidden; }
|
||||
fieldset.feel>div.output>div.layout>div.layout>div.content>div.toggle.prev { left:0; }
|
||||
div.toggle { -webkit-user-select:none; }
|
||||
img { -webkit-user-select:none; }
|
@ -1,164 +1,206 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) { can.onappend.style(can, html.FLEX, can.ui.display)
|
||||
can.ui = can.onappend.layout(can), can.onmotion.toggle(can, can.ui.display, true), can.onimport._project(can, msg)
|
||||
can.onimport.page(can, can.db.list, can.db.begin = parseInt(msg.Option(cli.BEGIN)||"0"))
|
||||
can.onmotion.hidden(can, can._action), can.onimport.layout(can)
|
||||
_init: function(can, msg, cb) { can.onappend.style(can, wiki.FEEL)
|
||||
can.run({}, [], function(_msg) { can.db.albums = _msg
|
||||
can.ui = can.onappend.layout(can)
|
||||
// can.user.isMobile && (can.onaction.list = [web.UPLOAD])
|
||||
cb && cb(msg)
|
||||
if (can.base.isIn(can.Action("sort")||"", mdb.TIME, "")) {
|
||||
can.onimport._project(can, msg)
|
||||
} else {
|
||||
can.onaction.sort({}, can, "sort", can.Action("sort"))
|
||||
} can.onimport.page(can, can.db.list, can.db.begin = 0)
|
||||
can.onmotion.toggle(can, can.ui.display, can.page.isDisplay(can.ui.project)), can.onimport.layout(can)
|
||||
})
|
||||
can.onmotion.toggle(can, can._action, true)
|
||||
},
|
||||
_project: function(can, msg) { can.db.list = [], can.db.dir_root = msg.Option(nfs.DIR_ROOT)
|
||||
can.ui.albums = can.page.Appends(can, can.ui.project, ["albums"])._target
|
||||
can.db.albums.Table(function(value) {
|
||||
can.page.Append(can, can.ui.albums, [{view: "item album "+(can.base.beginWith(can.Option(nfs.PATH), value.path)? "select": ""), background: value.cover, list: [
|
||||
{img: can.misc.Resource(can, value.cover||"usr/icons/background.jpg")}, {text: value.name},
|
||||
], onclick: function(event) {
|
||||
can.Option(nfs.PATH, value.path), can.Update()
|
||||
}, oncontextmenu: function(event) {
|
||||
can.user.carteItem(event, can, value)
|
||||
}}])
|
||||
})
|
||||
can.page.Append(can, can.ui.albums, [{view: ["item album create", "", "+"], onclick: function(event) {
|
||||
can.Update(event, [ctx.ACTION, mdb.CREATE])
|
||||
}}])
|
||||
can.ui.filter = can.onappend.filter(can, can.ui.project)
|
||||
msg.Table(function(item) { item.name = can.base.trimPrefix(item.path, can.Option(nfs.PATH))
|
||||
can.base.endWith(item.path, "/") && (item.nick = [{img: can.misc.Resource(can, "usr/icons/dir.png")}, {text: [item.name, "", mdb.NAME]}])
|
||||
can.base.endWith(item.path, nfs.PS)? can.onimport.item(can, item, function(event) { can.Option(nfs.PATH, item.path) && can.Update(event) }): can.db.list.push(item)
|
||||
})
|
||||
var rate = can.misc.localStorage(can, [can.ConfIndex(), "rate"]); rate && can.Action(html.SPEED, rate)
|
||||
can.core.List(can.db.list, function(item, index) { item._select = item.path == (can.db.hash[0]||"usr/icons/background.jpg")
|
||||
item.nick = (last? last+lex.SP: "")+item.name
|
||||
var last = can.misc.localStorage(can, [can.ConfIndex(), "p", can.onimport._file(can, item.path)])
|
||||
var target = can.onimport.item(can, item, function(_event, item, show, target) { can.onexport.hash(can, item.path), can.onexport.title(can, item.path.split("/").pop())
|
||||
can.ui.cb = function(event) { var next = _event.target.nextSibling
|
||||
target.innerHTML = parseInt(event.target.currentTime*100/event.target.duration)+"% "+item.name
|
||||
can.ui.video = event.target, can.Status(item), can.misc.localStorage(can, [can.ConfIndex(), "last"], item.path)
|
||||
if (event.type == "ratechange") { can.misc.localStorage(can, [can.ConfIndex(), "rate"], event.target.playbackRate) }
|
||||
if (event.type == "ended" && next) { can.onmotion.delay(can, function() { next.click() }, 3000), can.user.toast(can, "3s 后即将播放下一个", "", 3000) }
|
||||
}
|
||||
can.Option(nfs.FILE, can.base.trimPrefix(item.path, can.Option(nfs.PATH)))
|
||||
can.onimport.layout(can), can.onmotion.scrollIntoView(can, target), can.onmotion.clear(can, can.ui.content)
|
||||
var _target = can.onimport.file(can, item.path, item, index, can.ui.content, can.ui.content.offsetHeight, true)
|
||||
_target.focus(), _target.onclick = function() { can.ondetail._init(can, index) }
|
||||
can.onimport.layout(can)
|
||||
can.onappend._toggle(can, can.ui.content, function() {
|
||||
index == 0? can.user.toast(can, "已经是第一页了"): _event.target.previousSibling.click()
|
||||
}, function() {
|
||||
try { _event.target.nextSibling.click() } catch (e) { can.user.toast(can, "已经是最后一页了") }
|
||||
})
|
||||
var limit = parseInt(can.Action(mdb.LIMIT))
|
||||
if (index < can.db.begin || index >= can.db.begin+limit) {
|
||||
can.onimport.page(can, can.db.list, can.db.begin = index-index%limit)
|
||||
}
|
||||
}); item._target = target
|
||||
if (can.isCmdMode() && item.path == can.misc.localStorage(can, [can.ConfIndex, "last"])) {
|
||||
can.Action(html.HEIGHT, html.HIDE), can.onmotion.hidden(can, can.ui.display)
|
||||
_target = target, can.onmotion.delay(can, function() { can.onaction.full({}, can) })
|
||||
}
|
||||
can.onmotion.cacheClear(can, "", can.ui.content)
|
||||
can.db.hash[0] && msg.path.indexOf(can.db.hash[0]) == -1 && (can.db.hash[0] = "")
|
||||
can.core.List(can.db.list, function(item, index) { var last = can.onexport.progress(can, "p."+item.path);
|
||||
(!can.db.hash[0] || can.db.hash[0] == can.Option(nfs.PATH) || can.db.hash[0].indexOf(can.Option(nfs.PATH)) == -1) && (can.db.hash[0] = item.path)
|
||||
item.nick = [item.cover? {img: can.misc.Resource(can, item.cover)}:
|
||||
can.misc.isImage(can, item.path)? {img: can.misc.Resource(can, item.path)}:
|
||||
can.misc.isVideo(can, item.path)? {img: can.misc.Resource(can, "usr/icons/QuickTime Player.png")}:
|
||||
can.misc.isAudio(can, item.path)? {img: can.misc.Resource(can, "usr/icons/Music.png")}: null,
|
||||
{text: [item.name, "", mdb.NAME]}, {text: [last||"", "", "progress"]},
|
||||
can.Option(nfs.PATH) != "usr/icons/" && can.base.isIn(can.Action("sort")||"", mdb.TIME, "")? {text: [can.base.TimeTrim(item.time), "", mdb.TIME]}: {text: [item.size, "", nfs.SIZE]},
|
||||
]
|
||||
item.title = [item.time, item.path, item.size].join("\n")
|
||||
item._hash = item.path, item._title = item.path.split("/").pop()
|
||||
item._target = can.onimport.item(can, item, function(event, item, show, target) { can.onimport._content(can, item, index, target) })
|
||||
item.title = ""
|
||||
})
|
||||
},
|
||||
_file: function(can, path) { var p = location.href.indexOf(ice.HTTP) == 0? "": "http://localhost:9020"
|
||||
return path.indexOf(ice.HTTP) == 0? path: p+can.base.Path(web.SHARE_LOCAL, can.db.dir_root||"", path)
|
||||
_content: function(can, item, index, target) { can.Option(nfs.FILE, item.name), can.Status(item), can.ui.video = item._video, can.ui.current = item
|
||||
if (can.onexport.progress(can, "p."+item.path) == "100%") { can.onexport.progress(can, "p."+item.path, ""), can.onexport.progress(can, item.path, "") }
|
||||
if (can.misc.isImage(can, item.path)) { can.onmotion.delay(can, function() { can.onaction.playnext(can) }, 5000) }
|
||||
if (!can.onmotion.cache(can, function() { return item.path }, can.ui.content)) { var progress
|
||||
item._cb = function(event, video) { can.ui.video = item._video = video
|
||||
var p = parseInt(video.currentTime*100/video.duration); can.page.Select(can, target, "span.progress", function(target) { target.innerText = p+"%" })
|
||||
if (!progress) { progress = can.page.Append(can, can.ui.content, ["progress"])._target } can.page.style(can, progress, html.WIDTH, can.ui.content.offsetWidth*p/100)
|
||||
}
|
||||
var _target = can.onimport.file(can, item.path, item, index, can.ui.content, true); _target.focus()
|
||||
can.onappend._toggle(can, can.ui.content, function() { can.onaction.prev({}, can) }, function() { can.onaction.next({}, can) })
|
||||
}
|
||||
if (index < can.db.begin || index >= can.db.begin+can.db.limit) {
|
||||
can.onimport.page(can, can.db.list, can.db.begin = index-index%can.db.limit)
|
||||
} can.onmotion.select(can, can.ui.display, "*", item._display)
|
||||
},
|
||||
file: function(can, path, item, index, target, height, auto) { path = can.onimport._file(can, path)
|
||||
var cb = can.onfigure[can.base.Ext(path)]||can.onfigure[wiki.IMAGE]; can.Status(nfs.FILE, path)
|
||||
return cb && can.page.Append(can, target||can.ui.display, [cb(can, path, item, index, height, auto)])._target
|
||||
_file: function(can, path) {
|
||||
return can.misc.Resource(can, can.db.dir_root+path, can.ConfSpace())
|
||||
},
|
||||
page: function(can, list, begin, limit) { can.onmotion.clear(can, can.ui.display)
|
||||
begin = parseInt(begin||can.db.begin), limit = parseInt(limit||can.Action(mdb.LIMIT))
|
||||
for (var i = begin; i < begin+limit; i++) { list && list[i] && can.onimport.file(can, list[i].path, list[i], i) }
|
||||
can.onmotion.orderShow(can, can.ui.display, "*")
|
||||
can.onappend._toggle(can, can.ui.display, function(event) { can.onaction.prev(event, can) }, function(event) { can.onaction.next(event, can) })
|
||||
can.Status({begin: begin, limit: limit, total: list.length})
|
||||
file: function(can, path, item, index, target, auto) { item._path = path = can.onimport._file(can, path)
|
||||
var cb = can.onfigure[can.base.Ext(path)]||can.onfigure[wiki.IMAGE]
|
||||
return cb && can.page.Append(can, target||can.ui.display, [cb(can, item, auto)])._target
|
||||
},
|
||||
page: function(can, list, begin) { can.onmotion.clear(can, can.ui.display)
|
||||
begin = parseInt(begin||can.db.begin||0), can.db.limit = can.base.Min((parseInt(can.ui.display.offsetWidth/110)||5)-1, 3)
|
||||
for (var i = begin; i < begin+can.db.limit; i++) { if (list && list[i]) { list[i]._display = can.onimport.file(can, list[i].path, list[i], i) } }
|
||||
can.onappend._toggle(can, can.ui.display, function(event) { can.onaction.prevpage(event, can) }, function(event) { can.onaction.nextpage(event, can) })
|
||||
can.Status({begin: begin, limit: can.db.limit, total: list.length})
|
||||
},
|
||||
layout: function(can) { can.ui.layout && can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) {
|
||||
can.page.Select(can, can.ui.content, can.page.Keys(html.IMG, html.VIDEO), function(target) {
|
||||
can.user.isMobile && !can.user.isLandscape()? can.page.style(can, target, html.HEIGHT, "", html.MAX_HEIGHT, height, html.MAX_WIDTH, width):
|
||||
can.page.style(can, target, html.MAX_HEIGHT, height, html.MAX_WIDTH, width)
|
||||
})
|
||||
}) },
|
||||
}, [""])
|
||||
Volcanos(chat.ONFIGURE, {
|
||||
png: function(can, path, item, index, height) { return can.onfigure.image(can, path, item, index, height) },
|
||||
jpg: function(can, path, item, index, height) { return can.onfigure.image(can, path, item, index, height) },
|
||||
jpeg: function(can, path, item, index, height) { return can.onfigure.image(can, path, item, index, height) },
|
||||
image: function(can, path, item, index, height) { return {img: path,
|
||||
onmouseover: function(event) { can.Status(nfs.FILE, path), can.Status(item) },
|
||||
png: function(can, item) { return can.onfigure.image(can, item) },
|
||||
gif: function(can, item) { return can.onfigure.image(can, item) },
|
||||
jpg: function(can, item) { return can.onfigure.image(can, item) },
|
||||
jpeg: function(can, item) { return can.onfigure.image(can, item) },
|
||||
image: function(can, item) { return {img: item._path, title: item.title, onclick: function(event) { item._target.click() }} },
|
||||
video: function(can, item, auto) { var init, last = can.onexport.progress(can, item.path)||0
|
||||
var meta = {type: html.VIDEO, title: item.title, data: {src: item._path, controls: auto, autoplay: auto},
|
||||
onclick: function(event) { item._target.click() },
|
||||
} },
|
||||
video: function(can, path, item, index, height, auto) { var total = 0, cb = can.ui.cb||function cb(event) { }
|
||||
var init, last = can.misc.localStorage(can, can.onexport.key(can, path))||0
|
||||
return {type: html.VIDEO, style: {height: height||can.onexport.height(can)},
|
||||
data: {src: path, controls: "controls", autoplay: auto, playbackRate: parseFloat(can.Action(html.SPEED))},
|
||||
oncanplay: cb, onplay: cb, onpause: cb, oncontextmenu: cb, onratechange: cb, onseeked: cb,
|
||||
onmouseover: function(event) { can.Status(nfs.FILE, path), can.Status(item) },
|
||||
onloadedmetadata: function(event) { total = event.timeStamp
|
||||
event.target.currentTime = can._msg.currentTime || 0
|
||||
}, onloadeddata: cb, ontimeupdate: function(event) { cb(event)
|
||||
can.misc.localStorage(can, can.onexport.key(can, path), event.target.currentTime)
|
||||
can.misc.localStorage(can, can.onexport.key(can, "p", path), parseInt(event.target.currentTime*100/event.target.duration)+"%")
|
||||
onratechange: function(event) { can.onexport.storage(can, "rate", event.target.playbackRate) },
|
||||
onvolumechange: function(event) { can.onexport.storage(can, "volume", event.target.volume) },
|
||||
onloadedmetadata: function(event) { item._cb && item._cb(event, event.target)
|
||||
event.target.volume = can.onexport.storage(can, "volume")||0.5
|
||||
event.target.playbackRate = can.onexport.storage(can, "rate")||1
|
||||
},
|
||||
ontimeupdate: function(event) { if (event.target.currentTime == 0) { return } item._cb && item._cb(event, event.target)
|
||||
can.Status("position", can.onexport.position(can, event.target.currentTime-1, event.target.duration))
|
||||
can.onexport.progress(can, "p."+item.path, parseInt(event.target.currentTime*100/event.target.duration)+"%")
|
||||
can.onexport.progress(can, item.path, event.target.currentTime)
|
||||
if (!init) { init = true, event.target.currentTime = last }
|
||||
can.Status("position", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration))
|
||||
}, onended: function(event) { cb(event), can.misc.localStorage(can, can.onexport.key(can, path), "") },
|
||||
}
|
||||
},
|
||||
mp4: function(can, path, item, index, height, auto) { return can.onfigure.video(can, path, item, index, height, auto) },
|
||||
m4v: function(can, path, item, index, height, auto) { return can.onfigure.video(can, path, item, index, height, auto) },
|
||||
mov: function(can, path, item, index, height, auto) { return can.onfigure.video(can, path, item, index, height, auto) },
|
||||
webm: function(can, path, item, index, height, auto) { return can.onfigure.video(can, path, item, index, height, auto) },
|
||||
onended: function(event) { can.onaction.playnext(can) },
|
||||
}
|
||||
if (!auto && can.misc.isVideo(can, item.path) && !can.user.isChrome) {
|
||||
return {view: html.AUDIO, list: [{img: can.misc.Resource(can, item.cover||"usr/icons/QuickTime Player.png", can.ConfSpace()), className: "cover"}, {text: [item.name, "", mdb.NAME]}], onclick: meta.onclick}
|
||||
}
|
||||
return meta
|
||||
},
|
||||
audio: function(can, item, auto) { var meta = can.onfigure.video(can, item, auto); meta.type = html.AUDIO
|
||||
return {view: html.AUDIO, list: [{img: can.misc.Resource(can, item.cover||"usr/icons/Music.png", can.ConfSpace()), className: "cover"}, {text: [item.name, "", mdb.NAME]}, meta], onclick: meta.onclick}
|
||||
},
|
||||
webm: function(can, item, auto) { return can.onfigure.video(can, item, auto) },
|
||||
mov: function(can, item, auto) { return can.onfigure.video(can, item, auto) },
|
||||
m4v: function(can, item, auto) { return can.onfigure.video(can, item, auto) },
|
||||
mp4: function(can, item, auto) { return can.onfigure.video(can, item, auto) },
|
||||
mp3: function(can, item, auto) { return can.onfigure.audio(can, item, auto) },
|
||||
})
|
||||
Volcanos(chat.ONACTION, {list: ["full",
|
||||
[html.HEIGHT, 100, 200, 400, 600, 800, "max", html.HIDE, ice.AUTO],
|
||||
[mdb.LIMIT, 6, 1, 3, 6, 9, 12, 15, 20, 30, 50],
|
||||
[html.SPEED, 1, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 5, 10],
|
||||
Volcanos(chat.ONACTION, {
|
||||
list: [
|
||||
"mkdir", "upload", "record1", "record2",
|
||||
["sort", mdb.TIME, nfs.PATH, nfs.SIZE],
|
||||
["order", "repeat", "range", "loop", "random"],
|
||||
],
|
||||
height: function(event, can, key, value) { can.Action(key, value), can.onimport.page(can, can.db.list) },
|
||||
limit: function(event, can, key, value) { can.Action(key, value), can.onimport.page(can, can.db.list) },
|
||||
speed: function(event, can, key, value) { can.Action(key, value), can.onimport.page(can, can.db.list) },
|
||||
prev: function(event, can) { if (can.db.begin > 0) { can.db.begin -= parseInt(can.Action(mdb.LIMIT)), can.onimport.page(can, can.db.list) } else { can.user.toast(can, "已经是第一页了") } },
|
||||
next: function(event, can) { if (can.db.begin + parseInt(can.Action(mdb.LIMIT)) < can.db.list.length) { can.db.begin += parseInt(can.Action(mdb.LIMIT)), can.onimport.page(can, can.db.list) } else { can.user.toast(can, "已经是最后一页了") } },
|
||||
full: function(event, can) {
|
||||
var show = can.onmotion.toggle(can, can.ui.project); can.onmotion.toggle(can, can.ui.display), can.onimport.layout(can, can.ConfHeight(), can.ConfWidth())
|
||||
can.page.ClassList.set(can, can.ui.content, html.FLOAT, !show), can.page.Select(can, can.ui.content, "*", function(target) { target.focus()
|
||||
can.page.style(can, target, html.HEIGHT, can.ConfHeight()+(!show? 2*html.ACTION_HEIGHT: 0)-can.ui.display.offsetHeight)
|
||||
})
|
||||
},
|
||||
onkeydown: function(event, can) { try {
|
||||
if (event.target != can.ui.video) {
|
||||
if (event.key == "ArrowLeft") { can.ui.video.currentTime -= 15 }
|
||||
if (event.key == "ArrowRight") { can.ui.video.currentTime += 15 }
|
||||
}
|
||||
if (event.key == "Escape") { can.onaction.full(event, can) }
|
||||
if (event.key == "ArrowUp") { can.user.toast(can, parseInt((can.ui.video.volume += 0.1)*100)) }
|
||||
if (event.key == "ArrowDown") { can.user.toast(can, parseInt((can.ui.video.volume -= 0.1)*100)) }
|
||||
} catch (e) {} },
|
||||
record0: function(event, can, name, cb) { can.user.input(event, can, [{name: nfs.FILE, value: name}], function(list) { var height = window.innerHeight
|
||||
navigator.mediaDevices.getDisplayMedia({video: {height: height}}).then(function(stream) {
|
||||
can.core.Next([3, 2, 1], function(item, next) { can.user.toast(can, item + "s 后开始截图"), can.onmotion.delay(can, next, 1000) }, function() { can.user.toast(can, "现在开始截图")
|
||||
record0: function(event, can, name, cb) { can.user.input(event, can, [{name: nfs.FILE, value: name}], function(list) {
|
||||
var height = window.innerHeight, width = window.innerWidth
|
||||
navigator.mediaDevices.getDisplayMedia({video: {height: height*8, width: width*8}}).then(function(stream) {
|
||||
can.core.Next([3, 2, 1], function(item, next) { can.user.toast(can, item + "s 后开始截图"), can.onmotion.delay(can, next, 1000) }, function() { can.onmotion.clearFloat(can)
|
||||
can.onmotion.delay(can, function() {
|
||||
cb(stream, function(blobs, ext) { var msg = can.request(event); msg._upload = new File(blobs, list[0]+nfs.PT+ext)
|
||||
can.runAction(msg, html.UPLOAD, [], function() { can.user.toast(can, "上传成功"), can.Update() })
|
||||
can.core.List(stream.getTracks(), function(item) { item.stop() })
|
||||
can.runAction(msg, html.UPLOAD, [], function(msg) { can.user.toast(can, "上传成功")
|
||||
can.db.hash = can.onexport.hash(can, encodeURIComponent(msg.Result())), can.Update()
|
||||
}), can.core.List(stream.getTracks(), function(item) { item.stop() })
|
||||
})
|
||||
}, 300)
|
||||
})
|
||||
}).catch(function(err) { can.user.toast(can, err.name + ": " + err.message) })
|
||||
}) },
|
||||
record1: function(event, can) { can.onaction.record0(event, can, "shot", function(stream, cb) { var height = window.innerHeight
|
||||
var video = can.page.Append(can, document.body, [{type: html.VIDEO, height: height}])._target; video.srcObject = stream, video.onloadedmetadata = function() { video.play(), width = video.offsetWidth
|
||||
record1: function(event, can) { can.onaction.record0(event, can, "Screenshot "+can.base.Time(null), function(stream, cb) { var height = window.innerHeight
|
||||
var video = can.page.Append(can, document.body, [{type: html.VIDEO, height: height}])._target; video.srcObject = stream, video.onloadedmetadata = function() {
|
||||
video.play(), height = video.offsetHeight, width = video.offsetWidth
|
||||
var canvas = can.page.Append(can, document.body, [{type: html.CANVAS, height: height, width: width}])._target; canvas.getContext("2d").drawImage(video, 0, 0, width, height)
|
||||
canvas.toBlob(function(blob) { cb([blob], nfs.PNG) })
|
||||
}
|
||||
}) },
|
||||
record2: function(event, can) { can.onaction.record0(event, can, "shot", function(stream, cb) {
|
||||
var recorder = new MediaRecorder(stream, {mimeType: 'video/webm'}), blobs = []; recorder.ondataavailable = function(res) { blobs.push(res.data) }
|
||||
recorder.onstop = function() { cb(blobs, nfs.WEBM) }, recorder.start(1)
|
||||
}) },
|
||||
})
|
||||
Volcanos(chat.ONDETAIL, {list: ["关闭", "上一个", "下一个", "设置头像", "设置背景", "复制链接", "下载", "删除"],
|
||||
_init: function(can, index) {
|
||||
can.onappend._init(can, {type: "story feel play float"}, [], function(sub) { can.sub = sub, sub._legend.innerHTML = can._legend.innerHTML, sub._legend.onclick = can._legend.onclick, can.onappend.style(can, html.FLEX, sub._output)
|
||||
can.getActionSize(function(msg, left, top, width, height) { sub.onappend._action(can, can.ondetail.list, sub._action, can.ondetail), sub.onappend._status(sub, ["begin", nfs.FILE])
|
||||
sub.page.style(sub, sub._target, {left: left||0, top: top||0}), sub.page.style(sub, sub._output, html.HEIGHT, height-2*html.ACTION_HEIGHT, html.WIDTH, width)
|
||||
can.order = index, can.show = function(order) { path = can.onimport._file(can, can.db.list[order].path); var cb = can.onfigure[can.base.Ext(path)]||can.onfigure[wiki.IMAGE]
|
||||
sub.page.Appends(sub, sub._output, [can.base.Copy(cb(can, path, index), {height: "", style: kit.Dict(html.MAX_WIDTH, width, html.MAX_HEIGHT, height-2*html.ACTION_HEIGHT)})])
|
||||
sub.Status(cli.BEGIN, order+1+nfs.PS+can.db.list.length), sub.Status(nfs.FILE, path)
|
||||
}, can.show(can.order)
|
||||
}), sub.run = function(can, cmds, cb) { can.run(can, cmds, cb, true) }
|
||||
}, can._root._target)
|
||||
record2: function(event, can) { if (can.ui.recorder) { return can.ui.recorder.stop() }
|
||||
can.onaction.record0(event, can, "Screenshot "+can.base.Time(null), function(stream, cb) {
|
||||
if (can.user.isChrome) {
|
||||
var recorder = new MediaRecorder(stream, {mimeType: "video/webm;codecs=vp8"})
|
||||
recorder.onstop = function() { delete(can.ui.recorder), cb(blobs, "webm") }
|
||||
// var recorder = new MediaRecorder(stream, {mimeType: 'video/mp4; codecs="avc1.4d002a"'})
|
||||
// recorder.onstop = function() { delete(can.ui.recorder), cb(blobs, "mp4") }
|
||||
} else {
|
||||
var recorder = new MediaRecorder(stream, {mimeType: "video/mp4"})
|
||||
recorder.onstop = function() { delete(can.ui.recorder), cb(blobs, "mp4") }
|
||||
}
|
||||
var blobs = []; recorder.ondataavailable = function(res) { blobs.push(res.data) }
|
||||
can.ui.recorder = recorder, recorder.start(1)
|
||||
})
|
||||
},
|
||||
"关闭": function(event, can) { can.page.Remove(can, can.sub._target) },
|
||||
"上一个": function(event, can) { can.order > 0? can.show(--can.order): can.user.toast(can, "已经是第一张啦!") },
|
||||
"下一个": function(event, can) { can.order < can.db.list.length-1? can.show(++can.order): can.user.toast(can, "已经是最后一张啦!") },
|
||||
"设置头像": function(event, can) { can.setHeader(aaa.AVATAR, can.onimport._file(can, can.db.list[can.order].path)) },
|
||||
"设置背景": function(event, can) { can.setHeader(aaa.BACKGROUND, can.onimport._file(can, can.db.list[can.order].path)) },
|
||||
"复制链接": function(event, can) { can.onmotion.share(event, can, [], [web.LINK, can.user.copy(event, can, can.misc.MergeURL(can, {_path: can.onimport._file(can, can.db.list[can.order].path)}, true)) ]) },
|
||||
"下载": function(event, can) { can.user.download(can, path = can.onimport._file(can, can.db.list[can.order].path)) },
|
||||
"删除": function(event, can) { can.runAction(event, nfs.TRASH, [can.db.list[can.order].path], function(msg) { can.user.toastSuccess(can, "删除成功") }, true) },
|
||||
fullscreen: function(event, can, button) { var show = can.onmotion.toggle(can, can.ui.project)
|
||||
can.onmotion.toggle(can, can.ui.display, show), can.onmotion.toggle(can, can._status, show)
|
||||
can.page.ClassList.set(can, can._fields, button, !show), can.page.ClassList.set(can, can.ui.content, html.FLOAT, !show)
|
||||
can.sup.onimport.size(can.sup, can.sup.ConfHeight(), can.sup.ConfWidth())
|
||||
},
|
||||
sort: function(event, can, button, value) {
|
||||
switch (value) {
|
||||
case mdb.TIME: can._msg.Sort(value, "str_r"); break
|
||||
case nfs.PATH: can._msg.Sort(value, "str"); break
|
||||
case nfs.SIZE: can._msg.Sort(value, "int_r"); break
|
||||
} can.onimport._project(can, can._msg)
|
||||
},
|
||||
playnext: function(can) {
|
||||
if (can.Action("order") == "repeat") {
|
||||
if (can.ui.video) { can.ui.video.currentTime = 0, can.ui.video.play() }
|
||||
}
|
||||
if (can.Action("order") == "range") { var next = can.ui.current._target.nextSibling
|
||||
next && can.onmotion.delay(can, function() { next.click() }, 300)
|
||||
}
|
||||
if (can.Action("order") == "loop") { var next = can.ui.current._target.nextSibling
|
||||
next? can.onmotion.delay(can, function() { next.click() }, 300): can.db.list[0]._target.click()
|
||||
}
|
||||
if (can.Action("order") == "random") {
|
||||
can.db.list[parseInt(Math.random()*can.db.list.length)]._target.click()
|
||||
}
|
||||
},
|
||||
prev: function(event, can) { var target = can.ui.current._target; target.previousSibling? target.previousSibling.click(): can.user.toast(can, "已经是第一页了") },
|
||||
next: function(event, can) { var target = can.ui.current._target; target.nextSibling? target.nextSibling.click(): can.user.toast(can, "已经是最后一页了") },
|
||||
prevpage: function(event, can) { if (can.db.begin > 0) { can.db.begin -= can.db.limit, can.onimport.page(can, can.db.list) } else { can.user.toast(can, "已经是第一页了") } },
|
||||
nextpage: function(event, can) { if (can.db.begin + can.db.limit < can.db.list.length) { can.db.begin += can.db.limit, can.onimport.page(can, can.db.list) } else { can.user.toast(can, "已经是最后一页了") } },
|
||||
})
|
||||
Volcanos(chat.ONEXPORT, {list: [cli.BEGIN, mdb.LIMIT, mdb.TOTAL, nfs.FILE, nfs.SIZE, "position"],
|
||||
height: function(can) { var height = can.Action(html.HEIGHT); return parseInt(height == html.HIDE? 0: height == "max"? can.ConfHeight(): height == ice.AUTO? can.base.Min(can.ConfHeight()/4, 200): height) },
|
||||
Volcanos(chat.ONEXPORT, {list: [cli.BEGIN, mdb.LIMIT, mdb.TOTAL, mdb.NAME, nfs.SIZE, mdb.TIME, "position"],
|
||||
progress: function(can, path, time) { return can.onexport.storage(can, path.split("?")[0], time) },
|
||||
position: function(can, index, total) { total = total || can.max; return parseInt((index+1)*100/total)+"%"+" = "+(parseInt(index)+1)+nfs.PS+parseInt(total) },
|
||||
key: function(can) { return [can.Conf(ctx.INDEX)].concat(can.core.List(arguments).slice(1)).join(":") },
|
||||
})
|
||||
Volcanos(chat.ONKEYMAP, {
|
||||
_mode: {
|
||||
plugin: {
|
||||
Escape: function(event, can) { can.onaction.fullscreen(event, can) },
|
||||
ArrowLeft: function(event, can) { if (can.ui.video) { can.ui.video.currentTime -= 15 } else { can.onaction.prev(event, can) } },
|
||||
ArrowRight: function(event, can) { if (can.ui.video) { can.ui.video.currentTime += 15 } else { can.onaction.next(event, can) } },
|
||||
ArrowDown: function(event, can) { try { can.user.toast(can, "volume: "+parseInt((can.ui.video.volume -= 0.1)*100)) } catch (e) {} },
|
||||
ArrowUp: function(event, can) { try { can.user.toast(can, "volume: "+parseInt((can.ui.video.volume += 0.1)*100)) } catch (e) {} },
|
||||
" ": function(event, can) { if (can.ui.video) { can.ui.video.paused? can.ui.video.play(): can.ui.video.pause() } },
|
||||
},
|
||||
},
|
||||
})
|
||||
|
@ -2,7 +2,8 @@ fieldset.word>div.output { padding:var(--plugin-padding); }
|
||||
fieldset.word>div.output p { margin:var(--title-margin) auto; }
|
||||
fieldset.word>div.output h3 { margin-top:var(--title-margin); }
|
||||
fieldset.word>div.output h2.story[data-type=spark][data-name=title] { text-align:center; }
|
||||
fieldset.word>div.output ul { margin:20px; }
|
||||
fieldset.word>div.output code { font-style: italic; }
|
||||
fieldset.word>div.output ul { margin:20px; font-family:var(--code-font-family); word-break:break-all; }
|
||||
fieldset.word>div.output ul>li:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); cursor:pointer; }
|
||||
fieldset.word>div.output img { display:block; margin:auto; max-height:100%; max-width:100%; }
|
||||
fieldset.word>div.output div.project img { margin:unset; }
|
||||
@ -19,7 +20,7 @@ fieldset.word>div.navmenu div.list { margin-left:var(--title-margin); }
|
||||
fieldset.word>div.navmenu div.item { font-size:1.4em; font-weight:bold; font-family:cursive; padding:var(--input-padding) var(--title-margin); }
|
||||
fieldset.word>div.navmenu>div.item { font-size:1.6em; }
|
||||
|
||||
div.story[data-type=spark] label { -webkit-user-select:none; }
|
||||
div.story[data-type=spark] label { padding:3px; -webkit-user-select:none; }
|
||||
div.story[data-type=spark_tabs] { margin-top:var(--title-margin); }
|
||||
div.story[data-type=spark_tabs]>div.tabs>div.item { font-style:italic; padding:var(--input-padding) var(--button-padding); height:var(--action-height); float:left; }
|
||||
div.story[data-type=spark_tabs]>div.tabs>div.item.select { border-top:var(--box-notice3); }
|
||||
|
@ -21,7 +21,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
list: function(can, root, cb, cbs, target) { target = target||can._output
|
||||
can.core.List(root.list, function(item) { var ui = can.page.Append(can, target, [{view: [[html.ITEM, "open"]], list: [{text: item.meta.name}, item.list && {icon: icon.CHEVRON_DOWN}], onclick: function(event) {
|
||||
can.page.ClassList.set(can, ui.item, "open", can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list))
|
||||
can.onmotion.select(can, target, html.DIV_ITEM, event.target)
|
||||
can.onmotion.select(can, target, html.DIV_ITEM, event.currentTarget)
|
||||
}, _init: function(target) { if (item.meta.name == "_") { target.innerHTML = "", can.onappend.style(can, html.SPACE, target) }
|
||||
cbs && cbs(target, item)
|
||||
}}, {view: html.LIST}]); can.onimport.list(can, item, cb, cbs, ui.list) })
|
||||
@ -60,6 +60,11 @@ Volcanos(chat.ONIMPORT, {
|
||||
can.page.OrderTable(can, target), can.page.ClassList.add(can, target, chat.CONTENT)
|
||||
can.page.Select(can, target, html.TD, function(item) { can.onmotion.copy(can, item) })
|
||||
},
|
||||
order: function(can, meta, target) {
|
||||
target.onclick = function(event) {
|
||||
can.user.copy(event, can, event.target.innerText)
|
||||
}
|
||||
},
|
||||
chart: function(can, meta, target) {
|
||||
if (!meta.fg && !meta.bg) { target.className.baseVal = "story auto" }
|
||||
target.onclick = function(event) { can.misc.Event(event, can, function(msg) {
|
||||
@ -72,20 +77,22 @@ Volcanos(chat.ONIMPORT, {
|
||||
}) }
|
||||
},
|
||||
field: function(can, meta, target) { var item = can.base.Obj(meta.meta), padding = can.Conf(html.PADDING)
|
||||
var height = can.base.Max(html.STORY_HEIGHT, can.ConfHeight()-4*html.ACTION_HEIGHT-2*padding), width = item.width||can.ConfWidth()-2*padding-2
|
||||
var height = can.base.Max(html.STORY_HEIGHT, can.ConfHeight()-4*html.ACTION_HEIGHT-2*padding), width = item.width||can.ConfWidth()-2*padding
|
||||
can.core.Item(item, function(key, value) { if (can.base.beginWith(key, "meta.")) { can.core.Value(item, key, value), delete(item[key]) } })
|
||||
can.onappend.plugin(can, item, function(sub) { can._plugins = (can._plugins||[]).concat([sub])
|
||||
can.user.isMobile || sub.Conf("__width", item.width)
|
||||
can.core.Value(item, "auto.cmd") && can.onmotion.delay(function() { sub.runAction(sub.request({}, can.core.Value(item, "opts")), can.core.Value(item, "auto.cmd")) })
|
||||
var size = sub.onimport.size; sub.onimport.size = function(can, height, width, auto, mode) { size(can, height, width, auto, mode), can.page.style(can, sub._output, html.MAX_HEIGHT, "", "overflow-y", "hidden") }
|
||||
sub.onimport.size(sub, height, width, true)
|
||||
var size = sub.onimport.size; sub.onimport.size = function(can, height, width, auto, mode) { size(can, height, width, auto, mode)
|
||||
can.page.style(can, sub._output, html.MAX_HEIGHT, "", "overflow-y", "hidden")
|
||||
sub.sub && sub.sub.ui.content && can.page.style(can, sub.sub.ui.content, html.HEIGHT, "", "overflow-y", "hidden")
|
||||
}, sub.onimport.size(sub, height, width, true)
|
||||
can.onimport.layout(can)
|
||||
}, can._output, target)
|
||||
},
|
||||
layout: function(can) { padding = can.Conf(html.PADDING)
|
||||
if (can.sup._navmenu) { can.ConfWidth(can.ConfWidth()-can.sup._navmenu.offsetWidth)
|
||||
can.page.style(can, can.sup._navmenu, html.HEIGHT, can.ConfHeight())
|
||||
can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth(), "clear", "none", "float", "left")
|
||||
} else {
|
||||
// can.isCmdMode() && can.page.style(can, can._output, html.HEIGHT, "", html.MAX_HEIGHT, "")
|
||||
}
|
||||
can.core.List(can._plugins, function(sub) { sub.onimport.size(sub, can.base.Min(can.ConfHeight()/2, 300, 600), (can.ConfWidth()-2*padding), true) })
|
||||
can.page.Select(can, can._output, html.IMG, function(target) { can.page.style(can, target, html.MAX_HEIGHT, can.base.Max(can.ConfHeight(), 420)) })
|
||||
|
@ -1,7 +1,8 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_process: function(can, msg) {
|
||||
if (msg.IsErr()) { can.onappend.style(can, "warn", can.user.toastFailure(can, msg.Result())._target) }
|
||||
if (can.onimport[msg.OptionProcess()]) { return can.core.CallFunc([can.onimport, msg.OptionProcess()], {can: can, sub: can.sub, msg: msg, arg: msg.Option("_arg")}), true } },
|
||||
if (can.onimport[msg.OptionProcess()]) { return can.core.CallFunc([can.onimport, msg.OptionProcess()], {can: can, sub: can.sub, msg: msg, arg: msg.Option("_arg")}), true }
|
||||
},
|
||||
_location: function(can, msg, arg) { can.user.jumps(arg) },
|
||||
_replace: function(can, msg, arg) { location.replace(arg) },
|
||||
_history: function(can, msg) { history.length == 1? can.user.close(): history.back() },
|
||||
@ -14,11 +15,18 @@ Volcanos(chat.ONIMPORT, {
|
||||
_display: function(can, msg) { can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY)) },
|
||||
_clear: function(can, msg) { can.onmotion.clear(can) },
|
||||
_inner: function(can, sub, msg) { sub = sub||can, can.onmotion.scrollIntoView(can, can.onappend.table(sub, msg)), can.onmotion.scrollIntoView(can, can.onappend.board(sub, msg)), can.onmotion.story.auto(sub) },
|
||||
_cookie: function(can, msg) { can.misc.Cookie(can, msg._arg[0], msg._arg[1]), can.Update() },
|
||||
_cookie: function(can, msg) { can.misc.Cookie(can, msg._arg[0], msg._arg[1])
|
||||
if (msg._arg[2]) {
|
||||
history.go(msg._arg[2])
|
||||
can.onmotion.delay(can, function() { history.back() }, 300)
|
||||
} else {
|
||||
can.Update()
|
||||
}
|
||||
},
|
||||
_session: function(can, msg) { can.misc.sessionStorage(can, msg._arg[0], msg._arg[1]), can.Update() },
|
||||
_field: function(can, msg, cb) {
|
||||
can.page.style(can, can._target, "visibility", "")
|
||||
can.page.style(can, can._output, "visibility", "")
|
||||
can.user.isMobile && can.onmotion.clear(can, can._output)
|
||||
can.page.style(can, can._target, "visibility", ""), can.page.style(can, can._output, "visibility", "")
|
||||
var height = can.ConfHeight()-can.onexport.actionHeight(can)-(can.onexport.statusHeight(can)||1), width = can.ConfWidth()
|
||||
var tabs = false, tabHash = msg.Option("field.tabs"); if (tabHash) {
|
||||
can.sub && can.sub.onimport.tabs(can.sub, [{name: tabHash.slice(0, 6)}], function() { can.onmotion.cache(can, function() { return tabHash }) }), tabs = true
|
||||
@ -29,10 +37,12 @@ Volcanos(chat.ONIMPORT, {
|
||||
height = can.base.Max(html.STORY_HEIGHT, height)
|
||||
}
|
||||
}
|
||||
var option = can.base.Obj(msg.Option("field.option"))
|
||||
msg.Table(function(item) { tabs && can.onmotion.cache(can, function() { return tabHash })
|
||||
can.onappend._plugin(can, item, {index: item.index, args: can.base.Obj(item.args||item.arg, []), height: height, width: width}, function(sub) { can._plugins = (can._plugins||[]).concat([sub])
|
||||
sub.run = function(event, cmds, cb) { var index = msg.Option(ice.MSG_INDEX)||item.index; can.run(can.request(event, {pod: item.space}), (msg[ice.FIELD_PREFIX]? msg[ice.FIELD_PREFIX]: index? [ctx.RUN, index]: []).concat(cmds), cb, true) }
|
||||
can.page.ClassList.has(can, sub._target, html.FLOAT)? can.onmotion.float(sub): sub.onimport.size(sub, height, width, true), cb && cb(sub)
|
||||
var sup = item.space? can._root.Action: can; height = can.base.Max(item._height||height, can.ConfHeight()), width = can.base.Max(item._width||width, can.ConfWidth())
|
||||
can.onappend._plugin(sup, item, {index: item.index, args: can.base.Obj(item.args||item.arg, []), height: height, width: width, icons: item._icon}, function(sub) { can._plugins = (can._plugins||[]).concat([sub])
|
||||
sub.run = function(event, cmds, cb) { var index = msg.Option(ice.MSG_INDEX)||item.index; sup.run(can.request(event, {pod: item.space}, option), (msg[ice.FIELD_PREFIX]? msg[ice.FIELD_PREFIX]: index? [ctx.RUN, index]: []).concat(cmds), cb, true) }
|
||||
can.page.ClassList.has(can, sub._target, html.FLOAT)? can.onmotion.float(sub): sub.onimport.size(sub, height, width, !can.user.isMobile), cb && cb(sub)
|
||||
if (item.style == html.FLOAT) { return } can.onmotion.delay(can, function() { can.onmotion.scrollIntoView(can, sub._target) }, 300)
|
||||
sub.onexport.output = function() { if (tabs) { msg.Option(ice.MSG_ACTION) && can.onappend._action(can, msg.Option(ice.MSG_ACTION))
|
||||
sub.sub.onimport.tabs(sub.sub, [{name: tabHash.slice(0, 6)}], function() { tabs || can.onmotion.cache(can, function() { return tabHash }) }), tabs = false
|
||||
@ -42,7 +52,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
},
|
||||
_float: function(can, msg) { can.onimport._field(can, msg, function(sub) { can.onmotion.float(sub) }) },
|
||||
_hold: function(can, msg, arg) { can.user.toast(can, arg||ice.SUCCESS) },
|
||||
_back: function(can) { can.onimport.back({}, can) },
|
||||
_back: function(can, msg, arg) { arg? (history.go(arg), can.onmotion.delay(can, function() { can.onimport.back({}, can) })): can.onimport.back({}, can) },
|
||||
_rich: function(can, msg) { var sub = can.sub
|
||||
function _rich() {
|
||||
if (sub._rich_list.length == 0) { return } if (sub._rich_running) { return } sub._rich_running = true
|
||||
@ -71,7 +81,9 @@ Volcanos(chat.ONIMPORT, {
|
||||
}); return
|
||||
},
|
||||
_grow: function(can, msg, arg) {
|
||||
var sub = can.sub; if (sub && sub.onimport && sub.onimport.grow) { return sub.onimport.grow(sub, msg, msg.detail[1], msg.detail[2]) }
|
||||
var sub = can.sub
|
||||
if (sub && sub.onimport && sub.onimport._grow) { return sub.onimport._grow(sub, msg, msg.detail[1], msg.detail[2]) }
|
||||
if (sub && sub.onimport && sub.onimport.grow) { return sub.onimport.grow(sub, msg, msg.detail[1], msg.detail[2]) }
|
||||
if (msg.Option(ctx.DISPLAY)) {
|
||||
function _grow() { if (can.sub._grow_list.length == 0) { return } if (can.sub._grow_running) { return } can.sub._grow_running = true
|
||||
var msg = can.sub._grow_list.shift(), text = msg.detail[1]; sub._grow.onappend._status(sub._grow, msg.Option(ice.MSG_STATUS), null, msg)
|
||||
@ -116,7 +128,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
(can.page.style(can, can._output, html.HEIGHT, height, html.WIDTH, width, html.MAX_HEIGHT, "", html.MAX_WIDTH, ""), can.page.style(can, can._target, html.WIDTH, width))
|
||||
if (can.misc.Search(can, log.DEBUG) == ice.TRUE) { can.Status(html.HEIGHT, can.base.Max(height, can._output.offsetHeight), html.WIDTH, width) }
|
||||
can.page.style(can, can._status, html.MAX_WIDTH, width)
|
||||
can.core.List(can._plugins, function(sub) { sub.onimport.size(sub, height, width, false) })
|
||||
can.core.List(can._plugins, function(sub) { can.page.tagis(sub._target, "fieldset.float") || sub.onimport.size(sub, height, width, false) })
|
||||
var sub = can.sub; if (!sub) { return auto } sub.Mode(mode), sub.ConfHeight(height), sub.ConfWidth(width), can.onimport._size(can)
|
||||
mode? sub.onlayout[mode](sub, height, width): sub.onlayout._init(sub, height, width)
|
||||
return auto
|
||||
@ -126,10 +138,13 @@ Volcanos(chat.ONIMPORT, {
|
||||
var _height = can.base.Max(sub._target.offsetHeight+border, can.ConfHeight()/2)
|
||||
sub.onimport.size(sub, _height-border, can.ConfWidth()-(can.ui && can.ui.project? can.ui.project.offsetWidth: 0), true)
|
||||
},
|
||||
back: function(event, can) { can._history.pop(); for (var i = 0, his = can._history.pop(); his; his = can._history.pop()) { if (his[0] == ctx.ACTION) { continue }
|
||||
back: function(event, can) { can._history.pop()
|
||||
for (var i = 0, his = can._history.pop(); his; his = can._history.pop()) { if (his[0] == ctx.ACTION) { continue }
|
||||
can.page.SelectArgs(can, can._option, "", function(target) { target.value = his[i++]||"", can.page.Select(can, target.parentNode, "span.value", function(target) { target.innerText = target.value||"" }) })
|
||||
can.page.SelectArgs(can, can._action, "", function(target) { target.value = his[i++]||"" }); break
|
||||
} can.Update(event) },
|
||||
}
|
||||
can.onexport.hash(can, ""), can.Update(event)
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {
|
||||
list: ["刷新数据",
|
||||
@ -252,6 +267,11 @@ Volcanos(chat.ONACTION, {
|
||||
"删除工具": function(event, can) { can.onaction._close(event, can) },
|
||||
|
||||
refresh: function(event, can) { can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), true, can.Mode()) },
|
||||
detail: function(event, can) { var msg = can.request(event)
|
||||
can.core.Item(can.Option(), function(key, value) {
|
||||
can.Option(key, msg.Option(key)||"")
|
||||
}), can.Update()
|
||||
},
|
||||
close: function(event, can) {
|
||||
if (can.isCmdMode()) {
|
||||
can.user.close()
|
||||
@ -335,12 +355,20 @@ Volcanos(chat.ONEXPORT, {
|
||||
session: function(can, key, value) { if (value) { value = JSON.stringify(value) }
|
||||
return can.misc.sessionStorage(can, [can.ConfSpace()||can.misc.Search(can, ice.POD), can.ConfIndex(), key, location.pathname], value)
|
||||
},
|
||||
storage: function(can, key, value) { if (value) { value = JSON.stringify(value) }
|
||||
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)
|
||||
return hash
|
||||
},
|
||||
title: function(can, title) { if (!can.isCmdMode()) { return }
|
||||
var list = []; function push(p) { p && list.indexOf(p) == -1 && list.push(p) }
|
||||
if (!can.base.isIn(can.ConfIndex(), web.PORTAL)) {
|
||||
push(can.user.trans(can, can.ConfIndex(), can.Conf("help")))
|
||||
if (!can.user.isMobile) {
|
||||
if (arguments.length == 2 && !can.base.isIn(can.ConfIndex(), web.PORTAL, code.VIMER, wiki.FEEL)) { push(can.user.trans(can, can.ConfIndex().split(".").pop(), can.ConfHelp())) }
|
||||
}
|
||||
can.core.List(arguments, function(title, index) { index > 0 && push(title) }), push(can.ConfSpace()||can.misc.Search(can, ice.POD))
|
||||
can.core.List(arguments, function(title, index) { index > 0 && push(title) })
|
||||
can.user.isMobile || push(can.user.mod.isPod? can.user.info.titles||can.ConfSpace()||can.misc.Search(can, ice.POD): location.host)
|
||||
can.user.title(list.join(" "))
|
||||
},
|
||||
args: function(can) { return can.Option() },
|
||||
@ -348,10 +376,8 @@ Volcanos(chat.ONEXPORT, {
|
||||
// if (can.sub && can.sub.onexport.link) { return can.sub.onexport.link(can.sub) }
|
||||
var args = can.Option(); args.pod = can.ConfSpace()||can.misc.Search(can, ice.POD), args.cmd = can.ConfIndex()
|
||||
can.core.Item(args, function(key, value) { key != ice.POD && !value && delete(args[key]) })
|
||||
var hash = can.misc.localStorage(can, [args.pod, args.cmd, "hash"])||""
|
||||
can.base.isArray(hash) && (hash = hash.join(":"))
|
||||
hash && (hash = "#"+hash)
|
||||
return can.misc.MergePodCmd(can, args, true)+hash
|
||||
var hash = can.onexport.storage(can, "hash")||""; can.base.isArray(hash) && (hash = hash.join(":")), hash && (hash = "#"+hash)
|
||||
return can.base.replaceAll(can.misc.MergePodCmd(can, args, true), "%2F", "/")+hash
|
||||
},
|
||||
close: function(can, msg) {},
|
||||
})
|
||||
|
@ -5,7 +5,11 @@ Volcanos(chat.ONIMPORT, {
|
||||
return {view: [[html.ITEM, item.type]], list: [item.type != html.BUTTON && {text: [can.user.trans(can, item.name, item._trans, html.INPUT), "", mdb.NAME]}, item.need == "must" && {text: ["*", "", "need"]}], _init: function(target) {
|
||||
item.type == html.BUTTON && (item.onclick = function(event) { var args = []
|
||||
can.core.Item(can.page.SelectArgs(can, can._output)[0], function(key, value) { args.push(key, value) })
|
||||
can.Update(can.request(event, {_handle: ice.TRUE}), [ctx.ACTION, item.name].concat(args), function() {
|
||||
can.Update(can.request(event, {_handle: ice.TRUE}), [ctx.ACTION, item.name].concat(args), function(msg) {
|
||||
if (msg.IsErr()) {
|
||||
can.user.toastFailure(can, msg.Result())
|
||||
return
|
||||
}
|
||||
can.Update()
|
||||
})
|
||||
}), can.onappend.input(can, item, "", target)
|
||||
|
@ -1,13 +1,13 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg, cb) { can.page.requireDraw(can, function() { can.db.delay = 50
|
||||
can.onappend.style(can, "pie")
|
||||
_init: function(can, msg, cb) { can.ui = can.onappend.layout(can)
|
||||
can.page.requireDraw(can, function() { can.db.delay = 50, can.onappend.style(can, "pie"), can.onaction.list = []
|
||||
can.list = can.onimport._data(can, msg, can.Conf(mdb.FIELD)||msg.append[1]||mdb.VALUE)
|
||||
can.core.List(can.list, function(item) { msg.Push("weight", item.value.weight = parseInt(item.span*100/360)+"%").Push(cli.COLOR, '<span style="background-color:'+item.color+'"> </span>') })
|
||||
can.onaction.list = [], can.ui.display = can.page.Append(can, can._output, [html.DISPLAY])._target
|
||||
can.onappend.table(can, msg, null, can.ui.display), can.page.Select(can, can.ui.display, html.TR, function(tr, index) { can.ui.table = tr.parentNode
|
||||
can.onappend.table(can, msg, null, can.ui.profile), can.page.Select(can, can.ui.profile, html.TR, function(tr, index) { can.ui.table = tr.parentNode
|
||||
can.page.Modify(can, tr, {onmouseenter: function(event) { can._draw(can.db.which = index-1) }})
|
||||
}), can.base.isFunc(cb) && cb(msg), can.onappend._status(can, msg.append)
|
||||
}) },
|
||||
})
|
||||
},
|
||||
_data: function(can, msg, field) { var list = []
|
||||
var color = [
|
||||
"#8085e9",
|
||||
@ -69,6 +69,15 @@ Volcanos(chat.ONIMPORT, {
|
||||
return parseInt(value)
|
||||
},
|
||||
layout: function(can) { if (!can.ui || !can.ui.svg) { return }
|
||||
can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.display), can.onmotion.toggle(can, can.ui.profile, true)
|
||||
var _width = can.base.Max(can.ConfWidth()-can.ConfHeight(), 600, 200)
|
||||
can.page.style(can, can.ui.profile, html.HEIGHT, can.ConfHeight(), html.WIDTH, _width, html.FLEX, "0 0 "+(_width)+"px")
|
||||
var width = can.ConfWidth()-_width, height = can.ConfHeight()-4, margin = 40, r = can.base.Max(height, width)/2-1*margin-margin
|
||||
can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight(), html.WIDTH, width)
|
||||
can.ui.svg.Val(html.WIDTH, width), can.ui.svg.Val(html.HEIGHT, height)
|
||||
can._draw = function(which) { can.onimport._draw(can, width/2-margin/2, height/2-margin/2, r, margin, which) }, can._draw(can.db.which||0)
|
||||
return
|
||||
|
||||
var height = can.base.Max(can.ConfHeight(), can.ConfWidth()/2), margin = 10, r = height/2-1*margin-margin
|
||||
can.page.style(can, can.ui.display, html.WIDTH, can.ConfWidth()-height-1), can.ui.svg.Val(html.HEIGHT, height), can.ui.svg.Val(html.WIDTH, height)
|
||||
can._draw = function(which) { can.onimport._draw(can, height/2-margin/2, can.ConfHeight()/2-margin/2, r, margin, which) }, can._draw(can.db.which||0)
|
||||
|
@ -1,12 +1,15 @@
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(can, function() { msg.append && can.ConfDefault({field: msg.append[0], split: nfs.PS})
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg, cb) { can.page.requireDraw(can, function() { msg.append && can.ConfDefault({field: msg.append[0], split: nfs.PS})
|
||||
can.db.count = msg.Length()
|
||||
can.onmotion.toggle(can, can._action, true)
|
||||
can.dir_root = can.Conf(nfs.DIR_ROOT)||msg.Option(nfs.DIR_ROOT), can._tree = can.onimport._tree(can, msg.Table(), can.Conf(mdb.FIELD), can.Conf(lex.SPLIT))
|
||||
can.onaction.list = [], can.base.isFunc(cb) && cb(msg), can.onimport.layout(can), can.onmotion.toggle(can, can._action, true)
|
||||
can.onappend._status(can, msg.Option(ice.MSG_STATUS))
|
||||
can.onaction.list = [], can.base.isFunc(cb) && cb(msg), can.onappend._status(can, msg.Option(ice.MSG_STATUS)), can.onimport.layout(can)
|
||||
can.onappend.style(can, "spides")
|
||||
}) },
|
||||
_tree: function(can, list, field, split) { var node = {}; can.core.List(list, function(item) { can.core.List(item[field].split(split), function(value, index, array) {
|
||||
var last = array.slice(0, index).join(split)||can.dir_root, name = array.slice(0, index+1).join(split)
|
||||
value && !node[name] && (node[last] = node[last]||{name: last, meta: {}, list: []}).list.push(node[name] = {
|
||||
name: value+(index==array.length-1? "": split), file: item[field]||item.file, hide: true, meta: item, list: [], last: node[last],
|
||||
name: value+(index==array.length-1? "": split), file: item.file||item[field]||item.file, hide: true, meta: item, list: [], last: node[last],
|
||||
})
|
||||
}) }); return node },
|
||||
_height: function(can, tree) { tree.height = 0; if (tree.list.length == 0 || tree.hide) { return tree.height = 1 }
|
||||
@ -15,7 +18,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca
|
||||
_width: function(can, tree) { tree.width = 0; if (tree.list.length == 0 || tree.hide) {
|
||||
return tree.width = can.onimport.draw(can, {shape: html.TEXT, points: [{x: 0, y: 0}], style: {inner: tree.name}}).Val(svg.TEXT_LENGTH)+can.margin
|
||||
} can.core.List(tree.list, function(item) { tree.width += can.onimport._width(can, item) }); return tree.width },
|
||||
_color: function(can, tree) { return tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW) },
|
||||
_color: function(can, tree) {
|
||||
return tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW)
|
||||
},
|
||||
layout: function(can) {
|
||||
can.ui.svg && can.ui.svg.Val(svg.FONT_SIZE, can.size = parseInt(can.Action(html.SIZE)||24)), can.margin = parseInt(can.Action(html.MARGIN)||10)
|
||||
can._tree && can._tree[can.dir_root] && can.core.CallFunc(can.onaction[can.Action(html.VIEW)||"横向"], [event, can, can.Action(html.VIEW)])
|
||||
@ -59,8 +64,26 @@ Volcanos(chat.ONDETAIL, {
|
||||
for (var node = tree; node; node = node.last) { can.request(event, node.meta) }
|
||||
can.run(can.request(event, can.Option()), can.base.Obj(can.Conf(lex.PREFIX), []).concat(can.Conf(ctx.ACTION)||[], [tree.file||"", tree.name]), function(msg) {
|
||||
if (msg.Length() == 0) { return can.onappend._float(can, web.CODE_INNER, [can._msg.Option(nfs.DIR_ROOT), tree.file, tree.line]) }
|
||||
if (msg.Append(mdb.INDEX)) { return msg.Table(function(value) { can.onappend._float(can, value.index, value.args) }) }
|
||||
if (msg.Append(mdb.INDEX)) {
|
||||
return msg.Table(function(value) { value.style = html.FLOAT, can.onappend.plugin(can, value, function(sub) {}) })
|
||||
}
|
||||
can.Status(mdb.COUNT, can.db.count += msg.Length())
|
||||
tree.list = can.onimport._tree(can, msg.Table(), can.Conf(mdb.FIELD), can.Conf(lex.SPLIT))[can.dir_root].list
|
||||
tree.hide = false, can.onimport.layout(can)
|
||||
}, true)
|
||||
},
|
||||
oncontextmenu: function(event, can, tree) {
|
||||
can.user.carte(event, can, {}, [
|
||||
wiki.PORTAL, chat.DESKTOP, chat.ADMIN, wiki.WORD, web.DREAM, web.STORE,
|
||||
code.VIMER, code.STATUS, code.COMPILE, cli.RUNTIME, code.XTERM,
|
||||
], function(event, button) {
|
||||
if (button == web.ADMIN) {
|
||||
can.onappend.plugin(can, {index: web.CHAT_IFRAME, args: [
|
||||
can.misc.MergePodCmd(can, {pod: tree.file, cmd: web.ADMIN})
|
||||
], title: tree.name+"."+web.ADMIN, style: html.FLOAT}, function(sub) {})
|
||||
} else {
|
||||
can.onappend.plugin(can, {space: tree.file, index: button, style: html.FLOAT}, function(sub) {})
|
||||
}
|
||||
})
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONEXPORT, {list: [mdb.TIME, mdb.COUNT]})
|
||||
|
81
plugin/story/weight.js
Normal file
@ -0,0 +1,81 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg, cb) { can.ui = can.onappend.layout(can)
|
||||
can.page.requireDraw(can, function() { can.db.delay = 50, can.onappend.style(can, "pie"), can.onaction.list = []
|
||||
can.list = can.onimport._data(can, msg, can.Conf(mdb.FIELD)||msg.append[1]||mdb.VALUE)
|
||||
can.core.List(can.list, function(item) { msg.Push("weight", item.value.weight = parseInt(item.span*100/360)+"%").Push(cli.COLOR, '<span style="background-color:'+item.color+'"> </span>') })
|
||||
can.onappend.table(can, msg, null, can.ui.profile), can.page.Select(can, can.ui.profile, html.TR, function(tr, index) { can.ui.table = tr.parentNode
|
||||
can.page.Modify(can, tr, {onmouseenter: function(event) { can._draw(can.db.which = index-1) }})
|
||||
}), can.base.isFunc(cb) && cb(msg), can.onappend._status(can, msg.append)
|
||||
})
|
||||
},
|
||||
_data: function(can, msg, field) { var list = []
|
||||
var color = [
|
||||
"#8085e9",
|
||||
"#95a2ff",
|
||||
"#73abf5",
|
||||
"#3cb9fc",
|
||||
"#0082fc",
|
||||
"#87e885",
|
||||
"#90ed7d",
|
||||
"#22ed7c",
|
||||
"#05f8d6",
|
||||
"#cb9bff",
|
||||
"#bf19ff",
|
||||
"#f47a75",
|
||||
"#fa8080",
|
||||
"#f7a35c",
|
||||
"#ffc076",
|
||||
"#f9e264",
|
||||
"#fae768",
|
||||
"#5f45ff",
|
||||
"#02cdff",
|
||||
"#0090ff",
|
||||
"#854cff",
|
||||
"#09b0d3",
|
||||
"#1d27c9",
|
||||
"#765005",
|
||||
"#314976",
|
||||
"#009db2",
|
||||
"#024b51",
|
||||
"#0780cf",
|
||||
]
|
||||
var total = 0; msg.Table(function(value) { total += can.onimport._parseInt(can, value[field]) })
|
||||
var begin = 0; msg[cli.COLOR] = [], msg["weight"] = [], msg.Table(function(value, index) {
|
||||
list.push({span: can.onimport._parseInt(can, value[field])/total*360, color: color[index%color.length], value: value})
|
||||
}); return list
|
||||
},
|
||||
_draw: function(can, x, y, r, margin, which) { if (which == can._last) { return } can._last = which
|
||||
if (can.list.length == 1) { return can.onimport.draw(can, {shape: svg.CIRCLE, points: [{x: x, y: y}, {x: x, y: y+r}], style: {fill: cli.BLUE}}) }
|
||||
function pos(x, y, r, angle) { angle -= 90; return [x + r * Math.cos(angle * Math.PI / 180), y + r * Math.sin(angle * Math.PI / 180)] }
|
||||
function pie(x, y, r, begin, span, color, title, cb) { can.onimport.draw(can, {shape: svg.PATH, style: kit.Dict(
|
||||
svg.STROKE, color, svg.FILL, color, "d", can.base.joins([
|
||||
["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0", span>180? "1": "0", "1"].concat(pos(x, y, r, begin+span)), ["Z"]
|
||||
], lex.SP, mdb.FS),
|
||||
), onmouseenter: function(event) { can.base.isFunc(cb) && cb(event) } }) }
|
||||
can.onmotion.clear(can, can.ui.svg), can.ui.svg.Value(mdb.COUNT, 0)
|
||||
var begin = 0; can.core.Next(can.list, function(item, next, index) { var p = index==which? pos(x, y, 1*margin, begin+item.span/2): [x, y]
|
||||
if (item.value.name == "rest") { return can.onmotion.delay(can, next, can.db.delay) }
|
||||
pie(p[0], p[1], r, begin, item.span, item.color, item.name||item.command, function(event) { can.onimport._draw(can, x, y, r, margin, can.db.which = index) }), begin += item.span
|
||||
index == which && (can.db.current = item.value)
|
||||
can.onmotion.select(can, can.ui.table, html.TR, index), can.Status(item.value), can.onmotion.delay(can, next, can.db.delay)
|
||||
}, function() {
|
||||
can.onmotion.select(can, can.ui.table, html.TR, which), can.Status(can.db.current), can.db.delay = 0
|
||||
})
|
||||
},
|
||||
_parseInt: function(can, value) { value = value.toLowerCase()
|
||||
if (can.base.endWith(value, "m")) { return parseInt(value)*1000000 }
|
||||
if (can.base.endWith(value, "g")) { return parseInt(value)*1000000000 }
|
||||
if (can.base.endWith(value, "gi")) { return parseInt(value)*1000000000 }
|
||||
if (can.base.endWith(value, "mi")) { return parseInt(value)*1000000 }
|
||||
return parseInt(value)
|
||||
},
|
||||
layout: function(can) { if (!can.ui || !can.ui.svg) { return }
|
||||
can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.display), can.onmotion.toggle(can, can.ui.profile, true)
|
||||
var _width = can.base.Max(can.ConfWidth()-can.ConfHeight(), 600, 200)
|
||||
can.page.style(can, can.ui.profile, html.HEIGHT, can.ConfHeight(), html.WIDTH, _width, html.FLEX, "0 0 "+(_width)+"px")
|
||||
var width = can.ConfWidth()-_width, height = can.ConfHeight()-4, margin = 40, r = can.base.Max(height, width)/2-1*margin-margin
|
||||
can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight(), html.WIDTH, width)
|
||||
can.ui.svg.Val(html.WIDTH, width), can.ui.svg.Val(html.HEIGHT, height)
|
||||
can._draw = function(which) { can.onimport._draw(can, width/2-margin/2, height/2-margin/2, r, margin, which) }, can._draw(can.db.which||-1)
|
||||
},
|
||||
})
|
301
plugin/table.js
@ -1,8 +1,9 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg, target, cb) {
|
||||
if (msg.index && msg.meta && msg.list) { return cb && cb(msg), can.sup.onimport._field(can.sup, msg) }
|
||||
if (can.isCmdMode() && can.Conf(ctx.STYLE) == html.FORM) { can.onappend.style(can, html.OUTPUT) }
|
||||
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)
|
||||
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 {
|
||||
@ -11,17 +12,20 @@ Volcanos(chat.ONIMPORT, {
|
||||
},
|
||||
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.Resource(can, value.icon = value.icons||value.icon||value.image, msg.Option(ice.MSG_USERPOD), msg.Option(ice.MSG_USERWEB))
|
||||
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: [
|
||||
value.icon && {className: can.base.contains(img, ".jpg")? "jpg": "", img: img},
|
||||
{view: wiki.TITLE, list: [{text: value.name}, can.onappend.label(can, value)]},
|
||||
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.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) })
|
||||
}},
|
||||
]}
|
||||
})), can.onimport.layout = can.onimport.layout||function() { var height = can.onlayout.expand(can, target); can.sup.onexport.outputMargin = function() { return height } }
|
||||
})), can.onimport.layout = can.onimport.layout||function() {
|
||||
var height = can.onlayout.expand(can, target); can.sup.onexport.outputMargin = function() { return height }
|
||||
can.onmotion.delay(can, function() { can.onlayout.expand(can, target) })
|
||||
}
|
||||
},
|
||||
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))
|
||||
@ -113,6 +117,8 @@ Volcanos(chat.ONIMPORT, {
|
||||
return icon && (can.base.contains(icon, ice.HTTP, ".ico", ".png", ".jpg")? {img: can.misc.Resource(can, icon)}: {icon: icon})
|
||||
},
|
||||
_nick: function(can, item) {
|
||||
if (can.base.isArray(item.nick)) { return item.nick }
|
||||
if (can.base.isObject(item.nick)) { return item.nick }
|
||||
return {text: [item.nick||item.name||item.zone||item.sess, "", html.NAME], className: html.NAME}
|
||||
},
|
||||
_menu: function(event, can, item, cbs, target) { target = target||event.currentTarget
|
||||
@ -120,18 +126,25 @@ Volcanos(chat.ONIMPORT, {
|
||||
can.user.carteItem(event, can, item)
|
||||
},
|
||||
_item: function(can, item, cb, cbs) {
|
||||
item._hash = item._hash||item.hash||item.zone||item.path||item.name
|
||||
item._title = item._title||item.name||item.path||item.path||item.hash
|
||||
item._hash = item._hash||item.sess||item.hash||item.zone||item.path||item.name
|
||||
item._hash && item._hash.replaceAll && (item._hash = item._hash.replaceAll(":", "_"))
|
||||
item._title = item._title||item.name||item.path||item.zone||item.hash
|
||||
item._select == undefined && can.db.hash[0] && (item._select = can.db.hash[0] == item._hash)
|
||||
if (typeof item._hash == code.OBJECT) { item._select = true
|
||||
for (var i = 0; i < item._hash.length; i++) {
|
||||
if (item._hash[i] != can.db.hash[i]) { item._select = false; break }
|
||||
}
|
||||
}
|
||||
return {view: [[html.ITEM, item.type, item.role, item.status]], title: item.title||item.nick, list: [
|
||||
can.onimport._icons(can, item), can.onimport._nick(can, item),
|
||||
].concat(item._label||[], [
|
||||
item.action && {icon: "bi bi-three-dots", onclick: function(event) { can.onimport._menu(event, can, item, cbs) }},
|
||||
can.onimport._icons(can, item),
|
||||
].concat(can.onimport._nick(can, item), item._label||[], [
|
||||
(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) {
|
||||
can.db.value = item, can.onexport.hash(can, item._hash), can.onexport.title(can, item._title)
|
||||
cb(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)
|
||||
}, oncontextmenu: function(event) {
|
||||
can.onimport._menu(event, can, item, cbs)
|
||||
}}
|
||||
@ -140,8 +153,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) {
|
||||
@ -153,8 +166,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
|
||||
},
|
||||
@ -187,9 +201,9 @@ Volcanos(chat.ONIMPORT, {
|
||||
if (!next) { return true } next && next.click()
|
||||
} can.page.Remove(can, target), can.onexport.tabs && can.onexport.tabs(can)
|
||||
}
|
||||
return {view: [[html.TABS, tabs.type, tabs.role, tabs.status]], title: tabs.title||tabs.text, list: [
|
||||
can.onimport._icons(can, tabs), can.onimport._nick(can, tabs), {icon: mdb.DELETE, onclick: function(event) { tabs._target._close(), can.onkeymap.prevent(event) }},
|
||||
], onclick: function(event) {
|
||||
return {view: [[html.TABS, tabs.type, tabs.role, tabs.status]], title: tabs.title||tabs.text, list: [].concat(
|
||||
can.onimport._icons(can, tabs), can.onimport._nick(can, tabs), {icon: mdb.DELETE, onclick: function(event) { tabs._target._close(), can.onkeymap.prevent(event) }}
|
||||
), onclick: function(event) {
|
||||
can.onmotion.delay(can, function() { can.onmotion.scrollIntoView(can, tabs._target) })
|
||||
if (can.page.ClassList.has(can, tabs._target, html.SELECT)) { return }
|
||||
can.onmotion.select(can, action, html.DIV_TABS, tabs._target), can.base.isFunc(cb) && cb(event, tabs)
|
||||
@ -222,10 +236,12 @@ Volcanos(chat.ONIMPORT, {
|
||||
index == 0 && can.onappend.plugin(can, value, function(sub) { can.db.value._content_plugin = sub, can.onimport.layout(can) }, can.ui.content)
|
||||
index == 1 && can.onappend.plugin(can, value, function(sub) {
|
||||
can.onmotion.toggle(can, can.ui.display, true)
|
||||
can.db.value._display_plugin = sub, can.onimport.layout(can) }, can.ui.display)
|
||||
can.db.value._display_plugin = sub, can.onimport.layout(can)
|
||||
}, can.ui.display)
|
||||
index == 2 && can.onappend.plugin(can, value, function(sub) {
|
||||
can.onmotion.toggle(can, can.ui.profile, true)
|
||||
can.db.value._profile_plugin = sub, can.onimport.layout(can) }, can.ui.profile)
|
||||
can.db.value._profile_plugin = sub, can.onimport.layout(can)
|
||||
}, can.ui.profile)
|
||||
can.onmotion.delay(can, function() { can.onimport.layout(can) })
|
||||
can.onmotion.delay(can, function() { can.onimport.layout(can) }, 100)
|
||||
can.onmotion.delay(can, function() { can.onimport.layout(can) }, 300)
|
||||
@ -266,6 +282,205 @@ Volcanos(chat.ONIMPORT, {
|
||||
sub.onaction.close = function() { can.onmotion.hidden(can, target) }, can.base.isFunc(cb) && cb(sub)
|
||||
}, target, field)
|
||||
},
|
||||
_float: function(can, index, args) { args = args||[]
|
||||
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))
|
||||
}
|
||||
}
|
||||
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
|
||||
)
|
||||
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): ""),
|
||||
)
|
||||
},
|
||||
myField: function(can, sub) {
|
||||
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 })
|
||||
}
|
||||
},
|
||||
myPluginSelect: function(can, sub, _output) {
|
||||
can.page.SelectChild(can, _output, html.FIELDSET, function(target) { can.onmotion.toggle(can, target, target == sub._target) })
|
||||
can.page.SelectChild(can, sub._output, "*", function(target) { can.onmotion.toggle(can, target, true) })
|
||||
can.page.style(can, sub._action, html.DISPLAY, html.NONE)
|
||||
can.user.isMobile? sub.onimport.size(sub, window.innerHeight, window.innerWidth, false): sub.onimport.size(sub, sub.ConfHeight(), sub.ConfWidth(), false)
|
||||
can.onimport.myOption(sub)
|
||||
},
|
||||
myPlugin: function(can, value, cb) {
|
||||
var key = [value.space||can.ConfSpace(), value.index||can.ConfIndex()].concat(value.args||"").join(",")
|
||||
var sup = can._stacks_root; sup._stacks = sup._stacks||{}; var sub = (sup._stacks[key]||[])[0]; if (sub) { return sub._select() }
|
||||
var _output = sup._target.parentNode; value.height = sup.ConfHeight(), value.width = sup.ConfWidth()
|
||||
value.style = html.OUTPUT
|
||||
sup.onappend.plugin(can._root.Action, value, function(sub) { can.onimport.myField(can, sub)
|
||||
sub.misc.localStorage(sub, [sub.ConfSpace(), sub.ConfIndex(), mdb.HASH].join(","), "")
|
||||
sub.onexport.output = function(_sub, msg) { _sub._stacks_current = sup._stacks[key] = [sub], _sub._stacks_root = sup, sub._select() }
|
||||
sub._select = function() { can.onimport.myPluginSelect(can, sub, _output) }, sub._select(), cb && cb(sub)
|
||||
}, _output)
|
||||
},
|
||||
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 })
|
||||
})
|
||||
var STREET_NAME = plugin.sub.Conf("_street_name"), PLACE_NAME = plugin.sub.Conf("_place_name")
|
||||
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"))), 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() }
|
||||
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) })
|
||||
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()
|
||||
})
|
||||
}
|
||||
function reload(event) {
|
||||
sub.Update(sub.request(event, {_toast: "reload"}))
|
||||
}
|
||||
sub._select = function() { can.onimport.myOption(sub)
|
||||
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)
|
||||
can.user.isMobile && sub.onimport.size(sub, window.innerHeight-ACTION_HEIGHT, window.innerWidth, false)
|
||||
}, sub._select()
|
||||
}, _output)
|
||||
},
|
||||
myTabs: function(can, key, list, target) { var last = can.misc.Cookie(can, 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()
|
||||
}}
|
||||
}))
|
||||
},
|
||||
myView: function(can, msg, cb, cbs, target) {
|
||||
can.onimport.itemcards(can, msg, cb, cbs, target||can.ui.list)
|
||||
},
|
||||
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) {
|
||||
target.className.indexOf("_uid") > -1 && can.page.ClassList.add(can, target, "hide")
|
||||
})
|
||||
} else {
|
||||
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))
|
||||
}
|
||||
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)
|
||||
})
|
||||
can.onimport.shareTitle(can, msg)
|
||||
},
|
||||
itemcard: function(can, value, list, cb) { if (!list) { return }
|
||||
can.core.List(list, function(item) { if (!item || !item.list) { return }
|
||||
for (var i = 0; i < item.list.length; i++) { if (item.list[i] && typeof item.list[i] == code.STRING) { item.list[i] = {text: item.list[i]} } }
|
||||
})
|
||||
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() }
|
||||
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)
|
||||
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,
|
||||
), onclick: function(event) { can.onkeymap.prevent(event)
|
||||
can.onaction.updateAvatar && can.onaction.updateAvatar(event, can)
|
||||
}},
|
||||
{view: html.CONTAINER, list: list},
|
||||
], _init: function(target) {
|
||||
value.action && can.onmotion.slideAction(can, target)
|
||||
}},
|
||||
], onclick: function(event) { cb && cb(event, value)
|
||||
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])||""]]}
|
||||
},
|
||||
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]}
|
||||
},
|
||||
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)
|
||||
msg.Option("_share_icons", msg.Option("_share_icons")||value[icons]||value.icons||value.avatar)
|
||||
} },
|
||||
titleAction: function(can, value, filter) { var filter = can.core.List(arguments).slice(2)
|
||||
return {view: html.ACTION, _init: function(target) {
|
||||
if (value.Option) { return can.onappend._action(can, value.Option(ice.MSG_ACTION), target) }
|
||||
can.page.appendAction(can, value, target)
|
||||
can.page.Select(can, target, html.INPUT_BUTTON, function(target) {
|
||||
target.value = can.user.trans(can, target.name)
|
||||
if (filter.length > 0) {
|
||||
filter.indexOf(target.name) == -1 && can.page.Remove(can, target)
|
||||
} else {
|
||||
can.page.tagis(target, "input.notice") || can.page.Remove(can, target)
|
||||
}
|
||||
})
|
||||
}}
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONLAYOUT, {
|
||||
_init: function(can, height, width) { can.core.CallFunc([can.onimport, html.LAYOUT], {can: can, height: height, width: width}) },
|
||||
@ -283,10 +498,10 @@ Volcanos(chat.ONEXPORT, {
|
||||
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||"" })
|
||||
can.misc.SearchHash(can, hash), can.misc.localStorage(can, [can.ConfSpace()||can.misc.Search(can, ice.POD), can.ConfIndex(), "hash"], hash)
|
||||
return hash
|
||||
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)
|
||||
@ -298,6 +513,31 @@ Volcanos(chat.ONACTION, {
|
||||
if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs||can._action, html.DIV_TABS)) { return }
|
||||
can.onkeymap._parse(event, can)
|
||||
},
|
||||
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 }))))
|
||||
},
|
||||
onslidedown: function(event, can, data, direction) {
|
||||
return
|
||||
var target = can.ui.list||can.ui.output||can._output
|
||||
if (target.scrollTop == 0) {
|
||||
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) {
|
||||
can.Update(can.request(event, {_toast: "reload"}))
|
||||
}
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONKEYMAP, {
|
||||
escape: function(event, can) {}, enter: function(event, can) {},
|
||||
@ -327,14 +567,17 @@ Volcanos(chat.ONKEYMAP, {
|
||||
}, _engine: {},
|
||||
})
|
||||
Volcanos(chat.ONINPUTS, {
|
||||
_nameicon: function(event, can, msg, target, name) {
|
||||
_nameicon: function(event, can, msg, target, name, title) { name = name||mdb.NAME
|
||||
can.page.Appends(can, can._output, msg.Table(function(value) {
|
||||
return {view: html.ITEM, list: [{img: can.misc.Resource(can, value.icons)},
|
||||
{view: html.CONTAINER, list: [{view: [html.TITLE, "", value[name]||value[mdb.NAME]]},
|
||||
can.onappend.label(can, value, {version: icon.version, time: icon.compile}),
|
||||
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"
|
||||
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)),
|
||||
]},
|
||||
], onclick: function(event) { can.showIcons(value[name]||value[mdb.NAME], value.icons) }}
|
||||
], onclick: function(event) { can.showIcons(value[name]||value[mdb.NAME], icons, _title) }}
|
||||
}))
|
||||
},
|
||||
dream: function(event, can, msg, target, name) { can.sup.sub.oninputs._nameicon(event, can, msg, target, name) },
|
||||
})
|
||||
|
||||
|
26
proto.js
@ -32,7 +32,9 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
|
||||
if (libs[0].indexOf(nfs.SRC) == 0 || libs[0].indexOf(nfs.USR) == 0) { libs[0] = nfs.P+libs[0] }
|
||||
if (libs[0][0] != nfs.PS && libs[0].indexOf(web.HTTP) != 0) { libs[0] = can._path.slice(0, can._path.lastIndexOf(ice.PS)+1)+libs[0] }
|
||||
// var name = (libs[0].indexOf(web.HTTP) == 0 || libs[0].indexOf("?pod=") > -1? libs[0]: libs[0].split(ice.QS)[0]).toLowerCase()
|
||||
var name = (libs[0].indexOf(web.HTTP) == 0 || libs[0].indexOf("?pod=") > -1? libs[0]: libs[0]).toLowerCase()
|
||||
// var name = (libs[0].indexOf(web.HTTP) == 0 || libs[0].indexOf("?pod=") > -1? libs[0]: libs[0]).toLowerCase()
|
||||
var name = libs[0].indexOf(web.HTTP) == 0 || libs[0].indexOf("?pod=") > -1? libs[0]: libs[0]
|
||||
if (name.indexOf("pod=") == -1) { name = name.toLowerCase() }
|
||||
function next() { can._load(name, cbs), can.require(libs.slice(1), cb, cbs) }
|
||||
if (name.indexOf("/lib/") == 0) { name = "/v"+name }
|
||||
if (name.indexOf("/panel/") == 0) { name = "/v"+name }
|
||||
@ -48,6 +50,7 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
|
||||
function set(key, value) {
|
||||
if (key == "_method") { return msg._method = value }
|
||||
if (key == "action" && value.indexOf("<input") == 0) { return }
|
||||
if (key == "extra") { return }
|
||||
if (typeof value == code.FUNCTION) { return msg[key] = value }
|
||||
value == "" || msg.Option(key) || msg.Option(key, value)
|
||||
}
|
||||
@ -62,7 +65,7 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
|
||||
can.core.List(arguments, function(item, index) { if (!item || index == 0) { return } can.core.Item(item, set) }); return msg
|
||||
},
|
||||
requestPodCmd: function(event) { return can.request(event, {pod: can.ConfSpace(), index: can.ConfIndex()}) },
|
||||
requestAction: function(event, button) { return can.request(event, {action: button, _toast: event.isTrusted? button+lex.SP+ice.PROCESS: ""}) },
|
||||
requestAction: function(event, button) { return can.request(event, {action: button, _toast: event.isTrusted? can.user.trans(can, button): ""}) },
|
||||
runActionInputs: function(event, cmds, cb) { var msg = can.request(event), meta = can.Conf()
|
||||
if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { var msg = can.request(event, {action: cmds[1]})
|
||||
if (can.base.isFunc(meta.feature[cmds[1]])) { return meta.feature[cmds[1]](can, msg, cmds.slice(2)) }
|
||||
@ -70,14 +73,11 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
|
||||
} can.runAction(event, cmds[1], cmds.slice(2), cb, true)
|
||||
},
|
||||
runActionCommand: function(event, index, args, cb) {
|
||||
can.request(event)._caller()
|
||||
// can.runAction(event, ctx.RUN, [index].concat(args), cb, true)
|
||||
var msg = can.request(event, {_handle: ice.TRUE}); can.request(event)._caller()
|
||||
can.run(event, [ctx.ACTION, ctx.RUN].concat(index, args||[]), cb, true)
|
||||
},
|
||||
runAction: function(event, action, args, cb, silent) {
|
||||
var msg = can.request(event, {_handle: ice.TRUE})
|
||||
// can.request(can.base.isIn(msg._can, can, can._fields? can.sup: can.sub)? can.Option(): {})._caller()
|
||||
can.request(event, can.Option())._caller()
|
||||
var msg = can.request(event, {_handle: ice.TRUE}); can.request(event, can.Option())._caller()
|
||||
can.run(event, [ctx.ACTION].concat(action, args||[]), cb, silent)
|
||||
},
|
||||
search: function(event, cmds, cb) {
|
||||
@ -114,14 +114,12 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
|
||||
isAutoMode: function() { return can.Mode() == "" },
|
||||
Mode: function(value) { return can.Conf(ice.MODE, value) },
|
||||
ConfDefault: function(value) { can.core.Item(value, function(k, v) { can.Conf(k) || can.Conf(k, v) }) },
|
||||
ConfSpace: function(space) {
|
||||
if (space) { can.Conf(web.SPACE, space) }
|
||||
return can.Conf("_space")||can.Conf(web.SPACE)||"" },
|
||||
ConfIndex: function(index) {
|
||||
if (index) { can.Conf(ctx.INDEX, index) }
|
||||
return can.Conf("_command")||can.Conf(ctx.INDEX)||can.Conf("_index") },
|
||||
ConfSpace: function(space) { if (space) { can.Conf(web.SPACE, space) } return can.Conf("_space")||can.Conf(web.SPACE)||can.Conf("pod")||"" },
|
||||
ConfIndex: function(index) { if (index) { can.Conf(ctx.INDEX, index) } return can.Conf("_command")||can.Conf(ctx.INDEX)||can.Conf("_index")||"can" },
|
||||
ConfIcons: function() { return can.Conf(mdb.ICONS) },
|
||||
ConfHeight: function(value) { return can.Conf(html.HEIGHT, value) },
|
||||
ConfWidth: function(value) { return can.Conf(html.WIDTH, value)||can._output.offsetWidth },
|
||||
ConfHelp: function() { return can.Conf("help") },
|
||||
Conf: function(key, value) { var res = can._conf
|
||||
for (var i = 0; i < arguments.length; i += 2) {
|
||||
if (typeof key == code.OBJECT) { res = can.core.Value(can._conf, arguments[i]), i--; continue }
|
||||
@ -139,7 +137,7 @@ try { if (typeof(window) == code.OBJECT) { var meta = Volcanos.meta
|
||||
meta.version = window._version, window.outerWidth-window.innerWidth > 100 && (meta.version = "", debug = false)
|
||||
}
|
||||
meta._load = function(url, cb) {
|
||||
if (meta.version) { url += (url.indexOf(web.QS) == -1? web.QS: "&")+meta.version.slice(1) }
|
||||
if (meta.version && url.indexOf("/p/usr/icons/") == -1) { url += (url.indexOf(web.QS) == -1? web.QS: "&")+meta.version.slice(1) }
|
||||
if (meta._cache[url]) { return meta._cache[url].push(cb) } else { meta._cache[url] = [cb] }
|
||||
function _cb() { meta._cache[url].forEach(function(cb) { cb() }), delete(meta._cache[url]) }
|
||||
switch (url.split(web.QS)[0].split(nfs.PT).pop().toLowerCase()) {
|
||||
|
@ -1,2 +1,4 @@
|
||||
all:
|
||||
@echo
|
||||
@date +"%Y-%m-%d %H:%M:%S"
|
||||
${CTX_ROOT}/bin/ice.bin web.admin web.chat.wx.ide make
|
||||
|
@ -8,7 +8,8 @@ const misc_wx = require("utils/lib/misc-wx.js")
|
||||
const page_wx = require("utils/lib/page-wx.js")
|
||||
const user_wx = require("utils/lib/user-wx.js")
|
||||
|
||||
App({conf: conf,
|
||||
App({
|
||||
conf: conf,
|
||||
base: base, core: core,
|
||||
misc: base.Copy(misc, misc_wx),
|
||||
page: base.Copy(page, page_wx),
|
||||
@ -16,12 +17,9 @@ App({conf: conf,
|
||||
onLaunch: function() { const info = wx.getSystemInfoSync()
|
||||
switch (info.language.toLowerCase().replaceAll("_", "-")) {
|
||||
case "zh-cn": base.Copy(user, require("utils/lib/zh-cn.js")); break
|
||||
default: base.Copy(user, require("utils/lib/en-us.js"))
|
||||
user.trans = function(can, text, list, zone) { return text }
|
||||
default: base.Copy(user, require("utils/lib/en-us.js")), user.trans = function(can, text, list, zone) { return text }
|
||||
}
|
||||
this.conf.platform = info.platform
|
||||
this.conf.brand = info.brand
|
||||
this.conf.model = info.model
|
||||
this.conf.platform = info.platform, this.conf.brand = info.brand, this.conf.model = info.model
|
||||
this.misc.Info("app load", this.conf, info)
|
||||
},
|
||||
})
|
||||
|
@ -1,19 +1,52 @@
|
||||
{
|
||||
"pages": [
|
||||
"pages/river/river",
|
||||
"pages/action/action",
|
||||
"pages/insert/insert"
|
||||
],
|
||||
"window": {
|
||||
"navigationBarBackgroundColor": "@navBgColor",
|
||||
"navigationBarTextStyle": "@navTxtStyle",
|
||||
"backgroundColor": "@bgColor",
|
||||
"backgroundTextStyle": "@bgTxtStyle",
|
||||
"backgroundColorTop": "@bgColorTop",
|
||||
"backgroundColorBottom": "@bgColorBottom"
|
||||
},
|
||||
"style": "v2",
|
||||
"darkmode": true,
|
||||
"pages": [
|
||||
"pages/action/home",
|
||||
"pages/action/dream",
|
||||
"pages/action/desktop",
|
||||
"pages/action/my",
|
||||
"pages/action/grant",
|
||||
"pages/action/action",
|
||||
"pages/insert/insert",
|
||||
"pages/web-chat/favor"
|
||||
],
|
||||
"style": "v2",
|
||||
"tabBar": {
|
||||
"backgroundColor": "@tabBgColor",
|
||||
"borderStyle": "@tabBorderStyle",
|
||||
"color": "@tabFontColor",
|
||||
"list": [
|
||||
{
|
||||
"iconPath": "@homeIcon",
|
||||
"pagePath": "pages/action/home",
|
||||
"text": "首页"
|
||||
},
|
||||
{
|
||||
"iconPath": "@dreamIcon",
|
||||
"pagePath": "pages/action/dream",
|
||||
"text": "空间"
|
||||
},
|
||||
{
|
||||
"iconPath": "@desktopIcon",
|
||||
"pagePath": "pages/action/desktop",
|
||||
"text": "桌面"
|
||||
},
|
||||
{
|
||||
"iconPath": "@myIcon",
|
||||
"pagePath": "pages/action/my",
|
||||
"text": "我的"
|
||||
}
|
||||
],
|
||||
"selectedColor": "@tabSelectedColor"
|
||||
},
|
||||
"themeLocation": "theme.json",
|
||||
"sitemapLocation": "sitemap.json"
|
||||
"window": {
|
||||
"backgroundColor": "@bgColor",
|
||||
"backgroundColorBottom": "@bgColorBottom",
|
||||
"backgroundColorTop": "@bgColorTop",
|
||||
"backgroundTextStyle": "@bgTxtStyle",
|
||||
"enablePullDownRefresh": true,
|
||||
"navigationBarBackgroundColor": "@navBgColor",
|
||||
"navigationBarTextStyle": "@navTxtStyle"
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
<template name="action">
|
||||
<view class="action">
|
||||
<template name="header">
|
||||
<view class="header">
|
||||
<view class="item button" wx:for="{{action}}" wx:key="index">
|
||||
<button size="mini" bindtap="onaction" data-name="{{item}}">{{item}}</button>
|
||||
<button size="mini" bindtap="onButton" data-name="{{item}}">{{item}}</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
@ -32,7 +32,7 @@
|
||||
|
||||
<template name="field">
|
||||
<view class="page action">
|
||||
<template is="action" data="{{action}}"></template>
|
||||
<template is="header" data="{{action}}"></template>
|
||||
<template is="debug" data="{{conf}}"></template>
|
||||
<view class="output">
|
||||
<view class="field {{field.index}}" wx:for="{{list}}" wx:for-index="order" wx:for-item="field" wx:key="index">
|
||||
|
@ -1,42 +1,22 @@
|
||||
page {
|
||||
--box-border:lightblue solid 1px;
|
||||
--box-shadow:var(--body-fg-color) 2px 2px 8px;
|
||||
--disable-fg-color:gray; --notice-bg-color:blue; --danger-bg-color:red;
|
||||
--box-border:var(--body-bg-color) solid 1px;
|
||||
--item-bg-color:white; --body-bg-color:#f6f6f6;
|
||||
--item-padding:10px; --item-icons-size:48px;
|
||||
--action-height:32px; --action-margin:5px;
|
||||
}
|
||||
@media (prefers-color-scheme: light) {
|
||||
@media (prefers-color-scheme: dark) {
|
||||
page {
|
||||
--box-border:lightgreen solid 1px;
|
||||
--notice-bg-color:lightgreen; --danger-bg-color:red;
|
||||
--item-bg-color:black; --body-bg-color:#191919;
|
||||
}
|
||||
}
|
||||
page { padding:10px; }
|
||||
page, view { box-sizing: border-box; }
|
||||
view.output { width:100%; overflow-x:hidden; }
|
||||
view.output textarea { text-align:left; padding:10px; width:100%; }
|
||||
view.output view.item { font-size:18px; text-align:center; padding:10px; border:var(--box-border); }
|
||||
view.output view.list view.item { margin-left:20px; }
|
||||
|
||||
view.field>view.output { overflow:auto; }
|
||||
view.legend { font-size:20px; font-weight:bold; font-style:italic; margin:10px 0; }
|
||||
view.action view.item { padding:0; border:0; margin-right:5px; float:left; }
|
||||
view.option view.item { padding:0; border:0; margin-right:5px; float:left; }
|
||||
view.option view.item.textarea { border:var(--box-border); width:calc(100% - 2px); clear:both; }
|
||||
view.option view.item.select { border:var(--box-border); }
|
||||
view.option view.item picker { border:var(--box-border); height:30px; width:80px; }
|
||||
view.option view.item input { border:var(--box-border); height:30px; width:80px; }
|
||||
view.option view.item button { height:32px; }
|
||||
view.output view.code { white-space:pre; border-left:cyan solid 1px; }
|
||||
view.status view.item { font-size:12px; font-style:italic; padding:5px; border:none; margin:0; float:left; }
|
||||
view.status view.item text.name { font-size:10px; }
|
||||
view.action.submit view.item { margin-right:0; }
|
||||
view.field.cli.qrcode view.option view.item input { width:70px; }
|
||||
|
||||
table { display:table; border-collapse:collapse; width:100%; }
|
||||
table.debug { font-family:monospace; font-style:italic; }
|
||||
table.debug th { font-weight:bold; }
|
||||
tr { display:table-row; }
|
||||
th { display:table-cell; padding:5px; vertical-align:middle; }
|
||||
td { display:table-cell; padding:5px; vertical-align:middle; }
|
||||
td view.which { padding:0; order:0; }
|
||||
table.content th { border:var(--box-border); text-align:center; }
|
||||
table.content td { border:var(--box-border); min-width:60px; }
|
||||
table.content.action th:last-child { position:sticky; right:2px; text-align:center; min-width:60px; }
|
||||
table.content.action td:last-child { position:sticky; right:2px; text-align:center; min-width:60px; }
|
||||
page { background-color:var(--body-bg-color); }
|
||||
view.item { background-color:var(--item-bg-color); }
|
||||
page, view { box-sizing:border-box; }
|
||||
page { padding-top:var(--action-height); height:100%; width:100%; }
|
||||
view.header { border-bottom:var(--box-border); background-color:var(--item-bg-color); }
|
||||
view.header { width:100%; display:flex; position:fixed; top:0; }
|
||||
view.header view.item { height:var(--action-height); margin-right:var(--action-margin); }
|
||||
view.header view.item button { height:var(--action-height); }
|
||||
view.output { width:100%; overflow:auto; }
|
||||
|
@ -1,5 +1,102 @@
|
||||
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto-wx.js")
|
||||
Volcanos._page = {}
|
||||
Volcanos(chat.ONACTION, {list: ["刷新", "扫码", "清屏"]})
|
||||
Volcanos(chat.ONACTION, {
|
||||
list: ["刷新", "扫码", "清屏"],
|
||||
"清屏": function(event, can) { can.core.List(can.ui.data.list, function(item) { delete(item.msg) }), can.page.setData(can) },
|
||||
refresh: function(event, can) { can.onaction._apis = "", can.onaction._cmds = []
|
||||
if (can.db.index == "web.chat.grant") {
|
||||
wx.reLaunch({url: can.base.MergeURL("grant", ctx.INDEX, "web.chat.grant", web.SPACE, can.db.space, web.SERVE, can.db.serve)})
|
||||
return
|
||||
}
|
||||
if (can.db.share) { can.onaction._apis = "/share/"+can.db.share
|
||||
can.run(event, [ctx.ACTION, ctx.COMMAND], function(msg) {
|
||||
can.onaction._cmds = [ctx.ACTION, ctx.RUN], can.onaction._reload(can, msg)
|
||||
})
|
||||
} else if (can.db.river && can.db.storm) {
|
||||
can.onaction._cmds = [can.db.river, can.db.storm]
|
||||
can.run(event, [], function(msg) { can.onaction._reload(can, msg) })
|
||||
} else {
|
||||
can.run(event, [ctx.ACTION, ctx.COMMAND, can.db.index], function(msg) {
|
||||
can.onaction._reload(can, msg)
|
||||
})
|
||||
}
|
||||
},
|
||||
_refresh: function(event, can, order) { can.page.setData(can)
|
||||
can.onaction.onAction({}, can, ice.LIST, {order: order, name: ice.LIST})
|
||||
},
|
||||
_reload: function(can, msg) {
|
||||
can.ui.data.list = can.misc.ParseCmd(can, msg, function(field, order) {
|
||||
can.onaction._refresh({}, can, order)
|
||||
}, function(input, index, field, order) {
|
||||
if (can.db.cmd||can.db.index) { input.value = input.value||can.db[input.name] }
|
||||
}), can.page.setData(can), can.user.toast(can, "加载成功")
|
||||
},
|
||||
onInputs: function(event, can, button, data) { var order = data.order, index = data.index
|
||||
var input = can.ui.data.list[order||0].inputs[index||0]
|
||||
input.value = event.detail.value
|
||||
},
|
||||
onChange: function(event, can, button, data) { var order = data.order, index = data.index
|
||||
var input = can.ui.data.list[order||0].inputs[index||0]
|
||||
input.value = input.values[parseInt(event.detail.value)]
|
||||
can.onaction._refresh(event, can, order)
|
||||
},
|
||||
onAction: function(event, can, button, data) { var order = data.order, name = data.name
|
||||
var field = can.ui.data.list[order||0], msg = can.request(event)
|
||||
if (field.feature[name]) { if (can.base.isIn(name, mdb.CREATE, mdb.INSERT)) { msg._method = http.PUT }
|
||||
return can.data.insert = {field: field, name: name, list: field.feature[name], cb: function(res) {
|
||||
can.run(event, can.base.Simple([field.id||field.index, ctx.ACTION, name], res), function(msg) {
|
||||
can.onaction._refresh(event, can, order)
|
||||
})
|
||||
}}, can.user.jumps(chat.PAGES_INSERT)
|
||||
} field._history = field._history||[]
|
||||
switch (name) {
|
||||
case ice.BACK: field._history.pop(); var ls = field._history.pop()||[], i = 0
|
||||
can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { input.value = ls[i++]||"" } })
|
||||
can.onaction._refresh(event, can, order); break
|
||||
case ctx.RUN: break
|
||||
case ice.LIST:
|
||||
case web.REFRESH: msg._method = http.GET; break
|
||||
default: msg.Option(ctx.ACTION, name)
|
||||
}
|
||||
var cmd = can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { return input.value } })
|
||||
for (var i = cmd.length-1; i > 0; i--) { if (cmd[i] === "") { cmd.pop() } else { break } }
|
||||
function eq(to, from) { if (!to) { return false } if (to.length != from.length) { return false }
|
||||
for (var i = 0; i < to.length; i++) { if (to[i] != from[i]) { return false } } return true
|
||||
} eq(field._history[field._history.length-1], cmd) || field._history.push(cmd)
|
||||
can.run(event, [field.id||field.index].concat(cmd), function(msg) { can.onimport._init && can.onimport._init(can, msg)
|
||||
msg._head = can.core.List(msg.append, function(item) { return can.user.trans(can, item, field, html.INPUT) })
|
||||
can.core.Item(msg._view, function(key, value) { can.core.List(value, function(value) { can.core.List(value, function(input, i) {
|
||||
if (input.type == html.BUTTON) { input.value = can.user.trans(can, input.value||input.name, field) }
|
||||
if (input._type == html.TEXT) { input._text = can.user.trans(can, input._text, field, html.VALUE) }
|
||||
}) }) })
|
||||
msg._status = can.core.List(can.base.Obj(msg.Option(ice.MSG_STATUS)), function(item) { return item })
|
||||
msg._action = can.core.List(can.base.Obj(msg.Option(ice.MSG_ACTION)), function(item) {
|
||||
if (typeof item == code.STRING) { return {type: html.BUTTON, name: item, value: can.user.trans(can, item)} }
|
||||
return item.value = can.user.trans(can, item.value||item.name), item
|
||||
}), field.msg = msg, can.page.setData(can)
|
||||
})
|
||||
},
|
||||
onDetail: function(event, can, button, data) { var order = data.order, name = data.name, value = data.value, input = data.input
|
||||
var field = can.ui.data.list[order||0]
|
||||
if (input && input.type == html.BUTTON) { var msg = can.request(event, field.msg.Table()[data.index])
|
||||
if (can.base.isIn(name, mdb.REMOVE, mdb.DELETE)) { msg._method = http.DELETE }
|
||||
var _input = {}; can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { _input[input.name] = input.value } }), can.request(event, _input)
|
||||
if (field.feature[input.name]) {
|
||||
can.onAction(event, can, input.name, {order: order, name: input.name})
|
||||
} else {
|
||||
can.run(event, [field.id||field.index, ctx.ACTION, input.name], function(msg) {
|
||||
switch (msg.Option(ice.MSG_PROCESS)) {
|
||||
case "_location":
|
||||
can.user.parse(can, msg.Option("_arg"))
|
||||
}
|
||||
can.onaction._refresh(event, can, order)
|
||||
})
|
||||
} return
|
||||
}
|
||||
can.core.List(field.inputs, function(input) {
|
||||
if (input.name == name) { input.value = value, can.onaction._refresh(event, can, order) }
|
||||
})
|
||||
},
|
||||
})
|
||||
Volcanos._init()
|
||||
|
30
publish/client/mp/pages/action/action.wxss
Normal file
@ -0,0 +1,30 @@
|
||||
view.output textarea { text-align:left; padding:10px; width:100%; }
|
||||
view.output view.item { font-size:18px; text-align:center; padding:10px; }
|
||||
view.output view.list view.item { margin-left:20px; }
|
||||
|
||||
view.field>view.output { overflow:auto; }
|
||||
view.legend { font-size:20px; font-weight:bold; font-style:italic; margin:10px 0; }
|
||||
view.action view.item { padding:0; border:0; margin-right:5px; float:left; }
|
||||
view.option view.item { padding:0; border:0; margin-right:5px; float:left; }
|
||||
view.option view.item.textarea { border:var(--box-border); width:calc(100% - 2px); clear:both; }
|
||||
view.option view.item.select { border:var(--box-border); }
|
||||
view.option view.item picker { border:var(--box-border); height:30px; width:80px; }
|
||||
view.option view.item input { border:var(--box-border); height:30px; width:80px; }
|
||||
view.option view.item button { height:32px; }
|
||||
view.output view.code { white-space:pre; border-left:cyan solid 1px; }
|
||||
view.status view.item { font-size:12px; font-style:italic; padding:5px; border:none; margin:0; float:left; }
|
||||
view.status view.item text.name { font-size:10px; }
|
||||
view.action.submit view.item { margin-right:0; }
|
||||
view.field.cli.qrcode view.option view.item input { width:70px; }
|
||||
|
||||
table { display:table; border-collapse:collapse; width:100%; }
|
||||
table.debug { font-family:monospace; font-style:italic; }
|
||||
table.debug th { font-weight:bold; }
|
||||
tr { display:table-row; }
|
||||
th { display:table-cell; padding:5px; vertical-align:middle; }
|
||||
td { display:table-cell; padding:5px; vertical-align:middle; }
|
||||
td view.which { padding:0; order:0; }
|
||||
table.content th { border:var(--box-border); text-align:center; }
|
||||
table.content td { border:var(--box-border); min-width:60px; }
|
||||
table.content.action th:last-child { position:sticky; right:2px; text-align:center; min-width:60px; }
|
||||
table.content.action td:last-child { position:sticky; right:2px; text-align:center; min-width:60px; }
|
BIN
publish/client/mp/pages/action/desktop-dark.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
publish/client/mp/pages/action/desktop-light.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
9
publish/client/mp/pages/action/desktop.js
Normal file
@ -0,0 +1,9 @@
|
||||
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto-wx.js")
|
||||
Volcanos._page = {}
|
||||
Volcanos(chat.ONACTION, {
|
||||
onSelect: function(event, can, button, data) {
|
||||
can.user.jumps(can.base.MergeURL("action", ctx.INDEX, data.item.index, web.SPACE, data.item.space, web.SERVE, can.db.serve))
|
||||
},
|
||||
})
|
||||
Volcanos._init()
|
8
publish/client/mp/pages/action/desktop.wxml
Normal file
@ -0,0 +1,8 @@
|
||||
<import src="../../app.wxml"/>
|
||||
<template is="header" data="{{action}}"></template>
|
||||
<view class="output">
|
||||
<view class="item" wx:for="{{list}}" wx:key="name" bindtap="onSelect" data-name="{{item.name}}" data-item="{{item}}">
|
||||
<image class="icon" src="{{item.icon}}"/>
|
||||
<text class="name">{{item.name}}</text>
|
||||
</view>
|
||||
</view>
|
3
publish/client/mp/pages/action/desktop.wxss
Normal file
@ -0,0 +1,3 @@
|
||||
view.output>view.item { width:25%; padding:10px 0; display:flex; flex-direction:column; align-items:center; float:left; }
|
||||
view.output>view.item image.icon { height:64px; width:64px; }
|
||||
view.output>view.item text.name { white-space:pre; }
|
BIN
publish/client/mp/pages/action/dream-dark.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
publish/client/mp/pages/action/dream-light.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
9
publish/client/mp/pages/action/dream.js
Normal file
@ -0,0 +1,9 @@
|
||||
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto-wx.js")
|
||||
Volcanos._page = {}
|
||||
Volcanos(chat.ONACTION, {
|
||||
onSelect: function(event, can, button, data) {
|
||||
can.user.switchTab(can, "desktop")
|
||||
},
|
||||
})
|
||||
Volcanos._init()
|
17
publish/client/mp/pages/action/dream.wxml
Normal file
@ -0,0 +1,17 @@
|
||||
<import src="../../app.wxml"/>
|
||||
<template is="header" data="{{action}}"></template>
|
||||
<view class="output">
|
||||
<view class="item {{item.type}}" wx:for="{{list}}" wx:key="name" bindtap="onSelect" data-name="{{item.name}}" data-item="{{item}}">
|
||||
<image class="icons" src="{{item.icons}}"/>
|
||||
<view class="info">
|
||||
<view class="title">
|
||||
<text class="name">{{item.name}}</text>
|
||||
<text class="tags restart" wx:if="{{item.restart}}">{{item.restart}}</text>
|
||||
<text class="tags access" wx:if="{{item.access}}">{{item.access}}</text>
|
||||
<text class="tags {{item.type}}">{{item.type}}</text>
|
||||
</view>
|
||||
<view class="label">{{item.module}}</view>
|
||||
<view class="label">{{item.time}} {{item.version}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
11
publish/client/mp/pages/action/dream.wxss
Normal file
@ -0,0 +1,11 @@
|
||||
view.output>view.item { border-bottom:var(--box-border); padding:var(--item-padding); display:flex; }
|
||||
view.output>view.item image.icons { height:var(--item-icons-size); width:var(--item-icons-size); margin-right:var(--item-padding); }
|
||||
view.output>view.item view.info { text-align:left; flex-grow:1; }
|
||||
view.output>view.item view.info text.name { font-size:18px; }
|
||||
view.output>view.item view.info text.tags { font-size:12px; padding:0 5px; margin-left:5px; }
|
||||
view.output>view.item view.info text.tags.restart { border:var(--notice-bg-color) solid 1px; color:var(--notice-bg-color); }
|
||||
view.output>view.item view.info text.tags.access { border:var(--danger-bg-color) solid 1px; color:var(--danger-bg-color); }
|
||||
view.output>view.item view.info text.tags.worker { display:none; }
|
||||
view.output>view.item view.info text.tags.server { border:var(--notice-bg-color) solid 1px; color:var(--notice-bg-color); }
|
||||
view.output>view.item view.info text.tags.origin { border:var(--danger-bg-color) solid 1px; color:var(--danger-bg-color); }
|
||||
view.output>view.item view.label { color:var(--disable-fg-color); font-size:12px; }
|
21
publish/client/mp/pages/action/grant.js
Normal file
@ -0,0 +1,21 @@
|
||||
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto-wx.js")
|
||||
Volcanos._page = {}
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) {
|
||||
can.page.setData(can, msg.TableDetail())
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {
|
||||
refresh: function(event, can) {
|
||||
can.run(event, [can.db.space], function(msg) {
|
||||
can.onimport._init(can, msg)
|
||||
})
|
||||
},
|
||||
onConfirm: function(event, can) {
|
||||
can.run(can.request(event, {space: can.db.space}), [ctx.ACTION, "confirm"], function(msg) {
|
||||
can.user.switchTab(can, web.DREAM)
|
||||
})
|
||||
},
|
||||
})
|
||||
Volcanos._init()
|
7
publish/client/mp/pages/action/grant.wxml
Normal file
@ -0,0 +1,7 @@
|
||||
<view class="output">
|
||||
<view class="info">
|
||||
<view>ip: {{list.ip}}</view>
|
||||
<view>ua: {{list.ua}}</view>
|
||||
</view>
|
||||
<button type="primary" bindtap="onConfirm">请授权登录</button>
|
||||
</view>
|
2
publish/client/mp/pages/action/grant.wxss
Normal file
@ -0,0 +1,2 @@
|
||||
view.output { display:flex; flex-direction:column; justify-content:center; align-items:center; }
|
||||
view.output view.info { margin:40px 0; }
|
BIN
publish/client/mp/pages/action/home-dark.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
publish/client/mp/pages/action/home-light.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
24
publish/client/mp/pages/action/home.js
Normal file
@ -0,0 +1,24 @@
|
||||
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto-wx.js")
|
||||
Volcanos._page = {}
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, list) { var _list = []
|
||||
can.core.List(list, function(msg) { _list = _list.concat(can.misc.table(can, msg)) }), can.page.setData(can, _list)
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {list: ["刷新", "扫码"],
|
||||
refresh: function(event, can) { can.onaction._cmds = []
|
||||
var list = [], _list = can.misc.serveList(can)
|
||||
can.core.Next(_list, function(serve, next) { var msg = can.request(); msg._serve = serve.serve, msg._sessid = serve.sessid; var done = false
|
||||
can.run(msg._event, [ctx.ACTION, ctx.RUN, web.SPACE, ctx.ACTION, "info"], function(msg) {
|
||||
msg.Push("title", serve.serve.split("://")[1]), msg.Push("sessid", serve.sessid)
|
||||
msg.Push(ctx.STYLE, msg._serve == can.db.serve? "current": "")
|
||||
msg.Push(web.SERVE, msg._serve), list.push(msg), can.onimport._init(can, list), done || next(), done = true
|
||||
}), can.onmotion.delay(can, function() { done || next(), done = true }, 3000)
|
||||
})
|
||||
},
|
||||
onSelect: function(event, can, button, data) {
|
||||
can.user.switchTab(can, web.DREAM, data.item, true)
|
||||
},
|
||||
})
|
||||
Volcanos._init()
|
18
publish/client/mp/pages/action/home.wxml
Normal file
@ -0,0 +1,18 @@
|
||||
<import src="../../app.wxml"/>
|
||||
<template is="header" data="{{action}}"></template>
|
||||
<view class="output">
|
||||
<view class="serve">
|
||||
<view class="item {{item.style}}" wx:for="{{list}}" wx:key="name" bindtap="onSelect" data-name="{{item.name}}" data-item="{{item}}">
|
||||
<image class="icons" src="{{item.icons}}"></image>
|
||||
<view class="info">
|
||||
<view class="title">
|
||||
<text class="name">{{item.title}}</text>
|
||||
<text class="tags sessid" wx:if="{{item.sessid}}">已登录</text>
|
||||
<text class="tags style" wx:if="{{item.style}}">当前</text>
|
||||
</view>
|
||||
<view class="label">{{item.module}}</view>
|
||||
<view class="label">{{item.time}} {{item.version}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
11
publish/client/mp/pages/action/home.wxss
Normal file
@ -0,0 +1,11 @@
|
||||
view.output>view.serve>view.item { border-bottom:var(--box-border); padding:var(--item-padding); display:flex; }
|
||||
view.output>view.serve>view.item image.icons { height:var(--item-icons-size); width:var(--item-icons-size); margin-right:var(--item-padding); }
|
||||
view.output>view.serve>view.item view.title { display:flex; align-items:center; }
|
||||
view.output>view.serve>view.item view.info { text-align:left; flex-grow:1; }
|
||||
view.output>view.serve>view.item view.info text.name { font-size:18px; }
|
||||
view.output>view.serve>view.item view.info text.tags { font-size:12px; padding:0 5px; margin-left:5px; }
|
||||
view.output>view.serve>view.item view.info text.tags.sessid { border:var(--notice-bg-color) solid 1px; color:var(--notice-bg-color); }
|
||||
view.output>view.serve>view.item view.info text.tags.style { border:var(--danger-bg-color) solid 1px; color:var(--danger-bg-color); }
|
||||
view.output>view.serve>view.item view.label { color:var(--disable-fg-color); font-size:12px; }
|
||||
view.output>view.serve>view.item.current text.name { font-weight:bold; }
|
||||
|
BIN
publish/client/mp/pages/action/my-dark.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
publish/client/mp/pages/action/my-light.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
51
publish/client/mp/pages/action/my.js
Normal file
@ -0,0 +1,51 @@
|
||||
const {kit, ice, ctx, mdb, web, aaa, nfs, code, chat, http, html} = require("../../utils/const.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto-wx.js")
|
||||
Volcanos._page = {}
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can) {
|
||||
can.ui.setData({info: can.user.info, action: can.onaction.list})
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {list: ["扫码", "登录", "清空"],
|
||||
"登录": function(event, can) {
|
||||
can.onaction.onLogin(event, can)
|
||||
},
|
||||
"清空": function(event, can) {
|
||||
can.misc.serveList(can, "")
|
||||
},
|
||||
refresh: function(event, can) {
|
||||
can.onaction.onLogin(event, can)
|
||||
},
|
||||
onLogin: function(event, can) {
|
||||
can.user.login(can, function() {
|
||||
can.misc.POST(can, can.request(), "/chat/header/", {}, function(msg) {
|
||||
can.user.info.username = msg.Option(ice.MSG_USERNAME)
|
||||
can.user.info.usernick = msg.Option(aaa.USERNICK)
|
||||
can.user.info.avatar = msg.Option(aaa.AVATAR)
|
||||
can.misc.serveList(can, {serve: can.db.serve, username: msg.Option(ice.MSG_USERNAME), usernick: msg.Option(aaa.USERNICK), avatar: msg.Option(aaa.AVATAR)})
|
||||
wx.getUserInfo({success: function(res) { var userInfo = res.userInfo
|
||||
can.user.info.avatar = can.user.info.avatar||userInfo.avatarUrl
|
||||
can.user.info.gender = userInfo.gender
|
||||
can.user.info.city = userInfo.city
|
||||
can.user.info.country = userInfo.country
|
||||
can.user.info.province = userInfo.province
|
||||
can.onimport._init(can), wx.stopPullDownRefresh()
|
||||
}})
|
||||
})
|
||||
})
|
||||
},
|
||||
onChooseAvatar(event, can, button, data) {
|
||||
can.user.info.avatar = event.detail.avatarUrl
|
||||
can.onimport._init(can), can.onexport.info(can)
|
||||
},
|
||||
onBlur: function(event, can) {
|
||||
can.user.info.usernick = event.detail.value
|
||||
can.onimport._init(can), can.onexport.info(can)
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONEXPORT, {
|
||||
info: function(can) {
|
||||
can.misc.POST(can, can.request(), "/chat/wx/login/action/user", can.user.info, function(msg) {})
|
||||
},
|
||||
})
|
||||
Volcanos._init()
|
22
publish/client/mp/pages/action/my.wxml
Normal file
@ -0,0 +1,22 @@
|
||||
<view class="output">
|
||||
<view class="user">
|
||||
<view class="item">
|
||||
<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
|
||||
<image class="avatar" src="{{info.avatar}}"></image>
|
||||
</button>
|
||||
<view class="title">
|
||||
<view wx:if="{{info.usernick}}">
|
||||
<view class="name">{{info.usernick}}</view>
|
||||
</view>
|
||||
<view wx:else>
|
||||
<input class="weui-input" type="nickname" placeholder="请输入昵称" onblur="onBlur"/>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="conf">
|
||||
<view class="item" wx:for="{{action}}" bindtap="onButton" data-name="{{item}}">
|
||||
<text>{{item}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
9
publish/client/mp/pages/action/my.wxss
Normal file
@ -0,0 +1,9 @@
|
||||
page { padding-top:0; }
|
||||
view.output>view.user>view.item { padding:20px; display:flex; }
|
||||
view.output>view.user>view.item button { height:var(--item-icons-size); width:var(--item-icons-size); padding:0; margin:0; margin-right:var(--item-padding); }
|
||||
view.output>view.user>view.item image { height:var(--item-icons-size); width:var(--item-icons-size); }
|
||||
view.output>view.user>view.item input { text-align:left; margin:0 var(--action-margin); }
|
||||
view.output>view.user>view.item view.title { flex-grow:1; }
|
||||
view.output>view.user>view.item view.name { text-align:left; margin-left:var(--action-margin); }
|
||||
view.output>view.conf { margin-top:20px; }
|
||||
view.output>view.conf>view.item { text-align:center; padding:10px; margin-top:var(--action-margin); display:flex; justify-content:center; }
|
@ -1,5 +1,5 @@
|
||||
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto-wx.js")
|
||||
Volcanos._page = {}
|
||||
Volcanos(chat.ONACTION, {list: ["刷新", "扫码"],
|
||||
refresh: function(event, can) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto-wx.js")
|
||||
Volcanos._page = {}
|
||||
Volcanos(chat.ONACTION, {list: ["刷新", "扫码", "登录"], _apis: nfs.CHAT_RIVER,
|
||||
refresh: function(event, can) { can.run(event, [], function(msg) { msg.Dump(can), can.user.toast(can, "加载成功") }) },
|
||||
|
19
publish/client/mp/pages/web-chat/favor.js
Normal file
@ -0,0 +1,19 @@
|
||||
const {
|
||||
kit, ice,
|
||||
ctx, mdb, web, aaa,
|
||||
lex, yac, ssh, gdb,
|
||||
tcp, nfs, cli, log,
|
||||
code, wiki, chat, team, mall,
|
||||
http, html, icon, svg
|
||||
} = require("../../utils/const.js")
|
||||
const {shy, Volcanos} = require("../../utils/proto-wx.js")
|
||||
Volcanos._page = {}
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) {
|
||||
msg.Echo("hello world")
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {
|
||||
list: ["刷新", "扫码", "清屏", "登录"],
|
||||
})
|
||||
Volcanos._init()
|
2
publish/client/mp/pages/web-chat/favor.wxml
Normal file
@ -0,0 +1,2 @@
|
||||
<import src="../../app.wxml"/>
|
||||
<template is="field" data="{{action, conf, list}}"></template>
|
@ -1,27 +1,41 @@
|
||||
{
|
||||
"light": {
|
||||
"navBgColor": "#f6f6f6",
|
||||
"homeIcon": "pages/action/home-light.png",
|
||||
"dreamIcon": "pages/action/dream-light.png",
|
||||
"desktopIcon": "pages/action/desktop-light.png",
|
||||
"myIcon": "pages/action/my-light.png",
|
||||
|
||||
"navBgColor": "#ffffff",
|
||||
"navTxtStyle": "black",
|
||||
|
||||
"bgColor": "#f6f6f6",
|
||||
"bgTxtStyle": "light",
|
||||
"bgColorTop": "#f6f6f6",
|
||||
"bgColorBottom": "#efefef",
|
||||
"bgTxtStyle": "light",
|
||||
|
||||
"tabBorderStyle": "black",
|
||||
"tabBgColor": "#ffffff",
|
||||
"tabSelectedColor": "#3cc51f",
|
||||
"tabFontColor": "#000000",
|
||||
"tabBorderStyle": "black"
|
||||
"tabSelectedColor": "#3cc51f"
|
||||
},
|
||||
"dark": {
|
||||
"navBgColor": "#191919",
|
||||
"homeIcon": "pages/action/home-dark.png",
|
||||
"dreamIcon": "pages/action/dream-dark.png",
|
||||
"desktopIcon": "pages/action/desktop-dark.png",
|
||||
"myIcon": "pages/action/my-dark.png",
|
||||
|
||||
"navBgColor": "#000000",
|
||||
"navTxtStyle": "white",
|
||||
|
||||
"bgColor": "#191919",
|
||||
"bgTxtStyle": "dark",
|
||||
"bgColorTop": "#191919",
|
||||
"bgColorBottom": "#1f1f1f",
|
||||
"tabBgColor": "#191919",
|
||||
"tabSelectedColor": "#51a937",
|
||||
"bgTxtStyle": "dark",
|
||||
|
||||
"tabBorderStyle": "white",
|
||||
"tabBgColor": "#000000",
|
||||
"tabFontColor": "#ffffff",
|
||||
"tabBorderStyle": "white"
|
||||
"tabSelectedColor": "#51a937"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,107 +3,23 @@ const {kit, ice,
|
||||
lex, yac, ssh, gdb,
|
||||
tcp, nfs, cli, log,
|
||||
code, wiki, chat, team, mall,
|
||||
http, html, icon, svg
|
||||
http, html,
|
||||
} = require("const.js")
|
||||
const {shy, Volcanos} = require("proto.js")
|
||||
const {shy, Volcanos} = require("proto-wx.js")
|
||||
Volcanos._page = {}
|
||||
Volcanos(chat.ONIMPORT, {})
|
||||
Volcanos(chat.ONACTION, {
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) {
|
||||
can.page.setData(can, can.misc.table(can, msg))
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {list: ["刷新", "扫码"],
|
||||
"刷新": function(event, can) { can.onaction.refresh(event, can) },
|
||||
"扫码": function(event, can) { can.user.agent.scanQRCode(can) },
|
||||
"清屏": function(event, can) { can.core.List(can.ui.data.list, function(item) { delete(item.msg) }), can.page.setData(can) },
|
||||
_refresh: function(event, can, order) { can.page.setData(can)
|
||||
can.onaction.onAction({}, can, ice.LIST, {order: order, name: ice.LIST})
|
||||
refresh: function(event, can) {
|
||||
can.run(event, [], function(msg) { can.onimport._init(can, msg) })
|
||||
},
|
||||
_reload: function(can, msg) {
|
||||
can.ui.data.list = can.misc.ParseCmd(can, msg, function(field, order) {
|
||||
can.onaction._refresh({}, can, order)
|
||||
}, function(input, index, field, order) {
|
||||
if (can.db.cmd||can.db.index) { input.value = input.value||can.db[input.name] }
|
||||
}), can.page.setData(can), can.user.toast(can, "加载成功")
|
||||
},
|
||||
refresh: function(event, can) { can.onaction._apis = "", can.onaction._cmds = []
|
||||
if (can.db.share) { can.onaction._apis = "/share/"+can.db.share
|
||||
can.run(event, [ctx.ACTION, ctx.COMMAND], function(msg) {
|
||||
can.onaction._cmds = [ctx.ACTION, ctx.RUN], can.onaction._reload(can, msg)
|
||||
})
|
||||
} else if (can.db.river && can.db.storm) {
|
||||
can.onaction._cmds = [can.db.river, can.db.storm]
|
||||
can.run(event, [], function(msg) { can.onaction._reload(can, msg) })
|
||||
} else {
|
||||
can.run(event, [ctx.ACTION, ctx.COMMAND, can.db.cmd||can.db.index||"cli.qrcode"], function(msg) {
|
||||
can.onaction._cmds = [ctx.ACTION, ctx.RUN], can.onaction._reload(can, msg)
|
||||
})
|
||||
}
|
||||
},
|
||||
onaction: function(event, can, button, data) { var name = data.name;
|
||||
onButton: function(event, can, button, data) { var name = data.name;
|
||||
(can.onaction[name]||function(event) { can.run(event, [ctx.ACTION, name]) })(event, can)
|
||||
},
|
||||
onInputs: function(event, can, button, data) { var order = data.order, index = data.index
|
||||
var input = can.ui.data.list[order||0].inputs[index||0]
|
||||
input.value = event.detail.value
|
||||
},
|
||||
onChange: function(event, can, button, data) { var order = data.order, index = data.index
|
||||
var input = can.ui.data.list[order||0].inputs[index||0]
|
||||
input.value = input.values[parseInt(event.detail.value)]
|
||||
can.onaction._refresh(event, can, order)
|
||||
},
|
||||
onAction: function(event, can, button, data) { var order = data.order, name = data.name
|
||||
var field = can.ui.data.list[order||0], msg = can.request(event)
|
||||
if (field.feature[name]) { if (can.base.isIn(name, mdb.CREATE, mdb.INSERT)) { msg._method = http.PUT }
|
||||
return can.data.insert = {field: field, name: name, list: field.feature[name], cb: function(res) {
|
||||
can.run(event, can.base.Simple([field.id||field.index, ctx.ACTION, name], res), function(msg) {
|
||||
can.onaction._refresh(event, can, order)
|
||||
})
|
||||
}}, can.user.jumps(chat.PAGES_INSERT)
|
||||
} field._history = field._history||[]
|
||||
switch (name) {
|
||||
case ice.BACK: field._history.pop(); var ls = field._history.pop()||[], i = 0
|
||||
can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { input.value = ls[i++]||"" } })
|
||||
can.onaction._refresh(event, can, order); break
|
||||
case ctx.RUN: break
|
||||
case ice.LIST:
|
||||
case web.REFRESH: msg._method = http.GET; break
|
||||
default: msg.Option(ctx.ACTION, name)
|
||||
}
|
||||
var cmd = can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { return input.value } })
|
||||
for (var i = cmd.length-1; i > 0; i--) { if (cmd[i] === "") { cmd.pop() } else { break } }
|
||||
function eq(to, from) { if (!to) { return false } if (to.length != from.length) { return false }
|
||||
for (var i = 0; i < to.length; i++) { if (to[i] != from[i]) { return false } } return true
|
||||
} eq(field._history[field._history.length-1], cmd) || field._history.push(cmd)
|
||||
can.run(event, [field.id||field.index].concat(cmd), function(msg) { can.onimport._init && can.onimport._init(can, msg)
|
||||
msg._head = can.core.List(msg.append, function(item) { return can.user.trans(can, item, field, html.INPUT) })
|
||||
can.core.Item(msg._view, function(key, value) { can.core.List(value, function(value) { can.core.List(value, function(input, i) {
|
||||
if (input.type == html.BUTTON) { input.value = can.user.trans(can, input.value||input.name, field) }
|
||||
if (input._type == html.TEXT) { input._text = can.user.trans(can, input._text, field, html.VALUE) }
|
||||
}) }) })
|
||||
msg._status = can.core.List(can.base.Obj(msg.Option(ice.MSG_STATUS)), function(item) { return item })
|
||||
msg._action = can.core.List(can.base.Obj(msg.Option(ice.MSG_ACTION)), function(item) {
|
||||
if (typeof item == code.STRING) { return {type: html.BUTTON, name: item, value: can.user.trans(can, item)} }
|
||||
return item.value = can.user.trans(can, item.value||item.name), item
|
||||
}), field.msg = msg, can.page.setData(can)
|
||||
})
|
||||
},
|
||||
onDetail: function(event, can, button, data) { var order = data.order, name = data.name, value = data.value, input = data.input
|
||||
var field = can.ui.data.list[order||0]
|
||||
if (input && input.type == html.BUTTON) { var msg = can.request(event, field.msg.Table()[data.index])
|
||||
if (can.base.isIn(name, mdb.REMOVE, mdb.DELETE)) { msg._method = http.DELETE }
|
||||
var _input = {}; can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { _input[input.name] = input.value } }), can.request(event, _input)
|
||||
if (field.feature[input.name]) {
|
||||
can.onAction(event, can, input.name, {order: order, name: input.name})
|
||||
} else {
|
||||
can.run(event, [field.id||field.index, ctx.ACTION, input.name], function(msg) {
|
||||
switch (msg.Option(ice.MSG_PROCESS)) {
|
||||
case "_location":
|
||||
can.user.parse(can, msg.Option("_arg"))
|
||||
}
|
||||
can.onaction._refresh(event, can, order)
|
||||
})
|
||||
} return
|
||||
}
|
||||
can.core.List(field.inputs, function(input) {
|
||||
if (input.name == name) { input.value = value, can.onaction._refresh(event, can, order) }
|
||||
})
|
||||
},
|
||||
})
|
||||
module.exports = Volcanos._page
|
||||
|
@ -3,18 +3,19 @@ const {kit, ice,
|
||||
lex, yac, ssh, gdb,
|
||||
tcp, nfs, cli, log,
|
||||
code, wiki, chat, team, mall,
|
||||
http, html, icon, svg
|
||||
http, html,
|
||||
} = require("../const.js")
|
||||
const {shy, Volcanos} = require("../proto.js")
|
||||
const {shy, Volcanos} = require("../proto-wx.js")
|
||||
module.exports =
|
||||
Volcanos("misc", {
|
||||
POST: function(can, msg, cmd, data, cb) { data.sessid = can.conf.sessid, data.appid = data.appid||can.conf.appid
|
||||
POST: function(can, msg, cmd, data, cb) {
|
||||
var serve = msg._serve||can.db.serve||can.conf.serve, url = serve+cmd
|
||||
data.sessid = msg._sessid||can.misc.serveList(can, {serve: can.db.serve}).sessid, data.appid = data.appid||can.conf.appid
|
||||
can.core.List(msg.option, function(key) { data[key] = data[key]||[msg.Option(key)] }), data.option = data.option||msg.option
|
||||
var url = (msg._serve||can.db.serve||can.conf.serve)+cmd
|
||||
if (data && can.base.isIn(msg._method, http.GET, http.DELETE)) { url = can.base.MergeURL(url, data), data = {} }
|
||||
wx.request({method: msg._method||http.POST, url: url, data: data, success: function(res) {
|
||||
if (res.statusCode == 401) {
|
||||
can.user.info = {}, can.misc.localStorage(can, ice.MSG_SESSID, can.conf.sessid = "")
|
||||
can.misc.serveList(can, {serve: serve, sessid: "", userinfo: {}})
|
||||
return can.user.login(can, function() { can.misc.POST(can, msg, cmd, data, cb) })
|
||||
}
|
||||
if (res.statusCode == 403) { msg.result = [res.data] }
|
||||
@ -69,4 +70,40 @@ Volcanos("misc", {
|
||||
}); return can._socket = socket
|
||||
},
|
||||
localStorage: function(can, key, value) { value != undefined && wx.setStorageSync(key, value); return wx.getStorageSync(key) },
|
||||
serveList: function(can, data, current) { var serveList = can.base.Obj(can.misc.localStorage(can, "serveList"), [{serve: can.conf.serve}])
|
||||
if (data === "") {
|
||||
can.misc.localStorage(can, "serveList", "")
|
||||
can.misc.localStorage(can, "serve", "")
|
||||
can.user.switchTab(can, "home", {})
|
||||
}
|
||||
if (!data) { return serveList }
|
||||
current && can.misc.localStorage(can, web.SERVE, data.serve)
|
||||
for (var i = 0; i < serveList.length; i++) {
|
||||
if (serveList[i].serve == data.serve) {
|
||||
can.base.Copy(serveList[i], data), can.misc.localStorage(can, "serveList", JSON.stringify(serveList))
|
||||
return serveList[i]
|
||||
}
|
||||
}
|
||||
serveList.push(data), can.misc.localStorage(can, "serveList", JSON.stringify(serveList))
|
||||
return data
|
||||
},
|
||||
table: function(can, msg) {
|
||||
return msg.Table(function(value) {
|
||||
if (value.icons) {
|
||||
if (!can.base.beginWith(value.icons, web.HTTP)) {
|
||||
if (!can.base.beginWith(value.icons, nfs.PS)) { value.icons = nfs.P + value.icons }
|
||||
value.icons = can.misc.Resource(can, value.icons, value.space, can.db.serve)
|
||||
}
|
||||
}
|
||||
if (value.icon) {
|
||||
if (!can.base.beginWith(value.icon, web.HTTP)) {
|
||||
if (!can.base.beginWith(value.icon, nfs.PS)) { value.icon = nfs.P + value.icon }
|
||||
value.icon = can.misc.Resource(can, value.icon, value.space, can.db.serve)
|
||||
}
|
||||
}
|
||||
value.time = can.base.trimPrefix(value.time, can.base.Time(null, "%y-"))
|
||||
value.time = can.core.Split(value.time, ":").slice(0, -1).join(":")
|
||||
return value
|
||||
})
|
||||
}
|
||||
})
|
||||
|
@ -3,9 +3,9 @@ const {kit, ice,
|
||||
lex, yac, ssh, gdb,
|
||||
tcp, nfs, cli, log,
|
||||
code, wiki, chat, team, mall,
|
||||
http, html, icon, svg
|
||||
http, html,
|
||||
} = require("../const.js")
|
||||
const {shy, Volcanos} = require("../proto.js")
|
||||
const {shy, Volcanos} = require("../proto-wx.js")
|
||||
module.exports =
|
||||
Volcanos("page", {
|
||||
setData: function(can, list) { can.ui.setData({list: list||can.ui.data.list}) },
|
||||
|
@ -5,7 +5,7 @@ const {kit, ice,
|
||||
code, wiki, chat, team, mall,
|
||||
http, html, icon, svg
|
||||
} = require("../const.js")
|
||||
const {shy, Volcanos} = require("../proto.js")
|
||||
const {shy, Volcanos} = require("../proto-wx.js")
|
||||
module.exports =
|
||||
Volcanos("user", {
|
||||
agent: {
|
||||
@ -44,10 +44,25 @@ Volcanos("user", {
|
||||
}})
|
||||
},
|
||||
}, info: {},
|
||||
scene: function(can, scene) {
|
||||
scene: function(can, scene, cb) {
|
||||
function post() {
|
||||
can.misc.POST(can, can.request(), "/chat/wx/login/action/scene", {scene: scene, serve: can.db.serve}, function(msg) {
|
||||
can.misc.Info("app parse", msg.Result()), can.user.parse(can, msg.Result())
|
||||
can.misc.Info("app scene", msg.Result()), can.user.parse(can, msg.Result())
|
||||
})
|
||||
}
|
||||
function wifi(cb) { can.db.ssid && can.db.password != "******"? can.user.agent.connectWifi(can, can.db.ssid, can.db.password||"", function() { can.db.password = "******", cb() }): cb() }
|
||||
if (scene) { var ls = scene.split(nfs.PS); scene = ls[2]
|
||||
if (ls[0] == "s") { can.db.serve = "https://"+ls[1] }
|
||||
if (ls[0] == "h") { can.db.serve = "http://"+ls[1] }
|
||||
if (ls[0] == "w") {
|
||||
wx.getLocalIPAddress({success(res) {
|
||||
can.db.serve = "http://"+res.localip.split(".").slice(0,3).join(".")+"."+parseInt("0x"+ls[1])+":9020", can.db.ssid = ls[3], can.db.password = ls[4]
|
||||
wifi(function() { post() })
|
||||
} })
|
||||
} else {
|
||||
wifi(function() { post() })
|
||||
}
|
||||
} else { wifi(cb) }
|
||||
},
|
||||
parse: function(can, text, cb) {
|
||||
if (text.indexOf("WIFI:") == 0) { var data = kit.Dict(can.core.Split(text, ":;").slice(1))
|
||||
@ -63,16 +78,18 @@ Volcanos("user", {
|
||||
if (ls[2].indexOf("/pages/") == 0) { data.pages = ls[2] }
|
||||
}
|
||||
can.misc.Info("app parse", data)
|
||||
if (data.cmd == "admin") {
|
||||
can.user.jumps(can.base.MergeURL(data.pages||chat.PAGES_RIVER, data))
|
||||
} if (data.cmd||data.index||data.share) {
|
||||
if (data.cmd||data.index||data.share) {
|
||||
can.user.jumps(can.base.MergeURL(data.pages||chat.PAGES_ACTION, data))
|
||||
} else if (data.pod||data.space||data.serve) {
|
||||
can.user.jumps(can.base.MergeURL(data.pages||chat.PAGES_RIVER, data))
|
||||
can.user.switchTab(can, web.DREAM, data)
|
||||
} else {
|
||||
can.misc.POST(can, can.request(), chat.WX_LOGIN_SCAN, data)
|
||||
}
|
||||
},
|
||||
switchTab: function(can, name, data, force) { data = data||can.db
|
||||
if (!force && data.serve == can.db.serve) { return wx.switchTab({url: name}) }
|
||||
can.misc.localStorage(can, web.SERVE, data.serve||""), wx.reLaunch({url: name})
|
||||
},
|
||||
jumps: function(url, cb) { wx.navigateTo({url: url, success: cb, fail: function(res) { console.warn(res) }}) },
|
||||
title: function(text, cb) { text && wx.setNavigationBarTitle({title: text, success: cb}) },
|
||||
trans: function(can, text, list, zone) { if (!text) { return text }
|
||||
@ -80,9 +97,9 @@ Volcanos("user", {
|
||||
}, _trans: {},
|
||||
toast: function(can, title) { wx.showToast({title: title||""}) },
|
||||
modal: function(can, content, title, cb) { wx.showModal({title: title||"", content: content||"", success: cb}) },
|
||||
login: function(can, cb) { can.conf.sessid = can.conf.sessid||can.misc.localStorage(can, ice.MSG_SESSID); if (can.conf.sessid) { return cb && cb() }
|
||||
login: function(can, cb, cbs) { var serve = can.misc.serveList(can, {serve: can.db.serve}); if (serve.sessid) { return cb && cb() }
|
||||
wx.login({success: function(res) { can.misc.POST(can, can.request(), chat.WX_LOGIN_SESS, {code: res.code}, function(msg) {
|
||||
wx.setStorage({key: ice.MSG_SESSID, data: can.conf.sessid = msg.Result()}), cb && cb()
|
||||
}) }})
|
||||
can.misc.serveList(can, {serve: can.db.serve, sessid: msg.Result()}), cb && cb()
|
||||
}) }, fail: function(res) { cbs && cbs(res) }})
|
||||
},
|
||||
})
|
||||
|
@ -3,7 +3,7 @@ const {kit, ice,
|
||||
lex, yac, ssh, gdb,
|
||||
tcp, nfs, cli, log,
|
||||
code, wiki, chat, team, mall,
|
||||
http, html, icon, svg
|
||||
http, html,
|
||||
} = require("const.js")
|
||||
|
||||
function shy(help, meta, list, cb) { var arg = arguments, i = 0; function next(type) {
|
||||
@ -26,34 +26,43 @@ Volcanos._init = function() { var page = Volcanos._page; page.__proto__ = getApp
|
||||
}): can.core.Item(can.base.isFunc(item)? item(): item, set)
|
||||
}); return msg
|
||||
},
|
||||
run: function(event, cmds, cb) { wx.showLoading(); const info = wx.getSystemInfoSync()
|
||||
run: function(event, cmds, cb) { const info = wx.getSystemInfoSync(); var done = false
|
||||
can.misc.POST(can, can.request(event, {share: can.db.share}), can.base.MergeURL(can.onaction._apis||nfs.CHAT_ACTION, kit.Dict(
|
||||
ice.POD, can.db.pod||can.db.space, ice.MSG_THEME, info.theme, ice.MSG_DEBUG, can.db.debug,
|
||||
)), {cmds: (can.onaction._cmds||[]).concat(cmds)}, function(msg) { wx.hideLoading()
|
||||
ice.POD, can.base.isIn(can.db.index, "grant", "web.chat.grant")? can.db.pod: can.ConfSpace(), ice.MSG_DEBUG, can.db.debug, ice.MSG_THEME, info.theme,
|
||||
)), {cmds: (can.onaction._cmds||[ctx.ACTION, ctx.RUN, can.ConfIndex()]).concat(cmds)}, function(msg) { done = true, wx.hideLoading(), wx.stopPullDownRefresh()
|
||||
msg.Dump = function() { can.ui.setData({list: msg.Table()}) }, cb(msg)
|
||||
})
|
||||
}), can.onmotion.delay(can, function() { done || wx.showLoading() }, 500)
|
||||
},
|
||||
ConfIndex: function() { return can.db.index||can.ui.route.split("/").pop() },
|
||||
ConfSpace: function() { return can.db.space },
|
||||
Option: function() { return {} },
|
||||
}
|
||||
can.core.Item(require("frame-wx.js"), function(key, mod) { page[key] = can.base.Copy(page[key]||{}, mod, true) })
|
||||
can.core.Item(require("frame.js"), function(key, mod) { page[key] = can.base.Copy(page[key]||{}, mod, true) })
|
||||
var page = {data: {action: can.onaction.list, list: []},
|
||||
onLoad: function(options) { can.ui = this, can.db = options, can.db.serve = can.db.serve||can.conf.serve
|
||||
var _page = {data: {action: can.onaction.list, list: []},
|
||||
onLoad: function(options) { can.ui = this, can.db = options, can.db.serve = can.db.serve||can.misc.localStorage(can, web.SERVE)||can.conf.serve
|
||||
can.core.Item(can.db, function(key, value) { can.db[key] = decodeURIComponent(value) })
|
||||
can.core.Item(can.db, function(key, value) { can.db[key] = decodeURIComponent(value) })
|
||||
can.misc.Info("app show", can.ui.route, can.db, can.user.info), can.user.agent.enableDebug(can)
|
||||
can.user.title(can.db.title||can.db.pod||can.db.space||(can.db.serve||can.conf.serve).split("://")[1])
|
||||
function refresh() { can.ui.setData({conf: can.db}), can.user.login(can, function() { can.misc.WSS(can), can.onmotion.delay(can, function() { can.onaction.refresh({}, can) }, 300) }) }
|
||||
function wifi(cb) { can.db.ssid && can.db.password != "******"? can.user.agent.connectWifi(can, can.db.ssid, can.db.password||"", function() { can.db.password = "******", cb() }): cb() }
|
||||
if (can.db.scene) { var ls = can.db.scene.split(nfs.PS); can.db.scene = ls[2]
|
||||
if (ls[0] == "s") { can.db.serve = "https://"+ls[1] } if (ls[0] == "h") { can.db.serve = "http://"+ls[1] }
|
||||
if (ls[0] == "w") { can.db.serve = "http://192.168."+parseInt("0x"+ls[1][0])+"."+parseInt("0x"+ls[1][1])+":9020", can.db.ssid = ls[3], can.db.password = ls[4] }
|
||||
wifi(function() { can.user.scene(can, can.db.scene) })
|
||||
} else { wifi(refresh) }
|
||||
can.misc.Info("app show", can.ui.route, can.db, can.ui, can), can.user.agent.enableDebug(can)
|
||||
can.misc.serveList(can, {serve: can.db.serve}, true)
|
||||
can.user.scene(can, can.db.scene, function() { can.ui.setData({conf: can.db})
|
||||
can.user.login(can, function() { can.misc.WSS(can)
|
||||
can.onmotion.delay(can, function() { can.onaction.refresh({}, can) }, 300)
|
||||
}, function() { can.onaction.refresh({}, can) })
|
||||
})
|
||||
},
|
||||
onShow: function() {}, onReady: function() {}, onHide: function() {},
|
||||
onUnload: function() { can._socket && can._socket.close(), delete(can._socket) },
|
||||
onReachBottom: function() {}, onPullDownRefresh: function() { this.onUnload(), this.onLoad(can.db) }, onShareAppMessage: function() {}
|
||||
}; can.core.ItemCB(can.onaction, function(key, cb) { page[key] = function(event) { can.core.CallFunc(cb, [event, can, key, event.target.dataset]) } }), Page(page)
|
||||
onShow: function() { can.user.title(can.db.title = can.db.title||can.db.pod||can.db.space||can.db.serve.split("://")[1]) },
|
||||
onHide: function() {},
|
||||
onReady: function() {},
|
||||
onReachBottom: function() {},
|
||||
onPullDownRefresh: function() { this.onUnload(), this.onLoad(can.db) },
|
||||
onShareAppMessage: function() {
|
||||
var share = {title: can.db.title, path: can.base.MergeURL(can.ui.route, ctx.INDEX, can.db.index, web.SPACE, can.db.space, web.SERVE, can.db.serve)}
|
||||
can.misc.Info("app share", share)
|
||||
return share
|
||||
},
|
||||
}; can.core.ItemCB(can.onaction, function(key, cb) { _page[key] = function(event) { can.core.CallFunc(cb, [event, can, key, event.currentTarget.dataset]) } }), Page(_page)
|
||||
}
|
||||
|
||||
module.exports = {shy, Volcanos}
|