Matt Voska
700cd97407
feat(workspace): add per-workspace logo upload ( #2760 )
...
Adds avatar_url column to workspace, threads it through the API +
WorkspaceAvatar component, and adds a click-to-upload editor in the
workspace settings tab. Mirrors the squad avatar pattern (migration 086);
UI strings use "logo" while the schema/code uses avatar_url for codebase
consistency with user.avatar_url and squad.avatar_url.
- migration 093: ALTER TABLE workspace ADD COLUMN avatar_url TEXT
- UpdateWorkspace SQL + handler accept avatar_url (auth gated to
owner/admin at the router via RequireWorkspaceRoleFromURL)
- WorkspaceAvatar renders <img> when avatar_url is set, falls back to
the initial-letter span otherwise
- workspace-tab.tsx adds a 16x16 click-to-upload logo editor at the
top of the general settings card, using useFileUpload + accept=
image/png,image/jpeg,image/webp (server stores under workspaces/{id}/)
- en + zh-Hans settings i18n strings added
Co-authored-by: Matt Voska <voska@users.noreply.github.com >
2026-06-01 16:48:05 +02:00
..
2026-04-15 14:58:53 +08:00
2026-04-15 14:58:53 +08:00
2026-04-16 13:16:35 +08:00
2026-04-16 13:16:35 +08:00
2026-04-16 13:16:35 +08:00
2026-04-16 13:16:35 +08:00
2026-04-16 13:16:35 +08:00
2026-04-16 13:16:35 +08:00
2026-04-18 01:35:22 +08:00
2026-04-18 01:35:22 +08:00
2026-04-17 13:40:02 +08:00
2026-04-17 13:40:02 +08:00
2026-04-16 18:54:12 +08:00
2026-04-16 18:54:12 +08:00
2026-04-16 21:21:20 +08:00
2026-04-16 21:21:20 +08:00
2026-04-17 15:10:38 +08:00
2026-04-17 15:10:38 +08:00
2026-04-19 23:21:31 -07:00
2026-04-19 23:21:31 -07:00
2026-04-21 20:32:33 +08:00
2026-04-21 20:32:33 +08:00
2026-04-21 00:06:34 +08:00
2026-04-21 00:06:34 +08:00
2026-04-21 14:42:52 +08:00
2026-04-21 14:42:52 +08:00
2026-04-21 20:32:33 +08:00
2026-04-21 20:32:33 +08:00
2026-04-21 20:32:33 +08:00
2026-04-21 20:32:33 +08:00
2026-04-21 20:32:33 +08:00
2026-04-21 20:32:33 +08:00
2026-04-21 20:32:33 +08:00
2026-04-21 20:32:33 +08:00
2026-04-22 13:08:37 +08:00
2026-04-22 13:08:37 +08:00
2026-04-22 15:08:06 +08:00
2026-04-22 15:08:06 +08:00
2026-04-23 10:35:55 +08:00
2026-04-23 10:35:55 +08:00
2026-04-24 11:05:33 +08:00
2026-04-24 11:05:33 +08:00
2026-04-27 14:23:42 +08:00
2026-04-27 14:23:42 +08:00
2026-05-06 16:16:12 +08:00
2026-05-06 16:16:12 +08:00
2026-04-29 14:50:58 +08:00
2026-04-29 14:50:58 +08:00
2026-05-03 10:51:31 +08:00
2026-05-03 10:51:31 +08:00
2026-04-29 14:05:26 +08:00
2026-04-29 14:05:26 +08:00
2026-04-29 14:50:58 +08:00
2026-04-29 14:50:58 +08:00
2026-04-29 18:29:46 +08:00
2026-04-29 18:29:46 +08:00
2026-04-29 18:29:46 +08:00
2026-04-29 18:29:46 +08:00
2026-04-29 22:51:29 +02:00
2026-04-29 22:51:29 +02:00
2026-04-30 16:05:53 +08:00
2026-04-30 16:05:53 +08:00
2026-04-30 14:00:43 +08:00
2026-04-30 14:00:43 +08:00
2026-04-30 14:17:53 +08:00
2026-04-30 14:17:53 +08:00
2026-04-30 15:50:05 +08:00
2026-04-30 15:50:05 +08:00
2026-05-06 16:27:06 +08:00
2026-05-06 16:27:06 +08:00
2026-05-09 05:49:33 +02:00
2026-05-09 05:49:33 +02:00
2026-05-07 15:45:29 +08:00
2026-05-07 15:45:29 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-09 15:07:57 +08:00
2026-05-09 15:07:57 +08:00
2026-05-09 14:39:10 +08:00
2026-05-09 14:39:10 +08:00
2026-05-12 13:49:03 +08:00
2026-05-12 13:49:03 +08:00
2026-05-09 15:07:57 +08:00
2026-05-09 15:07:57 +08:00
2026-05-11 14:39:35 +08:00
2026-05-11 14:39:35 +08:00
2026-05-11 14:39:35 +08:00
2026-05-11 14:39:35 +08:00
2026-05-12 10:57:54 +08:00
2026-05-12 10:57:54 +08:00
2026-05-11 22:53:07 +08:00
2026-05-11 22:53:07 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 12:51:16 +08:00
2026-05-13 12:51:16 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-14 14:07:26 +08:00
2026-05-14 14:07:26 +08:00
2026-05-14 15:23:36 +02:00
2026-05-14 15:23:36 +02:00
2026-05-18 12:17:39 +08:00
2026-05-18 12:17:39 +08:00
2026-05-17 15:01:38 +08:00
2026-05-17 15:01:38 +08:00
2026-05-16 21:26:30 +02:00
2026-05-16 21:26:30 +02:00
2026-05-16 21:26:30 +02:00
2026-05-16 21:26:30 +02:00
2026-05-18 14:59:40 +08:00
2026-05-18 14:59:40 +08:00
2026-05-19 05:35:18 +02:00
2026-05-19 05:35:18 +02:00
2026-05-20 12:30:10 +08:00
2026-05-20 12:30:10 +08:00
2026-05-19 18:37:48 +02:00
2026-05-19 18:37:48 +02:00
2026-05-20 05:30:13 +02:00
2026-05-20 05:30:13 +02:00
2026-05-19 19:51:28 +02:00
2026-05-19 19:51:28 +02:00
2026-05-20 15:37:23 +08:00
2026-05-20 15:37:23 +08:00
2026-05-22 13:22:36 +08:00
2026-05-22 13:22:36 +08:00
2026-05-21 19:00:26 +08:00
2026-05-21 19:00:26 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 16:26:42 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 16:35:45 +08:00
2026-05-21 16:35:45 +08:00
2026-05-22 12:26:56 +08:00
2026-05-22 12:26:56 +08:00
2026-05-22 14:51:43 +08:00
2026-05-22 14:51:43 +08:00
2026-05-25 18:42:48 +08:00
2026-05-25 18:42:48 +08:00
2026-05-27 13:44:31 +08:00
2026-05-27 13:44:31 +08:00
2026-05-26 17:00:01 +08:00
2026-05-26 17:00:01 +08:00
2026-05-26 16:45:46 +08:00
2026-05-26 16:45:46 +08:00
2026-05-27 15:47:36 +08:00
2026-05-27 15:47:36 +08:00
2026-06-01 16:48:05 +02:00
2026-06-01 16:48:05 +02:00