@jskit-ai/workspaces-web 0.1.41 → 0.1.42

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.
@@ -1,7 +1,7 @@
1
1
  export default Object.freeze({
2
2
  packageVersion: 1,
3
3
  packageId: "@jskit-ai/workspaces-web",
4
- version: "0.1.41",
4
+ version: "0.1.42",
5
5
  kind: "runtime",
6
6
  description: "Workspace web module: workspace selector, tools widget, workspace surfaces, and members/settings UI.",
7
7
  dependsOn: [
@@ -69,39 +69,93 @@ export default Object.freeze({
69
69
  outlets: [
70
70
  {
71
71
  target: "admin-settings:primary-menu",
72
- defaultLinkComponentToken: "local.main.ui.surface-aware-menu-link-item",
73
72
  surfaces: ["admin"],
74
73
  source: "templates/src/pages/admin/workspace/settings.vue"
75
74
  },
76
75
  {
77
76
  target: "admin-cog:primary-menu",
78
- defaultLinkComponentToken: "local.main.ui.surface-aware-menu-link-item",
79
77
  surfaces: ["admin"],
80
78
  source: "src/client/components/UsersWorkspaceToolsWidget.vue"
81
79
  }
82
80
  ],
81
+ topology: {
82
+ placements: [
83
+ {
84
+ id: "page.section-nav",
85
+ owner: "admin-settings",
86
+ description: "Navigation between workspace admin settings child pages.",
87
+ surfaces: ["admin"],
88
+ variants: {
89
+ compact: {
90
+ outlet: "admin-settings:primary-menu",
91
+ renderers: {
92
+ link: "local.main.ui.surface-aware-menu-link-item"
93
+ }
94
+ },
95
+ medium: {
96
+ outlet: "admin-settings:primary-menu",
97
+ renderers: {
98
+ link: "local.main.ui.surface-aware-menu-link-item"
99
+ }
100
+ },
101
+ expanded: {
102
+ outlet: "admin-settings:primary-menu",
103
+ renderers: {
104
+ link: "local.main.ui.surface-aware-menu-link-item"
105
+ }
106
+ }
107
+ }
108
+ },
109
+ {
110
+ id: "admin.tools-menu",
111
+ description: "Admin surface tools menu actions.",
112
+ surfaces: ["admin"],
113
+ variants: {
114
+ compact: {
115
+ outlet: "admin-cog:primary-menu",
116
+ renderers: {
117
+ link: "local.main.ui.surface-aware-menu-link-item"
118
+ }
119
+ },
120
+ medium: {
121
+ outlet: "admin-cog:primary-menu",
122
+ renderers: {
123
+ link: "local.main.ui.surface-aware-menu-link-item"
124
+ }
125
+ },
126
+ expanded: {
127
+ outlet: "admin-cog:primary-menu",
128
+ renderers: {
129
+ link: "local.main.ui.surface-aware-menu-link-item"
130
+ }
131
+ }
132
+ }
133
+ }
134
+ ]
135
+ },
83
136
  contributions: [
84
137
  {
85
138
  id: "workspaces.workspace.menu.app",
86
- target: "shell-layout:primary-menu",
139
+ target: "shell.primary-nav",
140
+ kind: "link",
87
141
  surfaces: ["app"],
88
142
  order: 50,
89
- componentToken: "local.main.ui.surface-aware-menu-link-item",
90
143
  when: "auth.authenticated === true",
91
144
  source: "mutations.text#workspaces-web-placement-block"
92
145
  },
93
146
  {
94
147
  id: "workspaces.workspace.menu.admin",
95
- target: "shell-layout:primary-menu",
148
+ target: "shell.primary-nav",
149
+ kind: "link",
96
150
  surfaces: ["admin"],
97
151
  order: 60,
98
- componentToken: "local.main.ui.surface-aware-menu-link-item",
99
152
  when: "auth.authenticated === true",
100
153
  source: "mutations.text#workspaces-web-placement-block"
101
154
  },
102
155
  {
103
156
  id: "workspaces.profile.menu.surface-switch",
104
- target: "auth-profile-menu:primary-menu",
157
+ target: "auth.profile-menu",
158
+ kind: "component",
105
159
  surfaces: ["*"],
106
160
  order: 100,
107
161
  componentToken: "workspaces.web.profile.menu.surface-switch-item",
@@ -110,7 +164,8 @@ export default Object.freeze({
110
164
  },
111
165
  {
112
166
  id: "workspaces.workspace.selector",
113
- target: "shell-layout:top-left",
167
+ target: "shell.identity",
168
+ kind: "component",
114
169
  surfaces: ["*"],
115
170
  order: 200,
116
171
  componentToken: "workspaces.web.workspace.selector",
@@ -119,7 +174,8 @@ export default Object.freeze({
119
174
  },
120
175
  {
121
176
  id: "workspaces.account.invites.cue",
122
- target: "shell-layout:top-right",
177
+ target: "shell.status",
178
+ kind: "component",
123
179
  surfaces: ["*"],
124
180
  order: 850,
125
181
  componentToken: "local.main.account.pending-invites.cue",
@@ -128,7 +184,9 @@ export default Object.freeze({
128
184
  },
129
185
  {
130
186
  id: "workspaces.account.settings.invites",
131
- target: "account-settings:sections",
187
+ target: "settings.sections",
188
+ owner: "account-settings",
189
+ kind: "component",
132
190
  surfaces: ["account"],
133
191
  order: 400,
134
192
  componentToken: "local.main.account-settings.section.invites",
@@ -137,7 +195,8 @@ export default Object.freeze({
137
195
  },
138
196
  {
139
197
  id: "workspaces.workspace.tools.widget",
140
- target: "shell-layout:top-right",
198
+ target: "shell.status",
199
+ kind: "component",
141
200
  surfaces: ["admin"],
142
201
  order: 900,
143
202
  componentToken: "workspaces.web.workspace.tools.widget",
@@ -145,7 +204,8 @@ export default Object.freeze({
145
204
  },
146
205
  {
147
206
  id: "workspaces.workspace.menu.workspace-settings",
148
- target: "admin-cog:primary-menu",
207
+ target: "admin.tools-menu",
208
+ kind: "component",
149
209
  surfaces: ["admin"],
150
210
  order: 100,
151
211
  componentToken: "workspaces.web.workspace-settings.menu-item",
@@ -153,7 +213,8 @@ export default Object.freeze({
153
213
  },
154
214
  {
155
215
  id: "workspaces.workspace.menu.members",
156
- target: "admin-cog:primary-menu",
216
+ target: "admin.tools-menu",
217
+ kind: "component",
157
218
  surfaces: ["admin"],
158
219
  order: 200,
159
220
  componentToken: "workspaces.web.workspace-members.menu-item",
@@ -166,8 +227,8 @@ export default Object.freeze({
166
227
  mutations: {
167
228
  dependencies: {
168
229
  runtime: {
169
- "@jskit-ai/workspaces-core": "0.1.41",
170
- "@jskit-ai/users-web": "0.1.80",
230
+ "@jskit-ai/workspaces-core": "0.1.42",
231
+ "@jskit-ai/users-web": "0.1.81",
171
232
  "vuetify": "^4.0.0"
172
233
  },
173
234
  dev: {}
@@ -310,7 +371,7 @@ export default Object.freeze({
310
371
  position: "bottom",
311
372
  skipIfContains: "id: \"workspaces.profile.menu.surface-switch\"",
312
373
  value:
313
- "\naddPlacement({\n id: \"workspaces.profile.menu.surface-switch\",\n target: \"auth-profile-menu:primary-menu\",\n surfaces: [\"*\"],\n order: 100,\n componentToken: \"workspaces.web.profile.menu.surface-switch-item\",\n when: ({ auth }) => auth?.authenticated === true\n});\n",
374
+ "\naddPlacement({\n id: \"workspaces.profile.menu.surface-switch\",\n target: \"auth.profile-menu\",\n kind: \"component\",\n surfaces: [\"*\"],\n order: 100,\n componentToken: \"workspaces.web.profile.menu.surface-switch-item\",\n when: ({ auth }) => auth?.authenticated === true\n});\n",
314
375
  reason: "Append workspaces-web profile surface switch placement into app-owned placement registry.",
315
376
  category: "workspaces-web",
316
377
  id: "workspaces-web-profile-surface-switch-placement",
@@ -324,7 +385,7 @@ export default Object.freeze({
324
385
  file: "src/placement.js",
325
386
  position: "bottom",
326
387
  skipIfContains: "id: \"workspaces.workspace.selector\"",
327
- value: "\naddPlacement({\n id: \"workspaces.workspace.menu.app\",\n target: \"shell-layout:primary-menu\",\n surfaces: [\"app\"],\n order: 50,\n componentToken: \"local.main.ui.surface-aware-menu-link-item\",\n props: {\n label: \"Home\",\n surface: \"app\",\n scopedSuffix: \"/\",\n unscopedSuffix: \"/\",\n exact: true\n },\n when: ({ auth }) => auth?.authenticated === true\n});\n\naddPlacement({\n id: \"workspaces.workspace.menu.admin\",\n target: \"shell-layout:primary-menu\",\n surfaces: [\"admin\"],\n order: 60,\n componentToken: \"local.main.ui.surface-aware-menu-link-item\",\n props: {\n label: \"Home\",\n surface: \"admin\",\n scopedSuffix: \"/\",\n unscopedSuffix: \"/\",\n exact: true\n },\n when: ({ auth }) => auth?.authenticated === true\n});\n\naddPlacement({\n id: \"workspaces.workspace.selector\",\n target: \"shell-layout:top-left\",\n surfaces: [\"*\"],\n order: 200,\n componentToken: \"workspaces.web.workspace.selector\",\n props: {\n allowOnNonWorkspaceSurface: true,\n targetSurfaceId: \"app\"\n },\n when: ({ auth }) => auth?.authenticated === true\n});\n\naddPlacement({\n id: \"workspaces.account.invites.cue\",\n target: \"shell-layout:top-right\",\n surfaces: [\"*\"],\n order: 850,\n componentToken: \"local.main.account.pending-invites.cue\",\n when: ({ auth }) => auth?.authenticated === true\n});\n\naddPlacement({\n id: \"workspaces.workspace.tools.widget\",\n target: \"shell-layout:top-right\",\n surfaces: [\"admin\"],\n order: 900,\n componentToken: \"workspaces.web.workspace.tools.widget\"\n});\n\naddPlacement({\n id: \"workspaces.workspace.menu.workspace-settings\",\n target: \"admin-cog:primary-menu\",\n surfaces: [\"admin\"],\n order: 100,\n componentToken: \"workspaces.web.workspace-settings.menu-item\"\n});\n\naddPlacement({\n id: \"workspaces.workspace.menu.members\",\n target: \"admin-cog:primary-menu\",\n surfaces: [\"admin\"],\n order: 200,\n componentToken: \"workspaces.web.workspace-members.menu-item\"\n});\n",
388
+ value: "\naddPlacement({\n id: \"workspaces.workspace.menu.app\",\n target: \"shell.primary-nav\",\n kind: \"link\",\n surfaces: [\"app\"],\n order: 50,\n props: {\n label: \"Home\",\n surface: \"app\",\n scopedSuffix: \"/\",\n unscopedSuffix: \"/\",\n exact: true\n },\n when: ({ auth }) => auth?.authenticated === true\n});\n\naddPlacement({\n id: \"workspaces.workspace.menu.admin\",\n target: \"shell.primary-nav\",\n kind: \"link\",\n surfaces: [\"admin\"],\n order: 60,\n props: {\n label: \"Home\",\n surface: \"admin\",\n scopedSuffix: \"/\",\n unscopedSuffix: \"/\",\n exact: true\n },\n when: ({ auth }) => auth?.authenticated === true\n});\n\naddPlacement({\n id: \"workspaces.workspace.selector\",\n target: \"shell.identity\",\n kind: \"component\",\n surfaces: [\"*\"],\n order: 200,\n componentToken: \"workspaces.web.workspace.selector\",\n props: {\n allowOnNonWorkspaceSurface: true,\n targetSurfaceId: \"app\"\n },\n when: ({ auth }) => auth?.authenticated === true\n});\n\naddPlacement({\n id: \"workspaces.account.invites.cue\",\n target: \"shell.status\",\n kind: \"component\",\n surfaces: [\"*\"],\n order: 850,\n componentToken: \"local.main.account.pending-invites.cue\",\n when: ({ auth }) => auth?.authenticated === true\n});\n\naddPlacement({\n id: \"workspaces.workspace.tools.widget\",\n target: \"shell.status\",\n kind: \"component\",\n surfaces: [\"admin\"],\n order: 900,\n componentToken: \"workspaces.web.workspace.tools.widget\"\n});\n\naddPlacement({\n id: \"workspaces.workspace.menu.workspace-settings\",\n target: \"admin.tools-menu\",\n kind: \"component\",\n surfaces: [\"admin\"],\n order: 100,\n componentToken: \"workspaces.web.workspace-settings.menu-item\"\n});\n\naddPlacement({\n id: \"workspaces.workspace.menu.members\",\n target: \"admin.tools-menu\",\n kind: \"component\",\n surfaces: [\"admin\"],\n order: 200,\n componentToken: \"workspaces.web.workspace-members.menu-item\"\n});\n",
328
389
  reason: "Append workspace placement entries into app-owned placement registry.",
329
390
  category: "workspaces-web",
330
391
  id: "workspaces-web-placement-block",
@@ -333,13 +394,27 @@ export default Object.freeze({
333
394
  in: ["personal", "workspaces"]
334
395
  }
335
396
  },
397
+ {
398
+ op: "append-text",
399
+ file: "src/placementTopology.js",
400
+ position: "bottom",
401
+ skipIfContains: "id: \"admin.tools-menu\"",
402
+ value: "\naddPlacementTopology({\n id: \"page.section-nav\",\n owner: \"admin-settings\",\n description: \"Navigation between workspace admin settings child pages.\",\n surfaces: [\"admin\"],\n variants: {\n compact: {\n outlet: \"admin-settings:primary-menu\",\n renderers: {\n link: \"local.main.ui.surface-aware-menu-link-item\"\n }\n },\n medium: {\n outlet: \"admin-settings:primary-menu\",\n renderers: {\n link: \"local.main.ui.surface-aware-menu-link-item\"\n }\n },\n expanded: {\n outlet: \"admin-settings:primary-menu\",\n renderers: {\n link: \"local.main.ui.surface-aware-menu-link-item\"\n }\n }\n }\n});\n\naddPlacementTopology({\n id: \"admin.tools-menu\",\n description: \"Admin surface tools menu actions.\",\n surfaces: [\"admin\"],\n variants: {\n compact: {\n outlet: \"admin-cog:primary-menu\",\n renderers: {\n link: \"local.main.ui.surface-aware-menu-link-item\"\n }\n },\n medium: {\n outlet: \"admin-cog:primary-menu\",\n renderers: {\n link: \"local.main.ui.surface-aware-menu-link-item\"\n }\n },\n expanded: {\n outlet: \"admin-cog:primary-menu\",\n renderers: {\n link: \"local.main.ui.surface-aware-menu-link-item\"\n }\n }\n }\n});\n",
403
+ reason: "Append workspaces-web admin semantic topology into app-owned placement topology.",
404
+ category: "workspaces-web",
405
+ id: "workspaces-web-admin-placement-topology",
406
+ when: {
407
+ config: "tenancyMode",
408
+ in: ["personal", "workspaces"]
409
+ }
410
+ },
336
411
  {
337
412
  op: "append-text",
338
413
  file: "src/placement.js",
339
414
  position: "bottom",
340
415
  skipIfContains: "id: \"workspaces.account.settings.invites\"",
341
416
  value:
342
- "\naddPlacement({\n id: \"workspaces.account.settings.invites\",\n target: \"account-settings:sections\",\n surfaces: [\"account\"],\n order: 400,\n componentToken: \"local.main.account-settings.section.invites\",\n props: {\n title: \"Invites\",\n value: \"invites\",\n usesSharedRuntime: false\n },\n when: ({ auth, workspaceInvitesEnabled }) => auth?.authenticated === true && workspaceInvitesEnabled === true\n});\n",
417
+ "\naddPlacement({\n id: \"workspaces.account.settings.invites\",\n target: \"settings.sections\",\n owner: \"account-settings\",\n kind: \"component\",\n surfaces: [\"account\"],\n order: 400,\n componentToken: \"local.main.account-settings.section.invites\",\n props: {\n title: \"Invites\",\n value: \"invites\",\n usesSharedRuntime: false\n },\n when: ({ auth, workspaceInvitesEnabled }) => auth?.authenticated === true && workspaceInvitesEnabled === true\n});\n",
343
418
  reason: "Append workspaces-web account settings invites section placement into app-owned placement registry.",
344
419
  category: "workspaces-web",
345
420
  id: "workspaces-web-account-settings-placement",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jskit-ai/workspaces-web",
3
- "version": "0.1.41",
3
+ "version": "0.1.42",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "test": "node --test"
@@ -15,12 +15,12 @@
15
15
  "dependencies": {
16
16
  "@tanstack/vue-query": "5.92.12",
17
17
  "@mdi/js": "^7.4.47",
18
- "@jskit-ai/http-runtime": "0.1.64",
19
- "@jskit-ai/kernel": "0.1.65",
20
- "@jskit-ai/shell-web": "0.1.64",
21
- "@jskit-ai/users-core": "0.1.75",
22
- "@jskit-ai/users-web": "0.1.80",
23
- "@jskit-ai/workspaces-core": "0.1.41",
18
+ "@jskit-ai/http-runtime": "0.1.65",
19
+ "@jskit-ai/kernel": "0.1.66",
20
+ "@jskit-ai/shell-web": "0.1.65",
21
+ "@jskit-ai/users-core": "0.1.76",
22
+ "@jskit-ai/users-web": "0.1.81",
23
+ "@jskit-ai/workspaces-core": "0.1.42",
24
24
  "vuetify": "^4.0.0"
25
25
  },
26
26
  "peerDependencies": {
@@ -6,7 +6,6 @@ import { ADMIN_COG_OUTLET } from "../../shared/toolsOutletContracts.js";
6
6
  <template>
7
7
  <ShellOutletMenuWidget
8
8
  :target="ADMIN_COG_OUTLET.target"
9
- :default-link-component-token="ADMIN_COG_OUTLET.defaultLinkComponentToken"
10
9
  :aria-label="ADMIN_COG_OUTLET.ariaLabel"
11
10
  />
12
11
  </template>
@@ -1,9 +1,6 @@
1
- const DEFAULT_COG_LINK_COMPONENT_TOKEN = "local.main.ui.surface-aware-menu-link-item";
2
-
3
1
  const ADMIN_COG_OUTLET = Object.freeze({
4
2
  target: "admin-cog:primary-menu",
5
- defaultLinkComponentToken: DEFAULT_COG_LINK_COMPONENT_TOKEN,
6
3
  ariaLabel: "Admin cog"
7
4
  });
8
5
 
9
- export { DEFAULT_COG_LINK_COMPONENT_TOKEN, ADMIN_COG_OUTLET };
6
+ export { ADMIN_COG_OUTLET };
@@ -15,10 +15,7 @@ import { RouterView } from "vue-router";
15
15
  <v-row no-gutters>
16
16
  <v-col cols="12" md="3" lg="2" class="pr-md-4 mb-4 mb-md-0">
17
17
  <v-list nav density="comfortable" rounded="lg" border>
18
- <ShellOutlet
19
- target="admin-settings:primary-menu"
20
- default-link-component-token="local.main.ui.surface-aware-menu-link-item"
21
- />
18
+ <ShellOutlet target="admin-settings:primary-menu" />
22
19
  </v-list>
23
20
  </v-col>
24
21
 
@@ -16,6 +16,19 @@ function readOutlets(target = "") {
16
16
  : [];
17
17
  }
18
18
 
19
+ function findTopology(id, owner = "") {
20
+ const placements = descriptor?.metadata?.ui?.placements?.topology?.placements;
21
+ const normalizedId = String(id || "").trim();
22
+ const normalizedOwner = String(owner || "").trim();
23
+ return Array.isArray(placements)
24
+ ? placements.find((entry) => {
25
+ const entryId = String(entry?.id || "").trim();
26
+ const entryOwner = String(entry?.owner || "").trim();
27
+ return entryId === normalizedId && entryOwner === normalizedOwner;
28
+ }) || null
29
+ : null;
30
+ }
31
+
19
32
  function findContribution(id) {
20
33
  const contributions = descriptor?.metadata?.ui?.placements?.contributions;
21
34
  return Array.isArray(contributions)
@@ -44,7 +57,7 @@ test("workspaces-web admin settings template exposes surface-derived settings ou
44
57
  );
45
58
 
46
59
  assert.match(source, /target="admin-settings:primary-menu"/);
47
- assert.match(source, /default-link-component-token="local\.main\.ui\.surface-aware-menu-link-item"/);
60
+ assert.doesNotMatch(source, /default-link-component-token/);
48
61
  assert.match(source, /<RouterView \/>/);
49
62
  });
50
63
 
@@ -102,7 +115,6 @@ test("workspaces-web descriptor metadata advertises admin settings outlets", ()
102
115
  [
103
116
  {
104
117
  target: "admin-settings:primary-menu",
105
- defaultLinkComponentToken: "local.main.ui.surface-aware-menu-link-item",
106
118
  surfaces: ["admin"],
107
119
  source: "templates/src/pages/admin/workspace/settings.vue"
108
120
  }
@@ -113,28 +125,78 @@ test("workspaces-web descriptor metadata advertises admin settings outlets", ()
113
125
  [
114
126
  {
115
127
  target: "admin-cog:primary-menu",
116
- defaultLinkComponentToken: "local.main.ui.surface-aware-menu-link-item",
117
128
  surfaces: ["admin"],
118
129
  source: "src/client/components/UsersWorkspaceToolsWidget.vue"
119
130
  }
120
131
  ]
121
132
  );
133
+ assert.deepEqual(findTopology("page.section-nav", "admin-settings"), {
134
+ id: "page.section-nav",
135
+ owner: "admin-settings",
136
+ description: "Navigation between workspace admin settings child pages.",
137
+ surfaces: ["admin"],
138
+ variants: {
139
+ compact: {
140
+ outlet: "admin-settings:primary-menu",
141
+ renderers: {
142
+ link: "local.main.ui.surface-aware-menu-link-item"
143
+ }
144
+ },
145
+ medium: {
146
+ outlet: "admin-settings:primary-menu",
147
+ renderers: {
148
+ link: "local.main.ui.surface-aware-menu-link-item"
149
+ }
150
+ },
151
+ expanded: {
152
+ outlet: "admin-settings:primary-menu",
153
+ renderers: {
154
+ link: "local.main.ui.surface-aware-menu-link-item"
155
+ }
156
+ }
157
+ }
158
+ });
159
+ assert.deepEqual(findTopology("admin.tools-menu"), {
160
+ id: "admin.tools-menu",
161
+ description: "Admin surface tools menu actions.",
162
+ surfaces: ["admin"],
163
+ variants: {
164
+ compact: {
165
+ outlet: "admin-cog:primary-menu",
166
+ renderers: {
167
+ link: "local.main.ui.surface-aware-menu-link-item"
168
+ }
169
+ },
170
+ medium: {
171
+ outlet: "admin-cog:primary-menu",
172
+ renderers: {
173
+ link: "local.main.ui.surface-aware-menu-link-item"
174
+ }
175
+ },
176
+ expanded: {
177
+ outlet: "admin-cog:primary-menu",
178
+ renderers: {
179
+ link: "local.main.ui.surface-aware-menu-link-item"
180
+ }
181
+ }
182
+ }
183
+ });
122
184
  assert.equal(findContribution("workspaces.workspace.settings.general"), null);
123
185
  assert.deepEqual(findContribution("workspaces.workspace.menu.app"), {
124
186
  id: "workspaces.workspace.menu.app",
125
- target: "shell-layout:primary-menu",
187
+ target: "shell.primary-nav",
188
+ kind: "link",
126
189
  surfaces: ["app"],
127
190
  order: 50,
128
- componentToken: "local.main.ui.surface-aware-menu-link-item",
129
191
  when: "auth.authenticated === true",
130
192
  source: "mutations.text#workspaces-web-placement-block"
131
193
  });
132
194
  assert.deepEqual(findContribution("workspaces.workspace.menu.admin"), {
133
195
  id: "workspaces.workspace.menu.admin",
134
- target: "shell-layout:primary-menu",
196
+ target: "shell.primary-nav",
197
+ kind: "link",
135
198
  surfaces: ["admin"],
136
199
  order: 60,
137
- componentToken: "local.main.ui.surface-aware-menu-link-item",
138
200
  when: "auth.authenticated === true",
139
201
  source: "mutations.text#workspaces-web-placement-block"
140
202
  });
@@ -142,7 +204,8 @@ test("workspaces-web descriptor metadata advertises admin settings outlets", ()
142
204
  assert.match(findTextMutation("workspaces-web-placement-block")?.value || "", /id: "workspaces\.workspace\.menu\.admin"[\s\S]*surfaces: \["admin"\][\s\S]*label: "Home"/);
143
205
  assert.deepEqual(findContribution("workspaces.profile.menu.surface-switch"), {
144
206
  id: "workspaces.profile.menu.surface-switch",
145
- target: "auth-profile-menu:primary-menu",
207
+ target: "auth.profile-menu",
208
+ kind: "component",
146
209
  surfaces: ["*"],
147
210
  order: 100,
148
211
  componentToken: "workspaces.web.profile.menu.surface-switch-item",
@@ -151,7 +214,8 @@ test("workspaces-web descriptor metadata advertises admin settings outlets", ()
151
214
  });
152
215
  assert.deepEqual(findContribution("workspaces.workspace.selector"), {
153
216
  id: "workspaces.workspace.selector",
154
- target: "shell-layout:top-left",
217
+ target: "shell.identity",
218
+ kind: "component",
155
219
  surfaces: ["*"],
156
220
  order: 200,
157
221
  componentToken: "workspaces.web.workspace.selector",
@@ -160,7 +224,9 @@ test("workspaces-web descriptor metadata advertises admin settings outlets", ()
160
224
  });
161
225
  assert.deepEqual(findContribution("workspaces.account.settings.invites"), {
162
226
  id: "workspaces.account.settings.invites",
163
- target: "account-settings:sections",
227
+ target: "settings.sections",
228
+ owner: "account-settings",
229
+ kind: "component",
164
230
  surfaces: ["account"],
165
231
  order: 400,
166
232
  componentToken: "local.main.account-settings.section.invites",
@@ -168,8 +234,15 @@ test("workspaces-web descriptor metadata advertises admin settings outlets", ()
168
234
  source: "mutations.text#workspaces-web-account-settings-placement"
169
235
  });
170
236
  assert.match(findTextMutation("workspaces-web-account-settings-placement")?.value || "", /id: "workspaces\.account\.settings\.invites"/);
171
- assert.match(findTextMutation("workspaces-web-account-settings-placement")?.value || "", /target: "account-settings:sections"/);
237
+ assert.match(findTextMutation("workspaces-web-account-settings-placement")?.value || "", /target: "settings\.sections"/);
238
+ assert.match(findTextMutation("workspaces-web-account-settings-placement")?.value || "", /owner: "account-settings"/);
172
239
  assert.match(findTextMutation("workspaces-web-account-settings-placement")?.value || "", /componentToken: "local\.main\.account-settings\.section\.invites"/);
240
+ assert.equal(findTextMutation("workspaces-web-admin-placement-topology")?.file, "src/placementTopology.js");
241
+ assert.match(findTextMutation("workspaces-web-admin-placement-topology")?.value || "", /id: "page\.section-nav"/);
242
+ assert.match(findTextMutation("workspaces-web-admin-placement-topology")?.value || "", /owner: "admin-settings"/);
243
+ assert.match(findTextMutation("workspaces-web-admin-placement-topology")?.value || "", /outlet: "admin-settings:primary-menu"/);
244
+ assert.match(findTextMutation("workspaces-web-admin-placement-topology")?.value || "", /id: "admin\.tools-menu"/);
245
+ assert.match(findTextMutation("workspaces-web-admin-placement-topology")?.value || "", /outlet: "admin-cog:primary-menu"/);
173
246
  assert.deepEqual(findFileMutation("users-web-page-admin-workspace-settings"), {
174
247
  from: "templates/src/pages/admin/workspace/settings/index.vue",
175
248
  toSurface: "admin",