1
0
forked from x/icebergs

opt matrix

This commit is contained in:
IT 老营长 @云轩领航-创始人 2024-02-14 17:59:27 +08:00
parent 1277c42256
commit 8b55171ae5
15 changed files with 114 additions and 102 deletions

View File

@ -62,8 +62,8 @@ func _runtime_init(m *ice.Message) {
nfs.Exists(m, "/proc/meminfo", func(p string) { nfs.Exists(m, "/proc/meminfo", func(p string) {
kit.For(kit.SplitLine(m.Cmdx(nfs.CAT, p)), func(p string) { kit.For(kit.SplitLine(m.Cmdx(nfs.CAT, p)), func(p string) {
switch ls := kit.Split(p, ": "); kit.Select("", ls, 0) { switch ls := kit.Split(p, ": "); kit.Select("", ls, 0) {
case "MemTotal", "MemFree", "MemAvailable", "Buffers", "Cached": case "MemTotal", "MemFree", "MemAvailable":
m.Conf(RUNTIME, kit.Keys(BOOT, ls[0]), kit.FmtSize(kit.Int(ls[1])*1024)) m.Conf(RUNTIME, kit.Keys(HOST, ls[0]), kit.FmtSize(kit.Int(ls[1])*1024))
} }
}) })
}) })
@ -180,7 +180,7 @@ const RUNTIME = "runtime"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
RUNTIME: {Name: "runtime info=bootinfo,ifconfig,diskinfo,hostinfo,userinfo,bootinfo,role,api,cli,cmd,mod,env,path,chain auto upgrade reboot stash logs conf lock", Icon: "Infomation.png", Help: "运行环境", Actions: ice.MergeActions(ice.Actions{ RUNTIME: {Name: "runtime info=bootinfo,ifconfig,diskinfo,hostinfo,userinfo,bootinfo,role,api,cli,cmd,mod,env,path,chain auto upgrade reboot stash lock", Icon: "Infomation.png", Help: "运行环境", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { _runtime_init(m); aaa.White(m, ice.LICENSE) }}, ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { _runtime_init(m); aaa.White(m, ice.LICENSE) }},
IFCONFIG: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(tcp.HOST) }}, IFCONFIG: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(tcp.HOST) }},
DISKINFO: {Hand: func(m *ice.Message, arg ...string) { _runtime_diskinfo(m) }}, DISKINFO: {Hand: func(m *ice.Message, arg ...string) { _runtime_diskinfo(m) }},
@ -250,12 +250,6 @@ func init() {
m.Cmd(SYSTEM, "git", "checkout", ".") m.Cmd(SYSTEM, "git", "checkout", ".")
m.Go(func() { m.Sleep30ms(ice.QUIT, 1) }) m.Go(func() { m.Sleep30ms(ice.QUIT, 1) })
}}, }},
"logs": {Help: "日志", Hand: func(m *ice.Message, arg ...string) {
OpenCmds(m, kit.Format("cd %s", kit.Path("")), "tail -f var/log/bench.log")
}},
"conf": {Help: "配置", Hand: func(m *ice.Message, arg ...string) {
OpenCmds(m, kit.Format("cd %s", kit.Path("")), "vim etc/init.shy")
}},
"lock": {Help: "锁屏", Icon: "bi bi-file-lock", Hand: func(m *ice.Message, arg ...string) { "lock": {Help: "锁屏", Icon: "bi bi-file-lock", Hand: func(m *ice.Message, arg ...string) {
switch runtime.GOOS { switch runtime.GOOS {
case DARWIN: case DARWIN:
@ -282,7 +276,6 @@ func ParseMake(str string) []string {
res := kit.UnMarshal(str) res := kit.UnMarshal(str)
data := kit.Value(res, MAKE) data := kit.Value(res, MAKE)
return kit.Simple( return kit.Simple(
// mdb.TIME, kit.Format(kit.Value(res, kit.Keys(BOOT, mdb.TIME))),
mdb.TIME, kit.Format(kit.Value(data, mdb.TIME)), mdb.TIME, kit.Format(kit.Value(data, mdb.TIME)),
ice.SPACE, kit.Format(kit.Value(res, kit.Keys(NODE, mdb.NAME))), ice.SPACE, kit.Format(kit.Value(res, kit.Keys(NODE, mdb.NAME))),
nfs.MODULE, kit.Format(kit.Value(data, nfs.MODULE)), nfs.MODULE, kit.Format(kit.Value(data, nfs.MODULE)),

View File

@ -130,6 +130,7 @@ const (
TIME_30ms = "30ms" TIME_30ms = "30ms"
TIME_30s = "30s" TIME_30s = "30s"
TIME_3s = "3s" TIME_3s = "3s"
TIME_1s = "1s"
CMD_DIR = "cmd_dir" CMD_DIR = "cmd_dir"
CMD_ENV = "cmd_env" CMD_ENV = "cmd_env"

View File

@ -6,6 +6,7 @@ import (
"unicode" "unicode"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/lex" "shylinux.com/x/icebergs/base/lex"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
@ -22,11 +23,14 @@ func init() {
LEVEL = "level" LEVEL = "level"
) )
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
DEBUG: {Name: "debug level=error,bench,debug,error,watch offset limit filter auto reset doc", Help: "后台日志", Actions: ice.Actions{ DEBUG: {Name: "debug level=error,bench,debug,error,watch offset limit filter auto reset app doc", Help: "后台日志", Actions: ice.Actions{
"doc": {Help: "文档", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen("https://pkg.go.dev/std") }}, "doc": {Help: "文档", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen("https://pkg.go.dev/std") }},
"reset": {Help: "重置", Hand: func(m *ice.Message, arg ...string) { "reset": {Help: "重置", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.CAT, _debug_file(arg[0]), func(line string, index int) { m.ProcessRewrite(mdb.OFFSET, index+2, mdb.LIMIT, 1000) }) m.Cmd(nfs.CAT, _debug_file(arg[0]), func(line string, index int) { m.ProcessRewrite(mdb.OFFSET, index+2, mdb.LIMIT, 1000) })
}}, }},
"app": {Hand: func(m *ice.Message, arg ...string) {
cli.OpenCmds(m, kit.Format("cd %s", kit.Path("")), "tail -f var/log/bench.log")
}},
}, Hand: func(m *ice.Message, arg ...string) { }, Hand: func(m *ice.Message, arg ...string) {
offset, limit, stats := kit.Int(kit.Select("0", arg, 1)), kit.Int(kit.Select("1000", arg, 2)), map[string]int{} offset, limit, stats := kit.Int(kit.Select("0", arg, 1)), kit.Int(kit.Select("1000", arg, 2)), map[string]int{}
switch arg[0] { switch arg[0] {

View File

@ -48,7 +48,7 @@ const COUNT = "count"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
COUNT: &ice.Command{Name: "count hash auto group valid location", Help: "计数", Meta: kit.Dict( COUNT: &ice.Command{Name: "count hash auto group valid location", Help: "计数", Meta: kit.Dict(
ice.CTX_TRANS, kit.Dict(html.INPUT, kit.Dict(aaa.LOCATION, "地理位置")), ice.CTX_TRANS, kit.Dict(html.INPUT, kit.Dict(aaa.LOCATION, "地理位置")),
), Actions: ice.MergeActions(ice.Actions{ ), Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create type name text", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create type name text", Hand: func(m *ice.Message, arg ...string) {

View File

@ -161,8 +161,7 @@ func _dream_binary(m *ice.Message, p string) {
GoToast(m, DOWNLOAD, func(toast func(string, int, int)) (list []string) { GoToast(m, DOWNLOAD, func(toast func(string, int, int)) (list []string) {
begin := time.Now() begin := time.Now()
SpideSave(m, bin, kit.MergeURL(p, cli.GOOS, runtime.GOOS, cli.GOARCH, runtime.GOARCH), func(count, total, value int) { SpideSave(m, bin, kit.MergeURL(p, cli.GOOS, runtime.GOOS, cli.GOARCH, runtime.GOARCH), func(count, total, value int) {
cost := time.Now().Sub(begin) toast(m.Option(mdb.NAME)+" "+kit.FormatShow(cli.COST, kit.FmtDuration(time.Now().Sub(begin))), count, total)
toast(kit.FormatShow(nfs.FROM, begin.Format(ice.MOD_TIME_ONLY), cli.COST, kit.FmtDuration(cost), cli.REST, kit.FmtDuration(cost*time.Duration(101)/time.Duration(value+1)-cost)), count, total)
}) })
return nil return nil
}) })

View File

@ -1,29 +1,25 @@
fieldset.web.matrix>div.output>table.content thead { z-index:2; } fieldset.web.matrix>div.output>table.content th { padding:var(--input-padding); }
fieldset.web.matrix>div.output>table.content th { font-family:unset; padding:var(--table-padding); } fieldset.web.matrix>div.output>table.content th i { padding:var(--input-padding); }
fieldset.web.matrix>div.output>table.content th i { padding:var(--input-padding); position:unset; display:unset; }
fieldset.web.matrix>div.output>table.content th i:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } fieldset.web.matrix>div.output>table.content th i:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
fieldset.web.matrix>div.output>table.content td { padding:var(--input-padding); }
fieldset.web.matrix>div.output>table.content td:hover { color:unset; } fieldset.web.matrix>div.output>table.content td:hover { color:unset; }
fieldset.web.matrix>div.output>table.content div.item { display:flex; align-items:center; cursor:default; } fieldset.web.matrix>div.output>table.content div.item { display:flex; align-items:center; cursor:default; }
fieldset.web.matrix>div.output>table.content div.item img { height:var(--header-height); width:var(--header-height); margin:var(--input-margin); cursor:pointer; }
fieldset.web.matrix>div.output>table.content div.item div.title { text-align:left; padding:var(--input-padding); }
fieldset.web.matrix>div.output>table.content div.item div.title>span { cursor:pointer; }
fieldset.web.matrix>div.output>table.content div.item div.status i { font-size:var(--status-font-size); padding:0; }
fieldset.web.matrix>div.output>table.content div.item div.action { margin-top:var(--input-margin); overflow:hidden; }
fieldset.web.matrix>div.output>table.content div.item div.action input.icons { display:none; }
fieldset.web.matrix>div.output>table.content div.item:hover { background-color:unset; color:unset; } fieldset.web.matrix>div.output>table.content div.item:hover { background-color:unset; color:unset; }
fieldset.web.matrix>div.output>table.content div.item img { height:var(--header-height); width:var(--header-height); margin:var(--input-margin); }
/* fieldset.web.matrix>div.output>table.content div.item img { height:64px; width:64px; margin-right:var(--input-margin); } */
fieldset.web.matrix>div.output>table.content div.item div.title { text-align:left; }
fieldset.web.matrix>div.output>table.content div.item div.title:hover { background-color:unset; } fieldset.web.matrix>div.output>table.content div.item div.title:hover { background-color:unset; }
fieldset.web.matrix>div.output>table.content div.item div.title span:hover { background-color:var(--hover-bg-color); } fieldset.web.matrix>div.output>table.content div.item div.title span:hover { background-color:var(--hover-bg-color); }
fieldset.web.matrix>div.output>table.content div.item div.status i { font-size:var(--status-font-size); padding:0; }
fieldset.web.matrix>div.output>table.content div.item div.status div.item:hover { background-color:var(--hover-bg-color); } fieldset.web.matrix>div.output>table.content div.item div.status div.item:hover { background-color:var(--hover-bg-color); }
fieldset.web.matrix>div.output>table.content div.item div.action { overflow:hidden; } fieldset.web.matrix>div.output>table.content div.item.stop div.title>span { color:var(--disable-fg-color); }
fieldset.web.matrix>div.output>table.content div.item div.action input.icons { display:none; }
fieldset.web.matrix>div.output>table.content div.item.notice { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } fieldset.web.matrix>div.output>table.content div.item.notice { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
fieldset.web.matrix>div.output>table.content div.item.danger { background-color:var(--danger-bg-color); color:var(--danger-fg-color); } fieldset.web.matrix>div.output>table.content div.item.danger { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
fieldset.web.matrix>div.output>table.content div.item.danger div.status { background-color:var(--danger-bg-color); color:var(--danger-fg-color); } fieldset.web.matrix>div.output>table.content div.item.danger div.status div.item { color:var(--danger-fg-color); }
fieldset.web.matrix>div.output>table.content div.item.danger div.status div.item { background-color:var(--danger-bg-color); color:var(--danger-fg-color); } fieldset.web.matrix>div.output>table.content tr:not(:hover) div.action { visibility:hidden; }
fieldset.web.matrix>div.output>table.content div.item.danger div.status i { background-color:var(--danger-bg-color); color:var(--danger-fg-color); } body:not(.mobile) fieldset.web.matrix>div.output>table.content thead { z-index:2; }
fieldset.web.matrix>div.output>table.content div.item.danger div.status span { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
// fieldset.web.matrix>div.output>table.content div.item.danger div.status i { color:var(--danger-bg-color); }
// fieldset.web.matrix>div.output>table.content div.item.danger div.status span { color:var(--danger-bg-color); }
fieldset.web.matrix>div.output>table.content tr:not(:hover) div.item div.action { visibility:hidden; }
body:not(.mobile) fieldset.web.matrix>div.output>table.content th:first-child { position:sticky; left:2px; z-index:2; } body:not(.mobile) fieldset.web.matrix>div.output>table.content th:first-child { position:sticky; left:2px; z-index:2; }
body:not(.mobile) fieldset.web.matrix>div.output>table.content td:first-child { background-color:var(--plugin-bg-color); position:sticky; left:2px; z-index:1; } body:not(.mobile) fieldset.web.matrix>div.output>table.content td:first-child { background-color:var(--plugin-bg-color); position:sticky; left:2px; z-index:1; }
body:not(.mobile) fieldset.web.matrix>div.output>table.content tr.danger td:first-child { background-color:transparent; } body:not(.mobile) fieldset.web.matrix>div.output>table.content tr.danger td:first-child { background-color:transparent; }

View File

@ -8,21 +8,25 @@ import (
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web/html"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _matrix_list(m *ice.Message, domain string) (server []string) { func _matrix_list(m *ice.Message, domain string, fields ...string) (server []string) {
fields := kit.Split(mdb.Config(m, mdb.FIELD))
button := []ice.Any{PORTAL, ADMIN, DESKTOP, kit.Select(UPGRADE, COMPILE, domain == ""), WORD, STATUS, VIMER, XTERM, cli.RUNTIME, OPEN}
value := kit.Dict(cli.ParseMake(m.Cmdx(Space(m, domain), cli.RUNTIME))) value := kit.Dict(cli.ParseMake(m.Cmdx(Space(m, domain), cli.RUNTIME)))
value[mdb.TYPE], value[mdb.ICONS] = SERVER, kit.Select(nfs.USR_ICONS_ICEBERGS, ice.SRC_MAIN_ICO, domain == "") value[DOMAIN], value[mdb.TYPE], value[mdb.ICONS] = domain, SERVER, kit.Select(nfs.USR_ICONS_ICEBERGS, ice.SRC_MAIN_ICO, domain == "")
value[DOMAIN] = kit.Select(ice.CONTEXTS, domain) button := []ice.Any{PORTAL, ADMIN, DESKTOP, XTERM, UPGRADE, cli.RUNTIME, WORD, STATUS, VIMER, OPEN}
// value[mdb.TIME] = value[cli.COMPILE_TIME] if domain == "" {
button = []ice.Any{PORTAL, WORD, STATUS, VIMER, COMPILE, cli.RUNTIME, XTERM, ADMIN, DESKTOP, OPEN}
}
m.PushRecord(value, fields...).PushButton(button...) m.PushRecord(value, fields...).PushButton(button...)
m.Cmd(Space(m, domain), DREAM, ice.Maps{"space.timeout": "3s", "dream.simple": ice.TRUE}).Table(func(value ice.Maps) { button = append(button, cli.STOP)
m.Cmd(Space(m, domain), DREAM).Table(func(value ice.Maps) {
switch value[mdb.TYPE] { switch value[mdb.TYPE] {
case WORKER: case WORKER:
value[DOMAIN] = kit.Select(ice.CONTEXTS, domain) value[DOMAIN] = domain
kit.If(value[mdb.STATUS] == cli.STOP, func() { value[mdb.ICONS] = nfs.USR_ICONS_ICEBERGS })
kit.If(value[mdb.STATUS] == cli.STOP, func() { button = []ice.Any{cli.START, mdb.REMOVE} })
m.PushRecord(value, fields...).PushButton(button...) m.PushRecord(value, fields...).PushButton(button...)
case SERVER: case SERVER:
server = append(server, kit.Keys(domain, value[mdb.NAME])) server = append(server, kit.Keys(domain, value[mdb.NAME]))
@ -30,10 +34,9 @@ func _matrix_list(m *ice.Message, domain string) (server []string) {
}) })
return return
} }
func _matrix_cmd(m *ice.Message, action string, arg ...string) { func _matrix_action(m *ice.Message, action string, arg ...string) {
domain := kit.Keys(kit.Select("", m.Option(DOMAIN), m.Option(DOMAIN) != ice.CONTEXTS), m.Option(mdb.NAME)) switch domain := kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME)); action {
switch action { case PORTAL, ADMIN, DESKTOP, OPEN:
case PORTAL, DESKTOP, ADMIN, OPEN:
if kit.HasPrefixList(arg, ctx.RUN) { if kit.HasPrefixList(arg, ctx.RUN) {
ProcessIframe(m, "", "", arg...) ProcessIframe(m, "", "", arg...)
} else { } else {
@ -51,40 +54,53 @@ func _matrix_cmd(m *ice.Message, action string, arg ...string) {
} }
} }
} }
func _matrix_dream(m *ice.Message, action string, arg ...string) {
m.Cmd(Space(m, m.Option(DOMAIN)), DREAM, kit.Select(m.ActionKey(), action), m.OptionSimple(mdb.NAME), arg)
}
const MATRIX = "matrix" const MATRIX = "matrix"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
MATRIX: {Name: "matrix list", Help: "空间矩阵", Meta: kit.Dict(ice.CTX_TRANS, kit.Dict( MATRIX: {Name: "matrix refresh", Help: "矩阵", Meta: kit.Dict(
WORD, "文档", STATUS, "源码", VIMER, "编程", cli.RUNTIME, "环境", ice.CTX_ICONS, kit.Dict(STATUS, "bi bi-git"),
)), Actions: ice.MergeActions(ice.Actions{ ice.CTX_TRANS, kit.Dict(STATUS, "源码"),
), Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(DREAM, mdb.INPUTS, arg) }},
mdb.CREATE: {Name: "create name*=hi icons repos binary template", Hand: func(m *ice.Message, arg ...string) { m.Cmd(DREAM, mdb.CREATE, arg) }},
mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) { _matrix_dream(m, nfs.TRASH); _matrix_dream(m, "") }},
cli.START: {Hand: func(m *ice.Message, arg ...string) { _matrix_dream(m, "") }},
cli.STOP: {Hand: func(m *ice.Message, arg ...string) { _matrix_dream(m, "") }},
UPGRADE: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(Space(m, kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME))), UPGRADE).Sleep3s()
}},
INSTALL: {Hand: func(m *ice.Message, arg ...string) { INSTALL: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(Space(m, m.Option(DOMAIN)), DREAM, ctx.ACTION, mdb.CREATE, m.OptionSimple(mdb.NAME, mdb.ICONS, nfs.REPOS), nfs.BINARY, UserHost(m)+S(m.Option(mdb.NAME))) m.OptionDefault(nfs.BINARY, UserHost(m)+S(m.Option(mdb.NAME)))
m.Cmd(Space(m, m.Option(DOMAIN)), DREAM, ctx.ACTION, cli.START, m.OptionSimple(mdb.NAME)) _matrix_dream(m, mdb.CREATE, kit.Simple(m.OptionSimple(mdb.ICONS, nfs.REPOS, nfs.BINARY))...)
_matrix_dream(m, cli.START)
}}, }},
}, ctx.ConfAction(mdb.FIELD, "time,domain,status,type,name,text,icons,repos,binary,module,version")), Hand: func(m *ice.Message, arg ...string) { }, ctx.ConfAction(mdb.FIELD, "time,domain,status,type,name,text,icons,repos,binary,module,version")), Hand: func(m *ice.Message, arg ...string) {
if kit.HasPrefixList(arg, ctx.ACTION) { if kit.HasPrefixList(arg, ctx.ACTION) {
_matrix_cmd(m, arg[1], arg[2:]...) _matrix_action(m, arg[1], arg[2:]...)
return return
} }
GoToast(m, "", func(toast func(name string, count, total int)) []string { GoToast(m, "", func(toast func(name string, count, total int)) []string {
kit.For(_matrix_list(m, ""), func(domain string, index int, total int) { fields := kit.Split(mdb.Config(m, mdb.FIELD))
m.Options("space.timeout", "3s", "dream.simple", ice.TRUE)
kit.For(_matrix_list(m, "", fields...), func(domain string, index int, total int) {
toast(domain, index, total) toast(domain, index, total)
_matrix_list(m, domain) _matrix_list(m, domain, fields...)
}) })
return nil stat := map[string]int{}
}).Sort("name,domain", "str_r", "str_r").Display("") m.Table(func(value ice.Maps) { stat[value[mdb.TYPE]]++; stat[value[mdb.STATUS]]++ }).StatusTimeCount(stat)
m.RewriteAppend(func(value, key string, index int) string { m.RewriteAppend(func(value, key string, index int) string {
if key == mdb.ICONS && m.Appendv(DOMAIN)[index] != ice.CONTEXTS { if key == mdb.ICONS && strings.HasPrefix(value, nfs.REQUIRE) && m.Appendv(DOMAIN)[index] != "" {
if strings.HasPrefix(value, "/require/") { value = kit.MergeURL(strings.Split(value, "?")[0], ice.POD, kit.Keys(m.Appendv(DOMAIN)[index], m.Appendv(mdb.NAME)[index]))
value = kit.MergeURL(strings.Split(value, "?")[0], ice.POD, kit.Keys(
m.Appendv(DOMAIN)[index], m.Appendv(mdb.NAME)[index],
))
} }
} return value
return value }).Sort("status,name,domain", []string{cli.START, cli.STOP, ""}, "str_r", "str_r")
}) return nil
}).Action(html.FILTER, mdb.CREATE).Display("")
}}, }},
}) })
} }

View File

@ -1,30 +1,35 @@
Volcanos(chat.ONIMPORT, { Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { var list = {}, domain = {contexts: true} _init: function(can, msg) { var list = {}, domain = {"": true}
msg.Table(function(value) { var name = value.name||ice.CONTEXTS; domain[value.domain] = true, list[name] = list[name]||{}, list[name][value.domain] = value }) msg.Table(function(value) { var name = value.name||"", _domain = value.domain||""; domain[_domain] = true, list[name] = list[name]||{}, list[name][_domain] = value })
var ui = can.page.Append(can, can._output, [{view: [wiki.CONTENT, html.TABLE], list: [{type: html.THEAD, list: [{type: html.TR, list: can.core.Item(domain, function(domain) { can.ui = can.page.Appends(can, can._output, [{view: [wiki.CONTENT, html.TABLE], list: [
var item = list[ice.CONTEXTS][domain] {type: html.THEAD, list: [{type: html.TR, list: can.core.Item(domain, function(domain) {
return {type: html.TH, list: [{view: [html.ITEM], list: [{img: can.misc.Resource(can, item.icons||nfs.USR_ICONS_ICEBERGS)}, return {type: html.TH, list: [can.onimport.item(can, list[""][domain], list)]}
{view: wiki.TITLE, list: [{text: item.domain}, can.onappend.label(can, item, {version: icon.version, time: icon.compile}), can.onappend.buttons(can, item)]}, }) }]},
]}]} {type: html.TBODY, list: can.core.Item(list, function(name, value) { if (!name) { return }
}) }]}, {type: html.TBODY}] }]) return {type: html.TR, list: can.core.Item(domain, function(domain) { var item = value[domain]
can.core.Item(list, function(name, value) { var i = 0; if (name == ice.CONTEXTS) { return } return {type: html.TD, list: [item? can.onimport.item(can, item, list): can.onimport.void(can, name, domain, list)]}
var tr = can.page.Append(can, ui.tbody, [{type: html.TR, list: can.core.Item(domain, function(domain) { i++ })}
var item = value[domain]||{} })},
return {type: html.TD, list: [{view: [[html.ITEM, ] }]), can.onmotion.delay(can, function() { can.Status(mdb.COUNT, can.core.Item(list).length+"x"+can.core.Item(domain).length) })
!list[name][ice.CONTEXTS]? html.NOTICE: list[name][domain] && (can.core.Value(list, can.core.Keys(name, domain, nfs.VERSION)) != can.core.Value(list, can.core.Keys(name, ice.CONTEXTS, nfs.VERSION)) },
|| can.core.Value(list, can.core.Keys(name, domain, mdb.TIME)) < can.core.Value(list, can.core.Keys(name, ice.CONTEXTS, mdb.TIME))) void: function(can, name, domain, list) {
? html.DANGER: ""]], list: item.name? [ return {view: html.ACTION, _init: function(target) { var worker = list[name][""], server = list[""][domain]
{img: can.misc.Resource(can, item.icons||nfs.USR_ICONS_VOLCANOS)}, worker && can.onappend.input(can, {type: html.BUTTON, name: code.INSTALL, onclick: function(event) {
{view: wiki.TITLE, list: [{text: item.name}, can.onappend.label(can, item, {version: icon.version, time: icon.compile, time: icon.compile}), can.onappend.buttons(can, item)]}, can.Update(can.request(event, {name: name, domain: domain, port: server.port}, worker), [ctx.ACTION, code.INSTALL])
]: [ }}, "", target)
{view: html.ACTION, _init: function(target) { var worker = list[name][ice.CONTEXTS], server = list[ice.CONTEXTS][domain] }}
worker && can.onappend.input(can, {type: html.BUTTON, name: code.INSTALL, onclick: function(event) { },
can.Update(can.request(event, {name: name, domain: domain, port: server.port}, worker), [ctx.ACTION, code.INSTALL]) item: function(can, item, list) {
}}, "", target) function cb(action) { return function(event) { can.Update(can.request(event, item), [ctx.ACTION, action]) } }
}}, return {view: [[html.ITEM, item.type, item.status, can.onimport.style(can, item, list)]], list: [
]}]} {img: can.misc.Resource(can, item.icons, item.domain), onclick: cb(web.DESKTOP)}, {view: wiki.TITLE, list: [
}) }])._target {text: item.name||item.domain||location.host, onclick: cb(web.OPEN)},
// ; list[name][ice.CONTEXTS] || can.onappend.style(can, html.NOTICE, tr) item.status != cli.STOP && can.onappend.label(can, item, {version: icon.version, time: icon.compile}),
}), can.onmotion.delay(can, function() { can.Status(mdb.COUNT, can.core.Item(list).length+"x"+can.core.Item(domain).length) }) can.onappend.buttons(can, item),
]},
]}
},
style: function(can, item, list) { var name = item.name||"", domain = item.domain||"", worker = list[name][""]
return !worker? html.NOTICE: (worker.status != cli.STOP && item.status != cli.STOP && (item.version != worker.version || item.time < worker.time))? html.DANGER: ""
}, },
}, [""]) }, [""])

