diff --git a/const.js b/const.js
index 134d24ed..89bf6ee6 100644
--- a/const.js
+++ b/const.js
@@ -89,6 +89,7 @@ var web = {CHAT: "chat",
GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE",
Accept: "Accept", ContentType: "Content-Type", ContentJSON: "application/json", ContentFORM: "application/x-www-form-urlencoded",
IMAGE_PNG: "image/png", VIDEO_WEBM: "video/webm",
+ URL: "url",
CODE_GIT_STATUS: "web.code.git.status",
CODE_GIT_REPOS: "web.code.git.repos",
@@ -108,6 +109,7 @@ var web = {CHAT: "chat",
}
var aaa = {
SESS: "sess",
+ AUTH: "auth",
USER: "user",
EMAIL: "email",
LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token",
@@ -239,6 +241,13 @@ var mall = {
ASSET: "asset", SALARY: "salary",
}
+var http = {
+ ContentType: "Content-Type",
+}
+var mime = {
+ TextPlain: "text/plain",
+ ApplicationJSON: "application/json",
+}
var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200,
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]",
@@ -266,6 +275,7 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200,
SCROLLBAR: "scrollbar",
VISIBILITY: "visibility",
VERTICAL: "vertical", HORIZON: "horizon",
+ NOTICE: "notice", DANGER: "danger",
SIZE: "size", OPACITY: "opacity", VISIBLE: "visible",
CLASS: "class", LIGHT: "light", DARK: "dark",
@@ -283,6 +293,7 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200,
DIV_FLOAT: "div.float", DIV_TOAST: "div.toast", DIV_CARTE: "div.carte",
DESKTOP: "desktop", DIV_DESKTOP: "div.desktop", DIV_EXPAND: "div.expand",
DIV_ITEM_SELECT: "div.item.select",
+ DIV_TABS_SELECT: "div.tabs.select",
}
var svg = {
GROUP: "group", PID: "pid", GRID: "grid",
diff --git a/frame.js b/frame.js
index 586edd1c..448d0103 100644
--- a/frame.js
+++ b/frame.js
@@ -1,9 +1,10 @@
Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) {
+ console.log(can.misc._time())
if (!can.user.isMailMaster) { if (can.misc.Search(can, ice.MSG_SESSID)) { can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID)); return can.misc.Search(can, ice.MSG_SESSID, "") } }
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.user.title(can.misc.SearchOrConf(can, chat.TITLE)||can.misc.Search(can, ice.POD)||location.host)
can.core.Next(list, function(item, next) { item.type = chat.PANEL
- can.onappend._init(can, item, item.list, function(sub) { can[item.name] = sub
+ 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}) }) })
@@ -107,7 +108,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
var output = can.page.SelectOne(can, field, html.DIV_OUTPUT)
var status = can.page.SelectOne(can, field, html.DIV_STATUS)
legend.innerHTML = legend.innerHTML || meta.index
- can.base.isIn(meta.index, web.WIKI_PORTAL) && can.onappend.style(can, html.OUTPUT, field)
+ (can.base.isIn(meta.index, web.WIKI_PORTAL) || meta.style == html.OUTPUT) && 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: [],
Status: function(key, value) { if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } try {
@@ -178,9 +179,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
})
}; var auto; can.core.Next(can.core.Value(can, [chat.ONIMPORT, mdb.LIST])||meta.inputs, add, function() { skip || can.Conf(ice.AUTO) == "delay" || auto && auto.click() })
},
- _action: function(can, list, action, meta) { meta = meta||can.onaction||{}, action = action||can._action, can.onmotion.clear(can, action)
+ _action: function(can, list, action, meta, hold) { meta = meta||can.onaction||{}, action = action||can._action, hold || can.onmotion.clear(can, action)
function run(event, button) { can.misc.Event(event, can, function(msg) { var _can = can._fields? can.sup: can; can.requestAction(event, button)
- var cb = meta[button]||meta[chat._ENGINE]; cb? can.core.CallFunc(cb, {event: event, can: can, button: button}): can.run(event, button == mdb.LIST? []: [ctx.ACTION, button].concat(_can.Input()))
+ var cb = meta[button]||meta[chat._ENGINE]; cb? can.core.CallFunc(cb, {event: event, can: can, button: button}):
+ can.run(event, button == mdb.LIST? []: [ctx.ACTION, button].concat(_can.Input()))
}) }
return can.core.List(can.page.inputs(can, can.base.getValid(can.base.Obj(list), can.core.Value(can, [chat.ONACTION, mdb.LIST]), meta != can.onaction? can.core.Item(meta): [])||[]), function(item) {
can.base.isUndefined(item) || can.onappend.input(can, item == ""? /* 1.空白 */ {type: html.BR}:
@@ -189,7 +191,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
}}: 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; meta[item[0]]? can.core.CallFunc(meta[item[0]], [event, can, item[0], button]): meta[button] && can.core.CallFunc(meta[button], [event, can, button])
}) }}: /* 4.其它 */(item.type == html.BUTTON && (item.value = item.value||can.user.trans(can, item.name, meta._trans), item.onclick = item.onclick||function(event) {
- run(event, item.name)
+ run(event, item.name||item.value)
}, item._init = item._init||function(target) { item.action && can.onappend.figure(sub, item, target, function(_sub, value) { can.Update() })
if (can.base.isIn(item.name, mdb.CREATE, mdb.INSERT)) { can.onappend.style(can, "icons", target.parentNode)
can.page.Append(can, target.parentNode, [{icon: item.name, onclick: function(event) { can.Update(event, [ctx.ACTION, item.name]) }}])
@@ -213,10 +215,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
can.onappend._output(can, msg, meta.display||msg.Option(ice.MSG_DISPLAY)||meta.feature.display)
})
},
- _output: function(can, msg, display, output, action, cb) { display = display||chat.PLUGIN_TABLE_JS, output = output||can._output
+ _output: function(can, msg, display, cb, output, status, action) { display = display||chat.PLUGIN_TABLE_JS, output = output||can._output
can.misc.Search(can, log.DEBUG) == ice.TRUE && can.base.beginWith(display, "/require/src/") && delete(Volcanos.meta.cache[display])
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: can._action, _output: output, _status: can._status,
+ _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: {}, ui: {},
}, [display, chat.PLUGIN_TABLE_JS], function(sub) { sub.Conf(can.Conf())
var last = can.sub; last && can.core.CallFunc([last, "onaction.hidden"], {can: last})
@@ -229,7 +231,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: can.page.inputs(can, sub.onimport.list, html.TEXT) })
}
can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) {
- if (action !== false) {
+ if (action !== false) { can.onkeymap._build(sub)
can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action)
sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS)), can.user.isMobile || sub.onappend.tools(sub, msg)
}
@@ -312,7 +314,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
target.onclick = function(event) { can.misc.Event(event, can, function(msg) { can.run(can.request(event, can.Option()), [ctx.ACTION, target.name]) }) }
}) } 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) },
+ tools: function(can, msg, cb, target) {
+ can.onimport.tool(can, can.base.Obj(msg.Option(ice.MSG_TOOLKIT), can.misc.sessionStorage(can, [can.ConfIndex(), "tool"]))||[], cb, target)
+ },
style: function(can, style, target) { target = target||can._fields||can._target
if (can.base.endWith(style, ".css")) { return can.require([style]) }
@@ -391,6 +395,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
can.page.style(can, target, html.HEIGHT, h, html.WIDTH, w), width -= w
}
}), can.core.List(list, function(item) { if (can.base.isArray(item)) { layout(type == FLOW? FLEX: FLOW, item, height, width) } }) }
+ ui.profile && can.onmotion.hidden(can, ui.profile), ui.display && can.onmotion.hidden(can, ui.display)
if (can.onimport.filter) { ui.filter = can.onimport.filter(can, ui.project) }
ui.layout = function(height, width, delay, cb) { can.onmotion.delay(can, function() { defer = [], layout(type, ui.list, height, width), defer.forEach(function(cb) { cb() }), cb && cb(content_height, content_width) }, delay||0) }; return ui
},
@@ -480,7 +485,10 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||can._ro
}
}
if (layout.left+target.offsetWidth > left+width) { layout.left = (right? rect.left: left+width)-target.offsetWidth-1 }
- }); return can.onmotion.move(can, target, layout), layout
+ });
+ can.onmotion.move(can, target, layout)
+ can.onmotion.slideDown(can, target)
+ return layout
},
})
Volcanos(chat.ONMOTION, {_init: function(can, target) {
@@ -596,7 +604,9 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
},
clear: function(can, target) { return can.page.Modify(can, target||can._output, ""), target },
cache: function(can, next) { var list = can.base.getValid(can.base.Obj(can.core.List(arguments).slice(2)), [can._output])
- var key = next(can._cache_data = can._cache_data||{}, list[0]._cache_key); if (key == list[0]._cache_key) { return true }
+ 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 }
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 }
@@ -648,7 +658,14 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
}
}
},
- touch: function() {
+ slideDown: function(can, target) {
+ var top = target.offsetTop, offset = 32, begin = top - offset
+ can.page.style(can, target, html.TOP, begin)
+ can.core.Timer({interval: 1, length: 30}, function(timer, interval, index, list) {
+ can.page.style(can, target, html.TOP, begin += offset/list.length)
+ }, function() {
+ can.page.style(can, target, html.TOP, top)
+ })
},
})
Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||document.body
diff --git a/index.css b/index.css
index f3b3d147..d7478a7a 100644
--- a/index.css
+++ b/index.css
@@ -166,6 +166,7 @@ body {
--code-constant:gray; --code-string:brown; --code-object:purple;
--box-border:var(--plugin-border-color) solid 1px;
+ --box-notice:var(--notice-bg-color) solid 1px;
--box-shadow:var(--body-fg-color) 2px 2px 8px;
--svg-stroke-width:2;
}
@@ -213,13 +214,6 @@ fieldset>form.option>div.item.select { border-radius:5px; }
fieldset>div.action>div.item.select { border-radius:5px; }
fieldset>div.action>div.item.button { border-radius:5px; }
fieldset>div.action>div.item { margin-right:10px; box-shadow:var(--box-shadow); }
-
-fieldset.web.code.docker.studio>div.action>div.item { font-style:italic; height:32px; padding:5px 10px; }
-fieldset.web.code.docker.studio>div.output>fieldset { margin:0; }
-fieldset.web.code.docker.studio>div.output>fieldset>legend { display:none; }
-fieldset.web.code.docker.studio>div.output>fieldset>form.option>div:first-child { margin-left:10px; }
-fieldset.web.code.docker.studio>div.output { padding:10px; }
-
fieldset>div.output { width:100%; }
fieldset>div.output table.content input { margin-right:10px; box-shadow:var(--box-shadow); }
fieldset>div.status { width:100%; }
@@ -279,7 +273,7 @@ select, input { font-size:1rem; height:32px; } input::placeholder, textarea::pl
textarea { font-size:1rem; tab-size:2; padding:5px; height:96px; width:100%; resize:vertical; }
table.content, div.code, div.story[data-type=spark] { white-space:pre; margin:0; }
div.story[data-type=spark] { padding:0 5px; border-left:var(--notice-bg-color) solid 5px; }
-fieldset>div.action>div.tabs { font-style:italic; padding:0 10px;}
+fieldset>div.action>div.tabs { font-style:italic; padding-left:10px; box-shadow:var(--box-shadow); margin-left:5px; }
fieldset>div.output>div.code { font-size:14px; }
fieldset>div.status>div.item { padding:5px; height:31px; }
fieldset>div.status>div.item>label { font-size:0.6rem; }
@@ -405,9 +399,19 @@ fieldset.full { position:fixed; left:0; top:0; }
fieldset>div.output>div.code { position:sticky; left:0; }
legend, select, input[type=button], th, table.content td, h1, h2, h3, div.item, div.tabs { cursor:pointer; }
div.story[data-type=spark] { cursor:copy; }
-fieldset>div.status>legend { margin-right:10px; float:right; clear:none; }
-fieldset>div.status>legend:not(:hover):not(.select) { background-color:unset; box-shadow: var(--box-shadow); }
+fieldset>div.status>legend {
+ font-style:italic; margin-right:5px; float:right; clear:none;
+ border-radius: 0; border-bottom-left-radius:10px; border-bottom-right-radius:10px;
+ box-shadow: var(--box-shadow);
+}
+fieldset>div.status>legend>span.remove { margin-left:10px; }
+fieldset>div.status>legend>span.remove:hover { background-color:var(--hover-bg-color); }
+fieldset>div.status>legend:not(:hover)>span.remove { visibility:hidden; }
+fieldset>div.status>legend:not(:hover):not(.select) { background-color:unset; border-radius: 0; }
/* hover */
+div.item.notice input:hover[type=button] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
+div.item.danger input:hover[type=button] { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
+input:hover[type=button][name=create] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
input:hover[type=button][name=create] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
input:hover[type=button][name=insert] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
input:hover[type=button][name=restart] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
@@ -451,7 +455,18 @@ span.item:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-c
span.item.select { 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.action div.tabs:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
-div.action div.tabs.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
+/* div.action div.tabs.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } */
+div.action div.tabs {
+ /* border-top-left-radius:10px; border-top-right-radius:10px; */
+}
+div.action div.tabs:hover {
+ background-color:var(--output-bg-color); color:var(--hover-fg-color);
+ border-top-left-radius:10px; border-top-right-radius:10px;
+}
+div.action div.tabs.select {
+ background-color:var(--output-bg-color); color:var(--hover-fg-color);
+ border-top-left-radius:10px; border-top-right-radius:10px;
+}
fieldset>div.output { background-color:var(--output-bg-color); }
fieldset>div.status { border-top:var(--status-border); max-height:32px; }
fieldset:not(.panel):not(.cmd) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); }
@@ -482,6 +497,7 @@ body.light fieldset.panel:not(.main):not(.auto) div.item.select { background-col
body.light fieldset.panel:not(.main):not(.auto) input { background-color:var(--panel-input-bg-color); color:var(--panel-input-fg-color); border-radius:var(--input-radius); }
body.light fieldset.panel:not(.main)>div.output>div.item>input::placeholder { background-color:var(--panel-input-bg-color); color:var(--panel-fg-color); }
body.light fieldset.panel:not(.main) label { color:var(--panel-fg-color); }
+body.light fieldset.panel:not(.main) a { color:var(--panel-fg-color); }
body.light span.keyword { color:darkblue; } body.light span.function { color:darkcyan; }
body.dark span.keyword { color:royalblue; } body.dark span.function { color:lightgreen; }
/* print */
@@ -531,7 +547,17 @@ fieldset.draw.trend div.output { overflow:hidden; }
fieldset.draw.spide div.output { overflow-y:hidden; }
fieldset.draw.spide div.output svg text { cursor:pointer; }
fieldset.draw.spide div.output svg path { stroke-width:1; }
+fieldset.web.code.docker.studio>div.action>div.item { font-style:italic; height:32px; padding:5px 10px; }
+fieldset.web.code.docker.studio>div.output>fieldset { margin:0; }
+fieldset.web.code.docker.studio>div.output>fieldset>legend { display:none; }
+fieldset.web.code.docker.studio>div.output>fieldset>form.option>div:first-child { margin-left:10px; }
+fieldset.web.code.docker.studio>div.output { padding:10px; }
fieldset.web.code.git.status>div.output table.content { width:100%; }
+fieldset.cmd>legend { background-color:var(--ui-blue-8); }
+fieldset.cmd>div.action>div.tabs.select { border-bottom:var(--notice-bg-color) solid 2px; height:32px; }
+fieldset.cmd>div.status>legend.select { border-top:var(--notice-bg-color) solid 2px; }
+fieldset.cmd>div.output>div.project div.item.select { border-right:var(--notice-bg-color) solid 4px; }
+fieldset.cmd>div.output>div.project div.item { line-height:32px; }
fieldset.can.view { font-size:14px; }
fieldset.can.data { font-size:14px; }
img, iframe { margin-bottom:-3px; }
diff --git a/lib/base.js b/lib/base.js
index b864efe6..259f1af4 100644
--- a/lib/base.js
+++ b/lib/base.js
@@ -117,6 +117,7 @@ Volcanos("base", {
if (arg[i] && str.replace) { while (str.indexOf(arg[i]) > -1) { str = str.replace(arg[i], arg[i+1]) } }
} return str },
contains: function(str) { var arg = arguments; for (var i = 1; i < arg.length; i++) { if (!arg[i] || str.indexOf(arg[i]) > -1) { return true } } },
+ capital: function(str) { return str.slice(0, 1).toUpperCase()+str.slice(1) },
beginWith: function(str) {
for (var i = 1; i < arguments.length; i++) {
if (typeof str == code.STRING && str.trim().indexOf(arguments[i]) == 0) { return true }
diff --git a/lib/page.js b/lib/page.js
index 4575fa33..b00b4baf 100644
--- a/lib/page.js
+++ b/lib/page.js
@@ -206,7 +206,8 @@ Volcanos("page", {
Format: function(type) { var arg = arguments; switch (type) {
case html.A: return ""+(arg[2]||arg[1])+""
case html.IMG: return arg[2]? "
": "
"
- case html.SPAN: return arg[2]? ""+arg[1]+"": arg[1]
+ case html.SPAN:
+ return arg[2]? ""+arg[1]+"": arg[1]
default: /* type inner arg... */
var list = ["<"+type]; for (var i = 2; i < arg.length; i += 2) { list.push(lex.SP+arg[i]+mdb.EQ+arg[i+1]) }
return list.concat(">", arg[1], "", type, ">").join("")
diff --git a/panel/action.js b/panel/action.js
index 9cf24982..52e2b24d 100644
--- a/panel/action.js
+++ b/panel/action.js
@@ -48,8 +48,8 @@ Volcanos(chat.ONACTION, {_init: function(can, target) {
})
},
onstorm_select: function(can, msg, river, storm) {
- if (can.onmotion.cache(can, function(cache, old) { old && (cache[old] = can._plugins)
- var key = can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm)); return can._plugins = cache[key]||[], key
+ if (can.onmotion.cache(can, function(save, load) { save({plugins: can._plugins})
+ return load(can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm)), function(bak) { can._plugins = bak.plugins })
}, can._output, can._action, can._header_tabs)) { if (msg.Option("refresh") != "true") { return can.onaction.layout(can) } }
can.run(can.request({}, {_method: web.GET}), [river, storm], function(msg) {
if (msg.Length() == 0) { return can.user.isLocalFile? can.user.toastFailure(can, "miss data"): can.onengine.signal(can, chat.ONACTION_NOTOOL, can.request({}, {river: river, storm: storm})) }
diff --git a/panel/footer.js b/panel/footer.js
index ea303ebf..ca86e9df 100644
--- a/panel/footer.js
+++ b/panel/footer.js
@@ -29,7 +29,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(NKEY, can.
ncmd: function(can, msg, _follow, _cmds) { can.onimport._data(can, NCMD, {time: can.base.Time(), follow: _follow, cmds: _cmds}), can.onimport.nlog(can, NLOG) },
nlog: function(can, name) { can.onimport.count(can, name) },
})
-Volcanos(chat.ONACTION, {_init: function(can) { can.ui = {}, can.db = {} },
+Volcanos(chat.ONACTION, {_init: function(can) {},
onsize: function(can) { can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth) },
onlogin: function(can, msg) { can.run(can.request({}, {_method: web.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}) },
@@ -112,5 +112,15 @@ Volcanos(chat.ONPLUGIN, {
], true)]); can.onmotion.delay(can, function() { can.page.Select(can, ui._target, "div.item.head,div.item.body", function(target) { target.click() }) })
}
}),
+ runtime: shy("网页环境", [mdb.KEY], function(can, msg, arg) {
+ msg.Echo(JSON.stringify({
+ href: location.href,
+ height: can.page.height(), width: can.page.width(),
+ userAgent: navigator.userAgent,
+ history: history.length,
+ boot: can.db._boot,
+ version: window._version,
+ })).Display("/plugin/story/json.js")
+ })
})
})()
diff --git a/panel/search.js b/panel/search.js
index 43c8b84b..aeb25cbe 100644
--- a/panel/search.js
+++ b/panel/search.js
@@ -5,7 +5,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can, can
can.onmotion.toggle(can, can._status, can.db.type != mdb.FOREACH) && can.onappend._status(can, can.base.Obj(msg.Option(ice.MSG_STATUS), []).concat({name: mdb.SELECT, value: "0"}))
can.onmotion.focus(can, can.ui.filter), msg.Length() == 1 && can.ui.profile.innerHTML == "" && can.page.Select(can, table, html.TD)[0].click()
},
- _size: function(can) { can.ui && can.getActionSize(function(left, top, width, height) {
+ _size: function(can) { can.ui && can.ui.content && can.getActionSize(function(left, top, width, height) {
can.page.style(can, can._target, {left: left||0, top: top||0, width: width}), can.page.style(can, can._output, html.MAX_HEIGHT, height -= 2*html.PLUGIN_MARGIN+html.ACTION_HEIGHT+can.onexport.statusHeight(can))
can.core.List([can.ui.content, can.ui.display], function(target) { can.page.style(can, target, html.MAX_WIDTH, can.ConfWidth(width-2*html.PLUGIN_MARGIN)) })
can.ConfHeight(can.base.Min(height-can.ui.content.offsetHeight-can.ui.display.offsetHeight-1, height/2))
diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css
index ccdcc3c3..dcec511d 100644
--- a/plugin/local/code/inner.css
+++ b/plugin/local/code/inner.css
@@ -44,9 +44,10 @@ fieldset.inner>div.output>div.project>div.zone>div.item>span.icon { font-style:n
fieldset.inner.cmd>div.output>div.layout>div.tabs { height:38px; display:block; overflow:hidden; background-color:var(--plugin-bg-color); }
fieldset.inner.cmd>div.output>div.layout>div.tabs.hide { display:none; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div { padding:10px; height:38px; float:left; }
+fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs { padding-right:0; margin-left:5px; box-shadow:var(--box-shadow); }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.icon { font-size:26px; line-height:32px; padding:2px 5px; position:sticky; top:0; }
-fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs.select { background-color:var(--output-bg-color); box-shadow:var(--box-shadow); }
-fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs:hover { background-color:var(--output-bg-color); }
+fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs.select { background-color:var(--output-bg-color); border-top-left-radius:10px; border-top-right-radius:10px; }
+fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs:hover { background-color:var(--output-bg-color); border-top-left-radius:10px; border-top-right-radius:10px; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs>span { font-style:italic; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs>span.icon { padding:0 5px; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.usernick { float:right; position:sticky; top:0; }
diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js
index fc963057..12920ccf 100644
--- a/plugin/local/code/inner.js
+++ b/plugin/local/code/inner.js
@@ -6,6 +6,7 @@ const PROFILE_ARGS = "profile:args:", DISPLAY_ARGS = "display:args:"
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) { var paths = can.core.Split(can.Option(nfs.PATH), mdb.FS); can.Option(nfs.PATH, paths[0])
+ can.Mode(msg.Option("mode")||can.Mode()), can.Option(nfs.FILE) == " " && can.Option(nfs.FILE, "")
if (can.Mode() == ice.MSG_RESULT) { msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE) }
can.core.List(paths.concat(can.core.Split(msg.Option(nfs.REPOS))), function(p) { if (can.base.beginWith(p, nfs.USR_LOCAL_WORK) || can.base.endWith(p, "-dict/")) { return }
if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) }
@@ -221,7 +222,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
}, target)
})
} else if (msg.Option(ice.MSG_DISPLAY) != "") {
- can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY), target, false, function(msg) { can.onimport.layout(can) })
+ can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY), function(msg) { can.onimport.layout(can) }, target)
} else if (msg.Result().indexOf("