@vuu-ui/vuu-table 0.8.88 → 0.8.89

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.
@@ -12,7 +12,9 @@ var BulkEditPanel$1 = require('./BulkEditPanel.css.js');
12
12
  const classBase = "vuuBulkEditPanel";
13
13
  const BulkEditPanel = ({
14
14
  className,
15
+ columns,
15
16
  dataSource,
17
+ parentDs,
16
18
  ...htmlAttributes
17
19
  }) => {
18
20
  const targetWindow = window.useWindow();
@@ -30,18 +32,26 @@ const BulkEditPanel = ({
30
32
  type: "VIEW_PORT_RPC_CALL"
31
33
  });
32
34
  };
33
- return /* @__PURE__ */ jsxRuntime.jsx(BulkEditRow.BulkEditRow, { onChange });
34
- }, [dataSource]);
35
+ return /* @__PURE__ */ jsxRuntime.jsx(BulkEditRow.BulkEditRow, { onChange, dataSource: parentDs });
36
+ }, [dataSource, parentDs]);
35
37
  const config = react.useMemo(() => {
36
38
  return {
37
- columns: dataSource.columns.map((name) => ({
39
+ columns: columns ? columns.map((col) => {
40
+ return {
41
+ editable: col.editableBulk === "bulk",
42
+ hidden: col.editableBulk === false,
43
+ name: col.name,
44
+ serverDataType: col.serverDataType ?? "string",
45
+ type: col.name === "date" ? col.type : "string"
46
+ };
47
+ }) : dataSource.columns.map((name) => ({
38
48
  editable: true,
39
49
  name,
40
50
  serverDataType: "string"
41
51
  })),
42
52
  rowSeparators: true
43
53
  };
44
- }, [dataSource]);
54
+ }, [columns, dataSource.columns]);
45
55
  return /* @__PURE__ */ jsxRuntime.jsxs(
46
56
  "div",
47
57
  {
@@ -1 +1 @@
1
- {"version":3,"file":"BulkEditPanel.js","sources":["../../src/bulk-edit/BulkEditPanel.tsx"],"sourcesContent":["import { DataSource, RpcResponse } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRpcViewportRequest } from \"@vuu-ui/vuu-protocol-types\";\nimport type { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { Table } from \"../Table\";\nimport { BulkEditRow, type EditValueChangeHandler } from \"./BulkEditRow\";\n\nimport bulkEditPanelCss from \"./BulkEditPanel.css\";\n\nconst classBase = \"vuuBulkEditPanel\";\n\nexport interface BulkEditPanelProps extends HTMLAttributes<HTMLDivElement> {\n dataSource: DataSource;\n response?: RpcResponse;\n mainTableName?: string;\n}\n\nexport const BulkEditPanel = ({\n className,\n dataSource,\n ...htmlAttributes\n}: BulkEditPanelProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-checkbox-cell\",\n css: bulkEditPanelCss,\n window: targetWindow,\n });\n\n const bulkEditRow = useMemo(() => {\n const onChange: EditValueChangeHandler = (column, value) => {\n dataSource.rpcCall?.({\n namedParams: { column: column.name, value },\n params: [],\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n } as Omit<VuuRpcViewportRequest, \"vpId\">);\n };\n return <BulkEditRow onChange={onChange} />;\n }, [dataSource]);\n\n const config: TableConfig = useMemo(() => {\n return {\n columns: dataSource.columns.map((name) => ({\n editable: true,\n name,\n serverDataType: \"string\",\n })),\n rowSeparators: true,\n };\n }, [dataSource]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n style={{ display: \"flex\", flexDirection: \"column\" }}\n >\n <div className={`${classBase}-toolbar`} />\n <div className={`${classBase}-table`}>\n <Table\n allowDragColumnHeader={false}\n config={config}\n customHeader={bulkEditRow}\n dataSource={dataSource}\n height={400}\n width={600}\n showColumnHeaderMenus={false}\n selectionModel=\"none\"\n />\n </div>\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","bulkEditPanelCss","useMemo","jsx","BulkEditRow","jsxs","Table"],"mappings":";;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,kBAAA,CAAA;AAQX,MAAM,gBAAgB,CAAC;AAAA,EAC5B,SAAA;AAAA,EACA,UAAA;AAAA,EACA,GAAG,cAAA;AACL,CAAuC,KAAA;AACrC,EAAA,MAAM,eAAeA,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAAC,eAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,WAAA,GAAcC,cAAQ,MAAM;AAChC,IAAM,MAAA,QAAA,GAAmC,CAAC,MAAA,EAAQ,KAAU,KAAA;AAC1D,MAAA,UAAA,CAAW,OAAU,GAAA;AAAA,QACnB,WAAa,EAAA,EAAE,MAAQ,EAAA,MAAA,CAAO,MAAM,KAAM,EAAA;AAAA,QAC1C,QAAQ,EAAC;AAAA,QACT,OAAS,EAAA,+BAAA;AAAA,QACT,IAAM,EAAA,oBAAA;AAAA,OACgC,CAAA,CAAA;AAAA,KAC1C,CAAA;AACA,IAAO,uBAAAC,cAAA,CAACC,2BAAY,QAAoB,EAAA,CAAA,CAAA;AAAA,GAC1C,EAAG,CAAC,UAAU,CAAC,CAAA,CAAA;AAEf,EAAM,MAAA,MAAA,GAAsBF,cAAQ,MAAM;AACxC,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,UAAA,CAAW,OAAQ,CAAA,GAAA,CAAI,CAAC,IAAU,MAAA;AAAA,QACzC,QAAU,EAAA,IAAA;AAAA,QACV,IAAA;AAAA,QACA,cAAgB,EAAA,QAAA;AAAA,OAChB,CAAA,CAAA;AAAA,MACF,aAAe,EAAA,IAAA;AAAA,KACjB,CAAA;AAAA,GACF,EAAG,CAAC,UAAU,CAAC,CAAA,CAAA;AAEf,EACE,uBAAAG,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,KAAO,EAAA,EAAE,OAAS,EAAA,MAAA,EAAQ,eAAe,QAAS,EAAA;AAAA,MAElD,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,CAAY,QAAA,CAAA,EAAA,CAAA;AAAA,wBACvCA,cAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,MAAA,CAAA,EAAA,QAAA,kBAAAA,cAAA;AAAA,UAACG,WAAA;AAAA,UAAA;AAAA,YACC,qBAAuB,EAAA,KAAA;AAAA,YACvB,MAAA;AAAA,YACA,YAAc,EAAA,WAAA;AAAA,YACd,UAAA;AAAA,YACA,MAAQ,EAAA,GAAA;AAAA,YACR,KAAO,EAAA,GAAA;AAAA,YACP,qBAAuB,EAAA,KAAA;AAAA,YACvB,cAAe,EAAA,MAAA;AAAA,WAAA;AAAA,SAEnB,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"BulkEditPanel.js","sources":["../../src/bulk-edit/BulkEditPanel.tsx"],"sourcesContent":["import { DataSource, RpcResponse } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRpcViewportRequest } from \"@vuu-ui/vuu-protocol-types\";\nimport type { ColumnDescriptor, TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { Table } from \"../Table\";\nimport { BulkEditRow, type EditValueChangeHandler } from \"./BulkEditRow\";\n\nimport bulkEditPanelCss from \"./BulkEditPanel.css\";\n\nconst classBase = \"vuuBulkEditPanel\";\n\nexport interface BulkEditPanelProps extends HTMLAttributes<HTMLDivElement> {\n columns?: ColumnDescriptor[];\n dataSource: DataSource;\n response?: RpcResponse;\n mainTableName?: string;\n parentDs: DataSource;\n}\n\nexport const BulkEditPanel = ({\n className,\n columns,\n dataSource,\n parentDs,\n ...htmlAttributes\n}: BulkEditPanelProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-checkbox-cell\",\n css: bulkEditPanelCss,\n window: targetWindow,\n });\n\n const bulkEditRow = useMemo(() => {\n const onChange: EditValueChangeHandler = (column, value) => {\n dataSource.rpcCall?.({\n namedParams: { column: column.name, value },\n params: [],\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n } as Omit<VuuRpcViewportRequest, \"vpId\">);\n };\n return <BulkEditRow onChange={onChange} dataSource={parentDs} />;\n }, [dataSource, parentDs]);\n\n const config: TableConfig = useMemo(() => {\n return {\n columns: columns\n ? columns.map((col) => {\n return {\n editable: col.editableBulk === \"bulk\",\n hidden: col.editableBulk === false,\n name: col.name,\n serverDataType: col.serverDataType ?? \"string\",\n type: col.name === \"date\" ? col.type : \"string\",\n };\n })\n : dataSource.columns.map((name) => ({\n editable: true,\n name,\n serverDataType: \"string\",\n })),\n rowSeparators: true,\n };\n }, [columns, dataSource.columns]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n style={{ display: \"flex\", flexDirection: \"column\" }}\n >\n <div className={`${classBase}-toolbar`} />\n <div className={`${classBase}-table`}>\n <Table\n allowDragColumnHeader={false}\n config={config}\n customHeader={bulkEditRow}\n dataSource={dataSource}\n height={400}\n width={600}\n showColumnHeaderMenus={false}\n selectionModel=\"none\"\n />\n </div>\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","bulkEditPanelCss","useMemo","jsx","BulkEditRow","jsxs","Table"],"mappings":"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"}
@@ -16,20 +16,24 @@ const InputProps = {
16
16
  placeholder: "Enter value",
17
17
  variant: "primary"
18
18
  };
19
- const BulkEditRow = ({ onChange, ...htmlAttributes }) => {
19
+ const BulkEditRow = ({
20
+ dataSource,
21
+ onChange,
22
+ ...htmlAttributes
23
+ }) => {
20
24
  const targetWindow = window.useWindow();
21
25
  styles.useComponentCssInjection({
22
26
  testId: "vuu-bulk-edit-row",
23
27
  css: BulkEditRow$1,
24
28
  window: targetWindow
25
29
  });
30
+ const fieldRef = react.useRef("");
26
31
  const { columns, virtualColSpan = 0 } = HeaderProvider.useHeaderProps();
27
32
  const onCommit = react.useCallback(
28
33
  (evt, value) => {
29
34
  if (value !== void 0 && String(value).trim() !== "") {
30
- const field = vuuUtils.queryClosest(evt.target, "[data-field]");
31
- if (field) {
32
- const columnName = field.dataset.field;
35
+ const columnName = fieldRef.current;
36
+ if (columnName) {
33
37
  const column = columns.find((c) => c.name === columnName);
34
38
  if (column) {
35
39
  onChange(column, value);
@@ -39,14 +43,43 @@ const BulkEditRow = ({ onChange, ...htmlAttributes }) => {
39
43
  },
40
44
  [columns, onChange]
41
45
  );
42
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...htmlAttributes, className: classBase, children: [
46
+ const handleFocus = react.useCallback((evt) => {
47
+ const field = vuuUtils.queryClosest(evt.target, "[data-field]");
48
+ if (field) {
49
+ const columnName = field.dataset.field;
50
+ if (columnName) {
51
+ fieldRef.current = columnName;
52
+ }
53
+ }
54
+ }, []);
55
+ const getSuggestions = react.useCallback(
56
+ ([, column, pattern]) => {
57
+ const a = dataSource.getTypeaheadSuggestions(column, pattern);
58
+ console.log(a);
59
+ return a;
60
+ },
61
+ [dataSource]
62
+ );
63
+ const suggestionProvider = react.useMemo(() => {
64
+ if (vuuUtils.isTypeaheadSuggestionProvider(dataSource)) {
65
+ return () => getSuggestions;
66
+ }
67
+ }, [dataSource, getSuggestions]);
68
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...htmlAttributes, className: classBase, onFocus: handleFocus, children: [
43
69
  /* @__PURE__ */ jsxRuntime.jsx(VirtualColSpan.VirtualColSpan, { width: virtualColSpan }),
44
70
  columns.map((column) => /* @__PURE__ */ jsxRuntime.jsx(
45
71
  "div",
46
72
  {
47
73
  className: `${classBase}-filter`,
74
+ "data-field": column.name,
48
75
  style: { width: column.width },
49
- children: vuuDataReact.getDataItemEditControl({ InputProps, column, onCommit })
76
+ children: vuuDataReact.getDataItemEditControl({
77
+ InputProps,
78
+ column,
79
+ onCommit,
80
+ suggestionProvider,
81
+ table: dataSource.table
82
+ })
50
83
  },
51
84
  column.name
52
85
  ))
@@ -1 +1 @@
1
- {"version":3,"file":"BulkEditRow.js","sources":["../../src/bulk-edit/BulkEditRow.tsx"],"sourcesContent":["import { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { CommitHandler, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport { VirtualColSpan } from \"../VirtualColSpan\";\nimport { useHeaderProps } from \"../table-header\";\n\nimport bulkEditRowCss from \"./BulkEditRow.css\";\nimport { InputProps } from \"@salt-ds/core\";\n\nconst classBase = \"vuuBulkEditRow\";\n\nexport type EditValueChangeHandler = (\n column: ColumnDescriptor,\n value: string,\n) => void;\nexport interface BulkEditProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n onChange: EditValueChangeHandler;\n}\n\nconst InputProps: Partial<InputProps> = {\n placeholder: \"Enter value\",\n variant: \"primary\",\n};\n\nexport const BulkEditRow = ({ onChange, ...htmlAttributes }: BulkEditProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-bulk-edit-row\",\n css: bulkEditRowCss,\n window: targetWindow,\n });\n\n const { columns, virtualColSpan = 0 } = useHeaderProps();\n\n const onCommit = useCallback<\n CommitHandler<HTMLInputElement, string | undefined>\n >(\n (evt, value) => {\n if (value !== undefined && String(value).trim() !== \"\") {\n const field = queryClosest(evt.target, \"[data-field]\");\n if (field) {\n const columnName = field.dataset.field;\n const column = columns.find((c) => c.name === columnName);\n if (column) {\n onChange(column, value);\n }\n }\n }\n },\n [columns, onChange],\n );\n\n return (\n <div {...htmlAttributes} className={classBase}>\n <VirtualColSpan width={virtualColSpan} />\n {columns.map((column) => (\n <div\n className={`${classBase}-filter`}\n key={column.name}\n style={{ width: column.width }}\n >\n {getDataItemEditControl({ InputProps, column, onCommit })}\n </div>\n ))}\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","bulkEditRowCss","useHeaderProps","useCallback","queryClosest","jsxs","jsx","VirtualColSpan","getDataItemEditControl"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,gBAAA,CAAA;AAWlB,MAAM,UAAkC,GAAA;AAAA,EACtC,WAAa,EAAA,aAAA;AAAA,EACb,OAAS,EAAA,SAAA;AACX,CAAA,CAAA;AAEO,MAAM,cAAc,CAAC,EAAE,QAAU,EAAA,GAAG,gBAAoC,KAAA;AAC7E,EAAA,MAAM,eAAeA,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAAC,aAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,cAAiB,GAAA,CAAA,KAAMC,6BAAe,EAAA,CAAA;AAEvD,EAAA,MAAM,QAAW,GAAAC,iBAAA;AAAA,IAGf,CAAC,KAAK,KAAU,KAAA;AACd,MAAA,IAAI,UAAU,KAAa,CAAA,IAAA,MAAA,CAAO,KAAK,CAAE,CAAA,IAAA,OAAW,EAAI,EAAA;AACtD,QAAA,MAAM,KAAQ,GAAAC,qBAAA,CAAa,GAAI,CAAA,MAAA,EAAQ,cAAc,CAAA,CAAA;AACrD,QAAA,IAAI,KAAO,EAAA;AACT,UAAM,MAAA,UAAA,GAAa,MAAM,OAAQ,CAAA,KAAA,CAAA;AACjC,UAAA,MAAM,SAAS,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,UAAU,CAAA,CAAA;AACxD,UAAA,IAAI,MAAQ,EAAA;AACV,YAAA,QAAA,CAAS,QAAQ,KAAK,CAAA,CAAA;AAAA,WACxB;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,SAAS,QAAQ,CAAA;AAAA,GACpB,CAAA;AAEA,EAAA,uBACGC,eAAA,CAAA,KAAA,EAAA,EAAK,GAAG,cAAA,EAAgB,WAAW,SAClC,EAAA,QAAA,EAAA;AAAA,oBAACC,cAAA,CAAAC,6BAAA,EAAA,EAAe,OAAO,cAAgB,EAAA,CAAA;AAAA,IACtC,OAAA,CAAQ,GAAI,CAAA,CAAC,MACZ,qBAAAD,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAG,SAAS,CAAA,OAAA,CAAA;AAAA,QAEvB,KAAO,EAAA,EAAE,KAAO,EAAA,MAAA,CAAO,KAAM,EAAA;AAAA,QAE5B,QAAuB,EAAAE,mCAAA,CAAA,EAAE,UAAY,EAAA,MAAA,EAAQ,UAAU,CAAA;AAAA,OAAA;AAAA,MAHnD,MAAO,CAAA,IAAA;AAAA,KAKf,CAAA;AAAA,GACH,EAAA,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"BulkEditRow.js","sources":["../../src/bulk-edit/BulkEditRow.tsx"],"sourcesContent":["import { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport {\n DataSource,\n SuggestionFetcher,\n TypeaheadSuggestionProvider,\n} from \"@vuu-ui/vuu-data-types\";\nimport { TypeaheadParams } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n CommitHandler,\n isTypeaheadSuggestionProvider,\n queryClosest,\n} from \"@vuu-ui/vuu-utils\";\nimport { InputProps } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, useCallback, useMemo, useRef } from \"react\";\nimport { VirtualColSpan } from \"../VirtualColSpan\";\nimport { useHeaderProps } from \"../table-header\";\nimport bulkEditRowCss from \"./BulkEditRow.css\";\n\nconst classBase = \"vuuBulkEditRow\";\n\nexport type EditValueChangeHandler = (\n column: ColumnDescriptor,\n value: string,\n) => void;\nexport interface BulkEditProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n dataSource: DataSource;\n onChange: EditValueChangeHandler;\n}\n\nconst InputProps: Partial<InputProps> = {\n placeholder: \"Enter value\",\n variant: \"primary\",\n};\n\nexport const BulkEditRow = ({\n dataSource,\n onChange,\n ...htmlAttributes\n}: BulkEditProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-bulk-edit-row\",\n css: bulkEditRowCss,\n window: targetWindow,\n });\n\n const fieldRef = useRef(\"\");\n\n const { columns, virtualColSpan = 0 } = useHeaderProps();\n\n const onCommit = useCallback<\n CommitHandler<HTMLInputElement, string | undefined>\n >(\n (evt, value) => {\n if (value !== undefined && String(value).trim() !== \"\") {\n const columnName = fieldRef.current;\n if (columnName) {\n const column = columns.find((c) => c.name === columnName);\n if (column) {\n onChange(column, value);\n }\n }\n }\n },\n [columns, onChange],\n );\n\n const handleFocus = useCallback((evt) => {\n const field = queryClosest(evt.target, \"[data-field]\");\n if (field) {\n const columnName = field.dataset.field;\n if (columnName) {\n fieldRef.current = columnName;\n }\n }\n }, []);\n\n const getSuggestions = useCallback<SuggestionFetcher>(\n ([, column, pattern]: TypeaheadParams) => {\n const a = (\n dataSource as TypeaheadSuggestionProvider\n ).getTypeaheadSuggestions(column, pattern);\n console.log(a);\n return a;\n },\n [dataSource],\n );\n\n const suggestionProvider = useMemo(() => {\n if (isTypeaheadSuggestionProvider(dataSource)) {\n return () => getSuggestions;\n }\n }, [dataSource, getSuggestions]);\n\n return (\n <div {...htmlAttributes} className={classBase} onFocus={handleFocus}>\n <VirtualColSpan width={virtualColSpan} />\n {columns.map((column) => (\n <div\n className={`${classBase}-filter`}\n data-field={column.name}\n key={column.name}\n style={{ width: column.width }}\n >\n {getDataItemEditControl({\n InputProps,\n column,\n onCommit,\n suggestionProvider,\n table: dataSource.table,\n })}\n </div>\n ))}\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","bulkEditRowCss","useRef","useHeaderProps","useCallback","queryClosest","useMemo","isTypeaheadSuggestionProvider","jsx","VirtualColSpan","getDataItemEditControl"],"mappings":"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"}
@@ -27,6 +27,7 @@ const useTableContextMenu = ({
27
27
  showContextMenu(evt, "grid", {
28
28
  columnMap,
29
29
  columnName,
30
+ columns,
30
31
  row,
31
32
  selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),
32
33
  viewport: dataSource.viewport
@@ -1 +1 @@
1
- {"version":3,"file":"useTableContextMenu.js","sources":["../src/useTableContextMenu.ts"],"sourcesContent":["import { DataSource, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { buildColumnMap, getIndexFromRowElement } from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nexport interface TableContextMenuHookProps {\n columns: RuntimeColumnDescriptor[];\n data: DataSourceRow[];\n dataSource: DataSource;\n getSelectedRows: () => DataSourceRow[];\n}\n\nconst NO_ROWS = [] as const;\n\nexport const useTableContextMenu = ({\n columns,\n data,\n dataSource,\n getSelectedRows,\n}: TableContextMenuHookProps) => {\n const [showContextMenu] = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest(\"div[role='cell']\");\n const rowEl = target?.closest(\"div[role='row']\") as HTMLElement;\n if (cellEl && rowEl) {\n const { selectedRowsCount } = dataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = getIndexFromRowElement(rowEl);\n const cellIndex = Array.from(rowEl.childNodes).indexOf(cellEl);\n const row = data.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\n // TODO does it really make sense to collect selected rows ?\n // We only have access to rows in local cache\n showContextMenu(evt, \"grid\", {\n columnMap,\n columnName,\n row,\n selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),\n viewport: dataSource.viewport,\n });\n }\n },\n [columns, data, dataSource, getSelectedRows, showContextMenu],\n );\n\n return onContextMenu;\n};\n"],"names":["usePopupContextMenu","useCallback","buildColumnMap","getIndexFromRowElement"],"mappings":";;;;;;AAaA,MAAM,UAAU,EAAC,CAAA;AAEV,MAAM,sBAAsB,CAAC;AAAA,EAClC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AACF,CAAiC,KAAA;AAC/B,EAAM,MAAA,CAAC,eAAe,CAAA,GAAIA,wBAAoB,EAAA,CAAA;AAE9C,EAAA,MAAM,aAAgB,GAAAC,iBAAA;AAAA,IACpB,CAAC,GAAiC,KAAA;AAChC,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AACnB,MAAM,MAAA,MAAA,GAAS,MAAQ,EAAA,OAAA,CAAQ,kBAAkB,CAAA,CAAA;AACjD,MAAM,MAAA,KAAA,GAAQ,MAAQ,EAAA,OAAA,CAAQ,iBAAiB,CAAA,CAAA;AAC/C,MAAA,IAAI,UAAU,KAAO,EAAA;AACnB,QAAM,MAAA,EAAE,mBAAsB,GAAA,UAAA,CAAA;AAC9B,QAAM,MAAA,SAAA,GAAYC,wBAAe,OAAO,CAAA,CAAA;AACxC,QAAM,MAAA,QAAA,GAAWC,gCAAuB,KAAK,CAAA,CAAA;AAC7C,QAAA,MAAM,YAAY,KAAM,CAAA,IAAA,CAAK,MAAM,UAAU,CAAA,CAAE,QAAQ,MAAM,CAAA,CAAA;AAC7D,QAAM,MAAA,GAAA,GAAM,KAAK,IAAK,CAAA,CAAC,CAAC,GAAG,CAAA,KAAM,QAAQ,QAAQ,CAAA,CAAA;AACjD,QAAM,MAAA,UAAA,GAAa,QAAQ,SAAS,CAAA,CAAA;AAGpC,QAAA,eAAA,CAAgB,KAAK,MAAQ,EAAA;AAAA,UAC3B,SAAA;AAAA,UACA,UAAA;AAAA,UACA,GAAA;AAAA,UACA,YAAc,EAAA,iBAAA,KAAsB,CAAI,GAAA,OAAA,GAAU,eAAgB,EAAA;AAAA,UAClE,UAAU,UAAW,CAAA,QAAA;AAAA,SACtB,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,IACA,CAAC,OAAA,EAAS,IAAM,EAAA,UAAA,EAAY,iBAAiB,eAAe,CAAA;AAAA,GAC9D,CAAA;AAEA,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useTableContextMenu.js","sources":["../src/useTableContextMenu.ts"],"sourcesContent":["import { DataSource, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { buildColumnMap, getIndexFromRowElement } from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nexport interface TableContextMenuHookProps {\n columns: RuntimeColumnDescriptor[];\n data: DataSourceRow[];\n dataSource: DataSource;\n getSelectedRows: () => DataSourceRow[];\n}\n\nconst NO_ROWS = [] as const;\n\nexport const useTableContextMenu = ({\n columns,\n data,\n dataSource,\n getSelectedRows,\n}: TableContextMenuHookProps) => {\n const [showContextMenu] = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest(\"div[role='cell']\");\n const rowEl = target?.closest(\"div[role='row']\") as HTMLElement;\n if (cellEl && rowEl) {\n const { selectedRowsCount } = dataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = getIndexFromRowElement(rowEl);\n const cellIndex = Array.from(rowEl.childNodes).indexOf(cellEl);\n const row = data.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\n // TODO does it really make sense to collect selected rows ?\n // We only have access to rows in local cache\n showContextMenu(evt, \"grid\", {\n columnMap,\n columnName,\n columns,\n row,\n selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),\n viewport: dataSource.viewport,\n });\n }\n },\n [columns, data, dataSource, getSelectedRows, showContextMenu],\n );\n\n return onContextMenu;\n};\n"],"names":["usePopupContextMenu","useCallback","buildColumnMap","getIndexFromRowElement"],"mappings":";;;;;;AAaA,MAAM,UAAU,EAAC,CAAA;AAEV,MAAM,sBAAsB,CAAC;AAAA,EAClC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AACF,CAAiC,KAAA;AAC/B,EAAM,MAAA,CAAC,eAAe,CAAA,GAAIA,wBAAoB,EAAA,CAAA;AAE9C,EAAA,MAAM,aAAgB,GAAAC,iBAAA;AAAA,IACpB,CAAC,GAAiC,KAAA;AAChC,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AACnB,MAAM,MAAA,MAAA,GAAS,MAAQ,EAAA,OAAA,CAAQ,kBAAkB,CAAA,CAAA;AACjD,MAAM,MAAA,KAAA,GAAQ,MAAQ,EAAA,OAAA,CAAQ,iBAAiB,CAAA,CAAA;AAC/C,MAAA,IAAI,UAAU,KAAO,EAAA;AACnB,QAAM,MAAA,EAAE,mBAAsB,GAAA,UAAA,CAAA;AAC9B,QAAM,MAAA,SAAA,GAAYC,wBAAe,OAAO,CAAA,CAAA;AACxC,QAAM,MAAA,QAAA,GAAWC,gCAAuB,KAAK,CAAA,CAAA;AAC7C,QAAA,MAAM,YAAY,KAAM,CAAA,IAAA,CAAK,MAAM,UAAU,CAAA,CAAE,QAAQ,MAAM,CAAA,CAAA;AAC7D,QAAM,MAAA,GAAA,GAAM,KAAK,IAAK,CAAA,CAAC,CAAC,GAAG,CAAA,KAAM,QAAQ,QAAQ,CAAA,CAAA;AACjD,QAAM,MAAA,UAAA,GAAa,QAAQ,SAAS,CAAA,CAAA;AAGpC,QAAA,eAAA,CAAgB,KAAK,MAAQ,EAAA;AAAA,UAC3B,SAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAA;AAAA,UACA,GAAA;AAAA,UACA,YAAc,EAAA,iBAAA,KAAsB,CAAI,GAAA,OAAA,GAAU,eAAgB,EAAA;AAAA,UAClE,UAAU,UAAW,CAAA,QAAA;AAAA,SACtB,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,IACA,CAAC,OAAA,EAAS,IAAM,EAAA,UAAA,EAAY,iBAAiB,eAAe,CAAA;AAAA,GAC9D,CAAA;AAEA,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
@@ -10,7 +10,9 @@ import bulkEditPanelCss from './BulkEditPanel.css.js';
10
10
  const classBase = "vuuBulkEditPanel";
11
11
  const BulkEditPanel = ({
12
12
  className,
13
+ columns,
13
14
  dataSource,
15
+ parentDs,
14
16
  ...htmlAttributes
15
17
  }) => {
16
18
  const targetWindow = useWindow();
@@ -28,18 +30,26 @@ const BulkEditPanel = ({
28
30
  type: "VIEW_PORT_RPC_CALL"
29
31
  });
30
32
  };
31
- return /* @__PURE__ */ jsx(BulkEditRow, { onChange });
32
- }, [dataSource]);
33
+ return /* @__PURE__ */ jsx(BulkEditRow, { onChange, dataSource: parentDs });
34
+ }, [dataSource, parentDs]);
33
35
  const config = useMemo(() => {
34
36
  return {
35
- columns: dataSource.columns.map((name) => ({
37
+ columns: columns ? columns.map((col) => {
38
+ return {
39
+ editable: col.editableBulk === "bulk",
40
+ hidden: col.editableBulk === false,
41
+ name: col.name,
42
+ serverDataType: col.serverDataType ?? "string",
43
+ type: col.name === "date" ? col.type : "string"
44
+ };
45
+ }) : dataSource.columns.map((name) => ({
36
46
  editable: true,
37
47
  name,
38
48
  serverDataType: "string"
39
49
  })),
40
50
  rowSeparators: true
41
51
  };
42
- }, [dataSource]);
52
+ }, [columns, dataSource.columns]);
43
53
  return /* @__PURE__ */ jsxs(
44
54
  "div",
45
55
  {
@@ -1 +1 @@
1
- {"version":3,"file":"BulkEditPanel.js","sources":["../../src/bulk-edit/BulkEditPanel.tsx"],"sourcesContent":["import { DataSource, RpcResponse } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRpcViewportRequest } from \"@vuu-ui/vuu-protocol-types\";\nimport type { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { Table } from \"../Table\";\nimport { BulkEditRow, type EditValueChangeHandler } from \"./BulkEditRow\";\n\nimport bulkEditPanelCss from \"./BulkEditPanel.css\";\n\nconst classBase = \"vuuBulkEditPanel\";\n\nexport interface BulkEditPanelProps extends HTMLAttributes<HTMLDivElement> {\n dataSource: DataSource;\n response?: RpcResponse;\n mainTableName?: string;\n}\n\nexport const BulkEditPanel = ({\n className,\n dataSource,\n ...htmlAttributes\n}: BulkEditPanelProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-checkbox-cell\",\n css: bulkEditPanelCss,\n window: targetWindow,\n });\n\n const bulkEditRow = useMemo(() => {\n const onChange: EditValueChangeHandler = (column, value) => {\n dataSource.rpcCall?.({\n namedParams: { column: column.name, value },\n params: [],\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n } as Omit<VuuRpcViewportRequest, \"vpId\">);\n };\n return <BulkEditRow onChange={onChange} />;\n }, [dataSource]);\n\n const config: TableConfig = useMemo(() => {\n return {\n columns: dataSource.columns.map((name) => ({\n editable: true,\n name,\n serverDataType: \"string\",\n })),\n rowSeparators: true,\n };\n }, [dataSource]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n style={{ display: \"flex\", flexDirection: \"column\" }}\n >\n <div className={`${classBase}-toolbar`} />\n <div className={`${classBase}-table`}>\n <Table\n allowDragColumnHeader={false}\n config={config}\n customHeader={bulkEditRow}\n dataSource={dataSource}\n height={400}\n width={600}\n showColumnHeaderMenus={false}\n selectionModel=\"none\"\n />\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAYA,MAAM,SAAY,GAAA,kBAAA,CAAA;AAQX,MAAM,gBAAgB,CAAC;AAAA,EAC5B,SAAA;AAAA,EACA,UAAA;AAAA,EACA,GAAG,cAAA;AACL,CAAuC,KAAA;AACrC,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAA,gBAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAM,MAAA,QAAA,GAAmC,CAAC,MAAA,EAAQ,KAAU,KAAA;AAC1D,MAAA,UAAA,CAAW,OAAU,GAAA;AAAA,QACnB,WAAa,EAAA,EAAE,MAAQ,EAAA,MAAA,CAAO,MAAM,KAAM,EAAA;AAAA,QAC1C,QAAQ,EAAC;AAAA,QACT,OAAS,EAAA,+BAAA;AAAA,QACT,IAAM,EAAA,oBAAA;AAAA,OACgC,CAAA,CAAA;AAAA,KAC1C,CAAA;AACA,IAAO,uBAAA,GAAA,CAAC,eAAY,QAAoB,EAAA,CAAA,CAAA;AAAA,GAC1C,EAAG,CAAC,UAAU,CAAC,CAAA,CAAA;AAEf,EAAM,MAAA,MAAA,GAAsB,QAAQ,MAAM;AACxC,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,UAAA,CAAW,OAAQ,CAAA,GAAA,CAAI,CAAC,IAAU,MAAA;AAAA,QACzC,QAAU,EAAA,IAAA;AAAA,QACV,IAAA;AAAA,QACA,cAAgB,EAAA,QAAA;AAAA,OAChB,CAAA,CAAA;AAAA,MACF,aAAe,EAAA,IAAA;AAAA,KACjB,CAAA;AAAA,GACF,EAAG,CAAC,UAAU,CAAC,CAAA,CAAA;AAEf,EACE,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,KAAO,EAAA,EAAE,OAAS,EAAA,MAAA,EAAQ,eAAe,QAAS,EAAA;AAAA,MAElD,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,CAAY,QAAA,CAAA,EAAA,CAAA;AAAA,wBACvC,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,MAAA,CAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,qBAAuB,EAAA,KAAA;AAAA,YACvB,MAAA;AAAA,YACA,YAAc,EAAA,WAAA;AAAA,YACd,UAAA;AAAA,YACA,MAAQ,EAAA,GAAA;AAAA,YACR,KAAO,EAAA,GAAA;AAAA,YACP,qBAAuB,EAAA,KAAA;AAAA,YACvB,cAAe,EAAA,MAAA;AAAA,WAAA;AAAA,SAEnB,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"BulkEditPanel.js","sources":["../../src/bulk-edit/BulkEditPanel.tsx"],"sourcesContent":["import { DataSource, RpcResponse } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRpcViewportRequest } from \"@vuu-ui/vuu-protocol-types\";\nimport type { ColumnDescriptor, TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { Table } from \"../Table\";\nimport { BulkEditRow, type EditValueChangeHandler } from \"./BulkEditRow\";\n\nimport bulkEditPanelCss from \"./BulkEditPanel.css\";\n\nconst classBase = \"vuuBulkEditPanel\";\n\nexport interface BulkEditPanelProps extends HTMLAttributes<HTMLDivElement> {\n columns?: ColumnDescriptor[];\n dataSource: DataSource;\n response?: RpcResponse;\n mainTableName?: string;\n parentDs: DataSource;\n}\n\nexport const BulkEditPanel = ({\n className,\n columns,\n dataSource,\n parentDs,\n ...htmlAttributes\n}: BulkEditPanelProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-checkbox-cell\",\n css: bulkEditPanelCss,\n window: targetWindow,\n });\n\n const bulkEditRow = useMemo(() => {\n const onChange: EditValueChangeHandler = (column, value) => {\n dataSource.rpcCall?.({\n namedParams: { column: column.name, value },\n params: [],\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n } as Omit<VuuRpcViewportRequest, \"vpId\">);\n };\n return <BulkEditRow onChange={onChange} dataSource={parentDs} />;\n }, [dataSource, parentDs]);\n\n const config: TableConfig = useMemo(() => {\n return {\n columns: columns\n ? columns.map((col) => {\n return {\n editable: col.editableBulk === \"bulk\",\n hidden: col.editableBulk === false,\n name: col.name,\n serverDataType: col.serverDataType ?? \"string\",\n type: col.name === \"date\" ? col.type : \"string\",\n };\n })\n : dataSource.columns.map((name) => ({\n editable: true,\n name,\n serverDataType: \"string\",\n })),\n rowSeparators: true,\n };\n }, [columns, dataSource.columns]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n style={{ display: \"flex\", flexDirection: \"column\" }}\n >\n <div className={`${classBase}-toolbar`} />\n <div className={`${classBase}-table`}>\n <Table\n allowDragColumnHeader={false}\n config={config}\n customHeader={bulkEditRow}\n dataSource={dataSource}\n height={400}\n width={600}\n showColumnHeaderMenus={false}\n selectionModel=\"none\"\n />\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { getDataItemEditControl } from '@vuu-ui/vuu-data-react';
3
- import { queryClosest } from '@vuu-ui/vuu-utils';
3
+ import { queryClosest, isTypeaheadSuggestionProvider } from '@vuu-ui/vuu-utils';
4
4
  import { useComponentCssInjection } from '@salt-ds/styles';
5
5
  import { useWindow } from '@salt-ds/window';
6
- import { useCallback } from 'react';
6
+ import { useRef, useCallback, useMemo } from 'react';
7
7
  import { VirtualColSpan } from '../VirtualColSpan.js';
8
8
  import { useHeaderProps } from '../table-header/HeaderProvider.js';
9
9
  import '../table-header/TableHeader.js';
@@ -14,20 +14,24 @@ const InputProps = {
14
14
  placeholder: "Enter value",
15
15
  variant: "primary"
16
16
  };
17
- const BulkEditRow = ({ onChange, ...htmlAttributes }) => {
17
+ const BulkEditRow = ({
18
+ dataSource,
19
+ onChange,
20
+ ...htmlAttributes
21
+ }) => {
18
22
  const targetWindow = useWindow();
19
23
  useComponentCssInjection({
20
24
  testId: "vuu-bulk-edit-row",
21
25
  css: bulkEditRowCss,
22
26
  window: targetWindow
23
27
  });
28
+ const fieldRef = useRef("");
24
29
  const { columns, virtualColSpan = 0 } = useHeaderProps();
25
30
  const onCommit = useCallback(
26
31
  (evt, value) => {
27
32
  if (value !== void 0 && String(value).trim() !== "") {
28
- const field = queryClosest(evt.target, "[data-field]");
29
- if (field) {
30
- const columnName = field.dataset.field;
33
+ const columnName = fieldRef.current;
34
+ if (columnName) {
31
35
  const column = columns.find((c) => c.name === columnName);
32
36
  if (column) {
33
37
  onChange(column, value);
@@ -37,14 +41,43 @@ const BulkEditRow = ({ onChange, ...htmlAttributes }) => {
37
41
  },
38
42
  [columns, onChange]
39
43
  );
40
- return /* @__PURE__ */ jsxs("div", { ...htmlAttributes, className: classBase, children: [
44
+ const handleFocus = useCallback((evt) => {
45
+ const field = queryClosest(evt.target, "[data-field]");
46
+ if (field) {
47
+ const columnName = field.dataset.field;
48
+ if (columnName) {
49
+ fieldRef.current = columnName;
50
+ }
51
+ }
52
+ }, []);
53
+ const getSuggestions = useCallback(
54
+ ([, column, pattern]) => {
55
+ const a = dataSource.getTypeaheadSuggestions(column, pattern);
56
+ console.log(a);
57
+ return a;
58
+ },
59
+ [dataSource]
60
+ );
61
+ const suggestionProvider = useMemo(() => {
62
+ if (isTypeaheadSuggestionProvider(dataSource)) {
63
+ return () => getSuggestions;
64
+ }
65
+ }, [dataSource, getSuggestions]);
66
+ return /* @__PURE__ */ jsxs("div", { ...htmlAttributes, className: classBase, onFocus: handleFocus, children: [
41
67
  /* @__PURE__ */ jsx(VirtualColSpan, { width: virtualColSpan }),
42
68
  columns.map((column) => /* @__PURE__ */ jsx(
43
69
  "div",
44
70
  {
45
71
  className: `${classBase}-filter`,
72
+ "data-field": column.name,
46
73
  style: { width: column.width },
47
- children: getDataItemEditControl({ InputProps, column, onCommit })
74
+ children: getDataItemEditControl({
75
+ InputProps,
76
+ column,
77
+ onCommit,
78
+ suggestionProvider,
79
+ table: dataSource.table
80
+ })
48
81
  },
49
82
  column.name
50
83
  ))
@@ -1 +1 @@
1
- {"version":3,"file":"BulkEditRow.js","sources":["../../src/bulk-edit/BulkEditRow.tsx"],"sourcesContent":["import { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { CommitHandler, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport { VirtualColSpan } from \"../VirtualColSpan\";\nimport { useHeaderProps } from \"../table-header\";\n\nimport bulkEditRowCss from \"./BulkEditRow.css\";\nimport { InputProps } from \"@salt-ds/core\";\n\nconst classBase = \"vuuBulkEditRow\";\n\nexport type EditValueChangeHandler = (\n column: ColumnDescriptor,\n value: string,\n) => void;\nexport interface BulkEditProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n onChange: EditValueChangeHandler;\n}\n\nconst InputProps: Partial<InputProps> = {\n placeholder: \"Enter value\",\n variant: \"primary\",\n};\n\nexport const BulkEditRow = ({ onChange, ...htmlAttributes }: BulkEditProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-bulk-edit-row\",\n css: bulkEditRowCss,\n window: targetWindow,\n });\n\n const { columns, virtualColSpan = 0 } = useHeaderProps();\n\n const onCommit = useCallback<\n CommitHandler<HTMLInputElement, string | undefined>\n >(\n (evt, value) => {\n if (value !== undefined && String(value).trim() !== \"\") {\n const field = queryClosest(evt.target, \"[data-field]\");\n if (field) {\n const columnName = field.dataset.field;\n const column = columns.find((c) => c.name === columnName);\n if (column) {\n onChange(column, value);\n }\n }\n }\n },\n [columns, onChange],\n );\n\n return (\n <div {...htmlAttributes} className={classBase}>\n <VirtualColSpan width={virtualColSpan} />\n {columns.map((column) => (\n <div\n className={`${classBase}-filter`}\n key={column.name}\n style={{ width: column.width }}\n >\n {getDataItemEditControl({ InputProps, column, onCommit })}\n </div>\n ))}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,gBAAA,CAAA;AAWlB,MAAM,UAAkC,GAAA;AAAA,EACtC,WAAa,EAAA,aAAA;AAAA,EACb,OAAS,EAAA,SAAA;AACX,CAAA,CAAA;AAEO,MAAM,cAAc,CAAC,EAAE,QAAU,EAAA,GAAG,gBAAoC,KAAA;AAC7E,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAA,cAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,cAAiB,GAAA,CAAA,KAAM,cAAe,EAAA,CAAA;AAEvD,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IAGf,CAAC,KAAK,KAAU,KAAA;AACd,MAAA,IAAI,UAAU,KAAa,CAAA,IAAA,MAAA,CAAO,KAAK,CAAE,CAAA,IAAA,OAAW,EAAI,EAAA;AACtD,QAAA,MAAM,KAAQ,GAAA,YAAA,CAAa,GAAI,CAAA,MAAA,EAAQ,cAAc,CAAA,CAAA;AACrD,QAAA,IAAI,KAAO,EAAA;AACT,UAAM,MAAA,UAAA,GAAa,MAAM,OAAQ,CAAA,KAAA,CAAA;AACjC,UAAA,MAAM,SAAS,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,UAAU,CAAA,CAAA;AACxD,UAAA,IAAI,MAAQ,EAAA;AACV,YAAA,QAAA,CAAS,QAAQ,KAAK,CAAA,CAAA;AAAA,WACxB;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,SAAS,QAAQ,CAAA;AAAA,GACpB,CAAA;AAEA,EAAA,uBACG,IAAA,CAAA,KAAA,EAAA,EAAK,GAAG,cAAA,EAAgB,WAAW,SAClC,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,cAAA,EAAA,EAAe,OAAO,cAAgB,EAAA,CAAA;AAAA,IACtC,OAAA,CAAQ,GAAI,CAAA,CAAC,MACZ,qBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAG,SAAS,CAAA,OAAA,CAAA;AAAA,QAEvB,KAAO,EAAA,EAAE,KAAO,EAAA,MAAA,CAAO,KAAM,EAAA;AAAA,QAE5B,QAAuB,EAAA,sBAAA,CAAA,EAAE,UAAY,EAAA,MAAA,EAAQ,UAAU,CAAA;AAAA,OAAA;AAAA,MAHnD,MAAO,CAAA,IAAA;AAAA,KAKf,CAAA;AAAA,GACH,EAAA,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"BulkEditRow.js","sources":["../../src/bulk-edit/BulkEditRow.tsx"],"sourcesContent":["import { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport {\n DataSource,\n SuggestionFetcher,\n TypeaheadSuggestionProvider,\n} from \"@vuu-ui/vuu-data-types\";\nimport { TypeaheadParams } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n CommitHandler,\n isTypeaheadSuggestionProvider,\n queryClosest,\n} from \"@vuu-ui/vuu-utils\";\nimport { InputProps } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, useCallback, useMemo, useRef } from \"react\";\nimport { VirtualColSpan } from \"../VirtualColSpan\";\nimport { useHeaderProps } from \"../table-header\";\nimport bulkEditRowCss from \"./BulkEditRow.css\";\n\nconst classBase = \"vuuBulkEditRow\";\n\nexport type EditValueChangeHandler = (\n column: ColumnDescriptor,\n value: string,\n) => void;\nexport interface BulkEditProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n dataSource: DataSource;\n onChange: EditValueChangeHandler;\n}\n\nconst InputProps: Partial<InputProps> = {\n placeholder: \"Enter value\",\n variant: \"primary\",\n};\n\nexport const BulkEditRow = ({\n dataSource,\n onChange,\n ...htmlAttributes\n}: BulkEditProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-bulk-edit-row\",\n css: bulkEditRowCss,\n window: targetWindow,\n });\n\n const fieldRef = useRef(\"\");\n\n const { columns, virtualColSpan = 0 } = useHeaderProps();\n\n const onCommit = useCallback<\n CommitHandler<HTMLInputElement, string | undefined>\n >(\n (evt, value) => {\n if (value !== undefined && String(value).trim() !== \"\") {\n const columnName = fieldRef.current;\n if (columnName) {\n const column = columns.find((c) => c.name === columnName);\n if (column) {\n onChange(column, value);\n }\n }\n }\n },\n [columns, onChange],\n );\n\n const handleFocus = useCallback((evt) => {\n const field = queryClosest(evt.target, \"[data-field]\");\n if (field) {\n const columnName = field.dataset.field;\n if (columnName) {\n fieldRef.current = columnName;\n }\n }\n }, []);\n\n const getSuggestions = useCallback<SuggestionFetcher>(\n ([, column, pattern]: TypeaheadParams) => {\n const a = (\n dataSource as TypeaheadSuggestionProvider\n ).getTypeaheadSuggestions(column, pattern);\n console.log(a);\n return a;\n },\n [dataSource],\n );\n\n const suggestionProvider = useMemo(() => {\n if (isTypeaheadSuggestionProvider(dataSource)) {\n return () => getSuggestions;\n }\n }, [dataSource, getSuggestions]);\n\n return (\n <div {...htmlAttributes} className={classBase} onFocus={handleFocus}>\n <VirtualColSpan width={virtualColSpan} />\n {columns.map((column) => (\n <div\n className={`${classBase}-filter`}\n data-field={column.name}\n key={column.name}\n style={{ width: column.width }}\n >\n {getDataItemEditControl({\n InputProps,\n column,\n onCommit,\n suggestionProvider,\n table: dataSource.table,\n })}\n </div>\n ))}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ const useTableContextMenu = ({
25
25
  showContextMenu(evt, "grid", {
26
26
  columnMap,
27
27
  columnName,
28
+ columns,
28
29
  row,
29
30
  selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),
30
31
  viewport: dataSource.viewport
@@ -1 +1 @@
1
- {"version":3,"file":"useTableContextMenu.js","sources":["../src/useTableContextMenu.ts"],"sourcesContent":["import { DataSource, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { buildColumnMap, getIndexFromRowElement } from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nexport interface TableContextMenuHookProps {\n columns: RuntimeColumnDescriptor[];\n data: DataSourceRow[];\n dataSource: DataSource;\n getSelectedRows: () => DataSourceRow[];\n}\n\nconst NO_ROWS = [] as const;\n\nexport const useTableContextMenu = ({\n columns,\n data,\n dataSource,\n getSelectedRows,\n}: TableContextMenuHookProps) => {\n const [showContextMenu] = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest(\"div[role='cell']\");\n const rowEl = target?.closest(\"div[role='row']\") as HTMLElement;\n if (cellEl && rowEl) {\n const { selectedRowsCount } = dataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = getIndexFromRowElement(rowEl);\n const cellIndex = Array.from(rowEl.childNodes).indexOf(cellEl);\n const row = data.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\n // TODO does it really make sense to collect selected rows ?\n // We only have access to rows in local cache\n showContextMenu(evt, \"grid\", {\n columnMap,\n columnName,\n row,\n selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),\n viewport: dataSource.viewport,\n });\n }\n },\n [columns, data, dataSource, getSelectedRows, showContextMenu],\n );\n\n return onContextMenu;\n};\n"],"names":["usePopupContextMenu"],"mappings":";;;;AAaA,MAAM,UAAU,EAAC,CAAA;AAEV,MAAM,sBAAsB,CAAC;AAAA,EAClC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AACF,CAAiC,KAAA;AAC/B,EAAM,MAAA,CAAC,eAAe,CAAA,GAAIA,cAAoB,EAAA,CAAA;AAE9C,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,GAAiC,KAAA;AAChC,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AACnB,MAAM,MAAA,MAAA,GAAS,MAAQ,EAAA,OAAA,CAAQ,kBAAkB,CAAA,CAAA;AACjD,MAAM,MAAA,KAAA,GAAQ,MAAQ,EAAA,OAAA,CAAQ,iBAAiB,CAAA,CAAA;AAC/C,MAAA,IAAI,UAAU,KAAO,EAAA;AACnB,QAAM,MAAA,EAAE,mBAAsB,GAAA,UAAA,CAAA;AAC9B,QAAM,MAAA,SAAA,GAAY,eAAe,OAAO,CAAA,CAAA;AACxC,QAAM,MAAA,QAAA,GAAW,uBAAuB,KAAK,CAAA,CAAA;AAC7C,QAAA,MAAM,YAAY,KAAM,CAAA,IAAA,CAAK,MAAM,UAAU,CAAA,CAAE,QAAQ,MAAM,CAAA,CAAA;AAC7D,QAAM,MAAA,GAAA,GAAM,KAAK,IAAK,CAAA,CAAC,CAAC,GAAG,CAAA,KAAM,QAAQ,QAAQ,CAAA,CAAA;AACjD,QAAM,MAAA,UAAA,GAAa,QAAQ,SAAS,CAAA,CAAA;AAGpC,QAAA,eAAA,CAAgB,KAAK,MAAQ,EAAA;AAAA,UAC3B,SAAA;AAAA,UACA,UAAA;AAAA,UACA,GAAA;AAAA,UACA,YAAc,EAAA,iBAAA,KAAsB,CAAI,GAAA,OAAA,GAAU,eAAgB,EAAA;AAAA,UAClE,UAAU,UAAW,CAAA,QAAA;AAAA,SACtB,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,IACA,CAAC,OAAA,EAAS,IAAM,EAAA,UAAA,EAAY,iBAAiB,eAAe,CAAA;AAAA,GAC9D,CAAA;AAEA,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useTableContextMenu.js","sources":["../src/useTableContextMenu.ts"],"sourcesContent":["import { DataSource, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { buildColumnMap, getIndexFromRowElement } from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nexport interface TableContextMenuHookProps {\n columns: RuntimeColumnDescriptor[];\n data: DataSourceRow[];\n dataSource: DataSource;\n getSelectedRows: () => DataSourceRow[];\n}\n\nconst NO_ROWS = [] as const;\n\nexport const useTableContextMenu = ({\n columns,\n data,\n dataSource,\n getSelectedRows,\n}: TableContextMenuHookProps) => {\n const [showContextMenu] = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest(\"div[role='cell']\");\n const rowEl = target?.closest(\"div[role='row']\") as HTMLElement;\n if (cellEl && rowEl) {\n const { selectedRowsCount } = dataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = getIndexFromRowElement(rowEl);\n const cellIndex = Array.from(rowEl.childNodes).indexOf(cellEl);\n const row = data.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\n // TODO does it really make sense to collect selected rows ?\n // We only have access to rows in local cache\n showContextMenu(evt, \"grid\", {\n columnMap,\n columnName,\n columns,\n row,\n selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),\n viewport: dataSource.viewport,\n });\n }\n },\n [columns, data, dataSource, getSelectedRows, showContextMenu],\n );\n\n return onContextMenu;\n};\n"],"names":["usePopupContextMenu"],"mappings":";;;;AAaA,MAAM,UAAU,EAAC,CAAA;AAEV,MAAM,sBAAsB,CAAC;AAAA,EAClC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AACF,CAAiC,KAAA;AAC/B,EAAM,MAAA,CAAC,eAAe,CAAA,GAAIA,cAAoB,EAAA,CAAA;AAE9C,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,GAAiC,KAAA;AAChC,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AACnB,MAAM,MAAA,MAAA,GAAS,MAAQ,EAAA,OAAA,CAAQ,kBAAkB,CAAA,CAAA;AACjD,MAAM,MAAA,KAAA,GAAQ,MAAQ,EAAA,OAAA,CAAQ,iBAAiB,CAAA,CAAA;AAC/C,MAAA,IAAI,UAAU,KAAO,EAAA;AACnB,QAAM,MAAA,EAAE,mBAAsB,GAAA,UAAA,CAAA;AAC9B,QAAM,MAAA,SAAA,GAAY,eAAe,OAAO,CAAA,CAAA;AACxC,QAAM,MAAA,QAAA,GAAW,uBAAuB,KAAK,CAAA,CAAA;AAC7C,QAAA,MAAM,YAAY,KAAM,CAAA,IAAA,CAAK,MAAM,UAAU,CAAA,CAAE,QAAQ,MAAM,CAAA,CAAA;AAC7D,QAAM,MAAA,GAAA,GAAM,KAAK,IAAK,CAAA,CAAC,CAAC,GAAG,CAAA,KAAM,QAAQ,QAAQ,CAAA,CAAA;AACjD,QAAM,MAAA,UAAA,GAAa,QAAQ,SAAS,CAAA,CAAA;AAGpC,QAAA,eAAA,CAAgB,KAAK,MAAQ,EAAA;AAAA,UAC3B,SAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAA;AAAA,UACA,GAAA;AAAA,UACA,YAAc,EAAA,iBAAA,KAAsB,CAAI,GAAA,OAAA,GAAU,eAAgB,EAAA;AAAA,UAClE,UAAU,UAAW,CAAA,QAAA;AAAA,SACtB,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,IACA,CAAC,OAAA,EAAS,IAAM,EAAA,UAAA,EAAY,iBAAiB,eAAe,CAAA;AAAA,GAC9D,CAAA;AAEA,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
- "version": "0.8.88",
2
+ "version": "0.8.89",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "devDependencies": {
6
- "@vuu-ui/vuu-data-types": "0.8.88",
7
- "@vuu-ui/vuu-table-types": "0.8.88",
8
- "@vuu-ui/vuu-protocol-types": "0.8.88"
6
+ "@vuu-ui/vuu-data-types": "0.8.89",
7
+ "@vuu-ui/vuu-table-types": "0.8.89",
8
+ "@vuu-ui/vuu-protocol-types": "0.8.89"
9
9
  },
10
10
  "dependencies": {
11
11
  "@salt-ds/core": "1.34.0",
12
12
  "@salt-ds/styles": "0.2.1",
13
13
  "@salt-ds/window": "0.1.1",
14
- "@vuu-ui/vuu-data-react": "0.8.88",
15
- "@vuu-ui/vuu-layout": "0.8.88",
16
- "@vuu-ui/vuu-popups": "0.8.88",
17
- "@vuu-ui/vuu-ui-controls": "0.8.88",
18
- "@vuu-ui/vuu-utils": "0.8.88"
14
+ "@vuu-ui/vuu-data-react": "0.8.89",
15
+ "@vuu-ui/vuu-layout": "0.8.89",
16
+ "@vuu-ui/vuu-popups": "0.8.89",
17
+ "@vuu-ui/vuu-ui-controls": "0.8.89",
18
+ "@vuu-ui/vuu-utils": "0.8.89"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "clsx": "^2.0.0",
@@ -1,8 +1,11 @@
1
1
  import { DataSource, RpcResponse } from "@vuu-ui/vuu-data-types";
2
+ import type { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
2
3
  import { HTMLAttributes } from "react";
3
4
  export interface BulkEditPanelProps extends HTMLAttributes<HTMLDivElement> {
5
+ columns?: ColumnDescriptor[];
4
6
  dataSource: DataSource;
5
7
  response?: RpcResponse;
6
8
  mainTableName?: string;
9
+ parentDs: DataSource;
7
10
  }
8
- export declare const BulkEditPanel: ({ className, dataSource, ...htmlAttributes }: BulkEditPanelProps) => JSX.Element;
11
+ export declare const BulkEditPanel: ({ className, columns, dataSource, parentDs, ...htmlAttributes }: BulkEditPanelProps) => JSX.Element;
@@ -1,7 +1,9 @@
1
+ import { DataSource } from "@vuu-ui/vuu-data-types";
1
2
  import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
2
3
  import { HTMLAttributes } from "react";
3
4
  export type EditValueChangeHandler = (column: ColumnDescriptor, value: string) => void;
4
5
  export interface BulkEditProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange"> {
6
+ dataSource: DataSource;
5
7
  onChange: EditValueChangeHandler;
6
8
  }
7
- export declare const BulkEditRow: ({ onChange, ...htmlAttributes }: BulkEditProps) => JSX.Element;
9
+ export declare const BulkEditRow: ({ dataSource, onChange, ...htmlAttributes }: BulkEditProps) => JSX.Element;