View File

@ -151,7 +151,7 @@ func GoToast(m *ice.Message, title string, cb func(toast func(name string, count
toast(kit.JoinWord(list...), len(list), _total) toast(kit.JoinWord(list...), len(list), _total)
} else { } else {
icon = Icons[ice.SUCCESS] icon = Icons[ice.SUCCESS]
m.Option(ice.TOAST_DURATION, cli.TIME_3s) m.Option(ice.TOAST_DURATION, cli.TIME_1s)
toast(ice.SUCCESS, _total, _total) toast(ice.SUCCESS, _total, _total)
} }
m.Sleep(m.Option(ice.TOAST_DURATION)) m.Sleep(m.Option(ice.TOAST_DURATION))

View File

@ -220,7 +220,7 @@ func _space_send(m *ice.Message, name string, arg ...string) (h string) {
m.WarnNotFound(kit.IndexOf([]string{ice.OPS, ice.DEV}, target[0]) == -1, SPACE, name) m.WarnNotFound(kit.IndexOf([]string{ice.OPS, ice.DEV}, target[0]) == -1, SPACE, name)
}) })
} else if withecho { } else if withecho {
m.Warn(!wait(), "time out") m.Warn(!wait(), kit.Format("space %v %v time out", name, arg))
} }
return return
} }

