@updog/data-editor-wc 0.1.31 → 0.1.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +10 -7
  2. package/index.d.ts +6 -0
  3. package/index.js +112 -104
  4. package/package.json +9 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # @updog/data-editor-wc
1
+ # CSV Importer & Spreadsheet Editor Web Component
2
2
 
3
- Client-side CSV importer and spreadsheet editor SDK, shipped as a Web Component for Vue, Angular, Svelte, and vanilla JS. Your users import files, match columns to your schema, fix errors, and submit clean data. Edits happen inline, in the browser, at 1M+ rows.
3
+ > `@updog/data-editor-wc`: client-side CSV importer and spreadsheet editor SDK, shipped as a Web Component for Vue, Angular, Svelte, and vanilla JS. Your users import files, match columns to your schema, fix errors, and submit clean data. Edits happen inline, in the browser, at 1M+ rows.
4
4
 
5
5
  ## What is @updog/data-editor-wc
6
6
 
@@ -169,13 +169,13 @@ In inline mode, `show()` / `hide()` and the `open` attribute don't apply. The `c
169
169
  | `readonly` | `boolean` | No | `false` | Hide all editing UI. |
170
170
  | `enableDeleteRow` | `"all"` \| `"new"` \| `false` | No | `false` | Row deletion policy. |
171
171
  | `enableAddRow` | `boolean` | No | `true` | Show the "Add row" button. |
172
+ | `enableAddSource` | `boolean` | No | `true` | Show the "Add data source" button. |
172
173
  | `enableCreateColumn` | `boolean` | No | `true` | Allow creating columns for unmatched CSV headers during import. |
173
- | `importFormats` | `DataEditorFormat[]` | No | all | Allowed import formats. `[]` disables import. |
174
- | `exportFormats` | `DataEditorFormat[]` | No | all | Allowed export formats. `[]` disables export. |
174
+ | `importFormats` | `DataEditorFormat[] \| false` | No | all | Allowed import formats. `false` or `[]` disables import. |
175
+ | `exportFormats` | `DataEditorFormat[] \| false` | No | all | Allowed export formats. `false` or `[]` disables export. |
175
176
  | `remoteSources` | `RemoteSource[]` | No | — | Custom import buttons (Google Sheets, S3, etc.) rendered on the upload step. |
176
177
  | `rowHeight` | `number` | No | `34` | Row height in pixels. |
177
178
  | `headerHeight` | `number` | No | `36` | Header height in pixels. |
178
- | `server` | `DataEditorServer` | No | — | Server-delegated mode: SDK renders, your backend handles queries and mutations. |
179
179
  | `chat` | `DataEditorChat` | No | — | Bring-your-own AI chat panel. |
180
180
  | `onColumnMatch` | `(headers, columns) => ...` | No | — | Override import column matching. |
181
181
  | `onValueMatch` | `(valuesToMatch) => ...` | No | — | Override import value matching for `select` columns. |
@@ -236,6 +236,9 @@ editor.columns = [
236
236
  // Sidebar filter control.
237
237
  filter: { type: "select" },
238
238
 
239
+ // Allow pinning this column to the leading edge via the header menu. Default true.
240
+ pinnable: true,
241
+
239
242
  // Lock cells in this column. `"default"` locks only default-source rows.
240
243
  locked: "default",
241
244
  },
