@burdenoff/microfe-workspaces 2026.625.5 → 2026.626.1
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.
- package/dist/pages/ActivityListPage.js +94 -90
- package/dist/pages/ActivityListPage.js.map +1 -1
- package/dist/pages/CreateWorkspacePage.js +68 -63
- package/dist/pages/CreateWorkspacePage.js.map +1 -1
- package/dist/pages/InviteAcceptancePage.js +101 -96
- package/dist/pages/InviteAcceptancePage.js.map +1 -1
- package/dist/pages/MembersListPage.js +185 -184
- package/dist/pages/MembersListPage.js.map +1 -1
- package/dist/pages/PendingInvitesPage.js +70 -68
- package/dist/pages/PendingInvitesPage.js.map +1 -1
- package/dist/pages/ProjectDetailPage.js +119 -78
- package/dist/pages/ProjectDetailPage.js.map +1 -1
- package/dist/pages/ProjectMembersPage.js +105 -104
- package/dist/pages/ProjectMembersPage.js.map +1 -1
- package/dist/pages/ProjectsListPage.js +158 -157
- package/dist/pages/ProjectsListPage.js.map +1 -1
- package/dist/pages/WorkspaceDetailPage.js +236 -198
- package/dist/pages/WorkspaceDetailPage.js.map +1 -1
- package/dist/pages/WorkspaceInvitePage.js +341 -300
- package/dist/pages/WorkspaceInvitePage.js.map +1 -1
- package/dist/pages/WorkspaceSettingsPage.js +87 -85
- package/dist/pages/WorkspaceSettingsPage.js.map +1 -1
- package/dist/pages/WorkspacesListPage.js +122 -121
- package/dist/pages/WorkspacesListPage.js.map +1 -1
- package/dist/pages/dashboard/DashboardPage.js +55 -51
- package/dist/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/pages/dashboard/widgets/GroupsWidget.js +16 -17
- package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/TagCloudWidget.js +18 -19
- package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +10 -11
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
- package/package.json +2 -2
|
@@ -4,115 +4,119 @@ import { useWorkspacePermissions as n } from "../hooks/useWorkspacePermissions.j
|
|
|
4
4
|
import { formatDate as r } from "../utils/formatters.js";
|
|
5
5
|
import { useWorkspaceActivity as i } from "../hooks/useWorkspaceActivity.js";
|
|
6
6
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
7
|
-
import { CardContent as s, CardHeader as c, CardTitle as l, GlassCard as u, IllustratedEmptyState as d,
|
|
8
|
-
import { useParams as
|
|
9
|
-
import { useI18n as
|
|
7
|
+
import { CardContent as s, CardHeader as c, CardTitle as l, GlassCard as u, IllustratedEmptyState as d, PagePurpose as f, Skeleton as p } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
import { useParams as m } from "react-router-dom";
|
|
9
|
+
import { useI18n as h } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
10
10
|
//#region src/pages/ActivityListPage.tsx
|
|
11
|
-
function
|
|
12
|
-
let { t:
|
|
11
|
+
function g() {
|
|
12
|
+
let { t: g } = h(), { workspaceId: _ } = m();
|
|
13
13
|
t("workspaces.activity", {
|
|
14
|
-
workspaceId:
|
|
14
|
+
workspaceId: _,
|
|
15
15
|
requireParams: !0
|
|
16
16
|
});
|
|
17
|
-
let { data:
|
|
18
|
-
return
|
|
17
|
+
let { data: v, isLoading: y, error: b } = i(_), { canViewActivity: x, isLoading: S } = n();
|
|
18
|
+
return S ? /* @__PURE__ */ o("div", {
|
|
19
19
|
className: "space-y-4 p-6",
|
|
20
|
-
children: [/* @__PURE__ */ a(
|
|
21
|
-
}) :
|
|
20
|
+
children: [/* @__PURE__ */ a(p, { className: "h-10 w-1/3" }), /* @__PURE__ */ a(p, { className: "h-64" })]
|
|
21
|
+
}) : x ? /* @__PURE__ */ o("div", {
|
|
22
22
|
className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
|
|
23
|
-
children: [
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
children: e(h, "activityList.loading", "Loading activity…")
|
|
35
|
-
})
|
|
36
|
-
}) : y ? /* @__PURE__ */ a(u, {
|
|
37
|
-
treatment: "plain",
|
|
38
|
-
className: "border-border-seam",
|
|
39
|
-
children: /* @__PURE__ */ a(s, {
|
|
40
|
-
className: "py-8 text-sm text-status-error-text",
|
|
41
|
-
children: y instanceof Error ? y.message : e(h, "activityList.loadError", "Failed to load activity")
|
|
42
|
-
})
|
|
43
|
-
}) : (_?.length ?? 0) === 0 ? /* @__PURE__ */ a(d, {
|
|
44
|
-
illustration: "empty-data",
|
|
45
|
-
title: e(h, "activityList.emptyTitle", "No recent activity"),
|
|
46
|
-
description: e(h, "activityList.emptyDescription", "Recent workspace actions will appear here as your team creates, updates, and manages work.")
|
|
47
|
-
}) : /* @__PURE__ */ a("div", {
|
|
48
|
-
className: "space-y-3",
|
|
49
|
-
children: _?.map((t) => /* @__PURE__ */ o(u, {
|
|
50
|
-
treatment: "insight",
|
|
23
|
+
children: [
|
|
24
|
+
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
|
|
25
|
+
className: "text-2xl sm:text-3xl font-bold",
|
|
26
|
+
children: e(g, "activityList.title", "Activity")
|
|
27
|
+
}), /* @__PURE__ */ a("p", {
|
|
28
|
+
className: "text-text-secondary",
|
|
29
|
+
children: e(g, "activityList.description", "Track workspace activity")
|
|
30
|
+
})] }),
|
|
31
|
+
/* @__PURE__ */ a(f, { children: e(g, "activityList.purpose", "This is the audit trail for the workspace — a running log of who did what and when. Use it to catch up after time away, confirm a change went through, or investigate when and by whom a project or member was modified.") }),
|
|
32
|
+
y ? /* @__PURE__ */ a(u, {
|
|
33
|
+
treatment: "plain",
|
|
51
34
|
className: "border-border-seam",
|
|
52
|
-
children:
|
|
53
|
-
className: "
|
|
54
|
-
children:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
"
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
35
|
+
children: /* @__PURE__ */ a(s, {
|
|
36
|
+
className: "py-8 text-sm text-text-muted",
|
|
37
|
+
children: e(g, "activityList.loading", "Loading activity…")
|
|
38
|
+
})
|
|
39
|
+
}) : b ? /* @__PURE__ */ a(u, {
|
|
40
|
+
treatment: "plain",
|
|
41
|
+
className: "border-border-seam",
|
|
42
|
+
children: /* @__PURE__ */ a(s, {
|
|
43
|
+
className: "py-8 text-sm text-status-error-text",
|
|
44
|
+
children: b instanceof Error ? b.message : e(g, "activityList.loadError", "Failed to load activity")
|
|
45
|
+
})
|
|
46
|
+
}) : (v?.length ?? 0) === 0 ? /* @__PURE__ */ a(d, {
|
|
47
|
+
illustration: "empty-data",
|
|
48
|
+
title: e(g, "activityList.emptyTitle", "No recent activity"),
|
|
49
|
+
description: e(g, "activityList.emptyDescription", "Recent workspace actions will appear here as your team creates, updates, and manages work.")
|
|
50
|
+
}) : /* @__PURE__ */ a("div", {
|
|
51
|
+
className: "space-y-3",
|
|
52
|
+
children: v?.map((t) => /* @__PURE__ */ o(u, {
|
|
53
|
+
treatment: "insight",
|
|
54
|
+
className: "border-border-seam",
|
|
55
|
+
children: [/* @__PURE__ */ a(c, {
|
|
56
|
+
className: "pb-2",
|
|
57
|
+
children: /* @__PURE__ */ a(l, {
|
|
58
|
+
className: "text-base",
|
|
59
|
+
children: t.description || t.action
|
|
60
|
+
})
|
|
61
|
+
}), /* @__PURE__ */ o(s, {
|
|
62
|
+
className: "space-y-1 text-sm text-text-muted",
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ o("p", { children: [
|
|
65
|
+
e(g, "activityList.labelAction", "Action"),
|
|
66
|
+
":",
|
|
67
|
+
" ",
|
|
68
|
+
/* @__PURE__ */ a("span", {
|
|
69
|
+
className: "text-text-primary",
|
|
70
|
+
children: t.action
|
|
71
|
+
})
|
|
72
|
+
] }),
|
|
73
|
+
t.resourceType && /* @__PURE__ */ o("p", { children: [
|
|
74
|
+
e(g, "activityList.labelResource", "Resource"),
|
|
75
|
+
":",
|
|
76
|
+
" ",
|
|
77
|
+
/* @__PURE__ */ a("span", {
|
|
78
|
+
className: "text-text-primary",
|
|
79
|
+
children: t.resourceType
|
|
80
|
+
})
|
|
81
|
+
] }),
|
|
82
|
+
/* @__PURE__ */ o("p", { children: [
|
|
83
|
+
e(g, "activityList.labelWhen", "When"),
|
|
84
|
+
":",
|
|
85
|
+
" ",
|
|
86
|
+
/* @__PURE__ */ a("span", {
|
|
87
|
+
className: "text-text-primary",
|
|
88
|
+
children: r(t.timestamp)
|
|
89
|
+
})
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ o("p", { children: [
|
|
92
|
+
e(g, "activityList.labelActor", "Actor"),
|
|
93
|
+
":",
|
|
94
|
+
" ",
|
|
95
|
+
/* @__PURE__ */ a("span", {
|
|
96
|
+
className: "break-all text-text-primary",
|
|
97
|
+
children: t.userId
|
|
98
|
+
})
|
|
99
|
+
] })
|
|
100
|
+
]
|
|
101
|
+
})]
|
|
102
|
+
}, t.id))
|
|
103
|
+
})
|
|
104
|
+
]
|
|
101
105
|
}) : /* @__PURE__ */ a("div", {
|
|
102
106
|
className: "flex items-center justify-center min-h-[400px]",
|
|
103
107
|
children: /* @__PURE__ */ o("div", {
|
|
104
108
|
className: "text-center space-y-2",
|
|
105
109
|
children: [/* @__PURE__ */ a("h2", {
|
|
106
110
|
className: "text-lg font-semibold",
|
|
107
|
-
children: e(
|
|
111
|
+
children: e(g, "activityList.accessDenied", "Access Denied")
|
|
108
112
|
}), /* @__PURE__ */ a("p", {
|
|
109
113
|
className: "text-sm text-text-secondary",
|
|
110
|
-
children: e(
|
|
114
|
+
children: e(g, "activityList.accessDeniedDescription", "You don't have permission to view activity.")
|
|
111
115
|
})]
|
|
112
116
|
})
|
|
113
117
|
});
|
|
114
118
|
}
|
|
115
119
|
//#endregion
|
|
116
|
-
export {
|
|
120
|
+
export { g as ActivityListPage };
|
|
117
121
|
|
|
118
122
|
//# sourceMappingURL=ActivityListPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActivityListPage.js","names":[],"sources":["../../src/pages/ActivityListPage.tsx"],"sourcesContent":["import { useParams } from 'react-router-dom';\nimport {\n GlassCard,\n CardContent,\n CardHeader,\n CardTitle,\n Skeleton,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { useWorkspaceActivity } from '../hooks/useWorkspaceActivity';\nimport { useWorkspacePermissions } from '../hooks/useWorkspacePermissions';\nimport { useWorkspacesPageView } from '../hooks/useWorkspacesPageView';\nimport { formatDate } from '../utils/formatters';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\n\nexport function ActivityListPage() {\n const { t } = useI18n();\n\n // The URL path `:workspaceId` (when present) intentionally overrides the active\n // context. WorkspaceContextPathSync rewrites this segment on a context switch so\n // the override can't point at a stale workspace. (BOFF-2805 follow-up)\n const { workspaceId } = useParams<{ workspaceId: string }>();\n useWorkspacesPageView('workspaces.activity', { workspaceId, requireParams: true });\n const { data: activities, isLoading, error } = useWorkspaceActivity(workspaceId);\n const { canViewActivity, isLoading: permissionsLoading } = useWorkspacePermissions();\n\n if (permissionsLoading) {\n return (\n <div className=\"space-y-4 p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <Skeleton className=\"h-64\" />\n </div>\n );\n }\n\n if (!canViewActivity) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold\">\n {tWithFallback(t, 'activityList.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n 'activityList.accessDeniedDescription',\n \"You don't have permission to view activity.\"\n )}\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">\n {tWithFallback(t, 'activityList.title', 'Activity')}\n </h1>\n <p className=\"text-text-secondary\">\n {tWithFallback(t, 'activityList.description', 'Track workspace activity')}\n </p>\n </div>\n\n {isLoading ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <CardContent className=\"py-8 text-sm text-text-muted\">\n {tWithFallback(t, 'activityList.loading', 'Loading activity…')}\n </CardContent>\n </GlassCard>\n ) : error ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <CardContent className=\"py-8 text-sm text-status-error-text\">\n {error instanceof Error\n ? error.message\n : tWithFallback(t, 'activityList.loadError', 'Failed to load activity')}\n </CardContent>\n </GlassCard>\n ) : (activities?.length ?? 0) === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tWithFallback(t, 'activityList.emptyTitle', 'No recent activity')}\n description={tWithFallback(\n t,\n 'activityList.emptyDescription',\n 'Recent workspace actions will appear here as your team creates, updates, and manages work.'\n )}\n />\n ) : (\n <div className=\"space-y-3\">\n {activities?.map((item) => (\n <GlassCard key={item.id} treatment=\"insight\" className=\"border-border-seam\">\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"text-base\">{item.description || item.action}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1 text-sm text-text-muted\">\n <p>\n {tWithFallback(t, 'activityList.labelAction', 'Action')}:{' '}\n <span className=\"text-text-primary\">{item.action}</span>\n </p>\n {item.resourceType && (\n <p>\n {tWithFallback(t, 'activityList.labelResource', 'Resource')}:{' '}\n <span className=\"text-text-primary\">{item.resourceType}</span>\n </p>\n )}\n <p>\n {tWithFallback(t, 'activityList.labelWhen', 'When')}:{' '}\n <span className=\"text-text-primary\">{formatDate(item.timestamp)}</span>\n </p>\n <p>\n {tWithFallback(t, 'activityList.labelActor', 'Actor')}:{' '}\n <span className=\"break-all text-text-primary\">{item.userId}</span>\n </p>\n </CardContent>\n </GlassCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ActivityListPage.js","names":[],"sources":["../../src/pages/ActivityListPage.tsx"],"sourcesContent":["import { useParams } from 'react-router-dom';\nimport {\n GlassCard,\n CardContent,\n CardHeader,\n CardTitle,\n Skeleton,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useWorkspaceActivity } from '../hooks/useWorkspaceActivity';\nimport { useWorkspacePermissions } from '../hooks/useWorkspacePermissions';\nimport { useWorkspacesPageView } from '../hooks/useWorkspacesPageView';\nimport { formatDate } from '../utils/formatters';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\n\nexport function ActivityListPage() {\n const { t } = useI18n();\n\n // The URL path `:workspaceId` (when present) intentionally overrides the active\n // context. WorkspaceContextPathSync rewrites this segment on a context switch so\n // the override can't point at a stale workspace. (BOFF-2805 follow-up)\n const { workspaceId } = useParams<{ workspaceId: string }>();\n useWorkspacesPageView('workspaces.activity', { workspaceId, requireParams: true });\n const { data: activities, isLoading, error } = useWorkspaceActivity(workspaceId);\n const { canViewActivity, isLoading: permissionsLoading } = useWorkspacePermissions();\n\n if (permissionsLoading) {\n return (\n <div className=\"space-y-4 p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <Skeleton className=\"h-64\" />\n </div>\n );\n }\n\n if (!canViewActivity) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold\">\n {tWithFallback(t, 'activityList.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n 'activityList.accessDeniedDescription',\n \"You don't have permission to view activity.\"\n )}\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">\n {tWithFallback(t, 'activityList.title', 'Activity')}\n </h1>\n <p className=\"text-text-secondary\">\n {tWithFallback(t, 'activityList.description', 'Track workspace activity')}\n </p>\n </div>\n\n <PagePurpose>\n {tWithFallback(\n t,\n 'activityList.purpose',\n 'This is the audit trail for the workspace — a running log of who did what and when. Use it to catch up after time away, confirm a change went through, or investigate when and by whom a project or member was modified.'\n )}\n </PagePurpose>\n\n {isLoading ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <CardContent className=\"py-8 text-sm text-text-muted\">\n {tWithFallback(t, 'activityList.loading', 'Loading activity…')}\n </CardContent>\n </GlassCard>\n ) : error ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <CardContent className=\"py-8 text-sm text-status-error-text\">\n {error instanceof Error\n ? error.message\n : tWithFallback(t, 'activityList.loadError', 'Failed to load activity')}\n </CardContent>\n </GlassCard>\n ) : (activities?.length ?? 0) === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tWithFallback(t, 'activityList.emptyTitle', 'No recent activity')}\n description={tWithFallback(\n t,\n 'activityList.emptyDescription',\n 'Recent workspace actions will appear here as your team creates, updates, and manages work.'\n )}\n />\n ) : (\n <div className=\"space-y-3\">\n {activities?.map((item) => (\n <GlassCard key={item.id} treatment=\"insight\" className=\"border-border-seam\">\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"text-base\">{item.description || item.action}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1 text-sm text-text-muted\">\n <p>\n {tWithFallback(t, 'activityList.labelAction', 'Action')}:{' '}\n <span className=\"text-text-primary\">{item.action}</span>\n </p>\n {item.resourceType && (\n <p>\n {tWithFallback(t, 'activityList.labelResource', 'Resource')}:{' '}\n <span className=\"text-text-primary\">{item.resourceType}</span>\n </p>\n )}\n <p>\n {tWithFallback(t, 'activityList.labelWhen', 'When')}:{' '}\n <span className=\"text-text-primary\">{formatDate(item.timestamp)}</span>\n </p>\n <p>\n {tWithFallback(t, 'activityList.labelActor', 'Actor')}:{' '}\n <span className=\"break-all text-text-primary\">{item.userId}</span>\n </p>\n </CardContent>\n </GlassCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,IAAmB;CACjC,IAAM,EAAE,SAAM,GAAS,EAKjB,EAAE,mBAAgB,GAAoC;AAC5D,GAAsB,uBAAuB;EAAE;EAAa,eAAe;EAAM,CAAC;CAClF,IAAM,EAAE,MAAM,GAAY,cAAW,aAAU,EAAqB,EAAY,EAC1E,EAAE,oBAAiB,WAAW,MAAuB,GAAyB;AA8BpF,QA5BI,IAEA,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD,EAAU,WAAU,cAAe,CAAA,EACnC,kBAAC,GAAD,EAAU,WAAU,QAAS,CAAA,CACzB;MAIL,IAoBH,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAc,GAAG,sBAAsB,WAAW;IAChD,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cACV,EAAc,GAAG,4BAA4B,2BAA2B;IACvE,CAAA,CACA,EAAA,CAAA;GAEN,kBAAC,GAAD,EAAA,UACG,EACC,GACA,wBACA,2NACD,EACW,CAAA;GAEb,IACC,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cACrC,kBAAC,GAAD;KAAa,WAAU;eACpB,EAAc,GAAG,wBAAwB,oBAAoB;KAClD,CAAA;IACJ,CAAA,GACV,IACF,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cACrC,kBAAC,GAAD;KAAa,WAAU;eACpB,aAAiB,QACd,EAAM,UACN,EAAc,GAAG,0BAA0B,0BAA0B;KAC7D,CAAA;IACJ,CAAA,IACT,GAAY,UAAU,OAAO,IAChC,kBAAC,GAAD;IACE,cAAa;IACb,OAAO,EAAc,GAAG,2BAA2B,qBAAqB;IACxE,aAAa,EACX,GACA,iCACA,6FACD;IACD,CAAA,GAEF,kBAAC,OAAD;IAAK,WAAU;cACZ,GAAY,KAAK,MAChB,kBAAC,GAAD;KAAyB,WAAU;KAAU,WAAU;eAAvD,CACE,kBAAC,GAAD;MAAY,WAAU;gBACpB,kBAAC,GAAD;OAAW,WAAU;iBAAa,EAAK,eAAe,EAAK;OAAmB,CAAA;MACnE,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,KAAD,EAAA,UAAA;QACG,EAAc,GAAG,4BAA4B,SAAS;QAAC;QAAE;QAC1D,kBAAC,QAAD;SAAM,WAAU;mBAAqB,EAAK;SAAc,CAAA;QACtD,EAAA,CAAA;OACH,EAAK,gBACJ,kBAAC,KAAD,EAAA,UAAA;QACG,EAAc,GAAG,8BAA8B,WAAW;QAAC;QAAE;QAC9D,kBAAC,QAAD;SAAM,WAAU;mBAAqB,EAAK;SAAoB,CAAA;QAC5D,EAAA,CAAA;OAEN,kBAAC,KAAD,EAAA,UAAA;QACG,EAAc,GAAG,0BAA0B,OAAO;QAAC;QAAE;QACtD,kBAAC,QAAD;SAAM,WAAU;mBAAqB,EAAW,EAAK,UAAU;SAAQ,CAAA;QACrE,EAAA,CAAA;OACJ,kBAAC,KAAD,EAAA,UAAA;QACG,EAAc,GAAG,2BAA2B,QAAQ;QAAC;QAAE;QACxD,kBAAC,QAAD;SAAM,WAAU;mBAA+B,EAAK;SAAc,CAAA;QAChE,EAAA,CAAA;OACQ;QACJ;OAxBI,EAAK,GAwBT,CACZ;IACE,CAAA;GAEJ;MA3FJ,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAc,GAAG,6BAA6B,gBAAgB;IAC5D,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cACV,EACC,GACA,wCACA,8CACD;IACC,CAAA,CACA;;EACF,CAAA"}
|
|
@@ -3,26 +3,26 @@ import { tWithFallback as t } from "../utils/i18n.js";
|
|
|
3
3
|
import { useWorkspacesPageView as n } from "../hooks/useWorkspacesPageView.js";
|
|
4
4
|
import { useCreateWorkspace as ee } from "../hooks/useWorkspaceMutations.js";
|
|
5
5
|
import { useMyOrganizations as r, useMyTenants as i } from "../hooks/useTenants.js";
|
|
6
|
-
import { generateSlug as
|
|
7
|
-
import { useOrgsWithPermission as
|
|
6
|
+
import { generateSlug as te } from "../utils/slug.js";
|
|
7
|
+
import { useOrgsWithPermission as a } from "../hooks/useOrgsWithPermission.js";
|
|
8
8
|
import { useEffect as o, useMemo as s } from "react";
|
|
9
9
|
import { AlertCircle as c, ArrowLeft as l } from "lucide-react";
|
|
10
10
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
11
|
-
import { Button as f, CardContent as p, CardDescription as m, CardHeader as
|
|
12
|
-
import { Link as
|
|
13
|
-
import { useUpgradePrompt as
|
|
14
|
-
import { AccessDenied as
|
|
15
|
-
import { useI18n as
|
|
16
|
-
import { useForm as
|
|
11
|
+
import { Button as f, CardContent as p, CardDescription as m, CardHeader as h, CardTitle as ne, GlassCard as g, PagePurpose as _, Skeleton as v } from "@burdenoff/fe-libs/ui";
|
|
12
|
+
import { Link as y, useNavigate as b } from "react-router-dom";
|
|
13
|
+
import { useUpgradePrompt as x } from "@burdenoff/fe-libs/shared/hooks";
|
|
14
|
+
import { AccessDenied as S, UpgradeInlineBanner as C } from "@burdenoff/fe-libs/shared/components";
|
|
15
|
+
import { useI18n as w } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
16
|
+
import { useForm as T, z as E } from "@burdenoff/fe-libs/form";
|
|
17
17
|
//#region src/pages/CreateWorkspacePage.tsx
|
|
18
|
-
function
|
|
18
|
+
function D() {
|
|
19
19
|
n("workspaces.create");
|
|
20
|
-
let { t:
|
|
21
|
-
name:
|
|
22
|
-
slug:
|
|
23
|
-
tenantId:
|
|
24
|
-
organizationId:
|
|
25
|
-
}), [
|
|
20
|
+
let { t: D } = w(), { isFree: O, approachingLimits: re, plan: ie } = x({ resource: "workspaces" }), k = re[0], A = !!k && typeof k.limit == "number" && k.current >= k.limit, j = O && !!k, M = s(() => E.object({
|
|
21
|
+
name: E.string().min(2, t(D, "createWorkspace.validation.nameMin", "Name must be at least 2 characters")).max(100),
|
|
22
|
+
slug: E.string().min(2, t(D, "createWorkspace.validation.slugMin", "Slug must be at least 2 characters")).max(50).regex(/^[a-z0-9-]+$/, t(D, "createWorkspace.validation.slugFormat", "Slug can only contain lowercase letters, numbers, and hyphens")),
|
|
23
|
+
tenantId: E.string().min(1, t(D, "createWorkspace.validation.tenantRequired", "Please select a tenant")),
|
|
24
|
+
organizationId: E.string().min(1, t(D, "createWorkspace.validation.organizationRequired", "Please select an organization"))
|
|
25
|
+
}), [D]), N = b(), { basePath: P = "/" } = e(), { mutate: F, isPending: I } = ee(), { data: L, isLoading: R, error: z } = i(), { data: B, isLoading: V, error: H } = r(), U = s(() => L?.items ?? [], [L]), W = s(() => B?.items ?? [], [B]), G = s(() => U.find((e) => e.type === "SHARED" || e.slug === "burdenoff-shared")?.id ?? U[0]?.id ?? "", [U]), K = T({
|
|
26
26
|
schema: M,
|
|
27
27
|
defaultValues: {
|
|
28
28
|
name: "",
|
|
@@ -30,13 +30,13 @@ function E() {
|
|
|
30
30
|
tenantId: "",
|
|
31
31
|
organizationId: ""
|
|
32
32
|
}
|
|
33
|
-
}), q = K.watch("tenantId"), J = K.watch("name"), { allowedIds: Y, loading: X, isError: Z } =
|
|
33
|
+
}), q = K.watch("tenantId"), J = K.watch("name"), { allowedIds: Y, loading: X, isError: Z } = a(s(() => W.map((e) => e.id), [W]), "workspace", "create"), Q = s(() => q ? W.filter((e) => e.tenantId === q) : [], [q, W]), $ = s(() => Z ? Q : Q.filter((e) => Y.has(e.id)), [
|
|
34
34
|
Q,
|
|
35
35
|
Y,
|
|
36
36
|
Z
|
|
37
37
|
]);
|
|
38
38
|
o(() => {
|
|
39
|
-
K.setValue("slug", J ?
|
|
39
|
+
K.setValue("slug", J ? te(J) : "");
|
|
40
40
|
}, [J, K]), o(() => {
|
|
41
41
|
K.setValue("organizationId", "");
|
|
42
42
|
}, [q, K]), o(() => {
|
|
@@ -51,7 +51,7 @@ function E() {
|
|
|
51
51
|
shouldTouch: !1
|
|
52
52
|
});
|
|
53
53
|
}, [$, K]);
|
|
54
|
-
let
|
|
54
|
+
let ae = (e) => {
|
|
55
55
|
F({
|
|
56
56
|
name: e.name,
|
|
57
57
|
slug: e.slug,
|
|
@@ -60,53 +60,58 @@ function E() {
|
|
|
60
60
|
}, { onSuccess: (e) => {
|
|
61
61
|
N(`${P}/${e.id}`);
|
|
62
62
|
} });
|
|
63
|
-
},
|
|
64
|
-
return !
|
|
63
|
+
}, oe = Y.size > 0, se = R || V || X, ce = !z && !H && W.length > 0;
|
|
64
|
+
return !se && !Z && ce && !oe ? /* @__PURE__ */ d("div", {
|
|
65
65
|
className: "p-6",
|
|
66
|
-
children: [/* @__PURE__ */ d(
|
|
66
|
+
children: [/* @__PURE__ */ d(y, {
|
|
67
67
|
to: `${P}/list`,
|
|
68
68
|
className: "inline-flex items-center gap-2 text-text-secondary hover:text-text-primary transition-colors mb-6",
|
|
69
|
-
children: [/* @__PURE__ */ u(l, { size: 20 }), t(
|
|
70
|
-
}), /* @__PURE__ */ u(
|
|
69
|
+
children: [/* @__PURE__ */ u(l, { size: 20 }), t(D, "createWorkspace.backToWorkspaces", "Back to Workspaces")]
|
|
70
|
+
}), /* @__PURE__ */ u(S, {
|
|
71
71
|
variant: "card",
|
|
72
|
-
title: t(
|
|
73
|
-
description: t(
|
|
74
|
-
details: t(
|
|
72
|
+
title: t(D, "createWorkspace.permissionRequiredTitle", "Permission Required"),
|
|
73
|
+
description: t(D, "createWorkspace.permissionRequiredDescription", "You don't have permission to create workspaces in any of your organizations."),
|
|
74
|
+
details: t(D, "createWorkspace.permissionRequiredDetails", "Required: workspace:create"),
|
|
75
75
|
primaryAction: {
|
|
76
|
-
label: t(
|
|
76
|
+
label: t(D, "createWorkspace.goBack", "Go Back"),
|
|
77
77
|
onClick: () => N(`${P}/list`)
|
|
78
78
|
}
|
|
79
79
|
})]
|
|
80
80
|
}) : /* @__PURE__ */ d("div", {
|
|
81
81
|
className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
|
|
82
82
|
children: [
|
|
83
|
-
/* @__PURE__ */ d(
|
|
83
|
+
/* @__PURE__ */ d(y, {
|
|
84
84
|
to: `${P}/list`,
|
|
85
85
|
className: "inline-flex items-center gap-2 text-text-secondary hover:text-text-primary transition-colors",
|
|
86
|
-
children: [/* @__PURE__ */ u(l, { size: 20 }), t(
|
|
86
|
+
children: [/* @__PURE__ */ u(l, { size: 20 }), t(D, "createWorkspace.backToWorkspaces", "Back to Workspaces")]
|
|
87
87
|
}),
|
|
88
|
-
|
|
88
|
+
/* @__PURE__ */ u("div", {
|
|
89
89
|
className: "max-w-2xl mx-auto w-full",
|
|
90
|
-
children: /* @__PURE__ */ u(
|
|
90
|
+
children: /* @__PURE__ */ u(_, { children: t(D, "createWorkspace.purpose", "Create a workspace to give a team, client or initiative its own dedicated space — with its own projects, members, agents and activity, kept separate from the rest. Give it a clear name, pick the organization that owns it, and you can invite people and add projects right after.") })
|
|
91
|
+
}),
|
|
92
|
+
j && /* @__PURE__ */ u("div", {
|
|
93
|
+
className: "max-w-2xl mx-auto w-full",
|
|
94
|
+
children: /* @__PURE__ */ u(C, {
|
|
91
95
|
resource: "workspaces",
|
|
92
|
-
current:
|
|
93
|
-
limit:
|
|
94
|
-
severity:
|
|
95
|
-
message:
|
|
96
|
+
current: k.current,
|
|
97
|
+
limit: k.limit ?? void 0,
|
|
98
|
+
severity: A ? "critical" : void 0,
|
|
99
|
+
message: A ? t(D, "createWorkspace.upgradeCapMessage", `You've used all workspaces in the ${ie?.planName ?? "free"} plan.`) : t(D, "createWorkspace.upgradeApproachingMessage", "Upgrade to create more workspaces.")
|
|
96
100
|
})
|
|
97
101
|
}),
|
|
98
102
|
/* @__PURE__ */ d(g, {
|
|
99
|
-
treatment: "
|
|
103
|
+
treatment: "glass",
|
|
104
|
+
glow: !0,
|
|
100
105
|
className: "max-w-2xl mx-auto border-border-seam",
|
|
101
|
-
children: [/* @__PURE__ */ d(
|
|
106
|
+
children: [/* @__PURE__ */ d(h, { children: [/* @__PURE__ */ u(ne, { children: t(D, "createWorkspace.title", "Create New Workspace") }), /* @__PURE__ */ u(m, { children: t(D, "createWorkspace.subtitle", "Set up a new workspace for your team") })] }), /* @__PURE__ */ d(p, { children: [Z && /* @__PURE__ */ d("div", {
|
|
102
107
|
role: "alert",
|
|
103
108
|
className: "mb-4 flex items-start gap-2 rounded-md border border-warning/30 bg-warning/10 p-3 text-sm text-text-primary",
|
|
104
109
|
children: [/* @__PURE__ */ u(c, {
|
|
105
110
|
size: 16,
|
|
106
111
|
className: "mt-0.5 shrink-0 text-warning"
|
|
107
|
-
}), /* @__PURE__ */ u("span", { children: t(
|
|
112
|
+
}), /* @__PURE__ */ u("span", { children: t(D, "createWorkspace.permissionCheckUnavailable", "We couldn't verify your workspace-create permissions just now, so the organization list isn't filtered. If you submit and don't have access, the request will be rejected and you can retry.") })]
|
|
108
113
|
}), /* @__PURE__ */ d("form", {
|
|
109
|
-
onSubmit: K.handleSubmit(
|
|
114
|
+
onSubmit: K.handleSubmit(ae),
|
|
110
115
|
className: "space-y-6",
|
|
111
116
|
children: [
|
|
112
117
|
/* @__PURE__ */ d("div", {
|
|
@@ -115,17 +120,17 @@ function E() {
|
|
|
115
120
|
/* @__PURE__ */ u("label", {
|
|
116
121
|
htmlFor: "workspace-name",
|
|
117
122
|
className: "text-sm font-medium text-text-primary",
|
|
118
|
-
children: t(
|
|
123
|
+
children: t(D, "createWorkspace.nameLabel", "Workspace Name *")
|
|
119
124
|
}),
|
|
120
125
|
/* @__PURE__ */ u("input", {
|
|
121
126
|
id: "workspace-name",
|
|
122
|
-
placeholder: t(
|
|
127
|
+
placeholder: t(D, "createWorkspace.namePlaceholder", "My Workspace"),
|
|
123
128
|
className: "h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary",
|
|
124
129
|
...K.register("name")
|
|
125
130
|
}),
|
|
126
131
|
/* @__PURE__ */ u("p", {
|
|
127
132
|
className: "text-xs text-text-secondary",
|
|
128
|
-
children: t(
|
|
133
|
+
children: t(D, "createWorkspace.nameHint", "A descriptive name for your workspace")
|
|
129
134
|
}),
|
|
130
135
|
K.formState.errors.name?.message && /* @__PURE__ */ u("p", {
|
|
131
136
|
className: "text-sm text-status-error-text",
|
|
@@ -139,17 +144,17 @@ function E() {
|
|
|
139
144
|
/* @__PURE__ */ u("label", {
|
|
140
145
|
htmlFor: "workspace-slug",
|
|
141
146
|
className: "text-sm font-medium text-text-primary",
|
|
142
|
-
children: t(
|
|
147
|
+
children: t(D, "createWorkspace.slugLabel", "Slug *")
|
|
143
148
|
}),
|
|
144
149
|
/* @__PURE__ */ u("input", {
|
|
145
150
|
id: "workspace-slug",
|
|
146
|
-
placeholder: t(
|
|
151
|
+
placeholder: t(D, "createWorkspace.slugPlaceholder", "my-workspace"),
|
|
147
152
|
className: "h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary",
|
|
148
153
|
...K.register("slug")
|
|
149
154
|
}),
|
|
150
155
|
/* @__PURE__ */ u("p", {
|
|
151
156
|
className: "text-xs text-text-secondary",
|
|
152
|
-
children: t(
|
|
157
|
+
children: t(D, "createWorkspace.slugHint", "URL-friendly identifier (auto-generated, but you can edit it)")
|
|
153
158
|
}),
|
|
154
159
|
K.formState.errors.slug?.message && /* @__PURE__ */ u("p", {
|
|
155
160
|
className: "text-sm text-status-error-text",
|
|
@@ -163,21 +168,21 @@ function E() {
|
|
|
163
168
|
/* @__PURE__ */ u("label", {
|
|
164
169
|
htmlFor: "workspace-tenant",
|
|
165
170
|
className: "text-sm font-medium text-text-primary",
|
|
166
|
-
children: t(
|
|
171
|
+
children: t(D, "createWorkspace.tenantLabel", "Tenant *")
|
|
167
172
|
}),
|
|
168
|
-
R ? /* @__PURE__ */ u(
|
|
173
|
+
R ? /* @__PURE__ */ u(v, { className: "h-10 w-full" }) : z ? /* @__PURE__ */ d("div", {
|
|
169
174
|
className: "flex items-center gap-2 text-sm text-status-error-text",
|
|
170
|
-
children: [/* @__PURE__ */ u(c, { size: 16 }), t(
|
|
175
|
+
children: [/* @__PURE__ */ u(c, { size: 16 }), t(D, "createWorkspace.failedToLoadTenants", "Failed to load tenants")]
|
|
171
176
|
}) : U.length === 0 ? /* @__PURE__ */ u("div", {
|
|
172
177
|
className: "text-sm text-text-secondary",
|
|
173
|
-
children: t(
|
|
178
|
+
children: t(D, "createWorkspace.noTenantsAvailable", "No tenants available. Contact your administrator.")
|
|
174
179
|
}) : /* @__PURE__ */ d("select", {
|
|
175
180
|
id: "workspace-tenant",
|
|
176
181
|
className: "h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary",
|
|
177
182
|
...K.register("tenantId"),
|
|
178
183
|
children: [/* @__PURE__ */ u("option", {
|
|
179
184
|
value: "",
|
|
180
|
-
children: t(
|
|
185
|
+
children: t(D, "createWorkspace.selectTenantPlaceholder", "Select a tenant")
|
|
181
186
|
}), U.map((e) => /* @__PURE__ */ u("option", {
|
|
182
187
|
value: e.id,
|
|
183
188
|
children: e.name
|
|
@@ -185,7 +190,7 @@ function E() {
|
|
|
185
190
|
}),
|
|
186
191
|
/* @__PURE__ */ u("p", {
|
|
187
192
|
className: "text-xs text-text-secondary",
|
|
188
|
-
children: t(
|
|
193
|
+
children: t(D, "createWorkspace.tenantHint", "Select which tenant this workspace belongs to")
|
|
189
194
|
}),
|
|
190
195
|
K.formState.errors.tenantId?.message && /* @__PURE__ */ u("p", {
|
|
191
196
|
className: "text-sm text-status-error-text",
|
|
@@ -199,14 +204,14 @@ function E() {
|
|
|
199
204
|
/* @__PURE__ */ u("label", {
|
|
200
205
|
htmlFor: "workspace-organization",
|
|
201
206
|
className: "text-sm font-medium text-text-primary",
|
|
202
|
-
children: t(
|
|
207
|
+
children: t(D, "createWorkspace.organizationLabel", "Organization *")
|
|
203
208
|
}),
|
|
204
|
-
V || X ? /* @__PURE__ */ u(
|
|
209
|
+
V || X ? /* @__PURE__ */ u(v, { className: "h-10 w-full" }) : H ? /* @__PURE__ */ d("div", {
|
|
205
210
|
className: "flex items-center gap-2 text-sm text-status-error-text",
|
|
206
|
-
children: [/* @__PURE__ */ u(c, { size: 16 }), t(
|
|
211
|
+
children: [/* @__PURE__ */ u(c, { size: 16 }), t(D, "createWorkspace.failedToLoadOrganizations", "Failed to load organizations")]
|
|
207
212
|
}) : q ? $.length === 0 ? /* @__PURE__ */ u("div", {
|
|
208
213
|
className: "text-sm text-text-secondary",
|
|
209
|
-
children: t(
|
|
214
|
+
children: t(D, "createWorkspace.noOrganizationsFound", "No organizations found for this tenant")
|
|
210
215
|
}) : /* @__PURE__ */ d("select", {
|
|
211
216
|
id: "workspace-organization",
|
|
212
217
|
className: "h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary",
|
|
@@ -214,18 +219,18 @@ function E() {
|
|
|
214
219
|
...K.register("organizationId"),
|
|
215
220
|
children: [/* @__PURE__ */ u("option", {
|
|
216
221
|
value: "",
|
|
217
|
-
children: t(
|
|
222
|
+
children: t(D, "createWorkspace.selectOrganizationPlaceholder", "Select an organization")
|
|
218
223
|
}), $.map((e) => /* @__PURE__ */ u("option", {
|
|
219
224
|
value: e.id,
|
|
220
225
|
children: e.name
|
|
221
226
|
}, e.id))]
|
|
222
227
|
}) : /* @__PURE__ */ u("div", {
|
|
223
228
|
className: "text-sm text-text-secondary",
|
|
224
|
-
children: t(
|
|
229
|
+
children: t(D, "createWorkspace.selectTenantFirst", "Please select a tenant first")
|
|
225
230
|
}),
|
|
226
231
|
/* @__PURE__ */ u("p", {
|
|
227
232
|
className: "text-xs text-text-secondary",
|
|
228
|
-
children: t(
|
|
233
|
+
children: t(D, "createWorkspace.organizationHint", "Select which organization owns this workspace")
|
|
229
234
|
}),
|
|
230
235
|
K.formState.errors.organizationId?.message && /* @__PURE__ */ u("p", {
|
|
231
236
|
className: "text-sm text-status-error-text",
|
|
@@ -240,12 +245,12 @@ function E() {
|
|
|
240
245
|
variant: "outline",
|
|
241
246
|
onClick: () => N(`${P}/list`),
|
|
242
247
|
disabled: I,
|
|
243
|
-
children: t(
|
|
248
|
+
children: t(D, "createWorkspace.cancel", "Cancel")
|
|
244
249
|
}), /* @__PURE__ */ u(f, {
|
|
245
250
|
type: "submit",
|
|
246
|
-
disabled: I || R || V || X ||
|
|
247
|
-
title:
|
|
248
|
-
children: I ? t(
|
|
251
|
+
disabled: I || R || V || X || A,
|
|
252
|
+
title: A ? t(D, "createWorkspace.disabledAtCap", "Workspace limit reached — upgrade your plan to create more.") : void 0,
|
|
253
|
+
children: I ? t(D, "createWorkspace.creating", "Creating...") : t(D, "createWorkspace.submit", "Create Workspace")
|
|
249
254
|
})]
|
|
250
255
|
})
|
|
251
256
|
]
|
|
@@ -255,6 +260,6 @@ function E() {
|
|
|
255
260
|
});
|
|
256
261
|
}
|
|
257
262
|
//#endregion
|
|
258
|
-
export {
|
|
263
|
+
export { D as CreateWorkspacePage };
|
|
259
264
|
|
|
260
265
|
//# sourceMappingURL=CreateWorkspacePage.js.map
|