@burdenoff/microfe-cosmicintersection 2026.512.1 → 2026.704.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/cosmicintersection/CosmicIntersectionRoot.js +38 -113
- package/dist/cosmicintersection/CosmicIntersectionRoot.js.map +1 -1
- package/dist/cosmicintersection/CosmicIntersectionRoutes.js +102 -44
- package/dist/cosmicintersection/CosmicIntersectionRoutes.js.map +1 -1
- package/dist/cosmicintersection/api/cosmicApi.js +853 -0
- package/dist/cosmicintersection/api/cosmicApi.js.map +1 -0
- package/dist/cosmicintersection/components/ActionMenu.js +106 -0
- package/dist/cosmicintersection/components/ActionMenu.js.map +1 -0
- package/dist/cosmicintersection/components/EmptyState.js +35 -0
- package/dist/cosmicintersection/components/EmptyState.js.map +1 -0
- package/dist/cosmicintersection/components/EntityFormShell.js +57 -0
- package/dist/cosmicintersection/components/EntityFormShell.js.map +1 -0
- package/dist/cosmicintersection/components/EntityTagsField.js +77 -0
- package/dist/cosmicintersection/components/EntityTagsField.js.map +1 -0
- package/dist/cosmicintersection/components/ErrorState.js +40 -0
- package/dist/cosmicintersection/components/ErrorState.js.map +1 -0
- package/dist/cosmicintersection/components/FileUploadField.js +146 -0
- package/dist/cosmicintersection/components/FileUploadField.js.map +1 -0
- package/dist/cosmicintersection/components/LoadingState.js +23 -0
- package/dist/cosmicintersection/components/LoadingState.js.map +1 -0
- package/dist/cosmicintersection/components/PageLayout.js +46 -0
- package/dist/cosmicintersection/components/PageLayout.js.map +1 -0
- package/dist/cosmicintersection/components/Pagination.js +65 -0
- package/dist/cosmicintersection/components/Pagination.js.map +1 -0
- package/dist/cosmicintersection/components/SafeLink.js +35 -0
- package/dist/cosmicintersection/components/SafeLink.js.map +1 -0
- package/dist/cosmicintersection/components/StatusBadge.js +53 -0
- package/dist/cosmicintersection/components/StatusBadge.js.map +1 -0
- package/dist/cosmicintersection/components/index.js +11 -0
- package/dist/cosmicintersection/context/CosmicIntersectionContext.js +46 -0
- package/dist/cosmicintersection/context/CosmicIntersectionContext.js.map +1 -0
- package/dist/cosmicintersection/index.js +0 -2
- package/dist/cosmicintersection/lib/mutationResult.js +12 -0
- package/dist/cosmicintersection/lib/mutationResult.js.map +1 -0
- package/dist/cosmicintersection/lib/toast.js +36 -0
- package/dist/cosmicintersection/lib/toast.js.map +1 -0
- package/dist/cosmicintersection/pages/access/AccessPage.js +340 -0
- package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -0
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +484 -0
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js +164 -0
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.js +117 -0
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js +103 -0
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +244 -0
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -0
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +460 -0
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js +218 -0
- package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +252 -0
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js +393 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.js +313 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +203 -0
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js +244 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js +210 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +193 -0
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -0
- package/dist/cosmicintersection/pages/releases/ReleaseFormPage.js +184 -0
- package/dist/cosmicintersection/pages/releases/ReleaseFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js +368 -0
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -0
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js +375 -0
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/runs/RunsPage.js +180 -0
- package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/sources/SourceFormPage.js +229 -0
- package/dist/cosmicintersection/pages/sources/SourceFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/sources/SourcesPage.js +217 -0
- package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -0
- package/dist/cosmicintersection/utils/cn.js +10 -0
- package/dist/cosmicintersection/utils/cn.js.map +1 -0
- package/dist/index.js +2 -4
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +2 -1
- package/dist/cosmicintersection/CosmicIntersectionRoot.d.ts +0 -5
- package/dist/cosmicintersection/CosmicIntersectionRoot.d.ts.map +0 -1
- package/dist/cosmicintersection/CosmicIntersectionRoutes.d.ts +0 -2
- package/dist/cosmicintersection/CosmicIntersectionRoutes.d.ts.map +0 -1
- package/dist/cosmicintersection/index.d.ts +0 -5
- package/dist/cosmicintersection/index.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/AiDiscoveryPage.d.ts +0 -2
- package/dist/cosmicintersection/pages/AiDiscoveryPage.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/AiDiscoveryPage.js +0 -363
- package/dist/cosmicintersection/pages/AiDiscoveryPage.js.map +0 -1
- package/dist/cosmicintersection/pages/DashboardPage.d.ts +0 -2
- package/dist/cosmicintersection/pages/DashboardPage.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/DashboardPage.js +0 -306
- package/dist/cosmicintersection/pages/DashboardPage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceCitizenPage.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceCitizenPage.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceCitizenPage.js +0 -287
- package/dist/cosmicintersection/pages/SpaceScienceCitizenPage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceDataPage.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceDataPage.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceDataPage.js +0 -385
- package/dist/cosmicintersection/pages/SpaceScienceDataPage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceDataPage1.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceDataPage1.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceDataPage1.js +0 -420
- package/dist/cosmicintersection/pages/SpaceScienceDataPage1.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage.js +0 -309
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage1.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage1.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage1.js +0 -361
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage1.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceSciencePage.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceSciencePage.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/SpaceSciencePage.js +0 -194
- package/dist/cosmicintersection/pages/SpaceSciencePage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceResearchPage.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceResearchPage.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceResearchPage.js +0 -290
- package/dist/cosmicintersection/pages/SpaceScienceResearchPage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceSimulationPage.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceSimulationPage.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceSimulationPage.js +0 -279
- package/dist/cosmicintersection/pages/SpaceScienceSimulationPage.js.map +0 -1
- package/dist/cosmicintersection/providers/CosmicIntersectionProvider.d.ts +0 -6
- package/dist/cosmicintersection/providers/CosmicIntersectionProvider.d.ts.map +0 -1
- package/dist/cosmicintersection/providers/CosmicIntersectionProvider.js +0 -27
- package/dist/cosmicintersection/providers/CosmicIntersectionProvider.js.map +0 -1
- package/dist/cosmicintersection/store/cosmicintersectionStore.d.ts +0 -18
- package/dist/cosmicintersection/store/cosmicintersectionStore.d.ts.map +0 -1
- package/dist/cosmicintersection/store/cosmicintersectionStore.js +0 -478
- package/dist/cosmicintersection/store/cosmicintersectionStore.js.map +0 -1
- package/dist/cosmicintersection/types/index.d.ts +0 -109
- package/dist/cosmicintersection/types/index.d.ts.map +0 -1
- package/dist/cosmicintersection/utils/cn.d.ts +0 -4
- package/dist/cosmicintersection/utils/cn.d.ts.map +0 -1
- package/dist/cosmicintersection/utils/i18n.d.ts +0 -6
- package/dist/cosmicintersection/utils/i18n.d.ts.map +0 -1
- package/dist/cosmicintersection/utils/i18n.js +0 -15
- package/dist/cosmicintersection/utils/i18n.js.map +0 -1
- package/dist/cosmicintersection/utils/navigation.d.ts +0 -2
- package/dist/cosmicintersection/utils/navigation.d.ts.map +0 -1
- package/dist/cosmicintersection/utils/navigation.js +0 -8
- package/dist/cosmicintersection/utils/navigation.js.map +0 -1
- package/dist/dev/main.d.ts +0 -2
- package/dist/dev/main.d.ts.map +0 -1
- package/dist/generated/global-operations.d.ts +0 -2
- package/dist/generated/global-operations.d.ts.map +0 -1
- package/dist/generated/global-types.d.ts +0 -18199
- package/dist/generated/global-types.d.ts.map +0 -1
- package/dist/generated/wspace-operations.d.ts +0 -2
- package/dist/generated/wspace-operations.d.ts.map +0 -1
- package/dist/generated/wspace-types.d.ts +0 -43046
- package/dist/generated/wspace-types.d.ts.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosmicApi.js","names":[],"sources":["../../../src/cosmicintersection/api/cosmicApi.ts"],"sourcesContent":["/**\n * cosmicApi — hand-written typed data layer for the CosmicIntersection MFE.\n *\n * Mirrors the pattern in microfe-eventfullymanaged's eventApi.ts: inline `gql`\n * documents + `@apollo/client/react` hooks, with hand-written response/variables\n * types that track the wspace-cosmicintersection-svc subgraph SDL exactly. The\n * Apollo client is provided by the HOST app shell via React context (integrated\n * mode) — this module never constructs a client. Every `cos*` operation runs on\n * the workspace gateway (the default client in context).\n *\n * Scalar mapping: BigInt -> string, JSON -> Record<string, unknown>,\n * DateTime -> string (ISO).\n */\nimport { gql, type ErrorLike } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\n\nimport { notify } from '../lib/toast';\n\n/**\n * Shared mutation error sink. The gateway client runs with `errorPolicy: 'all'`,\n * so in-band GraphQL errors also invoke `onError`; wiring this on every write\n * mutation guarantees a failure is always surfaced to the user even if a caller\n * forgets to inspect the resolved result.\n */\nconst onMutationError = (error: ErrorLike): void => {\n notify.error('Something went wrong', error.message || 'Please try again.');\n};\n\n// ============================================================================\n// ENUMS (string-literal unions — exact SDL values)\n// ============================================================================\n\nexport type CosDatasetStatus = 'DRAFT' | 'INGESTING' | 'AVAILABLE' | 'DEPRECATED' | 'ARCHIVED';\nexport type CosAccessLevel = 'PUBLIC' | 'WORKSPACE' | 'RESTRICTED' | 'EMBARGOED';\nexport type CosSourceType =\n | 'TELESCOPE'\n | 'SATELLITE'\n | 'GROUND_SENSOR'\n | 'ARCHIVE'\n | 'API'\n | 'STREAM'\n | 'FILE_DROP'\n | 'SIMULATION';\nexport type CosSourceStatus =\n | 'CONFIGURING'\n | 'CONNECTED'\n | 'SYNCING'\n | 'DEGRADED'\n | 'ERROR'\n | 'DISABLED';\nexport type CosFieldType =\n | 'STRING'\n | 'INTEGER'\n | 'FLOAT'\n | 'BOOLEAN'\n | 'TIMESTAMP'\n | 'COORDINATE'\n | 'SPECTRUM'\n | 'GEOMETRY'\n | 'IMAGE_REF'\n | 'JSON';\nexport type CosPipelineStatus = 'DRAFT' | 'ACTIVE' | 'PAUSED' | 'ARCHIVED';\nexport type CosPipelineTrigger = 'MANUAL' | 'SCHEDULED' | 'ON_INGEST' | 'WEBHOOK';\nexport type CosRunStatus = 'QUEUED' | 'RUNNING' | 'SUCCEEDED' | 'FAILED' | 'CANCELLED';\nexport type CosStepKind = 'INGEST' | 'CALIBRATE' | 'TRANSFORM' | 'ANALYZE' | 'EXPORT' | 'NOTIFY';\nexport type CosNotebookStatus = 'DRAFT' | 'RUNNING' | 'PUBLISHED' | 'ARCHIVED';\nexport type CosAnalysisStatus = 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED';\nexport type CosReleaseStatus = 'DRAFT' | 'UNDER_REVIEW' | 'PUBLISHED' | 'RETRACTED';\nexport type CosGrantStatus = 'PENDING' | 'ACTIVE' | 'EXPIRED' | 'REVOKED';\n\n// ============================================================================\n// ENTITY TYPES\n// ============================================================================\n\n/** Federated wspace-files File stub — only `{ id }` is resolvable in this subgraph. */\nexport interface CosFileRef {\n id: string;\n}\n\nexport interface CosSchemaField {\n id: string;\n workspaceId: string;\n datasetId: string;\n name: string;\n fieldType: CosFieldType;\n unit?: string | null;\n description?: string | null;\n nullable: boolean;\n position: number;\n provenance?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CosDataset {\n id: string;\n workspaceId: string;\n name: string;\n description?: string | null;\n status: CosDatasetStatus;\n accessLevel: CosAccessLevel;\n format?: string | null;\n sourceId?: string | null;\n collectionId?: string | null;\n /** BigInt returned as a numeric string. */\n rowCount: string;\n /** BigInt returned as a numeric string. */\n sizeBytes: string;\n version: number;\n lineageCaptured: boolean;\n coverage?: Record<string, unknown> | null;\n ingestedAt?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n // Relations — only present when the operation selects them (detail queries).\n source?: CosSource | null;\n collection?: CosCollection | null;\n file?: CosFileRef | null;\n schemaFields?: CosSchemaField[];\n}\n\nexport interface CosSource {\n id: string;\n workspaceId: string;\n name: string;\n description?: string | null;\n type: CosSourceType;\n status: CosSourceStatus;\n endpoint?: string | null;\n config?: Record<string, unknown> | null;\n lastSyncedAt?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n // Relation — present only on detail queries.\n datasets?: CosDataset[];\n}\n\nexport interface CosCollection {\n id: string;\n workspaceId: string;\n name: string;\n slug?: string | null;\n description?: string | null;\n isPublic: boolean;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n // Relation — present only on detail queries.\n datasets?: CosDataset[];\n}\n\nexport interface CosPipeline {\n id: string;\n workspaceId: string;\n name: string;\n description?: string | null;\n status: CosPipelineStatus;\n trigger: CosPipelineTrigger;\n schedule?: string | null;\n definition?: Record<string, unknown> | null;\n version: number;\n lastRunAt?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n // Relation — present only on detail queries.\n runs?: CosPipelineRun[];\n}\n\nexport interface CosPipelineRun {\n id: string;\n workspaceId: string;\n pipelineId: string;\n runNumber: number;\n status: CosRunStatus;\n datasetId?: string | null;\n params?: Record<string, unknown> | null;\n metrics?: Record<string, unknown> | null;\n triggeredBy?: string | null;\n startedAt?: string | null;\n finishedAt?: string | null;\n durationMs?: number | null;\n errorMessage?: string | null;\n createdAt: string;\n updatedAt: string;\n // Relations — present only on detail queries.\n pipeline?: CosPipeline | null;\n steps?: CosPipelineStep[];\n}\n\nexport interface CosPipelineStep {\n id: string;\n workspaceId: string;\n runId: string;\n name: string;\n kind: CosStepKind;\n position: number;\n status: CosRunStatus;\n inputs?: Record<string, unknown> | null;\n outputs?: Record<string, unknown> | null;\n logsRef?: string | null;\n startedAt?: string | null;\n finishedAt?: string | null;\n durationMs?: number | null;\n errorMessage?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CosNotebook {\n id: string;\n workspaceId: string;\n title: string;\n description?: string | null;\n status: CosNotebookStatus;\n runtime?: string | null;\n environment?: Record<string, unknown> | null;\n datasetIds: string[];\n isShared: boolean;\n shareSlug?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n // Relations — present only on detail queries.\n file?: CosFileRef | null;\n analyses?: CosAnalysis[];\n releases?: CosRelease[];\n}\n\nexport interface CosAnalysis {\n id: string;\n workspaceId: string;\n title: string;\n status: CosAnalysisStatus;\n method?: string | null;\n aiAssisted: boolean;\n notebookId?: string | null;\n datasetId?: string | null;\n results?: Record<string, unknown> | null;\n outputFile?: CosFileRef | null;\n startedAt?: string | null;\n finishedAt?: string | null;\n errorMessage?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CosRelease {\n id: string;\n workspaceId: string;\n title: string;\n version: string;\n status: CosReleaseStatus;\n abstract?: string | null;\n authors: string[];\n datasetIds: string[];\n notebookId?: string | null;\n doi?: string | null;\n license?: string | null;\n publishedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CosDataAccessGrant {\n id: string;\n workspaceId: string;\n datasetId: string;\n granteeId: string;\n status: CosGrantStatus;\n scopes: string[];\n reason?: string | null;\n grantedAt?: string | null;\n expiresAt?: string | null;\n revokedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// PAGINATION / CONNECTIONS\n// ============================================================================\n\nexport interface CosPageInfo {\n hasMore: boolean;\n cursor?: string | null;\n}\n\nexport interface CosConnection<T> {\n items: T[];\n pageInfo: CosPageInfo;\n}\n\n/** Offset-based pagination input (PaginationInput in the SDL; limit defaults to 50). */\nexport interface CosPaginationInput {\n limit?: number;\n offset?: number;\n cursor?: string;\n}\n\n// ============================================================================\n// INPUT TYPES\n// ============================================================================\n\nexport interface CosCreateDatasetInput {\n name: string;\n description?: string;\n status?: CosDatasetStatus;\n accessLevel?: CosAccessLevel;\n format?: string;\n sourceId?: string;\n collectionId?: string;\n fileId?: string;\n coverage?: Record<string, unknown>;\n tags?: string[];\n}\n\nexport interface CosUpdateDatasetInput {\n name?: string;\n description?: string;\n accessLevel?: CosAccessLevel;\n format?: string;\n collectionId?: string;\n coverage?: Record<string, unknown>;\n tags?: string[];\n}\n\nexport interface CosAddSchemaFieldInput {\n datasetId: string;\n name: string;\n fieldType?: CosFieldType;\n unit?: string;\n description?: string;\n nullable?: boolean;\n position?: number;\n provenance?: string;\n}\n\nexport interface CosCreateSourceInput {\n name: string;\n type?: CosSourceType;\n status?: CosSourceStatus;\n description?: string;\n endpoint?: string;\n credentialRef?: string;\n config?: Record<string, unknown>;\n tags?: string[];\n}\n\nexport interface CosUpdateSourceInput {\n name?: string;\n type?: CosSourceType;\n status?: CosSourceStatus;\n description?: string;\n endpoint?: string;\n credentialRef?: string;\n config?: Record<string, unknown>;\n tags?: string[];\n}\n\nexport interface CosCreateCollectionInput {\n name: string;\n slug?: string;\n description?: string;\n isPublic?: boolean;\n tags?: string[];\n}\n\nexport interface CosCreatePipelineInput {\n name: string;\n description?: string;\n trigger?: CosPipelineTrigger;\n schedule?: string;\n definition?: Record<string, unknown>;\n tags?: string[];\n}\n\nexport interface CosUpdatePipelineInput {\n name?: string;\n description?: string;\n status?: CosPipelineStatus;\n trigger?: CosPipelineTrigger;\n schedule?: string;\n definition?: Record<string, unknown>;\n tags?: string[];\n}\n\nexport interface CosStartRunInput {\n pipelineId: string;\n datasetId?: string;\n params?: Record<string, unknown>;\n}\n\nexport interface CosAddRunStepInput {\n runId: string;\n name: string;\n kind?: CosStepKind;\n inputs?: Record<string, unknown>;\n position?: number;\n}\n\nexport interface CosCreateNotebookInput {\n title: string;\n description?: string;\n runtime?: string;\n environment?: Record<string, unknown>;\n datasetIds?: string[];\n fileId?: string;\n tags?: string[];\n}\n\nexport interface CosUpdateNotebookInput {\n title?: string;\n description?: string;\n status?: CosNotebookStatus;\n runtime?: string;\n environment?: Record<string, unknown>;\n datasetIds?: string[];\n isShared?: boolean;\n shareSlug?: string;\n tags?: string[];\n}\n\nexport interface CosRunAnalysisInput {\n title: string;\n method?: string;\n aiAssisted?: boolean;\n notebookId?: string;\n datasetId?: string;\n}\n\nexport interface CosCreateReleaseInput {\n title: string;\n version?: string;\n abstract?: string;\n authors?: string[];\n datasetIds?: string[];\n notebookId?: string;\n license?: string;\n}\n\nexport interface CosGrantAccessInput {\n datasetId: string;\n granteeId: string;\n scopes?: string[];\n reason?: string;\n expiresAt?: string;\n}\n\n// ============================================================================\n// GQL DOCUMENTS — QUERIES\n// ============================================================================\n\nexport const COS_HEALTH_QUERY = gql`\n query CosHealth {\n cosHealth\n }\n`;\n\nexport const COS_DATASETS_QUERY = gql`\n query CosListDatasets(\n $collectionId: ID\n $sourceId: ID\n $status: CosDatasetStatus\n $pagination: PaginationInput\n ) {\n cosListDatasets(\n collectionId: $collectionId\n sourceId: $sourceId\n status: $status\n pagination: $pagination\n ) {\n items {\n id\n workspaceId\n name\n description\n status\n accessLevel\n format\n sourceId\n collectionId\n rowCount\n sizeBytes\n version\n lineageCaptured\n ingestedAt\n tags\n createdAt\n updatedAt\n }\n pageInfo {\n hasMore\n cursor\n }\n }\n }\n`;\n\nexport const COS_DATASET_QUERY = gql`\n query CosDataset($id: ID!) {\n cosDataset(id: $id) {\n id\n workspaceId\n name\n description\n status\n accessLevel\n format\n sourceId\n collectionId\n rowCount\n sizeBytes\n version\n lineageCaptured\n coverage\n ingestedAt\n tags\n createdAt\n updatedAt\n file {\n id\n }\n source {\n id\n name\n type\n status\n }\n collection {\n id\n name\n slug\n }\n schemaFields {\n id\n datasetId\n name\n fieldType\n unit\n description\n nullable\n position\n provenance\n createdAt\n updatedAt\n }\n }\n }\n`;\n\nexport const COS_SOURCES_QUERY = gql`\n query CosListSources(\n $type: CosSourceType\n $status: CosSourceStatus\n $pagination: PaginationInput\n ) {\n cosListSources(type: $type, status: $status, pagination: $pagination) {\n items {\n id\n workspaceId\n name\n description\n type\n status\n endpoint\n config\n lastSyncedAt\n tags\n createdAt\n updatedAt\n }\n pageInfo {\n hasMore\n cursor\n }\n }\n }\n`;\n\nexport const COS_SOURCE_QUERY = gql`\n query CosSource($id: ID!) {\n cosSource(id: $id) {\n id\n workspaceId\n name\n description\n type\n status\n endpoint\n config\n lastSyncedAt\n tags\n createdAt\n updatedAt\n datasets {\n id\n name\n status\n accessLevel\n rowCount\n updatedAt\n }\n }\n }\n`;\n\nexport const COS_COLLECTIONS_QUERY = gql`\n query CosListCollections {\n cosListCollections {\n id\n workspaceId\n name\n slug\n description\n isPublic\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_SCHEMA_FIELDS_QUERY = gql`\n query CosListSchemaFields($datasetId: ID!) {\n cosListSchemaFields(datasetId: $datasetId) {\n id\n workspaceId\n datasetId\n name\n fieldType\n unit\n description\n nullable\n position\n provenance\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_PIPELINES_QUERY = gql`\n query CosListPipelines($status: CosPipelineStatus, $pagination: PaginationInput) {\n cosListPipelines(status: $status, pagination: $pagination) {\n items {\n id\n workspaceId\n name\n description\n status\n trigger\n schedule\n version\n lastRunAt\n tags\n createdAt\n updatedAt\n }\n pageInfo {\n hasMore\n cursor\n }\n }\n }\n`;\n\nexport const COS_PIPELINE_QUERY = gql`\n query CosPipeline($id: ID!) {\n cosPipeline(id: $id) {\n id\n workspaceId\n name\n description\n status\n trigger\n schedule\n definition\n version\n lastRunAt\n tags\n createdAt\n updatedAt\n runs {\n id\n runNumber\n status\n datasetId\n startedAt\n finishedAt\n durationMs\n createdAt\n }\n }\n }\n`;\n\nexport const COS_RUNS_QUERY = gql`\n query CosListRuns($pipelineId: ID, $status: CosRunStatus, $pagination: PaginationInput) {\n cosListRuns(pipelineId: $pipelineId, status: $status, pagination: $pagination) {\n items {\n id\n workspaceId\n pipelineId\n runNumber\n status\n datasetId\n triggeredBy\n startedAt\n finishedAt\n durationMs\n errorMessage\n createdAt\n updatedAt\n }\n pageInfo {\n hasMore\n cursor\n }\n }\n }\n`;\n\nexport const COS_RUN_QUERY = gql`\n query CosRun($id: ID!) {\n cosRun(id: $id) {\n id\n workspaceId\n pipelineId\n runNumber\n status\n datasetId\n params\n metrics\n triggeredBy\n startedAt\n finishedAt\n durationMs\n errorMessage\n createdAt\n updatedAt\n pipeline {\n id\n name\n status\n }\n steps {\n id\n runId\n name\n kind\n position\n status\n startedAt\n finishedAt\n durationMs\n errorMessage\n }\n }\n }\n`;\n\nexport const COS_RUN_STEPS_QUERY = gql`\n query CosListRunSteps($runId: ID!) {\n cosListRunSteps(runId: $runId) {\n id\n workspaceId\n runId\n name\n kind\n position\n status\n inputs\n outputs\n logsRef\n startedAt\n finishedAt\n durationMs\n errorMessage\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_NOTEBOOKS_QUERY = gql`\n query CosListNotebooks($status: CosNotebookStatus, $pagination: PaginationInput) {\n cosListNotebooks(status: $status, pagination: $pagination) {\n items {\n id\n workspaceId\n title\n description\n status\n runtime\n datasetIds\n isShared\n shareSlug\n tags\n createdAt\n updatedAt\n }\n pageInfo {\n hasMore\n cursor\n }\n }\n }\n`;\n\nexport const COS_NOTEBOOK_QUERY = gql`\n query CosNotebook($id: ID!) {\n cosNotebook(id: $id) {\n id\n workspaceId\n title\n description\n status\n runtime\n environment\n datasetIds\n isShared\n shareSlug\n tags\n createdAt\n updatedAt\n file {\n id\n }\n analyses {\n id\n title\n status\n aiAssisted\n method\n createdAt\n }\n releases {\n id\n title\n version\n status\n publishedAt\n }\n }\n }\n`;\n\nexport const COS_ANALYSES_QUERY = gql`\n query CosListAnalyses($datasetId: ID, $notebookId: ID, $status: CosAnalysisStatus) {\n cosListAnalyses(datasetId: $datasetId, notebookId: $notebookId, status: $status) {\n id\n workspaceId\n title\n status\n method\n aiAssisted\n notebookId\n datasetId\n results\n outputFile {\n id\n }\n startedAt\n finishedAt\n errorMessage\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_RELEASES_QUERY = gql`\n query CosListReleases($status: CosReleaseStatus, $pagination: PaginationInput) {\n cosListReleases(status: $status, pagination: $pagination) {\n items {\n id\n workspaceId\n title\n version\n status\n abstract\n authors\n datasetIds\n notebookId\n doi\n license\n publishedAt\n createdAt\n updatedAt\n }\n pageInfo {\n hasMore\n cursor\n }\n }\n }\n`;\n\nexport const COS_ACCESS_GRANTS_QUERY = gql`\n query CosListAccessGrants($datasetId: ID, $status: CosGrantStatus) {\n cosListAccessGrants(datasetId: $datasetId, status: $status) {\n id\n workspaceId\n datasetId\n granteeId\n status\n scopes\n reason\n grantedAt\n expiresAt\n revokedAt\n createdAt\n updatedAt\n }\n }\n`;\n\n// ============================================================================\n// GQL DOCUMENTS — MUTATIONS\n// ============================================================================\n\nexport const COS_CREATE_DATASET_MUTATION = gql`\n mutation CosCreateDataset($input: CosCreateDatasetInput!) {\n cosCreateDataset(input: $input) {\n id\n name\n status\n accessLevel\n sourceId\n collectionId\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_UPDATE_DATASET_MUTATION = gql`\n mutation CosUpdateDataset($id: ID!, $input: CosUpdateDatasetInput!) {\n cosUpdateDataset(id: $id, input: $input) {\n id\n name\n description\n status\n accessLevel\n format\n collectionId\n tags\n updatedAt\n }\n }\n`;\n\nexport const COS_PUBLISH_DATASET_MUTATION = gql`\n mutation CosPublishDataset($id: ID!) {\n cosPublishDataset(id: $id) {\n id\n status\n ingestedAt\n updatedAt\n }\n }\n`;\n\nexport const COS_ARCHIVE_DATASET_MUTATION = gql`\n mutation CosArchiveDataset($id: ID!) {\n cosArchiveDataset(id: $id)\n }\n`;\n\nexport const COS_ADD_SCHEMA_FIELD_MUTATION = gql`\n mutation CosAddSchemaField($input: CosAddSchemaFieldInput!) {\n cosAddSchemaField(input: $input) {\n id\n workspaceId\n datasetId\n name\n fieldType\n unit\n description\n nullable\n position\n provenance\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_CREATE_SOURCE_MUTATION = gql`\n mutation CosCreateSource($input: CosCreateSourceInput!) {\n cosCreateSource(input: $input) {\n id\n name\n type\n status\n endpoint\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_UPDATE_SOURCE_MUTATION = gql`\n mutation CosUpdateSource($id: ID!, $input: CosUpdateSourceInput!) {\n cosUpdateSource(id: $id, input: $input) {\n id\n name\n description\n type\n status\n endpoint\n tags\n updatedAt\n }\n }\n`;\n\nexport const COS_MARK_SOURCE_SYNCED_MUTATION = gql`\n mutation CosMarkSourceSynced($id: ID!) {\n cosMarkSourceSynced(id: $id) {\n id\n status\n lastSyncedAt\n updatedAt\n }\n }\n`;\n\nexport const COS_ARCHIVE_SOURCE_MUTATION = gql`\n mutation CosArchiveSource($id: ID!) {\n cosArchiveSource(id: $id)\n }\n`;\n\nexport const COS_CREATE_COLLECTION_MUTATION = gql`\n mutation CosCreateCollection($input: CosCreateCollectionInput!) {\n cosCreateCollection(input: $input) {\n id\n name\n slug\n description\n isPublic\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_CREATE_PIPELINE_MUTATION = gql`\n mutation CosCreatePipeline($input: CosCreatePipelineInput!) {\n cosCreatePipeline(input: $input) {\n id\n name\n status\n trigger\n schedule\n version\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_UPDATE_PIPELINE_MUTATION = gql`\n mutation CosUpdatePipeline($id: ID!, $input: CosUpdatePipelineInput!) {\n cosUpdatePipeline(id: $id, input: $input) {\n id\n name\n description\n status\n trigger\n schedule\n tags\n updatedAt\n }\n }\n`;\n\nexport const COS_ARCHIVE_PIPELINE_MUTATION = gql`\n mutation CosArchivePipeline($id: ID!) {\n cosArchivePipeline(id: $id)\n }\n`;\n\nexport const COS_START_RUN_MUTATION = gql`\n mutation CosStartRun($input: CosStartRunInput!) {\n cosStartRun(input: $input) {\n id\n pipelineId\n runNumber\n status\n datasetId\n startedAt\n createdAt\n }\n }\n`;\n\nexport const COS_TRANSITION_RUN_MUTATION = gql`\n mutation CosTransitionRun($id: ID!, $status: CosRunStatus!) {\n cosTransitionRun(id: $id, status: $status) {\n id\n status\n startedAt\n finishedAt\n durationMs\n updatedAt\n }\n }\n`;\n\nexport const COS_ADD_RUN_STEP_MUTATION = gql`\n mutation CosAddRunStep($input: CosAddRunStepInput!) {\n cosAddRunStep(input: $input) {\n id\n runId\n name\n kind\n position\n status\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_CREATE_NOTEBOOK_MUTATION = gql`\n mutation CosCreateNotebook($input: CosCreateNotebookInput!) {\n cosCreateNotebook(input: $input) {\n id\n title\n status\n runtime\n datasetIds\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_UPDATE_NOTEBOOK_MUTATION = gql`\n mutation CosUpdateNotebook($id: ID!, $input: CosUpdateNotebookInput!) {\n cosUpdateNotebook(id: $id, input: $input) {\n id\n title\n description\n status\n runtime\n datasetIds\n isShared\n shareSlug\n tags\n updatedAt\n }\n }\n`;\n\nexport const COS_ARCHIVE_NOTEBOOK_MUTATION = gql`\n mutation CosArchiveNotebook($id: ID!) {\n cosArchiveNotebook(id: $id)\n }\n`;\n\nexport const COS_RUN_ANALYSIS_MUTATION = gql`\n mutation CosRunAnalysis($input: CosRunAnalysisInput!) {\n cosRunAnalysis(input: $input) {\n id\n title\n status\n method\n aiAssisted\n notebookId\n datasetId\n startedAt\n createdAt\n }\n }\n`;\n\nexport const COS_COMPLETE_ANALYSIS_MUTATION = gql`\n mutation CosCompleteAnalysis(\n $id: ID!\n $status: CosAnalysisStatus!\n $results: JSON\n $outputFileId: ID\n ) {\n cosCompleteAnalysis(id: $id, status: $status, results: $results, outputFileId: $outputFileId) {\n id\n status\n results\n finishedAt\n errorMessage\n outputFile {\n id\n }\n updatedAt\n }\n }\n`;\n\nexport const COS_CREATE_RELEASE_MUTATION = gql`\n mutation CosCreateRelease($input: CosCreateReleaseInput!) {\n cosCreateRelease(input: $input) {\n id\n title\n version\n status\n authors\n datasetIds\n notebookId\n license\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_PUBLISH_RELEASE_MUTATION = gql`\n mutation CosPublishRelease($id: ID!, $doi: String) {\n cosPublishRelease(id: $id, doi: $doi) {\n id\n status\n doi\n publishedAt\n updatedAt\n }\n }\n`;\n\nexport const COS_GRANT_ACCESS_MUTATION = gql`\n mutation CosGrantAccess($input: CosGrantAccessInput!) {\n cosGrantAccess(input: $input) {\n id\n datasetId\n granteeId\n status\n scopes\n reason\n grantedAt\n expiresAt\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const COS_REVOKE_ACCESS_MUTATION = gql`\n mutation CosRevokeAccess($id: ID!) {\n cosRevokeAccess(id: $id) {\n id\n status\n revokedAt\n updatedAt\n }\n }\n`;\n\n// ============================================================================\n// RESPONSE / VARIABLES TYPES\n// ============================================================================\n\nexport interface CosHealthQueryData {\n cosHealth: string;\n}\n\nexport interface CosDatasetsQueryData {\n cosListDatasets: CosConnection<CosDataset>;\n}\nexport interface CosDatasetsQueryVars {\n collectionId?: string;\n sourceId?: string;\n status?: CosDatasetStatus;\n pagination?: CosPaginationInput;\n}\n\nexport interface CosDatasetQueryData {\n cosDataset: CosDataset | null;\n}\n\nexport interface CosSourcesQueryData {\n cosListSources: CosConnection<CosSource>;\n}\nexport interface CosSourcesQueryVars {\n type?: CosSourceType;\n status?: CosSourceStatus;\n pagination?: CosPaginationInput;\n}\n\nexport interface CosSourceQueryData {\n cosSource: CosSource | null;\n}\n\nexport interface CosCollectionsQueryData {\n cosListCollections: CosCollection[];\n}\n\nexport interface CosSchemaFieldsQueryData {\n cosListSchemaFields: CosSchemaField[];\n}\n\nexport interface CosPipelinesQueryData {\n cosListPipelines: CosConnection<CosPipeline>;\n}\nexport interface CosPipelinesQueryVars {\n status?: CosPipelineStatus;\n pagination?: CosPaginationInput;\n}\n\nexport interface CosPipelineQueryData {\n cosPipeline: CosPipeline | null;\n}\n\nexport interface CosRunsQueryData {\n cosListRuns: CosConnection<CosPipelineRun>;\n}\nexport interface CosRunsQueryVars {\n pipelineId?: string;\n status?: CosRunStatus;\n pagination?: CosPaginationInput;\n}\n\nexport interface CosRunQueryData {\n cosRun: CosPipelineRun | null;\n}\n\nexport interface CosRunStepsQueryData {\n cosListRunSteps: CosPipelineStep[];\n}\n\nexport interface CosNotebooksQueryData {\n cosListNotebooks: CosConnection<CosNotebook>;\n}\nexport interface CosNotebooksQueryVars {\n status?: CosNotebookStatus;\n pagination?: CosPaginationInput;\n}\n\nexport interface CosNotebookQueryData {\n cosNotebook: CosNotebook | null;\n}\n\nexport interface CosAnalysesQueryData {\n cosListAnalyses: CosAnalysis[];\n}\nexport interface CosAnalysesQueryVars {\n datasetId?: string;\n notebookId?: string;\n status?: CosAnalysisStatus;\n}\n\nexport interface CosReleasesQueryData {\n cosListReleases: CosConnection<CosRelease>;\n}\nexport interface CosReleasesQueryVars {\n status?: CosReleaseStatus;\n pagination?: CosPaginationInput;\n}\n\nexport interface CosAccessGrantsQueryData {\n cosListAccessGrants: CosDataAccessGrant[];\n}\nexport interface CosAccessGrantsQueryVars {\n datasetId?: string;\n status?: CosGrantStatus;\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\nexport const useCosHealthQuery = () => useQuery<CosHealthQueryData>(COS_HEALTH_QUERY);\n\nexport const useCosDatasetsQuery = (variables: CosDatasetsQueryVars = {}) =>\n useQuery<CosDatasetsQueryData, CosDatasetsQueryVars>(COS_DATASETS_QUERY, { variables });\n\nexport const useCosDatasetQuery = (id: string) =>\n useQuery<CosDatasetQueryData, { id: string }>(COS_DATASET_QUERY, {\n variables: { id },\n skip: !id,\n });\n\nexport const useCosSourcesQuery = (variables: CosSourcesQueryVars = {}) =>\n useQuery<CosSourcesQueryData, CosSourcesQueryVars>(COS_SOURCES_QUERY, { variables });\n\nexport const useCosSourceQuery = (id: string) =>\n useQuery<CosSourceQueryData, { id: string }>(COS_SOURCE_QUERY, {\n variables: { id },\n skip: !id,\n });\n\nexport const useCosCollectionsQuery = () =>\n useQuery<CosCollectionsQueryData>(COS_COLLECTIONS_QUERY);\n\nexport const useCosSchemaFieldsQuery = (datasetId: string) =>\n useQuery<CosSchemaFieldsQueryData, { datasetId: string }>(COS_SCHEMA_FIELDS_QUERY, {\n variables: { datasetId },\n skip: !datasetId,\n });\n\nexport const useCosPipelinesQuery = (variables: CosPipelinesQueryVars = {}) =>\n useQuery<CosPipelinesQueryData, CosPipelinesQueryVars>(COS_PIPELINES_QUERY, { variables });\n\nexport const useCosPipelineQuery = (id: string) =>\n useQuery<CosPipelineQueryData, { id: string }>(COS_PIPELINE_QUERY, {\n variables: { id },\n skip: !id,\n });\n\nexport const useCosRunsQuery = (variables: CosRunsQueryVars = {}) =>\n useQuery<CosRunsQueryData, CosRunsQueryVars>(COS_RUNS_QUERY, { variables });\n\nexport const useCosRunQuery = (id: string) =>\n useQuery<CosRunQueryData, { id: string }>(COS_RUN_QUERY, {\n variables: { id },\n skip: !id,\n });\n\nexport const useCosRunStepsQuery = (runId: string) =>\n useQuery<CosRunStepsQueryData, { runId: string }>(COS_RUN_STEPS_QUERY, {\n variables: { runId },\n skip: !runId,\n });\n\nexport const useCosNotebooksQuery = (variables: CosNotebooksQueryVars = {}) =>\n useQuery<CosNotebooksQueryData, CosNotebooksQueryVars>(COS_NOTEBOOKS_QUERY, { variables });\n\nexport const useCosNotebookQuery = (id: string) =>\n useQuery<CosNotebookQueryData, { id: string }>(COS_NOTEBOOK_QUERY, {\n variables: { id },\n skip: !id,\n });\n\nexport const useCosAnalysesQuery = (variables: CosAnalysesQueryVars = {}) =>\n useQuery<CosAnalysesQueryData, CosAnalysesQueryVars>(COS_ANALYSES_QUERY, { variables });\n\nexport const useCosReleasesQuery = (variables: CosReleasesQueryVars = {}) =>\n useQuery<CosReleasesQueryData, CosReleasesQueryVars>(COS_RELEASES_QUERY, { variables });\n\nexport const useCosAccessGrantsQuery = (variables: CosAccessGrantsQueryVars = {}) =>\n useQuery<CosAccessGrantsQueryData, CosAccessGrantsQueryVars>(COS_ACCESS_GRANTS_QUERY, {\n variables,\n });\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\nexport const useCosCreateDatasetMutation = () =>\n useMutation<{ cosCreateDataset: CosDataset }, { input: CosCreateDatasetInput }>(\n COS_CREATE_DATASET_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_DATASETS_QUERY }],\n }\n );\n\nexport const useCosUpdateDatasetMutation = () =>\n useMutation<{ cosUpdateDataset: CosDataset }, { id: string; input: CosUpdateDatasetInput }>(\n COS_UPDATE_DATASET_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_DATASETS_QUERY }],\n }\n );\n\nexport const useCosPublishDatasetMutation = () =>\n useMutation<{ cosPublishDataset: CosDataset }, { id: string }>(COS_PUBLISH_DATASET_MUTATION, {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_DATASETS_QUERY }],\n });\n\nexport const useCosArchiveDatasetMutation = () =>\n useMutation<{ cosArchiveDataset: boolean }, { id: string }>(COS_ARCHIVE_DATASET_MUTATION, {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_DATASETS_QUERY }],\n });\n\nexport const useCosAddSchemaFieldMutation = () =>\n useMutation<{ cosAddSchemaField: CosSchemaField }, { input: CosAddSchemaFieldInput }>(\n COS_ADD_SCHEMA_FIELD_MUTATION,\n { errorPolicy: 'all', onError: onMutationError }\n );\n\nexport const useCosCreateSourceMutation = () =>\n useMutation<{ cosCreateSource: CosSource }, { input: CosCreateSourceInput }>(\n COS_CREATE_SOURCE_MUTATION,\n { errorPolicy: 'all', onError: onMutationError, refetchQueries: [{ query: COS_SOURCES_QUERY }] }\n );\n\nexport const useCosUpdateSourceMutation = () =>\n useMutation<{ cosUpdateSource: CosSource }, { id: string; input: CosUpdateSourceInput }>(\n COS_UPDATE_SOURCE_MUTATION,\n { errorPolicy: 'all', onError: onMutationError, refetchQueries: [{ query: COS_SOURCES_QUERY }] }\n );\n\nexport const useCosMarkSourceSyncedMutation = () =>\n useMutation<{ cosMarkSourceSynced: CosSource }, { id: string }>(COS_MARK_SOURCE_SYNCED_MUTATION, {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_SOURCES_QUERY }],\n });\n\nexport const useCosArchiveSourceMutation = () =>\n useMutation<{ cosArchiveSource: boolean }, { id: string }>(COS_ARCHIVE_SOURCE_MUTATION, {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_SOURCES_QUERY }],\n });\n\nexport const useCosCreateCollectionMutation = () =>\n useMutation<{ cosCreateCollection: CosCollection }, { input: CosCreateCollectionInput }>(\n COS_CREATE_COLLECTION_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_COLLECTIONS_QUERY }],\n }\n );\n\nexport const useCosCreatePipelineMutation = () =>\n useMutation<{ cosCreatePipeline: CosPipeline }, { input: CosCreatePipelineInput }>(\n COS_CREATE_PIPELINE_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_PIPELINES_QUERY }],\n }\n );\n\nexport const useCosUpdatePipelineMutation = () =>\n useMutation<{ cosUpdatePipeline: CosPipeline }, { id: string; input: CosUpdatePipelineInput }>(\n COS_UPDATE_PIPELINE_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_PIPELINES_QUERY }],\n }\n );\n\nexport const useCosArchivePipelineMutation = () =>\n useMutation<{ cosArchivePipeline: boolean }, { id: string }>(COS_ARCHIVE_PIPELINE_MUTATION, {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_PIPELINES_QUERY }],\n });\n\nexport const useCosStartRunMutation = () =>\n useMutation<{ cosStartRun: CosPipelineRun }, { input: CosStartRunInput }>(\n COS_START_RUN_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_RUNS_QUERY }],\n }\n );\n\nexport const useCosTransitionRunMutation = () =>\n useMutation<{ cosTransitionRun: CosPipelineRun }, { id: string; status: CosRunStatus }>(\n COS_TRANSITION_RUN_MUTATION,\n { errorPolicy: 'all', onError: onMutationError, refetchQueries: [{ query: COS_RUNS_QUERY }] }\n );\n\nexport const useCosAddRunStepMutation = () =>\n useMutation<{ cosAddRunStep: CosPipelineStep }, { input: CosAddRunStepInput }>(\n COS_ADD_RUN_STEP_MUTATION,\n { errorPolicy: 'all', onError: onMutationError }\n );\n\nexport const useCosCreateNotebookMutation = () =>\n useMutation<{ cosCreateNotebook: CosNotebook }, { input: CosCreateNotebookInput }>(\n COS_CREATE_NOTEBOOK_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_NOTEBOOKS_QUERY }],\n }\n );\n\nexport const useCosUpdateNotebookMutation = () =>\n useMutation<{ cosUpdateNotebook: CosNotebook }, { id: string; input: CosUpdateNotebookInput }>(\n COS_UPDATE_NOTEBOOK_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_NOTEBOOKS_QUERY }],\n }\n );\n\nexport const useCosArchiveNotebookMutation = () =>\n useMutation<{ cosArchiveNotebook: boolean }, { id: string }>(COS_ARCHIVE_NOTEBOOK_MUTATION, {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_NOTEBOOKS_QUERY }],\n });\n\nexport const useCosRunAnalysisMutation = () =>\n useMutation<{ cosRunAnalysis: CosAnalysis }, { input: CosRunAnalysisInput }>(\n COS_RUN_ANALYSIS_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_ANALYSES_QUERY }],\n }\n );\n\nexport const useCosCompleteAnalysisMutation = () =>\n useMutation<\n { cosCompleteAnalysis: CosAnalysis },\n {\n id: string;\n status: Extract<CosAnalysisStatus, 'COMPLETED' | 'FAILED'>;\n results?: Record<string, unknown>;\n outputFileId?: string;\n }\n >(COS_COMPLETE_ANALYSIS_MUTATION, {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_ANALYSES_QUERY }],\n });\n\nexport const useCosCreateReleaseMutation = () =>\n useMutation<{ cosCreateRelease: CosRelease }, { input: CosCreateReleaseInput }>(\n COS_CREATE_RELEASE_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_RELEASES_QUERY }],\n }\n );\n\nexport const useCosPublishReleaseMutation = () =>\n useMutation<{ cosPublishRelease: CosRelease }, { id: string; doi?: string }>(\n COS_PUBLISH_RELEASE_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_RELEASES_QUERY }],\n }\n );\n\nexport const useCosGrantAccessMutation = () =>\n useMutation<{ cosGrantAccess: CosDataAccessGrant }, { input: CosGrantAccessInput }>(\n COS_GRANT_ACCESS_MUTATION,\n {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_ACCESS_GRANTS_QUERY }],\n }\n );\n\nexport const useCosRevokeAccessMutation = () =>\n useMutation<{ cosRevokeAccess: CosDataAccessGrant }, { id: string }>(COS_REVOKE_ACCESS_MUTATION, {\n errorPolicy: 'all',\n onError: onMutationError,\n refetchQueries: [{ query: COS_ACCESS_GRANTS_QUERY }],\n });\n"],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { useState as e } from "react";
|
|
2
|
+
import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
3
|
+
import { Eye as i, MoreVertical as a, Pencil as o, Trash2 as s } from "lucide-react";
|
|
4
|
+
import { AlertDialog as c, AlertDialogAction as l, AlertDialogCancel as u, AlertDialogContent as d, AlertDialogDescription as f, AlertDialogFooter as p, AlertDialogHeader as m, AlertDialogTitle as h, DropdownMenu as g, DropdownMenuContent as _, DropdownMenuItem as v, DropdownMenuSeparator as y, DropdownMenuTrigger as b, buttonVariants as x } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
//#region src/cosmicintersection/components/ActionMenu.tsx
|
|
6
|
+
var S = "text-status-error-text focus:text-status-error-text";
|
|
7
|
+
function C({ ariaLabel: C, onView: w, onEdit: T, onDelete: E, entityName: D, deleteLabel: O = "Delete", extraItems: k = [], align: A = "end", trigger: j }) {
|
|
8
|
+
let [M, N] = e(!1), [P, F] = e(!1), I = async () => {
|
|
9
|
+
if (E) try {
|
|
10
|
+
F(!0), await E(), N(!1);
|
|
11
|
+
} catch {} finally {
|
|
12
|
+
F(!1);
|
|
13
|
+
}
|
|
14
|
+
}, L = j ?? /* @__PURE__ */ n("button", {
|
|
15
|
+
type: "button",
|
|
16
|
+
className: "inline-flex size-9 items-center justify-center rounded-button text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus max-md:size-11",
|
|
17
|
+
"aria-label": C,
|
|
18
|
+
children: /* @__PURE__ */ n(a, {
|
|
19
|
+
className: "size-4",
|
|
20
|
+
"aria-hidden": "true"
|
|
21
|
+
})
|
|
22
|
+
});
|
|
23
|
+
return w || T || k.length > 0 || E ? /* @__PURE__ */ r(t, { children: [/* @__PURE__ */ r(g, { children: [/* @__PURE__ */ n(b, {
|
|
24
|
+
asChild: !0,
|
|
25
|
+
onClick: (e) => e.stopPropagation(),
|
|
26
|
+
onKeyDown: (e) => e.stopPropagation(),
|
|
27
|
+
children: L
|
|
28
|
+
}), /* @__PURE__ */ r(_, {
|
|
29
|
+
align: A,
|
|
30
|
+
className: "min-w-44",
|
|
31
|
+
onClick: (e) => e.stopPropagation(),
|
|
32
|
+
onKeyDown: (e) => e.stopPropagation(),
|
|
33
|
+
children: [
|
|
34
|
+
w ? /* @__PURE__ */ r(v, {
|
|
35
|
+
className: "cursor-pointer gap-2",
|
|
36
|
+
onSelect: () => w(),
|
|
37
|
+
children: [/* @__PURE__ */ n(i, {
|
|
38
|
+
className: "size-4 shrink-0",
|
|
39
|
+
"aria-hidden": "true"
|
|
40
|
+
}), /* @__PURE__ */ n("span", { children: "View" })]
|
|
41
|
+
}) : null,
|
|
42
|
+
T ? /* @__PURE__ */ r(v, {
|
|
43
|
+
className: "cursor-pointer gap-2",
|
|
44
|
+
onSelect: () => T(),
|
|
45
|
+
children: [/* @__PURE__ */ n(o, {
|
|
46
|
+
className: "size-4 shrink-0",
|
|
47
|
+
"aria-hidden": "true"
|
|
48
|
+
}), /* @__PURE__ */ n("span", { children: "Edit" })]
|
|
49
|
+
}) : null,
|
|
50
|
+
k.map((e) => {
|
|
51
|
+
let t = e.icon;
|
|
52
|
+
return /* @__PURE__ */ r("div", {
|
|
53
|
+
className: "contents",
|
|
54
|
+
children: [e.separatorBefore ? /* @__PURE__ */ n(y, {}) : null, /* @__PURE__ */ r(v, {
|
|
55
|
+
disabled: e.disabled,
|
|
56
|
+
onSelect: () => e.onSelect(),
|
|
57
|
+
className: `cursor-pointer gap-2 ${e.variant === "danger" ? S : ""}`,
|
|
58
|
+
children: [t ? /* @__PURE__ */ n(t, {
|
|
59
|
+
className: "size-4 shrink-0",
|
|
60
|
+
"aria-hidden": "true"
|
|
61
|
+
}) : null, /* @__PURE__ */ n("span", {
|
|
62
|
+
className: "min-w-0 truncate",
|
|
63
|
+
children: e.label
|
|
64
|
+
})]
|
|
65
|
+
})]
|
|
66
|
+
}, e.key);
|
|
67
|
+
}),
|
|
68
|
+
E ? /* @__PURE__ */ r("div", {
|
|
69
|
+
className: "contents",
|
|
70
|
+
children: [w || T || k.length > 0 ? /* @__PURE__ */ n(y, {}) : null, /* @__PURE__ */ r(v, {
|
|
71
|
+
className: `cursor-pointer gap-2 ${S}`,
|
|
72
|
+
onSelect: () => N(!0),
|
|
73
|
+
children: [/* @__PURE__ */ n(s, {
|
|
74
|
+
className: "size-4 shrink-0",
|
|
75
|
+
"aria-hidden": "true"
|
|
76
|
+
}), /* @__PURE__ */ n("span", { children: O })]
|
|
77
|
+
})]
|
|
78
|
+
}) : null
|
|
79
|
+
]
|
|
80
|
+
})] }), E ? /* @__PURE__ */ n(c, {
|
|
81
|
+
open: M,
|
|
82
|
+
onOpenChange: (e) => P ? void 0 : N(e),
|
|
83
|
+
children: /* @__PURE__ */ r(d, {
|
|
84
|
+
onClick: (e) => e.stopPropagation(),
|
|
85
|
+
children: [/* @__PURE__ */ r(m, { children: [/* @__PURE__ */ r(h, { children: [O, D ? ` “${D}”?` : "?"] }), /* @__PURE__ */ r(f, { children: [
|
|
86
|
+
"This action cannot be undone. ",
|
|
87
|
+
D ? `“${D}” ` : "This record ",
|
|
88
|
+
"will be permanently affected."
|
|
89
|
+
] })] }), /* @__PURE__ */ r(p, { children: [/* @__PURE__ */ n(u, {
|
|
90
|
+
disabled: P,
|
|
91
|
+
children: "Cancel"
|
|
92
|
+
}), /* @__PURE__ */ n(l, {
|
|
93
|
+
onClick: (e) => {
|
|
94
|
+
e.preventDefault(), I();
|
|
95
|
+
},
|
|
96
|
+
disabled: P,
|
|
97
|
+
className: x({ variant: "destructive" }),
|
|
98
|
+
children: P ? "Working…" : O
|
|
99
|
+
})] })]
|
|
100
|
+
})
|
|
101
|
+
}) : null] }) : null;
|
|
102
|
+
}
|
|
103
|
+
//#endregion
|
|
104
|
+
export { C as default };
|
|
105
|
+
|
|
106
|
+
//# sourceMappingURL=ActionMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionMenu.js","names":[],"sources":["../../../src/cosmicintersection/components/ActionMenu.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport type { LucideIcon } from 'lucide-react';\nimport { Eye, MoreVertical, Pencil, Trash2 } from 'lucide-react';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n buttonVariants,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@burdenoff/fe-libs/ui';\n\nexport interface ActionMenuItem {\n key: string;\n label: string;\n icon?: LucideIcon;\n onSelect: () => void;\n variant?: 'default' | 'danger';\n disabled?: boolean;\n separatorBefore?: boolean;\n}\n\nexport interface ActionMenuProps {\n /** Accessible name for the trigger, e.g. \"Dataset actions\". */\n ariaLabel: string;\n onView?: () => void;\n onEdit?: () => void;\n /**\n * Delete/destructive handler — opens a confirm dialog first. May be async; the\n * dialog stays open until it resolves.\n */\n onDelete?: () => void | Promise<void>;\n /** Name shown inside the confirmation (\"Archive \\\"Kepler DR3\\\"?\"). */\n entityName?: string;\n /** Label for the danger item + confirm button. Defaults to \"Delete\". */\n deleteLabel?: string;\n /** Additional items inserted before the Delete action. */\n extraItems?: ActionMenuItem[];\n align?: 'start' | 'end';\n trigger?: ReactNode;\n}\n\nconst DANGER_ITEM_CLASS = 'text-status-error-text focus:text-status-error-text';\n\n/**\n * Canonical row overflow menu (View / Edit / Delete) for CosmicIntersection list\n * pages. Built on the fe-libs Radix DropdownMenu (keyboard nav, Escape,\n * outside-click, focus return). Delete routes through an AlertDialog confirm\n * before the destructive handler fires. Safe inside clickable cards/rows — the\n * trigger and content stop click propagation.\n */\nexport function ActionMenu({\n ariaLabel,\n onView,\n onEdit,\n onDelete,\n entityName,\n deleteLabel = 'Delete',\n extraItems = [],\n align = 'end',\n trigger,\n}: ActionMenuProps) {\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [deleting, setDeleting] = useState(false);\n\n const handleConfirmDelete = async () => {\n if (!onDelete) {\n return;\n }\n try {\n setDeleting(true);\n await onDelete();\n setConfirmOpen(false);\n } catch {\n // The handler surfaces its own error (toast); keep the dialog open so the\n // user can retry or cancel rather than silently dismissing.\n } finally {\n setDeleting(false);\n }\n };\n\n const triggerNode = trigger ?? (\n <button\n type=\"button\"\n className=\"inline-flex size-9 items-center justify-center rounded-button text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus max-md:size-11\"\n aria-label={ariaLabel}\n >\n <MoreVertical className=\"size-4\" aria-hidden=\"true\" />\n </button>\n );\n\n const hasAnyItem = Boolean(onView || onEdit || extraItems.length > 0 || onDelete);\n if (!hasAnyItem) {\n return null;\n }\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger\n asChild\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n >\n {triggerNode}\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align={align}\n className=\"min-w-44\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n >\n {onView ? (\n <DropdownMenuItem className=\"cursor-pointer gap-2\" onSelect={() => onView()}>\n <Eye className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n <span>View</span>\n </DropdownMenuItem>\n ) : null}\n {onEdit ? (\n <DropdownMenuItem className=\"cursor-pointer gap-2\" onSelect={() => onEdit()}>\n <Pencil className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n <span>Edit</span>\n </DropdownMenuItem>\n ) : null}\n {extraItems.map((item) => {\n const Icon = item.icon;\n return (\n <div key={item.key} className=\"contents\">\n {item.separatorBefore ? <DropdownMenuSeparator /> : null}\n <DropdownMenuItem\n disabled={item.disabled}\n onSelect={() => item.onSelect()}\n className={`cursor-pointer gap-2 ${item.variant === 'danger' ? DANGER_ITEM_CLASS : ''}`}\n >\n {Icon ? <Icon className=\"size-4 shrink-0\" aria-hidden=\"true\" /> : null}\n <span className=\"min-w-0 truncate\">{item.label}</span>\n </DropdownMenuItem>\n </div>\n );\n })}\n {onDelete ? (\n <div className=\"contents\">\n {onView || onEdit || extraItems.length > 0 ? <DropdownMenuSeparator /> : null}\n <DropdownMenuItem\n className={`cursor-pointer gap-2 ${DANGER_ITEM_CLASS}`}\n onSelect={() => setConfirmOpen(true)}\n >\n <Trash2 className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n <span>{deleteLabel}</span>\n </DropdownMenuItem>\n </div>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {onDelete ? (\n <AlertDialog\n open={confirmOpen}\n onOpenChange={(next) => (deleting ? undefined : setConfirmOpen(next))}\n >\n <AlertDialogContent onClick={(event) => event.stopPropagation()}>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {deleteLabel}\n {entityName ? ` “${entityName}”?` : '?'}\n </AlertDialogTitle>\n <AlertDialogDescription>\n This action cannot be undone. {entityName ? `“${entityName}” ` : 'This record '}\n will be permanently affected.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={deleting}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={(event) => {\n event.preventDefault();\n void handleConfirmDelete();\n }}\n disabled={deleting}\n className={buttonVariants({ variant: 'destructive' })}\n >\n {deleting ? 'Working…' : deleteLabel}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n ) : null}\n </>\n );\n}\n\nexport default ActionMenu;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as e, jsxs as t } from "react/jsx-runtime";
|
|
2
|
+
import { Inbox as n } from "lucide-react";
|
|
3
|
+
//#region src/cosmicintersection/components/EmptyState.tsx
|
|
4
|
+
function r({ icon: r = n, title: i, description: a, action: o, className: s }) {
|
|
5
|
+
return /* @__PURE__ */ t("div", {
|
|
6
|
+
className: `flex min-h-[240px] flex-col items-center justify-center gap-3 rounded-card border border-dashed border-border-default bg-bg-sunken px-6 py-12 text-center ${s ?? ""}`,
|
|
7
|
+
children: [
|
|
8
|
+
/* @__PURE__ */ e("div", {
|
|
9
|
+
className: "flex size-12 items-center justify-center rounded-full bg-bg-elevated text-text-secondary",
|
|
10
|
+
children: /* @__PURE__ */ e(r, {
|
|
11
|
+
className: "size-6",
|
|
12
|
+
"aria-hidden": "true"
|
|
13
|
+
})
|
|
14
|
+
}),
|
|
15
|
+
/* @__PURE__ */ t("div", {
|
|
16
|
+
className: "space-y-1",
|
|
17
|
+
children: [/* @__PURE__ */ e("p", {
|
|
18
|
+
className: "text-sm font-semibold text-text-primary",
|
|
19
|
+
children: i
|
|
20
|
+
}), a ? /* @__PURE__ */ e("p", {
|
|
21
|
+
className: "mx-auto max-w-md text-sm text-text-secondary",
|
|
22
|
+
children: a
|
|
23
|
+
}) : null]
|
|
24
|
+
}),
|
|
25
|
+
o ? /* @__PURE__ */ e("div", {
|
|
26
|
+
className: "mt-1",
|
|
27
|
+
children: o
|
|
28
|
+
}) : null
|
|
29
|
+
]
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { r as default };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=EmptyState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/cosmicintersection/components/EmptyState.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { LucideIcon } from 'lucide-react';\nimport { Inbox } from 'lucide-react';\n\nexport interface EmptyStateProps {\n icon?: LucideIcon;\n title: string;\n description?: string;\n /** Primary call-to-action, e.g. a \"Create dataset\" button. */\n action?: ReactNode;\n className?: string;\n}\n\n/**\n * Friendly empty-state for list/detail surfaces with no records yet. Token-styled\n * so it reads correctly in every theme.\n */\nexport function EmptyState({\n icon: Icon = Inbox,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={`flex min-h-[240px] flex-col items-center justify-center gap-3 rounded-card border border-dashed border-border-default bg-bg-sunken px-6 py-12 text-center ${className ?? ''}`}\n >\n <div className=\"flex size-12 items-center justify-center rounded-full bg-bg-elevated text-text-secondary\">\n <Icon className=\"size-6\" aria-hidden=\"true\" />\n </div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-semibold text-text-primary\">{title}</p>\n {description ? (\n <p className=\"mx-auto max-w-md text-sm text-text-secondary\">{description}</p>\n ) : null}\n </div>\n {action ? <div className=\"mt-1\">{action}</div> : null}\n </div>\n );\n}\n\nexport default EmptyState;\n"],"mappings":";;;AAiBA,SAAgB,EAAW,EACzB,MAAM,IAAO,GACb,UACA,gBACA,WACA,gBACkB;AAClB,QACE,kBAAC,OAAD;EACE,WAAW,6JAA6J,KAAa;YADvL;GAGE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAM,WAAU;KAAS,eAAY;KAAS,CAAA;IAC1C,CAAA;GACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAA2C;KAAU,CAAA,EACjE,IACC,kBAAC,KAAD;KAAG,WAAU;eAAgD;KAAgB,CAAA,GAC3E,KACA;;GACL,IAAS,kBAAC,OAAD;IAAK,WAAU;cAAQ;IAAa,CAAA,GAAG;GAC7C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx as e, jsxs as t } from "react/jsx-runtime";
|
|
2
|
+
import { ArrowLeft as n, Save as r } from "lucide-react";
|
|
3
|
+
import { Button as i } from "@burdenoff/fe-libs/ui";
|
|
4
|
+
//#region src/cosmicintersection/components/EntityFormShell.tsx
|
|
5
|
+
function a({ title: a, description: o, purpose: s, backLabel: c, onBack: l, onSubmit: u, submitLabel: d, savingLabel: f, saving: p = !1, submitDisabled: m = !1, children: h }) {
|
|
6
|
+
return /* @__PURE__ */ t("div", {
|
|
7
|
+
className: "space-y-6 p-6",
|
|
8
|
+
children: [
|
|
9
|
+
/* @__PURE__ */ t("div", { children: [
|
|
10
|
+
/* @__PURE__ */ t(i, {
|
|
11
|
+
type: "button",
|
|
12
|
+
variant: "ghost",
|
|
13
|
+
size: "sm",
|
|
14
|
+
onClick: l,
|
|
15
|
+
children: [/* @__PURE__ */ e(n, { className: "size-4" }), c]
|
|
16
|
+
}),
|
|
17
|
+
/* @__PURE__ */ e("h1", {
|
|
18
|
+
className: "mt-3 text-2xl font-bold text-text-primary",
|
|
19
|
+
children: a
|
|
20
|
+
}),
|
|
21
|
+
o ? /* @__PURE__ */ e("p", {
|
|
22
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
23
|
+
children: o
|
|
24
|
+
}) : null
|
|
25
|
+
] }),
|
|
26
|
+
s ? /* @__PURE__ */ e("div", {
|
|
27
|
+
className: "rounded-card border border-status-info-border bg-status-info-bg-subtle px-4 py-3 text-sm text-text-secondary",
|
|
28
|
+
children: s
|
|
29
|
+
}) : null,
|
|
30
|
+
/* @__PURE__ */ e("div", {
|
|
31
|
+
className: "rounded-card border border-border-default bg-bg-elevated p-6",
|
|
32
|
+
children: /* @__PURE__ */ t("form", {
|
|
33
|
+
onSubmit: u,
|
|
34
|
+
className: "space-y-4",
|
|
35
|
+
children: [h, /* @__PURE__ */ t("div", {
|
|
36
|
+
className: "flex justify-end gap-3",
|
|
37
|
+
children: [/* @__PURE__ */ e(i, {
|
|
38
|
+
type: "button",
|
|
39
|
+
variant: "outline",
|
|
40
|
+
onClick: l,
|
|
41
|
+
disabled: p,
|
|
42
|
+
children: "Cancel"
|
|
43
|
+
}), /* @__PURE__ */ t(i, {
|
|
44
|
+
type: "submit",
|
|
45
|
+
disabled: p || m,
|
|
46
|
+
children: [/* @__PURE__ */ e(r, { className: "size-4" }), p ? f ?? "Saving…" : d]
|
|
47
|
+
})]
|
|
48
|
+
})]
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
]
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { a as default };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=EntityFormShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityFormShell.js","names":[],"sources":["../../../src/cosmicintersection/components/EntityFormShell.tsx"],"sourcesContent":["import type { FormEvent, ReactNode } from 'react';\nimport { ArrowLeft, Save } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\n\nexport interface EntityFormShellProps {\n title: string;\n description?: string;\n /** Guidance copy rendered in a token-styled banner above the form. */\n purpose?: ReactNode;\n backLabel: string;\n onBack: () => void;\n onSubmit: (event: FormEvent<HTMLFormElement>) => void;\n submitLabel: string;\n savingLabel?: string;\n saving?: boolean;\n submitDisabled?: boolean;\n children: ReactNode;\n}\n\n/**\n * Shared CRUD form scaffold: a back link + heading, an optional purpose banner,\n * and a token-styled panel wrapping the fields with a consistent Cancel / Save\n * footer. Error handling stays in the page via the `mutationSucceeded` + `notify`\n * helpers; this shell owns layout and the submit/cancel controls only.\n */\nexport function EntityFormShell({\n title,\n description,\n purpose,\n backLabel,\n onBack,\n onSubmit,\n submitLabel,\n savingLabel,\n saving = false,\n submitDisabled = false,\n children,\n}: EntityFormShellProps) {\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onBack}>\n <ArrowLeft className=\"size-4\" />\n {backLabel}\n </Button>\n <h1 className=\"mt-3 text-2xl font-bold text-text-primary\">{title}</h1>\n {description ? <p className=\"mt-1 text-sm text-text-secondary\">{description}</p> : null}\n </div>\n\n {purpose ? (\n <div className=\"rounded-card border border-status-info-border bg-status-info-bg-subtle px-4 py-3 text-sm text-text-secondary\">\n {purpose}\n </div>\n ) : null}\n\n <div className=\"rounded-card border border-border-default bg-bg-elevated p-6\">\n <form onSubmit={onSubmit} className=\"space-y-4\">\n {children}\n <div className=\"flex justify-end gap-3\">\n <Button type=\"button\" variant=\"outline\" onClick={onBack} disabled={saving}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={saving || submitDisabled}>\n <Save className=\"size-4\" />\n {saving ? (savingLabel ?? 'Saving…') : submitLabel}\n </Button>\n </div>\n </form>\n </div>\n </div>\n );\n}\n\nexport default EntityFormShell;\n"],"mappings":";;;;AAyBA,SAAgB,EAAgB,EAC9B,UACA,gBACA,YACA,cACA,WACA,aACA,gBACA,gBACA,YAAS,IACT,oBAAiB,IACjB,eACuB;AACvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAQ,MAAK;KAAK,SAAS;eAAzD,CACE,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA,EAC/B,EACM;;IACT,kBAAC,MAAD;KAAI,WAAU;eAA6C;KAAW,CAAA;IACrE,IAAc,kBAAC,KAAD;KAAG,WAAU;eAAoC;KAAgB,CAAA,GAAG;IAC/E,EAAA,CAAA;GAEL,IACC,kBAAC,OAAD;IAAK,WAAU;cACZ;IACG,CAAA,GACJ;GAEJ,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,QAAD;KAAgB;KAAU,WAAU;eAApC,CACG,GACD,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAQ,MAAK;OAAS,SAAQ;OAAU,SAAS;OAAQ,UAAU;iBAAQ;OAElE,CAAA,EACT,kBAAC,GAAD;OAAQ,MAAK;OAAS,UAAU,KAAU;iBAA1C,CACE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,EAC1B,IAAU,KAAe,YAAa,EAChC;SACL;QACD;;IACH,CAAA;GACF"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { useState as e } from "react";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
import { Plus as r, Tag as i, X as a } from "lucide-react";
|
|
4
|
+
import { Badge as o, Button as s, Input as c } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
//#region src/cosmicintersection/components/EntityTagsField.tsx
|
|
6
|
+
function l({ value: l, onChange: u, label: d = "Tags", placeholder: f = "Add a tag and press Enter", disabled: p = !1, className: m }) {
|
|
7
|
+
let [h, g] = e(""), _ = () => {
|
|
8
|
+
let e = h.trim();
|
|
9
|
+
e && (l.some((t) => t.toLowerCase() === e.toLowerCase()) || u([...l, e]), g(""));
|
|
10
|
+
}, v = (e) => {
|
|
11
|
+
u(l.filter((t) => t !== e));
|
|
12
|
+
};
|
|
13
|
+
return /* @__PURE__ */ n("div", {
|
|
14
|
+
className: `space-y-2 ${m ?? ""}`,
|
|
15
|
+
children: [
|
|
16
|
+
/* @__PURE__ */ n("div", {
|
|
17
|
+
className: "flex items-center gap-2 text-sm font-medium text-text-primary",
|
|
18
|
+
children: [/* @__PURE__ */ t(i, {
|
|
19
|
+
className: "size-4 text-text-secondary",
|
|
20
|
+
"aria-hidden": "true"
|
|
21
|
+
}), /* @__PURE__ */ t("span", { children: d })]
|
|
22
|
+
}),
|
|
23
|
+
/* @__PURE__ */ t("div", {
|
|
24
|
+
className: "flex flex-wrap gap-2",
|
|
25
|
+
role: "list",
|
|
26
|
+
"aria-label": d,
|
|
27
|
+
children: l.length === 0 ? /* @__PURE__ */ t("span", {
|
|
28
|
+
className: "text-sm text-text-secondary",
|
|
29
|
+
children: "No tags yet."
|
|
30
|
+
}) : l.map((e) => /* @__PURE__ */ n(o, {
|
|
31
|
+
variant: "secondary",
|
|
32
|
+
className: "gap-1.5",
|
|
33
|
+
role: "listitem",
|
|
34
|
+
children: [/* @__PURE__ */ t("span", {
|
|
35
|
+
className: "min-w-0 truncate",
|
|
36
|
+
children: e
|
|
37
|
+
}), /* @__PURE__ */ t("button", {
|
|
38
|
+
type: "button",
|
|
39
|
+
onClick: () => v(e),
|
|
40
|
+
disabled: p,
|
|
41
|
+
"aria-label": `Remove ${e}`,
|
|
42
|
+
className: "rounded-full text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border-focus disabled:opacity-50",
|
|
43
|
+
children: /* @__PURE__ */ t(a, {
|
|
44
|
+
className: "size-3",
|
|
45
|
+
"aria-hidden": "true"
|
|
46
|
+
})
|
|
47
|
+
})]
|
|
48
|
+
}, e))
|
|
49
|
+
}),
|
|
50
|
+
/* @__PURE__ */ n("div", {
|
|
51
|
+
className: "flex items-center gap-2",
|
|
52
|
+
children: [/* @__PURE__ */ t(c, {
|
|
53
|
+
value: h,
|
|
54
|
+
onChange: (e) => g(e.target.value),
|
|
55
|
+
placeholder: f,
|
|
56
|
+
"aria-label": `${d} input`,
|
|
57
|
+
disabled: p,
|
|
58
|
+
className: "w-full max-w-xs",
|
|
59
|
+
onKeyDown: (e) => {
|
|
60
|
+
e.key === "Enter" && (e.preventDefault(), _());
|
|
61
|
+
}
|
|
62
|
+
}), /* @__PURE__ */ n(s, {
|
|
63
|
+
type: "button",
|
|
64
|
+
variant: "outline",
|
|
65
|
+
size: "sm",
|
|
66
|
+
onClick: _,
|
|
67
|
+
disabled: p || !h.trim(),
|
|
68
|
+
children: [/* @__PURE__ */ t(r, { className: "size-4" }), "Add"]
|
|
69
|
+
})]
|
|
70
|
+
})
|
|
71
|
+
]
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { l as default };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=EntityTagsField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityTagsField.js","names":[],"sources":["../../../src/cosmicintersection/components/EntityTagsField.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Plus, Tag as TagIcon, X } from 'lucide-react';\nimport { Badge, Button, Input } from '@burdenoff/fe-libs/ui';\n\nexport interface EntityTagsFieldProps {\n /** Current tags (the `tags: [String!]` inline array on the Cos entity). */\n value: string[];\n /** Called with the next tag array whenever a chip is added or removed. */\n onChange: (tags: string[]) => void;\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Controlled inline tag editor for the `tags: [String!]` arrays carried on every\n * Cos entity. This is intentionally a lightweight chips input — full workspace\n * tag management lives in the app-shell `/tags` route, NOT here — so it never\n * imports microfe-tags or hits a tag service. The parent form owns the array and\n * passes it straight into the entity's create/update input.\n */\nexport function EntityTagsField({\n value,\n onChange,\n label = 'Tags',\n placeholder = 'Add a tag and press Enter',\n disabled = false,\n className,\n}: EntityTagsFieldProps) {\n const [draft, setDraft] = useState('');\n\n const addTag = () => {\n const trimmed = draft.trim();\n if (!trimmed) {\n return;\n }\n // De-duplicate case-insensitively while preserving the user's casing.\n const exists = value.some((tag) => tag.toLowerCase() === trimmed.toLowerCase());\n if (!exists) {\n onChange([...value, trimmed]);\n }\n setDraft('');\n };\n\n const removeTag = (tag: string) => {\n onChange(value.filter((existing) => existing !== tag));\n };\n\n return (\n <div className={`space-y-2 ${className ?? ''}`}>\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <TagIcon className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n <span>{label}</span>\n </div>\n\n <div className=\"flex flex-wrap gap-2\" role=\"list\" aria-label={label}>\n {value.length === 0 ? (\n <span className=\"text-sm text-text-secondary\">No tags yet.</span>\n ) : (\n value.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"gap-1.5\" role=\"listitem\">\n <span className=\"min-w-0 truncate\">{tag}</span>\n <button\n type=\"button\"\n onClick={() => removeTag(tag)}\n disabled={disabled}\n aria-label={`Remove ${tag}`}\n className=\"rounded-full text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border-focus disabled:opacity-50\"\n >\n <X className=\"size-3\" aria-hidden=\"true\" />\n </button>\n </Badge>\n ))\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Input\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n placeholder={placeholder}\n aria-label={`${label} input`}\n disabled={disabled}\n className=\"w-full max-w-xs\"\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n addTag();\n }\n }}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addTag}\n disabled={disabled || !draft.trim()}\n >\n <Plus className=\"size-4\" />\n Add\n </Button>\n </div>\n </div>\n );\n}\n\nexport default EntityTagsField;\n"],"mappings":";;;;;AAsBA,SAAgB,EAAgB,EAC9B,UACA,aACA,WAAQ,QACR,iBAAc,6BACd,cAAW,IACX,gBACuB;CACvB,IAAM,CAAC,GAAO,KAAY,EAAS,GAAG,EAEhC,UAAe;EACnB,IAAM,IAAU,EAAM,MAAM;AACvB,QAIU,EAAM,MAAM,MAAQ,EAAI,aAAa,KAAK,EAAQ,aAAa,CAAC,IAE7E,EAAS,CAAC,GAAG,GAAO,EAAQ,CAAC,EAE/B,EAAS,GAAG;IAGR,KAAa,MAAgB;AACjC,IAAS,EAAM,QAAQ,MAAa,MAAa,EAAI,CAAC;;AAGxD,QACE,kBAAC,OAAD;EAAK,WAAW,aAAa,KAAa;YAA1C;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAS,WAAU;KAA6B,eAAY;KAAS,CAAA,EACrE,kBAAC,QAAD,EAAA,UAAO,GAAa,CAAA,CAChB;;GAEN,kBAAC,OAAD;IAAK,WAAU;IAAuB,MAAK;IAAO,cAAY;cAC3D,EAAM,WAAW,IAChB,kBAAC,QAAD;KAAM,WAAU;eAA8B;KAAmB,CAAA,GAEjE,EAAM,KAAK,MACT,kBAAC,GAAD;KAAiB,SAAQ;KAAY,WAAU;KAAU,MAAK;eAA9D,CACE,kBAAC,QAAD;MAAM,WAAU;gBAAoB;MAAW,CAAA,EAC/C,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAU,EAAI;MACnB;MACV,cAAY,UAAU;MACtB,WAAU;gBAEV,kBAAC,GAAD;OAAG,WAAU;OAAS,eAAY;OAAS,CAAA;MACpC,CAAA,CACH;OAXI,EAWJ,CACR;IAEA,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,OAAO;KACP,WAAW,MAAU,EAAS,EAAM,OAAO,MAAM;KACpC;KACb,cAAY,GAAG,EAAM;KACX;KACV,WAAU;KACV,YAAY,MAAU;AACpB,MAAI,EAAM,QAAQ,YAChB,EAAM,gBAAgB,EACtB,GAAQ;;KAGZ,CAAA,EACF,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,MAAK;KACL,SAAS;KACT,UAAU,KAAY,CAAC,EAAM,MAAM;eALrC,CAOE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,EAAA,MAEpB;OACL;;GACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as e, jsxs as t } from "react/jsx-runtime";
|
|
2
|
+
import { AlertTriangle as n } from "lucide-react";
|
|
3
|
+
import { Button as r } from "@burdenoff/fe-libs/ui";
|
|
4
|
+
//#region src/cosmicintersection/components/ErrorState.tsx
|
|
5
|
+
function i({ title: i = "Something went wrong", message: a = "We could not load this data. Please try again.", onRetry: o, retryLabel: s = "Retry", className: c }) {
|
|
6
|
+
return /* @__PURE__ */ t("div", {
|
|
7
|
+
role: "alert",
|
|
8
|
+
className: `flex min-h-[200px] flex-col items-center justify-center gap-3 rounded-card border border-status-error-border bg-status-error-bg-subtle px-6 py-10 text-center ${c ?? ""}`,
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ e("div", {
|
|
11
|
+
className: "flex size-12 items-center justify-center rounded-full bg-status-error-bg text-status-error-text",
|
|
12
|
+
children: /* @__PURE__ */ e(n, {
|
|
13
|
+
className: "size-6",
|
|
14
|
+
"aria-hidden": "true"
|
|
15
|
+
})
|
|
16
|
+
}),
|
|
17
|
+
/* @__PURE__ */ t("div", {
|
|
18
|
+
className: "space-y-1",
|
|
19
|
+
children: [/* @__PURE__ */ e("p", {
|
|
20
|
+
className: "text-sm font-semibold text-status-error-text",
|
|
21
|
+
children: i
|
|
22
|
+
}), /* @__PURE__ */ e("p", {
|
|
23
|
+
className: "mx-auto max-w-md text-sm text-text-secondary",
|
|
24
|
+
children: a
|
|
25
|
+
})]
|
|
26
|
+
}),
|
|
27
|
+
o ? /* @__PURE__ */ e(r, {
|
|
28
|
+
type: "button",
|
|
29
|
+
variant: "outline",
|
|
30
|
+
size: "sm",
|
|
31
|
+
onClick: o,
|
|
32
|
+
children: s
|
|
33
|
+
}) : null
|
|
34
|
+
]
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { i as default };
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=ErrorState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorState.js","names":[],"sources":["../../../src/cosmicintersection/components/ErrorState.tsx"],"sourcesContent":["import { AlertTriangle } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\n\nexport interface ErrorStateProps {\n title?: string;\n message?: string;\n onRetry?: () => void;\n retryLabel?: string;\n className?: string;\n}\n\n/**\n * Token-styled error surface for failed queries. Uses the semantic status-error\n * token family (never raw red) so it stays theme-correct and accessible.\n */\nexport function ErrorState({\n title = 'Something went wrong',\n message = 'We could not load this data. Please try again.',\n onRetry,\n retryLabel = 'Retry',\n className,\n}: ErrorStateProps) {\n return (\n <div\n role=\"alert\"\n className={`flex min-h-[200px] flex-col items-center justify-center gap-3 rounded-card border border-status-error-border bg-status-error-bg-subtle px-6 py-10 text-center ${className ?? ''}`}\n >\n <div className=\"flex size-12 items-center justify-center rounded-full bg-status-error-bg text-status-error-text\">\n <AlertTriangle className=\"size-6\" aria-hidden=\"true\" />\n </div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-semibold text-status-error-text\">{title}</p>\n <p className=\"mx-auto max-w-md text-sm text-text-secondary\">{message}</p>\n </div>\n {onRetry ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onRetry}>\n {retryLabel}\n </Button>\n ) : null}\n </div>\n );\n}\n\nexport default ErrorState;\n"],"mappings":";;;;AAeA,SAAgB,EAAW,EACzB,WAAQ,wBACR,aAAU,kDACV,YACA,gBAAa,SACb,gBACkB;AAClB,QACE,kBAAC,OAAD;EACE,MAAK;EACL,WAAW,iKAAiK,KAAa;YAF3L;GAIE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAe,WAAU;KAAS,eAAY;KAAS,CAAA;IACnD,CAAA;GACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAAgD;KAAU,CAAA,EACvE,kBAAC,KAAD;KAAG,WAAU;eAAgD;KAAY,CAAA,CACrE;;GACL,IACC,kBAAC,GAAD;IAAQ,MAAK;IAAS,SAAQ;IAAU,MAAK;IAAK,SAAS;cACxD;IACM,CAAA,GACP;GACA"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { notify as e } from "../lib/toast.js";
|
|
2
|
+
import { useId as t, useRef as n, useState as r } from "react";
|
|
3
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
4
|
+
import { Download as o, FileUp as s, Loader2 as c, Paperclip as l, X as u } from "lucide-react";
|
|
5
|
+
import { Button as d } from "@burdenoff/fe-libs/ui";
|
|
6
|
+
import { gql as f } from "@apollo/client";
|
|
7
|
+
import { useApolloClient as p, useQuery as m } from "@apollo/client/react";
|
|
8
|
+
//#region src/cosmicintersection/components/FileUploadField.tsx
|
|
9
|
+
var h = f`
|
|
10
|
+
mutation CosInitiateUpload($input: InitiateUploadInput!) {
|
|
11
|
+
initiateUpload(input: $input) {
|
|
12
|
+
session {
|
|
13
|
+
id
|
|
14
|
+
}
|
|
15
|
+
uploadUrl
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
`, g = f`
|
|
19
|
+
mutation CosCompleteUpload($input: CompleteUploadInput!) {
|
|
20
|
+
completeUpload(input: $input) {
|
|
21
|
+
fileId
|
|
22
|
+
file {
|
|
23
|
+
id
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
`, _ = f`
|
|
28
|
+
query CosGetFileDownloadUrl($id: ID!, $expiresIn: Int) {
|
|
29
|
+
getFileDownloadUrl(id: $id, expiresIn: $expiresIn)
|
|
30
|
+
}
|
|
31
|
+
`, v = 3600;
|
|
32
|
+
function y(e) {
|
|
33
|
+
return m(_, {
|
|
34
|
+
variables: {
|
|
35
|
+
id: e ?? "",
|
|
36
|
+
expiresIn: v
|
|
37
|
+
},
|
|
38
|
+
skip: !e,
|
|
39
|
+
fetchPolicy: "no-cache"
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function b({ value: f, onChange: m, label: _, hint: v, folderId: b, accept: x, disabled: S = !1, className: C }) {
|
|
43
|
+
let w = p(), T = n(null), E = t(), [D, O] = r(!1), [k, A] = r(null), j = y(D ? null : f).data?.getFileDownloadUrl ?? null, M = async (t) => {
|
|
44
|
+
let n = t.target.files?.[0];
|
|
45
|
+
if (t.target.value = "", n) {
|
|
46
|
+
O(!0);
|
|
47
|
+
try {
|
|
48
|
+
let t = n.name.includes(".") ? n.name.substring(n.name.lastIndexOf(".") + 1) : "", r = n.type || "application/octet-stream", i = await w.mutate({
|
|
49
|
+
mutation: h,
|
|
50
|
+
variables: { input: {
|
|
51
|
+
fileName: n.name,
|
|
52
|
+
fileSize: String(n.size),
|
|
53
|
+
extension: t,
|
|
54
|
+
mimeType: r,
|
|
55
|
+
...b ? { folderId: b } : {}
|
|
56
|
+
} }
|
|
57
|
+
}), a = i.data?.initiateUpload?.session, o = i.data?.initiateUpload?.uploadUrl;
|
|
58
|
+
if (!a || !o) throw Error(i.error?.message ?? "Could not start the upload.");
|
|
59
|
+
await new Promise((e, t) => {
|
|
60
|
+
let i = new XMLHttpRequest();
|
|
61
|
+
i.addEventListener("load", () => {
|
|
62
|
+
i.status >= 200 && i.status < 300 ? e() : t(/* @__PURE__ */ Error(`Upload failed with status ${i.status}`));
|
|
63
|
+
}), i.addEventListener("error", () => t(/* @__PURE__ */ Error("Upload network error"))), i.addEventListener("abort", () => t(/* @__PURE__ */ Error("Upload aborted"))), i.open("PUT", o), i.setRequestHeader("Content-Type", r), i.send(n);
|
|
64
|
+
});
|
|
65
|
+
let s = await w.mutate({
|
|
66
|
+
mutation: g,
|
|
67
|
+
variables: { input: {
|
|
68
|
+
sessionId: a.id,
|
|
69
|
+
...b ? { folderId: b } : {}
|
|
70
|
+
} }
|
|
71
|
+
}), c = s.data?.completeUpload?.fileId ?? s.data?.completeUpload?.file?.id;
|
|
72
|
+
if (!c) throw Error(s.error?.message ?? "The file was uploaded but not confirmed.");
|
|
73
|
+
A(n.name), await m(c), e.success("File uploaded");
|
|
74
|
+
} catch (t) {
|
|
75
|
+
e.error("Upload failed", t instanceof Error ? t.message : "Please try again.");
|
|
76
|
+
} finally {
|
|
77
|
+
O(!1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}, N = async () => {
|
|
81
|
+
A(null), await m("");
|
|
82
|
+
};
|
|
83
|
+
return /* @__PURE__ */ a("div", {
|
|
84
|
+
className: C,
|
|
85
|
+
children: [/* @__PURE__ */ a("div", {
|
|
86
|
+
className: "flex flex-wrap items-center gap-3",
|
|
87
|
+
children: [/* @__PURE__ */ i("div", {
|
|
88
|
+
className: "flex size-12 shrink-0 items-center justify-center rounded-card border border-dashed border-border-default bg-bg-sunken text-text-secondary",
|
|
89
|
+
children: /* @__PURE__ */ i(l, {
|
|
90
|
+
className: "size-5",
|
|
91
|
+
"aria-hidden": "true"
|
|
92
|
+
})
|
|
93
|
+
}), /* @__PURE__ */ a("div", {
|
|
94
|
+
className: "space-y-1",
|
|
95
|
+
children: [/* @__PURE__ */ a("div", {
|
|
96
|
+
className: "flex items-center gap-2",
|
|
97
|
+
children: [/* @__PURE__ */ a(d, {
|
|
98
|
+
type: "button",
|
|
99
|
+
variant: "secondary",
|
|
100
|
+
size: "sm",
|
|
101
|
+
disabled: S || D,
|
|
102
|
+
onClick: () => T.current?.click(),
|
|
103
|
+
children: [D ? /* @__PURE__ */ i(c, { className: "size-4 animate-spin" }) : /* @__PURE__ */ i(s, { className: "size-4" }), D ? "Uploading…" : f ? "Replace file" : _]
|
|
104
|
+
}), f && !D ? /* @__PURE__ */ a(d, {
|
|
105
|
+
type: "button",
|
|
106
|
+
variant: "ghost",
|
|
107
|
+
size: "sm",
|
|
108
|
+
onClick: () => void N(),
|
|
109
|
+
disabled: S,
|
|
110
|
+
children: [/* @__PURE__ */ i(u, { className: "size-4" }), "Remove"]
|
|
111
|
+
}) : null]
|
|
112
|
+
}), f ? /* @__PURE__ */ a("div", {
|
|
113
|
+
className: "flex flex-wrap items-center gap-2 text-xs text-text-secondary",
|
|
114
|
+
children: [/* @__PURE__ */ i("span", {
|
|
115
|
+
className: "max-w-[16rem] truncate",
|
|
116
|
+
children: k ?? `File ${f}`
|
|
117
|
+
}), j ? /* @__PURE__ */ a("a", {
|
|
118
|
+
href: j,
|
|
119
|
+
target: "_blank",
|
|
120
|
+
rel: "noopener noreferrer",
|
|
121
|
+
className: "inline-flex items-center gap-1 text-text-primary underline-offset-2 hover:underline",
|
|
122
|
+
children: [/* @__PURE__ */ i(o, {
|
|
123
|
+
className: "size-3.5",
|
|
124
|
+
"aria-hidden": "true"
|
|
125
|
+
}), "Download"]
|
|
126
|
+
}) : null]
|
|
127
|
+
}) : v ? /* @__PURE__ */ i("p", {
|
|
128
|
+
className: "text-xs text-text-secondary",
|
|
129
|
+
children: v
|
|
130
|
+
}) : null]
|
|
131
|
+
})]
|
|
132
|
+
}), /* @__PURE__ */ i("input", {
|
|
133
|
+
ref: T,
|
|
134
|
+
id: E,
|
|
135
|
+
type: "file",
|
|
136
|
+
accept: x,
|
|
137
|
+
className: "sr-only",
|
|
138
|
+
"aria-label": _,
|
|
139
|
+
onChange: (e) => void M(e)
|
|
140
|
+
})]
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
//#endregion
|
|
144
|
+
export { _ as GET_FILE_DOWNLOAD_URL, b as default, y as useFileDownloadUrl };
|
|
145
|
+
|
|
146
|
+
//# sourceMappingURL=FileUploadField.js.map
|