@burdenoff/microfe-crewfoundry 2026.716.1 → 2026.719.2

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 (23) hide show
  1. package/dist/crewfoundry/CrewFoundryRoutes.d.ts.map +1 -1
  2. package/dist/crewfoundry/CrewFoundryRoutes.js +53 -49
  3. package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
  4. package/dist/crewfoundry/components/forms/AttachDocumentDialog.d.ts +16 -0
  5. package/dist/crewfoundry/components/forms/AttachDocumentDialog.d.ts.map +1 -0
  6. package/dist/crewfoundry/components/forms/AttachDocumentDialog.js +123 -0
  7. package/dist/crewfoundry/components/forms/AttachDocumentDialog.js.map +1 -0
  8. package/dist/crewfoundry/components/viz/StepProgress.js +64 -3
  9. package/dist/crewfoundry/components/viz/StepProgress.js.map +1 -0
  10. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +3 -3
  11. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  12. package/dist/crewfoundry/pages/HiringOnboardingPagePage.d.ts +2 -0
  13. package/dist/crewfoundry/pages/HiringOnboardingPagePage.d.ts.map +1 -0
  14. package/dist/crewfoundry/pages/HiringOnboardingPagePage.js +323 -0
  15. package/dist/crewfoundry/pages/HiringOnboardingPagePage.js.map +1 -0
  16. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.d.ts.map +1 -1
  17. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js +208 -118
  18. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js.map +1 -1
  19. package/dist/crewfoundry/store/crewfoundryStore.d.ts +72 -0
  20. package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
  21. package/dist/crewfoundry/store/crewfoundryStore.js +224 -116
  22. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  23. package/package.json +1 -1
@@ -1,3 +1,64 @@
1
- import "./lib/palette.js";
2
- import "lucide-react";
3
- import "react/jsx-runtime";
1
+ import { ACCENT as e } from "./lib/palette.js";
2
+ import { cn as t } from "../../utils/cn.js";
3
+ import { Check as n } from "lucide-react";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ //#region src/crewfoundry/components/viz/StepProgress.tsx
6
+ function a({ steps: a, current: o, className: s }) {
7
+ return a.length === 0 ? null : /* @__PURE__ */ r("ol", {
8
+ className: t("flex items-start overflow-x-auto pb-1", s),
9
+ "aria-label": "Progress",
10
+ children: a.map((s, c) => {
11
+ let l = c < o ? "complete" : c === o ? "current" : "upcoming";
12
+ return /* @__PURE__ */ i("li", {
13
+ className: "flex min-w-[5rem] flex-1 flex-col items-center",
14
+ "aria-current": l === "current" ? "step" : void 0,
15
+ children: [
16
+ /* @__PURE__ */ i("div", {
17
+ className: "flex w-full items-center",
18
+ children: [
19
+ c > 0 ? /* @__PURE__ */ r("span", {
20
+ "aria-hidden": "true",
21
+ className: "h-0.5 flex-1 rounded-full",
22
+ style: { backgroundColor: c <= o ? e : "var(--color-border-subtle)" }
23
+ }) : /* @__PURE__ */ r("span", {
24
+ className: "flex-1",
25
+ "aria-hidden": "true"
26
+ }),
27
+ /* @__PURE__ */ r("span", {
28
+ className: t("flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 text-xs font-semibold tabular-nums transition-colors", l === "complete" && "border-transparent text-text-inverse", l === "current" && "bg-bg-surface", l === "upcoming" && "border-border-subtle bg-bg-sunken text-text-muted"),
29
+ style: l === "complete" ? { backgroundColor: e } : l === "current" ? {
30
+ borderColor: e,
31
+ color: e
32
+ } : void 0,
33
+ children: l === "complete" ? /* @__PURE__ */ r(n, {
34
+ "aria-hidden": "true",
35
+ className: "h-4 w-4"
36
+ }) : c + 1
37
+ }),
38
+ c < a.length - 1 ? /* @__PURE__ */ r("span", {
39
+ "aria-hidden": "true",
40
+ className: "h-0.5 flex-1 rounded-full",
41
+ style: { backgroundColor: c < o ? e : "var(--color-border-subtle)" }
42
+ }) : /* @__PURE__ */ r("span", {
43
+ className: "flex-1",
44
+ "aria-hidden": "true"
45
+ })
46
+ ]
47
+ }),
48
+ /* @__PURE__ */ r("span", {
49
+ className: t("mt-2 px-1 text-center text-xs", l === "upcoming" ? "text-text-muted" : "font-medium text-text-primary"),
50
+ children: s.label
51
+ }),
52
+ s.description ? /* @__PURE__ */ r("span", {
53
+ className: "mt-0.5 px-1 text-center text-[11px] text-text-muted",
54
+ children: s.description
55
+ }) : null
56
+ ]
57
+ }, `${s.label}-${c}`);
58
+ })
59
+ });
60
+ }
61
+ //#endregion
62
+ export { a as StepProgress };
63
+
64
+ //# sourceMappingURL=StepProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepProgress.js","names":[],"sources":["../../../../src/crewfoundry/components/viz/StepProgress.tsx"],"sourcesContent":["import { Check } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { ACCENT } from './lib/palette';\n\nexport interface StepProgressStep {\n label: string;\n description?: string;\n}\n\nexport interface StepProgressProps {\n steps: StepProgressStep[];\n /** Zero-based index of the current (in-progress) step. */\n current: number;\n className?: string;\n}\n\ntype StepState = 'complete' | 'current' | 'upcoming';\n\n/**\n * Horizontal stage tracker (e.g. Offer → Paperwork → IT → Training → Day 1).\n * Completed steps are filled with a check, the current step is highlighted and\n * future steps are muted. Scrolls horizontally on narrow screens.\n */\nexport function StepProgress({ steps, current, className }: StepProgressProps) {\n if (steps.length === 0) {\n return null;\n }\n return (\n <ol className={cn('flex items-start overflow-x-auto pb-1', className)} aria-label=\"Progress\">\n {steps.map((step, i) => {\n const state: StepState = i < current ? 'complete' : i === current ? 'current' : 'upcoming';\n const connectorFilled = i <= current;\n return (\n <li\n key={`${step.label}-${i}`}\n className=\"flex min-w-[5rem] flex-1 flex-col items-center\"\n aria-current={state === 'current' ? 'step' : undefined}\n >\n <div className=\"flex w-full items-center\">\n {i > 0 ? (\n <span\n aria-hidden=\"true\"\n className=\"h-0.5 flex-1 rounded-full\"\n style={{\n backgroundColor: connectorFilled ? ACCENT : 'var(--color-border-subtle)',\n }}\n />\n ) : (\n <span className=\"flex-1\" aria-hidden=\"true\" />\n )}\n <span\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 text-xs font-semibold tabular-nums transition-colors',\n state === 'complete' && 'border-transparent text-text-inverse',\n state === 'current' && 'bg-bg-surface',\n state === 'upcoming' && 'border-border-subtle bg-bg-sunken text-text-muted'\n )}\n style={\n state === 'complete'\n ? { backgroundColor: ACCENT }\n : state === 'current'\n ? { borderColor: ACCENT, color: ACCENT }\n : undefined\n }\n >\n {state === 'complete' ? <Check aria-hidden=\"true\" className=\"h-4 w-4\" /> : i + 1}\n </span>\n {i < steps.length - 1 ? (\n <span\n aria-hidden=\"true\"\n className=\"h-0.5 flex-1 rounded-full\"\n style={{ backgroundColor: i < current ? ACCENT : 'var(--color-border-subtle)' }}\n />\n ) : (\n <span className=\"flex-1\" aria-hidden=\"true\" />\n )}\n </div>\n <span\n className={cn(\n 'mt-2 px-1 text-center text-xs',\n state === 'upcoming' ? 'text-text-muted' : 'font-medium text-text-primary'\n )}\n >\n {step.label}\n </span>\n {step.description ? (\n <span className=\"mt-0.5 px-1 text-center text-[11px] text-text-muted\">\n {step.description}\n </span>\n ) : null}\n </li>\n );\n })}\n </ol>\n );\n}\n"],"mappings":";;;;;AAuBA,SAAgB,EAAa,EAAE,UAAO,YAAS,gBAAgC;AAI7E,QAHI,EAAM,WAAW,IACZ,OAGP,kBAAC,MAAD;EAAI,WAAW,EAAG,yCAAyC,EAAU;EAAE,cAAW;YAC/E,EAAM,KAAK,GAAM,MAAM;GACtB,IAAM,IAAmB,IAAI,IAAU,aAAa,MAAM,IAAU,YAAY;AAEhF,UACE,kBAAC,MAAD;IAEE,WAAU;IACV,gBAAc,MAAU,YAAY,SAAS,KAAA;cAH/C;KAKE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACG,IAAI,IACH,kBAAC,QAAD;QACE,eAAY;QACZ,WAAU;QACV,OAAO,EACL,iBAbY,KAAK,IAakB,IAAS,8BAC7C;QACD,CAAA,GAEF,kBAAC,QAAD;QAAM,WAAU;QAAS,eAAY;QAAS,CAAA;OAEhD,kBAAC,QAAD;QACE,WAAW,EACT,gIACA,MAAU,cAAc,wCACxB,MAAU,aAAa,iBACvB,MAAU,cAAc,oDACzB;QACD,OACE,MAAU,aACN,EAAE,iBAAiB,GAAQ,GAC3B,MAAU,YACR;SAAE,aAAa;SAAQ,OAAO;SAAQ,GACtC,KAAA;kBAGP,MAAU,aAAa,kBAAC,GAAD;SAAO,eAAY;SAAO,WAAU;SAAY,CAAA,GAAG,IAAI;QAC1E,CAAA;OACN,IAAI,EAAM,SAAS,IAClB,kBAAC,QAAD;QACE,eAAY;QACZ,WAAU;QACV,OAAO,EAAE,iBAAiB,IAAI,IAAU,IAAS,8BAA8B;QAC/E,CAAA,GAEF,kBAAC,QAAD;QAAM,WAAU;QAAS,eAAY;QAAS,CAAA;OAE5C;;KACN,kBAAC,QAAD;MACE,WAAW,EACT,iCACA,MAAU,aAAa,oBAAoB,gCAC5C;gBAEA,EAAK;MACD,CAAA;KACN,EAAK,cACJ,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAK;MACD,CAAA,GACL;KACD;MAxDE,GAAG,EAAK,MAAM,GAAG,IAwDnB;IAEP;EACC,CAAA"}
@@ -188,8 +188,8 @@ function M() {
188
188
  },
