@postxl/generators 1.13.0 → 1.14.0
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/backend-authentication/generators/authentication-service.generator.js +1 -1
- package/dist/backend-core/backend.generator.js +0 -4
- package/dist/backend-core/backend.generator.js.map +1 -1
- package/dist/backend-core/modules/backend-module-xlport.generator.js +1 -1
- package/dist/backend-excel-io/excel-io.generator.d.ts +19 -0
- package/dist/backend-excel-io/excel-io.generator.js +106 -0
- package/dist/backend-excel-io/excel-io.generator.js.map +1 -0
- package/dist/backend-excel-io/generators/excel-io-service.generator.d.ts +9 -0
- package/dist/backend-excel-io/generators/excel-io-service.generator.js +680 -0
- package/dist/backend-excel-io/generators/excel-io-service.generator.js.map +1 -0
- package/dist/backend-excel-io/index.d.ts +2 -0
- package/dist/backend-excel-io/index.js +22 -0
- package/dist/backend-excel-io/index.js.map +1 -0
- package/dist/backend-excel-io/template/README.md +24 -0
- package/dist/backend-excel-io/template/excel-io.controller.ts +195 -0
- package/dist/backend-excel-io/template/excel-io.module.ts +17 -0
- package/dist/backend-import/generators/detect-delta/detect-delta-functions.generator.js +148 -13
- package/dist/backend-import/generators/detect-delta/detect-delta-functions.generator.js.map +1 -1
- package/dist/backend-import/generators/filter-error-rows.generator.d.ts +2 -0
- package/dist/backend-import/generators/filter-error-rows.generator.js +28 -0
- package/dist/backend-import/generators/filter-error-rows.generator.js.map +1 -0
- package/dist/backend-import/generators/import-service.generator.js +126 -2
- package/dist/backend-import/generators/import-service.generator.js.map +1 -1
- package/dist/backend-import/import.generator.js +2 -0
- package/dist/backend-import/import.generator.js.map +1 -1
- package/dist/backend-repositories/generators/model-repository.generator.js +17 -2
- package/dist/backend-repositories/generators/model-repository.generator.js.map +1 -1
- package/dist/backend-router-trpc/generators/app-routes.generator.js +5 -0
- package/dist/backend-router-trpc/generators/app-routes.generator.js.map +1 -1
- package/dist/backend-router-trpc/generators/excel-io-route.generator.d.ts +4 -0
- package/dist/backend-router-trpc/generators/excel-io-route.generator.js +35 -0
- package/dist/backend-router-trpc/generators/excel-io-route.generator.js.map +1 -0
- package/dist/backend-router-trpc/generators/trpc-plugin.generator.js +6 -0
- package/dist/backend-router-trpc/generators/trpc-plugin.generator.js.map +1 -1
- package/dist/backend-router-trpc/generators/trpc-router-module.generator.js +8 -1
- package/dist/backend-router-trpc/generators/trpc-router-module.generator.js.map +1 -1
- package/dist/backend-router-trpc/generators/trpc-shared.generator.js +9 -0
- package/dist/backend-router-trpc/generators/trpc-shared.generator.js.map +1 -1
- package/dist/backend-router-trpc/router-trpc.generator.d.ts +2 -1
- package/dist/backend-router-trpc/router-trpc.generator.js +4 -0
- package/dist/backend-router-trpc/router-trpc.generator.js.map +1 -1
- package/dist/base/base.generator.js +0 -4
- package/dist/base/base.generator.js.map +1 -1
- package/dist/decoders/datamodel-decoder.generator.js +91 -1
- package/dist/decoders/datamodel-decoder.generator.js.map +1 -1
- package/dist/decoders/decoders.generator.d.ts +9 -0
- package/dist/decoders/decoders.generator.js +15 -0
- package/dist/decoders/decoders.generator.js.map +1 -1
- package/dist/devops/devops.generator.d.ts +5 -1
- package/dist/devops/devops.generator.js +5 -4
- package/dist/devops/devops.generator.js.map +1 -1
- package/dist/devops/generators/docker-compose-yml.generator.d.ts +1 -1
- package/dist/devops/generators/docker-compose-yml.generator.js +16 -1
- package/dist/devops/generators/docker-compose-yml.generator.js.map +1 -1
- package/dist/e2e/template/e2e/specs/example.spec.ts-snapshots/Navigate-to-homepage-and-take-snapshot-1-chromium-linux.png +0 -0
- package/dist/frontend-actions/generators/filter-utils.generator.js +1 -1
- package/dist/frontend-admin/admin.generator.d.ts +2 -0
- package/dist/frontend-admin/admin.generator.js +28 -0
- package/dist/frontend-admin/admin.generator.js.map +1 -1
- package/dist/frontend-admin/generators/admin-global-actions.generator.js +78 -0
- package/dist/frontend-admin/generators/admin-global-actions.generator.js.map +1 -1
- package/dist/frontend-admin/generators/admin-overview-page.generator.js +21 -1
- package/dist/frontend-admin/generators/admin-overview-page.generator.js.map +1 -1
- package/dist/frontend-admin/generators/admin-sidebar.generator.js +20 -0
- package/dist/frontend-admin/generators/admin-sidebar.generator.js.map +1 -1
- package/dist/frontend-admin/generators/excel-io-page.generator.d.ts +4 -0
- package/dist/frontend-admin/generators/excel-io-page.generator.js +258 -0
- package/dist/frontend-admin/generators/excel-io-page.generator.js.map +1 -0
- package/dist/frontend-admin/generators/import-review-page-result-stage.generator.d.ts +1 -0
- package/dist/frontend-admin/generators/import-review-page-result-stage.generator.js +104 -0
- package/dist/frontend-admin/generators/import-review-page-result-stage.generator.js.map +1 -0
- package/dist/frontend-admin/generators/import-review-page-review-stage.generator.d.ts +1 -0
- package/dist/frontend-admin/generators/import-review-page-review-stage.generator.js +1031 -0
- package/dist/frontend-admin/generators/import-review-page-review-stage.generator.js.map +1 -0
- package/dist/frontend-admin/generators/import-review-page-upload-stage.generator.d.ts +1 -0
- package/dist/frontend-admin/generators/import-review-page-upload-stage.generator.js +77 -0
- package/dist/frontend-admin/generators/import-review-page-upload-stage.generator.js.map +1 -0
- package/dist/frontend-admin/generators/import-review-page.generator.d.ts +7 -0
- package/dist/frontend-admin/generators/import-review-page.generator.js +180 -0
- package/dist/frontend-admin/generators/import-review-page.generator.js.map +1 -0
- package/dist/frontend-admin/generators/model-admin-page.generator.js +28 -51
- package/dist/frontend-admin/generators/model-admin-page.generator.js.map +1 -1
- package/dist/frontend-admin/utils.js +25 -33
- package/dist/frontend-admin/utils.js.map +1 -1
- package/dist/frontend-core/frontend.generator.js +1 -2
- package/dist/frontend-core/frontend.generator.js.map +1 -1
- package/dist/frontend-core/template/src/components/admin/excel-io-actions.tsx +64 -0
- package/dist/frontend-core/template/src/components/admin/table-view-panel.tsx +41 -3
- package/dist/frontend-core/template/src/hooks/use-excel-io.ts +137 -0
- package/dist/frontend-core/template/src/hooks/use-import-review.ts +143 -0
- package/dist/frontend-core/template/src/lib/excel-download.ts +28 -0
- package/dist/frontend-core/types/hook.d.ts +1 -1
- package/dist/frontend-tables/generators/model-table.generator.js +21 -13
- package/dist/frontend-tables/generators/model-table.generator.js.map +1 -1
- package/dist/generators.js +2 -0
- package/dist/generators.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/seed-data/seed-data.generator.d.ts +3 -0
- package/dist/seed-data/seed-data.generator.js +45 -1
- package/dist/seed-data/seed-data.generator.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-review-page-review-stage.generator.js","sourceRoot":"","sources":["../../../src/frontend-admin/generators/import-review-page-review-stage.generator.ts"],"names":[],"mappings":";;AAAA,0EAkgCC;AAlgCD,SAAgB,+BAA+B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAggCR,CAAA;AACD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function generateImportReviewUploadStage(): string;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateImportReviewUploadStage = generateImportReviewUploadStage;
|
|
4
|
+
function generateImportReviewUploadStage() {
|
|
5
|
+
return `
|
|
6
|
+
function UploadStage({
|
|
7
|
+
isLoading,
|
|
8
|
+
onUpload,
|
|
9
|
+
}: Readonly<{
|
|
10
|
+
isLoading: boolean
|
|
11
|
+
onUpload: (file: File, options: { includeDetailedUnchangedRecords: boolean }) => Promise<void>
|
|
12
|
+
}>) {
|
|
13
|
+
const [selectedFile, setSelectedFile] = useState<File | null>(null)
|
|
14
|
+
const [includeDetailedUnchangedRecords, setIncludeDetailedUnchangedRecords] = useState(false)
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<Card>
|
|
18
|
+
<CardHeader>
|
|
19
|
+
<CardTitle>Upload Excel File</CardTitle>
|
|
20
|
+
</CardHeader>
|
|
21
|
+
<CardContent className="space-y-4">
|
|
22
|
+
<div className="space-y-2">
|
|
23
|
+
<Label htmlFor="import-review-file">Select an .xlsx or .xls file to preview before importing</Label>
|
|
24
|
+
<Input
|
|
25
|
+
id="import-review-file"
|
|
26
|
+
type="file"
|
|
27
|
+
accept=".xlsx,.xls"
|
|
28
|
+
disabled={isLoading}
|
|
29
|
+
onChange={(event) => setSelectedFile(event.target.files?.[0] ?? null)}
|
|
30
|
+
/>
|
|
31
|
+
{selectedFile && <p className="text-sm text-muted-foreground">Selected file: {selectedFile.name}</p>}
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<div className="flex items-center gap-2">
|
|
35
|
+
<Checkbox
|
|
36
|
+
id="detailed-unchanged"
|
|
37
|
+
checked={includeDetailedUnchangedRecords}
|
|
38
|
+
checkIcon="check"
|
|
39
|
+
onChange={(event: React.ChangeEvent<HTMLInputElement>) =>
|
|
40
|
+
setIncludeDetailedUnchangedRecords(event.target.checked)
|
|
41
|
+
}
|
|
42
|
+
/>
|
|
43
|
+
<Label htmlFor="detailed-unchanged">Include detailed unchanged records</Label>
|
|
44
|
+
<TooltipProvider delayDuration={150}>
|
|
45
|
+
<Tooltip>
|
|
46
|
+
<TooltipTrigger asChild>
|
|
47
|
+
<button
|
|
48
|
+
type="button"
|
|
49
|
+
aria-label="Info about detailed unchanged records"
|
|
50
|
+
className="inline-flex h-5 w-5 items-center justify-center rounded-full border text-xs text-muted-foreground"
|
|
51
|
+
>
|
|
52
|
+
i
|
|
53
|
+
</button>
|
|
54
|
+
</TooltipTrigger>
|
|
55
|
+
<TooltipContent>
|
|
56
|
+
<p>On large datasets, including unchanged row details may take longer.</p>
|
|
57
|
+
</TooltipContent>
|
|
58
|
+
</Tooltip>
|
|
59
|
+
</TooltipProvider>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div className="flex gap-3">
|
|
63
|
+
<Button
|
|
64
|
+
disabled={isLoading || !selectedFile}
|
|
65
|
+
onClick={() => selectedFile && void onUpload(selectedFile, { includeDetailedUnchangedRecords })}
|
|
66
|
+
>
|
|
67
|
+
{isLoading ? 'Building preview...' : 'Create Preview'}
|
|
68
|
+
</Button>
|
|
69
|
+
</div>
|
|
70
|
+
</CardContent>
|
|
71
|
+
</Card>
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=import-review-page-upload-stage.generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-review-page-upload-stage.generator.js","sourceRoot":"","sources":["../../../src/frontend-admin/generators/import-review-page-upload-stage.generator.ts"],"names":[],"mappings":";;AAAA,0EAwEC;AAxED,SAAgB,+BAA+B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsER,CAAA;AACD,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateImportReviewPage = generateImportReviewPage;
|
|
4
|
+
const import_review_page_result_stage_generator_1 = require("./import-review-page-result-stage.generator");
|
|
5
|
+
const import_review_page_review_stage_generator_1 = require("./import-review-page-review-stage.generator");
|
|
6
|
+
const import_review_page_upload_stage_generator_1 = require("./import-review-page-upload-stage.generator");
|
|
7
|
+
/**
|
|
8
|
+
* Generator function that generates the Import Review admin page.
|
|
9
|
+
*/
|
|
10
|
+
function generateImportReviewPage({ context }) {
|
|
11
|
+
const models = [...context.models.values()].sort((a, b) => a.userFriendlyName.localeCompare(b.userFriendlyName));
|
|
12
|
+
const modelSchemaMapEntries = models
|
|
13
|
+
.map((model) => ` ${model._conjugated.camelCasePlural}: '${model.databaseSchema}',`)
|
|
14
|
+
.join('\n');
|
|
15
|
+
const modelLabelMapEntries = models
|
|
16
|
+
.map((model) => ` ${model._conjugated.camelCasePlural}: '${model.userFriendlyName.replaceAll("'", "\\'")}',`)
|
|
17
|
+
.join('\n');
|
|
18
|
+
const modelFieldOrderEntries = models
|
|
19
|
+
.map((model) => {
|
|
20
|
+
const fields = Array.from(model.fields.values())
|
|
21
|
+
.map((field) => `'${field.name}'`)
|
|
22
|
+
.join(', ');
|
|
23
|
+
return ` ${model._conjugated.camelCasePlural}: [${fields}],`;
|
|
24
|
+
})
|
|
25
|
+
.join('\n');
|
|
26
|
+
const schemaOrderEntries = [...new Set(models.map((model) => model.databaseSchema))]
|
|
27
|
+
.sort((a, b) => a.localeCompare(b))
|
|
28
|
+
.map((schema) => `'${schema}'`)
|
|
29
|
+
.join(', ');
|
|
30
|
+
return `
|
|
31
|
+
import { AdminSidebar } from '@admin/admin-sidebar'
|
|
32
|
+
|
|
33
|
+
import type { ColumnDef } from '@tanstack/react-table'
|
|
34
|
+
import { useEffect, useMemo, useState } from 'react'
|
|
35
|
+
import { AlertTriangleIcon, MinusIcon, PencilIcon, PlusIcon, Trash2Icon } from 'lucide-react'
|
|
36
|
+
|
|
37
|
+
import type {
|
|
38
|
+
ImportExecutionSummary,
|
|
39
|
+
ImportPreviewItem,
|
|
40
|
+
ImportPreviewModelSummary,
|
|
41
|
+
ImportPreviewResponse,
|
|
42
|
+
SelectedDeltaIndicesByModel,
|
|
43
|
+
} from '@hooks/use-import-review'
|
|
44
|
+
import { useImportReview } from '@hooks/use-import-review'
|
|
45
|
+
import {
|
|
46
|
+
Alert,
|
|
47
|
+
AlertDialog,
|
|
48
|
+
AlertDialogAction,
|
|
49
|
+
AlertDialogCancel,
|
|
50
|
+
AlertDialogContent,
|
|
51
|
+
AlertDialogDescription,
|
|
52
|
+
AlertDialogFooter,
|
|
53
|
+
AlertDialogHeader,
|
|
54
|
+
AlertDialogTitle,
|
|
55
|
+
AlertDescription,
|
|
56
|
+
Badge,
|
|
57
|
+
Button,
|
|
58
|
+
Card,
|
|
59
|
+
CardContent,
|
|
60
|
+
CardHeader,
|
|
61
|
+
CardTitle,
|
|
62
|
+
Checkbox,
|
|
63
|
+
DataGrid,
|
|
64
|
+
Input,
|
|
65
|
+
Label,
|
|
66
|
+
SidebarInset,
|
|
67
|
+
SidebarProvider,
|
|
68
|
+
Tooltip,
|
|
69
|
+
TooltipContent,
|
|
70
|
+
TooltipProvider,
|
|
71
|
+
TooltipTrigger,
|
|
72
|
+
cn,
|
|
73
|
+
useDataGrid,
|
|
74
|
+
} from '@postxl/ui-components'
|
|
75
|
+
|
|
76
|
+
const MODEL_SCHEMA_MAP: Record<string, string> = {
|
|
77
|
+
${modelSchemaMapEntries}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const MODEL_LABEL_MAP: Record<string, string> = {
|
|
81
|
+
${modelLabelMapEntries}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const MODEL_FIELD_ORDER: Record<string, string[]> = {
|
|
85
|
+
${modelFieldOrderEntries}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const SCHEMA_ORDER: string[] = [${schemaOrderEntries}]
|
|
89
|
+
|
|
90
|
+
const TYPE_ORDER: ImportPreviewItem['type'][] = ['errors', 'delete', 'update', 'create', 'unchanged']
|
|
91
|
+
|
|
92
|
+
const TYPE_BADGE_CLASSES: Record<ImportPreviewItem['type'], string> = {
|
|
93
|
+
create: 'text-green-700 border-green-300 dark:text-green-400 dark:border-green-700',
|
|
94
|
+
update: 'text-blue-700 border-blue-300 dark:text-blue-400 dark:border-blue-700',
|
|
95
|
+
delete: 'text-red-700 border-red-300 dark:text-red-400 dark:border-red-700',
|
|
96
|
+
unchanged: 'text-muted-foreground border-border',
|
|
97
|
+
errors: 'text-red-700 border-red-300 dark:text-red-400 dark:border-red-700',
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const EXECUTABLE_TYPES = new Set<ImportPreviewItem['type']>(['create', 'update', 'delete'])
|
|
101
|
+
|
|
102
|
+
export default function ImportReviewPage() {
|
|
103
|
+
const { stage, preview, executionResult, error, isLoading, uploadAndPreview, execute, reset } = useImportReview()
|
|
104
|
+
|
|
105
|
+
const showAdminSidebar = stage === 'upload' || stage === 'previewing' || stage === 'result'
|
|
106
|
+
|
|
107
|
+
return (
|
|
108
|
+
<SidebarProvider defaultOpen>
|
|
109
|
+
{showAdminSidebar && <AdminSidebar />}
|
|
110
|
+
|
|
111
|
+
<SidebarInset className="p-4">
|
|
112
|
+
<div className="mx-auto flex w-full max-w-[1400px] flex-col gap-4">
|
|
113
|
+
<PageHeader stage={stage} />
|
|
114
|
+
|
|
115
|
+
{error && (
|
|
116
|
+
<Alert variant="destructive">
|
|
117
|
+
<AlertDescription>{error}</AlertDescription>
|
|
118
|
+
</Alert>
|
|
119
|
+
)}
|
|
120
|
+
|
|
121
|
+
{(stage === 'upload' || stage === 'previewing') && (
|
|
122
|
+
<UploadStage isLoading={isLoading} onUpload={uploadAndPreview} />
|
|
123
|
+
)}
|
|
124
|
+
|
|
125
|
+
{stage === 'review' && preview && (
|
|
126
|
+
<ReviewStage preview={preview} isLoading={isLoading} onExecute={execute} onReset={reset} />
|
|
127
|
+
)}
|
|
128
|
+
|
|
129
|
+
{stage === 'executing' && (
|
|
130
|
+
<Card>
|
|
131
|
+
<CardContent className="py-8 text-center">
|
|
132
|
+
<p className="text-lg font-medium">Executing selected changes...</p>
|
|
133
|
+
<p className="mt-2 text-sm text-muted-foreground">Applying selected rows to the database.</p>
|
|
134
|
+
</CardContent>
|
|
135
|
+
</Card>
|
|
136
|
+
)}
|
|
137
|
+
|
|
138
|
+
{stage === 'result' && executionResult && <ResultStage result={executionResult} onReset={reset} />}
|
|
139
|
+
</div>
|
|
140
|
+
</SidebarInset>
|
|
141
|
+
</SidebarProvider>
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function PageHeader({ stage }: Readonly<{ stage: 'upload' | 'previewing' | 'review' | 'executing' | 'result' }>) {
|
|
146
|
+
const currentStep = stage === 'upload' || stage === 'previewing' ? 1 : stage === 'review' || stage === 'executing' ? 2 : 3
|
|
147
|
+
|
|
148
|
+
return (
|
|
149
|
+
<div className="space-y-3">
|
|
150
|
+
<h1 className="text-3xl font-bold">Import Review</h1>
|
|
151
|
+
<p className="text-sm text-muted-foreground">
|
|
152
|
+
Upload an Excel file, review and select changes, then execute a controlled import.
|
|
153
|
+
</p>
|
|
154
|
+
<div className="grid grid-cols-3 gap-2">
|
|
155
|
+
<StepChip label="1. Upload" active={currentStep === 1} done={currentStep > 1} />
|
|
156
|
+
<StepChip label="2. Preview & Select" active={currentStep === 2} done={currentStep > 2} />
|
|
157
|
+
<StepChip label="3. Results" active={currentStep === 3} done={false} />
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function StepChip({ label, active, done }: Readonly<{ label: string; active: boolean; done: boolean }>) {
|
|
164
|
+
const stateClass = done
|
|
165
|
+
? 'border-green-300 bg-green-50 text-green-700 dark:border-green-800 dark:bg-green-950/40 dark:text-green-300'
|
|
166
|
+
: active
|
|
167
|
+
? 'border-blue-300 bg-blue-50 text-blue-700 dark:border-blue-800 dark:bg-blue-950/40 dark:text-blue-300'
|
|
168
|
+
: 'border-border bg-background text-muted-foreground'
|
|
169
|
+
|
|
170
|
+
return <div className={cn('rounded border px-3 py-2 text-sm font-medium', stateClass)}>{label}</div>
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
${(0, import_review_page_upload_stage_generator_1.generateImportReviewUploadStage)()}
|
|
174
|
+
|
|
175
|
+
${(0, import_review_page_review_stage_generator_1.generateImportReviewReviewStage)()}
|
|
176
|
+
|
|
177
|
+
${(0, import_review_page_result_stage_generator_1.generateImportReviewResultStage)()}
|
|
178
|
+
`;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=import-review-page.generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-review-page.generator.js","sourceRoot":"","sources":["../../../src/frontend-admin/generators/import-review-page.generator.ts"],"names":[],"mappings":";;AASA,4DA8KC;AArLD,2GAA6F;AAC7F,2GAA6F;AAC7F,2GAA6F;AAE7F;;GAEG;AACH,SAAgB,wBAAwB,CAAC,EAAE,OAAO,EAA8B;IAC9E,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAEhH,MAAM,qBAAqB,GAAG,MAAM;SACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,eAAe,MAAM,KAAK,CAAC,cAAc,IAAI,CAAC;SACpF,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,oBAAoB,GAAG,MAAM;SAChC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,eAAe,MAAM,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC;SAC7G,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,sBAAsB,GAAG,MAAM;SAClC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;aAC7C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;aACjC,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,OAAO,KAAK,KAAK,CAAC,WAAW,CAAC,eAAe,MAAM,MAAM,IAAI,CAAA;IAC/D,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;SACjF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,GAAG,CAAC;SAC9B,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CP,qBAAqB;;;;EAIrB,oBAAoB;;;;EAIpB,sBAAsB;;;kCAGU,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqFlD,IAAA,2EAA+B,GAAE;;EAEjC,IAAA,2EAA+B,GAAE;;EAEjC,IAAA,2EAA+B,GAAE;CAClC,CAAA;AACD,CAAC"}
|
|
@@ -70,7 +70,7 @@ function generateModelAdminPage({ model, context, }) {
|
|
|
70
70
|
})
|
|
71
71
|
.addImport({
|
|
72
72
|
from: Generator.toPackageName('@tanstack/react-router'),
|
|
73
|
-
items: [Generator.toFunctionName('useNavigate')],
|
|
73
|
+
items: [Generator.toFunctionName('useNavigate'), Generator.toFunctionName('useSearch')],
|
|
74
74
|
})
|
|
75
75
|
.addImport({
|
|
76
76
|
from: Generator.toBackendModuleLocation('@app-actions/command-palette-action'),
|
|
@@ -171,22 +171,19 @@ import useLocalStorageState from 'use-local-storage-state'
|
|
|
171
171
|
import { useAuth } from '@context-providers/auth-context-provider'
|
|
172
172
|
${imports.generate()}
|
|
173
173
|
|
|
174
|
-
type CellSelection = {
|
|
175
|
-
rowIndex: number
|
|
176
|
-
columnId: string
|
|
177
|
-
}
|
|
178
|
-
|
|
179
174
|
const SIDEBAR_WIDTH_KEY = 'audit-log-sidebar-width'
|
|
180
175
|
|
|
181
|
-
|
|
182
|
-
selectedKey?: string
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export default function ${model.admin.page.pageComponent.name}({ selectedKey }: ${model.admin.page.pageComponent.name}Props) {
|
|
176
|
+
export default function ${model.admin.page.pageComponent.name}() {
|
|
186
177
|
const navigate = useNavigate()
|
|
187
178
|
const { viewerData } = useAuth()
|
|
188
179
|
const currentUserId = viewerData?.user?.id
|
|
189
180
|
const isAdmin = viewerData?.userRoles?.includes('admin') ?? false
|
|
181
|
+
|
|
182
|
+
const { selectedKey, focusedCell } = useSearch({
|
|
183
|
+
from: '/_auth-routes${model.admin.page.route}',
|
|
184
|
+
select: (search) => ({ selectedKey: search.selectedKey, focusedCell: search.focusedCell }),
|
|
185
|
+
})
|
|
186
|
+
|
|
190
187
|
${createModalHook}
|
|
191
188
|
${createModalIntentHook}
|
|
192
189
|
const sidepanelOpen = useAiAssistantState((state) => state.open)
|
|
@@ -197,9 +194,6 @@ export default function ${model.admin.page.pageComponent.name}({ selectedKey }:
|
|
|
197
194
|
defaultValue: 350,
|
|
198
195
|
})
|
|
199
196
|
|
|
200
|
-
// Track the currently focused cell for audit log filtering
|
|
201
|
-
const [focusedCell, setFocusedCell] = useState<CellSelection | null>(null)
|
|
202
|
-
|
|
203
197
|
// Track selected row IDs from checkbox selection
|
|
204
198
|
const [selectedRowIds, setSelectedRowIds] = useState<string[]>([])
|
|
205
199
|
|
|
@@ -224,21 +218,15 @@ export default function ${model.admin.page.pageComponent.name}({ selectedKey }:
|
|
|
224
218
|
${relatedModels.map((rm) => rm.mapDefinition).join('\n ')}
|
|
225
219
|
|
|
226
220
|
|
|
227
|
-
//
|
|
228
|
-
const selectedEntityId =
|
|
229
|
-
if (!filteredDataList || !focusedCell || focusedCell.rowIndex < 0 || focusedCell.rowIndex >= filteredDataList.length) {
|
|
230
|
-
return null
|
|
231
|
-
}
|
|
232
|
-
const row = filteredDataList[focusedCell.rowIndex]
|
|
233
|
-
return row?.id ?? null
|
|
234
|
-
}, [focusedCell, filteredDataList])
|
|
221
|
+
// The selected entity ID comes from the URL selectedKey (which is the entity's id)
|
|
222
|
+
const selectedEntityId = selectedKey ?? null
|
|
235
223
|
|
|
236
|
-
// Get the selected field name based on focused cell
|
|
224
|
+
// Get the selected field name based on focused cell (columnId from search params)
|
|
237
225
|
const selectedField = useMemo(() => {
|
|
238
|
-
if (!focusedCell || focusedCell
|
|
226
|
+
if (!focusedCell || focusedCell === 'select' || focusedCell === 'actions') {
|
|
239
227
|
return null
|
|
240
228
|
}
|
|
241
|
-
return focusedCell
|
|
229
|
+
return focusedCell
|
|
242
230
|
}, [focusedCell])
|
|
243
231
|
|
|
244
232
|
${showComments
|
|
@@ -253,35 +241,25 @@ export default function ${model.admin.page.pageComponent.name}({ selectedKey }:
|
|
|
253
241
|
)
|
|
254
242
|
`
|
|
255
243
|
: ''}
|
|
256
|
-
// Callback when cell focus changes in the table
|
|
257
|
-
const handleCellChange = useCallback((args: { rowIndex: number; columnId: string }) => {
|
|
258
|
-
setFocusedCell({ rowIndex: args.rowIndex, columnId: args.columnId })
|
|
259
|
-
// Clear checkbox selection when focusing a cell
|
|
260
|
-
setSelectedRowIds([])
|
|
261
|
-
}, [])
|
|
262
|
-
|
|
263
244
|
// Callback when row selection changes (checkbox)
|
|
264
245
|
const handleRowSelectionChange = useCallback((rowIds: string[]) => {
|
|
265
246
|
setSelectedRowIds(rowIds)
|
|
266
247
|
// Clear cell selection when using checkbox selection
|
|
267
248
|
if (rowIds.length > 0) {
|
|
268
|
-
|
|
249
|
+
void navigate({ to: '${model.admin.page.route}', search: { selectedKey: undefined, focusedCell: undefined } })
|
|
269
250
|
}
|
|
270
|
-
}, [])
|
|
251
|
+
}, [navigate])
|
|
271
252
|
|
|
272
253
|
// Clear field filter (go up to entity level)
|
|
273
254
|
const handleClearField = useCallback(() => {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
setFocusedCell({ rowIndex: focusedCell.rowIndex, columnId: '' })
|
|
277
|
-
}
|
|
278
|
-
}, [focusedCell])
|
|
255
|
+
void navigate({ to: '${model.admin.page.route}', search: { selectedKey, focusedCell: undefined } })
|
|
256
|
+
}, [navigate, selectedKey])
|
|
279
257
|
|
|
280
258
|
// Clear entity filter (go back to model overview)
|
|
281
259
|
const handleClearEntity = useCallback(() => {
|
|
282
|
-
|
|
260
|
+
void navigate({ to: '${model.admin.page.route}', search: { selectedKey: undefined, focusedCell: undefined } })
|
|
283
261
|
setSelectedRowIds([])
|
|
284
|
-
}, [])
|
|
262
|
+
}, [navigate])
|
|
285
263
|
|
|
286
264
|
const handleFilterChange = useCallback((key: ${model.types.filter.fieldType.name} | 'globalSearch', val: any) => {
|
|
287
265
|
setFilters((prev) => {
|
|
@@ -302,6 +280,15 @@ export default function ${model.admin.page.pageComponent.name}({ selectedKey }:
|
|
|
302
280
|
debouncedFilterChange('globalSearch', value)
|
|
303
281
|
}, [debouncedFilterChange])
|
|
304
282
|
|
|
283
|
+
// Callback when cell focus changes in the table — also sets selectedKey from the focused row
|
|
284
|
+
const handleCellChange = useCallback((args: { rowIndex: number; columnId: string }) => {
|
|
285
|
+
const row = filteredDataList?.[args.rowIndex]
|
|
286
|
+
const key = row?.${model.keyField.name} != null ? String(row.${model.keyField.name}) : undefined
|
|
287
|
+
void navigate({ to: '${model.admin.page.route}', search: { selectedKey: key, focusedCell: args.columnId || undefined } })
|
|
288
|
+
// Clear checkbox selection when focusing a cell
|
|
289
|
+
setSelectedRowIds([])
|
|
290
|
+
}, [navigate, filteredDataList])
|
|
291
|
+
|
|
305
292
|
useEffect(() => {
|
|
306
293
|
const prefix = 'admin-${model._conjugated.kebabCase}-filter'
|
|
307
294
|
|
|
@@ -412,15 +399,6 @@ export default function ${model.admin.page.pageComponent.name}({ selectedKey }:
|
|
|
412
399
|
setSearchInput,
|
|
413
400
|
])
|
|
414
401
|
|
|
415
|
-
// Handle row click - navigate to URL with keyField value
|
|
416
|
-
const handleRowClick = useCallback((key: string | null) => {
|
|
417
|
-
if (key) {
|
|
418
|
-
void navigate({ to: '${model.admin.page.route}/$key', params: { key } })
|
|
419
|
-
} else {
|
|
420
|
-
void navigate({ to: '${model.admin.page.route}' })
|
|
421
|
-
}
|
|
422
|
-
}, [navigate])
|
|
423
|
-
|
|
424
402
|
${model.isReadonly
|
|
425
403
|
? ''
|
|
426
404
|
: `// Handle individual cell updates - directly call mutation for the specific cell
|
|
@@ -470,7 +448,6 @@ export default function ${model.admin.page.pageComponent.name}({ selectedKey }:
|
|
|
470
448
|
onCellChange={handleCellChange}
|
|
471
449
|
onRowSelectionChange={handleRowSelectionChange}
|
|
472
450
|
selectedKey={selectedKey}
|
|
473
|
-
onRowClick={handleRowClick}
|
|
474
451
|
keyField="${model.keyField.name}"
|
|
475
452
|
hasNextPage={hasNextPage}
|
|
476
453
|
fetchNextPage={fetchNextPage}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-admin-page.generator.js","sourceRoot":"","sources":["../../../src/frontend-admin/generators/model-admin-page.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,
|
|
1
|
+
{"version":3,"file":"model-admin-page.generator.js","sourceRoot":"","sources":["../../../src/frontend-admin/generators/model-admin-page.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -78,14 +78,16 @@ function generatePage({ page, paths, vfs, content, }) {
|
|
|
78
78
|
vfs.write((0, node_path_1.join)(paths.routes, `${page.route}.lazy.tsx`), generateOutlet(page));
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
|
-
// Model admin pages with keyField routing
|
|
81
|
+
// Model admin pages with keyField routing render the page in the layout route
|
|
82
|
+
// with useMatch to optionally read the $key param. This prevents re-mounting
|
|
83
|
+
// the page component when navigating between /admin/{model} and /admin/{model}/$key.
|
|
82
84
|
if (page.hasKeyFieldRouting) {
|
|
83
|
-
// Generate
|
|
84
|
-
vfs.write((0, node_path_1.join)(paths.routes, `${page.route}.
|
|
85
|
-
// Generate index route at /admin/{model}/ (
|
|
86
|
-
vfs.write(
|
|
87
|
-
// Generate $key route at /admin/{model}/$key
|
|
88
|
-
vfs.write(
|
|
85
|
+
// Generate layout route at /admin/{model} - renders page directly with useMatch
|
|
86
|
+
vfs.write((0, node_path_1.join)(paths.routes, `${page.route}.tsx`), generateKeyFieldLayoutRoute(page));
|
|
87
|
+
// Generate index route at /admin/{model}/ (renders null, layout handles rendering)
|
|
88
|
+
// vfs.write(join(paths.routes, `${page.route}/index.lazy.tsx`), generateKeyFieldChildRoute(page))
|
|
89
|
+
// Generate $key route at /admin/{model}/$key (renders null, layout handles rendering)
|
|
90
|
+
// vfs.write(join(paths.routes, `${page.route}/$key.lazy.tsx`), generateKeyFieldChildRoute(page, '/$key'))
|
|
89
91
|
for (const alias of page.aliases ?? []) {
|
|
90
92
|
vfs.write((0, node_path_1.join)(paths.routes, `${alias}.tsx`), generateAliasRoute({ alias, page }));
|
|
91
93
|
}
|
|
@@ -134,38 +136,28 @@ export const Route = createFileRoute('${joinRoutes('_auth-routes', alias)}')({
|
|
|
134
136
|
})`;
|
|
135
137
|
}
|
|
136
138
|
/**
|
|
137
|
-
* Generate the
|
|
138
|
-
*
|
|
139
|
+
* Generate the layout route for keyField routing.
|
|
140
|
+
* Renders the page component directly at the layout level with useMatch
|
|
141
|
+
* to optionally read the $key param from the child route.
|
|
142
|
+
* This prevents re-mounting the page when navigating between index and $key routes.
|
|
139
143
|
*/
|
|
140
|
-
function
|
|
144
|
+
function generateKeyFieldLayoutRoute({ pageComponent, route }) {
|
|
141
145
|
if (!route.startsWith('/')) {
|
|
142
146
|
throw new Error(`Route for page ${pageComponent.name} must start with '/': ${route}!`);
|
|
143
147
|
}
|
|
144
148
|
return `import ${pageComponent.name} from '${pageComponent.location}'
|
|
145
|
-
import {
|
|
149
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
150
|
+
import { z } from 'zod'
|
|
146
151
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Generate the $key param route for keyField routing (with key selected)
|
|
153
|
-
* This renders the page component with selectedKey from URL params
|
|
154
|
-
*/
|
|
155
|
-
function generateKeyFieldParamRoute({ pageComponent, route }) {
|
|
156
|
-
if (!route.startsWith('/')) {
|
|
157
|
-
throw new Error(`Route for page ${pageComponent.name} must start with '/': ${route}!`);
|
|
158
|
-
}
|
|
159
|
-
return `import ${pageComponent.name} from '${pageComponent.location}'
|
|
160
|
-
import { createLazyFileRoute } from '@tanstack/react-router'
|
|
152
|
+
const zSearchParams = z.object({
|
|
153
|
+
selectedKey: z.string().optional(),
|
|
154
|
+
focusedCell: z.string().optional(),
|
|
155
|
+
})
|
|
161
156
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export const Route = createLazyFileRoute('${joinRoutes('_auth-routes', route)}/$key')({
|
|
168
|
-
component: ${pageComponent.name}WithKey,
|
|
169
|
-
})`;
|
|
157
|
+
export const Route = createFileRoute('${joinRoutes('_auth-routes', route)}')({
|
|
158
|
+
component: ${pageComponent.name},
|
|
159
|
+
validateSearch: zSearchParams,
|
|
160
|
+
})
|
|
161
|
+
`;
|
|
170
162
|
}
|
|
171
163
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/frontend-admin/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,gEA8BC;AAED,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/frontend-admin/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,7 +42,7 @@ const ROOT_ROUTE_FILENAME = '__root.tsx';
|
|
|
42
42
|
// CONTEXT REGISTRATION --------------------------------------------------------
|
|
43
43
|
exports.base = {
|
|
44
44
|
components: ['color-mode-toggle'],
|
|
45
|
-
hooks: ['useFontsLoaded.ts', 'use-table-view-config.tsx'],
|
|
45
|
+
hooks: ['useFontsLoaded.ts', 'use-table-view-config.tsx', 'use-excel-io.ts', 'use-import-review.ts'],
|
|
46
46
|
contextProviders: ['auth-context-provider.tsx', 'theme-context-provider.tsx'],
|
|
47
47
|
packageJson: {
|
|
48
48
|
// We set name and description with the context's slug in the register function as we do not have access to the schema here yet
|
|
@@ -245,7 +245,6 @@ const configureFrontendGenerator = (into) => ({
|
|
|
245
245
|
await context.vfs.loadFile(copyToRelativeLocation(`src/context-providers/${contextProvider}`));
|
|
246
246
|
}
|
|
247
247
|
context.vfs.write(Path.join(target, 'tsconfig.json'), (0, tsconfig_generator_1.generateTsConfig)(context));
|
|
248
|
-
context.vfs.write(Path.join(target, '.env'), context.vfs.get(Path.join(target, '.env.example')) ?? '');
|
|
249
248
|
return context;
|
|
250
249
|
},
|
|
251
250
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend.generator.js","sourceRoot":"","sources":["../../src/frontend-core/frontend.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAiC;AAEjC,6DAA8C;AAC9C,iDAAiH;AAKjH,wEAAkE;AAGlE,MAAM,mBAAmB,GAAG,YAAY,CAAA;AAIxC,gFAAgF;AAEnE,QAAA,IAAI,GAAyB;IACxC,UAAU,EAAE,CAAC,mBAAmB,CAAC;IACjC,KAAK,EAAE,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"frontend.generator.js","sourceRoot":"","sources":["../../src/frontend-core/frontend.generator.ts"],"names":[],"mappings":"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"}
|