fix: order workbench modules

This commit is contained in:
richjohnrambo
2026-09-10 15:19:29 +08:00
parent 085a48c3d9
commit 14ee3d937f
7 changed files with 54 additions and 22 deletions
+7 -7
View File
@@ -993,13 +993,13 @@ ON DUPLICATE KEY UPDATE updated_at = CURRENT_TIMESTAMP(3);
INSERT INTO tinode.im_workbench_apps(code, name, route, sort_order, unread_key, enabled, permission)
VALUES
('organization', '组织架构', '/organization', 10, 'organization', 1, 'enabled'),
('attendance', '打卡', '/attendance', 20, 'attendance', 1, 'enabled'),
('meetings', '会议通知', '/meetings', 30, 'meetings', 1, 'enabled'),
('meeting_notes', '会议笔记', '/meeting-notes', 35, '', 1, 'enabled'),
('daily_reports', '日报', '/reports/daily', 40, 'daily_reports', 1, 'enabled'),
('monthly_reports', '月报', '/reports/monthly', 50, 'monthly_reports', 1, 'enabled'),
('executive_mailbox', '总经理信箱', '/executive-mailbox', 60, 'executive_mailbox', 1, 'enabled')
('attendance', '打卡', '/attendance', 10, 'attendance', 1, 'enabled'),
('monthly_reports', '月报', '/reports/monthly', 20, 'monthly_reports', 1, 'enabled'),
('daily_reports', '日报', '/reports/daily', 30, 'daily_reports', 1, 'enabled'),
('organization', '部门框架', '/organization', 40, 'organization', 1, 'enabled'),
('executive_mailbox', '举报信箱', '/executive-mailbox', 50, 'executive_mailbox', 1, 'enabled'),
('meetings', '会议通知', '/meetings', 60, 'meetings', 1, 'enabled'),
('meeting_notes', '会议笔记', '/meeting-notes', 70, '', 1, 'enabled')
ON DUPLICATE KEY UPDATE
name = VALUES(name),
route = VALUES(route),
+29
View File
@@ -0,0 +1,29 @@
-- Update workbench module order to match the mobile workbench layout.
-- Order: 打卡、月报、日报、部门框架、举报信箱、会议通知、会议笔记.
UPDATE tinode.im_workbench_apps
SET sort_order = CASE code
WHEN 'attendance' THEN 10
WHEN 'monthly_reports' THEN 20
WHEN 'daily_reports' THEN 30
WHEN 'organization' THEN 40
WHEN 'executive_mailbox' THEN 50
WHEN 'meetings' THEN 60
WHEN 'meeting_notes' THEN 70
ELSE sort_order
END,
name = CASE code
WHEN 'organization' THEN '部门框架'
WHEN 'executive_mailbox' THEN '举报信箱'
ELSE name
END,
updated_at = CURRENT_TIMESTAMP(3)
WHERE code IN (
'attendance',
'monthly_reports',
'daily_reports',
'organization',
'executive_mailbox',
'meetings',
'meeting_notes'
);
+6 -4
View File
@@ -556,11 +556,13 @@ func main() {
}
if _, err = db.Exec(`INSERT INTO tinode.im_workbench_apps(code,name,route,sort_order,unread_key,enabled,permission)
VALUES
('organization','组织架构','/organization',10,'organization',1,'enabled'),
('meetings','会议通知','/meetings',20,'meetings',1,'enabled'),
('attendance','打卡','/attendance',10,'attendance',1,'enabled'),
('monthly_reports','月报','/reports/monthly',20,'monthly_reports',1,'enabled'),
('daily_reports','日报','/reports/daily',30,'daily_reports',1,'enabled'),
('monthly_reports','月报','/reports/monthly',40,'monthly_reports',1,'enabled'),
('executive_mailbox','总经理信箱','/executive-mailbox',50,'executive_mailbox',1,'enabled')
('organization','部门框架','/organization',40,'organization',1,'enabled'),
('executive_mailbox','举报信箱','/executive-mailbox',50,'executive_mailbox',1,'enabled'),
('meetings','会议通知','/meetings',60,'meetings',1,'enabled'),
('meeting_notes','会议笔记','/meeting-notes',70,'',1,'enabled')
ON DUPLICATE KEY UPDATE name=VALUES(name),route=VALUES(route),sort_order=VALUES(sort_order),unread_key=VALUES(unread_key),updated_at=CURRENT_TIMESTAMP(3)`); err != nil {
fatal(err)
}
+8 -8
View File
@@ -1262,13 +1262,13 @@ func createIMWorkbenchTables(tx *sql.Tx) error {
_, err := tx.Exec(
`INSERT INTO im_workbench_apps(code,name,route,sort_order,unread_key,enabled,permission)
VALUES
('organization','组织架构','/organization',10,'organization',1,'enabled'),
('attendance','打卡','/attendance',20,'attendance',1,'enabled'),
('meetings','会议通知','/meetings',30,'meetings',1,'enabled'),
('meeting_notes','会议笔记','/meeting-notes',35,'',1,'enabled'),
('daily_reports','日报','/reports/daily',40,'daily_reports',1,'enabled'),
('monthly_reports','月报','/reports/monthly',50,'monthly_reports',1,'enabled'),
('executive_mailbox','总经理信箱','/executive-mailbox',60,'executive_mailbox',1,'enabled')
('attendance','打卡','/attendance',10,'attendance',1,'enabled'),
('monthly_reports','月报','/reports/monthly',20,'monthly_reports',1,'enabled'),
('daily_reports','日报','/reports/daily',30,'daily_reports',1,'enabled'),
('organization','部门框架','/organization',40,'organization',1,'enabled'),
('executive_mailbox','举报信箱','/executive-mailbox',50,'executive_mailbox',1,'enabled'),
('meetings','会议通知','/meetings',60,'meetings',1,'enabled'),
('meeting_notes','会议笔记','/meeting-notes',70,'',1,'enabled')
ON DUPLICATE KEY UPDATE
name=VALUES(name),
route=VALUES(route),
@@ -1628,7 +1628,7 @@ func ensureIMMeetingNotesTables(db *sqlx.DB) error {
return err
}
_, err := db.Exec(`INSERT INTO im_workbench_apps(code,name,route,sort_order,unread_key,enabled,permission)
VALUES('meeting_notes','会议笔记','/meeting-notes',35,'',1,'enabled')
VALUES('meeting_notes','会议笔记','/meeting-notes',70,'',1,'enabled')
ON DUPLICATE KEY UPDATE name=VALUES(name),route=VALUES(route),sort_order=VALUES(sort_order),unread_key=VALUES(unread_key),updated_at=CURRENT_TIMESTAMP(3)`)
return err
}
+1 -1
View File
@@ -6844,7 +6844,7 @@ func (a *adapter) userPrivacyByUID(ctx context.Context, uid t.Uid) (*t.UserPriva
func isAllowedWorkbenchRoute(route string) bool {
switch route {
case "/organization", "/attendance", "/meetings", "/reports/daily", "/reports/monthly", "/executive-mailbox":
case "/organization", "/attendance", "/meetings", "/meeting-notes", "/reports/daily", "/reports/monthly", "/executive-mailbox":
return true
default:
return false
+1
View File
@@ -8123,6 +8123,7 @@ func workbenchModulePayloads(modules []types.WorkbenchModule) []map[string]any {
"name": module.Name,
"icon_file_id": module.IconFileID,
"route": module.Route,
"sort_order": module.SortOrder,
"unread_count": module.UnreadCount,
"enabled": module.Enabled,
"permission": module.Permission,
+2 -2
View File
@@ -2552,7 +2552,7 @@ func TestServeIMWorkbench(t *testing.T) {
oldWorkbench := store.Workbench
oldTenants := store.Tenants
store.Workbench = &testWorkbenchStore{version: 3, modules: []types.WorkbenchModule{
{Code: "organization", Name: "组织架构", Route: "/organization", Enabled: true, Permission: "enabled"},
{Code: "organization", Name: "部门框架", Route: "/organization", SortOrder: 40, Enabled: true, Permission: "enabled"},
{Code: "external", Name: "外部链接", Route: "https://example.com", Enabled: true, Permission: "enabled"},
}}
store.Tenants = testTenantStore{tenant: &types.Tenant{ID: 7, Code: "acme", State: types.TenantStateActive}}
@@ -2579,7 +2579,7 @@ func TestServeIMWorkbench(t *testing.T) {
t.Fatalf("expected external route to be filtered, got %#v", items)
}
item := items[0].(map[string]any)
if item["code"] != "organization" || item["route"] != "/organization" {
if item["code"] != "organization" || item["route"] != "/organization" || item["sort_order"].(float64) != 40 {
t.Fatalf("unexpected module: %#v", item)
}
enterprise := data["enterprise"].(map[string]any)