189
189
  {
190
190
  icon: a,
191
- label: "Composition",
192
- value: "Apollo Federation v2",
191
+ label: "Format",
192
+ value: "GraphQL API",
193
193
  color: "text-action-primary-bg"
194
194
  },
195
195
  {
@@ -256,7 +256,7 @@ function M() {
256
256
  })
257
257
  }), /* @__PURE__ */ f("p", {
258
258
  className: "text-xs text-text-secondary",
259
- children: "Requests are authenticated at the gateway edge. Send your session bearer token on every request; the gateway resolves the actor and enforces workspace-scoped RBAC before the subgraph runs."
259
+ children: "Requests are authenticated with your session bearer token. Send it on every request; each request is scoped to your workspace and enforced by role-based access control."
260
260
  })]
261
261
  })] })]
262
262
  }), /* @__PURE__ */ p("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"HelpApiDocumentationPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HelpApiDocumentationPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport {\n Check,\n ChevronRight,\n Code2,\n Copy,\n Database,\n ListTree,\n Lock,\n Network,\n Search,\n} from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\n// The CrewFoundry API is served by wspace-crewfoundry-svc as an Apollo\n// Federation v2 subgraph, reached through the workspaces public GraphQL\n// gateway. There is no separate REST surface — this reference is derived\n// directly from the published subgraph schema.\nconst ENDPOINT = 'https://graphqlworkspaces.burdenoff.com/workspaces/graphql';\n\n// The 13 CrewFoundry-owned domain entities exposed by the subgraph, each with\n// create / update / remove mutations. Marketplace, billing/invoices,\n// notifications, and learning are intentionally served by shared owners.\nconst ENTITIES: { name: string; domain: string }[] = [\n { name: 'Announcement', domain: 'Communications' },\n { name: 'Candidate', domain: 'Hiring' },\n { name: 'Client', domain: 'Finance' },\n { name: 'Department', domain: 'HR' },\n { name: 'Employee', domain: 'HR' },\n { name: 'Interview', domain: 'Hiring' },\n { name: 'JobPosting', domain: 'Hiring' },\n { name: 'LeaveRequest', domain: 'HR' },\n { name: 'PayrollRecord', domain: 'Finance' },\n { name: 'Project', domain: 'Projects' },\n { name: 'Team', domain: 'Teams' },\n { name: 'TimeEntry', domain: 'HR' },\n { name: 'Vendor', domain: 'Finance' },\n];\n\ntype OperationKind = 'Query' | 'Mutation';\n\ntype ApiOperation = {\n kind: OperationKind;\n name: string;\n signature: string;\n description: string;\n};\n\ntype ApiGroup = {\n id: string;\n name: string;\n description: string;\n operations: ApiOperation[];\n};\n\nconst kindColors: Record<OperationKind, string> = {\n Query: 'bg-status-success-bg text-status-success-text',\n Mutation: 'bg-status-info-bg text-status-info-text',\n};\n\nconst humanize = (value: string): string => value.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\n\nconst copyToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // Fall through to the legacy path for insecure / restricted contexts.\n }\n try {\n if (typeof document === 'undefined') {\n return false;\n }\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n const succeeded = document.execCommand('copy');\n document.body.removeChild(textarea);\n return succeeded;\n } catch {\n return false;\n }\n};\n\nexport function HelpApiDocumentationPagePage() {\n const { employees, jobPostings, candidates, payrollRecords, leaveRequests } =\n useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const [search, setSearch] = useState('');\n const [copied, setCopied] = useState<string | null>(null);\n\n const groups = useMemo<ApiGroup[]>(() => {\n const createOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `createCrew${entity.name}`,\n signature: `createCrew${entity.name}(input: CreateCrew${entity.name}Input!): Crew${entity.name}!`,\n description: `Create a ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n const updateOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `updateCrew${entity.name}`,\n signature: `updateCrew${entity.name}(id: ID!, input: UpdateCrew${entity.name}Input!): Crew${entity.name}!`,\n description: `Update an existing ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n const removeOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `removeCrew${entity.name}`,\n signature: `removeCrew${entity.name}(id: ID!): Boolean!`,\n description: `Delete a ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n\n return [\n {\n id: 'queries',\n name: 'Queries',\n description: 'Read the workspace dataset',\n operations: [\n {\n kind: 'Query',\n name: 'crewfoundryBootstrap',\n signature: 'crewfoundryBootstrap: CrewfoundryBootstrap!',\n description: `Load the full workspace dataset in one call — ${employees.length} employees, ${jobPostings.length} job postings, ${candidates.length} candidates, ${payrollRecords.length} payroll records, ${leaveRequests.length} leave requests, and every other CrewFoundry collection.`,\n },\n ],\n },\n {\n id: 'create',\n name: 'Create mutations',\n description: 'Add new records',\n operations: createOps,\n },\n {\n id: 'update',\n name: 'Update mutations',\n description: 'Modify existing records',\n operations: updateOps,\n },\n {\n id: 'delete',\n name: 'Delete mutations',\n description: 'Remove records',\n operations: removeOps,\n },\n ];\n }, [\n candidates.length,\n employees.length,\n jobPostings.length,\n leaveRequests.length,\n payrollRecords.length,\n ]);\n\n const totalOperations = useMemo(\n () => groups.reduce((sum, group) => sum + group.operations.length, 0),\n [groups]\n );\n\n const filteredGroups = useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) {\n return groups;\n }\n return groups\n .map((group) => ({\n ...group,\n operations: group.operations.filter(\n (op) =>\n op.name.toLowerCase().includes(term) ||\n op.signature.toLowerCase().includes(term) ||\n op.description.toLowerCase().includes(term)\n ),\n }))\n .filter((group) => group.operations.length > 0);\n }, [groups, search]);\n\n const handleCopy = async (value: string) => {\n const ok = await copyToClipboard(value);\n if (ok) {\n setCopied(value);\n showToast('Copied to clipboard', 'success');\n window.setTimeout(() => setCopied((current) => (current === value ? null : current)), 1500);\n } else {\n showToast('Unable to copy to clipboard', 'error');\n }\n };\n\n const scrollToGroup = (id: string) => {\n const target = typeof document !== 'undefined' ? document.getElementById(`group-${id}`) : null;\n target?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n };\n\n const statTiles = [\n { icon: Network, label: 'Protocol', value: 'GraphQL', color: 'text-status-info-text' },\n {\n icon: Code2,\n label: 'Composition',\n value: 'Apollo Federation v2',\n color: 'text-action-primary-bg',\n },\n { icon: Lock, label: 'Auth', value: 'Bearer token', color: 'text-status-success-text' },\n {\n icon: ListTree,\n label: 'Operations',\n value: String(totalOperations),\n color: 'text-status-warning-text',\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-3 md:flex-row md:items-start md:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>API Documentation</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n CrewFoundry GraphQL API reference for integrations\n </p>\n <PagePurpose className=\"mt-1\">\n Browse the CrewFoundry API reference — use it to find operations, understand request\n formats, and integrate CrewFoundry with your own tools.\n </PagePurpose>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\" className=\"max-w-full truncate font-mono text-[10px]\">\n {ENDPOINT}\n </Badge>\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label=\"Copy the GraphQL endpoint URL\"\n onClick={() => void handleCopy(ENDPOINT)}\n >\n {copied === ENDPOINT ? (\n <Check className=\"mr-1 h-3 w-3 text-status-success-text\" />\n ) : (\n <Copy className=\"mr-1 h-3 w-3\" />\n )}\n Copy endpoint\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {statTiles.map((item) => (\n <Card key={item.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <item.icon className={`h-5 w-5 ${item.color}`} />\n <div className=\"min-w-0\">\n <p className=\"text-xs text-text-secondary\">{item.label}</p>\n <p className=\"truncate text-sm font-medium\">{item.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-4\">\n <div className=\"space-y-4\">\n <EmphasisPanel>\n <div className=\"mb-2 text-sm font-semibold\">Jump to</div>\n <div className=\"space-y-2\">\n {groups.map((group) => (\n <button\n key={group.id}\n type=\"button\"\n aria-label={`Jump to ${group.name}`}\n onClick={() => scrollToGroup(group.id)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-bg-sunken\"\n >\n <ListTree className=\"h-3 w-3 text-text-secondary\" />\n <span>{group.name}</span>\n <Badge variant=\"outline\" className=\"ml-auto text-[10px]\">\n {group.operations.length}\n </Badge>\n <ChevronRight className=\"h-3 w-3 text-text-secondary\" />\n </button>\n ))}\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Authentication</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <code className=\"font-mono text-xs\">Authorization: Bearer {'<token>'}</code>\n </div>\n <p className=\"text-xs text-text-secondary\">\n Requests are authenticated at the gateway edge. Send your session bearer token on\n every request; the gateway resolves the actor and enforces workspace-scoped RBAC\n before the subgraph runs.\n </p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-4 lg:col-span-3\">\n <div className=\"relative max-w-md\">\n <Search className=\"absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder=\"Search operations...\"\n className=\"pl-9\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n\n {filteredGroups.map((group) => (\n <Card key={group.id} id={`group-${group.id}`} className=\"scroll-mt-6\">\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Database className=\"h-4 w-4 text-text-secondary\" />\n <CardTitle className=\"text-base\">{group.name}</CardTitle>\n </div>\n <CardDescription>\n {group.description} · {group.operations.length} operations\n </CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {group.operations.map((op, index) => (\n <div\n key={op.name}\n className={`flex items-center gap-3 px-6 py-3 hover:bg-bg-sunken/50 ${index < group.operations.length - 1 ? 'border-b' : ''}`}\n >\n <Badge\n className={`${kindColors[op.kind]} min-w-[64px] justify-center border-0 font-mono text-[10px]`}\n >\n {op.kind}\n </Badge>\n <div className=\"min-w-0 flex-1\">\n <code className=\"block truncate font-mono text-sm\">{op.signature}</code>\n <span className=\"text-xs text-text-secondary\">{op.description}</span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 shrink-0 p-0\"\n aria-label={`Copy ${op.name} operation name`}\n onClick={() => void handleCopy(op.name)}\n >\n {copied === op.name ? (\n <Check className=\"h-3 w-3 text-status-success-text\" />\n ) : (\n <Copy className=\"h-3 w-3 text-text-secondary\" />\n )}\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n\n {filteredGroups.length === 0 && (\n <div className=\"py-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No operations match\"\n description=\"Try a different search term to find the operation you need.\"\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAiCA,IAAM,IAAW,8DAKX,IAA+C;CACnD;EAAE,MAAM;EAAgB,QAAQ;EAAkB;CAClD;EAAE,MAAM;EAAa,QAAQ;EAAU;CACvC;EAAE,MAAM;EAAU,QAAQ;EAAW;CACrC;EAAE,MAAM;EAAc,QAAQ;EAAM;CACpC;EAAE,MAAM;EAAY,QAAQ;EAAM;CAClC;EAAE,MAAM;EAAa,QAAQ;EAAU;CACvC;EAAE,MAAM;EAAc,QAAQ;EAAU;CACxC;EAAE,MAAM;EAAgB,QAAQ;EAAM;CACtC;EAAE,MAAM;EAAiB,QAAQ;EAAW;CAC5C;EAAE,MAAM;EAAW,QAAQ;EAAY;CACvC;EAAE,MAAM;EAAQ,QAAQ;EAAS;CACjC;EAAE,MAAM;EAAa,QAAQ;EAAM;CACnC;EAAE,MAAM;EAAU,QAAQ;EAAW;CACtC,EAkBK,IAA4C;CAChD,OAAO;CACP,UAAU;CACX,EAEK,KAAY,MAA0B,EAAM,QAAQ,mBAAmB,QAAQ,CAAC,aAAa,EAE7F,IAAkB,OAAO,MAAmC;AAChE,KAAI;AACF,MAAI,OAAO,YAAc,OAAe,UAAU,WAAW,UAE3D,QADA,MAAM,UAAU,UAAU,UAAU,EAAK,EAClC;SAEH;AAGR,KAAI;AACF,MAAI,OAAO,WAAa,IACtB,QAAO;EAET,IAAM,IAAW,SAAS,cAAc,WAAW;AAMnD,EALA,EAAS,QAAQ,GACjB,EAAS,MAAM,WAAW,SAC1B,EAAS,MAAM,UAAU,KACzB,SAAS,KAAK,YAAY,EAAS,EACnC,EAAS,OAAO,EAChB,EAAS,QAAQ;EACjB,IAAM,IAAY,SAAS,YAAY,OAAO;AAE9C,SADA,SAAS,KAAK,YAAY,EAAS,EAC5B;SACD;AACN,SAAO;;;AAIX,SAAgB,IAA+B;CAC7C,IAAM,EAAE,cAAW,gBAAa,eAAY,mBAAgB,qBAC1D,GAAqB,EACjB,EAAE,iBAAc,GAAa,EAC7B,CAAC,GAAQ,KAAa,EAAS,GAAG,EAClC,CAAC,GAAQ,KAAa,EAAwB,KAAK,EAEnD,IAAS,QAA0B;EACvC,IAAM,IAA4B,EAAS,KAAK,OAAY;GAC1D,MAAM;GACN,MAAM,aAAa,EAAO;GAC1B,WAAW,aAAa,EAAO,KAAK,oBAAoB,EAAO,KAAK,eAAe,EAAO,KAAK;GAC/F,aAAa,YAAY,EAAS,EAAO,KAAK,CAAC,WAAW,EAAO,OAAO;GACzE,EAAE,EACG,IAA4B,EAAS,KAAK,OAAY;GAC1D,MAAM;GACN,MAAM,aAAa,EAAO;GAC1B,WAAW,aAAa,EAAO,KAAK,6BAA6B,EAAO,KAAK,eAAe,EAAO,KAAK;GACxG,aAAa,sBAAsB,EAAS,EAAO,KAAK,CAAC,WAAW,EAAO,OAAO;GACnF,EAAE,EACG,IAA4B,EAAS,KAAK,OAAY;GAC1D,MAAM;GACN,MAAM,aAAa,EAAO;GAC1B,WAAW,aAAa,EAAO,KAAK;GACpC,aAAa,YAAY,EAAS,EAAO,KAAK,CAAC,WAAW,EAAO,OAAO;GACzE,EAAE;AAEH,SAAO;GACL;IACE,IAAI;IACJ,MAAM;IACN,aAAa;IACb,YAAY,CACV;KACE,MAAM;KACN,MAAM;KACN,WAAW;KACX,aAAa,iDAAiD,EAAU,OAAO,cAAc,EAAY,OAAO,iBAAiB,EAAW,OAAO,eAAe,EAAe,OAAO,oBAAoB,EAAc,OAAO;KAClO,CACF;IACF;GACD;IACE,IAAI;IACJ,MAAM;IACN,aAAa;IACb,YAAY;IACb;GACD;IACE,IAAI;IACJ,MAAM;IACN,aAAa;IACb,YAAY;IACb;GACD;IACE,IAAI;IACJ,MAAM;IACN,aAAa;IACb,YAAY;IACb;GACF;IACA;EACD,EAAW;EACX,EAAU;EACV,EAAY;EACZ,EAAc;EACd,EAAe;EAChB,CAAC,EAEI,IAAkB,QAChB,EAAO,QAAQ,GAAK,MAAU,IAAM,EAAM,WAAW,QAAQ,EAAE,EACrE,CAAC,EAAO,CACT,EAEK,IAAiB,QAAc;EACnC,IAAM,IAAO,EAAO,MAAM,CAAC,aAAa;AAIxC,SAHK,IAGE,EACJ,KAAK,OAAW;GACf,GAAG;GACH,YAAY,EAAM,WAAW,QAC1B,MACC,EAAG,KAAK,aAAa,CAAC,SAAS,EAAK,IACpC,EAAG,UAAU,aAAa,CAAC,SAAS,EAAK,IACzC,EAAG,YAAY,aAAa,CAAC,SAAS,EAAK,CAC9C;GACF,EAAE,CACF,QAAQ,MAAU,EAAM,WAAW,SAAS,EAAE,GAZxC;IAaR,CAAC,GAAQ,EAAO,CAAC,EAEd,IAAa,OAAO,MAAkB;AAE1C,EADW,MAAM,EAAgB,EAAM,IAErC,EAAU,EAAM,EAChB,EAAU,uBAAuB,UAAU,EAC3C,OAAO,iBAAiB,GAAW,MAAa,MAAY,IAAQ,OAAO,EAAS,EAAE,KAAK,IAE3F,EAAU,+BAA+B,QAAQ;IAI/C,KAAiB,MAAe;AAEpC,GADe,OAAO,WAAa,MAAc,SAAS,eAAe,SAAS,IAAK,GAAG,OAClF,eAAe;GAAE,UAAU;GAAU,OAAO;GAAS,CAAC;;AAoBhE,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,GAAD,EAAA,UAAc,qBAAgC,CAAA;MAC3C,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA;KACJ,kBAAC,GAAD;MAAa,WAAU;gBAAO;MAGhB,CAAA;KACV,EAAA,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAO,SAAQ;MAAY,WAAU;gBAClC;MACK,CAAA,EACR,kBAAC,GAAD;MACE,MAAK;MACL,SAAQ;MACR,cAAW;MACX,eAAe,KAAK,EAAW,EAAS;gBAJ1C,CAMG,MAAW,IACV,kBAAC,GAAD,EAAO,WAAU,yCAA0C,CAAA,GAE3D,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EACjC,gBAEK;QACL;OACF;;GAEN,kBAAC,OAAD;IAAK,WAAU;cApDD;KAChB;MAAE,MAAM;MAAS,OAAO;MAAY,OAAO;MAAW,OAAO;MAAyB;KACtF;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,OAAO;MACR;KACD;MAAE,MAAM;MAAM,OAAO;MAAQ,OAAO;MAAgB,OAAO;MAA4B;KACvF;MACE,MAAM;MACN,OAAO;MACP,OAAO,OAAO,EAAgB;MAC9B,OAAO;MACR;KACF,CAsCgB,KAAK,MACd,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,EAAK,MAAN,EAAW,WAAW,WAAW,EAAK,SAAW,CAAA,EACjD,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAK;OAAU,CAAA,EAC3D,kBAAC,KAAD;OAAG,WAAU;iBAAgC,EAAK;OAAU,CAAA,CACxD;QACM;QACT,EARI,EAAK,MAQT,CACP;IACE,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;gBAA6B;MAAa,CAAA,EACzD,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAO,KAAK,MACX,kBAAC,UAAD;OAEE,MAAK;OACL,cAAY,WAAW,EAAM;OAC7B,eAAe,EAAc,EAAM,GAAG;OACtC,WAAU;iBALZ;QAOE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA;QACpD,kBAAC,QAAD,EAAA,UAAO,EAAM,MAAY,CAAA;QACzB,kBAAC,GAAD;SAAO,SAAQ;SAAU,WAAU;mBAChC,EAAM,WAAW;SACZ,CAAA;QACR,kBAAC,GAAD,EAAc,WAAU,+BAAgC,CAAA;QACjD;SAZF,EAAM,GAYJ,CACT;MACE,CAAA,CACQ,EAAA,CAAA,EAEhB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAW,WAAU;gBAAU;MAA0B,CAAA,EAC9C,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CAAoC,0BAAuB,UAAiB;;OACxE,CAAA,EACN,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAIvC,CAAA,CACQ;QACT,EAAA,CAAA,CACH;QAEN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,GAAD;QACE,aAAY;QACZ,WAAU;QACV,OAAO;QACP,WAAW,MAAU,EAAU,EAAM,OAAO,MAAM;QAClD,CAAA,CACE;;MAEL,EAAe,KAAK,MACnB,kBAAC,GAAD;OAAqB,IAAI,SAAS,EAAM;OAAM,WAAU;iBAAxD,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,EACpD,kBAAC,GAAD;SAAW,WAAU;mBAAa,EAAM;SAAiB,CAAA,CACrD;WACN,kBAAC,GAAD,EAAA,UAAA;QACG,EAAM;QAAY;QAAI,EAAM,WAAW;QAAO;QAC/B,EAAA,CAAA,CACP,EAAA,CAAA,EACb,kBAAC,GAAD;QAAa,WAAU;kBACpB,EAAM,WAAW,KAAK,GAAI,MACzB,kBAAC,OAAD;SAEE,WAAW,2DAA2D,IAAQ,EAAM,WAAW,SAAS,IAAI,aAAa;mBAF3H;UAIE,kBAAC,GAAD;WACE,WAAW,GAAG,EAAW,EAAG,MAAM;qBAEjC,EAAG;WACE,CAAA;UACR,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD;YAAM,WAAU;sBAAoC,EAAG;YAAiB,CAAA,EACxE,kBAAC,QAAD;YAAM,WAAU;sBAA+B,EAAG;YAAmB,CAAA,CACjE;;UACN,kBAAC,GAAD;WACE,SAAQ;WACR,MAAK;WACL,WAAU;WACV,cAAY,QAAQ,EAAG,KAAK;WAC5B,eAAe,KAAK,EAAW,EAAG,KAAK;qBAEtC,MAAW,EAAG,OACb,kBAAC,GAAD,EAAO,WAAU,oCAAqC,CAAA,GAEtD,kBAAC,GAAD,EAAM,WAAU,+BAAgC,CAAA;WAE3C,CAAA;UACL;WAzBC,EAAG,KAyBJ,CACN;QACU,CAAA,CACT;SAzCI,EAAM,GAyCV,CACP;MAED,EAAe,WAAW,KACzB,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD;QACE,cAAa;QACb,OAAM;QACN,aAAY;QACZ,CAAA;OACE,CAAA;MAEJ;OACF;;GACF"}
1
+ {"version":3,"file":"HelpApiDocumentationPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HelpApiDocumentationPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport {\n Check,\n ChevronRight,\n Code2,\n Copy,\n Database,\n ListTree,\n Lock,\n Network,\n Search,\n} from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\n// The CrewFoundry API is served by wspace-crewfoundry-svc as an Apollo\n// Federation v2 subgraph, reached through the workspaces public GraphQL\n// gateway. There is no separate REST surface — this reference is derived\n// directly from the published subgraph schema.\nconst ENDPOINT = 'https://graphqlworkspaces.burdenoff.com/workspaces/graphql';\n\n// The 13 CrewFoundry-owned domain entities exposed by the subgraph, each with\n// create / update / remove mutations. Marketplace, billing/invoices,\n// notifications, and learning are intentionally served by shared owners.\nconst ENTITIES: { name: string; domain: string }[] = [\n { name: 'Announcement', domain: 'Communications' },\n { name: 'Candidate', domain: 'Hiring' },\n { name: 'Client', domain: 'Finance' },\n { name: 'Department', domain: 'HR' },\n { name: 'Employee', domain: 'HR' },\n { name: 'Interview', domain: 'Hiring' },\n { name: 'JobPosting', domain: 'Hiring' },\n { name: 'LeaveRequest', domain: 'HR' },\n { name: 'PayrollRecord', domain: 'Finance' },\n { name: 'Project', domain: 'Projects' },\n { name: 'Team', domain: 'Teams' },\n { name: 'TimeEntry', domain: 'HR' },\n { name: 'Vendor', domain: 'Finance' },\n];\n\ntype OperationKind = 'Query' | 'Mutation';\n\ntype ApiOperation = {\n kind: OperationKind;\n name: string;\n signature: string;\n description: string;\n};\n\ntype ApiGroup = {\n id: string;\n name: string;\n description: string;\n operations: ApiOperation[];\n};\n\nconst kindColors: Record<OperationKind, string> = {\n Query: 'bg-status-success-bg text-status-success-text',\n Mutation: 'bg-status-info-bg text-status-info-text',\n};\n\nconst humanize = (value: string): string => value.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\n\nconst copyToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // Fall through to the legacy path for insecure / restricted contexts.\n }\n try {\n if (typeof document === 'undefined') {\n return false;\n }\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n const succeeded = document.execCommand('copy');\n document.body.removeChild(textarea);\n return succeeded;\n } catch {\n return false;\n }\n};\n\nexport function HelpApiDocumentationPagePage() {\n const { employees, jobPostings, candidates, payrollRecords, leaveRequests } =\n useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const [search, setSearch] = useState('');\n const [copied, setCopied] = useState<string | null>(null);\n\n const groups = useMemo<ApiGroup[]>(() => {\n const createOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `createCrew${entity.name}`,\n signature: `createCrew${entity.name}(input: CreateCrew${entity.name}Input!): Crew${entity.name}!`,\n description: `Create a ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n const updateOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `updateCrew${entity.name}`,\n signature: `updateCrew${entity.name}(id: ID!, input: UpdateCrew${entity.name}Input!): Crew${entity.name}!`,\n description: `Update an existing ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n const removeOps: ApiOperation[] = ENTITIES.map((entity) => ({\n kind: 'Mutation',\n name: `removeCrew${entity.name}`,\n signature: `removeCrew${entity.name}(id: ID!): Boolean!`,\n description: `Delete a ${humanize(entity.name)} record (${entity.domain}).`,\n }));\n\n return [\n {\n id: 'queries',\n name: 'Queries',\n description: 'Read the workspace dataset',\n operations: [\n {\n kind: 'Query',\n name: 'crewfoundryBootstrap',\n signature: 'crewfoundryBootstrap: CrewfoundryBootstrap!',\n description: `Load the full workspace dataset in one call — ${employees.length} employees, ${jobPostings.length} job postings, ${candidates.length} candidates, ${payrollRecords.length} payroll records, ${leaveRequests.length} leave requests, and every other CrewFoundry collection.`,\n },\n ],\n },\n {\n id: 'create',\n name: 'Create mutations',\n description: 'Add new records',\n operations: createOps,\n },\n {\n id: 'update',\n name: 'Update mutations',\n description: 'Modify existing records',\n operations: updateOps,\n },\n {\n id: 'delete',\n name: 'Delete mutations',\n description: 'Remove records',\n operations: removeOps,\n },\n ];\n }, [\n candidates.length,\n employees.length,\n jobPostings.length,\n leaveRequests.length,\n payrollRecords.length,\n ]);\n\n const totalOperations = useMemo(\n () => groups.reduce((sum, group) => sum + group.operations.length, 0),\n [groups]\n );\n\n const filteredGroups = useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) {\n return groups;\n }\n return groups\n .map((group) => ({\n ...group,\n operations: group.operations.filter(\n (op) =>\n op.name.toLowerCase().includes(term) ||\n op.signature.toLowerCase().includes(term) ||\n op.description.toLowerCase().includes(term)\n ),\n }))\n .filter((group) => group.operations.length > 0);\n }, [groups, search]);\n\n const handleCopy = async (value: string) => {\n const ok = await copyToClipboard(value);\n if (ok) {\n setCopied(value);\n showToast('Copied to clipboard', 'success');\n window.setTimeout(() => setCopied((current) => (current === value ? null : current)), 1500);\n } else {\n showToast('Unable to copy to clipboard', 'error');\n }\n };\n\n const scrollToGroup = (id: string) => {\n const target = typeof document !== 'undefined' ? document.getElementById(`group-${id}`) : null;\n target?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n };\n\n const statTiles = [\n { icon: Network, label: 'Protocol', value: 'GraphQL', color: 'text-status-info-text' },\n {\n icon: Code2,\n label: 'Format',\n value: 'GraphQL API',\n color: 'text-action-primary-bg',\n },\n { icon: Lock, label: 'Auth', value: 'Bearer token', color: 'text-status-success-text' },\n {\n icon: ListTree,\n label: 'Operations',\n value: String(totalOperations),\n color: 'text-status-warning-text',\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-3 md:flex-row md:items-start md:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>API Documentation</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n CrewFoundry GraphQL API reference for integrations\n </p>\n <PagePurpose className=\"mt-1\">\n Browse the CrewFoundry API reference — use it to find operations, understand request\n formats, and integrate CrewFoundry with your own tools.\n </PagePurpose>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\" className=\"max-w-full truncate font-mono text-[10px]\">\n {ENDPOINT}\n </Badge>\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label=\"Copy the GraphQL endpoint URL\"\n onClick={() => void handleCopy(ENDPOINT)}\n >\n {copied === ENDPOINT ? (\n <Check className=\"mr-1 h-3 w-3 text-status-success-text\" />\n ) : (\n <Copy className=\"mr-1 h-3 w-3\" />\n )}\n Copy endpoint\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {statTiles.map((item) => (\n <Card key={item.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <item.icon className={`h-5 w-5 ${item.color}`} />\n <div className=\"min-w-0\">\n <p className=\"text-xs text-text-secondary\">{item.label}</p>\n <p className=\"truncate text-sm font-medium\">{item.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-4\">\n <div className=\"space-y-4\">\n <EmphasisPanel>\n <div className=\"mb-2 text-sm font-semibold\">Jump to</div>\n <div className=\"space-y-2\">\n {groups.map((group) => (\n <button\n key={group.id}\n type=\"button\"\n aria-label={`Jump to ${group.name}`}\n onClick={() => scrollToGroup(group.id)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-bg-sunken\"\n >\n <ListTree className=\"h-3 w-3 text-text-secondary\" />\n <span>{group.name}</span>\n <Badge variant=\"outline\" className=\"ml-auto text-[10px]\">\n {group.operations.length}\n </Badge>\n <ChevronRight className=\"h-3 w-3 text-text-secondary\" />\n </button>\n ))}\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Authentication</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <code className=\"font-mono text-xs\">Authorization: Bearer {'<token>'}</code>\n </div>\n <p className=\"text-xs text-text-secondary\">\n Requests are authenticated with your session bearer token. Send it on every\n request; each request is scoped to your workspace and enforced by role-based\n access control.\n </p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-4 lg:col-span-3\">\n <div className=\"relative max-w-md\">\n <Search className=\"absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder=\"Search operations...\"\n className=\"pl-9\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n\n {filteredGroups.map((group) => (\n <Card key={group.id} id={`group-${group.id}`} className=\"scroll-mt-6\">\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Database className=\"h-4 w-4 text-text-secondary\" />\n <CardTitle className=\"text-base\">{group.name}</CardTitle>\n </div>\n <CardDescription>\n {group.description} · {group.operations.length} operations\n </CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {group.operations.map((op, index) => (\n <div\n key={op.name}\n className={`flex items-center gap-3 px-6 py-3 hover:bg-bg-sunken/50 ${index < group.operations.length - 1 ? 'border-b' : ''}`}\n >\n <Badge\n className={`${kindColors[op.kind]} min-w-[64px] justify-center border-0 font-mono text-[10px]`}\n >\n {op.kind}\n </Badge>\n <div className=\"min-w-0 flex-1\">\n <code className=\"block truncate font-mono text-sm\">{op.signature}</code>\n <span className=\"text-xs text-text-secondary\">{op.description}</span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 shrink-0 p-0\"\n aria-label={`Copy ${op.name} operation name`}\n onClick={() => void handleCopy(op.name)}\n >\n {copied === op.name ? (\n <Check className=\"h-3 w-3 text-status-success-text\" />\n ) : (\n <Copy className=\"h-3 w-3 text-text-secondary\" />\n )}\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n\n {filteredGroups.length === 0 && (\n <div className=\"py-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No operations match\"\n description=\"Try a different search term to find the operation you need.\"\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function HiringOnboardingPagePage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=HiringOnboardingPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HiringOnboardingPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/HiringOnboardingPagePage.tsx"],"names":[],"mappings":"AAyPA,wBAAgB,wBAAwB,gCA4EvC"}
@@ -0,0 +1,323 @@
1
+ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
+ import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
+ import { ProgressRing as n } from "../components/viz/ProgressRing.js";
4
+ import { StepProgress as r } from "../components/viz/StepProgress.js";
5
+ import { AvatarStack as i } from "../components/viz/AvatarStack.js";
6
+ import "../components/viz/index.js";
7
+ import { FormModal as a, useFormModal as o } from "../components/forms/FormModal.js";
8
+ import { ConfirmDialog as s } from "../components/forms/ConfirmDialog.js";
9
+ import { getText as c } from "../components/forms/formValues.js";
10
+ import { useEffect as l, useState as u } from "react";
11
+ import { Plus as d, Trash2 as f, UserPlus as p } from "lucide-react";
12
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
13
+ import { Badge as g, Button as _, CardContent as v, CardHeader as y, CardTitle as b, Checkbox as x, GlassCard as S, GradientText as C, IllustratedEmptyState as w, PagePurpose as T, Spinner as E } from "@burdenoff/fe-libs/ui";
14
+ import { useGlobalUi as D } from "@burdenoff/fe-libs/shared/providers/shell";
15
+ //#region src/crewfoundry/pages/HiringOnboardingPagePage.tsx
16
+ var O = [
17
+ {
18
+ id: "offer",
19
+ label: "Offer",
20
+ description: "Offer extended"
21
+ },
22
+ {
23
+ id: "paperwork",
24
+ label: "Paperwork",
25
+ description: "Docs signed"
26
+ },
27
+ {
28
+ id: "it_setup",
29
+ label: "IT Setup",
30
+ description: "Accounts + gear"
31
+ },
32
+ {
33
+ id: "training",
34
+ label: "Training",
35
+ description: "Onboarding path"
36
+ },
37
+ {
38
+ id: "day_one",
39
+ label: "Day 1",
40
+ description: "First day"
41
+ }
42
+ ], k = O.map((e) => e.id), A = [
43
+ {
44
+ name: "fullName",
45
+ label: "New hire name",
46
+ type: "text",
47
+ required: !0,
48
+ colSpan: 2
49
+ },
50
+ {
51
+ name: "position",
52
+ label: "Position",
53
+ type: "text",
54
+ required: !0
55
+ },
56
+ {
57
+ name: "department",
58
+ label: "Department",
59
+ type: "text"
60
+ },
61
+ {
62
+ name: "startDate",
63
+ label: "Start date",
64
+ type: "date"
65
+ }
66
+ ], j = [
67
+ {
68
+ name: "title",
69
+ label: "Task",
70
+ type: "text",
71
+ required: !0,
72
+ colSpan: 2
73
+ },
74
+ {
75
+ name: "stage",
76
+ label: "Stage",
77
+ type: "select",
78
+ required: !0,
79
+ options: O.map((e) => ({
80
+ label: e.label,
81
+ value: e.id
82
+ }))
83
+ },
84
+ {
85
+ name: "assigneeName",
86
+ label: "Owner",
87
+ type: "text",
88
+ placeholder: "HR, IT, hiring manager…"
89
+ },
90
+ {
91
+ name: "dueDate",
92
+ label: "Due date",
93
+ type: "date"
94
+ }
95
+ ];
96
+ function M(e) {
97
+ return e === "completed" ? "default" : e === "cancelled" ? "outline" : "secondary";
98
+ }
99
+ function N({ task: e, onToggle: n, onRemove: r }) {
100
+ let { showToast: i } = D(), [a, o] = u(!1), s = async (e) => {
101
+ o(!0);
102
+ try {
103
+ await n(e);
104
+ } catch (e) {
105
+ i(e instanceof Error ? e.message : "Unable to update task", "error");
106
+ } finally {
107
+ o(!1);
108
+ }
109
+ };
110
+ return /* @__PURE__ */ h("div", {
111
+ className: "flex items-start gap-3 rounded-input border border-border-subtle bg-bg-surface px-3 py-2",
112
+ children: [
113
+ /* @__PURE__ */ m(x, {
114
+ checked: !!e.completedAt,
115
+ onCheckedChange: (e) => void s(e === !0),
116
+ disabled: a,
117
+ "aria-label": `Mark "${e.title}" complete`,
118
+ className: "mt-0.5"
119
+ }),
120
+ /* @__PURE__ */ h("div", {
121
+ className: "min-w-0 flex-1",
122
+ children: [/* @__PURE__ */ m("p", {
123
+ className: `truncate text-sm ${e.completedAt ? "text-text-muted line-through" : "text-text-primary"}`,
124
+ children: e.title
125
+ }), /* @__PURE__ */ h("p", {
126
+ className: "text-xs text-text-muted",
127
+ children: [
128
+ t(e.stage),
129
+ e.assigneeName ? ` · ${e.assigneeName}` : "",
130
+ e.dueDate ? ` · due ${e.dueDate.slice(0, 10)}` : ""
131
+ ]
132
+ })]
133
+ }),
134
+ /* @__PURE__ */ m("button", {
135
+ type: "button",
136
+ "aria-label": `Remove task "${e.title}"`,
137
+ className: "shrink-0 text-text-muted hover:text-status-error-fg",
138
+ onClick: () => void r(),
139
+ children: /* @__PURE__ */ m(f, { className: "h-3.5 w-3.5" })
140
+ })
141
+ ]
142
+ });
143
+ }
144
+ function P({ onboarding: o }) {
145
+ let { showToast: l } = D(), p = e((e) => e.toggleOnboardingTask), x = e((e) => e.removeOnboardingTask), C = e((e) => e.createOnboardingTask), w = e((e) => e.removeOnboarding), [T, E] = u(!1), [A, P] = u(!1), F = Math.max(0, k.indexOf(o.currentStage)), I = k.map((e) => ({
146
+ stage: e,
147
+ tasks: o.tasks.filter((t) => t.stage === e).sort((e, t) => e.sortOrder - t.sortOrder)
148
+ })).filter((e) => e.tasks.length > 0);
149
+ return /* @__PURE__ */ h(S, {
150
+ treatment: "glass",
151
+ className: "border-border-seam",
152
+ children: [
153
+ /* @__PURE__ */ h(y, {
154
+ className: "flex flex-row flex-wrap items-start justify-between gap-3",
155
+ children: [/* @__PURE__ */ h("div", {
156
+ className: "flex items-center gap-3",
157
+ children: [/* @__PURE__ */ m(i, {
158
+ people: [{ name: o.fullName }],
159
+ max: 1,
160
+ size: 40
161
+ }), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m(b, {
162
+ className: "text-base",
163
+ children: o.fullName
164
+ }), /* @__PURE__ */ h("p", {
165
+ className: "text-sm text-text-secondary",
166
+ children: [o.position, o.department ? ` · ${o.department}` : ""]
167
+ })] })]
168
+ }), /* @__PURE__ */ h("div", {
169
+ className: "flex items-center gap-3",
170
+ children: [/* @__PURE__ */ m(g, {
171
+ variant: M(o.status),
172
+ children: t(o.status)
173
+ }), /* @__PURE__ */ m("button", {
174
+ type: "button",
175
+ "aria-label": `Cancel onboarding for ${o.fullName}`,
176
+ className: "text-text-muted hover:text-status-error-fg",
177
+ onClick: () => P(!0),
178
+ children: /* @__PURE__ */ m(f, { className: "h-4 w-4" })
179
+ })]
180
+ })]
181
+ }),
182
+ /* @__PURE__ */ h(v, {
183
+ className: "space-y-5 pt-0",
184
+ children: [
185
+ /* @__PURE__ */ h("div", {
186
+ className: "flex flex-col gap-4 sm:flex-row sm:items-center",
187
+ children: [/* @__PURE__ */ m(n, {
188
+ value: o.progressPercent,
189
+ max: 100,
190
+ size: 64,
191
+ label: `${Math.round(o.progressPercent)}%`
192
+ }), /* @__PURE__ */ m("div", {
193
+ className: "flex-1",
194
+ children: /* @__PURE__ */ m(r, {
195
+ steps: O,
196
+ current: F
197
+ })
198
+ })]
199
+ }),
200
+ /* @__PURE__ */ m("div", {
201
+ className: "space-y-3",
202
+ children: I.length > 0 ? I.map((e) => /* @__PURE__ */ h("div", {
203
+ className: "space-y-2",
204
+ children: [/* @__PURE__ */ m("p", {
205
+ className: "text-xs font-medium uppercase tracking-wide text-text-muted",
206
+ children: t(e.stage)
207
+ }), /* @__PURE__ */ m("div", {
208
+ className: "space-y-1.5",
209
+ children: e.tasks.map((e) => /* @__PURE__ */ m(N, {
210
+ task: e,
211
+ onToggle: (t) => p(e.id, t),
212
+ onRemove: () => x(e.id)
213
+ }, e.id))
214
+ })]
215
+ }, e.stage)) : /* @__PURE__ */ m("p", {
216
+ className: "text-sm text-text-muted",
217
+ children: "No checklist items yet. Add the first one below."
218
+ })
219
+ }),
220
+ /* @__PURE__ */ h(_, {
221
+ variant: "outline",
222
+ size: "sm",
223
+ onClick: () => E(!0),
224
+ children: [/* @__PURE__ */ m(d, { className: "mr-1 h-3.5 w-3.5" }), "Add task"]
225
+ })
226
+ ]
227
+ }),
228
+ /* @__PURE__ */ m(a, {
229
+ open: T,
230
+ onOpenChange: E,
231
+ title: `Add a task for ${o.fullName}`,
232
+ fields: j,
233
+ submitLabel: "Add task",
234
+ onSubmit: async (e) => {
235
+ await C({
236
+ onboardingId: o.id,
237
+ stage: c(e, "stage"),
238
+ title: c(e, "title"),
239
+ assigneeName: c(e, "assigneeName") || void 0,
240
+ dueDate: c(e, "dueDate") || void 0
241
+ });
242
+ }
243
+ }),
244
+ /* @__PURE__ */ m(s, {
245
+ open: A,
246
+ onOpenChange: P,
247
+ title: "Cancel onboarding?",
248
+ description: `This removes the onboarding tracker for ${o.fullName}. This cannot be undone.`,
249
+ confirmLabel: "Cancel onboarding",
250
+ destructive: !0,
251
+ onConfirm: async () => {
252
+ try {
253
+ await w(o.id);
254
+ } catch (e) {
255
+ throw l(e instanceof Error ? e.message : "Unable to cancel onboarding", "error"), e;
256
+ }
257
+ }
258
+ })
259
+ ]
260
+ });
261
+ }
262
+ function F() {
263
+ let t = e((e) => e.onboardings), n = e((e) => e.onboardingsLoaded), r = e((e) => e.fetchOnboardings), i = e((e) => e.createOnboarding), { showToast: s } = D(), u = o();
264
+ return l(() => {
265
+ n || r().catch((e) => {
266
+ s(e instanceof Error ? e.message : "Unable to load onboarding", "error");
267
+ });
268
+ }, [
269
+ n,
270
+ r,
271
+ s
272
+ ]), /* @__PURE__ */ h("div", {
273
+ className: "space-y-6 p-6",
274
+ children: [
275
+ /* @__PURE__ */ h("div", {
276
+ className: "flex flex-wrap items-center justify-between gap-3",
277
+ children: [/* @__PURE__ */ m("h1", {
278
+ className: "text-2xl font-semibold",
279
+ children: /* @__PURE__ */ m(C, { children: "Onboarding" })
280
+ }), /* @__PURE__ */ h(_, {
281
+ onClick: () => u.openModal(),
282
+ children: [/* @__PURE__ */ m(p, { className: "mr-1.5 h-4 w-4" }), "Start onboarding"]
283
+ })]
284
+ }),
285
+ /* @__PURE__ */ m(T, { children: "A requisition-to-hire tracker for every new hire in flight — Offer → Paperwork → IT Setup → Training → Day 1 — with owned checklist items so nothing falls through between HR, IT, the hiring manager, and L&D." }),
286
+ n ? t.length === 0 ? /* @__PURE__ */ m(w, {
287
+ illustration: "empty-data",
288
+ title: "No onboarding in progress",
289
+ description: "Start an onboarding tracker once a candidate accepts an offer.",
290
+ action: /* @__PURE__ */ h(_, {
291
+ onClick: () => u.openModal(),
292
+ children: [/* @__PURE__ */ m(p, { className: "mr-1.5 h-4 w-4" }), "Start onboarding"]
293
+ })
294
+ }) : /* @__PURE__ */ m("div", {
295
+ className: "grid gap-4 xl:grid-cols-2",
296
+ children: t.map((e) => /* @__PURE__ */ m(P, { onboarding: e }, e.id))
297
+ }) : /* @__PURE__ */ m("div", {
298
+ className: "flex min-h-[40vh] items-center justify-center",
299
+ children: /* @__PURE__ */ m(E, { size: "lg" })
300
+ }),
301
+ /* @__PURE__ */ m(a, {
302
+ open: u.open,
303
+ onOpenChange: u.onOpenChange,
304
+ title: "Start onboarding",
305
+ description: "Creates a per-hire tracker with the standard five-stage checklist.",
306
+ fields: A,
307
+ submitLabel: "Start onboarding",
308
+ onSubmit: async (e) => {
309
+ await i({
310
+ fullName: c(e, "fullName"),
311
+ position: c(e, "position"),
312
+ department: c(e, "department") || void 0,
313
+ startDate: c(e, "startDate") || void 0
314
+ });
315
+ }
316
+ })
317
+ ]
318
+ });
319
+ }
320
+ //#endregion
321
+ export { F as HiringOnboardingPagePage };
322
+
323
+ //# sourceMappingURL=HiringOnboardingPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HiringOnboardingPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringOnboardingPagePage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport {\n Badge,\n Button,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Spinner,\n Checkbox,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Plus, Trash2, UserPlus } from 'lucide-react';\nimport {\n useCrewFoundryStore,\n type CrewOnboarding,\n type CrewOnboardingTask,\n type OnboardingStage,\n} from '../store/crewfoundryStore';\nimport { FormModal, useFormModal, type FieldConfig } from '../components/forms/FormModal';\nimport { ConfirmDialog } from '../components/forms/ConfirmDialog';\nimport { getText } from '../components/forms/formValues';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\nimport { AvatarStack, ProgressRing, StepProgress } from '../components/viz';\n\nconst STAGES: { id: OnboardingStage; label: string; description: string }[] = [\n { id: 'offer', label: 'Offer', description: 'Offer extended' },\n { id: 'paperwork', label: 'Paperwork', description: 'Docs signed' },\n { id: 'it_setup', label: 'IT Setup', description: 'Accounts + gear' },\n { id: 'training', label: 'Training', description: 'Onboarding path' },\n { id: 'day_one', label: 'Day 1', description: 'First day' },\n];\n\nconst STAGE_ORDER: OnboardingStage[] = STAGES.map((s) => s.id);\n\nconst CREATE_ONBOARDING_FIELDS: FieldConfig[] = [\n { name: 'fullName', label: 'New hire name', type: 'text', required: true, colSpan: 2 },\n { name: 'position', label: 'Position', type: 'text', required: true },\n { name: 'department', label: 'Department', type: 'text' },\n { name: 'startDate', label: 'Start date', type: 'date' },\n];\n\nconst CREATE_TASK_FIELDS: FieldConfig[] = [\n { name: 'title', label: 'Task', type: 'text', required: true, colSpan: 2 },\n {\n name: 'stage',\n label: 'Stage',\n type: 'select',\n required: true,\n options: STAGES.map((s) => ({ label: s.label, value: s.id })),\n },\n { name: 'assigneeName', label: 'Owner', type: 'text', placeholder: 'HR, IT, hiring manager…' },\n { name: 'dueDate', label: 'Due date', type: 'date' },\n];\n\nfunction statusBadgeVariant(status: CrewOnboarding['status']): 'default' | 'secondary' | 'outline' {\n if (status === 'completed') return 'default';\n if (status === 'cancelled') return 'outline';\n return 'secondary';\n}\n\nfunction OnboardingTaskRow({\n task,\n onToggle,\n onRemove,\n}: {\n task: CrewOnboardingTask;\n onToggle: (completed: boolean) => Promise<void>;\n onRemove: () => Promise<void>;\n}) {\n const { showToast } = useGlobalUi();\n const [pending, setPending] = useState(false);\n\n const handleToggle = async (checked: boolean) => {\n setPending(true);\n try {\n await onToggle(checked);\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to update task', 'error');\n } finally {\n setPending(false);\n }\n };\n\n return (\n <div className=\"flex items-start gap-3 rounded-input border border-border-subtle bg-bg-surface px-3 py-2\">\n <Checkbox\n checked={Boolean(task.completedAt)}\n onCheckedChange={(checked) => void handleToggle(checked === true)}\n disabled={pending}\n aria-label={`Mark \"${task.title}\" complete`}\n className=\"mt-0.5\"\n />\n <div className=\"min-w-0 flex-1\">\n <p\n className={`truncate text-sm ${task.completedAt ? 'text-text-muted line-through' : 'text-text-primary'}`}\n >\n {task.title}\n </p>\n <p className=\"text-xs text-text-muted\">\n {formatEnumLabel(task.stage)}\n {task.assigneeName ? ` · ${task.assigneeName}` : ''}\n {task.dueDate ? ` · due ${task.dueDate.slice(0, 10)}` : ''}\n </p>\n </div>\n <button\n type=\"button\"\n aria-label={`Remove task \"${task.title}\"`}\n className=\"shrink-0 text-text-muted hover:text-status-error-fg\"\n onClick={() => void onRemove()}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n );\n}\n\nfunction OnboardingCard({ onboarding }: { onboarding: CrewOnboarding }) {\n const { showToast } = useGlobalUi();\n const toggleOnboardingTask = useCrewFoundryStore((state) => state.toggleOnboardingTask);\n const removeOnboardingTask = useCrewFoundryStore((state) => state.removeOnboardingTask);\n const createOnboardingTask = useCrewFoundryStore((state) => state.createOnboardingTask);\n const removeOnboarding = useCrewFoundryStore((state) => state.removeOnboarding);\n const [taskModalOpen, setTaskModalOpen] = useState(false);\n const [confirmRemoveOpen, setConfirmRemoveOpen] = useState(false);\n\n const currentIndex = Math.max(0, STAGE_ORDER.indexOf(onboarding.currentStage));\n const tasksByStage = STAGE_ORDER.map((stage) => ({\n stage,\n tasks: onboarding.tasks\n .filter((task) => task.stage === stage)\n .sort((a, b) => a.sortOrder - b.sortOrder),\n })).filter((group) => group.tasks.length > 0);\n\n return (\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row flex-wrap items-start justify-between gap-3\">\n <div className=\"flex items-center gap-3\">\n <AvatarStack people={[{ name: onboarding.fullName }]} max={1} size={40} />\n <div>\n <CardTitle className=\"text-base\">{onboarding.fullName}</CardTitle>\n <p className=\"text-sm text-text-secondary\">\n {onboarding.position}\n {onboarding.department ? ` · ${onboarding.department}` : ''}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <Badge variant={statusBadgeVariant(onboarding.status)}>\n {formatEnumLabel(onboarding.status)}\n </Badge>\n <button\n type=\"button\"\n aria-label={`Cancel onboarding for ${onboarding.fullName}`}\n className=\"text-text-muted hover:text-status-error-fg\"\n onClick={() => setConfirmRemoveOpen(true)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-5 pt-0\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n <ProgressRing\n value={onboarding.progressPercent}\n max={100}\n size={64}\n label={`${Math.round(onboarding.progressPercent)}%`}\n />\n <div className=\"flex-1\">\n <StepProgress steps={STAGES} current={currentIndex} />\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {tasksByStage.length > 0 ? (\n tasksByStage.map((group) => (\n <div key={group.stage} className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-muted\">\n {formatEnumLabel(group.stage)}\n </p>\n <div className=\"space-y-1.5\">\n {group.tasks.map((task) => (\n <OnboardingTaskRow\n key={task.id}\n task={task}\n onToggle={(completed) => toggleOnboardingTask(task.id, completed)}\n onRemove={() => removeOnboardingTask(task.id)}\n />\n ))}\n </div>\n </div>\n ))\n ) : (\n <p className=\"text-sm text-text-muted\">\n No checklist items yet. Add the first one below.\n </p>\n )}\n </div>\n\n <Button variant=\"outline\" size=\"sm\" onClick={() => setTaskModalOpen(true)}>\n <Plus className=\"mr-1 h-3.5 w-3.5\" />\n Add task\n </Button>\n </CardContent>\n\n <FormModal\n open={taskModalOpen}\n onOpenChange={setTaskModalOpen}\n title={`Add a task for ${onboarding.fullName}`}\n fields={CREATE_TASK_FIELDS}\n submitLabel=\"Add task\"\n onSubmit={async (values) => {\n await createOnboardingTask({\n onboardingId: onboarding.id,\n stage: getText(values, 'stage') as OnboardingStage,\n title: getText(values, 'title'),\n assigneeName: getText(values, 'assigneeName') || undefined,\n dueDate: getText(values, 'dueDate') || undefined,\n });\n }}\n />\n\n <ConfirmDialog\n open={confirmRemoveOpen}\n onOpenChange={setConfirmRemoveOpen}\n title=\"Cancel onboarding?\"\n description={`This removes the onboarding tracker for ${onboarding.fullName}. This cannot be undone.`}\n confirmLabel=\"Cancel onboarding\"\n destructive\n onConfirm={async () => {\n try {\n await removeOnboarding(onboarding.id);\n } catch (error) {\n showToast(\n error instanceof Error ? error.message : 'Unable to cancel onboarding',\n 'error'\n );\n throw error;\n }\n }}\n />\n </GlassCard>\n );\n}\n\nexport function HiringOnboardingPagePage() {\n const onboardings = useCrewFoundryStore((state) => state.onboardings);\n const onboardingsLoaded = useCrewFoundryStore((state) => state.onboardingsLoaded);\n const fetchOnboardings = useCrewFoundryStore((state) => state.fetchOnboardings);\n const createOnboarding = useCrewFoundryStore((state) => state.createOnboarding);\n const { showToast } = useGlobalUi();\n const createModal = useFormModal();\n\n useEffect(() => {\n if (!onboardingsLoaded) {\n fetchOnboardings().catch((error: unknown) => {\n showToast(error instanceof Error ? error.message : 'Unable to load onboarding', 'error');\n });\n }\n }, [onboardingsLoaded, fetchOnboardings, showToast]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Onboarding</GradientText>\n </h1>\n <Button onClick={() => createModal.openModal()}>\n <UserPlus className=\"mr-1.5 h-4 w-4\" />\n Start onboarding\n </Button>\n </div>\n\n <PagePurpose>\n A requisition-to-hire tracker for every new hire in flight — Offer → Paperwork → IT Setup →\n Training → Day 1 — with owned checklist items so nothing falls through between HR, IT, the\n hiring manager, and L&amp;D.\n </PagePurpose>\n\n {!onboardingsLoaded ? (\n <div className=\"flex min-h-[40vh] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : onboardings.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No onboarding in progress\"\n description=\"Start an onboarding tracker once a candidate accepts an offer.\"\n action={\n <Button onClick={() => createModal.openModal()}>\n <UserPlus className=\"mr-1.5 h-4 w-4\" />\n Start onboarding\n </Button>\n }\n />\n ) : (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n {onboardings.map((onboarding) => (\n <OnboardingCard key={onboarding.id} onboarding={onboarding} />\n ))}\n </div>\n )}\n\n <FormModal\n open={createModal.open}\n onOpenChange={createModal.onOpenChange}\n title=\"Start onboarding\"\n description=\"Creates a per-hire tracker with the standard five-stage checklist.\"\n fields={CREATE_ONBOARDING_FIELDS}\n submitLabel=\"Start onboarding\"\n onSubmit={async (values) => {\n await createOnboarding({\n fullName: getText(values, 'fullName'),\n position: getText(values, 'position'),\n department: getText(values, 'department') || undefined,\n startDate: getText(values, 'startDate') || undefined,\n });\n }}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"HrEmployeeProfilePagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/HrEmployeeProfilePagePage.tsx"],"names":[],"mappings":"AAiMA,wBAAgB,yBAAyB,gCA6OxC"}
1
+ {"version":3,"file":"HrEmployeeProfilePagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/HrEmployeeProfilePagePage.tsx"],"names":[],"mappings":"AA+MA,wBAAgB,yBAAyB,gCAqVxC"}