@jskit-ai/users-web 0.1.178-oldline.2 → 0.1.178

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/package.json +197 -45
  2. package/patterns/account-settings/PATTERN.md +61 -0
  3. package/src/client/bootstrap/user-bootstrap-handler.js +2 -12
  4. package/src/client/composables/account-settings/accountSettingsAvatarUploadRuntime.js +2 -2
  5. package/src/client/composables/useAccountSettingsRuntime.js +3 -3
  6. package/src/client/index.js +0 -16
  7. package/src/client/providers/UsersWebClientProvider.js +13 -14
  8. package/test/bootstrap.test.js +6 -41
  9. package/test/exportsContract.test.js +3 -29
  10. package/test/packageMetadataOwnership.test.js +19 -0
  11. package/test/settingsPlacementContract.test.js +93 -405
  12. package/fixtures/crud-list-date-filters/App.vue +0 -107
  13. package/fixtures/crud-list-date-filters/index.html +0 -12
  14. package/fixtures/crud-list-date-filters/main.js +0 -24
  15. package/fixtures/crud-list-date-filters/vite.config.mjs +0 -18
  16. package/package.descriptor.mjs +0 -468
  17. package/src/client/bulkActions.js +0 -47
  18. package/src/client/components/CrudAddEditScreen.vue +0 -186
  19. package/src/client/components/CrudListBulkActionSurface.vue +0 -126
  20. package/src/client/components/CrudListDateFilterControl.vue +0 -188
  21. package/src/client/components/CrudListFilterSurface.vue +0 -388
  22. package/src/client/components/CrudListRecordActionMenu.vue +0 -120
  23. package/src/client/components/CrudListScreen.vue +0 -501
  24. package/src/client/components/CrudViewScreen.vue +0 -197
  25. package/src/client/composables/crud/crudBindingSupport.js +0 -75
  26. package/src/client/composables/crud/crudHttpClientSupport.js +0 -57
  27. package/src/client/composables/crud/crudJsonApiTransportSupport.js +0 -145
  28. package/src/client/composables/crud/crudLookupFieldLabelSupport.js +0 -151
  29. package/src/client/composables/crud/crudLookupFieldRuntime.js +0 -251
  30. package/src/client/composables/crud/crudSchemaFormHelpers.js +0 -464
  31. package/src/client/composables/internal/crudListFilterLookupSupport.js +0 -161
  32. package/src/client/composables/internal/crudListParentTitleSupport.js +0 -171
  33. package/src/client/composables/internal/useOperationScope.js +0 -144
  34. package/src/client/composables/records/useAddEdit.js +0 -224
  35. package/src/client/composables/records/useCrudAddEdit.js +0 -227
  36. package/src/client/composables/records/useCrudList.js +0 -101
  37. package/src/client/composables/records/useCrudView.js +0 -47
  38. package/src/client/composables/records/useList.js +0 -500
  39. package/src/client/composables/records/useView.js +0 -164
  40. package/src/client/composables/runtime/addEditUiRuntime.js +0 -130
  41. package/src/client/composables/runtime/listUiRuntime.js +0 -123
  42. package/src/client/composables/runtime/modelStateHelpers.js +0 -90
  43. package/src/client/composables/runtime/operationAdapters.js +0 -34
  44. package/src/client/composables/runtime/operationUiHelpers.js +0 -125
  45. package/src/client/composables/runtime/operationValidationHelpers.js +0 -51
  46. package/src/client/composables/runtime/useAddEditCore.js +0 -112
  47. package/src/client/composables/runtime/useCommandCore.js +0 -123
  48. package/src/client/composables/runtime/useEndpointResource.js +0 -199
  49. package/src/client/composables/runtime/useFieldErrorBag.js +0 -61
  50. package/src/client/composables/runtime/useListCore.js +0 -112
  51. package/src/client/composables/runtime/useUiFeedback.js +0 -98
  52. package/src/client/composables/runtime/useViewCore.js +0 -93
  53. package/src/client/composables/runtime/viewUiRuntime.js +0 -96
  54. package/src/client/composables/support/errorMessageHelpers.js +0 -66
  55. package/src/client/composables/support/listQueryParamSupport.js +0 -473
  56. package/src/client/composables/support/listSearchSupport.js +0 -70
  57. package/src/client/composables/support/refValueHelpers.js +0 -19
  58. package/src/client/composables/support/requestQueryRuntimeSupport.js +0 -141
  59. package/src/client/composables/support/resourceLoadStateHelpers.js +0 -229
  60. package/src/client/composables/support/routeTemplateHelpers.js +0 -285
  61. package/src/client/composables/support/scopeHelpers.js +0 -145
  62. package/src/client/composables/useAccess.js +0 -109
  63. package/src/client/composables/useCommand.js +0 -118
  64. package/src/client/composables/useCrudAddEditScreen.js +0 -88
  65. package/src/client/composables/useCrudDeleteAction.js +0 -160
  66. package/src/client/composables/useCrudListBulkActions.js +0 -147
  67. package/src/client/composables/useCrudListFilterLookups.js +0 -146
  68. package/src/client/composables/useCrudListFilters.js +0 -339
  69. package/src/client/composables/useCrudListParentTitle.js +0 -151
  70. package/src/client/composables/useCrudListRowActions.js +0 -144
  71. package/src/client/composables/useCrudListScreen.js +0 -237
  72. package/src/client/composables/useCrudViewScreen.js +0 -77
  73. package/src/client/composables/usePagedCollection.js +0 -181
  74. package/src/client/composables/usePaths.js +0 -120
  75. package/src/client/composables/useRealtimeQueryInvalidation.js +0 -156
  76. package/src/client/composables/useScopeRuntime.js +0 -135
  77. package/src/client/composables/useSurfaceRouteContext.js +0 -25
  78. package/src/client/filters.js +0 -15
  79. package/src/client/lib/httpClient.js +0 -47
  80. package/src/client/lib/permissions.js +0 -34
  81. package/src/client/rowActions.js +0 -47
  82. package/src/client/support/contractGuards.js +0 -34
  83. package/src/client/support/crudListDateFilterSupport.js +0 -91
  84. package/test/addEditUiRuntime.test.js +0 -110
  85. package/test/crudBindingSupport.test.js +0 -110
  86. package/test/crudHttpClientSupport.test.js +0 -77
  87. package/test/crudJsonApiTransportSupport.test.js +0 -179
  88. package/test/crudListBulkActionSurface.test.js +0 -27
  89. package/test/crudListDateFilterSupport.test.js +0 -92
  90. package/test/crudListDateFilterSurface.browser.test.js +0 -273
  91. package/test/crudListFilterSurface.test.js +0 -90
  92. package/test/crudLookupFieldRuntime.test.js +0 -264
  93. package/test/crudScreenComponents.test.js +0 -108
  94. package/test/errorIntentContract.test.js +0 -31
  95. package/test/errorMessageHelpers.test.js +0 -28
  96. package/test/listQueryParamSupport.test.js +0 -223
  97. package/test/listUiRuntime.test.js +0 -102
  98. package/test/operationValidationHelpers.test.js +0 -64
  99. package/test/packageDescriptorOwnership.test.js +0 -18
  100. package/test/permissions.test.js +0 -35
  101. package/test/refValueHelpers.test.js +0 -14
  102. package/test/requestTransportOptions.test.js +0 -457
  103. package/test/resourceLoadStateHelpers.test.js +0 -189
  104. package/test/routeTemplateHelpers.test.js +0 -85
  105. package/test/scopeHelpers.test.js +0 -57
  106. package/test/useAddEditCore.test.js +0 -124
  107. package/test/useAddEditRequestQueryParams.test.js +0 -190
  108. package/test/useCrudAddEdit.test.js +0 -435
  109. package/test/useCrudDeleteAction.test.js +0 -139
  110. package/test/useCrudListBulkActions.test.js +0 -65
  111. package/test/useCrudListFilterLookups.test.js +0 -114
  112. package/test/useCrudListFilters.test.js +0 -293
  113. package/test/useCrudListParentTitle.test.js +0 -262
  114. package/test/useCrudListRowActions.test.js +0 -77
  115. package/test/useListRouteInitialization.test.js +0 -337
  116. package/test/useListSearchSupport.test.js +0 -61
  117. package/test/usePagedCollection.test.js +0 -53
  118. package/test/useViewRequestQueryParams.test.js +0 -20
  119. package/test/viewCoreLoading.test.js +0 -44
  120. package/test/viewUiRuntime.test.js +0 -95
  121. /package/{templates → patterns/account-settings/example}/src/components/account/settings/AccountSettingsNotificationsSection.vue +0 -0
  122. /package/{templates → patterns/account-settings/example}/src/components/account/settings/AccountSettingsPreferencesSection.vue +0 -0
  123. /package/{templates → patterns/account-settings/example}/src/components/account/settings/AccountSettingsProfileSection.vue +0 -0
  124. /package/{templates → patterns/account-settings/example}/src/pages/account/index.vue +0 -0
