Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .changeset/2118-retire-launcher-utility-bar.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
'hotcrm': minor
---

Remove the **App Launcher** and **Utility Bar** pages (`app_launcher_page`, `utility_bar_page`).

Neither page could be reached from the app: no sidebar entry, button or other page pointed at
either, so each opened only at a typed address. Once opened, neither did what its name said.
The App Launcher was a search box and a "Your apps" strip holding one app, a copy of the app
switcher the console already has. The Utility Bar did not float: it laid out inline in the main
column as a heading, an empty **Quick Notes** card, a search box and a notifications block that
drew nothing. The console has no slot for a utility bar to dock into.

HotCRM is also the reference app people read to learn how to build one, and these two pages
taught that a page of type `app` makes a launcher and a page of type `utility` makes a floating
bar. Neither is true on the current platform, so both pages are retired together with their
labels in the four language packs.

**What this means for you.** The two pages are no longer in the app, and reading either one
(`GET /api/v1/meta/page/app_launcher_page` or `.../utility_bar_page`) now answers 404. A
bookmark to either address stops working. Every other page, **Sales Home** and the record
pages included, is unchanged. To switch apps, use the console's own app switcher.
2 changes: 1 addition & 1 deletion docs/STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ loader registers:
```text
HotCRM v4.0.1
Data: 18 Objects 358 Fields
UI: 1 Apps 14 Views 8 Pages 5 Dashboards 10 Reports 31 Actions
UI: 1 Apps 14 Views 6 Pages 5 Dashboards 10 Reports 31 Actions
Logic: 33 Flows
Security: 12 Positions 7 Permissions
```
Expand Down
25 changes: 7 additions & 18 deletions docs/architecture/module-split-inventory.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@
"change": "Removed the files[] row for src/sales/flows/demo-bootstrap.flow.ts (kind 'flow', module app.objectstack.hotcrm, 860 authored tokens). The file existed at measured_at.commit and was deleted by #1892, which retired the demo_bootstrap ownership sweep once the platform's seed-settle ownership claim (objectstack#17872, in the 17.6.0 pin) was measured leaving no seeded owner-scoped row ownerless.",
"figures_left_as_measured": "Untouched, per do_not_hand_patch: totals, ratchet, edges (the demo_bootstrap entries included), modules[] and every other files[].authored_tokens are still the one measurement taken at measured_at.commit. Only the row that pointed at a deleted file was removed, as #1698 did for case-csat-followup.flow.ts.",
"roster_drift_measured_at_this_date": "files[] held 170 rows before this edit and holds 169 after. The 35 files the 2026-09-14 entry lists as postdating measured_at.commit are still left out, for the reason it gives."
},
{
"date": "2026-10-15",
"issue": 2118,
"change": "Removed the files[] rows for src/sales/pages/app_launcher.page.ts (kind 'page', module app.objectstack.hotcrm, 310 authored tokens) and src/sales/pages/utility_bar.page.ts (kind 'page', module app.objectstack.hotcrm, 279 authored tokens). Both files existed at measured_at.commit and were deleted by #2118, which retired the two pages: neither had a navigation entry or any other consumer, and their page types promised shell roles (an app launcher, a floating utility bar) the console does not give.",
"figures_left_as_measured": "Untouched, per do_not_hand_patch: totals, ratchet, edges, modules[] and every other files[].authored_tokens are still the one measurement taken at measured_at.commit. Only the two rows that pointed at deleted files were removed, as #1698 and #1892 did before.",
"roster_drift_measured_at_this_date": "files[] held 169 rows before this edit and holds 167 after. The 35 files the 2026-09-14 entry lists as postdating measured_at.commit are still left out, for the reason it gives."
}
],
"measured_at": {
Expand Down Expand Up @@ -2885,15 +2892,6 @@
"ratcheted": true,
"authored_tokens": 233
},
{
"path": "src/sales/pages/app_launcher.page.ts",
"kind": "page",
"module": "app.objectstack.hotcrm",
"anchor_object": null,
"reason": "global launcher, no object binding",
"ratcheted": true,
"authored_tokens": 310
},
{
"path": "src/service/pages/case_detail.page.ts",
"kind": "page",
Expand Down Expand Up @@ -2939,15 +2937,6 @@
"ratcheted": true,
"authored_tokens": 1915
},
{
"path": "src/sales/pages/utility_bar.page.ts",
"kind": "page",
"module": "app.objectstack.hotcrm",
"anchor_object": null,
"reason": "global utility bar, no object binding",
"ratcheted": true,
"authored_tokens": 279
},
{
"path": "src/sales/profiles/guest-portal.profile.ts",
"kind": "profile",
Expand Down
2 changes: 1 addition & 1 deletion docs/architecture/module-split-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ enumerated below and in the JSON, each with a stated reason.
### What stays in the app package, and why it holds no objects

The app package holds the consumer surface — the app and its navigation scaffolding, the
three pages that are not record pages (`home`, `app_launcher`, `utility_bar`), the two
one page authored against no object (`home`), the two
cross-domain dashboards, the three cross-domain AI skills, the six permission sets, the four
locale bundles, the package docs, and the shared TypeScript source described below.

Expand Down
2 changes: 1 addition & 1 deletion docs/feature-inventory.md
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@
| --- | --- | --- | --- |
| ADM-001 | 应用定义与导航 | `crm_enterprise` 应用:7 个导航组(Sales/My Work/Activity/Marketing/Service/Insights/Approvals),橙色品牌,落地页为高管仪表板 | `src/sales/apps/crm.app.ts` |
| ADM-002 | Sales Home 页 | 三栏首页(sales_rep/manager 默认):4 个实时 KPI、我的线索/交易/任务三个嵌入列表 tab、快速新建、AI 助手引导卡、今日日程 | `src/sales/pages/home.page.ts` |
| ADM-003 | 启动器与工具条 | App Launcher(应用网格+全局搜索)与 Utility Bar(通知面板、快速笔记、快速搜索),四个 profile 全覆盖 | `src/sales/pages/app_launcher.page.ts`、`src/sales/pages/utility_bar.page.ts` |
| ADM-003 | 启动器与工具条 | **已移除 (#2118)**:曾有 App Launcher 与 Utility Bar 两个页面,但只能经手输 URL 打开,没有任何导航入口;前者重复控制台自带的应用切换,后者并不悬浮,只在主栏内平铺(控制台没有工具条槽位,上游 objectstack#23610)。两页连同其四语言文案一并下线,应用内不再有对应功能 | 已删除 |
| ADM-004 | 数据导入 | 3 个可复用导入映射(客户/联系人/线索,CSV/XLSX upsert)+ 行业与线索来源同义词表 + 现成模板 | `src/sales/mappings/` + `assets/import-templates/` |
| ADM-005 | 数据导出 | 五对象(客户/联系人/线索/商机/工单)列表 CSV/XLSX 导出,经单一服务端路由与 `allowExport` 权限把关 | `src/*/views/*.view.ts`(exportOptions)+ `src/sales/profiles/index.ts` |
| ADM-006 | 文件与附件 | 6 个对象启用附件面(客户/联系人/商机/报价/合同/工单);记录评论 feed 全对象默认开启;产品图/logo/头像/签名等媒体字段带服务端类型与大小限制 | `src/*/objects/*.object.ts`(enable.files)+ `src/sales/objects/index.ts`(机制说明) |
Expand Down
2 changes: 1 addition & 1 deletion objectstack.composition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ export const appViews = byExportName({
...salesViews, ...revenueViews, ...marketingViews,
});

/** Its page layouts — `home`, `app_launcher` and `utility_bar` among them. */
/** Its page layouts — `home` among them. */
export const appPages = byExportName({ ...salesPages });

/** Every import mapping — sales only; nothing else authors one. */
Expand Down
73 changes: 0 additions & 73 deletions src/sales/pages/app_launcher.page.ts

This file was deleted.

2 changes: 0 additions & 2 deletions src/sales/pages/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,3 @@ export { OpportunityDetailPage } from './opportunity_detail.page';
export { AccountDetailPage } from './account_detail.page';
export { AccountWorkbenchPage } from './account_workbench.page';
export { SalesHomePage } from './home.page';
export { AppLauncherPage } from './app_launcher.page';
export { UtilityBarPage } from './utility_bar.page';
62 changes: 0 additions & 62 deletions src/sales/pages/utility_bar.page.ts

This file was deleted.

18 changes: 0 additions & 18 deletions src/sales/translations/en/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,6 @@ export const appSurface: Omit<TranslationData, 'objects'> = {
label: 'Account Workbench',
description: 'Curated account list for the sales team: quick filters only, no view management.',
},
app_launcher_page: {
label: 'App Launcher',
description: 'Central hub for accessing all applications',
subtitle: 'Select an app to get started',
components: {
app_search: { label: 'Search Apps' },
app_grid: { label: 'Application Grid' },
},
},
case_detail_page: {
label: 'Case Detail',
description: 'Service-agent case record: highlights, SLA path, details and activity timeline.',
Expand Down Expand Up @@ -220,15 +211,6 @@ export const appSurface: Omit<TranslationData, 'objects'> = {
upcoming_events: { title: 'Upcoming Events', label: 'Upcoming Events' },
},
},
utility_bar_page: {
label: 'Utility Bar',
description: 'Quick access utility bar with floating tools',
components: {
notifications_panel: { label: 'Notifications' },
quick_notes: { title: 'Quick Notes', label: 'Quick Notes' },
quick_search: { label: 'Quick Search' },
},
},
},
// Shared option lists (`src/<pkg>/picklists/*.picklist.ts`), translated ONCE:
// every field that references a list (`Field.select({ picklist })`) inherits
Expand Down
18 changes: 0 additions & 18 deletions src/sales/translations/es-ES/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -498,15 +498,6 @@ export const appSurface: Omit<TranslationData, 'objects'> = {
label: 'Mesa de Trabajo de Cuentas',
description: 'Lista de cuentas curada para el equipo comercial: solo filtros rápidos, sin gestión de vistas.',
},
app_launcher_page: {
label: 'Lanzador de Aplicaciones',
description: 'Punto de acceso central a todas las aplicaciones',
subtitle: 'Seleccione una aplicación para empezar',
components: {
app_search: { label: 'Buscar Aplicaciones' },
app_grid: { label: 'Cuadrícula de Aplicaciones' },
},
},
case_detail_page: {
label: 'Detalle de Caso',
description: 'Página de caso para el agente de servicio: datos destacados, progreso del SLA, detalles y cronología de actividad.',
Expand Down Expand Up @@ -580,15 +571,6 @@ export const appSurface: Omit<TranslationData, 'objects'> = {
upcoming_events: { title: 'Próximos Eventos', label: 'Próximos Eventos' },
},
},
utility_bar_page: {
label: 'Barra de Utilidades',
description: 'Barra de acceso rápido con herramientas flotantes',
components: {
notifications_panel: { label: 'Notificaciones' },
quick_notes: { title: 'Notas Rápidas', label: 'Notas Rápidas' },
quick_search: { label: 'Búsqueda Rápida' },
},
},
},
// Screen-flow copy (#1210, #1975). Keyed `flows.<flow>.label`,
// `screens.<node>.title` and `screens.<node>.fields.<field>.{label,placeholder}`
Expand Down
18 changes: 0 additions & 18 deletions src/sales/translations/ja-JP/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -500,15 +500,6 @@ export const appSurface: Omit<TranslationData, 'objects'> = {
label: '取引先ワークベンチ',
description: '営業チーム向けに厳選した取引先リスト。クイックフィルターのみで、ビュー管理は行いません。',
},
app_launcher_page: {
label: 'アプリランチャー',
description: 'すべてのアプリケーションにアクセスするための統合ハブ',
subtitle: '開始するアプリを選択してください',
components: {
app_search: { label: 'アプリを検索' },
app_grid: { label: 'アプリグリッド' },
},
},
case_detail_page: {
label: 'ケース詳細',
description: 'サービス担当者向けのケースレコードページ:ハイライト、SLA パス、詳細、活動タイムライン。',
Expand Down Expand Up @@ -582,15 +573,6 @@ export const appSurface: Omit<TranslationData, 'objects'> = {
upcoming_events: { title: '今後の予定', label: '今後の予定' },
},
},
utility_bar_page: {
label: 'ユーティリティバー',
description: 'フローティングツールへのクイックアクセスバー',
components: {
notifications_panel: { label: '通知' },
quick_notes: { title: 'クイックメモ', label: 'クイックメモ' },
quick_search: { label: 'クイック検索' },
},
},
},
// Screen-flow copy (#1210, #1975). Keyed `flows.<flow>.label`,
// `screens.<node>.title` and `screens.<node>.fields.<field>.{label,placeholder}`
Expand Down
18 changes: 0 additions & 18 deletions src/sales/translations/zh-CN/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -499,15 +499,6 @@ export const appSurface: Omit<TranslationData, 'objects'> = {
label: '客户工作台',
description: '面向销售团队的精选客户列表:仅提供快捷筛选,不含视图管理。',
},
app_launcher_page: {
label: '应用中心',
description: '访问全部应用的统一入口',
subtitle: '选择一个应用开始使用',
components: {
app_search: { label: '搜索应用' },
app_grid: { label: '应用网格' },
},
},
case_detail_page: {
label: '工单详情',
description: '客服工单记录页:关键信息、SLA 进度、明细与活动时间线。',
Expand Down Expand Up @@ -581,15 +572,6 @@ export const appSurface: Omit<TranslationData, 'objects'> = {
upcoming_events: { title: '即将开始的活动', label: '即将开始的活动' },
},
},
utility_bar_page: {
label: '工具栏',
description: '悬浮工具的快捷访问栏',
components: {
notifications_panel: { label: '通知' },
quick_notes: { title: '快速笔记', label: '快速笔记' },
quick_search: { label: '快速搜索' },
},
},
},
// Screen-flow copy (#1210, #1975). Keyed `flows.<flow>.label`,
// `screens.<node>.title` and `screens.<node>.fields.<field>.{label,placeholder}`
Expand Down
Loading
Loading