diff --git a/base/ctx/command.go b/base/ctx/command.go index 8710a676..50678d66 100644 --- a/base/ctx/command.go +++ b/base/ctx/command.go @@ -54,6 +54,10 @@ const ( TOOLS = "tools" RUN = "run" SHIP = "ship" + + ICONS = ice.CTX_ICONS + TRANS = ice.CTX_TRANS + TITLE = ice.CTX_TITLE ) const COMMAND = "command" diff --git a/base/mdb/hash.go b/base/mdb/hash.go index 12e6b464..8c098510 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -218,9 +218,7 @@ func HashSelect(m *ice.Message, arg ...string) *ice.Message { m.Fields(len(kit.Slice(arg, 0, 1)), HashField(m)) } m.Cmdy(SELECT, m.PrefixKey(), m.Option(SUBKEY), HASH, HashShort(m), arg, logs.FileLineMeta(-1)) - kit.If(kit.Select(Config(m, SHORT), Config(m, SORT)), func(sort string) { - kit.If(sort != UNIQ, func() { m.Sort(sort) }) - }) + kit.If(kit.Select(Config(m, SHORT), Config(m, SORT)), func(sort string) { kit.If(sort != UNIQ, func() { m.Sort(sort) }) }) if m.PushAction(Config(m, ACTION), REMOVE); !m.FieldsIsDetail() { return m.Action(CREATE, PRUNES) } diff --git a/base/nfs/cat.go b/base/nfs/cat.go index 790c122f..0a4cba1f 100644 --- a/base/nfs/cat.go +++ b/base/nfs/cat.go @@ -99,6 +99,8 @@ const ( MD = "md" PY = "py" + IMAGE = "image" + PNG = "png" JPG = "jpg" MP4 = "mp4" diff --git a/base/nfs/dir.go b/base/nfs/dir.go index fe5ce472..ba1e5a28 100644 --- a/base/nfs/dir.go +++ b/base/nfs/dir.go @@ -145,6 +145,7 @@ const ( USR_PUBLISH = ice.USR_PUBLISH USR_ICEBERGS = ice.USR_ICEBERGS USR_LOCAL_WORK = ice.USR_LOCAL_WORK + USR_LOCAL = ice.USR_LOCAL SRC_DOCUMENT = ice.SRC_DOCUMENT SRC_TEMPLATE = ice.SRC_TEMPLATE REQUIRE = "/require/" diff --git a/base/web/dream.go b/base/web/dream.go index fa08e304..f860b07f 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -178,11 +178,11 @@ func init() { }}, mdb.CREATE: {Name: "create name*=hi icon@icon repos binary template", Hand: func(m *ice.Message, arg ...string) { kit.If(!strings.Contains(m.Option(mdb.NAME), "-") || !strings.HasPrefix(m.Option(mdb.NAME), "20"), func() { m.Option(mdb.NAME, m.Time("20060102-")+m.Option(mdb.NAME)) }) + m.OptionDefault(mdb.ICON, nfs.USR_ICONS_ICEBERGS) m.OptionDefault(nfs.REPOS, mdb.Config(m, nfs.REPOS)+m.Option(mdb.NAME)) m.Option(nfs.REPOS, kit.Select("", kit.Slice(kit.Split(m.Option(nfs.REPOS)), -1), 0)) - m.OptionDefault(mdb.ICON, nfs.USR_ICONS_ICEBERGS) if mdb.HashCreate(m); !m.IsCliUA() { - _dream_start(m, m.OptionDefault(mdb.NAME, path.Base(m.Option(nfs.REPOS)))) + _dream_start(m, m.Option(mdb.NAME)) } }}, nfs.REPOS: {Help: "仓库", Hand: func(m *ice.Message, arg ...string) { diff --git a/base/web/html/html.go b/base/web/html/html.go index a054b83c..b63482cf 100644 --- a/base/web/html/html.go +++ b/base/web/html/html.go @@ -28,6 +28,7 @@ const ( OUTPUT = "output" LAYOUT = "layout" RESIZE = "resize" + FILTER = "filter" COLOR = "color" BACKGROUND_COLOR = "background-color" diff --git a/base/web/option.go b/base/web/option.go index ca0797f9..b8e461c2 100644 --- a/base/web/option.go +++ b/base/web/option.go @@ -72,13 +72,13 @@ func ProcessIframe(m *ice.Message, name, link string, arg ...string) { return []string{m.Cmdx(CHAT_IFRAME, mdb.CREATE, mdb.TYPE, LINK, mdb.NAME, name, LINK, link)} }, arg...) } -func PushPodCmd(m *ice.Message, cmd string, arg ...string) { +func PushPodCmd(m *ice.Message, cmd string, arg ...string) *ice.Message { list := []string{} m.Cmds(SPACE, func(value ice.Maps) { kit.If(kit.IsIn(value[mdb.TYPE], WORKER), func() { list = append(list, value[mdb.NAME]) }) }) if len(list) == 0 { - return + return m } kit.If(m.Length() > 0 && len(m.Appendv(SPACE)) == 0, func() { m.Table(func(value ice.Maps) { m.Push(SPACE, "") }) }) GoToast(m, "", func(toast func(string, int, int)) []string { @@ -92,6 +92,7 @@ func PushPodCmd(m *ice.Message, cmd string, arg ...string) { }) return nil }) + return m } func PushImages(m *ice.Message, name string) { if kit.ExtIsImage(name) { diff --git a/base/web/share.go b/base/web/share.go index 94258c4a..e94f0146 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -127,7 +127,13 @@ func IsNotValidFieldShare(m *ice.Message, msg *ice.Message) bool { return false } func SharePath(m *ice.Message, p string) string { - kit.If(!kit.HasPrefix(p, nfs.PS, ice.HTTP), func() { p = path.Join(SHARE_LOCAL, p) }) + kit.If(!kit.HasPrefix(p, nfs.PS, ice.HTTP), func() { + if kit.HasPrefix(p, nfs.SRC, nfs.USR) && !kit.HasPrefix(p, nfs.USR_LOCAL) { + p = kit.MergeURL(path.Join(nfs.REQUIRE, p), ice.POD, m.Option(ice.MSG_USERPOD)) + } else { + p = kit.MergeURL(path.Join(SHARE_LOCAL, p), ice.POD, m.Option(ice.MSG_USERPOD)) + } + }) return p } func ShareLocalFile(m *ice.Message, arg ...string) { diff --git a/base/web/space.go b/base/web/space.go index cf57326b..3ff63525 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -293,3 +293,11 @@ func Space(m *ice.Message, arg ice.Any) []string { } return []string{SPACE, kit.Format(arg)} } +func PodCmd(m *ice.Message, key string, arg ...string) bool { + if pod := m.Option(key); pod != "" { + m.Options(key, "", ice.MSG_USERPOD, pod).Cmdy(SPACE, pod, m.PrefixKey(), arg) + return true + } else { + return false + } +} diff --git a/core/chat/favor.go b/core/chat/favor.go index 8ebf01af..009cc6d4 100644 --- a/core/chat/favor.go +++ b/core/chat/favor.go @@ -91,17 +91,22 @@ func init() { } return } - if mdb.HashSelect(m, arg...); len(arg) > 0 { - text := m.Append(mdb.TEXT) - m.PushQRCode(cli.QRCODE, text) - m.PushScript(text) - } - if len(arg) == 0 { + if mdb.HashSelect(m, arg...); len(arg) == 0 { + defer web.PushPodCmd(m, "", arg...) if m.IsMobileUA() { m.Action(mdb.CREATE, web.UPLOAD, "getClipboardData", "getLocation", "scanQRCode") } else { m.Action(mdb.CREATE, web.UPLOAD, "getClipboardData", "record1", "record2") } + } else { + if web.PodCmd(m, web.SPACE, arg...) { + return + } else if m.Length() == 0 { + return + } + text := m.Append(mdb.TEXT) + m.PushQRCode(cli.QRCODE, text) + m.PushScript(text) } m.Table(func(value ice.Maps) { delete(value, ctx.ACTION) diff --git a/core/chat/location.go b/core/chat/location.go index d09eaa5e..b68328d8 100644 --- a/core/chat/location.go +++ b/core/chat/location.go @@ -57,7 +57,9 @@ func init() { mdb.HashSelect(m, kit.Slice(arg, 0, 1)...) // m.Option(LOCATION, m.Cmdx(web.SERVE, tcp.HOST)) // m.Option(LOCATION, get(m, "location/v1/ip", aaa.IP, m.Option(ice.MSG_USERIP))) + web.PushPodCmd(m, "", arg...) ctx.DisplayLocal(m.Options(nfs.SCRIPT, kit.MergeURL(mdb.Config(m, nfs.SCRIPT), mdb.KEY, mdb.Config(m, web.TOKEN))), "") + ctx.Toolkit(m, "") }}, }) } diff --git a/core/mall/admin.go b/core/mall/admin.go new file mode 100644 index 00000000..a5b71928 --- /dev/null +++ b/core/mall/admin.go @@ -0,0 +1,37 @@ +package mall + +import ( + ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/mdb" + "shylinux.com/x/icebergs/base/nfs" + "shylinux.com/x/icebergs/base/web" + "shylinux.com/x/icebergs/base/web/html" + kit "shylinux.com/x/toolkits" +) + +const ADMIN = "admin" + +func init() { + Index.MergeCommands(ice.Commands{ + ADMIN: {Name: "admin hash auto", Help: "管理", Meta: kit.Dict( + ctx.TRANS, kit.Dict(html.INPUT, kit.Dict(mdb.TYPE, "单位", PRICE, "价格", AMOUNT, "总价")), + ), Actions: ice.MergeActions(ice.Actions{ + web.UPLOAD: {Hand: func(m *ice.Message, arg ...string) { m.Echo(m.Append(mdb.HASH)) }}, + mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(GOODS, mdb.INPUTS, arg) }}, + }, GOODS, ctx.ConfAction(ctx.TOOLS, Prefix(GOODS))), Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(GOODS, arg).PushAction(mdb.MODIFY, mdb.REMOVE) + kit.If(m.IsMobileUA(), func() { m.Action(mdb.CREATE) }, func() { m.Action(mdb.CREATE, "filter:text") }) + kit.If(len(arg) > 0, func() { + kit.For(kit.Split(m.Append(nfs.IMAGE)), func(p string) { + m.EchoImages(web.MergeURL2(m, web.SHARE_CACHE+p)) + }) + }) + ctx.DisplayTable(m) + ctx.Toolkit(m, "") + var total float64 + m.Table(func(value ice.Maps) { total += kit.Float(value[PRICE]) * kit.Float(value[mdb.COUNT]) }) + m.StatusTimeCount(AMOUNT, kit.Format("%0.2f", total)) + }}, + }) +} diff --git a/core/mall/goods.go b/core/mall/goods.go index 8d610612..9bd193ad 100644 --- a/core/mall/goods.go +++ b/core/mall/goods.go @@ -4,7 +4,10 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" + "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/web" + "shylinux.com/x/icebergs/base/web/html" + kit "shylinux.com/x/toolkits" ) const ( @@ -14,24 +17,20 @@ const GOODS = "goods" func init() { Index.MergeCommands(ice.Commands{ - GOODS: {Name: "goods hash@keyboard place@province date@date name@key count=_number@keyboard auto music", Help: "商品", Actions: ice.MergeActions(ice.Actions{ - mdb.MODIFY: {Name: "modify zone type name text price count image=4@img audio video"}, - mdb.CREATE: {Name: "modify zone type name text price count image=4@img audio video"}, - web.UPLOAD: {Hand: func(m *ice.Message, arg ...string) { web.Upload(m) }}, - "copy": {Hand: func(m *ice.Message, arg ...string) { - m.Cmd("", mdb.CREATE, m.OptionSimple("zone,type,name,text,price,count,image")) - }}, - }, mdb.HashAction(mdb.FIELD, "time,hash,zone,type,name,text,price,count,image,audio,video")), Hand: func(m *ice.Message, arg ...string) { - if mdb.HashSelect(m, arg...); len(arg) == 0 || arg[0] == "" { - m.Action(mdb.CREATE, mdb.EXPORT, mdb.IMPORT) - m.PushAction("copy", mdb.MODIFY, mdb.REMOVE) - ctx.DisplayLocal(m, "") - } else { - // for _, p := range kit.Split(m.Append("image")) { - // m.EchoImages(web.MergeURL2(m, web.SHARE_CACHE+p)) - // } - // m.PushAction("play", "stop", "copy", mdb.MODIFY, mdb.REMOVE) - } + GOODS: {Name: "goods list", Icon: "mall.png", Help: "商品", Meta: kit.Dict( + ctx.TRANS, kit.Dict(html.INPUT, kit.Dict(mdb.TYPE, "单位", PRICE, "价格", AMOUNT, "总价")), + ), Actions: ice.MergeActions(ice.Actions{ + mdb.CREATE: {Name: "create zone* name* text price* count*=1 type*=件,个,份,斤 image*=4@img"}, + mdb.MODIFY: {Name: "modify zone* name* text price* count*=1 type*=件,个,份,斤 image*=4@img"}, + nfs.IMAGE: {Name: "image image*=4@img", Help: "图片", Hand: func(m *ice.Message, arg ...string) { mdb.HashModify(m, arg) }}, + ORDER: {Name: "order count*=1", Help: "选购", Hand: func(m *ice.Message, arg ...string) {}}, + }, mdb.ExportHashAction(ctx.TOOLS, Prefix(ORDER), mdb.FIELD, "time,hash,zone,name,text,price,count,type,image")), Hand: func(m *ice.Message, arg ...string) { + kit.If(len(arg) == 0 && m.IsMobileUA(), func() { m.OptionDefault(ice.MSG_FIELDS, "zone,name,price,count,type,text,hash,time,image") }) + mdb.HashSelect(m, arg...).PushAction(ORDER).Action("filter:text") + web.PushPodCmd(m, "", arg...) + ctx.DisplayLocal(m, "") + ctx.Toolkit(m, "") + m.Sort("zone,name") }}, }) } diff --git a/core/mall/mall.go b/core/mall/mall.go index e9fd4004..5931fc45 100644 --- a/core/mall/mall.go +++ b/core/mall/mall.go @@ -3,6 +3,7 @@ package mall import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/web" + kit "shylinux.com/x/toolkits" ) const MALL = "mall" @@ -10,3 +11,5 @@ const MALL = "mall" var Index = &ice.Context{Name: MALL, Help: "贸易中心"} func init() { web.Index.Register(Index, nil, ASSET, SALARY) } + +func Prefix(arg ...ice.Any) string { return web.Prefix(MALL, kit.Keys(arg...)) } diff --git a/core/mall/order.go b/core/mall/order.go new file mode 100644 index 00000000..338753c2 --- /dev/null +++ b/core/mall/order.go @@ -0,0 +1,18 @@ +package mall + +import ( + ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/mdb" +) + +const ORDER = "order" + +func init() { + Index.MergeCommands(ice.Commands{ + ORDER: {Name: "order hash auto", Help: "订单", Actions: ice.MergeActions(ice.Actions{ + mdb.CREATE: {Name: "create zone* type name* text price* count* image*=4@img"}, + }), Hand: func(m *ice.Message, arg ...string) { + + }}, + }) +} diff --git a/core/team/plan.go b/core/team/plan.go index e0f2509f..57296fef 100644 --- a/core/team/plan.go +++ b/core/team/plan.go @@ -8,6 +8,7 @@ import ( "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/web" + "shylinux.com/x/icebergs/base/web/html" kit "shylinux.com/x/toolkits" ) @@ -55,7 +56,15 @@ const PLAN = "plan" func init() { Index.MergeCommands(ice.Commands{ - PLAN: {Name: "plan scale=month,day,week,month,year,long begin_time@date list prev next", Icon: "Calendar.png", Help: "计划表", Actions: ice.MergeActions(ice.Actions{ + PLAN: {Name: "plan scale=month,day,week,month,year,long begin_time@date list insert prev next", Icon: "Calendar.png", Help: "计划表", Meta: kit.Dict( + ctx.TRANS, kit.Dict(html.INPUT, kit.Dict( + "begin_time", "起始", "end_time", "结束", + "level", "优先级", "score", "完成度", "scale", "跨度", "view", "视图", + "day", "日", "week", "周", "month", "月", "year", "年", "long", "代", + "prepare", "准备中", "process", "进行中", "cancel", "已取消", "finish", "已完成", + "once", "一次性", "step", "阶段性", + )), + ), Actions: ice.MergeActions(ice.Actions{ mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TODO, mdb.INPUTS, arg) }}, mdb.PLUGIN: {Name: "plugin extra.index extra.args", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TASK, mdb.MODIFY, arg) }}, ctx.RUN: {Hand: func(m *ice.Message, arg ...string) { diff --git a/core/team/task.go b/core/team/task.go index 571ba266..e037f79f 100644 --- a/core/team/task.go +++ b/core/team/task.go @@ -77,7 +77,7 @@ func init() { } kit.If(arg[0] == mdb.ZONE, func() { m.Push(arg[0], kit.Split(nfs.TemplateText(m, mdb.ZONE))) }) }}, - mdb.INSERT: {Name: "insert space zone* type=once,step,week name* text begin_time@date end_time@date", Hand: func(m *ice.Message, arg ...string) { + mdb.INSERT: {Name: "insert space zone* type*=once,step,week name* text begin_time*@date end_time@date", Hand: func(m *ice.Message, arg ...string) { if space, arg := arg[1], arg[2:]; space != "" { m.Cmdy(web.SPACE, space, TASK, mdb.INSERT, web.SPACE, "", arg) } else { diff --git a/core/wiki/portal.css b/core/wiki/portal.css index b0ad509d..25e6adbc 100644 --- a/core/wiki/portal.css +++ b/core/wiki/portal.css @@ -20,8 +20,6 @@ body.dark fieldset.web.wiki.portal>div.output>div.header div.story[data-name=nav body.dark fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] div.item:hover { background-color:var(--plugin-bg-color); } fieldset.web.wiki.portal.home>div.output>div.layout>div.main p { white-space:pre-wrap; text-align:center; } fieldset.web.wiki.portal>div.output>div.layout>div.main>* { margin:20px auto; } -// fieldset.web.wiki.portal>div.output>div.layout>div.main h2 { margin-top:40px; } -// fieldset.web.wiki.portal>div.output>div.layout>div.main h3 { margin-top:20px; } fieldset.web.wiki.portal>div.output>div.layout>div.main ul { margin:20px 40px; } fieldset.web.wiki.portal>div.output>div.layout>div.main ol { margin:20px 40px; } fieldset.web.wiki.portal>div.output>div.layout>div.main p code { @@ -32,12 +30,14 @@ fieldset.web.wiki.portal>div.output>div.layout>div.main div.story[data-type=spar padding:10px; margin:10px auto; box-shadow:var(--box-shadow); } -fieldset.web.wiki.portal>div.output>div.layout>div.main div.story[data-type=spark][data-name=shell] kbd:hover { - /* background-color:white; color:black; */ -} fieldset.web.wiki.portal>div.output>div.layout>div.main fieldset.inner.output div.content { background-color:var(--code-bg-color); color:var(--code-fg-color); padding:10px 0; --code-comment:silver; --code-keyword:orange; --code-package:silver; --code-datatype:silver; --code-function:cyan; --code-constant:silver; --code-string:silver; --code-object:silver; } +body.cmd.web.wiki.portal { background-color:rgb(22 31 49); } +body.mobile fieldset.web.wiki.portal>div.output>div.layout { display:block; } +body.mobile fieldset.web.wiki.portal>div.output>div.layout>div.nav { padding:10px; height:unset; } +body.mobile fieldset.web.wiki.portal>div.output>div.layout>div.main { padding:10px; height:unset; min-width:unset; } +body.mobile fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] div.item { padding:10px; } diff --git a/core/wiki/word.go b/core/wiki/word.go index 6f9a26f9..008d6ff9 100644 --- a/core/wiki/word.go +++ b/core/wiki/word.go @@ -2,6 +2,7 @@ package wiki import ( "net/http" + "strings" ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" @@ -36,17 +37,44 @@ func init() { WordAlias(m, SEQUENCE, CHART, SEQUENCE) }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { - m.Option(nfs.DIR_DEEP, ice.TRUE) - _wiki_list(m, nfs.SRC) - _wiki_list(m, nfs.USR_ICEBERGS) - m.Cut("path,size,time") + if len(arg) > 0 { + m.OptionFields("path,size,time") + mdb.HashSelect(m) + } + msg := m.Spawn(kit.Dict(nfs.DIR_DEEP, ice.TRUE)) + _wiki_list(msg, nfs.SRC) + _wiki_list(msg, nfs.USR_ICEBERGS) + msg.Table(func(value ice.Maps) { + if !kit.HasPrefix(value[nfs.PATH], nfs.SRC_TEMPLATE, nfs.SRC_DOCUMENT) { + m.Push("", value, kit.Split("path,size,time")) + } + }) + web.PushPodCmd(m.Spawn(), "").Table(func(value ice.Maps) { + if !kit.HasPrefix(value[nfs.PATH], nfs.SRC_TEMPLATE, nfs.SRC_DOCUMENT) { + value[nfs.PATH] = value[web.SPACE] + nfs.DF + value[nfs.PATH] + m.Push("", value, kit.Split("path,size,time")) + } + }) }}, code.COMPLETE: {Hand: func(m *ice.Message, arg ...string) { kit.If(kit.IsIn(kit.Split(m.Option(mdb.TEXT))[0], IMAGE, VIDEO, AUDIO), func() { m.Cmdy(FEEL).CutTo(nfs.PATH, mdb.NAME) }) }}, - }, aaa.RoleAction(), WikiAction("", nfs.SHY)), Hand: func(m *ice.Message, arg ...string) { - m.Option(nfs.DIR_DEEP, ice.TRUE) - kit.If(len(arg) == 0, func() { arg = append(arg, nfs.SRC) }) + }, aaa.RoleAction(), WikiAction("", nfs.SHY), mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path")), Hand: func(m *ice.Message, arg ...string) { + if len(arg) > 0 { + mdb.HashCreate(m.Spawn(), nfs.PATH, arg[0]) + } + if len(arg) > 0 && strings.Contains(arg[0], nfs.DF) { + ls := kit.Split(arg[0], nfs.DF) + arg[0] = ls[1] + defer web.ToastProcess(m)() + defer m.StatusTime(web.SPACE, m.Option(web.SPACE, ls[0])) + } + if len(arg) == 0 { + m.Option(nfs.DIR_DEEP, ice.TRUE) + arg = append(arg, nfs.SRC) + } else if web.PodCmd(m, web.SPACE, arg...) { + return + } kit.If(!_wiki_list(m, arg...), func() { _word_show(m, arg[0]) }) }}, })