View File

@ -468,7 +468,7 @@ func SpideCache(m *ice.Message, link string) *ice.Message {
func SpideOrigin(m *ice.Message, name string) string { return m.Cmdv(SPIDE, name, CLIENT_ORIGIN) } func SpideOrigin(m *ice.Message, name string) string { return m.Cmdv(SPIDE, name, CLIENT_ORIGIN) }
func SpideURL(m *ice.Message, name string) string { return m.Cmdv(SPIDE, name, CLIENT_URL) } func SpideURL(m *ice.Message, name string) string { return m.Cmdv(SPIDE, name, CLIENT_URL) }
func ProcessIframe(m *ice.Message, title, link string, arg ...string) *ice.Message { func ProcessIframe(m *ice.Message, title, link string, arg ...string) *ice.Message {
if m.IsMetaKey() || m.IsMobileUA() { if m.IsMetaKey() {
m.ProcessOpen(link) m.ProcessOpen(link)
return m return m
} }

View File

@ -18,7 +18,7 @@ const STORE = "store"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
STORE: {Name: "store refresh", Help: "空间商店", Role: aaa.VOID, Actions: ice.MergeActions(ice.Actions{ STORE: {Name: "store refresh", Help: "商店", Role: aaa.VOID, Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(SPIDE, mdb.INPUTS, arg) }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(SPIDE, mdb.INPUTS, arg) }},
mdb.CREATE: {Name: "create name* origin* icons", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create name* origin* icons", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPIDE, mdb.CREATE, m.OptionSimple("name,origin,icons"), mdb.TYPE, nfs.REPOS) m.Cmd(SPIDE, mdb.CREATE, m.OptionSimple("name,origin,icons"), mdb.TYPE, nfs.REPOS)
@ -73,11 +73,11 @@ func init() {
m.Push("", value, kit.Split("time,name,icons,repos,binary,module,version")) m.Push("", value, kit.Split("time,name,icons,repos,binary,module,version"))
m.Push(mdb.TEXT, value[nfs.REPOS]).Push(ORIGIN, origin) m.Push(mdb.TEXT, value[nfs.REPOS]).Push(ORIGIN, origin)
if _, ok := list[value[mdb.NAME]]; ok || arg[0] == ice.OPS { if _, ok := list[value[mdb.NAME]]; ok || arg[0] == ice.OPS {
m.PushButton(OPEN, PORTAL) m.PushButton(PORTAL, OPEN)
} else if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) { } else if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) {
m.PushButton(PORTAL) m.PushButton(PORTAL)
} else { } else {
m.PushButton(INSTALL, PORTAL) m.PushButton(PORTAL, INSTALL)
} }
}) })
m.StatusTimeCount(ORIGIN, origin) m.StatusTimeCount(ORIGIN, origin)

