1
0
forked from x/icebergs
This commit is contained in:
IT 老营长 @云轩领航-创始人 2024-02-17 08:19:14 +08:00
parent d1c31ad7a7
commit bb783b794a
15 changed files with 119 additions and 159 deletions

View File

@ -51,6 +51,7 @@ const (
OPTS = "opts" OPTS = "opts"
STYLE = "style" STYLE = "style"
DISPLAY = "display" DISPLAY = "display"
PREVIEW = "preview"
ACTION = "action" ACTION = "action"
TOOLS = "tools" TOOLS = "tools"
RUN = "run" RUN = "run"

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 filter", 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

@ -123,23 +123,12 @@ func _dream_start(m *ice.Message, name string) {
if m.WarnNotValid(name == "", mdb.NAME) { if m.WarnNotValid(name == "", mdb.NAME) {
return return
} }
defer ToastProcess(m)() if !m.IsCliUA() {
defer m.ProcessOpen(m.MergePod(name)) defer ToastProcess(m)()
defer mdb.Lock(m, m.PrefixKey(), cli.START, name)() defer m.ProcessOpen(m.MergePod(name))
p := path.Join(ice.USR_LOCAL_WORK, name)
if p := path.Join(p, ice.Info.PidPath); nfs.Exists(m, p) {
if pid := m.Cmdx(nfs.CAT, p, kit.Dict(ice.MSG_USERROLE, aaa.TECH)); pid != "" && nfs.Exists(m, "/proc/"+pid) {
m.Info("already exists %v", pid)
return
}
for i := 0; i < 3; i++ {
if m.Cmd(SPACE, name).Length() > 0 {
m.Info("already exists %v", name)
return
}
m.Sleep300ms()
}
} }
defer mdb.Lock(m, m.PrefixKey(), cli.START, name)()
p := _dream_check(m, name)
defer m.Options(cli.CMD_DIR, "", cli.CMD_ENV, "", cli.CMD_OUTPUT, "") defer m.Options(cli.CMD_DIR, "", cli.CMD_ENV, "", cli.CMD_OUTPUT, "")
m.Options(cli.CMD_DIR, kit.Path(p), cli.CMD_ENV, kit.EnvList(kit.Simple(m.OptionSimple(ice.TCP_DOMAIN), m.Options(cli.CMD_DIR, kit.Path(p), cli.CMD_ENV, kit.EnvList(kit.Simple(m.OptionSimple(ice.TCP_DOMAIN),
cli.CTX_OPS, HostPort(m, tcp.LOCALHOST, m.Cmdv(SERVE, tcp.PORT)), cli.CTX_LOG, ice.VAR_LOG_BOOT_LOG, cli.CTX_PID, ice.VAR_LOG_ICE_PID, cli.CTX_OPS, HostPort(m, tcp.LOCALHOST, m.Cmdv(SERVE, tcp.PORT)), cli.CTX_LOG, ice.VAR_LOG_BOOT_LOG, cli.CTX_PID, ice.VAR_LOG_ICE_PID,
@ -154,6 +143,23 @@ func _dream_start(m *ice.Message, name string) {
gdb.WaitEvent(m, DREAM_OPEN, func(m *ice.Message, arg ...string) bool { return m.Option(mdb.NAME) == name }) gdb.WaitEvent(m, DREAM_OPEN, func(m *ice.Message, arg ...string) bool { return m.Option(mdb.NAME) == name })
m.Sleep300ms() m.Sleep300ms()
} }
func _dream_check(m *ice.Message, name string) string {
p := path.Join(ice.USR_LOCAL_WORK, name)
if p := path.Join(p, ice.Info.PidPath); nfs.Exists(m, p) {
if pid := m.Cmdx(nfs.CAT, p, kit.Dict(ice.MSG_USERROLE, aaa.TECH)); pid != "" && nfs.Exists(m, "/proc/"+pid) {
m.Info("already exists %v", pid)
return p
}
for i := 0; i < 3; i++ {
if m.Cmd(SPACE, name).Length() > 0 {
m.Info("already exists %v", name)
return p
}
m.Sleep300ms()
}
}
return p
}
func _dream_binary(m *ice.Message, p string) { func _dream_binary(m *ice.Message, p string) {
if bin := path.Join(m.Option(cli.CMD_DIR), ice.BIN_ICE_BIN); nfs.Exists(m, bin) { if bin := path.Join(m.Option(cli.CMD_DIR), ice.BIN_ICE_BIN); nfs.Exists(m, bin) {
return return
@ -198,11 +204,11 @@ const (
DREAM_CREATE = "dream.create" DREAM_CREATE = "dream.create"
DREAM_REMOVE = "dream.remove" DREAM_REMOVE = "dream.remove"
DREAM_TRASH = "dream.trash"
DREAM_START = "dream.start" DREAM_START = "dream.start"
DREAM_STOP = "dream.stop" DREAM_STOP = "dream.stop"
DREAM_OPEN = "dream.open" DREAM_OPEN = "dream.open"
DREAM_CLOSE = "dream.close" DREAM_CLOSE = "dream.close"
DREAM_TRASH = "dream.trash"
DREAM_INPUTS = "dream.inputs" DREAM_INPUTS = "dream.inputs"
DREAM_TABLES = "dream.tables" DREAM_TABLES = "dream.tables"
@ -323,7 +329,7 @@ func init() {
list := []string{cli.LINUX, cli.DARWIN, cli.WINDOWS} list := []string{cli.LINUX, cli.DARWIN, cli.WINDOWS}
msg := m.Spawn(ice.Maps{ice.MSG_DAEMON: ""}) msg := m.Spawn(ice.Maps{ice.MSG_DAEMON: ""})
func() { func() {
defer ToastProcess(m, ice.Info.Pathname)(ice.Info.Pathname) defer ToastProcess(m, PUBLISH, ice.Info.Pathname)(PUBLISH, ice.Info.Pathname)
m.Cmd(AUTOGEN, BINPACK) m.Cmd(AUTOGEN, BINPACK)
kit.For(list, func(goos string) { kit.For(list, func(goos string) {
PushNoticeRich(m, mdb.NAME, ice.Info.NodeName, msg.Cmd(COMPILE, goos, cli.AMD64).AppendSimple()) PushNoticeRich(m, mdb.NAME, ice.Info.NodeName, msg.Cmd(COMPILE, goos, cli.AMD64).AppendSimple())

View File

@ -64,9 +64,13 @@ const (
PROFILE = "profile" PROFILE = "profile"
DISPLAY = "display" DISPLAY = "display"
TEXT = "text"
TEXTAREA = "textarea"
PASSWORD = "password"
SELECT = "select"
BUTTON = "button"
VIEW = "view" VIEW = "view"
TEXT = "text"
BUTTON = "button"
INPUT = "input" INPUT = "input"
VALUE = "value" VALUE = "value"
OUTPUT = "output" OUTPUT = "output"

View File

@ -20,7 +20,6 @@ fieldset.web.matrix>div.output>table.content div.item.danger div.status div.item
fieldset.web.matrix>div.output>table.content div.item.notice div.status div.item { color:var(--notice-fg-color); } fieldset.web.matrix>div.output>table.content div.item.notice div.status div.item { color:var(--notice-fg-color); }
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.stop div.title>span { color:var(--disable-fg-color); }
fieldset.web.matrix>div.output>table.content tr:not(:hover) div.action { visibility:hidden; } fieldset.web.matrix>div.output>table.content tr:not(:hover) div.action { visibility:hidden; }
body:not(.mobile) fieldset.web.matrix>div.output>table.content thead { 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 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; }
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

@ -3,7 +3,6 @@ package web
import ( import (
"net/url" "net/url"
"strings" "strings"
"time"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
@ -79,8 +78,12 @@ func PushNotice(m *ice.Message, arg ...ice.Any) {
}) })
m.Cmd(SPACE, m.Option(ice.MSG_DAEMON), arg, opts) m.Cmd(SPACE, m.Option(ice.MSG_DAEMON), arg, opts)
} }
func PushNoticeRefresh(m *ice.Message, arg ...ice.Any) { PushNotice(m, kit.List("refresh", arg)...) } func PushNoticeToast(m *ice.Message, arg ...ice.Any) {
func PushNoticeToast(m *ice.Message, arg ...ice.Any) { PushNotice(m, kit.List("toast", arg)...) } PushNotice(m, kit.List(TOAST, arg)...)
}
func PushNoticeRefresh(m *ice.Message, arg ...ice.Any) {
PushNotice(m, kit.List("refresh", arg)...)
}
func PushNoticeGrow(m *ice.Message, arg ...ice.Any) { func PushNoticeGrow(m *ice.Message, arg ...ice.Any) {
PushNotice(m.StatusTimeCount(), kit.List("grow", arg)...) PushNotice(m.StatusTimeCount(), kit.List("grow", arg)...)
} }
@ -91,72 +94,35 @@ func PushStream(m *ice.Message) *ice.Message {
m.Options(cli.CMD_OUTPUT, file.NewWriteCloser(func(buf []byte) { PushNoticeGrow(m, string(buf)) }, nil)).ProcessHold(toastContent(m, ice.SUCCESS)) m.Options(cli.CMD_OUTPUT, file.NewWriteCloser(func(buf []byte) { PushNoticeGrow(m, string(buf)) }, nil)).ProcessHold(toastContent(m, ice.SUCCESS))
return m return m
} }
func init() { ice.Info.PushStream = PushStream }
func init() { ice.Info.PushNotice = PushNotice } func init() { ice.Info.PushNotice = PushNotice }
func init() { ice.Info.PushStream = PushStream }
func Toast(m *ice.Message, text string, arg ...ice.Any) *ice.Message { // [title [duration [progress [hash]]]] func ProcessIframe(m *ice.Message, title, link string, arg ...string) *ice.Message {
if len(arg) > 1 { if m.IsMetaKey() {
switch val := arg[1].(type) { m.ProcessOpen(link)
case string:
if value, err := time.ParseDuration(val); err == nil {
arg[1] = int(value / time.Millisecond)
}
}
}
kit.If(len(arg) == 0, func() { arg = append(arg, m.PrefixKey()) })
kit.If(len(arg) > 0 && arg[0] == "", func() {
arg[0] = kit.Keys(m.Option(ice.MSG_USERPOD0), m.Option(ice.MSG_USERPOD), ctx.ShortCmd(m.PrefixKey()))
})
PushNoticeToast(m, text, arg)
return m
}
var Icons = map[string]string{ice.PROCESS: "🕑", ice.FAILURE: "❌", ice.SUCCESS: "✅"}
func toastContent(m *ice.Message, state string, arg ...ice.Any) string {
if len(arg) == 0 {
return kit.JoinWord(kit.Simple(Icons[state], kit.Select(ice.LIST, m.ActionKey()), state)...)
} else {
return kit.JoinWord(kit.Simple(Icons[state], arg)...)
}
}
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, cli.TIME_3s)).Sleep(m.OptionDefault(ice.TOAST_DURATION, cli.TIME_3s))
}
func ToastProcess(m *ice.Message, arg ...ice.Any) func(...ice.Any) {
h := kit.HashsUniq()
Toast(m, toastContent(m, ice.PROCESS, arg...), "", "-1", "", h)
return func(arg ...ice.Any) { Toast(m, toastContent(m, ice.SUCCESS, arg...), "", cli.TIME_3s, "", h) }
}
func GoToastTable(m *ice.Message, key string, cb func(value ice.Maps)) *ice.Message {
if m.Length() == 0 {
return m return m
} }
return GoToast(m, func(toast func(string, int, int)) []string { if !kit.HasPrefixList(arg, ctx.RUN) {
m.Table(func(value ice.Maps, index, total int) { toast(value[key], index, total); cb(value) }) defer m.Push(TITLE, title)
return nil }
}) return ctx.ProcessFloat(m, CHAT_IFRAME, link, arg...)
} }
func GoToast(m *ice.Message, cb func(toast func(name string, count, total int)) []string) *ice.Message { func ProcessPodCmd(m *ice.Message, pod, cmd string, args ice.Any, arg ...string) *ice.Message {
icon, _total, h := Icons[ice.PROCESS], 1, kit.HashsUniq() if kit.HasPrefixList(arg, ctx.RUN) {
toast := func(name string, count, total int) { ctx.ProcessField(m.Options(ice.POD, arg[1]), arg[2], args, kit.Simple(arg[0], arg[3:])...)
kit.If(total == 0, func() { total = 1 })
Toast(m, kit.Format("%s %s %s", icon, kit.JoinWord(kit.Select(ice.LIST, m.ActionKey()), name), strings.ReplaceAll(kit.FmtSize(count, total), "B", "")),
m.Option(ice.MSG_TITLE), m.OptionDefault(ice.TOAST_DURATION, "-1"), count*100/total, h)
_total = total
}
if list := cb(toast); len(list) > 0 {
icon = Icons[ice.FAILURE]
m.Option(ice.TOAST_DURATION, cli.TIME_30s)
toast(kit.JoinWord(list...), len(list), _total)
} else { } else {
icon = Icons[ice.SUCCESS] ctx.ProcessField(m.Options(ice.POD, pod), cmd, args, arg...).ProcessField(ctx.ACTION, m.ActionKey(), ctx.RUN, pod, cmd)
m.Option(ice.TOAST_DURATION, cli.TIME_3s)
toast(ice.SUCCESS, _total, _total)
} }
m.Sleep(m.Option(ice.TOAST_DURATION))
return m return m
} }
func ProcessHashPodCmd(m *ice.Message, arg ...string) *ice.Message {
msg := m
if kit.HasPrefixList(arg, ctx.RUN) {
msg = mdb.HashSelects(m.Spawn(), arg[1])
arg = kit.Simple(arg[0], arg[2:])
} else {
msg = mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH))
defer m.ProcessField(ctx.ACTION, m.ActionKey(), ctx.RUN, m.Option(mdb.HASH))
}
return ctx.ProcessField(m.Options(ice.POD, msg.Append(SPACE)), msg.Append(ctx.INDEX), kit.Split(msg.Append(ctx.ARGS)), arg...)
}

View File

@ -60,12 +60,11 @@ const (
STORM = "storm" STORM = "storm"
FIELD = "field" FIELD = "field"
LOCAL = "local"
PROXY = "proxy" PROXY = "proxy"
TOAST = "toast" LOCAL = "local"
SHARE_LOCAL = "/share/local/"
SHARE_CACHE = "/share/cache/" SHARE_CACHE = "/share/cache/"
SHARE_LOCAL = "/share/local/"
) )
const SHARE = "share" const SHARE = "share"
@ -128,12 +127,9 @@ func init() {
mdb.HashSelect(m, arg...).PushAction(OPEN, mdb.REMOVE) mdb.HashSelect(m, arg...).PushAction(OPEN, mdb.REMOVE)
} }
}}, }},
PP(SHARE, PROXY): {Hand: func(m *ice.Message, arg ...string) { _share_proxy(m) }},
PP(SHARE, CACHE): {Hand: func(m *ice.Message, arg ...string) { _share_cache(m, arg...) }}, PP(SHARE, CACHE): {Hand: func(m *ice.Message, arg ...string) { _share_cache(m, arg...) }},
PP(SHARE, LOCAL): {Hand: func(m *ice.Message, arg ...string) { ShareLocalFile(m, arg...) }}, PP(SHARE, LOCAL): {Hand: func(m *ice.Message, arg ...string) { ShareLocalFile(m, arg...) }},
PP(SHARE, PROXY): {Hand: func(m *ice.Message, arg ...string) { _share_proxy(m) }},
PP(SHARE, TOAST): {Hand: func(m *ice.Message, arg ...string) {
m.Options(ice.LOG_DISABLE, ice.TRUE).Cmdy(SPACE, arg[0], kit.UnMarshal(m.Option(ice.ARG)))
}},
}) })
} }
func IsNotValidShare(m *ice.Message, time string) bool { func IsNotValidShare(m *ice.Message, time string) bool {

View File

@ -467,13 +467,3 @@ 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 {
if m.IsMetaKey() {
m.ProcessOpen(link)
return m
}
if !kit.HasPrefixList(arg, ctx.RUN) {
defer m.Push(TITLE, title)
}
return ctx.ProcessFloat(m, CHAT_IFRAME, link, arg...)
}

View File

@ -79,9 +79,9 @@ var Index = &ice.Context{Name: WEB, Help: "网络模块"}
func init() { func init() {
ice.Index.Register(Index, &Frame{}, ice.Index.Register(Index, &Frame{},
BROAD, SERVE, SPACE, ROUTE, DREAM, STORE, BROAD, SERVE, SPACE, DREAM, ROUTE,
SHARE, TOKEN, SPIDE, CACHE, ADMIN, STATS, COUNT, SHARE, TOKEN, STATS, COUNT, TOAST,
MATRIX, SPIDE, CACHE, STORE, ADMIN, MATRIX,
) )
} }

View File

@ -119,27 +119,21 @@ func FavorAction() ice.Actions {
} }
func FavorPreview(m *ice.Message, arg ...string) { func FavorPreview(m *ice.Message, arg ...string) {
if kit.HasPrefixList(arg, ctx.RUN) { if kit.HasPrefixList(arg, ctx.RUN) {
if pod := arg[1]; pod != "" { web.ProcessPodCmd(m, "", "", nil, arg...)
arg[1] = "" } else {
m.Options(ice.MSG_USERPOD, pod).Cmdy(web.SPACE, pod, m.CommandKey(), ctx.ACTION, m.ActionKey(), arg) msg := m
if m.Option(web.SPACE) == "" {
msg = mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH))
} else { } else {
index, args := favorPreview(m, arg[2], arg...) msg = m.Cmd(web.SPACE, m.Option(web.SPACE), m.PrefixKey(), m.Option(mdb.HASH))
ctx.ProcessField(m, index, args, kit.Simple(ctx.RUN, arg[3:])...)
} }
} else if !web.PodCmd(m, web.SPACE, kit.Simple(ctx.ACTION, m.ActionKey(), arg)...) { index, args := msg.Append(mdb.TYPE), kit.Split(msg.Append(mdb.TEXT))
index, args := favorPreview(m, m.Option(mdb.HASH), arg...) switch msg.Append(mdb.TYPE) {
ctx.ProcessField(m, index, args, arg...).Push(ice.MSG_SPACE, m.Option(ice.MSG_USERPOD)) case ctx.INDEX:
m.Option(ice.FIELD_PREFIX, ctx.ACTION, m.ActionKey(), ctx.RUN, m.Option(ice.MSG_USERPOD), m.Option(mdb.HASH)) index = msg.Append(mdb.NAME)
case nfs.SHY:
index = web.WIKI_WORD
}
web.ProcessPodCmd(m, m.Option(web.SPACE), index, args, arg...)
} }
} }
func favorPreview(m *ice.Message, h string, arg ...string) (string, []string) {
msg := mdb.HashSelects(m.Spawn(), h)
index, args := msg.Append(mdb.TYPE), kit.Split(msg.Append(mdb.TEXT))
switch msg.Append(mdb.TYPE) {
case ctx.INDEX:
index = msg.Append(mdb.NAME)
case nfs.SHY:
index = web.WIKI_WORD
}
return index, args
}

