diff --git a/base/web/admin.go b/base/web/admin.go index bd127977..1186ce24 100644 --- a/base/web/admin.go +++ b/base/web/admin.go @@ -24,11 +24,14 @@ func init() { DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) { m.PushButton(kit.Dict(ADMIN, "后台")) }}, DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { if kit.HasPrefixList(arg, ctx.ACTION, ADMIN) && len(arg) == 2 { + link := m.MergePodCmd(m.Option(mdb.NAME), "") if m.Option(mdb.TYPE) == MASTER { - ctx.ProcessField(m, CHAT_IFRAME, SpideOrigin(m, m.Option(mdb.NAME))+C(m.PrefixKey()), arg...) - m.ProcessField(ctx.ACTION, ctx.RUN, CHAT_IFRAME) + link = SpideOrigin(m, m.Option(mdb.NAME)) + C(m.PrefixKey()) + } + if m.IsMetaKey() { + m.ProcessOpen(link) } else { - ctx.ProcessField(m, CHAT_IFRAME, m.MergePodCmd(m.Option(mdb.NAME), ""), arg...) + ctx.ProcessFloat(m, CHAT_IFRAME, link, arg...) m.ProcessField(ctx.ACTION, ctx.RUN, CHAT_IFRAME) } } diff --git a/base/web/dream.go b/base/web/dream.go index 2d8ac98f..cf91f44f 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -428,10 +428,8 @@ func init() { kit.If(stat[cli.START] == stat[WORKER], func() { delete(stat, cli.START) }) m.Sort("type,status,name", []string{aaa.LOGIN, WORKER, SERVER, MASTER}, []string{cli.START, cli.STOP, cli.BEGIN}, ice.STR_R).StatusTimeCount(stat) ctx.DisplayTableCard(m) - if ice.Info.NodeType == WORKER { - return - } - if m.IsCliUA() { + if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) || m.IsCliUA() { + m.Action() return } kit.If(cli.SystemFind(m, "go"), func() { @@ -455,7 +453,7 @@ func DreamAction() ice.Actions { } func DreamProcess(m *ice.Message, args ice.Any, arg ...string) { if kit.HasPrefixList(arg, ctx.RUN) { - ctx.ProcessField(m, m.PrefixKey(), args, kit.Slice(arg, 1)...) + ctx.ProcessFloat(m, m.PrefixKey(), args, kit.Slice(arg, 1)...) } else if kit.HasPrefixList(arg, ctx.ACTION, m.PrefixKey()) || kit.HasPrefixList(arg, ctx.ACTION, m.CommandKey()) { if m.Option(mdb.TYPE) == MASTER && (kit.IsIn(ctx.ShortCmd(m.PrefixKey()), PORTAL, DESKTOP)) { if ProcessIframe(m, "", SpideOrigin(m, m.Option(mdb.NAME))+C(m.PrefixKey()), arg...); !m.IsMetaKey() { diff --git a/base/web/store.go b/base/web/store.go index 169c7165..30f1d61f 100644 --- a/base/web/store.go +++ b/base/web/store.go @@ -19,13 +19,13 @@ const STORE = "store" func init() { Index.MergeCommands(ice.Commands{ 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) - // m.Cmds(SPIDE).Table(func(value ice.Maps) { kit.If(value[CLIENT_TYPE] == nfs.REPOS, func() { m.Push("", value, arg[0]) }) }) - }}, + 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) { m.Cmd(SPIDE, mdb.CREATE, m.OptionSimple("name,origin,icons"), mdb.TYPE, nfs.REPOS) }}, + mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) { + m.Cmd(SPIDE, mdb.REMOVE, CLIENT_NAME, m.Option(mdb.NAME)) + }}, INSTALL: {Hand: func(m *ice.Message, arg ...string) { if !kit.HasPrefixList(arg, ctx.RUN) { if strings.HasPrefix(m.Option(mdb.ICON), nfs.REQUIRE) { @@ -43,17 +43,26 @@ func init() { PORTAL: {Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) { ProcessIframe(m, m.Option(mdb.NAME), m.Option(ORIGIN)+S(m.Option(mdb.NAME))+C(PORTAL), arg...) }}, - }, ctx.ConfAction(CLIENT_TIMEOUT, "3s")), Hand: func(m *ice.Message, arg ...string) { - m.Display("") - if len(arg) == 0 { + }, ctx.ConfAction(CLIENT_TIMEOUT, "3s"), DREAM), Hand: func(m *ice.Message, arg ...string) { + if kit.HasPrefixList(arg, ctx.ACTION) { + m.Cmdy(DREAM, arg) + return + } + if m.Display(""); len(arg) == 0 { m.Cmd(SPIDE, arg, kit.Dict(ice.MSG_FIELDS, "time,icons,client.type,client.name,client.origin")).Table(func(value ice.Maps) { kit.If(value[CLIENT_TYPE] == nfs.REPOS, func() { m.Push(mdb.NAME, value[CLIENT_NAME]).Push(mdb.ICONS, value[mdb.ICONS]) }) }) - if ice.Info.NodeType == WORKER { + if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) { + m.Action() + } else { + m.Action(html.FILTER, mdb.CREATE) + m.PushAction(mdb.REMOVE) + } + } else { + if arg[0] == ice.OPS && ice.Info.NodeType == SERVER { + m.Cmdy(DREAM) return } - m.Action(html.FILTER, mdb.CREATE) - } else { defer ToastProcess(m, "查询中,请稍候")("查询成功") origin := SpideOrigin(m, arg[0]) kit.If(arg[0] == ice.OPS, func() { origin = tcp.PublishLocalhost(m, origin) }) @@ -64,10 +73,10 @@ func init() { } m.Push("", value, kit.Split("time,name,icon,repos,binary,module,version")) m.Push(mdb.TEXT, value[nfs.REPOS]).Push(ORIGIN, origin) - if ice.Info.NodeType == WORKER { - m.PushButton(PORTAL) - } else if _, ok := list[value[mdb.NAME]]; ok { + if _, ok := list[value[mdb.NAME]]; ok || arg[0] == ice.OPS { m.PushButton(OPEN, PORTAL) + } else if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) { + m.PushButton(PORTAL) } else { m.PushButton(INSTALL, PORTAL) } diff --git a/base/web/store.js b/base/web/store.js index 5fc1c63f..1830bb26 100644 --- a/base/web/store.js +++ b/base/web/store.js @@ -1,13 +1,13 @@ Volcanos(chat.ONIMPORT, { _init: function(can, msg) { can.ui = can.onappend.layout(can), can.onimport.__project(can, msg) }, - __project: function(can, msg) { var select, current = can.sup.db._zone||can.db.hash[0]||ice.DEV + __project: function(can, msg) { var select, current = can.sup.db._zone||can.db.hash[0]||(can.user.info.nodetype == web.WORKER? ice.OPS: ice.DEV) msg.Table(function(value) { var _target = can.onimport.item(can, value, function(event) { can.isCmdMode()? can.misc.SearchHash(can, value.name): can.sup.db._zone = value.name if (can.onmotion.cache(can, function() { return value.name }, can.ui.content, can._status)) { return can.onimport.layout(can) } can.run(can.request(event, {_toast: ice.PROCESS}), [value.name], function(msg) { can.onimport.__content(can, msg), can.onappend._status(can, msg), can.onimport.layout(can) }) - }, function() {}, can.ui.project); select = (value.name == current? _target: select)||_target + }, null, can.ui.project); select = (value.name == current? _target: select)||_target }), select && select.click(), can.onmotion.orderShow(can, can.ui.project) can.onappend.style(can, "output card", can.ui.content), can.onmotion.delay(can, function() { can.onimport.layout(can) }) }, __content: function(can, msg) { can.onimport.card(can, msg) }, diff --git a/core/chat/header.go b/core/chat/header.go index f6d462a6..8c6b78d2 100644 --- a/core/chat/header.go +++ b/core/chat/header.go @@ -101,8 +101,8 @@ func init() { }}, aaa.LOGOUT: {Hand: aaa.SessLogout}, cli.QRCODE: {Hand: func(m *ice.Message, arg ...string) { - m.Push(web.LINK, tcp.PublishLocalhost(m, m.Option(ice.MSG_USERWEB))) - m.EchoQRCode(tcp.PublishLocalhost(m, m.Option(ice.MSG_USERWEB))) + link := tcp.PublishLocalhost(m, m.Option(ice.MSG_USERWEB)) + m.Push(mdb.NAME, link).PushQRCode(mdb.TEXT, link) }}, mdb.CREATE: {Name: "create type*=plugin,qrcode,oauth name* icons link order space index args", Hand: func(m *ice.Message, arg ...string) { mdb.HashCreate(m, m.OptionSimple()) }}, mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) { mdb.HashRemove(m, m.OptionSimple(mdb.NAME)) }}, @@ -122,7 +122,9 @@ func init() { if ice.Info.NodeType == web.WORKER { return } - kit.If(m.Option(ice.MSG_USERPOD), func(p string) { m.Option(ice.MSG_NODETYPE, m.Cmdx(web.SPACE, p, cli.RUNTIME, ice.MSG_NODETYPE)) }) + kit.If(m.Option(ice.MSG_USERPOD), func(p string) { + m.Option(ice.MSG_NODETYPE, m.Cmdx(web.SPACE, p, cli.RUNTIME, ice.MSG_NODETYPE)) + }) m.Option("language.list", m.Cmd(nfs.DIR, nfs.TemplatePath(m, aaa.LANGUAGE)+nfs.PS, nfs.FILE).Appendv(nfs.FILE)) m.Option("theme.list", m.Cmd(nfs.DIR, nfs.TemplatePath(m, aaa.THEME)+nfs.PS, nfs.FILE).Appendv(nfs.FILE)) m.Option(nfs.REPOS, m.Cmdv(web.SPIDE, nfs.REPOS, web.CLIENT_URL)) diff --git a/core/code/publish.go b/core/code/publish.go index 231c21ca..2e52fc42 100644 --- a/core/code/publish.go +++ b/core/code/publish.go @@ -52,7 +52,7 @@ func _publish_contexts(m *ice.Message, arg ...string) { m.OptionDefault(web.DOMAIN, host) m.Options(cli.CTX_ENV, kit.Select("", lex.SP+kit.JoinKV(mdb.EQ, lex.SP, cli.CTX_POD, m.Option(ice.MSG_USERPOD)), m.Option(ice.MSG_USERPOD) != "")) kit.If(m.Option("ctx_dev_ip"), func(p string) { - m.Option(cli.CTX_ENV, m.Option(cli.CTX_DEV)+" "+"ctx_dev_ip="+tcp.PublishLocalhost(m, p)) + m.Option(cli.CTX_ENV, m.Option(cli.CTX_ENV)+" "+"ctx_dev_ip="+tcp.PublishLocalhost(m, p)) }) m.Option(ice.TCP_DOMAIN, kit.ParseURL(host).Hostname()) switch k { diff --git a/info.go b/info.go index 8b7d1cd8..708da345 100644 --- a/info.go +++ b/info.go @@ -164,18 +164,24 @@ func MergeActions(arg ...Any) Actions { }) for k, v := range cmd.Actions { func(k string) { - if h, ok := list[k]; !ok { + h, ok := list[k] + if !ok { list[k] = &Action{Name: v.Name, Help: v.Help, Icon: v.Icon, Hand: func(m *Message, arg ...string) { m.Cmdy(from, k, arg) }} } else if h.Hand == nil { h.Hand = func(m *Message, arg ...string) { m.Cmdy(from, k, arg) } } - kit.Value(_cmd.Meta, kit.Keys(CTX_ICONS, k), v.Icon) - if help := kit.Split(v.Help, " ::"); len(help) > 0 { - if kit.Value(_cmd.Meta, kit.Keys(CTX_TRANS, strings.TrimPrefix(k, "_")), help[0]); len(help) > 1 { - kit.Value(_cmd.Meta, kit.Keys(CTX_TITLE, k), help[1]) + if !ok || h.Icon == "" { + kit.Value(_cmd.Meta, kit.Keys(CTX_ICONS, k), v.Icon) + } + if !ok || h.Help == "" { + if help := kit.Split(v.Help, " ::"); len(help) > 0 { + if kit.Value(_cmd.Meta, kit.Keys(CTX_TRANS, strings.TrimPrefix(k, "_")), help[0]); len(help) > 1 { + kit.Value(_cmd.Meta, kit.Keys(CTX_TITLE, k), help[1]) + } } } - kit.If(len(v.List) > 0, func() { _cmd.Meta[k] = v.List }) + + kit.If((!ok || len(h.List) == 0) && len(v.List) > 0, func() { _cmd.Meta[k] = v.List }) }(k) } }) diff --git a/option.go b/option.go index 03403bd3..1db1ef02 100644 --- a/option.go +++ b/option.go @@ -138,4 +138,8 @@ func (m *Message) ProcessOpen(url string) *Message { kit.If(url, func() { m.Process(PROCESS_OPEN, url) }) return m } +func (m *Message) ProcessOpenAndRefresh(url string) *Message { + kit.If(url, func() { m.Process(PROCESS_OPEN, url, "refresh") }) + return m +} func (m *Message) ProcessClose() *Message { return m.Process(PROCESS_CLOSE) }