@burdenoff/microfe-workspaces 2026.531.2 → 2026.531.3
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/WorkspacesRoutes.js +30 -15
- package/dist/WorkspacesRoutes.js.map +1 -1
- package/dist/components/InviteMemberDialog.js +204 -117
- package/dist/components/InviteMemberDialog.js.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useMemberMutations.js +10 -10
- package/dist/hooks/useMemberMutations.js.map +1 -1
- package/dist/index.js +12 -11
- package/dist/pages/ActivityListPage.js +5 -5
- package/dist/pages/InviteAcceptancePage.js +211 -207
- package/dist/pages/InviteAcceptancePage.js.map +1 -1
- package/dist/pages/MembersListPage.js +209 -208
- package/dist/pages/MembersListPage.js.map +1 -1
- package/dist/pages/PendingInvitesPage.js +124 -120
- package/dist/pages/PendingInvitesPage.js.map +1 -1
- package/dist/pages/ProjectDetailPage.js +6 -6
- package/dist/pages/ProjectDetailPage.js.map +1 -1
- package/dist/pages/ProjectsListPage.js +9 -9
- package/dist/pages/WorkspaceDetailPage.js +119 -111
- package/dist/pages/WorkspaceDetailPage.js.map +1 -1
- package/dist/pages/WorkspaceInvitePage.js +790 -0
- package/dist/pages/WorkspaceInvitePage.js.map +1 -0
- package/dist/pages/WorkspacesListPage.js +115 -100
- package/dist/pages/WorkspacesListPage.js.map +1 -1
- package/dist/utils/invitationDisplay.js +25 -0
- package/dist/utils/invitationDisplay.js.map +1 -0
- package/dist/utils/workspaceBulkInviteCsv.js +42 -0
- package/dist/utils/workspaceBulkInviteCsv.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invitationDisplay.js","names":[],"sources":["../../src/utils/invitationDisplay.ts"],"sourcesContent":["import type { WorkspaceInvitation } from '../types';\n\ntype InvitationLike = Pick<\n WorkspaceInvitation,\n 'workspaceName' | 'workspaceId' | 'roleNames' | 'roleIds' | 'projectId' | 'projectIds' | 'context'\n>;\n\nexport function getWorkspaceDisplayName(invitation: InvitationLike): string {\n if (invitation.workspaceName) {\n return invitation.workspaceName;\n }\n\n const metadataWorkspaceName = invitation.context?.metadata?.workspaceName;\n if (typeof metadataWorkspaceName === 'string' && metadataWorkspaceName.trim().length > 0) {\n return metadataWorkspaceName;\n }\n\n return invitation.workspaceId || '—';\n}\n\nexport function getRoleDisplayNames(invitation: InvitationLike): string[] {\n if (Array.isArray(invitation.roleNames) && invitation.roleNames.length > 0) {\n return invitation.roleNames;\n }\n\n const metadataRoleNames = invitation.context?.metadata?.roleNames;\n if (\n Array.isArray(metadataRoleNames) &&\n metadataRoleNames.every((value) => typeof value === 'string')\n ) {\n return metadataRoleNames;\n }\n\n return invitation.roleIds;\n}\n\nexport function getProjectDisplayNames(invitation: InvitationLike): string[] {\n const metadataProjectNames = invitation.context?.metadata?.projectNames;\n if (\n Array.isArray(metadataProjectNames) &&\n metadataProjectNames.every((value) => typeof value === 'string')\n ) {\n return metadataProjectNames;\n }\n\n const metadataProjectIds = invitation.context?.metadata?.projectIds;\n const projectIds = [\n ...(Array.isArray(invitation.projectIds) ? invitation.projectIds : []),\n ...(invitation.projectId ? [invitation.projectId] : []),\n ...(Array.isArray(metadataProjectIds)\n ? metadataProjectIds.filter((value): value is string => typeof value === 'string')\n : []),\n ];\n const projectCount = new Set(projectIds).size;\n\n if (projectCount === 0) {\n return [];\n }\n\n return [`${projectCount} project${projectCount === 1 ? '' : 's'} selected`];\n}\n"],"mappings":";AAOA,SAAgB,EAAwB,GAAoC;AAC1E,KAAI,EAAW,cACb,QAAO,EAAW;CAGpB,IAAM,IAAwB,EAAW,SAAS,UAAU;AAK5D,QAJI,OAAO,KAA0B,YAAY,EAAsB,MAAM,CAAC,SAAS,IAC9E,IAGF,EAAW,eAAe;;AAGnC,SAAgB,EAAoB,GAAsC;AACxE,KAAI,MAAM,QAAQ,EAAW,UAAU,IAAI,EAAW,UAAU,SAAS,EACvE,QAAO,EAAW;CAGpB,IAAM,IAAoB,EAAW,SAAS,UAAU;AAQxD,QANE,MAAM,QAAQ,EAAkB,IAChC,EAAkB,OAAO,MAAU,OAAO,KAAU,SAAS,GAEtD,IAGF,EAAW;;AAGpB,SAAgB,EAAuB,GAAsC;CAC3E,IAAM,IAAuB,EAAW,SAAS,UAAU;AAC3D,KACE,MAAM,QAAQ,EAAqB,IACnC,EAAqB,OAAO,MAAU,OAAO,KAAU,SAAS,CAEhE,QAAO;CAGT,IAAM,IAAqB,EAAW,SAAS,UAAU,YACnD,IAAa;EACjB,GAAI,MAAM,QAAQ,EAAW,WAAW,GAAG,EAAW,aAAa,EAAE;EACrE,GAAI,EAAW,YAAY,CAAC,EAAW,UAAU,GAAG,EAAE;EACtD,GAAI,MAAM,QAAQ,EAAmB,GACjC,EAAmB,QAAQ,MAA2B,OAAO,KAAU,SAAS,GAChF,EAAE;EACP,EACK,IAAe,IAAI,IAAI,EAAW,CAAC;AAMzC,QAJI,MAAiB,IACZ,EAAE,GAGJ,CAAC,GAAG,EAAa,UAAU,MAAiB,IAAI,KAAK,IAAI,WAAW"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//#region src/utils/workspaceBulkInviteCsv.ts
|
|
2
|
+
var e = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
3
|
+
function t(e) {
|
|
4
|
+
let t = [], n = "", r = !1;
|
|
5
|
+
for (let i = 0; i < e.length; i += 1) {
|
|
6
|
+
let a = e[i];
|
|
7
|
+
r ? a === "\"" ? e[i + 1] === "\"" ? (n += "\"", i += 1) : r = !1 : n += a : a === "\"" ? r = !0 : a === "," ? (t.push(n), n = "") : n += a;
|
|
8
|
+
}
|
|
9
|
+
return t.push(n), t.map((e) => e.trim());
|
|
10
|
+
}
|
|
11
|
+
function n(n) {
|
|
12
|
+
let r = n.replace(/^\uFEFF/, "").split(/\r?\n/).filter((e) => e.trim().length > 0);
|
|
13
|
+
if (r.length === 0) return [];
|
|
14
|
+
let i = t(r[0]).map((e) => e.toLowerCase()).indexOf("email");
|
|
15
|
+
if (i === -1) return [{
|
|
16
|
+
rowNumber: 1,
|
|
17
|
+
email: "",
|
|
18
|
+
errors: ["CSV header must include an \"email\" column."]
|
|
19
|
+
}];
|
|
20
|
+
let a = /* @__PURE__ */ new Set();
|
|
21
|
+
return r.slice(1).map((n, r) => {
|
|
22
|
+
let o = r + 2, s = (t(n)[i] ?? "").trim().toLowerCase(), c = [];
|
|
23
|
+
return s ? e.test(s) ? a.has(s) ? c.push("Duplicate email in this CSV.") : a.add(s) : c.push("Invalid email format.") : c.push("Email is required."), {
|
|
24
|
+
rowNumber: o,
|
|
25
|
+
email: s,
|
|
26
|
+
errors: c
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
var r = "workspace-invite-template.csv", i = [
|
|
31
|
+
"email",
|
|
32
|
+
"alice@example.com",
|
|
33
|
+
"bob@example.com"
|
|
34
|
+
].join("\n");
|
|
35
|
+
function a() {
|
|
36
|
+
let e = new Blob([i], { type: "text/csv;charset=utf-8" }), t = URL.createObjectURL(e), n = document.createElement("a");
|
|
37
|
+
n.href = t, n.download = r, document.body.appendChild(n), n.click(), document.body.removeChild(n), URL.revokeObjectURL(t);
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { a as downloadWorkspaceBulkInviteTemplate, n as parseWorkspaceBulkInviteCsv };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=workspaceBulkInviteCsv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceBulkInviteCsv.js","names":[],"sources":["../../src/utils/workspaceBulkInviteCsv.ts"],"sourcesContent":["const EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nexport interface WorkspaceBulkInviteRow {\n rowNumber: number;\n email: string;\n errors: string[];\n}\n\nfunction splitCsvLine(line: string): string[] {\n const fields: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i += 1) {\n const ch = line[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (line[i + 1] === '\"') {\n current += '\"';\n i += 1;\n } else {\n inQuotes = false;\n }\n } else {\n current += ch;\n }\n } else if (ch === '\"') {\n inQuotes = true;\n } else if (ch === ',') {\n fields.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n\n fields.push(current);\n return fields.map((field) => field.trim());\n}\n\nexport function parseWorkspaceBulkInviteCsv(text: string): WorkspaceBulkInviteRow[] {\n const lines = text\n .replace(/^\\uFEFF/, '')\n .split(/\\r?\\n/)\n .filter((line) => line.trim().length > 0);\n\n if (lines.length === 0) {\n return [];\n }\n\n const header = splitCsvLine(lines[0]).map((column) => column.toLowerCase());\n const emailIdx = header.indexOf('email');\n\n if (emailIdx === -1) {\n return [\n {\n rowNumber: 1,\n email: '',\n errors: ['CSV header must include an \"email\" column.'],\n },\n ];\n }\n\n const seen = new Set<string>();\n\n return lines.slice(1).map((line, index) => {\n const rowNumber = index + 2;\n const fields = splitCsvLine(line);\n const email = (fields[emailIdx] ?? '').trim().toLowerCase();\n const errors: string[] = [];\n\n if (!email) {\n errors.push('Email is required.');\n } else if (!EMAIL_RE.test(email)) {\n errors.push('Invalid email format.');\n } else if (seen.has(email)) {\n errors.push('Duplicate email in this CSV.');\n } else {\n seen.add(email);\n }\n\n return {\n rowNumber,\n email,\n errors,\n };\n });\n}\n\nexport const WORKSPACE_BULK_INVITE_TEMPLATE_FILENAME = 'workspace-invite-template.csv';\n\nexport const WORKSPACE_BULK_INVITE_TEMPLATE_CONTENT = [\n 'email',\n 'alice@example.com',\n 'bob@example.com',\n].join('\\n');\n\nexport function downloadWorkspaceBulkInviteTemplate(): void {\n const blob = new Blob([WORKSPACE_BULK_INVITE_TEMPLATE_CONTENT], {\n type: 'text/csv;charset=utf-8',\n });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = WORKSPACE_BULK_INVITE_TEMPLATE_FILENAME;\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(url);\n}\n"],"mappings":";AAAA,IAAM,IAAW;AAQjB,SAAS,EAAa,GAAwB;CAC5C,IAAM,IAAmB,EAAE,EACvB,IAAU,IACV,IAAW;AAEf,MAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK,GAAG;EACvC,IAAM,IAAK,EAAK;AAChB,EAAI,IACE,MAAO,OACL,EAAK,IAAI,OAAO,QAClB,KAAW,MACX,KAAK,KAEL,IAAW,KAGb,KAAW,IAEJ,MAAO,OAChB,IAAW,KACF,MAAO,OAChB,EAAO,KAAK,EAAQ,EACpB,IAAU,MAEV,KAAW;;AAKf,QADA,EAAO,KAAK,EAAQ,EACb,EAAO,KAAK,MAAU,EAAM,MAAM,CAAC;;AAG5C,SAAgB,EAA4B,GAAwC;CAClF,IAAM,IAAQ,EACX,QAAQ,WAAW,GAAG,CACtB,MAAM,QAAQ,CACd,QAAQ,MAAS,EAAK,MAAM,CAAC,SAAS,EAAE;AAE3C,KAAI,EAAM,WAAW,EACnB,QAAO,EAAE;CAIX,IAAM,IADS,EAAa,EAAM,GAAG,CAAC,KAAK,MAAW,EAAO,aAAa,CAAC,CACnD,QAAQ,QAAQ;AAExC,KAAI,MAAa,GACf,QAAO,CACL;EACE,WAAW;EACX,OAAO;EACP,QAAQ,CAAC,+CAA6C;EACvD,CACF;CAGH,IAAM,oBAAO,IAAI,KAAa;AAE9B,QAAO,EAAM,MAAM,EAAE,CAAC,KAAK,GAAM,MAAU;EACzC,IAAM,IAAY,IAAQ,GAEpB,KADS,EAAa,EAAK,CACX,MAAa,IAAI,MAAM,CAAC,aAAa,EACrD,IAAmB,EAAE;AAY3B,SAVK,IAEO,EAAS,KAAK,EAAM,GAErB,EAAK,IAAI,EAAM,GACxB,EAAO,KAAK,+BAA+B,GAE3C,EAAK,IAAI,EAAM,GAJf,EAAO,KAAK,wBAAwB,GAFpC,EAAO,KAAK,qBAAqB,EAS5B;GACL;GACA;GACA;GACD;GACD;;AAGJ,IAAa,IAA0C,iCAE1C,IAAyC;CACpD;CACA;CACA;CACD,CAAC,KAAK,KAAK;AAEZ,SAAgB,IAA4C;CAC1D,IAAM,IAAO,IAAI,KAAK,CAAC,EAAuC,EAAE,EAC9D,MAAM,0BACP,CAAC,EACI,IAAM,IAAI,gBAAgB,EAAK,EAC/B,IAAS,SAAS,cAAc,IAAI;AAM1C,CALA,EAAO,OAAO,GACd,EAAO,WAAW,GAClB,SAAS,KAAK,YAAY,EAAO,EACjC,EAAO,OAAO,EACd,SAAS,KAAK,YAAY,EAAO,EACjC,IAAI,gBAAgB,EAAI"}
|