@k3-tech/react-kit 0.0.60 → 0.0.62

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 (34) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +483 -10
  4. package/dist/kit/builder/data-table/components/DataTable.d.ts +3 -1
  5. package/dist/kit/builder/data-table/components/DataTable.d.ts.map +1 -1
  6. package/dist/kit/components/data-table-headers/DataTableHeader.d.ts +25 -0
  7. package/dist/kit/components/data-table-headers/DataTableHeader.d.ts.map +1 -0
  8. package/dist/kit/components/data-table-headers/DebouncedFilterField.d.ts +23 -0
  9. package/dist/kit/components/data-table-headers/DebouncedFilterField.d.ts.map +1 -0
  10. package/dist/kit/components/data-table-headers/FilterFieldRenderer.d.ts +19 -0
  11. package/dist/kit/components/data-table-headers/FilterFieldRenderer.d.ts.map +1 -0
  12. package/dist/kit/components/data-table-headers/index.d.ts +7 -0
  13. package/dist/kit/components/data-table-headers/index.d.ts.map +1 -0
  14. package/dist/kit/components/data-table-headers/types.d.ts +76 -0
  15. package/dist/kit/components/data-table-headers/types.d.ts.map +1 -0
  16. package/dist/kit/components/data-table-headers/urlSerialization.d.ts +12 -0
  17. package/dist/kit/components/data-table-headers/urlSerialization.d.ts.map +1 -0
  18. package/dist/kit/components/data-table-headers/useDataTableHeaderUrl.d.ts +36 -0
  19. package/dist/kit/components/data-table-headers/useDataTableHeaderUrl.d.ts.map +1 -0
  20. package/dist/kit/themes/clean-slate.css +8 -0
  21. package/dist/kit/themes/default.css +8 -0
  22. package/dist/kit/themes/minimal-modern.css +8 -0
  23. package/dist/kit/themes/spotify.css +8 -0
  24. package/package.json +1 -1
  25. package/src/index.ts +1 -0
  26. package/src/kit/builder/data-table/components/DataTable.tsx +5 -2
  27. package/src/kit/builder/form/components/fields/NumberField.tsx +1 -1
  28. package/src/kit/components/data-table-headers/DataTableHeader.tsx +158 -0
  29. package/src/kit/components/data-table-headers/DebouncedFilterField.tsx +83 -0
  30. package/src/kit/components/data-table-headers/FilterFieldRenderer.tsx +194 -0
  31. package/src/kit/components/data-table-headers/index.ts +6 -0
  32. package/src/kit/components/data-table-headers/types.ts +89 -0
  33. package/src/kit/components/data-table-headers/urlSerialization.ts +173 -0
  34. package/src/kit/components/data-table-headers/useDataTableHeaderUrl.ts +107 -0
package/dist/index.d.ts CHANGED
@@ -16,6 +16,7 @@ export * from './kit/components/fileuploader';
16
16
  export * from './kit/components/numpad';
17
17
  export * from './kit/components/keyboard';
18
18
  export * from './kit/components/timepicker';
19
+ export * from './kit/components/data-table-headers';
19
20
  export { default as AdminLayout } from './kit/layouts/admin/components/AdminLayout';
20
21
  export { default as ThemeToggle } from './kit/layouts/admin/components/ThemeToggle';
