diff --git a/base/ctx/command.go b/base/ctx/command.go index 2385cdc7..205d5313 100644 --- a/base/ctx/command.go +++ b/base/ctx/command.go @@ -80,6 +80,9 @@ func init() { } }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 0 { + _command_list(m, "") + } for _, key := range arg { _command_list(m, key) } diff --git a/base/ctx/context.go b/base/ctx/context.go index f0b6c2ca..5d41a6a5 100644 --- a/base/ctx/context.go +++ b/base/ctx/context.go @@ -7,9 +7,6 @@ import ( func _context_list(m *ice.Message, sub *ice.Context) { m.Travel(func(p *ice.Context, s *ice.Context) { - if sub != nil && sub != p { - return - } m.Push(kit.MDB_NAME, s.Cap(ice.CTX_FOLLOW)) m.Push(kit.MDB_STATUS, s.Cap(ice.CTX_STATUS)) m.Push(kit.MDB_STREAM, s.Cap(ice.CTX_STREAM)) diff --git a/base/mdb/hash.go b/base/mdb/hash.go index c1b87e62..a621892d 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -14,6 +14,7 @@ func _hash_fields(m *ice.Message) []string { } func _hash_inputs(m *ice.Message, prefix, chain string, field, value string) { list := map[string]int{} + m.Debug("what %v %v", prefix, chain) m.Richs(prefix, chain, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { if val = kit.GetMeta(val); kit.Format(val[kit.MDB_COUNT]) != "" { list[kit.Format(val[field])] = kit.Int(val[kit.MDB_COUNT]) diff --git a/base/mdb/list.go b/base/mdb/list.go index 607eb45c..219434a3 100644 --- a/base/mdb/list.go +++ b/base/mdb/list.go @@ -14,6 +14,7 @@ func _list_fields(m *ice.Message) []string { } func _list_inputs(m *ice.Message, prefix, chain string, field, value string) { list := map[string]int{} + m.Debug("what %v %v", prefix, chain) m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) { if val = kit.GetMeta(val); kit.Format(val[kit.MDB_COUNT]) != "" { list[kit.Format(val[field])] = kit.Int(val[kit.MDB_COUNT]) diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 374b48fe..4f99a10b 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -26,6 +26,7 @@ const ( FIELDS = "fields" DETAIL = "detail" RANDOM = "random" + REPEAT = "repeat" CREATE = "create" REMOVE = "remove" @@ -34,12 +35,11 @@ const ( MODIFY = "modify" SELECT = "select" + INPUTS = "inputs" + PRUNES = "prunes" EXPORT = "export" IMPORT = "import" - PRUNES = "prunes" - INPUTS = "inputs" UPLOAD = "upload" - REPEAT = "repeat" REVERT = "revert" NEXT = "next" @@ -94,7 +94,7 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]* ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, INSERT: {Name: "insert key sub type arg...", Help: "添加", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { - case ZONE: + case ZONE: // insert key sub type zone arg... _list_insert(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), arg[4:]...) case HASH: _hash_insert(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...) @@ -104,7 +104,7 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]* }}, DELETE: {Name: "delete key sub type field value", Help: "删除", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { - case ZONE: + case ZONE: // delete key sub type zone field value _list_delete(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), arg[4], arg[5]) case HASH: _hash_delete(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4]) @@ -114,7 +114,7 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]* }}, MODIFY: {Name: "modify key sub type field value arg...", Help: "编辑", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { - case ZONE: + case ZONE: // modify key sub type zone id field value _list_modify(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), kit.MDB_ID, arg[4], arg[5:]...) case HASH: _hash_modify(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4], arg[5:]...) @@ -132,6 +132,26 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]* _list_select(m, arg[0], _domain_chain(m, arg[1]), kit.Select("", arg, 3), kit.Select("", arg, 4)) } }}, + INPUTS: {Name: "inputs key sub type field value", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + switch arg[2] { + case ZONE: // inputs key sub type zone field value + _list_inputs(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), kit.Select(kit.MDB_NAME, arg, 4), kit.Select("", arg, 5)) + case HASH: + _hash_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select(kit.MDB_NAME, arg, 3), kit.Select("", arg, 4)) + case LIST: + _list_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select(kit.MDB_NAME, arg, 3), kit.Select("", arg, 4)) + } + }}, + PRUNES: {Name: "prunes key sub type [field value]...", Help: "清理", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + switch arg[2] { + case ZONE: // prunes key sub type zone field value + _list_prunes(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), arg[4:]...) + case HASH: + _hash_prunes(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...) + case LIST: + _list_prunes(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...) + } + }}, EXPORT: {Name: "export key sub type file", Help: "导出", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch file := _file_name(m, arg...); arg[2] { case ZONE: @@ -152,32 +172,12 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]* _list_import(m, arg[0], _domain_chain(m, arg[1]), file) } }}, - INPUTS: {Name: "inputs key sub type field value", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - switch arg[2] { - case ZONE: - _list_inputs(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), kit.Select(kit.MDB_NAME, arg, 4), kit.Select("", arg, 5)) - case HASH: - _hash_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select(kit.MDB_NAME, arg, 3), kit.Select("", arg, 4)) - case LIST: - _list_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select(kit.MDB_NAME, arg, 3), kit.Select("", arg, 4)) - } - }}, - PRUNES: {Name: "prunes key sub type [field value]...", Help: "清理", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - switch arg[2] { - case ZONE: - _list_prunes(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), arg[4:]...) - case HASH: - _hash_prunes(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...) - case LIST: - _list_prunes(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...) - } - }}, }} func init() { ice.Index.Register(Index, nil, INSERT, DELETE, MODIFY, SELECT, - EXPORT, IMPORT, PRUNES, INPUTS, - PLUGIN, RENDER, ENGINE, SEARCH, + INPUTS, PRUNES, EXPORT, IMPORT, + SEARCH, ENGINE, PLUGIN, RENDER, ) } diff --git a/base/mdb/zone.go b/base/mdb/zone.go index 743bab13..6c5f4bea 100644 --- a/base/mdb/zone.go +++ b/base/mdb/zone.go @@ -4,6 +4,7 @@ import ( "encoding/csv" "os" "path" + "strings" ice "shylinux.com/x/icebergs" kit "shylinux.com/x/toolkits" @@ -56,6 +57,7 @@ func _zone_export(m *ice.Message, prefix, chain, file string) { defer w.Flush() fields := _zone_fields(m) + fields = append(fields, kit.MDB_EXTRA) w.Write(fields) count := 0 @@ -129,8 +131,20 @@ func ZoneAction(fields ...string) map[string]*ice.Action { return ice.SelectAction(map[string]*ice.Action{ INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + arg[0] = strings.TrimPrefix(arg[0], "extra.") + arg[0] = kit.Select(arg[0], m.Config(kit.Keys(kit.MDB_ALIAS, arg[0]))) + m.Debug("what %v", arg[0]) switch arg[0] { + case ice.POD: + m.Cmdy("route") + case ice.CTX: + m.Cmdy("context") + case ice.CMD: + m.Cmdy("context", kit.Select(m.Option(ice.CTX), m.Option(kit.Keys(kit.MDB_EXTRA, ice.CTX))), "command") + case ice.ARG: + case _zone(m): + m.Debug("what %v", arg[0]) m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, arg) default: m.Cmdy(INPUTS, m.PrefixKey(), "", ZONE, m.Option(_zone(m)), arg) @@ -157,6 +171,9 @@ func ZoneAction(fields ...string) map[string]*ice.Action { m.OptionFields(_zone(m)) m.Cmdy(IMPORT, m.PrefixKey(), "", ZONE) }}, + PLUGIN: {Name: "plugin extra.pod extra.ctx extra.cmd extra.arg", Help: "插件", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(MODIFY, m.PrefixKey(), "", ZONE, m.Option(_zone(m)), m.Option(kit.MDB_ID), arg) + }}, PREV: {Name: "prev", Help: "上一页", Hand: func(m *ice.Message, arg ...string) { PrevPage(m, arg[0], arg[1:]...) }}, diff --git a/base/ssh/scripts.go b/base/ssh/scripts.go index 99736eb3..57cd76e9 100644 --- a/base/ssh/scripts.go +++ b/base/ssh/scripts.go @@ -164,6 +164,7 @@ func (f *Frame) scan(m *ice.Message, h, line string) *Frame { continue // 多行 } if strings.HasPrefix(strings.TrimSpace(line), "#") { + line = "" continue } // if line = strings.Split(line, " # ")[0]; len(line) == 0 { @@ -188,7 +189,9 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool { switch f.source = kit.Select(STDIO, arg, 0); f.source { case STDIO: // 终端交互 m.Cap(ice.CTX_STREAM, f.source) - f.target = m.Target() + if f.target == nil { + f.target = m.Target() + } r, w, _ := os.Pipe() m.Go(func() { io.Copy(w, os.Stdin) }) @@ -269,7 +272,7 @@ func init() { } }}, TARGET: {Name: "target name run:button", Help: "当前模块", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - f := m.Optionv(FRAME).(*Frame) + f := c.Server().(*Frame) m.Search(arg[0]+ice.PT, func(p *ice.Context, s *ice.Context, key string) { f.target = s }) f.prompt(m) }}, diff --git a/base/web/space.go b/base/web/space.go index 188ea76c..760d87bd 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -42,8 +42,8 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { host := kit.Format(client[tcp.HOSTNAME]) proto := strings.Replace(kit.Format(client[tcp.PROTOCOL]), "http", "ws", 1) - uri := kit.MergeURL(proto+"://"+host+"/space/", kit.MDB_TYPE, ice.Info.NodeType, - kit.MDB_NAME, name, SHARE, ice.Info.CtxShare, RIVER, kit.Select(ice.Info.CtxRiver, m.Option(RIVER)), arg) + uri := kit.MergeURL(proto+"://"+host+"/space/", kit.MDB_TYPE, ice.Info.NodeType, kit.MDB_NAME, name, + SHARE, m.Conf(cli.RUNTIME, kit.Keys("conf.ctx_share")), RIVER, m.Conf(cli.RUNTIME, kit.Keys("conf.ctx_river")), arg) u := kit.ParseURL(uri) m.Go(func() { diff --git a/core/chat/action.go b/core/chat/action.go index e7622088..f6ba738d 100644 --- a/core/chat/action.go +++ b/core/chat/action.go @@ -2,7 +2,6 @@ package chat import ( "path" - "strings" ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" @@ -47,7 +46,7 @@ func _action_exec(m *ice.Message, river, storm, index string, arg ...string) { _action_upload(m) // 上传文件 } - if !m.PodCmd(cmds, arg) { + if cmds[0] == "web.chat.node" || !m.PodCmd(cmds, arg) { m.Cmdy(cmds, arg) // 执行命令 } } @@ -158,7 +157,7 @@ func init() { kit.MDB_PATH, ice.USR_LOCAL_RIVER, )}, }, Commands: map[string]*ice.Command{ - "/action": {Name: "/action river storm action arg...", Help: "工作台", Action: map[string]*ice.Action{ + "/action": {Name: "/action river storm action arg...", Help: "工作台", Action: ice.MergeAction(map[string]*ice.Action{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { for _, cmd := range []string{ "web.chat.meet.miss", @@ -181,18 +180,13 @@ func init() { mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(kit.MDB_ID), arg) }}, - ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - for _, k := range arg { - m.Cmdy(ctx.COMMAND, strings.TrimPrefix(k, ".")) - } - }}, SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { _header_share(m, arg...) }}, "_share": {Name: "_share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { _action_share(m, arg...) }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + }, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg) { return // 没有登录 } diff --git a/core/chat/chat.shy b/core/chat/chat.shy index 87b456de..759003b8 100644 --- a/core/chat/chat.shy +++ b/core/chat/chat.shy @@ -23,5 +23,5 @@ location.go info.go node.go -meet.go room.go +meet.go diff --git a/core/chat/footer.go b/core/chat/footer.go index 4f4fe098..efc2cddc 100644 --- a/core/chat/footer.go +++ b/core/chat/footer.go @@ -18,16 +18,13 @@ func init() { LEGAL, kit.List(`shylinuxc@gmail.com`), )}, }, Commands: map[string]*ice.Command{ - "/footer": {Name: "/footer", Help: "状态栏", Action: map[string]*ice.Action{ - ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(ctx.COMMAND, arg) - }}, + "/footer": {Name: "/footer", Help: "状态栏", Action: ice.MergeAction(map[string]*ice.Action{ ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { if m.Cmdy(arg); m.Result(1) == ice.ErrNotFound { m.Set(ice.MSG_RESULT).Cmdy(cli.SYSTEM, arg) } }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + }, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Confm(FOOTER, LEGAL, func(index int, value string) { m.Echo(value) }) }}, }}) diff --git a/core/chat/meet.go b/core/chat/meet.go index 3fe10d6f..4cda41de 100644 --- a/core/chat/meet.go +++ b/core/chat/meet.go @@ -12,27 +12,19 @@ const ( const MISS = "miss" func init() { - Index.Register(&ice.Context{Name: MEET, Help: "遇见", - Configs: map[string]*ice.Config{ - MISS: {Name: MISS, Help: "miss", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_FIELD, "time,name,照片,性别,年龄,身高,体重,籍贯,户口,学历,学校,职业,公司,年薪,资产,家境", - )}, - }, - Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }}, - - MISS: {Name: "miss name auto create", Help: "资料", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Action: ice.MergeAction(map[string]*ice.Action{ - mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(MISS), "", mdb.HASH, arg) - }}, - }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(len(arg), m.Conf(MISS, kit.META_FIELD)) - m.Cmd(mdb.SELECT, m.Prefix(MISS), "", mdb.HASH, kit.MDB_NAME, arg).Table(func(index int, value map[string]string, head []string) { - value["照片"] = kit.Format(``, value["照片"], kit.Select("100", "400", m.Option(mdb.FIELDS) == mdb.DETAIL)) - m.Push("", value, kit.Split(m.Option(ice.MSG_FIELDS))) - }) - }}, - }, - }, nil, MISS) + Index.Register(&ice.Context{Name: MEET, Help: "遇见", Configs: map[string]*ice.Config{ + MISS: {Name: MISS, Help: "miss", Value: kit.Data( + kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_FIELD, "time,name,照片,性别,年龄,身高,体重,籍贯,户口,学历,学校,职业,公司,年薪,资产,家境", + )}, + }, Commands: map[string]*ice.Command{ + MISS: {Name: "miss name auto create", Help: "资料", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Action: ice.MergeAction(map[string]*ice.Action{ + mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加"}, + }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + msg := m.Spawn() + mdb.HashSelect(msg, arg...).Table(func(index int, value map[string]string, head []string) { + value["照片"] = ice.Render(m, ice.RENDER_IMAGES, value["照片"], kit.Select("100", "400", msg.FieldsIsDetail())) + m.Push(m.OptionFields(), value, kit.Split(msg.OptionFields())) + }) + }}, + }}, nil, MISS) } diff --git a/core/chat/node.go b/core/chat/node.go index aca38c8d..9597668b 100644 --- a/core/chat/node.go +++ b/core/chat/node.go @@ -12,54 +12,54 @@ import ( const NODE = "node" func init() { - Index.Merge(&ice.Context{ - Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Watch(web.DREAM_START, m.Prefix(NODE)) - m.Watch(web.SPACE_START, m.Prefix(NODE)) + Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ + NODE: {Name: "node pod ctx cmd auto insert invite", Help: "设备", Action: map[string]*ice.Action{ + ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { + m.Watch(web.DREAM_START, m.PrefixKey()) + m.Watch(web.SPACE_START, m.PrefixKey()) }}, - NODE: {Name: "node pod ctx cmd auto insert invite", Help: "设备", Action: map[string]*ice.Action{ - web.DREAM_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" { - return - } - m.Cmdy(mdb.INSERT, RIVER, _river_key(m, NODE), mdb.HASH, arg) - }}, - web.SPACE_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" { - return - } - if msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) == RIVER { - m.Cmdy(mdb.INSERT, RIVER, _river_key(m, NODE), mdb.HASH, arg) - } - }}, - aaa.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { - m.Option(web.SHARE, m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, RIVER)) - m.Cmdy(code.PUBLISH, ice.CONTEXTS, "tool") - }}, - mdb.INSERT: {Name: "insert type name share", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, RIVER, _river_key(m, NODE), mdb.HASH, arg) - }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, RIVER, _river_key(m, NODE), mdb.HASH, m.OptionSimple(aaa.USERNAME)) - }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(web.SPACE) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) == 0 { - m.Option(mdb.FIELDS, "time,type,name,share") - m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH) - m.Table(func(index int, value map[string]string, head []string) { - m.PushAnchor(value[kit.MDB_NAME], kit.MergeURL2(m.Option(ice.MSG_USERWEB), - "/chat/pod/"+kit.Keys(m.Option(ice.POD), value[kit.MDB_NAME]))) - }) - m.RenameAppend("name", "pod") - m.PushAction(mdb.REMOVE) + web.SPACE_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" { return } - m.Cmdy(web.ROUTE, arg) + if msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) == RIVER { + m.Cmdy(NODE, mdb.INSERT, arg) + } else { + msg.Debug(msg.FormatMeta()) + } }}, - }, - }) + web.DREAM_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" { + return + } + m.Cmdy(NODE, mdb.INSERT, arg) + }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(web.SPACE) + }}, + mdb.INSERT: {Name: "insert type name share river", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, RIVER, _river_key(m, NODE), mdb.HASH, arg) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, RIVER, _river_key(m, NODE), mdb.HASH, kit.MDB_NAME, m.Option(ice.POD)) + }}, + aaa.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { + m.Option(web.SHARE, m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, RIVER)) + m.Cmdy(code.PUBLISH, ice.CONTEXTS, "tool") + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 0 { + m.Option(mdb.FIELDS, "time,type,name,share") + m.Cmdy(mdb.SELECT, RIVER, _river_key(m, NODE), mdb.HASH) + m.Table(func(index int, value map[string]string, head []string) { + m.PushAnchor(value[kit.MDB_NAME], kit.MergeURL2(m.Option(ice.MSG_USERWEB), + "/chat/pod/"+kit.Keys(m.Option(ice.POD), value[kit.MDB_NAME]))) + }) + m.RenameAppend("name", "pod") + m.PushAction(mdb.REMOVE) + return + } + m.Cmdy(web.ROUTE, arg) + }}, + }}) } diff --git a/core/chat/river.go b/core/chat/river.go index 4fdd0fb2..729eb7f0 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -63,8 +63,8 @@ func init() { "base", kit.Dict( "info", kit.List( "web.chat.info", - "web.chat.user", - "web.chat.tool", + "web.chat.ocean", + "web.chat.storm", "web.chat.node", ), "scan", kit.List( @@ -110,7 +110,7 @@ func init() { } switch kit.Select("", arg, 1) { - case OCEAN, NODE: + case STORM, OCEAN, NODE: m.Option(ice.MSG_RIVER, arg[0]) m.Cmdy(arg[1], arg[2:]) diff --git a/core/chat/room.go b/core/chat/room.go index a0b08264..24ba99c4 100644 --- a/core/chat/room.go +++ b/core/chat/room.go @@ -9,40 +9,57 @@ import ( ) const ROOM = "room" -const JOIN = "join" func init() { + const ( + JOIN = "join" + QUIT = "quit" + ) Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ ROOM: {Name: "room", Help: "room", Value: kit.Data( - kit.MDB_SHORT, "zone", - kit.MDB_FIELD, "time,id,type,name,text", + kit.MDB_SHORT, "zone", kit.MDB_FIELD, "time,id,type,name,text", )}, JOIN: {Name: "join", Help: "join", Value: kit.Data( - kit.MDB_SHORT, "zone", - kit.MDB_FIELD, "time,hash,username,socket", + kit.MDB_SHORT, "space", kit.MDB_FIELD, "time,hash,username,socket", )}, }, Commands: map[string]*ice.Command{ - ROOM: {Name: "room zone id auto create insert join", Help: "room", Action: ice.MergeAction(map[string]*ice.Action{ + ROOM: {Name: "room zone id auto", Help: "room", Action: ice.MergeAction(map[string]*ice.Action{ mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) - m.Cmdy(mdb.INSERT, m.Prefix(JOIN), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) }}, - mdb.INSERT: {Name: "insert zone type name text", Help: "发送", Hand: func(m *ice.Message, arg ...string) { + mdb.INSERT: {Name: "insert zone type=hi name=hello text=world", Help: "发送", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.ZONE, m.Option(kit.MDB_ZONE), arg[2:]) - m.Cmdy(JOIN, m.Option(kit.MDB_ZONE)).Table(func(index int, value map[string]string, head []string) { - m.Option(ice.MSG_DAEMON, value[web.SOCKET]) - m.Toast(m.Option("text"), m.Option("name")) + m.Cmdy(mdb.SELECT, m.Prefix(ROOM), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.HASH, ice.Option{mdb.FIELDS, "time,space"}).Table(func(index int, value map[string]string, head []string) { + m.Debug("what %v", value) + m.Cmdy(web.SPACE, value[web.SPACE], "toast", m.Option("text"), m.Option("name")) }) }}, - "join": {Name: "join", Help: "加入", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(JOIN, mdb.INSERT, arg) + JOIN: {Name: "join zone", Help: "加入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, m.Prefix(ROOM), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.HASH, web.SPACE, m.Option("_daemon")) + m.Cmdy(mdb.INSERT, m.Prefix(JOIN), "", mdb.HASH, web.SPACE, m.Option("_daemon"), kit.MDB_SHORT, kit.MDB_ZONE) + m.Cmdy(mdb.INSERT, m.Prefix(JOIN), kit.KeyHash(m.Option("_daemon")), mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) + }}, + QUIT: {Name: "quit", Help: "退出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, m.Prefix(ROOM), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.HASH, m.OptionSimple(web.SPACE)) + m.Cmdy(mdb.DELETE, m.Prefix(JOIN), kit.KeyHash(m.Option(web.SPACE)), mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) }}, - "exit": {Name: "exit", Help: "退出"}, }, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - mdb.ZoneSelect(m, arg...) + if mdb.ZoneSelect(m, arg...); len(arg) == 0 { + m.Action(mdb.CREATE) + m.PushAction(mdb.INSERT, JOIN) + } else if len(arg) == 1 { + m.Action(mdb.INSERT, JOIN) + } }}, - JOIN: {Name: "join zone hash auto", Help: "join", Action: ice.MergeAction(map[string]*ice.Action{ + JOIN: {Name: "join space zone auto", Help: "join", Action: ice.MergeAction(map[string]*ice.Action{ + ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { + m.Watch(web.SPACE_START, m.PrefixKey()) + }}, + web.SPACE_START: {Name: "space_start", Help: "下线", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) + m.Cmdy(mdb.INSERT, m.Prefix(JOIN), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) + }}, mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) m.Cmdy(mdb.INSERT, m.Prefix(JOIN), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) @@ -56,8 +73,9 @@ func init() { mdb.DELETE: {Name: "delete zone socket", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.DELETE, m.Prefix(JOIN), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.HASH, m.OptionSimple(web.SOCKET)) }}, - }), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if mdb.ZoneSelect(m, arg...); len(arg) == 0 { + }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Fields(len(arg), "time,space", "time,zone") + if len(arg) == 0 { m.Cmdy(mdb.SELECT, m.Prefix(JOIN), "", mdb.HASH) } else { m.Cmdy(mdb.SELECT, m.Prefix(JOIN), kit.KeyHash(arg[0]), mdb.HASH, arg[1:]) diff --git a/core/chat/storm.go b/core/chat/storm.go index f89dc3f1..1464232a 100644 --- a/core/chat/storm.go +++ b/core/chat/storm.go @@ -81,15 +81,14 @@ func init() { return } - if m.Copy(msg); len(arg) == 1 { // 命令列表 + if m.Copy(msg); len(arg) > 1 { // 命令插件 + m.ProcessField(arg[0], arg[1], ice.RUN) + m.Table(func(index int, value map[string]string, head []string) { + m.Cmdy(m.Space(value[ice.POD]), ctx.CONTEXT, value[ice.CTX], ctx.COMMAND, value[ice.CMD]) + }) + } else { m.PushAction(mdb.EXPORT, mdb.IMPORT) } - - // 命令插件 - m.ProcessField(arg[0], arg[1], ice.RUN) - m.Table(func(index int, value map[string]string, head []string) { - m.Cmdy(m.Space(value[ice.POD]), ctx.CONTEXT, value[ice.CTX], ctx.COMMAND, value[ice.CMD]) - }) }}, }}) } diff --git a/core/code/inner.go b/core/code/inner.go index e2f1c803..cbe5688f 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -68,7 +68,7 @@ func init() { Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ INNER: {Name: "inner path=src/ file=main.go line=1 auto", Help: "源代码", Meta: kit.Dict( ice.Display("/plugin/local/code/inner.js", "editor"), - ), Action: map[string]*ice.Action{ + ), Action: ice.MergeAction(map[string]*ice.Action{ mdb.PLUGIN: {Name: "plugin", Help: "插件", Hand: func(m *ice.Message, arg ...string) { if m.Cmdy(mdb.PLUGIN, arg); m.Result() == "" { m.Echo(kit.Select("{}", m.Conf(INNER, kit.Keym(PLUG, arg[0])))) @@ -87,10 +87,9 @@ func init() { m.Option(nfs.DIR_ROOT, arg[2]) m.Cmdy(mdb.SEARCH, arg[:2], "cmd,file,line,text") }}, - mdb.INPUTS: {Name: "favor inputs", Help: "补全"}, - ctx.COMMAND: {Name: "command", Help: "命令"}, - FAVOR: {Name: "favor", Help: "收藏"}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + mdb.INPUTS: {Name: "favor inputs", Help: "补全"}, + FAVOR: {Name: "favor", Help: "收藏"}, + }, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) < 2 { nfs.Dir(m, kit.MDB_PATH) return diff --git a/core/code/publish.go b/core/code/publish.go index fa4a1f42..200e8c46 100644 --- a/core/code/publish.go +++ b/core/code/publish.go @@ -176,6 +176,6 @@ export ctx_dev={{.Option "httphost"}}; ctx_temp=$(mktemp); curl -fsSL $ctx_dev - `, "tool", `# 群组环境 mkdir contexts; cd contexts -export ctx_log=/dev/stdout ctx_dev={{.Option "httphost"}} ctx_river={{.Option "sess.river"}} ctx_share={{.Option "share"}} ctx_temp=$(mktemp); curl -fsSL $ctx_dev -o $ctx_temp; source $ctx_temp ice +export ctx_dev={{.Option "httphost"}} ctx_share={{.Option "share"}} ctx_river={{.Option "sess.river"}} ctx_temp=$(mktemp); curl -fsSL $ctx_dev -o $ctx_temp; source $ctx_temp app `, ) diff --git a/core/mall/asset.go b/core/mall/asset.go index bed29acb..4bcf7623 100644 --- a/core/mall/asset.go +++ b/core/mall/asset.go @@ -1,10 +1,7 @@ package mall import ( - "strings" - ice "shylinux.com/x/icebergs" - "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" kit "shylinux.com/x/toolkits" @@ -33,34 +30,18 @@ func _asset_check(m *ice.Message, account string) { m.Option(kit.Keycb(mdb.SELECT), func(key string, value map[string]interface{}) { amount += kit.Int(kit.Value(value, AMOUNT)) }) - m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.ZONE, account, ice.OptionFields(m.Conf(ASSET, kit.META_FIELD))) + m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.ZONE, account, ice.OptionFields(m.Config(kit.MDB_FIELD))) m.Cmdy(mdb.MODIFY, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount) } -func _asset_create(m *ice.Message, account string) { - m.Cmdy(mdb.INSERT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account) -} func _asset_insert(m *ice.Message, account string, arg ...string) { - _asset_create(m, account) + m.Cmdy(mdb.INSERT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account) m.Cmdy(mdb.INSERT, m.Prefix(ASSET), "", mdb.ZONE, account, arg) - m.OptionFields("time,account,amount,count") - amount := kit.Int(m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account).Append(AMOUNT)) + amount := kit.Int(m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account, ice.Option{mdb.FIELDS, "time,account,amount,count"}).Append(AMOUNT)) amount += kit.Int(_sub_value(m, AMOUNT, arg...)) m.Cmdy(mdb.MODIFY, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount) } -func _asset_inputs(m *ice.Message, field, value string) { - if cli.Inputs(m, field) { - return - } - - switch strings.TrimPrefix(field, "extra.") { - case ACCOUNT, FROM, TO: - m.Cmdy(mdb.INPUTS, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, value) - default: - m.Cmdy(mdb.INPUTS, m.Prefix(ASSET), "", mdb.ZONE, m.Option(ACCOUNT), field, value) - } -} const ( ACCOUNT = "account" @@ -78,87 +59,59 @@ const ( const ASSET = "asset" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - ASSET: {Name: ASSET, Help: "资产", Value: kit.Data( - kit.MDB_SHORT, ACCOUNT, kit.MDB_FIELD, "time,id,type,amount,name,text", - )}, - }, - Commands: map[string]*ice.Command{ - ASSET: {Name: "asset account id auto spend trans bonus check", Help: "资产", Meta: kit.Dict( - "_trans", kit.Dict(ACCOUNT, "账户", AMOUNT, "金额", FROM, "转出", TO, "转入", "time", "时间", "name", "商家", "text", "备注"), - ), Action: map[string]*ice.Action{ - SPEND: {Name: "spend account name amount time@date text", Help: "支出", Hand: func(m *ice.Message, arg ...string) { - _sub_amount(m, arg) - _asset_insert(m, arg[1], kit.Simple(kit.MDB_TYPE, "支出", arg[2:])...) - }}, - TRANS: {Name: "trans from to amount time@date text", Help: "转账", Hand: func(m *ice.Message, arg ...string) { - _asset_insert(m, arg[3], kit.Simple(kit.MDB_TYPE, "转入", kit.MDB_NAME, arg[1], arg[4:])...) - _sub_amount(m, arg) - _asset_insert(m, arg[1], kit.Simple(kit.MDB_TYPE, "转出", kit.MDB_NAME, arg[3], arg[4:])...) - }}, - BONUS: {Name: "bonus account name amount time@date text", Help: "收入", Hand: func(m *ice.Message, arg ...string) { - _asset_insert(m, arg[1], kit.Simple(kit.MDB_TYPE, "收入", arg[2:])...) - }}, - CHECK: {Name: "check", Help: "核算", Hand: func(m *ice.Message, arg ...string) { - if m.Option(ACCOUNT) == "" { - m.Cmd(ASSET).Table(func(index int, value map[string]string, head []string) { - _asset_check(m, value[ACCOUNT]) - }) - m.ProcessRefresh30ms() - } else { - _asset_check(m, m.Option(ACCOUNT)) - } - m.Toast("核算成功") - }}, - - mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, m.Prefix(ASSET), "", mdb.ZONE, m.Option(ACCOUNT), m.Option(kit.MDB_ID), arg) - }}, - mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - m.OptionFields(ACCOUNT, m.Conf(ASSET, kit.META_FIELD), kit.MDB_EXTRA) - m.Cmdy(mdb.EXPORT, m.Prefix(ASSET), "", mdb.ZONE) - }}, - mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - m.OptionFields(ACCOUNT) - m.Cmdy(mdb.IMPORT, m.Prefix(ASSET), "", mdb.ZONE) - m.Cmdy(ASSET, CHECK) - }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - _asset_inputs(m, kit.Select("", arg, 0), kit.Select("", arg, 1)) - }}, - - mdb.PLUGIN: {Name: "plugin extra.pod extra.ctx extra.cmd extra.arg", Help: "插件", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, m.Prefix(ASSET), "", mdb.ZONE, m.Option(ACCOUNT), m.Option(kit.MDB_ID), arg) - }}, - ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(ctx.COMMAND, arg) - }}, - ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(arg) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - amount, count := 0, 0 - m.Fields(len(arg), "time,account,amount,count", m.Conf(ASSET, kit.META_FIELD)) - if m.Cmdy(mdb.SELECT, m.Prefix(ASSET), "", mdb.ZONE, arg); len(arg) == 0 { - m.PushAction(CHECK) - m.SortIntR(AMOUNT) - - m.Table(func(index int, value map[string]string, head []string) { - amount += kit.Int(value[AMOUNT]) - count += kit.Int(value[COUNT]) - }) - - } else { - m.PushAction(mdb.PLUGIN) - - m.Table(func(index int, value map[string]string, head []string) { - amount += kit.Int(value[AMOUNT]) - count++ - }) - } - m.StatusTime(AMOUNT, amount, COUNT, count) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + ASSET: {Name: ASSET, Help: "资产", Value: kit.Data( + kit.MDB_SHORT, ACCOUNT, kit.MDB_FIELD, "time,id,type,amount,name,text", + kit.MDB_ALIAS, kit.Dict(FROM, ACCOUNT, TO, ACCOUNT), + )}, + }, Commands: map[string]*ice.Command{ + ASSET: {Name: "asset account id auto spend trans bonus", Help: "资产", Meta: kit.Dict( + "_trans", kit.Dict(ACCOUNT, "账户", AMOUNT, "金额", FROM, "转出", TO, "转入", "time", "时间", "name", "商家", "text", "备注"), + ), Action: ice.MergeAction(map[string]*ice.Action{ + SPEND: {Name: "spend account name amount time@date text", Help: "支出", Hand: func(m *ice.Message, arg ...string) { + _sub_amount(m, arg) + _asset_insert(m, arg[1], kit.Simple(kit.MDB_TYPE, "支出", arg[2:])...) }}, - }, - }) + TRANS: {Name: "trans from to amount time@date text", Help: "转账", Hand: func(m *ice.Message, arg ...string) { + _asset_insert(m, arg[3], kit.Simple(kit.MDB_TYPE, "转入", kit.MDB_NAME, arg[1], arg[4:])...) + _sub_amount(m, arg) + _asset_insert(m, arg[1], kit.Simple(kit.MDB_TYPE, "转出", kit.MDB_NAME, arg[3], arg[4:])...) + }}, + BONUS: {Name: "bonus account name amount time@date text", Help: "收入", Hand: func(m *ice.Message, arg ...string) { + _asset_insert(m, arg[1], kit.Simple(kit.MDB_TYPE, "收入", arg[2:])...) + }}, + CHECK: {Name: "check", Help: "核算", Hand: func(m *ice.Message, arg ...string) { + if m.Option(ACCOUNT) == "" { + m.Cmd(ASSET).Table(func(index int, value map[string]string, head []string) { + _asset_check(m, value[ACCOUNT]) + }) + m.ProcessRefresh30ms() + } else { + _asset_check(m, m.Option(ACCOUNT)) + } + m.Toast("核算成功") + }}, + }, mdb.ZoneAction(), ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Fields(len(arg), "time,account,amount,count", m.Config(kit.MDB_FIELD)) + amount, count := 0, 0 + if mdb.ZoneSelect(m, arg...); len(arg) == 0 { + m.PushAction(CHECK) + m.SortIntR(AMOUNT) + + m.Table(func(index int, value map[string]string, head []string) { + amount += kit.Int(value[AMOUNT]) + count += kit.Int(value[COUNT]) + }) + + } else { + m.PushAction(mdb.PLUGIN) + + m.Table(func(index int, value map[string]string, head []string) { + amount += kit.Int(value[AMOUNT]) + count++ + }) + } + m.StatusTime(COUNT, count, AMOUNT, amount) + }}, + }}) } diff --git a/core/mall/mall.go b/core/mall/mall.go index 05e16c28..e9fd4004 100644 --- a/core/mall/mall.go +++ b/core/mall/mall.go @@ -7,13 +7,6 @@ import ( const MALL = "mall" -var Index = &ice.Context{Name: MALL, Help: "贸易中心", Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Load() - }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Save() - }}, -}} +var Index = &ice.Context{Name: MALL, Help: "贸易中心"} func init() { web.Index.Register(Index, nil, ASSET, SALARY) } diff --git a/core/mall/salary.go b/core/mall/salary.go index 81f81af4..bcdd90d0 100644 --- a/core/mall/salary.go +++ b/core/mall/salary.go @@ -14,37 +14,22 @@ const ( const SALARY = "salary" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - SALARY: {Name: SALARY, Help: "工资", Value: kit.Data( - kit.MDB_SHORT, MONTH, kit.MDB_FIELD, "time,month,company,amount,income,tax", - )}, - }, - Commands: map[string]*ice.Command{ - SALARY: {Name: "salary month auto create", Help: "工资", Action: map[string]*ice.Action{ - mdb.CREATE: {Name: "create company month amount income tax 公积金 养老保险 医疗保险 生育保险 工伤保险 失业保险 企业公积金 企业养老保险 企业医疗保险 企业生育保险 企业工伤保险 企业失业保险", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(SALARY), "", mdb.HASH, arg) - }}, - mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, m.Prefix(SALARY), "", mdb.HASH, m.OptionSimple(MONTH), arg) - }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, m.Prefix(SALARY), "", mdb.HASH, m.OptionSimple(MONTH)) - }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INPUTS, m.Prefix(SALARY), "", mdb.HASH, arg) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(len(arg), m.Conf(SALARY, kit.META_FIELD)) - m.Cmdy(mdb.SELECT, m.Prefix(SALARY), "", mdb.HASH, MONTH, arg) - amount, income, tax := 0, 0, 0 - m.Table(func(index int, value map[string]string, head []string) { - amount += kit.Int(value[AMOUNT]) - income += kit.Int(value[INCOME]) - tax += kit.Int(value[TAX]) - }) - m.StatusTime(AMOUNT, amount, INCOME, income, TAX, tax) - }}, - }, - }) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + SALARY: {Name: SALARY, Help: "工资", Value: kit.Data( + kit.MDB_SHORT, MONTH, kit.MDB_FIELD, "month,company,amount,income,tax", + )}, + }, Commands: map[string]*ice.Command{ + SALARY: {Name: "salary month auto create", Help: "工资", Action: ice.MergeAction(map[string]*ice.Action{ + mdb.CREATE: {Name: "create month company amount income tax 公积金 养老保险 医疗保险 生育保险 工伤保险 失业保险 企业公积金 企业养老保险 企业医疗保险 企业生育保险 企业工伤保险 企业失业保险", Help: "添加"}, + }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + mdb.HashSelect(m, arg...) + amount, income, tax := 0, 0, 0 + m.Table(func(index int, value map[string]string, head []string) { + amount += kit.Int(value[AMOUNT]) + income += kit.Int(value[INCOME]) + tax += kit.Int(value[TAX]) + }) + m.StatusTime(AMOUNT, amount, INCOME, income, TAX, tax) + }}, + }}) } diff --git a/core/team/count.go b/core/team/count.go index 7dc62168..3c8a0ed3 100644 --- a/core/team/count.go +++ b/core/team/count.go @@ -13,14 +13,15 @@ const COUNT = "count" func init() { Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ - COUNT: {Name: "count begin_time@date end_time@date auto insert", Help: "倒计时", Meta: kit.Dict(ice.Display(COUNT)), Action: map[string]*ice.Action{ + COUNT: {Name: "count begin_time@date end_time@date auto insert", Help: "倒计时", Meta: kit.Dict( + ice.Display(""), + ), Action: ice.MergeAction(map[string]*ice.Action{ mdb.INSERT: {Name: "insert zone type=once,step,week name text begin_time@date close_time@date", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TASK, mdb.INSERT, arg) }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + }, TASK), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { begin_time, end_time := _task_scope(m, 8, append([]string{LONG}, arg...)...) msg := _plan_list(m.Spawn(), begin_time, end_time) - // m.PushPodCmd(COUNT, arg...) msg.SortTime(BEGIN_TIME) tz := int64(8) diff --git a/core/team/count.js b/core/team/count.js index 8c78ac36..c094b118 100644 --- a/core/team/count.js +++ b/core/team/count.js @@ -1,20 +1,19 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can.onmotion.clear(can) can.onappend.table(can, msg) - can.onappend.board(can, msg.Result()) + can.onappend.board(can, msg) can.base.isFunc(cb) && cb(msg) - can.onappend.style(can) }, -}) -Volcanos("onaction", {help: "控件交互", list: ["播放"], - "播放": function(event, can) { +}, [""]) +Volcanos("onaction", {help: "控件交互", list: ["play"], + play: function(event, can) { can.page.Select(can, can._output, "div.item", function(item) { can.onmotion.hidden(can, item) }) can.core.Next(can.page.Select(can, can._output, "div.item"), function(item, next) { can.onmotion.show(can, 300, next, item) }, function() { - can.user.toast(can, "播放结束", can.Option("zone")) + can.user.toast(can, "播放结束") }) }, }) diff --git a/core/team/plan.css b/core/team/plan.css new file mode 100644 index 00000000..dbab07fa --- /dev/null +++ b/core/team/plan.css @@ -0,0 +1,30 @@ +fieldset.plan>div.output div.prepare { + background-color:blue; + color:white; +} +fieldset.plan>div.output div.process { + background-color:green; + color:white; +} +fieldset.plan>div.output div.cancel { + background-color:yellow; + color:white; +} +fieldset.plan>div.output div.finish { + background-color:red; + color:white; +} + +fieldset.plan>div.output td { + vertical-align:top; +} +fieldset.plan>div.output td.over { + border:solid 2px red; +} +fieldset.plan>div.output td div.date { + color:gray; +} +fieldset.plan>div.output div.project { + max-height:400px; + overflow:auto; +} diff --git a/core/team/plan.go b/core/team/plan.go index 851726cd..2a0ad3b2 100644 --- a/core/team/plan.go +++ b/core/team/plan.go @@ -9,11 +9,43 @@ import ( kit "shylinux.com/x/toolkits" ) +func _task_scope(m *ice.Message, tz int, arg ...string) (time.Time, time.Time) { + begin_time := time.Now() + if len(arg) > 1 { + begin_time, _ = time.ParseInLocation(ice.MOD_TIME, arg[1], time.Local) + } + + begin_time = begin_time.Add(time.Duration(tz) * time.Hour) + begin_time = begin_time.Add(-time.Duration(begin_time.UnixNano()) % (24 * time.Hour)) + begin_time = begin_time.Add(-time.Duration(tz) * time.Hour) + + end_time := begin_time + switch kit.Select(WEEK, arg, 0) { + case DAY: + end_time = begin_time.AddDate(0, 0, 1) + case WEEK: + begin_time = begin_time.AddDate(0, 0, -int(begin_time.Weekday())) + end_time = begin_time.AddDate(0, 0, 7) + case MONTH: + begin_time = begin_time.AddDate(0, 0, -begin_time.Day()+1) + end_time = begin_time.AddDate(0, 1, 0) + case YEAR: + begin_time = begin_time.AddDate(0, 0, -begin_time.YearDay()+1) + end_time = begin_time.AddDate(1, 0, 0) + case LONG: + begin_time = begin_time.AddDate(0, 0, -begin_time.YearDay()+1) + begin_time = begin_time.AddDate(-30, 0, 0) + end_time = begin_time.AddDate(60, 0, 0) + } + + return begin_time, end_time +} func _plan_list(m *ice.Message, begin_time, end_time time.Time) *ice.Message { m.Option(ice.CACHE_LIMIT, "100") m.Fields(0, "begin_time,close_time,zone,id,level,status,score,type,name,text,extra") m.Option(kit.Keycb(mdb.SELECT), func(key string, fields []string, value, val map[string]interface{}) { begin, _ := time.ParseInLocation(ice.MOD_TIME, kit.Format(value[BEGIN_TIME]), time.Local) + m.Debug("what %v %v", begin_time, begin) if begin_time.After(begin) || begin.After(end_time) { return } @@ -25,43 +57,34 @@ func _plan_list(m *ice.Message, begin_time, end_time time.Time) *ice.Message { } const ( - BEGIN = "begin" - END = "end" + DAY = "day" + WEEK = "week" + MONTH = "month" + YEAR = "year" + LONG = "long" ) const PLAN = "plan" func init() { - Index.Merge(&ice.Context{ - Commands: map[string]*ice.Command{ - PLAN: {Name: "plan scale=week,day,week,month,year,long begin_time@date place@province auto insert export import", Help: "计划", Meta: kit.Dict( - ice.Display("/plugin/local/team/plan.js", PLAN), - ), Action: map[string]*ice.Action{ - mdb.INSERT: {Name: "insert zone type=once,step,week name text begin_time@date close_time@date", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(TASK, mdb.INSERT, arg) - m.ProcessRefresh30ms() - }}, - mdb.MODIFY: {Name: "task modify", Help: "编辑"}, - mdb.EXPORT: {Name: "task export", Help: "导出"}, - mdb.IMPORT: {Name: "task import", Help: "导入"}, - mdb.INPUTS: {Name: "task inputs", Help: "补全"}, - - mdb.PLUGIN: {Name: "plugin extra.ctx extra.cmd extra.arg", Help: "插件", Hand: func(m *ice.Message, arg ...string) { - _task_modify(m, arg[0], arg[1], arg[2:]...) - m.ProcessRefresh30ms() - }}, - ctx.COMMAND: {Name: "command", Help: "命令"}, - ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(arg) - }}, - - BEGIN: {Name: "task begin", Help: "开始"}, - END: {Name: "task end", Help: "结束"}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - begin_time, end_time := _task_scope(m, 8, arg...) - _plan_list(m, begin_time, end_time) - m.PushPodCmd(PLAN, arg...) + Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ + PLAN: {Name: "plan scale=week,day,week,month,year,long begin_time@date place@province auto insert export import", Help: "计划", Meta: kit.Dict( + ice.Display(""), + ), Action: ice.MergeAction(map[string]*ice.Action{ + mdb.PLUGIN: {Name: "plugin extra.ctx extra.cmd extra.arg", Help: "插件", Hand: func(m *ice.Message, arg ...string) { + _task_modify(m, arg[0], arg[1], arg[2:]...) }}, - }, - }) + ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { + msg := m.Cmd(TASK, arg[0], arg[1]) + args := kit.Simple(kit.Keys(msg.Append("extra.pod"), msg.Append("extra.cmd")), arg[2:]) + if !m.PodCmd(args) { + m.Cmdy(args) + } + }}, + }, TASK, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + begin_time, end_time := _task_scope(m, 8, arg...) + _plan_list(m, begin_time, end_time) + m.PushPodCmd(PLAN, arg...) + }}, + }}) } diff --git a/core/team/plan.js b/core/team/plan.js new file mode 100644 index 00000000..c31d9bc7 --- /dev/null +++ b/core/team/plan.js @@ -0,0 +1,208 @@ +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + can.onmotion.clear(can, target) + can.ui = can.onlayout.profile(can) + can.onmotion.hidden(can, can._action) + can.onimport[can.Option("scale")||"week"](can, msg) + can.page.Modify(can, can.ui.project, {style: {"max-height": can.ui.content.offsetHeight}}) + can.page.Modify(can, can.ui.profile, {style: {"max-height": can.ui.content.offsetHeight}}) + can.page.Modify(can, can.ui.profile, {style: {display: "block"}}) + can.base.isFunc(cb) && cb(msg) + }, + _content: function(can, msg, head, list, key, get, set) { + var hash = {}; msg.Table(function(value, index) { + var k = key(can.base.Date(value.begin_time)); hash[k] = (hash[k]||[]).concat([value]) + }) + + can.sup.task && (can.sup.task._target = null) + var begin_time = can.base.Date(can.Option("begin_time")) + can.page.Append(can, can.ui.content, [{view: [chat.CONTENT, html.TABLE], list: can.core.List(list, function(hour, row) { + return {type: html.TR, list: can.core.List(head, function(week, col) { + if (row == 0) { return {text: [week, html.TH]} } + if (col == 0) { return {text: [hour, html.TD]} } + return can.onimport._task(can, msg, get(begin_time, col, row, hash), set(begin_time, col, row)) + })} + }) }]) + can.core.Timer(10, function() { + var target = can.sup.task._target||can.sup.task._target + can.sup.task = null, target.click() + can.Status("count", msg.Length()) + }) + }, + _task: function(can, msg, list, time) { return {text: ["", html.TD], + ondblclick: function(event) { + can.onaction.insertTask(event, can, time+can.base.Time(null, "%y-%m-%d %H:%M:%S").slice(time.length)) + }, + ondrop: function(event) { event.preventDefault() + can.drop(event, event.target, time) + }, + ondragover: function(event) { event.preventDefault() + can.page.Select(can, can.ui.content, html.TD, function(item) { + can.page.ClassList[event.target == item? "add": "del"](can, item, "over") + }) + }, + list: can.core.List(list, function(task) { return can.base.isString(task)? {text: [task, html.DIV, "date"]}: + {text: [can.onexport[can.Action("view")||"text"](can, task), html.DIV, can.onexport.style(can, task)], + ondragstart: function(event) { var target = event.target; can.drop = function(event, td, time) { td.append(target) + can.onaction.modifyTask(event, can, task, "begin_time", time+task.begin_time.slice(time.length), task.begin_time) + } }, draggable: time != undefined, + + title: can.onexport.title(can, task), _init: function(target) { + var item = can.onappend.item(can, html.ITEM, {nick: task.name+":"+task.text}, function() { + can.core.Timer(10, function() { can.onmotion.select(can, can.ui.content, html.TD, target.parentNode) }) + can.onimport._profile(can, task) + }, function() { + + }, can.ui.project); task._target = target, can.task = can.task||task, can.sup.task = can.sup.task||task + can.sup.task.zone == task.zone && can.sup.task.id == task.id && (can.sup.task._target = target) + target.onclick = function(event) { item.click() } + }, + } + }), + } }, + _profile: function(can, task) { + function keys(task, key) { return [task.pod, task.zone, task.id, key].join(".") } + + if (can.sup.task) { if (can.sup.task.id == task.id) { return } + can.page.Cache(keys(can.sup.task, chat.PROFILE), can.ui.profile, can.sup.task.id) + can.page.Cache(keys(can.sup.task, chat.DISPLAY), can.ui.display, can.sup.task.id) + } + + can.sup.task = task, can.Status(task) + var profile = can.page.Cache(keys(task, "profile"), can.ui.profile) + var display = can.page.Cache(keys(task, "display"), can.ui.display) + if (profile || display) { return } + + task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task["extra."+key] = value }), delete(task.extra) + var table = can.page.Appends(can, can.ui.profile, [{view: [chat.CONTENT, html.TABLE], list: [{th: ["key", "value"]}]}]).first + can.core.Item(task, function(key, value) { key != "_target" && can.page.Append(can, table, [{ + td: [key, key == "pod" && value != ""? can.page.Format("a", can.user.MergeURL(can, {pod: value}), value): value], + onclick: function(event) { if (event.target.type == "button") { var msg = can.request(event, can.sup.task) + can.run(event, [ctx.ACTION, event.target.name], function(msg) { can.Update() }, true) + } }, + ondblclick: function(event) { can.onmotion.modify(can, event.target, function(ev, value, old) { + can.onaction.modifyTask(event, can, task, key, value) + }) }, + }]) }), can.onimport._display(can, task) + }, + _display: function(can, task) { if (!task["extra.cmd"]) { return } + can.onappend.plugin(can, {type: "story", ctx: task["extra.ctx"], cmd: task["extra.cmd"], arg: task["extra.arg"]}, function(sub, meta) { + sub.run = function(event, cmds, cb) { var msg = can.request(event, {"task.zone": task.zone, "task.id": task.id}) + can.run(event, can.misc.Concat([ctx.ACTION, cli.RUN, task["zone"], task["id"]], cmds), cb, true) + } + }, can.ui.display) + can.page.Modify(can, can.ui.display, {style: {display: "block"}}) + }, + + day: function(can, msg) { + var head = ["hour", "task"] + var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) } + + function key(time) { return can.base.Number(time.getHours(), 2) } + function get(begin_time, col, row, hash) { return hash[list[row]] } + function set(begin_time, col, row) { return can.base.Time(begin_time, "%y-%m-%d ")+list[row] } + + can.onimport._content(can, msg, head, list, key, get, set) + }, + week: function(can, msg) { + var head = ["hour"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]) + var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) } + + function key(time) { return time.getDay()+" "+can.base.Number(time.getHours(), 2) } + function get(begin_time, col, row, hash) { return hash[col-1+" "+list[row]] } + function set(begin_time, col, row) { return can.base.Time(can.base.TimeAdd(begin_time, -begin_time.getDay()+col-1), "%y-%m-%d ")+list[row] } + + can.onimport._content(can, msg, head, list, key, get, set) + }, + month: function(can, msg) { + var head = ["order"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]) + var list = [0]; for (var i = 1; i < 6; i++) { list.push(i) } + + function key(time) { return can.base.Time(time, "%y-%m-%d") } + function get(begin_time, col, row, hash) { + var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)) + var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay()) + var day = can.base.TimeAdd(last, (row-1)*7+col) + return [day.getDate()+""].concat(hash[key(day)]||[]) + } + function set(begin_time, col, row) { + var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)) + var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay()) + var day = can.base.TimeAdd(last, (row-1)*7+col) + return key(day) + } + + can.onimport._content(can, msg, head, list, key, get, set) + }, + year: function(can, msg) { + var head = ["month"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]); + var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) } + + function key(time) { return can.base.Time(time, "%y-%m ")+time.getDay() } + function get(begin_time, col, row, hash) { return hash[begin_time.getFullYear()+"-"+can.base.Number(row, 2)+" "+(col-1)] } + function set(begin_time, col, row) { return begin_time.getFullYear()+"-"+can.base.Number(list[row], 2) } + + can.onimport._content(can, msg, head, list, key, get, set) + }, + long: function(can, msg) { + var begin_time = can.base.Date(can.base.Time(can.Option("begin_time"), "%y-%m-%d %H:%M:%S")) + var begin = begin_time.getFullYear() - 5 + + var head = ["month"]; for (var i = 0; i < 10; i++) { head.push(begin+i) } + var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) } + + function key(time) { return can.base.Time(time, "%y-%m") } + function get(begin_time, col, row, hash) { return hash[begin+col-1+"-"+can.base.Number(row, 2)] } + function set(begin_time, col, row) { return begin+col-1+"-"+can.base.Number(row, 2) } + + can.onimport._content(can, msg, head, list, key, get, set) + }, +}, [""]) +Volcanos("onaction", {help: "组件交互", list: [ + ["level", "all", "l1", "l2", "l3", "l4", "l5"], + ["status", "all", "prepare", "process", "cancel", "finish"], + ["score", "all", "s1", "s2", "s3", "s4", "s5"], + ["view", "", "name", "text", "level", "score"], + ], + insertTask: function(event, can, time) { var msg = can.sup.request(event, {begin_time: time}) + can.user.input(event, can, can.Conf("feature.insert"), function(event, button, data, list) { + can.run(event, can.base.Simple(ctx.ACTION, mdb.INSERT, "begin_time", time, data)) + }) + }, + modifyTask: function(event, can, task, key, value) { var msg = can.request(event, task) + can.run(event, [ctx.ACTION, mdb.MODIFY, key, value, task[key]]) + }, + + _filter: function(event, can, key, value) { var count = 0 + if (value == "all") { + can.page.Select(can, can.ui.content, "div.item", function(item) { + can.page.ClassList.del(can, item, "hidden"), count++ + }) + } else { + can.page.Select(can, can.ui.content, "div.item", function(item) { + can.page.ClassList.add(can, item, "hidden") + }) + can.page.Select(can, can.ui.content, "div."+value, function(item) { + can.page.ClassList.del(can, item, "hidden"), count++ + }) + } + can.Action(key, value), can.Status("count", count) + }, + level: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, + status: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, + score: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, + view: function(event, can, key, value) { + can.Action(key, value) + can.onmotion.clear(can, can.ui.project) + can.onmotion.clear(can, can.ui.content) + can.onimport[can.Option("scale")](can, can._msg) + }, +}) +Volcanos("onexport", {help: "导出数据", list: ["count", "begin_time", "zone", "id", "type", "name", "text"], + name: function(can, task) { return task.name }, + text: function(can, task) { return task.name+": "+(task.text||"") }, + level: function(can, task) { return "l-"+(task.level||3)+": "+(task.name||"") }, + score: function(can, task) { return "s-"+(task.level||3)+": "+(task.name||"") }, + title: function(can, task) { return task.zone+": "+(task.type||"") }, + style: function(can, task) { return ["item", task.status, "id"+task.id, "l"+(task.level||""), "s"+(task.score||"")].join(" ") }, +}) + diff --git a/core/team/task.go b/core/team/task.go index 9bfaa93e..cf29bcbb 100644 --- a/core/team/task.go +++ b/core/team/task.go @@ -2,7 +2,6 @@ package team import ( "strings" - "time" ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/cli" @@ -10,56 +9,15 @@ import ( kit "shylinux.com/x/toolkits" ) -func _task_scope(m *ice.Message, tz int, arg ...string) (time.Time, time.Time) { - begin_time := time.Now() - if len(arg) > 1 { - begin_time, _ = time.ParseInLocation(ice.MOD_TIME, arg[1], time.Local) - } - - begin_time = begin_time.Add(time.Duration(tz) * time.Hour) - begin_time = begin_time.Add(-time.Duration(begin_time.UnixNano()) % (24 * time.Hour)) - begin_time = begin_time.Add(-time.Duration(tz) * time.Hour) - - end_time := begin_time - switch kit.Select(WEEK, arg, 0) { - case DAY: - end_time = begin_time.AddDate(0, 0, 1) - case WEEK: - begin_time = begin_time.AddDate(0, 0, -int(begin_time.Weekday())) - end_time = begin_time.AddDate(0, 0, 7) - case MONTH: - begin_time = begin_time.AddDate(0, 0, -begin_time.Day()+1) - end_time = begin_time.AddDate(0, 1, 0) - case YEAR: - begin_time = begin_time.AddDate(0, 0, -begin_time.YearDay()+1) - end_time = begin_time.AddDate(1, 0, 0) - case LONG: - begin_time = begin_time.AddDate(0, 0, -begin_time.YearDay()+1) - begin_time = begin_time.AddDate(-5, 0, 0) - end_time = begin_time.AddDate(10, 0, 0) - } - - return begin_time, end_time -} func _task_action(m *ice.Message, status interface{}, action ...string) string { switch status { case PREPARE: action = append(action, BEGIN) case PROCESS: action = append(action, END) - case CANCEL: - case FINISH: + case CANCEL, FINISH: } - return strings.Join(action, ",") -} - -func _task_create(m *ice.Message, zone string) { - m.Cmdy(mdb.INSERT, m.Prefix(TASK), "", mdb.HASH, kit.MDB_ZONE, zone) -} -func _task_insert(m *ice.Message, zone string, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(TASK), kit.KeyHash(zone), mdb.LIST, - BEGIN_TIME, m.Time(), CLOSE_TIME, m.Time("30m"), - STATUS, PREPARE, LEVEL, 3, SCORE, 3, arg) + return kit.Join(action) } func _task_modify(m *ice.Message, field, value string, arg ...string) { if field == STATUS { @@ -72,46 +30,11 @@ func _task_modify(m *ice.Message, field, value string, arg ...string) { } m.Cmdy(mdb.MODIFY, m.Prefix(TASK), "", mdb.ZONE, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID), field, value, arg) } -func _task_inputs(m *ice.Message, field, value string) { - if cli.Inputs(m, field) { - return - } - - switch strings.TrimPrefix(field, "extra.") { - case kit.MDB_ZONE: - m.Cmdy(mdb.INPUTS, m.Prefix(TASK), "", mdb.HASH, field, value) - default: - m.Cmdy(mdb.INPUTS, m.Prefix(TASK), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.LIST, field, value) - } -} -func _task_search(m *ice.Message, kind, name, text string) { - m.Cmd(mdb.SELECT, m.Prefix(TASK), "", mdb.ZONE, kit.MDB_FOREACH, func(key string, value map[string]interface{}, val map[string]interface{}) { - if name != "" && !kit.Contains(value[kit.MDB_NAME], name) { - return - } - if kind == TASK { - m.PushSearch(ice.CMD, TASK, - kit.MDB_ZONE, val[kit.MDB_ZONE], kit.MDB_ID, kit.Format(value[kit.MDB_ID]), - value) - } else { - m.PushSearch(ice.CMD, TASK, - kit.MDB_TYPE, val[kit.MDB_ZONE], kit.MDB_NAME, kit.Format(value[kit.MDB_ID]), - kit.MDB_TEXT, kit.Format("%v:%v", value[kit.MDB_NAME], value[kit.MDB_TEXT]), - value) - } - }) -} const ( // type ONCE = "once" STEP = "step" -) -const ( // scale - DAY = "day" - WEEK = "week" - MONTH = "month" - YEAR = "year" - LONG = "long" + // WEEK = "week" ) const ( // status PREPARE = "prepare" @@ -120,80 +43,81 @@ const ( // status FINISH = "finish" ) const ( // key - SCALE = "scale" - LEVEL = "level" - STATUS = "status" - SCORE = "score" - BEGIN_TIME = "begin_time" CLOSE_TIME = "close_time" + + STATUS = "status" + LEVEL = "level" + SCORE = "score" +) +const ( + BEGIN = "begin" + END = "end" ) const TASK = "task" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - TASK: {Name: TASK, Help: "任务", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_ZONE, kit.MDB_FIELD, "begin_time,id,status,level,score,type,name,text", - )}, - }, - Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - // m.Cmd(mdb.SEARCH, mdb.CREATE, TASK, m.Prefix(TASK)) - }}, - TASK: {Name: "task zone id auto insert export import", Help: "任务", Action: ice.MergeAction(map[string]*ice.Action{ - mdb.INSERT: {Name: "insert zone type=once,step,week name text begin_time@date close_time@date", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - _task_create(m, arg[1]) - _task_insert(m, arg[1], arg[2:]...) - }}, - mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - _task_modify(m, arg[0], arg[1]) - }}, - mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - _task_modify(m, STATUS, CANCEL) - }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, m.Prefix(TASK), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) - }}, - mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - m.OptionFields(kit.MDB_ZONE, "time,id,type,name,text,level,status,score,begin_time,close_time,extra") - m.Cmdy(mdb.EXPORT, m.Prefix(TASK), "", mdb.ZONE) - }}, - mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - m.OptionFields(kit.MDB_ZONE) - m.Cmdy(mdb.IMPORT, m.Prefix(TASK), "", mdb.ZONE) - m.ProcessRefresh30ms() - }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - _task_inputs(m, kit.Select("", arg, 0), kit.Select("", arg, 1)) - }}, - mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { - if arg[0] == TASK || arg[0] == kit.MDB_FOREACH { - _task_search(m, arg[0], arg[1], arg[2]) - m.PushPodCmd(TASK, kit.Simple(mdb.SEARCH, arg)...) - } - }}, - - BEGIN: {Name: "begin", Help: "开始", Hand: func(m *ice.Message, arg ...string) { - _task_modify(m, STATUS, PROCESS) - }}, - END: {Name: "end", Help: "完成", Hand: func(m *ice.Message, arg ...string) { - _task_modify(m, STATUS, FINISH) - }}, - }, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(len(arg), "time,zone,count", m.Conf(TASK, kit.META_FIELD)) - if m.Cmdy(mdb.SELECT, m.Prefix(TASK), "", mdb.ZONE, arg); len(arg) == 0 { - m.PushAction(mdb.REMOVE) - } else { - status := map[string]int{} - m.Table(func(index int, value map[string]string, head []string) { - m.PushButton(_task_action(m, value[STATUS])) - status[value[kit.MDB_STATUS]]++ - }) - m.Status(status) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + TASK: {Name: TASK, Help: "任务", Value: kit.Data( + kit.MDB_SHORT, kit.MDB_ZONE, kit.MDB_FIELD, "begin_time,id,status,level,score,type,name,text", + )}, + }, Commands: map[string]*ice.Command{ + TASK: {Name: "task zone id auto insert export import", Help: "任务", Action: ice.MergeAction(map[string]*ice.Action{ + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + if cli.Inputs(m, arg[0]) { + return } + if arg[0] == m.Conf(TASK, kit.Keym(kit.MDB_SHORT)) { + m.Cmdy(mdb.INPUTS, m.Prefix(TASK), "", mdb.HASH, arg[0], arg[1:]) + return + } + m.Cmdy(mdb.INPUTS, m.Prefix(TASK), "", mdb.ZONE, m.Option(kit.MDB_ZONE), strings.TrimPrefix(arg[0], "extra."), arg[1:]) }}, - }, - }) + mdb.INSERT: {Name: "insert zone type=once,step,week name text begin_time@date close_time@date", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, m.Prefix(TASK), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) + m.Cmdy(mdb.INSERT, m.Prefix(TASK), "", mdb.ZONE, m.Option(kit.MDB_ZONE), + BEGIN_TIME, m.Time(), CLOSE_TIME, m.Time("30m"), + STATUS, PREPARE, LEVEL, 3, SCORE, 3, arg) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + _task_modify(m, arg[0], arg[1]) + m.ProcessRefresh30ms() + }}, + mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + _task_modify(m, STATUS, CANCEL) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, m.Prefix(TASK), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) + }}, + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.OptionFields(kit.MDB_ZONE, "time,id,type,name,text,level,status,score,begin_time,close_time,extra") + m.Cmdy(mdb.EXPORT, m.Prefix(TASK), "", mdb.ZONE) + m.ProcessRefresh30ms() + }}, + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + m.OptionFields(kit.MDB_ZONE) + m.Cmdy(mdb.IMPORT, m.Prefix(TASK), "", mdb.ZONE) + m.ProcessRefresh30ms() + }}, + + BEGIN: {Name: "begin", Help: "开始", Hand: func(m *ice.Message, arg ...string) { + _task_modify(m, STATUS, PROCESS) + }}, + END: {Name: "end", Help: "完成", Hand: func(m *ice.Message, arg ...string) { + _task_modify(m, STATUS, FINISH) + }}, + }, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if mdb.ZoneSelect(m, arg...); len(arg) == 0 { + m.PushAction(mdb.REMOVE) + } else { + status := map[string]int{} + m.Table(func(index int, value map[string]string, head []string) { + m.PushButton(_task_action(m, value[STATUS])) + status[value[kit.MDB_STATUS]]++ + }) + m.Status(status) + } + }}, + }}) } diff --git a/core/team/team.go b/core/team/team.go index 07a8e9a7..fd87052b 100644 --- a/core/team/team.go +++ b/core/team/team.go @@ -7,13 +7,6 @@ import ( const TEAM = "team" -var Index = &ice.Context{Name: TEAM, Help: "团队中心", Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Load() - }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Save() - }}, -}} +var Index = &ice.Context{Name: TEAM, Help: "团队中心"} func init() { web.Index.Register(Index, nil, TASK, PLAN) } diff --git a/misc.go b/misc.go index 6bc39c3c..e4bafd7a 100644 --- a/misc.go +++ b/misc.go @@ -212,13 +212,6 @@ func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Mess return m } func (c *Context) _cmd(m *Message, cmd *Command, key string, k string, h *Action, arg ...string) *Message { - if k == "command" && h.Hand == nil { - for _, cmd := range arg { - m.Cmdy("command", cmd) - } - return m - } - if k == RUN && !m.Right(arg) { return m } @@ -319,20 +312,31 @@ func Display(file string, arg ...string) map[string]string { } return map[string]string{"display": file, kit.MDB_STYLE: kit.Join(arg, " ")} } -func MergeAction(list ...map[string]*Action) map[string]*Action { +func MergeAction(list ...interface{}) map[string]*Action { if len(list) == 0 { return nil } + base := list[0].(map[string]*Action) for _, item := range list[1:] { - for k, v := range item { - if h, ok := list[0][k]; !ok { - list[0][k] = v - } else if h.Hand == nil { - h.Hand = v.Hand + switch item := item.(type) { + case map[string]*Action: + for k, v := range item { + if h, ok := base[k]; !ok { + base[k] = v + } else if h.Hand == nil { + h.Hand = v.Hand + } } + case string: + base[CTX_INIT] = &Action{Hand: func(m *Message, arg ...string) { + m.Search(item, func(p *Context, s *Context, key string, cmd *Command) { + MergeAction(base, cmd.Action) + m.target.Merge(m.target) + }) + }} } } - return list[0] + return base } func SelectAction(list map[string]*Action, fields ...string) map[string]*Action { if len(fields) == 0 {