1
0
forked from x/icebergs

add web.group

This commit is contained in:
IT 老营长 @云轩领航-创始人 2024-02-27 00:58:58 +08:00
parent 6d13a280cd
commit b31c63989f
13 changed files with 132 additions and 65 deletions

View File

@ -14,17 +14,26 @@ import (
kit "shylinux.com/x/toolkits"
)
func _matrix_list(m *ice.Message, domain, icon string, fields ...string) (server, icons []string) {
func _matrix_list(m *ice.Message, domain, icon, typ string, fields ...string) (server, icons, types []string) {
value := kit.Dict(cli.ParseMake(m.Cmdx(Space(m, domain), cli.RUNTIME)))
value[DOMAIN], value[mdb.TYPE], value[mdb.ICONS] = domain, SERVER, icon
button := []ice.Any{PORTAL, DESKTOP, ADMIN, OPEN, UPGRADE, cli.RUNTIME, DREAM, WORD, STATUS, VIMER, XTERM}
if domain == "" {
button = []ice.Any{PORTAL, WORD, STATUS, VIMER, COMPILE, cli.RUNTIME, XTERM, DESKTOP, DREAM, ADMIN, OPEN}
value[DOMAIN], value[mdb.ICONS], value[mdb.TYPE] = domain, icon, typ
button := []ice.Any{}
switch typ {
case MYSELF:
button = []ice.Any{PORTAL, WORD, STATUS, VIMER, COMPILE, cli.RUNTIME, DREAM, XTERM, DESKTOP, ADMIN, OPEN}
case SERVER:
button = []ice.Any{PORTAL, DESKTOP, ADMIN, OPEN, UPGRADE, cli.RUNTIME, DREAM, WORD, STATUS, VIMER, XTERM}
default:
button = []ice.Any{PORTAL, DESKTOP, ADMIN, OPEN, XTERM, cli.RUNTIME, DREAM, WORD, STATUS, VIMER}
}
m.PushRecord(value, fields...).PushButton(button...)
button = []ice.Any{PORTAL, DESKTOP, ADMIN, OPEN, UPGRADE, cli.RUNTIME, WORD, STATUS, VIMER, XTERM}
if domain == "" {
switch typ {
case MYSELF:
button = []ice.Any{PORTAL, WORD, STATUS, VIMER, COMPILE, cli.RUNTIME, XTERM, DESKTOP, ADMIN, OPEN}
case SERVER:
button = []ice.Any{PORTAL, DESKTOP, ADMIN, OPEN, UPGRADE, cli.RUNTIME, WORD, STATUS, VIMER, XTERM}
default:
button = []ice.Any{PORTAL, DESKTOP, ADMIN, OPEN, XTERM, cli.RUNTIME, WORD, STATUS, VIMER}
}
button = append(button, cli.STOP)
m.Cmd(Space(m, domain), DREAM).Table(func(value ice.Maps) {
@ -37,6 +46,7 @@ func _matrix_list(m *ice.Message, domain, icon string, fields ...string) (server
case SERVER, MASTER:
server = append(server, kit.Keys(domain, value[mdb.NAME]))
icons = append(icons, value[mdb.ICONS])
types = append(types, value[mdb.TYPE])
}
})
return
@ -47,11 +57,24 @@ func _matrix_action(m *ice.Message, action string, arg ...string) {
if kit.HasPrefixList(arg, ctx.RUN) {
ProcessIframe(m, "", "", arg...)
} else {
title, link := kit.Keys(domain, kit.Select("", action, action != OPEN)), kit.Select("", S(domain), domain != "")+kit.Select("", C(action), action != OPEN)
ProcessIframe(m, kit.Select(ice.CONTEXTS, title), kit.Select(nfs.PS, link), arg...).ProcessField(ctx.ACTION, action, ctx.RUN)
title, link := kit.Keys(domain, action), kit.Select("", S(domain), domain != "")+C(action)
if m.Option(mdb.TYPE) == MASTER {
link = kit.MergeURL2(SpideOrigin(m, m.Option(DOMAIN)), C(action))
if kit.IsIn(action, ADMIN) {
m.ProcessOpen(link)
break
}
}
ProcessIframe(m, title, kit.Select(nfs.PS, link), arg...).ProcessField(ctx.ACTION, action, ctx.RUN)
}
case OPEN:
m.ProcessOpen(kit.Select(nfs.PS, S(domain), domain != ""))
link := kit.Select(nfs.PS, S(domain), domain != "")
if m.Option(mdb.TYPE) == MASTER {
link = SpideOrigin(m, m.Option(DOMAIN))
} else if m.Option("server.type") == MASTER {
link = kit.MergeURL2(SpideOrigin(m, m.Option(DOMAIN)), S(m.Option(mdb.NAME)))
}
m.ProcessOpen(link)
default:
if !kit.HasPrefixList(arg, ctx.RUN) {
kit.If(action == XTERM, func() { arg = []string{cli.SH} })
@ -71,8 +94,10 @@ const MATRIX = "matrix"
func init() {
Index.MergeCommands(ice.Commands{
MATRIX: {Name: "matrix refresh", Help: "矩阵", Meta: kit.Dict(
ice.CTX_ICONS, kit.Dict(STATUS, "bi bi-git"), ice.CTX_TRANS, kit.Dict(STATUS, "源码"),
MATRIX: {Name: "matrix refresh", Help: "矩阵", Icon: "Mission Control.png", Meta: kit.Dict(
ice.CTX_ICONS, kit.Dict(STATUS, "bi bi-git"), ice.CTX_TRANS, kit.Dict(
STATUS, "源码", html.INPUT, kit.Dict(MYSELF, "本机", MASTER, "主机"),
),
), 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) }},
@ -82,7 +107,7 @@ func init() {
COMPILE: {Hand: func(m *ice.Message, arg ...string) {
_matrix_cmd(m, "", cli.AMD64, cli.LINUX, ice.SRC_MAIN_GO).ProcessHold()
}},
UPGRADE: {Hand: func(m *ice.Message, arg ...string) { _matrix_cmd(m, "").ProcessRefresh().Sleep3s() }},
UPGRADE: {Hand: func(m *ice.Message, arg ...string) { _matrix_cmd(m, "").Sleep3s().ProcessRefresh() }},
INSTALL: {Hand: func(m *ice.Message, arg ...string) {
if kit.IsIn(m.Cmdv(Space(m, m.Option(DOMAIN)), SPIDE, ice.DEV_IP, CLIENT_HOSTNAME), m.Cmd(tcp.HOST).Appendv(aaa.IP)...) {
m.Option(nfs.BINARY, S(m.Option(mdb.NAME)))
@ -98,11 +123,11 @@ func init() {
}
GoToast(m, func(toast func(name string, count, total int)) []string {
field := kit.Split(mdb.Config(m, mdb.FIELD))
m.Options("space.timeout", cli.TIME_300ms, "dream.simple", ice.TRUE)
list, icons := _matrix_list(m, "", ice.SRC_MAIN_ICO, field...)
m.Options("space.timeout", cli.TIME_1s, "dream.simple", ice.TRUE)
list, icons, types := _matrix_list(m, "", ice.SRC_MAIN_ICO, MYSELF, field...)
kit.For(list, func(domain string, index int, total int) {
toast(domain, index, total)
_matrix_list(m, domain, icons[index], field...)
_matrix_list(m, domain, icons[index], types[index], field...)
})
m.RewriteAppend(func(value, key string, index int) string {
if key == mdb.ICONS && strings.HasPrefix(value, nfs.REQUIRE) && m.Appendv(DOMAIN)[index] != "" {
@ -110,10 +135,10 @@ func init() {
}
return value
})
m.Sort("type,status,name,domain", []string{MASTER, SERVER, WORKER, ""}, []string{cli.START, cli.STOP, ""}, "str_r", "str")
m.StatusTimeCountStats(mdb.TYPE, mdb.STATUS)
m.Action(html.FILTER, mdb.CREATE).StatusTimeCountStats(mdb.TYPE, mdb.STATUS).Display("")
m.Sort("type,status,name,domain", []string{WORKER, MYSELF, SERVER, MASTER, ""}, []string{cli.START, cli.STOP, ""}, "str_r", "str_r")
return nil
}).Action(html.FILTER, mdb.CREATE).Display("")
})
ctx.Toolkit(m)
}},
})

View File

@ -1,9 +1,7 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { var list = {}, domain = [""]
msg.Table(function(value) {
var name = value.name, _domain = value.domain
domain.indexOf(_domain) == -1 && (domain.push(_domain))
list[name] = list[name]||{}, list[name][_domain] = value
msg.Table(function(value) { var name = value.name, _domain = value.domain
list[name] = list[name]||{}, list[name][_domain] = value, domain.indexOf(_domain) == -1 && domain.push(_domain)
})
can.ui = can.page.Appends(can, can._output, [{view: [wiki.CONTENT, html.TABLE], list: [
{type: html.THEAD, list: [{type: html.TR, list: can.core.List(domain, function(domain) {
@ -16,24 +14,25 @@ Volcanos(chat.ONIMPORT, {
})},
] }]), can.onmotion.delay(can, function() { can.Status(mdb.COUNT, can.core.Item(list).length+"x"+can.core.List(domain).length) })
},
void: function(can, name, domain, list) {
return {view: html.ACTION, _init: function(target) { var worker = list[name][""], server = list[""][domain]
void: function(can, name, domain, list) { var worker = list[name][""], server = list[""][domain]
return {view: html.ACTION, _init: function(target) {
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])
can.Update(can.request(event, {name: name, domain: domain}, worker), [ctx.ACTION, code.INSTALL])
}}, "", target)
}}
},
item: function(can, item, list) {
item: function(can, item, list) { var name = item.name, domain = item.domain, worker = list[name][""], server = list[""][domain]
item["server.type"] = server.type
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: [
{img: can.misc.Resource(can, item.icons, can.core.Keys(item.domain, item.name)), onclick: cb(web.DESKTOP)}, {view: wiki.TITLE, list: [
{text: item.name||item.domain||location.host, onclick: cb(web.OPEN)},
item.status != cli.STOP && can.onappend.label(can, item, {version: icon.version, time: icon.compile}),
can.onappend.buttons(can, item),
]},
]}
},
style: function(can, item, list) { var name = item.name||"", domain = item.domain||"", worker = list[name][""]
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

@ -158,6 +158,7 @@ const (
XTERM = "xterm"
GRANT = "grant"
DESKTOP = "desktop"
MESSAGE = "message"
AUTOGEN = "autogen"
BINPACK = "binpack"

View File

@ -185,6 +185,7 @@ func _space_exec(m *ice.Message, name string, source, target []string, c *websoc
kit.If(m.Option(ice.MSG_DAEMON), func(p string) {
m.Option(ice.MSG_DAEMON, kit.Keys(kit.Slice(kit.Reverse(kit.Simple(source)), 0, -1), p))
})
m.Option(ice.FROM_SPACE, kit.Keys(kit.Reverse(source[1:])))
kit.If(aaa.Right(m, m.Detailv()), func() { m.TryCatch(true, func(_ *ice.Message) { m = m.Cmd() }) })
kit.If(m.Optionv(ice.MSG_ARGS) != nil, func() { m.Options(ice.MSG_ARGS, kit.Simple(m.Optionv(ice.MSG_ARGS))) })
}
@ -246,6 +247,7 @@ const (
PORTAL = "portal"
WORKER = "worker"
SERVER = "server"
MYSELF = "myself"
MASTER = "master"
REDIAL = "redial"
@ -398,8 +400,8 @@ func init() {
m.SetAppend()
case tcp.WIFI:
m.Cmdy(tcp.WIFI).CutTo(tcp.SSID, arg[0])
case "message":
m.Cmdy("web.chat.message").Cut(mdb.HASH, mdb.NAME, mdb.ICONS)
case MESSAGE:
m.Cmdy(MESSAGE).Cut(mdb.HASH, mdb.ZONE, mdb.ICONS)
}
})
ice.Info.AdminCmd = AdminCmd

View File

@ -62,7 +62,7 @@ func ToastSuccess(m *ice.Message, arg ...ice.Any) {
Toast(m, toastContent(m, ice.SUCCESS, arg...), "", cli.TIME_3s)
}
func ToastFailure(m *ice.Message, arg ...ice.Any) {
Toast(m, toastContent(m, ice.FAILURE, arg...), "", m.OptionDefault(ice.TOAST_DURATION, "-1")).Sleep(m.OptionDefault(ice.TOAST_DURATION, cli.TIME_3s))
Toast(m, toastContent(m, ice.FAILURE, arg...), "", m.Option(ice.TOAST_DURATION, "-1")).Sleep(cli.TIME_3s)
}
func ToastProcess(m *ice.Message, arg ...ice.Any) func(...ice.Any) {
text := toastContent(m, ice.PROCESS, arg...)

View File

@ -244,6 +244,7 @@ const ( // MSG
MSG_NODETYPE = "node.type"
FROM_DAEMON = "from.daemon"
FROM_SPACE = "from.space"
TABLE_CHECKBOX = "table.checkbox"
TOAST_DURATION = "toast.duration"
)

View File

@ -10,6 +10,12 @@ const CHAT = "chat"
var Index = &ice.Context{Name: CHAT, Help: "聊天中心"}
func init() { web.Index.Register(Index, &web.Frame{}, HEADER, IFRAME, FAVOR) }
func init() {
web.Index.Register(Index, &web.Frame{},
HEADER, FOOTER,
IFRAME, FAVOR,
MESSAGE,
)
}
func Prefix(arg ...string) string { return web.Prefix(CHAT, kit.Keys(arg)) }

33
core/chat/group.go Normal file
View File

@ -0,0 +1,33 @@
package chat
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
const GROUP = "group"
func init() {
Index.MergeCommands(ice.Commands{
GROUP: {Help: "群组", Icon: "Contacts.png", Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case mdb.NAME:
m.AdminCmd(web.MATRIX).Table(func(value ice.Maps) {
m.Push(arg[0], kit.Keys(kit.Select("", ice.OPS, ice.Info.NodeType == web.WORKER), value[web.DOMAIN], value[mdb.NAME]))
m.Push(mdb.TYPE, value[mdb.TYPE])
})
}
}},
mdb.CREATE: {Name: "create type*=worker,server,master, name*"},
tcp.SEND: {Name: "send text=hi", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(web.SPACE, m.Option(mdb.NAME), Prefix(MESSAGE), tcp.RECV, mdb.TEXT, m.Option(mdb.TEXT))
}},
}, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,type*,name*")), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...).PushAction(tcp.SEND, mdb.REMOVE)
}},
})
}

View File

@ -95,10 +95,9 @@ func init() {
}},
MESSAGE: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.INPUTS || arg[0] == mdb.ACTION && arg[1] == mdb.INPUTS {
m.Cmdy(MESSAGE, arg)
m.Cmdy(web.Space(m, m.Option(ice.POD)), MESSAGE, arg)
} else {
m.Cmdy(MESSAGE, mdb.INSERT, arg)
web.ToastSuccess(m)
m.Cmdy(web.Space(m, m.Option(ice.POD)), MESSAGE, mdb.INSERT, arg).ToastSuccess()
}
}},
aaa.LOGOUT: {Hand: aaa.SessLogout},

View File

@ -74,10 +74,10 @@ fieldset.macos.dock>div.output>div.space { background-color:#ececec36; margin:va
fieldset.macos.dock>div.output>div.item { text-align:center; align-self:baseline; transition:margin-top 0.3s; }
fieldset.macos.dock>div.output>div.item img { object-fit:contain; min-height:var(--desktop-icon-size); width:var(--desktop-icon-size); transition:width 0.3s; }
fieldset.macos.dock>div.output>div.item>div.name { display:none; }
fieldset.macos.finder>div.output div.content>div.item { text-align:center; float:left; }
fieldset.macos.finder>div.output div.content>div.item { text-align:center; float:left; width:var(--desktop-icon-size); }
fieldset.macos.finder>div.output div.content>div.item img { object-fit:contain; width:var(--desktop-icon-size); }
fieldset.macos.finder>div.output div.content>div.item img { object-fit:contain; width:var(--desktop-icon-size); height:var(--desktop-icon-size); }
fieldset.macos.finder>div.output div.content>div.item div.name { font-size:var(--code-font-size); text-align:center; }
fieldset.macos.finder>div.output div.content>div.item div.name { font-size:var(--code-font-size); white-space:pre; text-align:center; overflow:hidden; }
body.dark fieldset.macos.desktop>div.output>fieldset.macos { background-color:#08234ad1; }
body.dark fieldset.macos.desktop>div.output>div.desktop fieldset table.content tbody tr:nth-child(odd):not(:hover) { background-color:#282B2F; }
body.dark fieldset.macos.desktop>div.output>div.desktop fieldset table.content tbody tr:nth-child(even):not(:hover) { background-color:#1a1d1e; }

View File

@ -6,6 +6,7 @@ import (
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
@ -20,17 +21,18 @@ func init() {
messageCreate(m, cli.SYSTEM, "usr/icons/System Settings.png")
messageInsert(m, cli.SYSTEM, mdb.TYPE, "plug", ctx.INDEX, cli.RUNTIME)
}},
mdb.CREATE: {Name: "create type*=tech,void name* icons*"},
mdb.CREATE: {Name: "create type*=tech,void zone* icons*"},
mdb.INSERT: {Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneInsert(m, append(arg, aaa.AVATAR, aaa.UserInfo(m, "", aaa.AVATAR, aaa.AVATAR),
aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME),
))
mdb.ZoneInsert(m, append(arg, aaa.AVATAR, aaa.UserInfo(m, "", aaa.AVATAR, aaa.AVATAR), aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME)))
}},
tcp.RECV: {Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneInsert(m, kit.Simple(mdb.ZONE, m.Option(ice.FROM_SPACE), arg, aaa.AVATAR, aaa.UserInfo(m, "", aaa.AVATAR, aaa.AVATAR), aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME)))
}},
web.DREAM_CREATE: {Hand: func(m *ice.Message, arg ...string) {
messageInsert(m, web.DREAM, mdb.TYPE, "plug", ctx.INDEX, IFRAME, ctx.ARGS, web.S(m.Option(mdb.NAME)))
}},
}, web.DreamAction(), mdb.ZoneAction(
mdb.SHORT, mdb.UNIQ, mdb.FIELD, "time,hash,type,name,icons", mdb.FIELDS, "time,id,avatar,usernick,username,type,name,text,space,index,args",
mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,hash,type,zone,icons", mdb.FIELDS, "time,id,avatar,usernick,username,type,name,text,space,index,args",
)), Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 {
mdb.ZoneSelect(m.Display("").Spawn(), arg...).Table(func(value ice.Maps) {
@ -44,9 +46,9 @@ func init() {
}},
})
}
func messageCreate(m *ice.Message, name, icon string) {
kit.Value(m.Target().Configs[m.CommandKey()].Value, kit.Keys(mdb.HASH, name, mdb.META), kit.Dict(
mdb.TIME, m.Time(), mdb.TYPE, aaa.TECH, mdb.NAME, name, mdb.ICONS, icon,
func messageCreate(m *ice.Message, zone, icons string) {
kit.Value(m.Target().Configs[m.CommandKey()].Value, kit.Keys(mdb.HASH, zone, mdb.META), kit.Dict(
mdb.TIME, m.Time(), mdb.TYPE, aaa.TECH, mdb.ZONE, zone, mdb.ICONS, icons,
))
}
func messageInsert(m *ice.Message, zone string, arg ...string) {

View File

@ -1,6 +1,6 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
if (can.isCmdMode()) { can.onappend.style(can, html.OUTPUT) }
// if (can.isCmdMode()) { can.onappend.style(can, html.OUTPUT) }
can.ui = can.onappend.layout(can), can.onimport._project(can, msg)
},
_project: function(can, msg) { var select, current = can.db.hash[0]||ice.DEV
@ -12,27 +12,27 @@ Volcanos(chat.ONIMPORT, {
msg.Table(function(value) {
var _target = can.page.Append(can, can.ui.project, [{view: html.ITEM, list: [
{img: can.misc.Resource(can, value.icons||"usr/icons/Messages.png")}, {view: html.CONTAINER, list: [
{view: wiki.TITLE, list: [{text: value.name||"[未命名]"}, {text: [can.base.TimeTrim(value.time), "", mdb.TIME]}]},
{view: wiki.TITLE, list: [{text: value.zone||"[未命名]"}, {text: [can.base.TimeTrim(value.time), "", mdb.TIME]}]},
{view: wiki.CONTENT, list: [{text: value.text||"[未知消息]"}]},
]},
], onclick: function(event) { can.isCmdMode() && can.misc.SearchHash(can, value.name), can.onimport._switch(can, false)
], onclick: function(event) { can.isCmdMode() && can.misc.SearchHash(can, value.zone), can.onimport._switch(can, false)
can.db.zone = value, can.db.hash = value.hash, can.onmotion.select(can, can.ui.project, html.DIV_ITEM, _target)
if (can.onmotion.cache(can, function(save, load) {
can.ui.message && save({title: can.ui.title, message: can.ui.message, scroll: can.ui.message.scrollTop})
return load(value.name, function(bak) { can.ui.title = bak.title, can.ui.message = bak.message
return load(value.zone, function(bak) { can.ui.title = bak.title, can.ui.message = bak.message
can.onmotion.delay(can, function() { can.ui.message.scrollTop = bak.scroll })
})
}, can.ui.content, can.ui.profile, can.ui.display, can._status)) { return can.onimport.layout(can) }
can.run(can.request(event, {"cache.limit": 10}), [value.hash], function(msg) {
can.onimport._display(can), can.onimport._content(can, msg)
})
}}])._target; select = (value.name == current? _target: select)||_target
}}])._target; select = (value.zone == current? _target: select)||_target
}), can.user.isMobile? can.onimport._switch(can, true): select && select.click()
},
_content: function(can, msg) {
can.ui.title = can.page.Appends(can, can.ui.content, [{view: wiki.TITLE, list: [
{icon: "bi bi-chevron-left", onclick: function() { can.onimport._switch(can, true) }},
{text: can.db.zone.name},
{text: can.db.zone.zone},
{icon: "bi bi-three-dots", onclick: function() { can.onmotion.toggle(can, can.ui.profile), can.onimport.layout(can) }},
]}])._target
can.ui.message = can.page.Append(can, can.ui.content, [{view: html.LIST}])._target, can.onimport._message(can, msg)
@ -52,8 +52,8 @@ Volcanos(chat.ONIMPORT, {
can.page.Append(can, can.ui.message, [{view: [[html.ITEM, mdb.TIME], "", time]}])
}
can.page.Append(can, can.ui.message, [{view: [[html.ITEM, value.type, myself? "myself": ""]], list: [
{img: can.misc.Resource(can, (value.avatar == can.db.zone.name? "": value.avatar)||can.db.zone.icons||"usr/icons/Messages.png")},
{view: html.CONTAINER, list: [{text: [value.usernick, "", nfs.FROM]}, can.onfigure[value.type](can, value)]},
{img: can.misc.Resource(can, (value.avatar == can.db.zone.zone? "": value.avatar)||can.db.zone.icons||"usr/icons/Messages.png")},
{view: html.CONTAINER, list: [{text: [value.usernick, "", nfs.FROM]}, can.onfigure[value.type||"text"](can, value)]},
]}])
}), can.onappend._status(can, msg.Option(ice.MSG_STATUS)), can.onimport.layout(can)
if (can.Status(mdb.TOTAL) > can.db.zone.id) { can.onimport._request(can) }
@ -114,19 +114,19 @@ Volcanos(chat.ONFIGURE, {
})
Volcanos(chat.ONINPUTS, {
_show: function(event, can, msg, target, name) {
function show(value) {
if (target == target.parentNode.firstChild) { can.ui = can.ui||{}
function show(value) { can.ui = can.ui||{}
if (!can.ui.img) {
can.ui.img = can.page.insertBefore(can, [{type: html.IMG}], target)
can.ui.span = can.page.insertBefore(can, [{type: html.SPAN}], target)
can.onappend.style(can, mdb.ICONS, can.page.parentNode(can, target, html.TR))
can.page.style(can, target, html.COLOR, html.TRANSPARENT)
}
can.ui.img.src = can.misc.Resource(can, value.icons), can.ui.span.innerText = value.name
can.ui.img.src = can.misc.Resource(can, value.icons||"usr/icons/Messages.png"), can.ui.span.innerText = value.zone
target.value = value.hash, can.onmotion.hidden(can, can._target)
}
can.page.Appends(can, can._output, msg.Table(function(value) {
return value.name && {view: html.ITEM, list: [
{img: can.misc.Resource(can, value.icons)}, {text: value.name},
return value.zone && {view: html.ITEM, list: [
{img: can.misc.Resource(can, value.icons||"usr/icons/Messages.png")}, {text: value.zone},
], onclick: function(event) { show(value) }}
}))
},

View File

@ -109,14 +109,15 @@ func _repos_open(m *ice.Message, p string) *git.Repository {
return mdb.HashSelectTarget(m, p, nil).(*git.Repository)
}
func _repos_each(m *ice.Message, title string, cb func(*git.Repository, ice.Maps) error) {
web.GoToast(m, func(toast func(string, int, int)) []string {
web.GoToast(m, func(toast func(string, int, int)) (res []string) {
m.Cmd("").Table(func(value ice.Maps, index, total int) {
toast(value[REPOS], index, total)
if err := cb(_repos_open(m, value[REPOS]), value); err != nil && err != git.NoErrAlreadyUpToDate {
web.ToastFailure(m, value[REPOS], err.Error())
res = append(res, value[REPOS])
}
})
return nil
return
})
}
func _repos_each_origin(m *ice.Message, title string, cb func(*git.Repository, string, *http.BasicAuth, ice.Maps) error) {
@ -650,15 +651,13 @@ func init() {
}},
}, web.StatsAction("", "代码库总数"), web.DreamAction(), mdb.HashAction(mdb.SHORT, REPOS, mdb.FIELD, "time,repos,branch,version,message,origin"), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 {
mdb.HashSelect(m, arg...).Sort(REPOS)
m.Table(func(value ice.Maps) {
mdb.HashSelect(m, arg...).Table(func(value ice.Maps) {
if strings.Contains(value[VERSION], "-") {
m.PushButton(STATUS, TAG, mdb.REMOVE)
} else {
m.PushButton(STATUS, mdb.REMOVE)
}
})
m.Action(CLONE, PULL, PUSH, STATUS)
}).Action(CLONE, PULL, PUSH, STATUS).Sort(REPOS)
} else if repos := _repos_open(m, arg[0]); len(arg) == 1 {
_repos_branch(m, repos)
} else if len(arg) == 2 {