View File

@ -5,7 +5,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) {},
can.onmotion.hidden(can, can._action) can.onmotion.hidden(can, can._action)
// can.core.Item(can.ui.zone, function(key, item) { key == "favor" || item._legend.click() }) // can.core.Item(can.ui.zone, function(key, item) { key == "favor" || item._legend.click() })
if (can.user.isMobile) { if (can.user.isMobile) {
can.page.style(can, can.ui.project, "z-index", 10, "position", "absolute", html.MAX_HEIGHT, can.ConfHeight()-120) can.page.style(can, can.ui.project, "z-index", 2, "position", "absolute", html.MAX_HEIGHT, can.ConfHeight()-120)
can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth()) can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth())
can.onmotion.hidden(can, can._action), can.onmotion.hidden(can, can._status) can.onmotion.hidden(can, can._action), can.onmotion.hidden(can, can._status)
} else { } else {

View File

@ -3,7 +3,7 @@ fieldset.macos.desktop { background-size:cover; background-position:center; }
fieldset.macos.desktop>div.output { background-color:transparent; overflow:hidden; } fieldset.macos.desktop>div.output { background-color:transparent; overflow:hidden; }
fieldset.macos.desktop>div.output>fieldset.macos { background-color:var(--plugin-bg-color); } fieldset.macos.desktop>div.output>fieldset.macos { background-color:var(--plugin-bg-color); }
fieldset.macos.desktop>div.output>fieldset.macos>div.output { background-color:transparent; } fieldset.macos.desktop>div.output>fieldset.macos>div.output { background-color:transparent; }
fieldset.macos.desktop>div.output>fieldset.macos.menu { line-height:var(--desktop-menu-height); border-radius:0; height:var(--desktop-menu-height); width:100%; position:sticky; top:0; overflow:hidden; } fieldset.macos.desktop>div.output>fieldset.macos.menu { line-height:var(--desktop-menu-height); border-radius:0; height:var(--desktop-menu-height); width:100%; position:sticky; top:0; overflow:hidden; z-index:10; }
fieldset.macos.desktop>div.output>fieldset.macos.menu div.menu:hover { background-color:var(--hover-bg-color); } fieldset.macos.desktop>div.output>fieldset.macos.menu div.menu:hover { background-color:var(--hover-bg-color); }
fieldset.macos.desktop>div.output>fieldset.macos.menu div.menu.icon { font-size:24px; line-height:22px; height:var(--desktop-menu-height); } fieldset.macos.desktop>div.output>fieldset.macos.menu div.menu.icon { font-size:24px; line-height:22px; height:var(--desktop-menu-height); }
fieldset.macos.desktop>div.output>fieldset.macos.menu div.menu img { height:var(--desktop-menu-height); margin-right:var(--input-padding); } fieldset.macos.desktop>div.output>fieldset.macos.menu div.menu img { height:var(--desktop-menu-height); margin-right:var(--input-padding); }
@ -11,9 +11,9 @@ fieldset.macos.desktop>div.output>fieldset.macos.menu div.menu { display:flex; a
fieldset.macos.desktop>div.output>fieldset.macos.menu div.menu.title { font-style:italic; margin-left:10px; } fieldset.macos.desktop>div.output>fieldset.macos.menu div.menu.title { font-style:italic; margin-left:10px; }
fieldset.macos.desktop>div.output>fieldset.macos.menu div.item.time { margin-right:10px; } fieldset.macos.desktop>div.output>fieldset.macos.menu div.item.time { margin-right:10px; }
fieldset.macos.desktop>div.output>fieldset.macos.menu>div.output { overflow:hidden; } fieldset.macos.desktop>div.output>fieldset.macos.menu>div.output { overflow:hidden; }
fieldset.macos.desktop>div.output>fieldset.macos.dock { border:var(--box-border); border-radius:var(--plugin-radius); position:absolute; bottom:var(--input-margin); transition:margin-left 0.3s; z-index:11; } fieldset.macos.desktop>div.output>fieldset.macos.dock { border:var(--box-border); border-radius:var(--plugin-radius); position:absolute; bottom:var(--input-margin); transition:margin-left 0.3s; z-index:10; }
fieldset.macos.desktop>div.output>fieldset.macos.searchs { position:absolute; z-index:11; } fieldset.macos.desktop>div.output>fieldset.macos.searchs { position:absolute; z-index:10; }
fieldset.macos.desktop>div.output>fieldset.macos.notifications { height:calc(100% - 125px); width:320px; overflow:auto; position:absolute; top:var(--desktop-menu-height); left:calc(100% - 320px); z-index:11; } fieldset.macos.desktop>div.output>fieldset.macos.notifications { height:calc(100% - 125px); width:320px; overflow:auto; position:absolute; top:var(--desktop-menu-height); left:calc(100% - 320px); z-index:10; }
fieldset.macos.desktop>div.output>fieldset.macos.notifications>div.action>div.item { padding:0; } fieldset.macos.desktop>div.output>fieldset.macos.notifications>div.action>div.item { padding:0; }
fieldset.macos.desktop>div.output>fieldset.macos.notifications>div.output>div.item { clear:both; display:flex; padding:var(--input-padding)} fieldset.macos.desktop>div.output>fieldset.macos.notifications>div.output>div.item { clear:both; display:flex; padding:var(--input-padding)}
fieldset.macos.desktop>div.output>fieldset.macos.notifications>div.output>div.item:not(:last-child) { border-bottom:var(--box-border); } fieldset.macos.desktop>div.output>fieldset.macos.notifications>div.output>div.item:not(:last-child) { border-bottom:var(--box-border); }
@ -30,7 +30,7 @@ fieldset.macos.desktop>div.output>div.desktop>div.item { text-align:center; }
fieldset.macos.desktop>div.output>div.desktop>div.item img { object-fit:contain; height:var(--desktop-icon-size); width:var(--desktop-icon-size); } fieldset.macos.desktop>div.output>div.desktop>div.item img { object-fit:contain; height:var(--desktop-icon-size); width:var(--desktop-icon-size); }
fieldset.macos.desktop>div.output>div.desktop>div.item>div.name { font-size:var(--code-font-size); width:var(--desktop-icon-size); overflow:hidden; } fieldset.macos.desktop>div.output>div.desktop>div.item>div.name { font-size:var(--code-font-size); width:var(--desktop-icon-size); overflow:hidden; }
fieldset.macos.desktop>div.output>div.desktop>fieldset { border-radius:var(--plugin-radius); position:absolute; } fieldset.macos.desktop>div.output>div.desktop>fieldset { border-radius:var(--plugin-radius); position:absolute; }
fieldset.macos.desktop>div.output>div.desktop>fieldset.select { z-index:1; } fieldset.macos.desktop>div.output>div.desktop>fieldset.select { z-index:9; }
fieldset.macos.desktop>div.output>div.desktop>fieldset>div.item.button { border-radius:var(--plugin-radius); box-shadow:var(--box-shadow); padding:8px; height:23px; width:23px; scale:0.7; position:absolute; top:10px; right:var(--plugin-padding); cursor:pointer; } fieldset.macos.desktop>div.output>div.desktop>fieldset>div.item.button { border-radius:var(--plugin-radius); box-shadow:var(--box-shadow); padding:8px; height:23px; width:23px; scale:0.7; position:absolute; top:10px; right:var(--plugin-padding); cursor:pointer; }
fieldset.macos.desktop>div.output>div.desktop>fieldset>div.item.button:not(:hover)>span { display:none; } fieldset.macos.desktop>div.output>div.desktop>fieldset>div.item.button:not(:hover)>span { display:none; }
fieldset.macos.desktop>div.output>div.desktop>fieldset>legend { padding:0 var(--input-padding); margin:var(--button-margin); box-shadow:none; } fieldset.macos.desktop>div.output>div.desktop>fieldset>legend { padding:0 var(--input-padding); margin:var(--button-margin); box-shadow:none; }

View File

@ -1,7 +1,7 @@
body.light fieldset.web.chat.message>div.output { background-color:white; } body.light fieldset.web.chat.message>div.output { background-color:white; }
body.light fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list { background-color:#e3e3e2; } body.light fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list { background-color:#e3e3e2; }
body.light fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list>div.item:not(.plug).myself div.content { background-color:#94ec69; } body.light fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list>div.item:not(.plug).myself div.content { background-color:#94ec69; }
fieldset.web.chat.message>div.output>div.project>div.title { padding:var(--button-padding); display:flex; justify-content:space-between; position:sticky; top:0; z-index:10; } fieldset.web.chat.message>div.output>div.project>div.title { padding:var(--button-padding); display:flex; justify-content:space-between; position:sticky; top:0; z-index:2; }
fieldset.web.chat.message>div.output>div.project>div.title i:hover { background-color:var(--hover-bg-color); cursor:pointer; } fieldset.web.chat.message>div.output>div.project>div.title i:hover { background-color:var(--hover-bg-color); cursor:pointer; }
fieldset.web.chat.message>div.output>div.project>div.title span:hover { background-color:var(--hover-bg-color); cursor:pointer; } fieldset.web.chat.message>div.output>div.project>div.title span:hover { background-color:var(--hover-bg-color); cursor:pointer; }
fieldset.web.chat.message>div.output>div.project>div.item.text.filter>i { left:var(--input-padding); } fieldset.web.chat.message>div.output>div.project>div.item.text.filter>i { left:var(--input-padding); }
@ -12,7 +12,7 @@ fieldset.web.chat.message>div.output>div.project>div.item div.container { paddin
fieldset.web.chat.message>div.output>div.project>div.item div.title { display:flex; justify-content:space-between; } fieldset.web.chat.message>div.output>div.project>div.item div.title { display:flex; justify-content:space-between; }
fieldset.web.chat.message>div.output>div.project>div.item div.content { color:var(--disable-fg-color); font-size:var(--status-font-size); } fieldset.web.chat.message>div.output>div.project>div.item div.content { color:var(--disable-fg-color); font-size:var(--status-font-size); }
fieldset.web.chat.message>div.output>div.layout>div.layout>div.content { overflow:hidden; } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content { overflow:hidden; }
fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.title { padding:var(--button-padding); display:flex; justify-content:space-between; position:sticky; top:0; z-index:10; } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.title { padding:var(--button-padding); display:flex; justify-content:space-between; position:sticky; top:0; z-index:2; }
fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.title i:hover { background-color:var(--hover-bg-color); cursor:pointer; } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.title i:hover { background-color:var(--hover-bg-color); cursor:pointer; }
fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.title span:hover { background-color:var(--hover-bg-color); cursor:pointer; } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.title span:hover { background-color:var(--hover-bg-color); cursor:pointer; }
fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list>div.item { padding:var(--input-padding); min-height:fit-content; display:flex; } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list>div.item { padding:var(--input-padding); min-height:fit-content; display:flex; }

42
info.go
View File

@ -175,13 +175,6 @@ func MergeActions(arg ...Any) Actions {
return list return list
} }
func SplitCmd(name string, actions Actions) (list []Any) { func SplitCmd(name string, actions Actions) (list []Any) {
const (
TEXT = "text"
TEXTAREA = "textarea"
PASSWORD = "password"
SELECT = "select"
BUTTON = "button"
)
const ( const (
RUN = "run" RUN = "run"
REFRESH = "refresh" REFRESH = "refresh"
@ -191,10 +184,11 @@ func SplitCmd(name string, actions Actions) (list []Any) {
PAGE = "page" PAGE = "page"
ARGS = "args" ARGS = "args"
CONTENT = "content" CONTENT = "content"
FILTER = "filter"
) )
item, button := kit.Dict(), false item, button := kit.Dict(), false
push := func(arg ...string) { push := func(arg ...string) {
button = kit.Select("", arg, 0) == BUTTON button = kit.Select("", arg, 0) == html.BUTTON
item = kit.Dict(TYPE, kit.Select("", arg, 0), NAME, kit.Select("", arg, 1), ACTION, kit.Select("", arg, 2)) item = kit.Dict(TYPE, kit.Select("", arg, 0), NAME, kit.Select("", arg, 1), ACTION, kit.Select("", arg, 2))
list = append(list, item) list = append(list, item)
} }
@ -202,27 +196,29 @@ func SplitCmd(name string, actions Actions) (list []Any) {
for i := 1; i < len(ls); i++ { for i := 1; i < len(ls); i++ {
switch ls[i] { switch ls[i] {
case RUN: case RUN:
push(BUTTON, ls[i]) push(html.BUTTON, ls[i])
case REFRESH: case REFRESH:
push(BUTTON, ls[i], AUTO) push(html.BUTTON, ls[i], AUTO)
case LIST: case LIST:
push(BUTTON, ls[i], AUTO) push(html.BUTTON, ls[i], AUTO)
case AUTO: case AUTO:
push(BUTTON, LIST, AUTO) push(html.BUTTON, LIST, AUTO)
push(BUTTON, BACK) push(html.BUTTON, BACK)
case PAGE: case PAGE:
push(BUTTON, "prev") push(html.BUTTON, "prev")
push(BUTTON, "next") push(html.BUTTON, "next")
push(TEXT, "offend") push(html.TEXT, "offend")
push(TEXT, "limit") push(html.TEXT, "limit")
case ARGS, CONTENT, TEXTAREA, TEXT, "extra": case ARGS, CONTENT, html.TEXTAREA, html.TEXT, "extra":
push(TEXTAREA, ls[i]) push(html.TEXTAREA, ls[i])
case PASSWORD: case html.PASSWORD:
push(PASSWORD, ls[i]) push(html.PASSWORD, ls[i])
case FILTER:
push(html.TEXT, ls[i])
case "*": case "*":
item["need"] = "must" item["need"] = "must"
case DF: case DF:
if item[TYPE] = kit.Select("", ls, i+1); item[TYPE] == BUTTON { if item[TYPE] = kit.Select("", ls, i+1); item[TYPE] == html.BUTTON {
button = true button = true
} }
i++ i++
@ -244,7 +240,7 @@ func SplitCmd(name string, actions Actions) (list []Any) {
item[ACTION] = kit.Select("", ls, i+1) item[ACTION] = kit.Select("", ls, i+1)
i++ i++
default: default:
push(kit.Select(TEXT, BUTTON, button || actions != nil && actions[ls[i]] != nil), ls[i]) push(kit.Select(html.TEXT, html.BUTTON, button || actions != nil && actions[ls[i]] != nil), ls[i])
} }
} }
return list return list

12
meta.go
View File

@ -300,14 +300,22 @@ func (m *Message) Sort(key string, arg ...Any) *Message {
switch v := arg[i].(type) { switch v := arg[i].(type) {
case string: case string:
cmp = v cmp = v
case map[string]int:
order[k] = v
case []string: case []string:
list := map[string]int{} list := map[string]int{}
for i, v := range v { for i, v := range v {
list[v] = i + 1 list[v] = i + 1
} }
order[k] = list order[k] = list
case map[string]int:
order[k] = v
case func(string) int:
list := map[string]int{}
kit.For(m.Appendv(k), func(k string) {
if _, ok := list[k]; !ok {
list[k] = v(k)
}
})
order[k] = list
} }
} }
if cmp == "" { if cmp == "" {