diff --git a/src/gonganxitong/allow.go b/src/gonganxitong/allow.go index 6d82128..bf6799b 100644 --- a/src/gonganxitong/allow.go +++ b/src/gonganxitong/allow.go @@ -32,7 +32,7 @@ func (s allow) List(m *ice.Message, arg ...string) { ) if len(arg) == 1 { s.Table.Select(m, s.Key(s, model.USER_UID), m.Option(model.USER_UID), model.PLACE_UID, arg[0]) - defer m.Sort(kit.Fields(model.ALLOW_STATUS, model.CREATED_AT), []string{OrderCreate.String(), OrderApproved.String(), OrderRejected.String()}, ice.STR_R) + defer m.Sort(kit.Fields(model.ALLOW_STATUS, model.CREATED_AT), []string{AllowCreate.String(), AllowApproved.String(), AllowRejected.String()}, ice.STR_R) } else if len(arg) == 2 { s.Table.SelectDetail(m, s.Key(s, model.USER_UID), m.Option(model.USER_UID), model.PLACE_UID, arg[0], s.Key(s.apply, model.UID), arg[1]) } else { @@ -40,40 +40,37 @@ func (s allow) List(m *ice.Message, arg ...string) { } s.RenameAppend(m, model.PLACE_UID, s.Keys(s.Place, model.UID)).SelectJoin(m, s.Place, model.NAME, model.TYPE) m.Table(func(value ice.Maps) { - if OrderStatus(kit.Int(value[model.ALLOW_STATUS])) == OrderCreate { + if AllowStatus(kit.Int(value[model.ALLOW_STATUS])) == AllowCreate { m.PushButton(s.Reject, s.Approve) } else { + s.DoneMessage(m) m.PushButton() } }).Action() } func (s allow) Reject(m *ice.Message, arg ...string) { - defer m.ToastProcess()() - if s.changeStatus(m, OrderCreate, OrderRejected); m.IsErr() { - return - } - m.Cmdy(m.Prefix("apply"), s.apply.Reject, m.Option(model.UID)).ProcessRefresh() - s.RecordEvent(m, kit.JoinWord("❌", m.Trans("order rejected", "审批驳回"), s.TransRole(m), m.Option(model.USER_NAME)), m.Option(model.UID)) - s.sendTemplate(m, m.Trans("role order rejected", "权限审批 已驳回")) - s.DoneMessage(m) + s.process(m, AllowCreate, AllowRejected, m.Trans("role order rejected", "权限审批 已驳回")) } func (s allow) Approve(m *ice.Message, arg ...string) { + s.process(m, AllowCreate, AllowApproved, m.Trans("role allow approved", "权限审批 已通过")) +} +func (s allow) process(m *ice.Message, from, to AllowStatus, title string) { defer m.ToastProcess()() - if s.changeStatus(m, OrderCreate, OrderApproved); m.IsErr() { + if s.changeStatus(m, from, to); m.IsErr() { return } - m.Cmdy(m.Prefix("apply"), s.apply.Approve, m.Option(model.UID)).ProcessRefresh() - s.RecordEvent(m, "", kit.JoinWord("✅", m.Trans("order approved", "审批通过"), s.TransRole(m), m.Option(model.USER_NAME)), m.Option(model.UID)) - s.sendTemplate(m, m.Trans("role order approved", "权限审批 已通过")) + m.Cmdy(m.Prefix("apply"), m.ActionKey(), m.Option(model.UID)).ProcessRefresh() + s.RecordEvent(m, "", kit.JoinWord("✅", title, kit.Cut(m.Option(model.UID), 6), s.TransRole(m), m.Option(model.USER_NAME)), m.Option(model.UID)) s.DoneMessage(m) + // s.sendTemplate(m, title) } func init() { ice.TeamCtxCmd(allow{Table: newTable()}) } -func (s allow) changeStatus(m *ice.Message, from, todo OrderStatus, arg ...string) *ice.Message { +func (s allow) changeStatus(m *ice.Message, from, todo AllowStatus, arg ...string) *ice.Message { msg := s.Table.Select(m.Spawn(), model.UID, m.Option(model.ALLOW_UID), model.USER_UID, m.Option(model.USER_UID)) if !m.WarnNotFound(msg.Length() == 0, m.Option(model.UID)) { - if status := OrderStatus(kit.Int(msg.Append(model.STATUS))); !m.WarnNotValid(status != from, status.String()) { + if status := AllowStatus(kit.Int(msg.Append(model.STATUS))); !m.WarnNotValid(status != from, status.String()) { s.Table.Update(m, kit.Dict(model.STATUS, todo), model.UID, m.Option(model.ALLOW_UID)) } } @@ -84,18 +81,18 @@ func (s allow) sendTemplate(m *ice.Message, info string) *ice.Message { return m } -type OrderStatus int +type AllowStatus int const ( - OrderCreate OrderStatus = iota - OrderRejected - OrderApproved + AllowCreate AllowStatus = iota + AllowRejected + AllowApproved ) -var OrderStatusList = map[OrderStatus]string{ - OrderCreate: "create", - OrderRejected: "rejected", - OrderApproved: "approved", +var AllowStatusList = map[AllowStatus]string{ + AllowCreate: "create", + AllowRejected: "rejected", + AllowApproved: "approved", } -func (s OrderStatus) String() string { return OrderStatusList[s] } +func (s AllowStatus) String() string { return AllowStatusList[s] } diff --git a/src/gonganxitong/apply.go b/src/gonganxitong/apply.go index 8119d70..62917ac 100644 --- a/src/gonganxitong/apply.go +++ b/src/gonganxitong/apply.go @@ -48,6 +48,8 @@ func (s apply) List(m *ice.Message, arg ...string) { switch ApplyStatus(kit.Int(m.Append(model.APPLY_STATUS))) { case ApplySubmit: m.EchoQRCode(Portal{}.Link(m, arg[0], ice.GetTypeKey(allow{}), arg[1])) + case ApplyRejected, ApplyApproved: + s.DoneMessage(m) } } else { return @@ -82,7 +84,7 @@ func (s apply) Submit(m *ice.Message, arg ...string) { return } m.Option(model.FROM_USER_UID, m.Option(model.USER_UID)) - m.Cmd(allow{}, s.Create, msg.AppendSimple(model.USER_UID), model.APPLY_UID, m.Option(model.UID), model.STATUS, OrderCreate) + m.Cmd(m.Prefix("allow"), s.Create, msg.AppendSimple(model.USER_UID), model.APPLY_UID, m.Option(model.UID), model.STATUS, AllowCreate) s.RecordEvent(m, "", kit.Format("🕑 %s"+m.Trans(" apply submit", "权限申请提交"), s.TransRole(m)), m.Option(model.UID)) s.SendMessage(m, msg.Append(model.USER_UID), m.Option(model.USER_UID)) } diff --git a/src/gonganxitong/common.go b/src/gonganxitong/common.go index bec35c5..e6ad910 100644 --- a/src/gonganxitong/common.go +++ b/src/gonganxitong/common.go @@ -76,6 +76,10 @@ func (s Table) InputsListRole(m *ice.Message, list ice.Any, arg ...string) { } m.SortInt(arg[0]).DisplayInputKeyNameIconTitle() } +func (s Table) Create(m *ice.Message, arg ...string) { + s.Table.Create(m, arg...) + s.UserPlaceInit(m) +} func (s Table) List(m *ice.Message, arg ...string) { if m.IsTech() { if len(arg) == 0 { @@ -102,7 +106,9 @@ func (s Table) TablesWithRole(m *ice.Message, arg []string, userPlace UserPlacer } func (s Table) Select(m *ice.Message, arg ...string) *ice.Message { defer s.Display(m, "") - return s.Table.Select(m, arg...) + s.Table.Select(m, arg...) + kit.If(m.Length() > 0, func() { s.UserPlaceInit(m) }) + return m } func (s Table) SelectDetail(m *ice.Message, arg ...string) *ice.Message { defer s.Display(m, "") @@ -128,7 +134,7 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message { case model.APPLY_STATUS: value = ApplyStatus(kit.Int(value)).String() case model.ALLOW_STATUS: - value = OrderStatus(kit.Int(value)).String() + value = AllowStatus(kit.Int(value)).String() case model.MESSAGE_STATUS: value = MessageStatus(kit.Int(value)).String() } @@ -158,6 +164,12 @@ func (s Table) ChangeStatus(m *ice.Message, uid string, from, to int, arg ...str } return m } +func (s Table) UserPlaceInit(m *ice.Message, arg ...string) { + if m.Option("user_place_init") == "" { + return + } + m.Cmd(m.Prefix("portal"), "userPlaceCmd", "addCount", model.INIT, 1, m.Option("user_place_uid"), m.Option("user_place_init")) +} func (s Table) Update(m *ice.Message, data ice.Map, arg ...string) { data[model.OPERATOR] = m.Option(model.USER_UID) s.Table.Update(m, data, arg...) diff --git a/src/gonganxitong/common.js b/src/gonganxitong/common.js index d6b6bbb..ff47553 100644 --- a/src/gonganxitong/common.js +++ b/src/gonganxitong/common.js @@ -1,6 +1,10 @@ Volcanos(chat.ONIMPORT, { _init: function(can, msg) { can.onimport.shareTitle && can.onimport.shareTitle(can, msg) var PLACE_NAME = msg.Option("_place_name"), PLACE_TYPE = msg.Option("_place_type"), USER_PLACE_ROLE = msg.Option("_user_place_role") + PLACE_TYPE || can.core.List(msg.append, function(key) { + can.base.endWith(key, "_type") && (PLACE_TYPE = key) + can.base.endWith(key, "_role") && (USER_PLACE_ROLE = key) + }) can.onimport.itemcards(can, msg, function(value) { return [ {view: html.TITLE, list:[value.title||value.name||value.user_name, can.onimport.textView(can, value, PLACE_TYPE, mdb.TYPE), can.onimport.textView(can, value, USER_PLACE_ROLE, aaa.ROLE), diff --git a/src/gonganxitong/model/model.go b/src/gonganxitong/model/model.go index e055e35..5e32e42 100644 --- a/src/gonganxitong/model/model.go +++ b/src/gonganxitong/model/model.go @@ -47,6 +47,7 @@ const ( EMAIL = "email" AVATAR = "avatar" ADDRESS = "address" + INIT = "init" ) type Sess struct { @@ -67,6 +68,7 @@ type UserPlace struct { UserUID string `gorm:"type:char(32);index"` PlaceUID string `gorm:"type:char(32);index"` Role uint8 `gorm:"default:0"` + Init uint8 `gorm:"default:0"` BeginTime db.Time EndTime db.Time } diff --git a/src/gonganxitong/portal.css b/src/gonganxitong/portal.css index bbdaef7..16c7071 100644 --- a/src/gonganxitong/portal.css +++ b/src/gonganxitong/portal.css @@ -1,5 +1,5 @@ $output { background-color:var(--plugin-bg-color); } -$output div.item.card { margin-bottom:5px; } +$output div.item.card { margin-bottom:2px; } $output div.item.card div.status span { word-break:break-all; } $output div.item.card img { border-radius:5px; padding:0; margin:0; margin-right:10px; height:48px; width:48px; } $output>div>div.list { border-radius:10px; background-color:var(--output-bg-color); padding:10px; margin:10px; } @@ -42,6 +42,10 @@ $output fieldset>div.output>div.code>input[type=button].danger { background-colo $output fieldset>div.output>div.code>input[type=button][name=cancel] { border:var(--box-border); background-color:var(--danger-bg-color); color:var(--danger-fg-color); } $output fieldset.story fieldset.story { position:absolute; top:0; height:100%; width:100%; } $output fieldset.story { box-shadow:none; } +$output fieldset.story>legend { display:none; } +$output fieldset.story>form.option { display:none; } +$output fieldset.story>div.action { display:none; } +$output fieldset.story>div.status { display:none; } $output fieldset.story>div.output { background-color:var(--plugin-bg-color); } $output fieldset.story>div.output table.content td { box-shadow:none; } $output fieldset.story>div.output table.content tr.uid { display:none; } diff --git a/src/gonganxitong/portal.go b/src/gonganxitong/portal.go index 0c1c49b..00dad9b 100644 --- a/src/gonganxitong/portal.go +++ b/src/gonganxitong/portal.go @@ -18,7 +18,7 @@ type Portal struct { city city export string `data:"true"` short string `data:"index"` - field string `data:"time,index,name,icons,order,enable,type,role,view"` + field string `data:"time,index,name,icons,order,enable,type,role,view,init"` create string `name:"create index name icons"` list string `name:"list place_uid index uid auto" role:"void"` placeCreate string `name:"placeCreate city_name* street_name* place_type*:select place_name* address*" icon:"bi bi-plus-square-dotted" role:"void"` @@ -129,6 +129,9 @@ func (s Portal) ScanQRCode(m *ice.Message, arg ...string) { } } } +func (s Portal) UserPlaceCmd(m *ice.Message, arg ...string) { + m.Cmdy(s.UserPlace, arg) +} func init() { ice.TeamCtxCmd(Portal{Table: newTable()}) } diff --git a/src/gonganxitong/portal.js b/src/gonganxitong/portal.js index 3a0b9a6..466013f 100644 --- a/src/gonganxitong/portal.js +++ b/src/gonganxitong/portal.js @@ -29,17 +29,22 @@ Volcanos(chat.ONIMPORT, { {view: html.OUTPUT, list: [ // "mydebug.list", "myplace.list", + "myinit.list", "myindex.list", + "myallow.list", ]}, {view: html.ACTION, list: ["myorder.list"]}, ]) can.ui.mydebug && can.onimport.myDebug(can, msg, can.ui.mydebug) var uid = can.onimport.myPlace(can, msg, can.ui.myplace, PLACE_UID, PLACE_NAME, PLACE_TYPE) - msg.Length() > 0? can.run({}, [uid], function(msg) { + msg.Length() > 0? can.run({}, [uid], function(msg) { can._index_msg = msg can.onimport.myIndex(can, msg, can.ui.myindex, PLACE_UID, USER_PLACE_ROLE), can.onimport.selectIndex(can, can.sup.current) + can.onimport.myAllow(can, msg, can.ui.myallow, PLACE_UID, USER_PLACE_ROLE) can.onimport.myOrder(can, msg, can.ui.myorder, PLACE_UID, USER_PLACE_ROLE) - }): can.run({}, [uid], function(msg) { + can.sup.current && can.onexport.value(can, can.sup.current, PLACE_UID, PLACE_NAME) + }): can.run({}, [uid], function(msg) { can._index_msg = msg can.onimport.myOrder(can, msg, can.ui.myorder, PLACE_UID, USER_PLACE_ROLE) + can.sup.current && can.onexport.value(can, can.sup.current, PLACE_UID, PLACE_NAME) }), can.ui.place_count = msg.Length() } else if (can.Option(ctx.INDEX) == "") { can.ui = can.page.Append(can, can._output, [ @@ -62,6 +67,22 @@ Volcanos(chat.ONIMPORT, { can.page.Append(can, target, [{view: html.TITLE, list: [{text: can.user.trans(can, "My Debug", "我的调试")}]}]) can.page.Append(can, target, [{text: window.innerWidth+", "+window.innerHeight}]) }, + myInit: function(can, msg, value, target) { if (!msg) { return } + can.page.Append(can, target, [{view: html.TITLE, list: [{text: can.user.trans(can, "My Init", "我的初始化")}]}]) + msg.Table(function(val) { + if (parseInt(val.init) == parseInt(value.init)+1) { val.args = [value._uid], val.style = html.OUTPUT, value._init = true + can.onappend.plugin(can, val, function(sub) { var run = sub.run + sub.run = function(event, cmds, cb) { + run(can.request(event, {user_place_uid: value.uid, user_place_init: value.init}), cmds, function(msg) { + if (cmds[1] == mdb.CREATE || cmds.length == 1 && msg.Length() > 0) { + can.onmotion.clearInput(can), can.Update() + } else { cb(msg) } + }) + } + }, target) + } + }) + }, myPlace: function(can, msg, target, PLACE_UID, PLACE_NAME, PLACE_TYPE) { var place_uid can.page.Append(can, target, [{view: html.TITLE, list: [ {text: can.user.trans(can, "My "+can.base.capital(PLACE_NAME.replace("_name", "")), null, html.INPUT)}, @@ -104,13 +125,21 @@ Volcanos(chat.ONIMPORT, { var role = can.page.Append(can, target, [{view: aaa.ROLE, list: can.core.Item(can.Conf("_trans.value."+USER_PLACE_ROLE), function(key, value) { if (can.base.isIn(key, ctx.STYLE, mdb.ICONS)) { return } return {text: [can.user.trans(can, key, value), "", key], onclick: function(event) { + can.onexport.value(can, can.sup.current, PLACE_UID) can.onimport.selectIndex(can, can.sup.current, key), can.onmotion.select(can, role, html.SPAN, event.target) }} }) }])._target; can.ui.role = role - var _msg = can.request(); msg.Table(function(value) { if (value.order < 99) { _msg.Push(value) } }) + var _msg = can.request(); msg.Table(function(value) { if (value.order < 90) { _msg.Push(value) } }) var output = can.page.Append(can, target, [html.OUTPUT])._target can.onimport.myList(can, _msg, output, PLACE_UID, USER_PLACE_ROLE) }, + myAllow: function(can, msg, target, PLACE_UID, USER_PLACE_ROLE) { + can.page.Append(can, target, [{view: html.TITLE, list: [{text: can.user.trans(can, "My Allow", "我的权限")}]}]) + var _msg = can.request(); msg.Table(function(value) { if (value.order > 89 && value.order < 100) { _msg.Push(value) } }) + var output = can.page.Append(can, target, [html.OUTPUT])._target + can.onimport.myList(can, _msg, output, PLACE_UID, USER_PLACE_ROLE) + can.onimport.layout(can) + }, myOrder: function(can, msg, target, PLACE_UID, USER_PLACE_ROLE) { can.page.Append(can, target, [{view: html.TITLE, list: [{text: can.user.trans(can, "My Order", "我的系统")}]}]) var _msg = can.request(); msg.Table(function(value) { if (value.order > 99) { _msg.Push(value) } }) @@ -217,10 +246,14 @@ Volcanos(chat.ONIMPORT, { textView: function(can, value, key, type) { return value[key] && {text: [can.user.transValue(can, value, key), "", [type, value[key], can.Conf("_trans.value."+key+".style."+value[key])||""]]} }, }) Volcanos(chat.ONEXPORT, { - value: function(can, value, PLACE_UID, PLACE_NAME) { + value: function(can, value, PLACE_UID) { can.page.Select(can, can.ui._target, "div.item.card.uid-"+value._uid, function(item) { can.onmotion.select(can, can.ui._target, html.DIV_ITEM, item) }) - can.sup.current = value, can.onimport.selectIndex(can, can.sup.current), can.onexport.title(can, value[PLACE_NAME], can.ConfHelp()) - can.onexport.session(can, PLACE_UID, value[PLACE_UID]), can.onexport.hash(can, value[PLACE_UID]), can.user.agent.init(can) + can.sup.current = value, can.onimport.selectIndex(can, can.sup.current), can.onexport.title(can, value._name, can.ConfHelp()) + can.onexport.session(can, PLACE_UID, value._uid), can.onexport.hash(can, value._uid), can.user.agent.init(can) + can.onmotion.delay(can, function() { can.onmotion.toggle(can, can.ui.myinit, !!value._init) }) + can.onmotion.toggle(can, can.ui.myallow, can.page.Select(can, can.ui.myallow, "div.item.index.role."+value._role).length > 0) + if (!can._index_msg || can.onmotion.cache(can, function() { return value._uid }, can.ui.myinit)) { return } + can.ui.myinit && can.onimport.myInit(can, can._index_msg, value, can.ui.myinit) }, share_title: function(can, msg, title, role) { msg.Option("_share_icons", msg.Append("user_avatar")) diff --git a/src/gonganxitong/userPlace.go b/src/gonganxitong/userPlace.go index 18bd82e..45cf04d 100644 --- a/src/gonganxitong/userPlace.go +++ b/src/gonganxitong/userPlace.go @@ -28,6 +28,7 @@ func (s userPlace) List(m *ice.Message, arg ...string) { s.Tables(m, s.place, s.street, s.city).FieldsWithCreatedAT(m, s, model.PLACE_NAME, model.PLACE_TYPE, model.USER_PLACE_ROLE, model.CITY_NAME, model.STREET_NAME, model.PLACE_ADDRESS, model.PLACE_UID, + model.INIT, ) if len(arg) == 1 { s.Select(m, model.USER_UID, arg[0])