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) INSERT INTO tinode.im_workbench_apps(code, name, route, sort_order, unread_key, enabled, permission)
VALUES VALUES
('organization', '组织架构', '/organization', 10, 'organization', 1, 'enabled'), ('attendance', '打卡', '/attendance', 10, 'attendance', 1, 'enabled'),
('attendance', '打卡', '/attendance', 20, 'attendance', 1, 'enabled'), ('monthly_reports', '月报', '/reports/monthly', 20, 'monthly_reports', 1, 'enabled'),
('meetings', '会议通知', '/meetings', 30, 'meetings', 1, 'enabled'), ('daily_reports', '日报', '/reports/daily', 30, 'daily_reports', 1, 'enabled'),
('meeting_notes', '会议笔记', '/meeting-notes', 35, '', 1, 'enabled'), ('organization', '部门框架', '/organization', 40, 'organization', 1, 'enabled'),
('daily_reports', '日报', '/reports/daily', 40, 'daily_reports', 1, 'enabled'), ('executive_mailbox', '举报信箱', '/executive-mailbox', 50, 'executive_mailbox', 1, 'enabled'),
('monthly_reports', '月报', '/reports/monthly', 50, 'monthly_reports', 1, 'enabled'), ('meetings', '会议通知', '/meetings', 60, 'meetings', 1, 'enabled'),
('executive_mailbox', '总经理信箱', '/executive-mailbox', 60, 'executive_mailbox', 1, 'enabled') ('meeting_notes', '会议笔记', '/meeting-notes', 70, '', 1, 'enabled')
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
name = VALUES(name), name = VALUES(name),
route = VALUES(route), 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) if _, err = db.Exec(`INSERT INTO tinode.im_workbench_apps(code,name,route,sort_order,unread_key,enabled,permission)
VALUES VALUES
('organization','组织架构','/organization',10,'organization',1,'enabled'), ('attendance','打卡','/attendance',10,'attendance',1,'enabled'),
('meetings','会议通知','/meetings',20,'meetings',1,'enabled'), ('monthly_reports','月报','/reports/monthly',20,'monthly_reports',1,'enabled'),
('daily_reports','日报','/reports/daily',30,'daily_reports',1,'enabled'), ('daily_reports','日报','/reports/daily',30,'daily_reports',1,'enabled'),
('monthly_reports','月报','/reports/monthly',40,'monthly_reports',1,'enabled'), ('organization','部门框架','/organization',40,'organization',1,'enabled'),
('executive_mailbox','总经理信箱','/executive-mailbox',50,'executive_mailbox',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 { 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) fatal(err)
} }
+8 -8
View File
@@ -1262,13 +1262,13 @@ func createIMWorkbenchTables(tx *sql.Tx) error {
_, err := tx.Exec( _, err := tx.Exec(
`INSERT INTO im_workbench_apps(code,name,route,sort_order,unread_key,enabled,permission) `INSERT INTO im_workbench_apps(code,name,route,sort_order,unread_key,enabled,permission)
VALUES VALUES
('organization','组织架构','/organization',10,'organization',1,'enabled'), ('attendance','打卡','/attendance',10,'attendance',1,'enabled'),
('attendance','打卡','/attendance',20,'attendance',1,'enabled'), ('monthly_reports','月报','/reports/monthly',20,'monthly_reports',1,'enabled'),
('meetings','会议通知','/meetings',30,'meetings',1,'enabled'), ('daily_reports','日报','/reports/daily',30,'daily_reports',1,'enabled'),
('meeting_notes','会议笔记','/meeting-notes',35,'',1,'enabled'), ('organization','部门框架','/organization',40,'organization',1,'enabled'),
('daily_reports','日报','/reports/daily',40,'daily_reports',1,'enabled'), ('executive_mailbox','举报信箱','/executive-mailbox',50,'executive_mailbox',1,'enabled'),
('monthly_reports','月报','/reports/monthly',50,'monthly_reports',1,'enabled'), ('meetings','会议通知','/meetings',60,'meetings',1,'enabled'),
('executive_mailbox','总经理信箱','/executive-mailbox',60,'executive_mailbox',1,'enabled') ('meeting_notes','会议笔记','/meeting-notes',70,'',1,'enabled')
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
name=VALUES(name), name=VALUES(name),
route=VALUES(route), route=VALUES(route),
@@ -1628,7 +1628,7 @@ func ensureIMMeetingNotesTables(db *sqlx.DB) error {
return err return err
} }
_, err := db.Exec(`INSERT INTO im_workbench_apps(code,name,route,sort_order,unread_key,enabled,permission) _, 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)`) 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 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 { func isAllowedWorkbenchRoute(route string) bool {
switch route { 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 return true
default: default:
return false return false
+1
View File
@@ -8123,6 +8123,7 @@ func workbenchModulePayloads(modules []types.WorkbenchModule) []map[string]any {
"name": module.Name, "name": module.Name,
"icon_file_id": module.IconFileID, "icon_file_id": module.IconFileID,
"route": module.Route, "route": module.Route,
"sort_order": module.SortOrder,
"unread_count": module.UnreadCount, "unread_count": module.UnreadCount,
"enabled": module.Enabled, "enabled": module.Enabled,
"permission": module.Permission, "permission": module.Permission,
+2 -2
View File
@@ -2552,7 +2552,7 @@ func TestServeIMWorkbench(t *testing.T) {
oldWorkbench := store.Workbench oldWorkbench := store.Workbench
oldTenants := store.Tenants oldTenants := store.Tenants
store.Workbench = &testWorkbenchStore{version: 3, modules: []types.WorkbenchModule{ 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"}, {Code: "external", Name: "外部链接", Route: "https://example.com", Enabled: true, Permission: "enabled"},
}} }}
store.Tenants = testTenantStore{tenant: &types.Tenant{ID: 7, Code: "acme", State: types.TenantStateActive}} 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) t.Fatalf("expected external route to be filtered, got %#v", items)
} }
item := items[0].(map[string]any) 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) t.Fatalf("unexpected module: %#v", item)
} }
enterprise := data["enterprise"].(map[string]any) enterprise := data["enterprise"].(map[string]any)