@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.
@@ -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: () => void;
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: () => void;
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;
@@ -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
- var stepper = useStepper(translatedSteps, StepEnum.Upload, skipHeader);
30195
- var _b = useMutableLocalStorage("tf_steps", ""), storageStep = _b[0], setStorageStep = _b[1];
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 _c = useState$1({}), columnMapping = _c[0], setColumnMapping = _c[1];
32181
- var _d = useState$1(null), error = _d[0], setError = _d[1];
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
- var _e = useStepNavigation(StepEnum.Upload, skipHeader, useConsolidatedFlow), currentStep = _e.currentStep, setStep = _e.setStep, goNext = _e.goNext, goBack = _e.goBack, stepper = _e.stepper;
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