@importcsv/react 0.1.12 → 0.1.14
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/build/components/CSVImporter/index.d.ts +4 -0
- package/build/importer/features/configure-import/index.d.ts +3 -2
- package/build/importer/features/configure-import/types/index.d.ts +2 -1
- package/build/importer/features/main/hooks/useStepNavigation.d.ts +1 -1
- package/build/index.esm.js +52 -15
- package/build/index.esm.js.map +1 -1
- package/build/index.js +52 -15
- package/build/index.js.map +1 -1
- package/build/js.d.ts +4 -0
- package/build/types/index.d.ts +4 -0
- package/package.json +1 -1
|
@@ -22,6 +22,10 @@ declare const CSVImporter: React.ForwardRefExoticComponent<{
|
|
|
22
22
|
user?: Record<string, any> | undefined;
|
|
23
23
|
metadata?: Record<string, any> | undefined;
|
|
24
24
|
useIframe?: boolean | undefined;
|
|
25
|
+
demoData?: {
|
|
26
|
+
fileName: string;
|
|
27
|
+
csvContent: string;
|
|
28
|
+
} | undefined;
|
|
25
29
|
} & {
|
|
26
30
|
isModal?: boolean | undefined;
|
|
27
31
|
modalIsOpen?: boolean | undefined;
|
|
@@ -3,10 +3,11 @@ interface ConfigureImportProps {
|
|
|
3
3
|
template: Template;
|
|
4
4
|
data: any;
|
|
5
5
|
onSuccess: (mapping: any, headerRow: number) => void;
|
|
6
|
-
onCancel
|
|
6
|
+
onCancel?: () => void;
|
|
7
7
|
isSubmitting?: boolean;
|
|
8
8
|
importerKey?: string;
|
|
9
9
|
backendUrl?: string;
|
|
10
|
+
isDemoMode?: boolean;
|
|
10
11
|
}
|
|
11
|
-
export default function ConfigureImport({ template, data, onSuccess, onCancel, isSubmitting, importerKey, backendUrl, }: ConfigureImportProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export default function ConfigureImport({ template, data, onSuccess, onCancel, isSubmitting, importerKey, backendUrl, isDemoMode, }: ConfigureImportProps): import("react/jsx-runtime").JSX.Element;
|
|
12
13
|
export {};
|
|
@@ -3,10 +3,11 @@ export interface ConfigureImportProps {
|
|
|
3
3
|
template: Template;
|
|
4
4
|
data: any;
|
|
5
5
|
onSuccess: (mapping: any, headerRow: number) => void;
|
|
6
|
-
onCancel
|
|
6
|
+
onCancel?: () => void;
|
|
7
7
|
isSubmitting?: boolean;
|
|
8
8
|
importerKey?: string;
|
|
9
9
|
backendUrl?: string;
|
|
10
|
+
isDemoMode?: boolean;
|
|
10
11
|
}
|
|
11
12
|
export interface TemplateColumnMapping {
|
|
12
13
|
key: string;
|
|
@@ -6,7 +6,7 @@ export declare const StepEnum: {
|
|
|
6
6
|
Validation: number;
|
|
7
7
|
Complete: number;
|
|
8
8
|
};
|
|
9
|
-
declare function useStepNavigation(initialStep: number, skipHeader: boolean, useConsolidated?: boolean): {
|
|
9
|
+
declare function useStepNavigation(initialStep: number, skipHeader: boolean, useConsolidated?: boolean, isDemoMode?: boolean): {
|
|
10
10
|
currentStep: any;
|
|
11
11
|
setStep: (newStep: number) => void;
|
|
12
12
|
goBack: (backStep?: number) => void;
|
package/build/index.esm.js
CHANGED
|
@@ -30186,13 +30186,19 @@ var getStepConfig = function (skipHeader, useConsolidated) {
|
|
|
30186
30186
|
{ label: "Validation", id: Steps.Validation },
|
|
30187
30187
|
];
|
|
30188
30188
|
};
|
|
30189
|
-
function useStepNavigation(initialStep, skipHeader, useConsolidated) {
|
|
30189
|
+
function useStepNavigation(initialStep, skipHeader, useConsolidated, isDemoMode) {
|
|
30190
30190
|
var _a;
|
|
30191
30191
|
if (useConsolidated === void 0) { useConsolidated = true; }
|
|
30192
|
+
if (isDemoMode === void 0) { isDemoMode = false; }
|
|
30192
30193
|
var t = useTranslation().t;
|
|
30193
30194
|
var translatedSteps = getStepConfig(skipHeader, useConsolidated).map(function (step) { return (__assign$1(__assign$1({}, step), { label: t(step.label) })); });
|
|
30194
|
-
|
|
30195
|
-
var
|
|
30195
|
+
// Map initial step to stepper index for consolidated flow
|
|
30196
|
+
var initialStepperIndex = useConsolidated && initialStep === StepEnum.MapColumns ? 1 :
|
|
30197
|
+
useConsolidated && initialStep === StepEnum.Validation ? 2 :
|
|
30198
|
+
useConsolidated && initialStep === StepEnum.Complete ? 3 : 0;
|
|
30199
|
+
var stepper = useStepper(translatedSteps, initialStepperIndex, skipHeader);
|
|
30200
|
+
// Don't use localStorage in demo mode
|
|
30201
|
+
var _b = useMutableLocalStorage("tf_steps", isDemoMode ? "" : ""), storageStep = _b[0], setStorageStep = _b[1];
|
|
30196
30202
|
var _c = useState$1(initialStep), currentStep = _c[0], setCurrentStep = _c[1];
|
|
30197
30203
|
var goBack = function (backStep) {
|
|
30198
30204
|
var targetStep = backStep !== undefined ? backStep : Math.max(0, currentStep - 1);
|
|
@@ -30217,6 +30223,10 @@ function useStepNavigation(initialStep, skipHeader, useConsolidated) {
|
|
|
30217
30223
|
stepper.setCurrent(stepperIndex);
|
|
30218
30224
|
};
|
|
30219
30225
|
useEffect$2(function () {
|
|
30226
|
+
// In demo mode, don't use localStorage
|
|
30227
|
+
if (isDemoMode) {
|
|
30228
|
+
return;
|
|
30229
|
+
}
|
|
30220
30230
|
var step = storageStep || 0;
|
|
30221
30231
|
// Map the step to the correct stepper index for consolidated flow
|
|
30222
30232
|
var stepperIndex = useConsolidated ?
|
|
@@ -30227,9 +30237,9 @@ function useStepNavigation(initialStep, skipHeader, useConsolidated) {
|
|
|
30227
30237
|
: step;
|
|
30228
30238
|
stepper.setCurrent(stepperIndex);
|
|
30229
30239
|
setCurrentStep(step);
|
|
30230
|
-
}, [storageStep]);
|
|
30240
|
+
}, [storageStep, isDemoMode]);
|
|
30231
30241
|
return {
|
|
30232
|
-
currentStep: storageStep || currentStep,
|
|
30242
|
+
currentStep: isDemoMode ? currentStep : (storageStep || currentStep),
|
|
30233
30243
|
setStep: setStep,
|
|
30234
30244
|
goBack: goBack,
|
|
30235
30245
|
goNext: goNext,
|
|
@@ -32174,11 +32184,11 @@ styleInject(css_248z$4);
|
|
|
32174
32184
|
|
|
32175
32185
|
function ConfigureImport(_a) {
|
|
32176
32186
|
var _this = this;
|
|
32177
|
-
var template = _a.template, data = _a.data, onSuccess = _a.onSuccess, onCancel = _a.onCancel, _b = _a.isSubmitting, isSubmitting = _b === void 0 ? false : _b, importerKey = _a.importerKey, backendUrl = _a.backendUrl;
|
|
32187
|
+
var template = _a.template, data = _a.data, onSuccess = _a.onSuccess, onCancel = _a.onCancel, _b = _a.isSubmitting, isSubmitting = _b === void 0 ? false : _b, importerKey = _a.importerKey, backendUrl = _a.backendUrl, _c = _a.isDemoMode, isDemoMode = _c === void 0 ? false : _c;
|
|
32178
32188
|
var t = useTranslation().t;
|
|
32179
32189
|
var selectedHeaderRow = 0; // Always use first row as headers
|
|
32180
|
-
var
|
|
32181
|
-
var
|
|
32190
|
+
var _d = useState$1({}), columnMapping = _d[0], setColumnMapping = _d[1];
|
|
32191
|
+
var _e = useState$1(null), error = _e[0], setError = _e[1];
|
|
32182
32192
|
var llmEnhancementCalled = useRef$1(false);
|
|
32183
32193
|
// Get preview data (first 5 rows)
|
|
32184
32194
|
useMemo$1(function () {
|
|
@@ -32357,7 +32367,7 @@ function ConfigureImport(_a) {
|
|
|
32357
32367
|
columnMapping[idx].key !== field.key;
|
|
32358
32368
|
return (jsx(SelectItem, __assign$1({ value: idx.toString(), disabled: isAlreadyMapped }, { children: isAlreadyMapped ? (jsxs("span", __assign$1({ className: "text-gray-400" }, { children: [header, " (mapped)"] }))) : (header) }), idx));
|
|
32359
32369
|
})] })] })) })), jsx("td", __assign$1({ className: "px-6 py-4" }, { children: jsx(Text, __assign$1({ className: "text-sm text-gray-600 truncate max-w-[300px]", title: mappedColumn ? getSampleData(parseInt(mappedColumn)) : '' }, { children: mappedColumn ? (getSampleData(parseInt(mappedColumn)) || '-') : '' })) }))] }), field.key));
|
|
32360
|
-
}) })] })) })), error && (jsx(Box, __assign$1({ className: "bg-red-50 border border-red-200 rounded-lg px-4 py-3" }, { children: jsx(Text, __assign$1({ className: "text-sm text-red-700" }, { children: error })) }))), jsxs(Flex, __assign$1({ justify: "between", className: "w-full pt-6 border-t border-gray-200" }, { children: [jsx(Button, __assign$1({ variant: "outline", onClick: onCancel, disabled: isSubmitting, size: "default" }, { children: t('Back') })), jsx(Button, __assign$1({ onClick: handleSubmit, isLoading: isSubmitting, disabled: !allRequiredFieldsMapped, size: "default", variant: "default" }, { children: t('Continue') }))] }))] })) })));
|
|
32370
|
+
}) })] })) })), error && (jsx(Box, __assign$1({ className: "bg-red-50 border border-red-200 rounded-lg px-4 py-3" }, { children: jsx(Text, __assign$1({ className: "text-sm text-red-700" }, { children: error })) }))), jsxs(Flex, __assign$1({ justify: "between", className: "w-full pt-6 border-t border-gray-200" }, { children: [!isDemoMode && onCancel && (jsx(Button, __assign$1({ variant: "outline", onClick: onCancel, disabled: isSubmitting, size: "default" }, { children: t('Back') }))), isDemoMode && jsx("div", {}), jsx(Button, __assign$1({ onClick: handleSubmit, isLoading: isSubmitting, disabled: !allRequiredFieldsMapped, size: "default", variant: "default" }, { children: t('Continue') }))] }))] })) })));
|
|
32361
32371
|
}
|
|
32362
32372
|
|
|
32363
32373
|
/**
|
|
@@ -35772,14 +35782,18 @@ function IframeWrapper(_a) {
|
|
|
35772
35782
|
|
|
35773
35783
|
function Main(props) {
|
|
35774
35784
|
var _this = this;
|
|
35775
|
-
var _a = props.isModal, isModal = _a === void 0 ? true : _a, _b = props.modalOnCloseTriggered, modalOnCloseTriggered = _b === void 0 ? function () { return null; } : _b, onComplete = props.onComplete, customStyles = props.customStyles, showDownloadTemplateButton = props.showDownloadTemplateButton, skipHeaderRowSelection = props.skipHeaderRowSelection, importerKey = props.importerKey, _c = props.backendUrl, backendUrl = _c === void 0 ? config.apiBaseUrl : _c, user = props.user, metadata = props.metadata, _d = props.useIframe, useIframe = _d === void 0 ? true : _d
|
|
35785
|
+
var _a = props.isModal, isModal = _a === void 0 ? true : _a, _b = props.modalOnCloseTriggered, modalOnCloseTriggered = _b === void 0 ? function () { return null; } : _b, onComplete = props.onComplete, customStyles = props.customStyles, showDownloadTemplateButton = props.showDownloadTemplateButton, skipHeaderRowSelection = props.skipHeaderRowSelection, importerKey = props.importerKey, _c = props.backendUrl, backendUrl = _c === void 0 ? config.apiBaseUrl : _c, user = props.user, metadata = props.metadata, _d = props.useIframe, useIframe = _d === void 0 ? true : _d, // Default to using iframe for CSS isolation
|
|
35786
|
+
demoData = props.demoData;
|
|
35776
35787
|
var skipHeader = skipHeaderRowSelection !== null && skipHeaderRowSelection !== void 0 ? skipHeaderRowSelection : false;
|
|
35788
|
+
var isDemoMode = !!demoData;
|
|
35777
35789
|
var t = useTranslation().t;
|
|
35778
35790
|
// Apply custom styles
|
|
35779
35791
|
useCustomStyles(parseObjectOrStringJSON("customStyles", customStyles));
|
|
35780
35792
|
// Stepper handler - using consolidated flow
|
|
35781
35793
|
var useConsolidatedFlow = true; // Using consolidated flow to combine header selection and mapping
|
|
35782
|
-
|
|
35794
|
+
// Start at MapColumns step if demo mode is active
|
|
35795
|
+
var initialStep = isDemoMode ? StepEnum.MapColumns : StepEnum.Upload;
|
|
35796
|
+
var _e = useStepNavigation(initialStep, skipHeader, useConsolidatedFlow, isDemoMode), currentStep = _e.currentStep, setStep = _e.setStep, goNext = _e.goNext, goBack = _e.goBack, stepper = _e.stepper;
|
|
35783
35797
|
// Error handling
|
|
35784
35798
|
var _f = useState$1(null), initializationError = _f[0], setInitializationError = _f[1];
|
|
35785
35799
|
var _g = useState$1(null), dataError = _g[0], setDataError = _g[1];
|
|
@@ -35804,6 +35818,29 @@ function Main(props) {
|
|
|
35804
35818
|
var _p = useState$1(false), includeUnmatchedColumns = _p[0], setIncludeUnmatchedColumns = _p[1];
|
|
35805
35819
|
var _q = useState$1(false), filterInvalidRows = _q[0], setFilterInvalidRows = _q[1];
|
|
35806
35820
|
var _r = useState$1(false), disableOnInvalidRows = _r[0], setDisableOnInvalidRows = _r[1];
|
|
35821
|
+
// Initialize demo data if provided
|
|
35822
|
+
useEffect$2(function () {
|
|
35823
|
+
if (isDemoMode && demoData) {
|
|
35824
|
+
// Parse the demo CSV content
|
|
35825
|
+
papaparse_min.parse(demoData.csvContent, {
|
|
35826
|
+
complete: function (results) {
|
|
35827
|
+
var csvData = results.data;
|
|
35828
|
+
var isNotBlankRow = function (row) { return row.some(function (cell) { return cell.toString().trim() !== ""; }); };
|
|
35829
|
+
var rows = csvData.filter(isNotBlankRow).map(function (row, index) { return ({ index: index, values: row }); });
|
|
35830
|
+
setData({
|
|
35831
|
+
fileName: demoData.fileName,
|
|
35832
|
+
rows: rows,
|
|
35833
|
+
sheetList: [],
|
|
35834
|
+
errors: results.errors.map(function (error) { return error.message; }),
|
|
35835
|
+
});
|
|
35836
|
+
// Ensure we're on the correct step after data is loaded
|
|
35837
|
+
if (currentStep === StepEnum.Upload) {
|
|
35838
|
+
setStep(StepEnum.MapColumns);
|
|
35839
|
+
}
|
|
35840
|
+
},
|
|
35841
|
+
});
|
|
35842
|
+
}
|
|
35843
|
+
}, [isDemoMode, demoData]);
|
|
35807
35844
|
// Fetch schema from the backend using importerKey
|
|
35808
35845
|
useEffect$2(function () {
|
|
35809
35846
|
var fetchSchema = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
@@ -36106,7 +36143,7 @@ function Main(props) {
|
|
|
36106
36143
|
setColumnMapping(mapping);
|
|
36107
36144
|
setSelectedHeaderRow(headerRow);
|
|
36108
36145
|
goNext();
|
|
36109
|
-
}, onCancel: function () { return goBack(StepEnum.Upload); }, isSubmitting: isSubmitting, importerKey: importerKey, backendUrl: backendUrl }));
|
|
36146
|
+
}, onCancel: isDemoMode ? undefined : function () { return goBack(StepEnum.Upload); }, isSubmitting: isSubmitting, importerKey: importerKey, backendUrl: backendUrl, isDemoMode: isDemoMode }));
|
|
36110
36147
|
}
|
|
36111
36148
|
case StepEnum.Validation:
|
|
36112
36149
|
return (jsx(Validation, { template: parsedTemplate, data: data, columnMapping: columnMapping, selectedHeaderRow: selectedHeaderRow, onSuccess: handleValidationComplete, onCancel: handleBackToMapColumns, isSubmitting: isSubmitting, backendUrl: backendUrl, importerKey: importerKey, filterInvalidRows: filterInvalidRows, disableOnInvalidRows: disableOnInvalidRows }));
|
|
@@ -37802,9 +37839,9 @@ styleInject(css_248z);
|
|
|
37802
37839
|
|
|
37803
37840
|
var CSVImporter = forwardRef(function (importerProps, forwardRef) {
|
|
37804
37841
|
// Destructure all known props from CSVImporterProps
|
|
37805
|
-
var _a = importerProps.isModal, isModal = _a === void 0 ? true : _a, _b = importerProps.modalIsOpen, modalIsOpen = _b === void 0 ? true : _b, _c = importerProps.modalOnCloseTriggered, modalOnCloseTriggered = _c === void 0 ? function () { return null; } : _c, modalCloseOnOutsideClick = importerProps.modalCloseOnOutsideClick, _d = importerProps.darkMode, darkMode = _d === void 0 ? false : _d, _e = importerProps.primaryColor, primaryColor = _e === void 0 ? "#2563eb" : _e, className = importerProps.className, onComplete = importerProps.onComplete, customStyles = importerProps.customStyles, showDownloadTemplateButton = importerProps.showDownloadTemplateButton, skipHeaderRowSelection = importerProps.skipHeaderRowSelection, language = importerProps.language, customTranslations = importerProps.customTranslations, importerKey = importerProps.importerKey, backendUrl = importerProps.backendUrl, user = importerProps.user, metadata = importerProps.metadata,
|
|
37842
|
+
var _a = importerProps.isModal, isModal = _a === void 0 ? true : _a, _b = importerProps.modalIsOpen, modalIsOpen = _b === void 0 ? true : _b, _c = importerProps.modalOnCloseTriggered, modalOnCloseTriggered = _c === void 0 ? function () { return null; } : _c, modalCloseOnOutsideClick = importerProps.modalCloseOnOutsideClick, _d = importerProps.darkMode, darkMode = _d === void 0 ? false : _d, _e = importerProps.primaryColor, primaryColor = _e === void 0 ? "#2563eb" : _e, className = importerProps.className, onComplete = importerProps.onComplete, customStyles = importerProps.customStyles, showDownloadTemplateButton = importerProps.showDownloadTemplateButton, skipHeaderRowSelection = importerProps.skipHeaderRowSelection, language = importerProps.language, customTranslations = importerProps.customTranslations, importerKey = importerProps.importerKey, backendUrl = importerProps.backendUrl, user = importerProps.user, metadata = importerProps.metadata, demoData = importerProps.demoData,
|
|
37806
37843
|
// Any remaining props will be valid DOM props
|
|
37807
|
-
domProps = __rest$1(importerProps, ["isModal", "modalIsOpen", "modalOnCloseTriggered", "modalCloseOnOutsideClick", "darkMode", "primaryColor", "className", "onComplete", "customStyles", "showDownloadTemplateButton", "skipHeaderRowSelection", "language", "customTranslations", "importerKey", "backendUrl", "user", "metadata"]);
|
|
37844
|
+
domProps = __rest$1(importerProps, ["isModal", "modalIsOpen", "modalOnCloseTriggered", "modalCloseOnOutsideClick", "darkMode", "primaryColor", "className", "onComplete", "customStyles", "showDownloadTemplateButton", "skipHeaderRowSelection", "language", "customTranslations", "importerKey", "backendUrl", "user", "metadata", "demoData"]);
|
|
37808
37845
|
var ref = forwardRef !== null && forwardRef !== void 0 ? forwardRef : useRef$1(null);
|
|
37809
37846
|
var current = ref === null || ref === void 0 ? void 0 : ref.current;
|
|
37810
37847
|
useEffect$2(function () {
|
|
@@ -37845,7 +37882,7 @@ var CSVImporter = forwardRef(function (importerProps, forwardRef) {
|
|
|
37845
37882
|
// domProps should only contain valid DOM attributes
|
|
37846
37883
|
var elementProps = __assign$1(__assign$1(__assign$1({ ref: ref }, (isModal ? { onClick: backdropClick } : {})), { className: domElementClass, "data-theme": darkMode ? "dark" : "light", style: { colorScheme: darkMode ? "dark" : "light" } }), domProps);
|
|
37847
37884
|
// Create a new component that properly passes only the props that Importer needs
|
|
37848
|
-
var ImporterComponent = function () { return (jsx(Providers, __assign$1({ primaryColor: primaryColor }, { children: jsx(Main, { isModal: isModal, modalIsOpen: modalIsOpen, modalOnCloseTriggered: modalOnCloseTriggered, modalCloseOnOutsideClick: modalCloseOnOutsideClick, darkMode: darkMode, primaryColor: primaryColor, className: className, onComplete: onComplete, customStyles: customStyles, showDownloadTemplateButton: showDownloadTemplateButton, skipHeaderRowSelection: skipHeaderRowSelection, language: language, customTranslations: customTranslations, importerKey: importerKey, backendUrl: backendUrl, user: user, metadata: metadata }) }))); };
|
|
37885
|
+
var ImporterComponent = function () { return (jsx(Providers, __assign$1({ primaryColor: primaryColor }, { children: jsx(Main, { isModal: isModal, modalIsOpen: modalIsOpen, modalOnCloseTriggered: modalOnCloseTriggered, modalCloseOnOutsideClick: modalCloseOnOutsideClick, darkMode: darkMode, primaryColor: primaryColor, className: className, onComplete: onComplete, customStyles: customStyles, showDownloadTemplateButton: showDownloadTemplateButton, skipHeaderRowSelection: skipHeaderRowSelection, language: language, customTranslations: customTranslations, importerKey: importerKey, backendUrl: backendUrl, user: user, metadata: metadata, demoData: demoData }) }))); };
|
|
37849
37886
|
return isModal ? (jsx("div", __assign$1({ className: "csvImporter" }, { children: jsx("dialog", __assign$1({}, elementProps, { children: jsx(ImporterComponent, {}) })) }))) : (jsx("div", __assign$1({}, elementProps, { children: jsx(ImporterComponent, {}) })));
|
|
37850
37887
|
});
|
|
37851
37888
|
|