View File

@ -6,7 +6,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.page.style(can, can._ou
].concat(msg.Table(function(item) { ].concat(msg.Table(function(item) {
return {view: [html.ITEM], list: [{img: can.page.drawText(can, item.name||item.index, 25, 0, 20)}], onclick: function(event) { can.sup.onexport.record(can, item) }} return {view: [html.ITEM], list: [{img: can.page.drawText(can, item.name||item.index, 25, 0, 20)}], onclick: function(event) { can.sup.onexport.record(can, item) }}
}), [ }), [
{view: [[html.MENU, "title"]], list: [{img: can.misc.ResourceFavicon(can)}, {text: can.ConfSpace()||can.misc.Search(can, ice.POD)||location.host}], {view: [[html.MENU, "title"]], list: [{img: can.misc.ResourceFavicon(can)}, {text: decodeURIComponent(can.ConfSpace()||can.misc.Search(can, ice.POD)||location.host)}],
onclick: function(event) { can.sup.onexport.record(can, html.DESKTOP) }}, onclick: function(event) { can.sup.onexport.record(can, html.DESKTOP) }},
{view: [[html.MENU, mdb.ICON, web.REFRESH], "", can.page.unicode.refresh], onclick: function(event) { can.user.reload(true) }}, {view: [[html.MENU, mdb.ICON, web.REFRESH], "", can.page.unicode.refresh], onclick: function(event) { can.user.reload(true) }},
{view: [[html.MENU, mdb.ICON, mdb.CREATE], "", can.page.unicode.create], onclick: function(event) { can.sup.onexport.record(can, mdb.CREATE) }}, {view: [[html.MENU, mdb.ICON, mdb.CREATE], "", can.page.unicode.create], onclick: function(event) { can.sup.onexport.record(can, mdb.CREATE) }},

View File

@ -42,13 +42,9 @@ func init() {
m.Option(ice.EXIT, ice.TRUE) m.Option(ice.EXIT, ice.TRUE)
} }
uri := "/publish/" + kit.Format(value[nfs.FILE]) uri := "/publish/" + kit.Format(value[nfs.FILE])
m.Debug("what %v", uri)
m.Debug("what %v", ice.Info.Make.Domain)
kit.If(m.Spawn().Options(ice.MSG_USERPOD, "").ParseLink(ice.Info.Make.Domain).Option(ice.MSG_USERPOD), func(p string) { kit.If(m.Spawn().Options(ice.MSG_USERPOD, "").ParseLink(ice.Info.Make.Domain).Option(ice.MSG_USERPOD), func(p string) {
m.Debug("what %v", p)
uri = kit.MergeURL(uri, ice.POD, p) uri = kit.MergeURL(uri, ice.POD, p)
}) })
m.Debug("what %v", uri)
dir := path.Join(kit.Format(value[nfs.PATH]), kit.Format(value[nfs.FILE])) dir := path.Join(kit.Format(value[nfs.PATH]), kit.Format(value[nfs.FILE]))
web.GoToast(m, web.DOWNLOAD, func(toast func(name string, count, total int)) []string { web.GoToast(m, web.DOWNLOAD, func(toast func(name string, count, total int)) []string {
switch web.SpideSave(m, dir, uri, func(count, total, value int) { switch web.SpideSave(m, dir, uri, func(count, total, value int) {
@ -65,8 +61,7 @@ func init() {
m.Cmdy(nfs.DIR, dir, "time,size,path,hash").Push(web.ORIGIN, kit.MergeURL2(web.SpideOrigin(m, ice.DEV_IP), uri)) m.Cmdy(nfs.DIR, dir, "time,size,path,hash").Push(web.ORIGIN, kit.MergeURL2(web.SpideOrigin(m, ice.DEV_IP), uri))
}) })
if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE { if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE {
web.Toast(m, cli.RESTART) web.Toast(m, cli.RESTART).Cmd("", cli.RESTART)
m.Cmd("", cli.RESTART)
} }
}}, }},
}}) }})

View File

@ -31,6 +31,9 @@ func Render(m *Message, cmd string, args ...Any) string {
case []string: case []string:
kit.For(k, func(k string) { list = append(list, Render(m, RENDER_BUTTON, k)) }) kit.For(k, func(k string) { list = append(list, Render(m, RENDER_BUTTON, k)) })
case string: case string:
if k == "" {
break
}
if strings.HasPrefix(k, "<input") { if strings.HasPrefix(k, "<input") {
list = append(list, k) list = append(list, k)
break break