@@ -1,24 +0,0 @@
1
- import { createApp } from "vue";
2
- import "vuetify/styles";
3
- import { createVuetify } from "vuetify";
4
- import * as components from "vuetify/components";
5
- import * as directives from "vuetify/directives";
6
- import { aliases as mdiAliases, mdi } from "vuetify/iconsets/mdi-svg";
7
- import App from "./App.vue";
8
-
9
- const vuetify = createVuetify({
10
- components,
11
- directives,
12
- theme: {
13
- defaultTheme: "light"
14
- },
15
- icons: {
16
- defaultSet: "mdi",
17
- aliases: mdiAliases,
18
- sets: { mdi }
19
- }
20
- });
21
-
22
- createApp(App)
23
- .use(vuetify)
24
- .mount("#app");
@@ -1,18 +0,0 @@
1
- import path from "node:path";
2
- import { fileURLToPath } from "node:url";
3
- import { defineConfig } from "vite";
4
- import vue from "@vitejs/plugin-vue";
5
-
6
- const fixtureRoot = path.dirname(fileURLToPath(import.meta.url));
7
-
8
- export default defineConfig({
9
- root: fixtureRoot,
10
- plugins: [vue()],
11
- resolve: {
12
- preserveSymlinks: true
13
- },
14
- server: {
15
- host: "127.0.0.1",
16
- strictPort: true
17
- }
18
- });
@@ -1,468 +0,0 @@
1
- import { HOME_COG_OUTLET } from "./src/shared/toolsOutletContracts.js";
2
-
3
- export default Object.freeze({
4
- packageVersion: 1,
5
- packageId: "@jskit-ai/users-web",
6
- version: "0.1.178-oldline.2",
7
- kind: "runtime",
8
- description: "Users web module: account/profile UI plus shared users web widgets.",
9
- dependsOn: [
10
- "@jskit-ai/auth-web",
11
- "@jskit-ai/http-runtime",
12
- "@jskit-ai/shell-web",
13
- "@jskit-ai/uploads-image-web",
14
- "@jskit-ai/users-core"
15
- ],
16
- capabilities: {
17
- provides: [
18
- "users.web"
19
- ],
20
- requires: [
21
- "runtime.web-placement",
22
- "users.server-routes"
23
- ]
24
- },
25
- runtime: {
26
- server: {
27
- providers: []
28
- },
29
- client: {
30
- providers: [
31
- {
32
- entrypoint: "src/client/providers/UsersWebClientProvider.js",
33
- export: "UsersWebClientProvider"
34
- }
35
- ]
36
- }
37
- },
38
- metadata: {
39
- apiSummary: {
40
- surfaces: [
41
- {
42
- subpath: "./client",
43
- summary: "Exports users-web client provider registration surface."
44
- },
45
- {
46
- subpath: "./client/providers/UsersWebClientProvider",
47
- summary: "Exports users-web client provider class."
48
- },
49
- {
50
- subpath: "./client/components/AccountSettingsClientElement",
51
- summary: "Exports the package-owned account settings host that renders placement-backed account sections."
52
- },
53
- {
54
- subpath: "./client/components/CrudAddEditScreen",
55
- summary: "Exports the package-owned CRUD add/edit screen shell used by generated form pages."
56
- },
57
- {
58
- subpath: "./client/components/CrudListBulkActionSurface",
59
- summary: "Exports the adaptive CRUD list bulk-action surface for generated list pages."
60
- },
61
- {
62
- subpath: "./client/components/CrudListFilterSurface",
63
- summary: "Exports the adaptive CRUD list filter surface for generated list pages."
64
- },
65
- {
66
- subpath: "./client/components/CrudListScreen",
67
- summary: "Exports the package-owned CRUD list screen shell used by generated list pages."
68
- },
69
- {
70
- subpath: "./client/components/CrudViewScreen",
71
- summary: "Exports the package-owned CRUD view screen shell used by generated detail pages."
72
- },
73
- {
74
- subpath: "./client/bulkActions",
75
- summary: "Exports client-side CRUD list bulk-action definition helpers."
76
- },
77
- {
78
- subpath: "./client/filters",
79
- summary: "Exports client-side CRUD list filter definition helpers."
80
- },
81
- {
82
- subpath: "./client/rowActions",
83
- summary: "Exports client-side CRUD list row-action definition helpers."
84
- },
85
- {
86
- subpath: "./client/components/ProfileClientElement",
87
- summary: "Exports profile settings client element scaffold component."
88
- },
89
- {
90
- subpath: "./client/composables/useAddEdit",
91
- summary: "Exports add/edit operation composable."
92
- },
93
- {
94
- subpath: "./client/composables/useList",
95
- summary: "Exports list operation composable."
96
- },
97
- {
98
- subpath: "./client/composables/crudLookupFieldRuntime",
99
- summary: "Exports CRUD lookup field runtime helpers for generated add/edit forms."
100
- },
101
- {
102
- subpath: "./client/composables/useCommand",
103
- summary: "Exports command operation composable."
104
- },
105
- {
106
- subpath: "./client/composables/useEndpointResource",
107
- summary: "Exports low-level endpoint resource composable for custom client requests."
108
- },
109
- {
110
- subpath: "./client/composables/useCrudListFilterLookups",
111
- summary: "Exports lookup-backed CRUD list filter helper for remote autocomplete filters."
112
- },
113
- {
114
- subpath: "./client/composables/useCrudAddEditScreen",
115
- summary: "Exports the package-owned add/edit screen runtime for generated form pages."
116
- },
117
- {
118
- subpath: "./client/composables/useCrudListBulkActions",
119
- summary: "Exports selected-record state and execution runtime for generated CRUD list bulk actions."
120
- },
121
- {
122
- subpath: "./client/composables/useCrudListRowActions",
123
- summary: "Exports per-record action state and execution runtime for generated CRUD list row actions."
124
- },
125
- {
126
- subpath: "./client/composables/useCrudListScreen",
127
- summary: "Exports the package-owned list screen runtime for generated list pages."
128
- },
129
- {
130
- subpath: "./client/composables/useView",
131
- summary: "Exports read/view operation composable."
132
- },
133
- {
134
- subpath: "./client/composables/useCrudViewScreen",
135
- summary: "Exports the package-owned view screen runtime for generated detail pages."
136
- },
137
- {
138
- subpath: "./client/composables/usePagedCollection",
139
- summary: "Exports paged collection query composable."
140
- },
141
- {
142
- subpath: "./client/composables/usePaths",
143
- summary: "Exports surface route path resolver composable."
144
- },
145
- {
146
- subpath: "./client/lib/httpClient",
147
- summary: "Exports the shared users-web HTTP client with credentials and CSRF behavior."
148
- },
149
- {
150
- subpath: "./client/account-settings/sections",
151
- summary: "Exports placement-backed account settings section helpers."
152
- }
153
- ],
154
- containerTokens: {
155
- server: [],
156
- client: [
157
- "users.web.home.tools.widget",
158
- "users.web.profile.element"
159
- ]
160
- }
161
- },
162
- ui: {
163
- placements: {
164
- outlets: [
165
- {
166
- target: HOME_COG_OUTLET.target,
167
- surfaces: ["home"],
168
- source: "src/client/components/UsersHomeToolsWidget.vue"
169
- },
170
- {
171
- target: "account-settings:sections",
172
- surfaces: ["account"],
173
- source: "src/client/components/AccountSettingsClientElement.vue"
174
- }
175
- ],
176
- topology: {
177
- placements: [
178
- {
179
- id: "home.tools-menu",
180
- description: "Home surface tools menu actions.",
181
- surfaces: ["home"],
182
- variants: {
183
- compact: {
184
- outlet: HOME_COG_OUTLET.target,
185
- renderers: {
186
- link: "local.main.ui.surface-aware-menu-link-item"
187
- }
188
- },
189
- medium: {
190
- outlet: HOME_COG_OUTLET.target,
191
- renderers: {
192
- link: "local.main.ui.surface-aware-menu-link-item"
193
- }
194
- },
195
- expanded: {
196
- outlet: HOME_COG_OUTLET.target,
197
- renderers: {
198
- link: "local.main.ui.surface-aware-menu-link-item"
199
- }
200
- }
201
- }
202
- },
203
- {
204
- id: "settings.sections",
205
- owner: "account-settings",
206
- description: "Account settings content sections.",
207
- surfaces: ["account"],
208
- variants: {
209
- compact: {
210
- outlet: "account-settings:sections"
211
- },
212
- medium: {
213
- outlet: "account-settings:sections"
214
- },
215
- expanded: {
216
- outlet: "account-settings:sections"
217
- }
218
- }
219
- }
220
- ]
221
- },
222
- contributions: [
223
- {
224
- id: "users.profile.menu.settings",
225
- target: "auth.profile-menu",
226
- kind: "link",
227
- surfaces: ["*"],
228
- order: 500,
229
- when: "auth.authenticated === true",
230
- source: "mutations.text#users-web-profile-settings-placement"
231
- },
232
- {
233
- id: "users.home.tools.widget",
234
- target: "shell.status",
235
- kind: "component",
236
- surfaces: ["home"],
237
- order: 900,
238
- componentToken: "users.web.home.tools.widget",
239
- when: "auth.authenticated === true",
240
- source: "mutations.text#users-web-home-tools-placement"
241
- },
242
- {
243
- id: "users.home.menu.settings",
244
- target: "home.tools-menu",
245
- kind: "link",
246
- surfaces: ["home"],
247
- order: 100,
248
- when: "auth.authenticated === true",
249
- source: "mutations.text#users-web-home-tools-placement"
250
- },
251
- {
252
- id: "users.account.settings.profile",
253
- target: "settings.sections",
254
- owner: "account-settings",
255
- kind: "component",
256
- surfaces: ["account"],
257
- order: 100,
258
- componentToken: "local.main.account-settings.section.profile",
259
- source: "mutations.text#users-web-account-settings-sections-placement"
260
- },
261
- {
262
- id: "users.account.settings.preferences",
263
- target: "settings.sections",
264
- owner: "account-settings",
265
- kind: "component",
266
- surfaces: ["account"],
267
- order: 200,
268
- componentToken: "local.main.account-settings.section.preferences",
269
- source: "mutations.text#users-web-account-settings-sections-placement"
270
- },
271
- {
272
- id: "users.account.settings.notifications",
273
- target: "settings.sections",
274
- owner: "account-settings",
275
- kind: "component",
276
- surfaces: ["account"],
277
- order: 300,
278
- componentToken: "local.main.account-settings.section.notifications",
279
- source: "mutations.text#users-web-account-settings-sections-placement"
280
- }
281
- ]
282
- }
283
- }
284
- },
285
- mutations: {
286
- dependencies: {
287
- runtime: {
288
- "@mdi/js": "^7.4.47",
289
- "@jskit-ai/http-runtime": "0.1.146",
290
- "@jskit-ai/realtime": "0.1.145",
291
- "@jskit-ai/kernel": "0.1.147",
292
- "@jskit-ai/shell-web": "0.1.149",
293
- "@jskit-ai/uploads-image-web": "0.1.123",
294
- "@jskit-ai/users-core": "0.1.161"
295
- },
296
- dev: {}
297
- },
298
- packageJson: {
299
- scripts: {
300
- "server:account": "SERVER_SURFACE=account node ./bin/server.js",
301
- "dev:account": "VITE_SURFACE=account vite",
302
- "build:account": "VITE_SURFACE=account vite build"
303
- }
304
- },
305
- procfile: {},
306
- files: [
307
- {
308
- from: "templates/src/pages/account/index.vue",
309
- to: "src/pages/account/index.vue",
310
- ownership: "app",
311
- reason: "Install app-owned account surface root page scaffold.",
312
- category: "users-web",
313
- id: "users-web-page-account-root"
314
- },
315
- {
316
- from: "templates/src/components/account/settings/AccountSettingsProfileSection.vue",
317
- to: "src/components/account/settings/AccountSettingsProfileSection.vue",
318
- ownership: "app",
319
- reason: "Install app-owned account settings profile section scaffold.",
320
- category: "users-web",
321
- id: "users-web-component-account-settings-profile"
322
- },
323
- {
324
- from: "templates/src/components/account/settings/AccountSettingsPreferencesSection.vue",
325
- to: "src/components/account/settings/AccountSettingsPreferencesSection.vue",
326
- ownership: "app",
327
- reason: "Install app-owned account settings preferences section scaffold.",
328
- category: "users-web",
329
- id: "users-web-component-account-settings-preferences"
330
- },
331
- {
332
- from: "templates/src/components/account/settings/AccountSettingsNotificationsSection.vue",
333
- to: "src/components/account/settings/AccountSettingsNotificationsSection.vue",
334
- ownership: "app",
335
- reason: "Install app-owned account settings notifications section scaffold.",
336
- category: "users-web",
337
- id: "users-web-component-account-settings-notifications"
338
- }
339
- ],
340
- text: [
341
- {
342
- op: "append-text",
343
- file: "config/public.js",
344
- position: "bottom",
345
- skipIfContains: "config.surfaceDefinitions.account = {",
346
- value:
347
- "\nconfig.surfaceDefinitions.account = {\n id: \"account\",\n label: \"Account\",\n pagesRoot: \"account\",\n enabled: true,\n requiresAuth: true,\n requiresWorkspace: false,\n origin: \"\"\n};\n",
348
- reason: "Register account surface definition in public surface config.",
349
- category: "users-web",
350
- id: "users-web-surface-config-account"
351
- },
352
- {
353
- op: "append-text",
354
- file: "src/placement.js",
355
- position: "bottom",
356
- skipIfContains: "id: \"users.profile.menu.settings\"",
357
- value:
358
- "\naddPlacement({\n id: \"users.profile.menu.settings\",\n target: \"auth.profile-menu\",\n kind: \"link\",\n surfaces: [\"*\"],\n order: 500,\n props: {\n label: \"Settings\",\n to: \"/account\"\n },\n when: ({ auth }) => auth?.authenticated === true\n});\n",
359
- reason: "Append users-web profile settings menu placement into app-owned placement registry.",
360
- category: "users-web",
361
- id: "users-web-profile-settings-placement"
362
- },
363
- {
364
- op: "append-text",
365
- file: "src/placement.js",
366
- position: "bottom",
367
- skipIfContains: "id: \"users.home.tools.widget\"",
368
- value:
369
- "\naddPlacement({\n id: \"users.home.tools.widget\",\n target: \"shell.status\",\n kind: \"component\",\n surfaces: [\"home\"],\n order: 900,\n componentToken: \"users.web.home.tools.widget\",\n when: ({ auth }) => auth?.authenticated === true\n});\n\naddPlacement({\n id: \"users.home.menu.settings\",\n target: \"home.tools-menu\",\n kind: \"link\",\n surfaces: [\"home\"],\n order: 100,\n props: {\n label: \"Settings\",\n surface: \"home\",\n scopedSuffix: \"/settings\",\n unscopedSuffix: \"/settings\"\n },\n when: ({ auth }) => auth?.authenticated === true\n});\n",
370
- reason: "Append users-web home tools widget and settings menu placements into app-owned placement registry.",
371
- category: "users-web",
372
- id: "users-web-home-tools-placement"
373
- },
374
- {
375
- op: "append-text",
376
- file: "src/placementTopology.js",
377
- position: "bottom",
378
- skipIfContains: "id: \"home.tools-menu\"",
379
- value:
380
- "\naddPlacementTopology({\n id: \"home.tools-menu\",\n description: \"Home surface tools menu actions.\",\n surfaces: [\"home\"],\n variants: {\n compact: {\n outlet: \"home-cog:primary-menu\",\n renderers: {\n link: \"local.main.ui.surface-aware-menu-link-item\"\n }\n },\n medium: {\n outlet: \"home-cog:primary-menu\",\n renderers: {\n link: \"local.main.ui.surface-aware-menu-link-item\"\n }\n },\n expanded: {\n outlet: \"home-cog:primary-menu\",\n renderers: {\n link: \"local.main.ui.surface-aware-menu-link-item\"\n }\n }\n }\n});\n",
381
- reason: "Append users-web home tools semantic topology into app-owned placement topology.",
382
- category: "users-web",
383
- id: "users-web-home-tools-topology"
384
- },
385
- {
386
- op: "append-text",
387
- file: "src/placement.js",
388
- position: "bottom",
389
- skipIfContains: "id: \"users.account.settings.profile\"",
390
- value:
391
- "\naddPlacement({\n id: \"users.account.settings.profile\",\n target: \"settings.sections\",\n owner: \"account-settings\",\n kind: \"component\",\n surfaces: [\"account\"],\n order: 100,\n componentToken: \"local.main.account-settings.section.profile\",\n props: {\n title: \"Profile\",\n value: \"profile\",\n usesSharedRuntime: true\n }\n});\n\naddPlacement({\n id: \"users.account.settings.preferences\",\n target: \"settings.sections\",\n owner: \"account-settings\",\n kind: \"component\",\n surfaces: [\"account\"],\n order: 200,\n componentToken: \"local.main.account-settings.section.preferences\",\n props: {\n title: \"Preferences\",\n value: \"preferences\",\n usesSharedRuntime: true\n }\n});\n\naddPlacement({\n id: \"users.account.settings.notifications\",\n target: \"settings.sections\",\n owner: \"account-settings\",\n kind: \"component\",\n surfaces: [\"account\"],\n order: 300,\n componentToken: \"local.main.account-settings.section.notifications\",\n props: {\n title: \"Notifications\",\n value: \"notifications\",\n usesSharedRuntime: true\n }\n});\n",
392
- reason: "Append users-web account settings section placements into the app-owned placement registry.",
393
- category: "users-web",
394
- id: "users-web-account-settings-sections-placement"
395
- },
396
- {
397
- op: "append-text",
398
- file: "src/placementTopology.js",
399
- position: "bottom",
400
- skipIfContains: "id: \"settings.sections\"",
401
- value:
402
- "\naddPlacementTopology({\n id: \"settings.sections\",\n owner: \"account-settings\",\n description: \"Account settings content sections.\",\n surfaces: [\"account\"],\n variants: {\n compact: {\n outlet: \"account-settings:sections\"\n },\n medium: {\n outlet: \"account-settings:sections\"\n },\n expanded: {\n outlet: \"account-settings:sections\"\n }\n }\n});\n",
403
- reason: "Append users-web account settings semantic topology into app-owned placement topology.",
404
- category: "users-web",
405
- id: "users-web-account-settings-topology"
406
- }
407
- ],
408
- source: [
409
- {
410
- op: "ensure-import",
411
- file: "packages/main/src/client/providers/MainClientProvider.js",
412
- defaultImport: "AccountSettingsProfileSection",
413
- from: "/src/components/account/settings/AccountSettingsProfileSection.vue",
414
- reason: "Bind the app-owned account profile settings section into local main client provider imports.",
415
- category: "users-web",
416
- id: "users-web-main-client-provider-account-settings-profile-import"
417
- },
418
- {
419
- op: "ensure-import",
420
- file: "packages/main/src/client/providers/MainClientProvider.js",
421
- defaultImport: "AccountSettingsPreferencesSection",
422
- from: "/src/components/account/settings/AccountSettingsPreferencesSection.vue",
423
- reason: "Bind the app-owned account preferences settings section into local main client provider imports.",
424
- category: "users-web",
425
- id: "users-web-main-client-provider-account-settings-preferences-import"
426
- },
427
- {
428
- op: "ensure-import",
429
- file: "packages/main/src/client/providers/MainClientProvider.js",
430
- defaultImport: "AccountSettingsNotificationsSection",
431
- from: "/src/components/account/settings/AccountSettingsNotificationsSection.vue",
432
- reason: "Bind the app-owned account notifications settings section into local main client provider imports.",
433
- category: "users-web",
434
- id: "users-web-main-client-provider-account-settings-notifications-import"
435
- },
436
- {
437
- op: "ensure-call",
438
- file: "packages/main/src/client/providers/MainClientProvider.js",
439
- callee: "registerMainClientComponent",
440
- args: ["\"local.main.account-settings.section.profile\"", "() => AccountSettingsProfileSection"],
441
- beforeClass: "MainClientProvider",
442
- reason: "Bind the app-owned account profile settings section token into local main client provider registry.",
443
- category: "users-web",
444
- id: "users-web-main-client-provider-account-settings-profile-register"
445
- },
446
- {
447
- op: "ensure-call",
448
- file: "packages/main/src/client/providers/MainClientProvider.js",
449
- callee: "registerMainClientComponent",
450
- args: ["\"local.main.account-settings.section.preferences\"", "() => AccountSettingsPreferencesSection"],
451
- beforeClass: "MainClientProvider",
452
- reason: "Bind the app-owned account preferences settings section token into local main client provider registry.",
453
- category: "users-web",
454
- id: "users-web-main-client-provider-account-settings-preferences-register"
455
- },
456
- {
457
- op: "ensure-call",
458
- file: "packages/main/src/client/providers/MainClientProvider.js",
459
- callee: "registerMainClientComponent",
460
- args: ["\"local.main.account-settings.section.notifications\"", "() => AccountSettingsNotificationsSection"],
461
- beforeClass: "MainClientProvider",
462
- reason: "Bind the app-owned account notifications settings section token into local main client provider registry.",
463
- category: "users-web",
464
- id: "users-web-main-client-provider-account-settings-notifications-register"
465
- }
466
- ]
467
- }
468
- });
@@ -1,47 +0,0 @@
1
- import { normalizeText } from "@jskit-ai/kernel/shared/support/normalize";
2
-
3
- function normalizeCrudListBulkAction(rawAction = {}, index = 0) {
4
- if (!rawAction || typeof rawAction !== "object" || Array.isArray(rawAction)) {
5
- return null;
6
- }
7
-
8
- const key = normalizeText(rawAction.key || rawAction.id || `action-${index + 1}`);
9
- const label = normalizeText(rawAction.label || rawAction.title);
10
- if (!key || !label) {
11
- return null;
12
- }
13
-
14
- return Object.freeze({
15
- key,
16
- label,
17
- icon: normalizeText(rawAction.icon),
18
- color: normalizeText(rawAction.color, { fallback: "primary" }),
19
- variant: normalizeText(rawAction.variant, { fallback: "tonal" }),
20
- confirmLabel: normalizeText(rawAction.confirmLabel),
21
- run: typeof rawAction.run === "function" ? rawAction.run : null,
22
- disabled: rawAction.disabled
23
- });
24
- }
25
-
26
- function defineCrudListBulkActions(actions = []) {
27
- if (!Array.isArray(actions)) {
28
- throw new TypeError("defineCrudListBulkActions requires an array.");
29
- }
30
-
31
- const normalizedActions = [];
32
- const seenKeys = new Set();
33
-
34
- actions.forEach((rawAction, index) => {
35
- const action = normalizeCrudListBulkAction(rawAction, index);
36
- if (!action || seenKeys.has(action.key)) {
37
- return;
38
- }
39
-
40
- seenKeys.add(action.key);
41
- normalizedActions.push(action);
42
- });
43
-
44
- return Object.freeze(normalizedActions);
45
- }
46
-
47
- export { defineCrudListBulkActions };