21
22
  export * from './kit/layouts/admin/hooks/menu';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAE3C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAK1D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAE1C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAK5C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACpF,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iDAAiD,CAAC;AAChE,cAAc,2BAA2B,CAAC;AAK1C,cAAc,+BAA+B,CAAC;AAK9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAK/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAE3C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAK1D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAE1C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AAKpD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACpF,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iDAAiD,CAAC;AAChE,cAAc,2BAA2B,CAAC;AAK1C,cAAc,+BAA+B,CAAC;AAK9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAK/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -9927,7 +9927,7 @@ var validateField = async (field, disabledFieldNames, formValues, validateAllFie
9927
9927
  const isRadio = isRadioInput(ref);
9928
9928
  const isCheckBox = isCheckBoxInput(ref);
9929
9929
  const isRadioOrCheckbox2 = isRadio || isCheckBox;
9930
- const isEmpty = (valueAsNumber || isFileInput(ref)) && isUndefined(ref.value) && isUndefined(inputValue) || isHTMLElement$2(ref) && ref.value === "" || inputValue === "" || Array.isArray(inputValue) && !inputValue.length;
9930
+ const isEmpty2 = (valueAsNumber || isFileInput(ref)) && isUndefined(ref.value) && isUndefined(inputValue) || isHTMLElement$2(ref) && ref.value === "" || inputValue === "" || Array.isArray(inputValue) && !inputValue.length;
9931
9931
  const appendErrorsCurry = appendErrors.bind(null, name, validateAllFieldCriteria, error);
9932
9932
  const getMinMaxMessage = (exceedMax, maxLengthMessage, minLengthMessage, maxType = INPUT_VALIDATION_RULES.maxLength, minType = INPUT_VALIDATION_RULES.minLength) => {
9933
9933
  const message2 = exceedMax ? maxLengthMessage : minLengthMessage;
@@ -9938,7 +9938,7 @@ var validateField = async (field, disabledFieldNames, formValues, validateAllFie
9938
9938
  ...appendErrorsCurry(exceedMax ? maxType : minType, message2)
9939
9939
  };
9940
9940
  };
9941
- if (isFieldArray ? !Array.isArray(inputValue) || !inputValue.length : required2 && (!isRadioOrCheckbox2 && (isEmpty || isNullOrUndefined(inputValue)) || isBoolean$1(inputValue) && !inputValue || isCheckBox && !getCheckboxValue(refs).isValid || isRadio && !getRadioValue(refs).isValid)) {
9941
+ if (isFieldArray ? !Array.isArray(inputValue) || !inputValue.length : required2 && (!isRadioOrCheckbox2 && (isEmpty2 || isNullOrUndefined(inputValue)) || isBoolean$1(inputValue) && !inputValue || isCheckBox && !getCheckboxValue(refs).isValid || isRadio && !getRadioValue(refs).isValid)) {
9942
9942
  const { value, message: message2 } = isString$2(required2) ? { value: !!required2, message: required2 } : getValueAndMessage(required2);
9943
9943
  if (value) {
9944
9944
  error[name] = {
@@ -9953,7 +9953,7 @@ var validateField = async (field, disabledFieldNames, formValues, validateAllFie
9953
9953
  }
9954
9954
  }
9955
9955
  }
9956
- if (!isEmpty && (!isNullOrUndefined(min2) || !isNullOrUndefined(max2))) {
9956
+ if (!isEmpty2 && (!isNullOrUndefined(min2) || !isNullOrUndefined(max2))) {
9957
9957
  let exceedMax;
9958
9958
  let exceedMin;
9959
9959
  const maxOutput = getValueAndMessage(max2);
@@ -9986,7 +9986,7 @@ var validateField = async (field, disabledFieldNames, formValues, validateAllFie
9986
9986
  }
9987
9987
  }
9988
9988
  }
9989
- if ((maxLength || minLength) && !isEmpty && (isString$2(inputValue) || isFieldArray && Array.isArray(inputValue))) {
9989
+ if ((maxLength || minLength) && !isEmpty2 && (isString$2(inputValue) || isFieldArray && Array.isArray(inputValue))) {
9990
9990
  const maxLengthOutput = getValueAndMessage(maxLength);
9991
9991
  const minLengthOutput = getValueAndMessage(minLength);
9992
9992
  const exceedMax = !isNullOrUndefined(maxLengthOutput.value) && inputValue.length > +maxLengthOutput.value;
@@ -9999,7 +9999,7 @@ var validateField = async (field, disabledFieldNames, formValues, validateAllFie
9999
9999
  }
10000
10000
  }
10001
10001
  }
10002
- if (pattern && !isEmpty && isString$2(inputValue)) {
10002
+ if (pattern && !isEmpty2 && isString$2(inputValue)) {
10003
10003
  const { value: patternValue, message: message2 } = getValueAndMessage(pattern);
10004
10004
  if (isRegex(patternValue) && !inputValue.match(patternValue)) {
10005
10005
  error[name] = {
@@ -24143,7 +24143,7 @@ function NumberField({
24143
24143
  }) {
24144
24144
  const innerValue = value;
24145
24145
  const [displayValue, setDisplayValue] = useState(
24146
- innerValue.toLocaleString("id-ID")
24146
+ (Number(innerValue) || "").toLocaleString("id-ID")
24147
24147
  );
24148
24148
  if (field.numberMode === "currency") {
24149
24149
  const parseAndFormatIDRInput = (input) => {
@@ -40233,6 +40233,7 @@ function DataTable({
40233
40233
  onTable,
40234
40234
  className,
40235
40235
  emptyText = "No results.",
40236
+ formFilterForm,
40236
40237
  formFilters,
40237
40238
  formFilterValues,
40238
40239
  onFormFilterChange,
@@ -40441,6 +40442,7 @@ function DataTable({
40441
40442
  /* @__PURE__ */ jsx(AccordionContent, { className: "px-4 pb-4 pt-5", children: /* @__PURE__ */ jsx(
40442
40443
  FormBuilder,
40443
40444
  {
40445
+ form: formFilterForm,
40444
40446
  sections: formFilters,
40445
40447
  defaultValues: formFilterValues,
40446
40448
  onSubmit: (data2) => onFormFilterChange == null ? void 0 : onFormFilterChange(data2),
@@ -40449,8 +40451,7 @@ function DataTable({
40449
40451
  submitLabel: "Apply",
40450
40452
  resetLabel: "Clear",
40451
40453
  showActionsSeparator: filterShowActionsSeparator
40452
- },
40453
- JSON.stringify(formFilterValues ?? {})
40454
+ }
40454
40455
  ) })
40455
40456
  ] })
40456
40457
  }
@@ -44674,7 +44675,7 @@ function requireLodash() {
44674
44675
  function isElement2(value) {
44675
44676
  return isObjectLike(value) && value.nodeType === 1 && !isPlainObject2(value);
44676
44677
  }
44677
- function isEmpty(value) {
44678
+ function isEmpty2(value) {
44678
44679
  if (value == null) {
44679
44680
  return true;
44680
44681
  }
@@ -45807,7 +45808,7 @@ function requireLodash() {
45807
45808
  lodash2.isBuffer = isBuffer2;
45808
45809
  lodash2.isDate = isDate2;
45809
45810
  lodash2.isElement = isElement2;
45810
- lodash2.isEmpty = isEmpty;
45811
+ lodash2.isEmpty = isEmpty2;
45811
45812
  lodash2.isEqual = isEqual;
45812
45813
  lodash2.isEqualWith = isEqualWith;
45813
45814
  lodash2.isError = isError;
@@ -47847,6 +47848,470 @@ function Keyboard({
47847
47848
  );
47848
47849
  }
47849
47850
  Keyboard.displayName = "Keyboard";
47851
+ function DebouncedFilterField({
47852
+ field,
47853
+ value,
47854
+ onChange,
47855
+ debounceMs,
47856
+ control,
47857
+ className
47858
+ }) {
47859
+ const [draft, setDraft] = useState(value);
47860
+ const lastPushedRef = useRef(value);
47861
+ const debounced = c$1((v) => {
47862
+ lastPushedRef.current = v;
47863
+ onChange(v);
47864
+ }, debounceMs);
47865
+ const handleChange = (v) => {
47866
+ setDraft(v);
47867
+ debounced(v);
47868
+ };
47869
+ useEffect(() => {
47870
+ if (!Object.is(value, lastPushedRef.current)) {
47871
+ debounced.cancel();
47872
+ lastPushedRef.current = value;
47873
+ setDraft(value);
47874
+ }
47875
+ }, [value]);
47876
+ useEffect(
47877
+ () => () => {
47878
+ debounced.flush();
47879
+ },
47880
+ [debounced]
47881
+ );
47882
+ const common = {
47883
+ field,
47884
+ control,
47885
+ fieldPath: field.name,
47886
+ value: draft,
47887
+ onChange: handleChange,
47888
+ className
47889
+ };
47890
+ if (field.type === "textarea") return /* @__PURE__ */ jsx(TextareaField, { ...common });
47891
+ if (field.type === "number") return /* @__PURE__ */ jsx(NumberField, { ...common });
47892
+ return /* @__PURE__ */ jsx(TextField, { ...common });
47893
+ }
47894
+ const DEBOUNCED_TYPES = /* @__PURE__ */ new Set([
47895
+ "text",
47896
+ "email",
47897
+ "password",
47898
+ "number",
47899
+ "textarea"
47900
+ ]);
47901
+ const UNSUPPORTED_TYPES = /* @__PURE__ */ new Set([
47902
+ "object",
47903
+ "array",
47904
+ "custom_field",
47905
+ "hidden"
47906
+ ]);
47907
+ const warned = /* @__PURE__ */ new Set();
47908
+ const warnUnsupported = (type) => {
47909
+ if (process.env.NODE_ENV !== "production" && !warned.has(type)) {
47910
+ warned.add(type);
47911
+ console.warn(
47912
+ `[DataTableHeader] field type '${type}' is not supported in filter headers and was skipped.`
47913
+ );
47914
+ }
47915
+ };
47916
+ function FilterFieldRenderer({
47917
+ field,
47918
+ value,
47919
+ onChange,
47920
+ debounceMs,
47921
+ control
47922
+ }) {
47923
+ if (UNSUPPORTED_TYPES.has(field.type)) {
47924
+ warnUnsupported(field.type);
47925
+ return null;
47926
+ }
47927
+ const inputClassName = cn$1("bg-background", field.className);
47928
+ let input;
47929
+ if (DEBOUNCED_TYPES.has(field.type)) {
47930
+ input = /* @__PURE__ */ jsx(
47931
+ DebouncedFilterField,
47932
+ {
47933
+ field,
47934
+ value,
47935
+ onChange,
47936
+ debounceMs,
47937
+ control,
47938
+ className: inputClassName
47939
+ }
47940
+ );
47941
+ } else {
47942
+ const common = {
47943
+ field,
47944
+ control,
47945
+ fieldPath: field.name,
47946
+ value,
47947
+ onChange,
47948
+ className: inputClassName
47949
+ };
47950
+ switch (field.type) {
47951
+ case "select":
47952
+ input = /* @__PURE__ */ jsx(SelectField, { ...common });
47953
+ break;
47954
+ case "autocomplete":
47955
+ input = /* @__PURE__ */ jsx(AutocompleteField, { ...common });
47956
+ break;
47957
+ case "checkbox":
47958
+ input = /* @__PURE__ */ jsx(CheckboxField, { ...common });
47959
+ break;
47960
+ case "switch":
47961
+ input = /* @__PURE__ */ jsx(SwitchField, { ...common });
47962
+ break;
47963
+ case "radio":
47964
+ input = /* @__PURE__ */ jsx(RadioField, { ...common });
47965
+ break;
47966
+ case "date":
47967
+ input = /* @__PURE__ */ jsx(DateField, { ...common });
47968
+ break;
47969
+ case "date_picker":
47970
+ input = /* @__PURE__ */ jsx(DatePickerField, { ...common });
47971
+ break;
47972
+ case "date_range":
47973
+ input = /* @__PURE__ */ jsx(DateRangePickerField, { ...common });
47974
+ break;
47975
+ case "date_time":
47976
+ input = /* @__PURE__ */ jsx(DateTimePickerField, { ...common });
47977
+ break;
47978
+ case "date_time_range":
47979
+ input = /* @__PURE__ */ jsx(DateTimeRangePickerField, { ...common });
47980
+ break;
47981
+ case "month":
47982
+ input = /* @__PURE__ */ jsx(MonthPickerField, { ...common });
47983
+ break;
47984
+ case "month_range":
47985
+ input = /* @__PURE__ */ jsx(MonthRangePickerField, { ...common });
47986
+ break;
47987
+ case "time":
47988
+ input = /* @__PURE__ */ jsx(TimePickerField, { ...common });
47989
+ break;
47990
+ case "time_range":
47991
+ input = /* @__PURE__ */ jsx(TimeRangePickerField, { ...common });
47992
+ break;
47993
+ case "file":
47994
+ input = /* @__PURE__ */ jsx(FileField, { ...common });
47995
+ break;
47996
+ default:
47997
+ input = /* @__PURE__ */ jsx(
47998
+ DebouncedFilterField,
47999
+ {
48000
+ field,
48001
+ value,
48002
+ onChange,
48003
+ debounceMs,
48004
+ control,
48005
+ className: inputClassName
48006
+ }
48007
+ );
48008
+ }
48009
+ }
48010
+ const labelText = typeof field.label === "string" ? field.label.trim() : field.label;
48011
+ const showLabel = field.labelPlacement !== "hidden" && labelText != null && labelText !== "" && field.type !== "checkbox" && field.type !== "switch";
48012
+ return /* @__PURE__ */ jsxs(
48013
+ "div",
48014
+ {
48015
+ className: cn$1(
48016
+ "w-full space-y-1 sm:w-auto sm:min-w-[180px]",
48017
+ field.wrapperClassName
48018
+ ),
48019
+ children: [
48020
+ showLabel && /* @__PURE__ */ jsx(Label$2, { htmlFor: field.name, className: "text-xs text-muted-foreground", children: field.label }),
48021
+ input
48022
+ ]
48023
+ }
48024
+ );
48025
+ }
48026
+ const DATE_TYPES = /* @__PURE__ */ new Set([
48027
+ "date",
48028
+ "date_picker",
48029
+ "month",
48030
+ "time",
48031
+ "date_time"
48032
+ ]);
48033
+ const RANGE_TYPES = /* @__PURE__ */ new Set([
48034
+ "date_range",
48035
+ "date_time_range",
48036
+ "month_range",
48037
+ "time_range"
48038
+ ]);
48039
+ const SKIP_TYPES = /* @__PURE__ */ new Set(["object", "array", "custom_field", "hidden"]);
48040
+ const isEmpty = (v) => v === null || v === void 0 || v === "";
48041
+ const toIso = (v) => {
48042
+ const d = v instanceof Date ? v : new Date(v);
48043
+ return Number.isNaN(d.getTime()) ? null : d.toISOString();
48044
+ };
48045
+ const fromIso = (raw) => {
48046
+ const d = new Date(raw);
48047
+ return Number.isNaN(d.getTime()) ? null : d;
48048
+ };
48049
+ const recoverOptionValue = (field, raw) => {
48050
+ var _a2;
48051
+ const match2 = (_a2 = field.options) == null ? void 0 : _a2.find((o2) => String(o2.value) === raw);
48052
+ return match2 ? match2.value : raw;
48053
+ };
48054
+ const coerceScalar = (raw) => raw !== "" && !Number.isNaN(Number(raw)) ? Number(raw) : raw;
48055
+ function serializeAll(fields, values) {
48056
+ const params = {};
48057
+ for (const field of fields) {
48058
+ if (SKIP_TYPES.has(field.type)) continue;
48059
+ const name = field.name;
48060
+ const value = values[name];
48061
+ if (RANGE_TYPES.has(field.type)) {
48062
+ const range = value;
48063
+ const from = range && !isEmpty(range.from) ? toIso(range.from) : null;
48064
+ const to = range && !isEmpty(range.to) ? toIso(range.to) : null;
48065
+ if (from) params[`${name}_from`] = from;
48066
+ if (to) params[`${name}_to`] = to;
48067
+ continue;
48068
+ }
48069
+ if (isEmpty(value)) continue;
48070
+ if (Array.isArray(value)) {
48071
+ const arr = value.filter((v) => !isEmpty(v)).map((v) => String(v));
48072
+ if (arr.length) params[name] = arr;
48073
+ continue;
48074
+ }
48075
+ if (DATE_TYPES.has(field.type)) {
48076
+ const iso = toIso(value);
48077
+ if (iso) params[name] = iso;
48078
+ continue;
48079
+ }
48080
+ params[name] = String(value);
48081
+ }
48082
+ return params;
48083
+ }
48084
+ function deserializeAll(fields, params) {
48085
+ const result = {};
48086
+ const first = (v) => Array.isArray(v) ? v[0] : v;
48087
+ for (const field of fields) {
48088
+ if (SKIP_TYPES.has(field.type)) continue;
48089
+ const name = field.name;
48090
+ if (RANGE_TYPES.has(field.type)) {
48091
+ const from = first(params[`${name}_from`]);
48092
+ const to = first(params[`${name}_to`]);
48093
+ const range = {};
48094
+ if (from) {
48095
+ const d = fromIso(from);
48096
+ if (d) range.from = d;
48097
+ }
48098
+ if (to) {
48099
+ const d = fromIso(to);
48100
+ if (d) range.to = d;
48101
+ }
48102
+ if (range.from || range.to) result[name] = range;
48103
+ continue;
48104
+ }
48105
+ const raw = params[name];
48106
+ if (raw === void 0) continue;
48107
+ if (field.multiple || Array.isArray(raw)) {
48108
+ const arr = (Array.isArray(raw) ? raw : [raw]).map(coerceScalar);
48109
+ result[name] = arr;
48110
+ continue;
48111
+ }
48112
+ const value = raw;
48113
+ switch (field.type) {
48114
+ case "number":
48115
+ if (value !== "" && !Number.isNaN(Number(value)))
48116
+ result[name] = Number(value);
48117
+ break;
48118
+ case "checkbox":
48119
+ case "switch":
48120
+ result[name] = value === "true";
48121
+ break;
48122
+ case "select":
48123
+ case "radio":
48124
+ result[name] = recoverOptionValue(field, value);
48125
+ break;
48126
+ case "autocomplete":
48127
+ result[name] = coerceScalar(value);
48128
+ break;
48129
+ default:
48130
+ if (DATE_TYPES.has(field.type)) {
48131
+ const d = fromIso(value);
48132
+ if (d) result[name] = d;
48133
+ } else {
48134
+ result[name] = value;
48135
+ }
48136
+ }
48137
+ }
48138
+ return result;
48139
+ }
48140
+ const nativeAdapter = {
48141
+ read: () => {
48142
+ if (typeof window === "undefined") return {};
48143
+ const usp = new URLSearchParams(window.location.search);
48144
+ const out = {};
48145
+ for (const key of usp.keys()) {
48146
+ if (key in out) continue;
48147
+ const all = usp.getAll(key);
48148
+ out[key] = all.length > 1 ? all : all[0];
48149
+ }
48150
+ return out;
48151
+ },
48152
+ write: (params) => {
48153
+ if (typeof window === "undefined") return;
48154
+ const usp = new URLSearchParams();
48155
+ for (const [key, value] of Object.entries(params)) {
48156
+ if (Array.isArray(value))
48157
+ value.forEach((v) => {
48158
+ usp.append(key, v);
48159
+ });
48160
+ else usp.append(key, value);
48161
+ }
48162
+ const query = usp.toString();
48163
+ const url = query ? `${window.location.pathname}?${query}` : window.location.pathname;
48164
+ window.history.replaceState(null, "", url);
48165
+ }
48166
+ };
48167
+ function useDataTableHeaderUrl({
48168
+ enabled,
48169
+ fields,
48170
+ values,
48171
+ adapter,
48172
+ onHydrate
48173
+ }) {
48174
+ const hydratedRef = useRef(false);
48175
+ const lastWrittenRef = useRef(null);
48176
+ useEffect(() => {
48177
+ if (!enabled || hydratedRef.current) return;
48178
+ hydratedRef.current = true;
48179
+ const params = adapter.read();
48180
+ const hydrated = deserializeAll(fields, params);
48181
+ lastWrittenRef.current = JSON.stringify(serializeAll(fields, hydrated));
48182
+ if (Object.keys(hydrated).length) onHydrate(hydrated);
48183
+ }, [enabled]);
48184
+ useEffect(() => {
48185
+ if (!enabled) return;
48186
+ const params = serializeAll(fields, values);
48187
+ const serialized = JSON.stringify(params);
48188
+ if (serialized === lastWrittenRef.current) return;
48189
+ lastWrittenRef.current = serialized;
48190
+ adapter.write(params);
48191
+ }, [enabled, values]);
48192
+ }
48193
+ function useFilterControl() {
48194
+ const { control } = useForm();
48195
+ return control;
48196
+ }
48197
+ function DataTableHeader({
48198
+ fields,
48199
+ values,
48200
+ onChange,
48201
+ onChangeAll,
48202
+ debounceMs = 400,
48203
+ url = false,
48204
+ actions = [],
48205
+ onRefresh,
48206
+ children,
48207
+ className,
48208
+ filtersClassName,
48209
+ actionsClassName
48210
+ }) {
48211
+ const control = useFilterControl();
48212
+ const adapter = url === true ? nativeAdapter : url || nativeAdapter;
48213
+ const handleHydrate = useCallback(
48214
+ (next) => {
48215
+ if (onChangeAll) {
48216
+ onChangeAll({ ...values, ...next });
48217
+ return;
48218
+ }
48219
+ for (const [name, value] of Object.entries(next)) onChange(name, value);
48220
+ },
48221
+ // `values` intentionally omitted: hydration runs once on mount and we don't
48222
+ // want to re-bind to every value change.
48223
+ // eslint-disable-next-line react-hooks/exhaustive-deps
48224
+ [onChange, onChangeAll]
48225
+ );
48226
+ useDataTableHeaderUrl({
48227
+ enabled: url !== false,
48228
+ fields,
48229
+ values,
48230
+ adapter,
48231
+ onHydrate: handleHydrate
48232
+ });
48233
+ const renderActionButton = (action, key) => {
48234
+ if (action.element)
48235
+ return /* @__PURE__ */ jsx(React__default.Fragment, { children: action.element }, key);
48236
+ const content = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-x-2", children: [
48237
+ action.icon && /* @__PURE__ */ jsx(
48238
+ "span",
48239
+ {
48240
+ className: cn$1(action.iconPosition === "right" ? "order-last" : ""),
48241
+ children: action.icon
48242
+ }
48243
+ ),
48244
+ action.label
48245
+ ] });
48246
+ return /* @__PURE__ */ jsx(
48247
+ Button$1,
48248
+ {
48249
+ size: "sm",
48250
+ variant: action.variant ?? "default",
48251
+ disabled: action.disabled,
48252
+ onClick: action.onClick,
48253
+ className: "h-8",
48254
+ children: content
48255
+ },
48256
+ key
48257
+ );
48258
+ };
48259
+ return /* @__PURE__ */ jsxs(
48260
+ "div",
48261
+ {
48262
+ className: cn$1("flex items-start justify-between gap-3", className),
48263
+ children: [
48264
+ /* @__PURE__ */ jsx(
48265
+ "div",
48266
+ {
48267
+ className: cn$1(
48268
+ "flex min-w-0 flex-1 flex-wrap items-end gap-2",
48269
+ filtersClassName
48270
+ ),
48271
+ children: fields.map((field) => /* @__PURE__ */ jsx(
48272
+ FilterFieldRenderer,
48273
+ {
48274
+ field,
48275
+ value: values[field.name],
48276
+ onChange: (value) => onChange(field.name, value),
48277
+ debounceMs,
48278
+ control
48279
+ },
48280
+ field.name
48281
+ ))
48282
+ }
48283
+ ),
48284
+ children,
48285
+ (actions.length > 0 || onRefresh) && /* @__PURE__ */ jsxs(
48286
+ "div",
48287
+ {
48288
+ className: cn$1(
48289
+ "flex shrink-0 flex-nowrap items-center gap-2",
48290
+ actionsClassName
48291
+ ),
48292
+ children: [
48293
+ onRefresh && /* @__PURE__ */ jsxs(
48294
+ Button$1,
48295
+ {
48296
+ variant: "outline",
48297
+ size: "sm",
48298
+ onClick: onRefresh,
48299
+ className: "h-8",
48300
+ title: "Refresh",
48301
+ children: [
48302
+ /* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4" }),
48303
+ " Refresh"
48304
+ ]
48305
+ }
48306
+ ),
48307
+ actions.map((action) => renderActionButton(action, action.key))
48308
+ ]
48309
+ }
48310
+ )
48311
+ ]
48312
+ }
48313
+ );
48314
+ }
47850
48315
  const MOBILE_BREAKPOINT = 768;
47851
48316
  function useIsMobile() {
47852
48317
  const [isMobile, setIsMobile] = React.useState(
@@ -67031,12 +67496,14 @@ export {
67031
67496
  ContextMenuTrigger,
67032
67497
  DataTable,
67033
67498
  DataTableColumnHeader,
67499
+ DataTableHeader,
67034
67500
  DataTablePagination,
67035
67501
  DataTableViewOptions,
67036
67502
  DatePicker,
67037
67503
  DateRangePicker,
67038
67504
  DateTimePicker,
67039
67505
  DateTimeRangePicker,
67506
+ DebouncedFilterField,
67040
67507
  Dialog,
67041
67508
  DialogClose,
67042
67509
  DialogContent,
@@ -67074,6 +67541,7 @@ export {
67074
67541
  DropdownMenuSubTrigger,
67075
67542
  DropdownMenuTrigger,
67076
67543
  FileUploader,
67544
+ FilterFieldRenderer,
67077
67545
  Form,
67078
67546
  FormBuilder,
67079
67547
  FormBuilderActions,
@@ -67243,11 +67711,14 @@ export {
67243
67711
  createSection,
67244
67712
  createStorage,
67245
67713
  createTokenManager,
67714
+ deserializeAll,
67246
67715
  dotAccessor,
67247
67716
  evaluatePermissionRule,
67248
67717
  expandPermissions,
67249
67718
  expandRoles,
67719
+ nativeAdapter,
67250
67720
  navigationMenuTriggerStyle,
67721
+ serializeAll,
67251
67722
  toast,
67252
67723
  toggleVariants,
67253
67724
  transformers,
@@ -67263,8 +67734,10 @@ export {
67263
67734
  useAuthToken,
67264
67735
  useAuthUser,
67265
67736
  useCan,
67737
+ useDataTableHeaderUrl,
67266
67738
  useDialog,
67267
67739
  useDialogController,
67740
+ useFilterControl,
67268
67741
  useFormBuilder,
67269
67742
  useFormField,
67270
67743
  useIsAuthenticated,
@@ -1,4 +1,5 @@
1
1
  import { ColumnDef, ColumnFiltersState, PaginationState, Table as ReactTable, SortingState, VisibilityState } from '@tanstack/react-table';
2
+ import { UseFormReturn } from 'react-hook-form';
2
3
  import { DataTableAction, DataTableBatchAction, DataTableFiltersProp } from '../types';
3
4
  import * as React from 'react';
4
5
  export interface DataTableProps<TData, TValue> {
@@ -25,6 +26,7 @@ export interface DataTableProps<TData, TValue> {
25
26
  formFilters?: DataTableFiltersProp;
26
27
  formFilterValues?: Record<string, unknown> | null;
27
28
  onFormFilterChange?: (values: Record<string, unknown>) => void;
29
+ formFilterForm?: UseFormReturn<any>;
28
30
  selectable?: boolean;
29
31
  actions?: DataTableAction[];
30
32
  batchActions?: DataTableBatchAction<TData>[];
@@ -40,5 +42,5 @@ export interface DataTableProps<TData, TValue> {
40
42
  */
41
43
  CustomHeaderComponent?: () => React.ReactNode;
42
44
  }
43
- export declare function DataTable<TData, TValue>({ columns, data, loading, sorting, sortingState, onSortingChange, columnFilters, columnFiltersState, onColumnFiltersChange, rowCount, pagination, paginationVariant, onPaginationChange, paginationState, columnVisibility, columnVisibilityState, onColumnVisibilityChange, onTable, className, emptyText, formFilters, formFilterValues, onFormFilterChange, selectable, actions, batchActions, showStandardActions, onRefresh, onRowClick, filterWrapper, filterTitle, filterShowActionsSeparator, CustomHeaderComponent, }: DataTableProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
45
+ export declare function DataTable<TData, TValue>({ columns, data, loading, sorting, sortingState, onSortingChange, columnFilters, columnFiltersState, onColumnFiltersChange, rowCount, pagination, paginationVariant, onPaginationChange, paginationState, columnVisibility, columnVisibilityState, onColumnVisibilityChange, onTable, className, emptyText, formFilterForm, formFilters, formFilterValues, onFormFilterChange, selectable, actions, batchActions, showStandardActions, onRefresh, onRowClick, filterWrapper, filterTitle, filterShowActionsSeparator, CustomHeaderComponent, }: DataTableProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
44
46
  //# sourceMappingURL=DataTable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../../src/kit/builder/data-table/components/DataTable.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../../src/kit/builder/data-table/components/DataTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { DataTableHeaderProps } from './types';
2
+ /**
3
+ * A plug-in replacement for the DataTable's default filter + actions header.
4
+ *
5
+ * Plug it into `DataTable`'s `CustomHeaderComponent`:
6
+ *```
7
+ * <DataTable
8
+ * CustomHeaderComponent={() => (
9
+ * <DataTableHeader
10
+ * fields={filterFields}
11
+ * values={filtersState} // owned by your list hook
12
+ * onChange={setFilter} // updates that same state
13
+ * actions={[addAction, refreshAction]}
14
+ * />
15
+ * )}
16
+ * />
17
+ *```
18
+ * Unlike the default FormBuilder-based filter, this header holds NO filter data
19
+ * of its own — `values` is the single source of truth, so the UI can never
20
+ * drift from what is sent to the API. Filters apply on every change (no
21
+ * Apply/Clear); free-typing inputs are debounced internally.
22
+ */
23
+ export declare function DataTableHeader({ fields, values, onChange, onChangeAll, debounceMs, url, actions, onRefresh, children, className, filtersClassName, actionsClassName, }: DataTableHeaderProps): import("react/jsx-runtime").JSX.Element;
24
+ export default DataTableHeader;
25
+ //# sourceMappingURL=DataTableHeader.d.ts.map