This commit is contained in:
IT 老营长 @云轩领航-创始人 2024-08-27 19:13:53 +08:00
parent aae5dc83c6
commit 0ffedac920
9 changed files with 94 additions and 36 deletions

View File

@ -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] }

View File

@ -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))
}

View File

@ -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...)

View File

@ -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),

View File

@ -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
}

View File

@ -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; }

View File

@ -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()}) }

View File

@ -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"))

View File

@ -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])