@@ -248,7 +251,7 @@ editor.columns = [
248
251
 
249
252
  ## Built-in Validators
250
253
 
251
- Validators are declarative objects passed in the `validators` array on each column. The SDK ships a TS interpreter for the client; Updog Scale ships a matching Go interpreter for server mode. Both runtimes are pinned to the same fixture set, so a column definition produces identical pass/fail results regardless of where it runs.
254
+ Validators are declarative objects passed in the `validators` array on each column. They run on every edit, entirely in the browser.
252
255
 
253
256
  | `type` | Fields | Behavior |
254
257
  |---|---|---|
@@ -291,7 +294,7 @@ A `ValidationError` with `level: "error"` flags the cell in the grid but does **
291
294
 
292
295
  ### Custom validators
293
296
 
294
- For cross-field checks or anything not covered by the built-ins, wrap a `(value, row) => ValidationError | null` function in `{ type: "function", fn }`. Function validators are client-mode only — they're dropped (with a one-time warning) when the SDK serializes the schema for server mode. Use `dependentFields` on the column to trigger re-validation when another column changes.
297
+ For cross-field checks or anything not covered by the built-ins, wrap a `(value, row) => ValidationError | null` function in `{ type: "function", fn }`. Use `dependentFields` on the column to trigger re-validation when another column changes.
295
298
 
296
299
  ```js
297
300
  const endAfterStart = (value, row) => {
package/index.d.ts CHANGED
@@ -130,6 +130,7 @@ declare var export_default = {
130
130
  },
131
131
  footer: {
132
132
  submit: "Submit",
133
+ submitBlockedByErrors: "Fix errors before submitting",
133
134
  import: "Import",
134
135
  next: "Next",
135
136
  cancel: "Cancel",
@@ -1217,6 +1218,11 @@ type DataEditorBaseProps<TRow extends DataEditorRow = DataEditorRow> = {
1217
1218
  * @default true
1218
1219
  */
1219
1220
  enableAddSource?: boolean;
1221
+ /**
1222
+ * Disable submit while any row has a validation error.
1223
+ * @default false
1224
+ */
1225
+ blockSubmitOnError?: boolean;
1220
1226
  /**
1221
1227
  * Which file formats the user can import. `undefined` allows all formats,
1222
1228
  * `false` disables import entirely.
package/index.js CHANGED
@@ -8112,6 +8112,7 @@ var e = Object.create, t = Object.defineProperty, n = Object.getOwnPropertyDescr
8112
8112
  },
8113
8113
  footer: {
8114
8114
  submit: "Submit",
8115
+ submitBlockedByErrors: "Fix errors before submitting",
8115
8116
  import: "Import",
8116
8117
  next: "Next",
8117
8118
  cancel: "Cancel",
@@ -22058,71 +22059,72 @@ function Xd(e, t, n, r) {
22058
22059
  }
22059
22060
  //#endregion
22060
22061
  //#region src/context/useViewModel.tsx
22061
- function Zd({ columns: e, primaryKey: t, loadData: n, scaleClient: r, onComplete: i, variant: a, showUploader: o, setShowUploader: s, storeRef: c, enableDeleteRow: l, enableAddRow: u, enableAddSource: d, importFormats: f, exportFormats: p, rowHeight: m, headerHeight: h, readonly: g, enableCreateColumn: v, onColumnMatch: y, onValueMatch: b, synonyms: x, sampleData: S, chat: C, remoteSources: w, onError: T, errorHandler: E }) {
22062
- let { t: D } = k(), O = r ? "server" : "client", A = Vd(O, r, D("dataEditor.dataSources.existingData"), E ?? new dl(T));
22063
- A.setSchemaColumns(e);
22064
- let { addDynamicColumns: j, removeDynamicColumn: M, updateColumn: N } = Gd(A), P = (0, _.useCallback)((e) => {
22065
- A.setDynamicColumns(e);
22066
- }, [A]), F = (0, _.useSyncExternalStore)(A.subscribe, A.getEffectiveColumns), { navigateToCell: I, navigateByIndex: L, navigateToCellRef: R, resetScrollRef: z, scrollToGridTop: B } = Kd(A), { validator: V, validatorRef: H, findReplace: U } = Xd(A, F, r?.findAndReplace, L), { search: ee, setSearch: te, matchCase: ne, setMatchCase: re, matchEntireCell: ie, setMatchEntireCell: ae, searchMode: oe, setSearchMode: se, filterColumns: ce, setFilterColumns: le, filtersResetKey: ue, resetFilters: de } = Jd(A, U, I, B);
22067
- Wd(A, H, n, O);
22068
- let { onVisibleRangeChange: fe } = Yd(A, O), { portalRef: pe } = qd(), [me, he] = (0, _.useState)(null);
22069
- return (0, _.useEffect)(() => (c && (c.current = A), () => {
22062
+ function Zd({ columns: e, primaryKey: t, loadData: n, scaleClient: r, onComplete: i, variant: a, showUploader: o, setShowUploader: s, storeRef: c, enableDeleteRow: l, enableAddRow: u, enableAddSource: d, blockSubmitOnError: f, importFormats: p, exportFormats: m, rowHeight: h, headerHeight: g, readonly: v, enableCreateColumn: y, onColumnMatch: b, onValueMatch: x, synonyms: S, sampleData: C, chat: w, remoteSources: T, onError: E, errorHandler: D }) {
22063
+ let { t: O } = k(), A = r ? "server" : "client", j = Vd(A, r, O("dataEditor.dataSources.existingData"), D ?? new dl(E));
22064
+ j.setSchemaColumns(e);
22065
+ let { addDynamicColumns: M, removeDynamicColumn: N, updateColumn: P } = Gd(j), F = (0, _.useCallback)((e) => {
22066
+ j.setDynamicColumns(e);
22067
+ }, [j]), I = (0, _.useSyncExternalStore)(j.subscribe, j.getEffectiveColumns), { navigateToCell: L, navigateByIndex: R, navigateToCellRef: z, resetScrollRef: B, scrollToGridTop: V } = Kd(j), { validator: H, validatorRef: U, findReplace: ee } = Xd(j, I, r?.findAndReplace, R), { search: te, setSearch: ne, matchCase: re, setMatchCase: ie, matchEntireCell: ae, setMatchEntireCell: oe, searchMode: se, setSearchMode: ce, filterColumns: le, setFilterColumns: ue, filtersResetKey: de, resetFilters: fe } = Jd(j, ee, L, V);
22068
+ Wd(j, U, n, A);
22069
+ let { onVisibleRangeChange: pe } = Yd(j, A), { portalRef: me } = qd(), [he, ge] = (0, _.useState)(null);
22070
+ return (0, _.useEffect)(() => (c && (c.current = j), () => {
22070
22071
  c && (c.current = null);
22071
- }), [A, c]), (0, _.useEffect)(() => {
22072
- t && A.setPrimaryKey(t);
22073
- }, [A, t]), {
22074
- mode: O,
22072
+ }), [j, c]), (0, _.useEffect)(() => {
22073
+ t && j.setPrimaryKey(t);
22074
+ }, [j, t]), {
22075
+ mode: A,
22075
22076
  scaleClient: r,
22076
- columns: F,
22077
+ columns: I,
22077
22078
  primaryKey: t,
22078
22079
  enableDeleteRow: l ?? !1,
22079
22080
  enableAddRow: u ?? !0,
22080
22081
  enableAddSource: d ?? !0,
22081
- importFormats: f ?? pl,
22082
- exportFormats: p ?? pl,
22083
- rowHeight: m ?? 34,
22084
- headerHeight: h ?? 36,
22085
- store: A,
22086
- validator: V,
22087
- findReplace: U,
22082
+ blockSubmitOnError: f ?? !1,
22083
+ importFormats: p ?? pl,
22084
+ exportFormats: m ?? pl,
22085
+ rowHeight: h ?? 34,
22086
+ headerHeight: g ?? 36,
22087
+ store: j,
22088
+ validator: H,
22089
+ findReplace: ee,
22088
22090
  onComplete: i,
22089
22091
  showUploader: o,
22090
22092
  setShowUploader: s,
22091
22093
  variant: a ?? "editor",
22092
- search: ee,
22093
- setSearch: te,
22094
- matchCase: ne,
22095
- setMatchCase: re,
22096
- matchEntireCell: ie,
22097
- setMatchEntireCell: ae,
22098
- searchMode: oe,
22099
- setSearchMode: se,
22100
- filterColumns: ce,
22101
- setFilterColumns: le,
22102
- navigateToCell: I,
22103
- navigateToCellRef: R,
22104
- resetScrollRef: z,
22105
- scrollToGridTop: B,
22106
- portalRef: pe,
22107
- readonly: g ?? !1,
22108
- filtersResetKey: ue,
22109
- resetFilters: de,
22094
+ search: te,
22095
+ setSearch: ne,
22096
+ matchCase: re,
22097
+ setMatchCase: ie,
22098
+ matchEntireCell: ae,
22099
+ setMatchEntireCell: oe,
22100
+ searchMode: se,
22101
+ setSearchMode: ce,
22102
+ filterColumns: le,
22103
+ setFilterColumns: ue,
22104
+ navigateToCell: L,
22105
+ navigateToCellRef: z,
22106
+ resetScrollRef: B,
22107
+ scrollToGridTop: V,
22108
+ portalRef: me,
22109
+ readonly: v ?? !1,
22110
+ filtersResetKey: de,
22111
+ resetFilters: fe,
22110
22112
  originalColumns: e,
22111
- dynamicColumns: A.getDynamicColumns(),
22112
- setDynamicColumns: P,
22113
- addDynamicColumns: j,
22114
- removeDynamicColumn: M,
22115
- updateColumn: N,
22116
- gridClipboard: me,
22117
- setGridClipboard: he,
22118
- enableCreateColumn: v ?? !0,
22119
- onColumnMatch: y,
22120
- onValueMatch: b,
22121
- synonyms: x,
22122
- sampleData: S,
22123
- onVisibleRangeChange: fe,
22124
- chat: C,
22125
- remoteSources: w ?? []
22113
+ dynamicColumns: j.getDynamicColumns(),
22114
+ setDynamicColumns: F,
22115
+ addDynamicColumns: M,
22116
+ removeDynamicColumn: N,
22117
+ updateColumn: P,
22118
+ gridClipboard: he,
22119
+ setGridClipboard: ge,
22120
+ enableCreateColumn: y ?? !0,
22121
+ onColumnMatch: b,
22122
+ onValueMatch: x,
22123
+ synonyms: S,
22124
+ sampleData: C,
22125
+ onVisibleRangeChange: pe,
22126
+ chat: w,
22127
+ remoteSources: T ?? []
22126
22128
  };
22127
22129
  }
22128
22130
  //#endregion
@@ -25615,74 +25617,74 @@ var qv = ({ open: e, onClose: t, onConfirm: n, loading: r = !1 }) => {
25615
25617
  })
25616
25618
  });
25617
25619
  }, Yv = () => {
25618
- let { store: e, columns: t, onComplete: n, exportFormats: r, readonly: i, navigateToCell: a } = ef(), { t: o, rtl: s } = k(), { canUndo: c, canRedo: l, undo: u, redo: d } = xl(e, a), { dirtyRowCount: f, deletedRowCount: p, isLoading: m, sources: h, phase: g } = fl(e), v = f > 0 || p > 0, y = m || h.some((e) => e.isLoading), b = g === "processing", [x, S] = (0, _.useState)(!1), { value: C, setTrue: w, setFalse: T } = ul(!1), [D, O] = (0, _.useState)(!1), A = (0, _.useCallback)(async () => {
25620
+ let { store: e, columns: t, onComplete: n, exportFormats: r, readonly: i, navigateToCell: a, blockSubmitOnError: o } = ef(), { t: s, rtl: c } = k(), { canUndo: l, canRedo: u, undo: d, redo: f } = xl(e, a), { dirtyRowCount: p, deletedRowCount: m, errorCount: h, isLoading: g, sources: v, phase: y } = fl(e), b = p > 0 || m > 0, x = g || v.some((e) => e.isLoading), S = y === "processing", C = o && h > 0, [w, T] = (0, _.useState)(!1), { value: D, setTrue: O, setFalse: A } = ul(!1), [j, M] = (0, _.useState)(!1), N = (0, _.useCallback)(async () => {
25619
25621
  if (!n) return;
25620
25622
  let t = e.getResultBySource();
25621
- O(!0);
25623
+ M(!0);
25622
25624
  try {
25623
- await n(t), e.clear(), T();
25625
+ await n(t), e.clear(), A();
25624
25626
  } catch {} finally {
25625
- O(!1);
25627
+ M(!1);
25626
25628
  }
25627
25629
  }, [
25628
25630
  e,
25629
25631
  n,
25630
- T
25631
- ]), j = o("dataEditor.footer.export"), M = o("dataEditor.footer.exportAll"), N = o("dataEditor.footer.exportFiltered"), P = o("dataEditor.footer.csvFormat"), F = o("dataEditor.footer.excelFormat"), I = o("dataEditor.footer.jsonFormat"), L = o("dataEditor.footer.tsvFormat"), R = o("dataEditor.footer.xmlFormat"), z = (0, _.useMemo)(() => [
25632
+ A
25633
+ ]), P = s("dataEditor.footer.export"), F = s("dataEditor.footer.exportAll"), I = s("dataEditor.footer.exportFiltered"), L = s("dataEditor.footer.csvFormat"), R = s("dataEditor.footer.excelFormat"), z = s("dataEditor.footer.jsonFormat"), B = s("dataEditor.footer.tsvFormat"), V = s("dataEditor.footer.xmlFormat"), H = (0, _.useMemo)(() => [
25632
25634
  {
25633
25635
  menuId: "csv",
25634
25636
  format: "csv",
25635
- text: P
25637
+ text: L
25636
25638
  },
25637
25639
  {
25638
25640
  menuId: "tsv",
25639
25641
  format: "tsv",
25640
- text: L
25642
+ text: B
25641
25643
  },
25642
25644
  {
25643
25645
  menuId: "excel",
25644
25646
  format: "xlsx",
25645
- text: F
25647
+ text: R
25646
25648
  },
25647
25649
  {
25648
25650
  menuId: "json",
25649
25651
  format: "json",
25650
- text: I
25652
+ text: z
25651
25653
  },
25652
25654
  {
25653
25655
  menuId: "xml",
25654
25656
  format: "xml",
25655
- text: R
25657
+ text: V
25656
25658
  }
25657
25659
  ], [
25658
- P,
25659
25660
  L,
25660
- F,
25661
- I,
25662
- R
25663
- ]), B = r !== !1 && (!e.isServer() || e.hasServerExport), V = (0, _.useMemo)(() => {
25664
- let e = r === !1 ? [] : z.filter((e) => r.includes(e.format));
25661
+ B,
25662
+ R,
25663
+ z,
25664
+ V
25665
+ ]), U = r !== !1 && (!e.isServer() || e.hasServerExport), ee = (0, _.useMemo)(() => {
25666
+ let e = r === !1 ? [] : H.filter((e) => r.includes(e.format));
25665
25667
  return [{
25666
25668
  id: "export-all",
25667
- text: M,
25669
+ text: F,
25668
25670
  options: e.map((e) => ({
25669
25671
  id: `all-${e.menuId}`,
25670
25672
  text: e.text
25671
25673
  }))
25672
25674
  }, {
25673
25675
  id: "export-filtered",
25674
- text: N,
25676
+ text: I,
25675
25677
  options: e.map((e) => ({
25676
25678
  id: `filtered-${e.menuId}`,
25677
25679
  text: e.text
25678
25680
  }))
25679
25681
  }];
25680
25682
  }, [
25681
- M,
25682
- N,
25683
- z,
25683
+ F,
25684
+ I,
25685
+ H,
25684
25686
  r
25685
- ]), H = (0, _.useCallback)((n) => {
25687
+ ]), te = (0, _.useCallback)((n) => {
25686
25688
  let [r, i] = n.split("-"), a = {
25687
25689
  csv: "csv",
25688
25690
  tsv: "tsv",
@@ -25690,70 +25692,75 @@ var qv = ({ open: e, onClose: t, onConfirm: n, loading: r = !1 }) => {
25690
25692
  json: "json",
25691
25693
  xml: "xml"
25692
25694
  };
25693
- S(!0), (e.isServer() ? e.serverExport(a[i], r === "all", s) : Kv({
25695
+ T(!0), (e.isServer() ? e.serverExport(a[i], r === "all", c) : Kv({
25694
25696
  store: e,
25695
25697
  columns: t,
25696
25698
  format: a[i],
25697
25699
  scope: r,
25698
- rtl: s
25699
- })).finally(() => S(!1));
25700
+ rtl: c
25701
+ })).finally(() => T(!1));
25700
25702
  }, [
25701
25703
  e,
25702
25704
  t,
25703
- s
25704
- ]), U = o("dataEditor.footer.submit");
25705
+ c
25706
+ ]), ne = s("dataEditor.footer.submit"), re = !b || S || j || C;
25705
25707
  return /* @__PURE__ */ (0, E.jsxs)(E.Fragment, { children: [/* @__PURE__ */ (0, E.jsxs)("footer", {
25706
25708
  className: "updog__data-editor-footer",
25707
25709
  children: [/* @__PURE__ */ (0, E.jsx)(Jv, {}), /* @__PURE__ */ (0, E.jsxs)("div", {
25708
25710
  className: "updog__data-editor-footer__actions",
25709
25711
  children: [
25710
25712
  !i && /* @__PURE__ */ (0, E.jsxs)(E.Fragment, { children: [/* @__PURE__ */ (0, E.jsx)(Rs, {
25711
- content: o("dataEditor.undoRedo.undo"),
25713
+ content: s("dataEditor.undoRedo.undo"),
25712
25714
  children: /* @__PURE__ */ (0, E.jsx)(at, {
25713
25715
  variant: "ghost",
25714
25716
  color: "neutral",
25715
- disabled: !c || b,
25716
- onClick: u,
25717
- "aria-label": o("dataEditor.undoRedo.undo"),
25717
+ disabled: !l || S,
25718
+ onClick: d,
25719
+ "aria-label": s("dataEditor.undoRedo.undo"),
25718
25720
  children: /* @__PURE__ */ (0, E.jsx)(Be, { className: "rtl-mirror" })
25719
25721
  })
25720
25722
  }), /* @__PURE__ */ (0, E.jsx)(Rs, {
25721
- content: o("dataEditor.undoRedo.redo"),
25723
+ content: s("dataEditor.undoRedo.redo"),
25722
25724
  children: /* @__PURE__ */ (0, E.jsx)(at, {
25723
25725
  variant: "ghost",
25724
25726
  color: "neutral",
25725
- disabled: !l || b,
25726
- onClick: d,
25727
- "aria-label": o("dataEditor.undoRedo.redo"),
25727
+ disabled: !u || S,
25728
+ onClick: f,
25729
+ "aria-label": s("dataEditor.undoRedo.redo"),
25728
25730
  children: /* @__PURE__ */ (0, E.jsx)(ke, { className: "rtl-mirror" })
25729
25731
  })
25730
25732
  })] }),
25731
- B && /* @__PURE__ */ (0, E.jsx)(cc, {
25732
- options: V,
25733
- onSelect: H,
25733
+ U && /* @__PURE__ */ (0, E.jsx)(cc, {
25734
+ options: ee,
25735
+ onSelect: te,
25734
25736
  placement: "top-end",
25735
25737
  children: /* @__PURE__ */ (0, E.jsx)(rt, {
25736
25738
  variant: "outlined",
25737
25739
  color: "neutral",
25738
- loading: x,
25739
- disabled: y || b,
25740
+ loading: w,
25741
+ disabled: x || S,
25740
25742
  spinnerPosition: "end",
25741
25743
  endIcon: /* @__PURE__ */ (0, E.jsx)(ie, {}),
25742
- children: j
25744
+ children: P
25743
25745
  })
25744
25746
  }),
25745
- !i && /* @__PURE__ */ (0, E.jsx)(rt, {
25746
- disabled: !v || b || D,
25747
- onClick: w,
25748
- children: U
25747
+ !i && /* @__PURE__ */ (0, E.jsx)(Rs, {
25748
+ disabled: !C,
25749
+ content: s("dataEditor.footer.submitBlockedByErrors"),
25750
+ placement: "top-end",
25751
+ children: /* @__PURE__ */ (0, E.jsx)(rt, {
25752
+ disabled: re,
25753
+ onClick: O,
25754
+ children: ne
25755
+ })
25749
25756
  })
25750
25757
  ]
25751
25758
  })]
25752
25759
  }), /* @__PURE__ */ (0, E.jsx)(qv, {
25753
- open: C,
25754
- onClose: T,
25755
- onConfirm: A,
25756
- loading: D
25760
+ open: D,
25761
+ onClose: A,
25762
+ onConfirm: N,
25763
+ loading: j
25757
25764
  })] });
25758
25765
  }, Xv = ({ initialValues: e, existingNames: t, onClose: n, onSubmit: r }) => {
25759
25766
  let { t: i } = k(), a = e.id !== void 0, o = (0, _.useMemo)(() => {
@@ -52064,6 +52071,7 @@ function oV(e) {
52064
52071
  enableDeleteRow: e.enableDeleteRow,
52065
52072
  enableAddRow: e.enableAddRow,
52066
52073
  enableAddSource: e.enableAddSource,
52074
+ blockSubmitOnError: e.blockSubmitOnError,
52067
52075
  importFormats: e.importFormats,
52068
52076
  exportFormats: e.exportFormats,
52069
52077
  readonly: e.readonly,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@updog/data-editor-wc",
3
- "version": "0.1.31",
3
+ "version": "0.1.33",
4
4
  "description": "Client-side CSV importer and spreadsheet editor SDK as a Web Component. Drop into Vue, Angular, Svelte, or vanilla JS. Import CSV, Excel, JSON; edit 1M+ rows entirely in the browser.",
5
5
  "author": "Mikhail Kutateladze <admin@updog.tech>",
6
6
  "homepage": "https://updog.tech",
@@ -32,8 +32,11 @@
32
32
  "keywords": [
33
33
  "csv-importer",
34
34
  "csv-import",
35
+ "importer",
35
36
  "data-import",
36
37
  "data-import-sdk",
38
+ "column-mapping",
39
+ "spreadsheet",
37
40
  "spreadsheet-editor",
38
41
  "web-component",
39
42
  "custom-element",
@@ -43,7 +46,11 @@
43
46
  "client-side",
44
47
  "data-editor",
45
48
  "csv",
46
- "xlsx"
49
+ "xlsx",
50
+ "excel",
51
+ "flatfile-alternative",
52
+ "dromo-alternative",
53
+ "usecsv-alternative"
47
54
  ],
48
55
  "publishConfig": {
49
56
  "access": "public",