react-better-html 1.1.174 → 1.1.176

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -765,6 +765,7 @@ type TableColumn<DataItem> = {
765
765
  clickStopPropagation?: boolean;
766
766
  } & (TextColumn<DataItem> | ElementColumn<DataItem> | ImageColumn<DataItem> | CheckboxColumn<DataItem> | ExpandColumn<DataItem>) & (NumberFilter<DataItem> | DateFilter<DataItem> | ListFilter<DataItem>);
767
767
  type TableProps<DataItem> = {
768
+ name?: string;
768
769
  columns: TableColumn<DataItem>[];
769
770
  data: DataItem[];
770
771
  /** @default false */
@@ -780,6 +781,16 @@ type TableProps<DataItem> = {
780
781
  isInsideTableExpandRow?: boolean;
781
782
  containsOverflowComponents?: boolean;
782
783
  wrapperComponentRef?: React.Ref<HTMLDivElement>;
784
+ /**
785
+ * @default false
786
+ * @requires name
787
+ */
788
+ memoizeFilters?: boolean;
789
+ /**
790
+ * The lifespan of the memoized filters in milliseconds. The time will reset if the user changes the filters or reloads the page.
791
+ * @default 7200000 (2 hours)
792
+ */
793
+ memoizeFiltersLifespan?: number;
783
794
  getRowStyle?: (item: DataItem, index: number) => ComponentStyle;
784
795
  onClickRow?: (item: DataItem, index: number) => void;
785
796
  onClickAllCheckboxes?: (checked: boolean) => void;
package/dist/index.d.ts CHANGED
@@ -765,6 +765,7 @@ type TableColumn<DataItem> = {
765
765
  clickStopPropagation?: boolean;
766
766
  } & (TextColumn<DataItem> | ElementColumn<DataItem> | ImageColumn<DataItem> | CheckboxColumn<DataItem> | ExpandColumn<DataItem>) & (NumberFilter<DataItem> | DateFilter<DataItem> | ListFilter<DataItem>);
767
767
  type TableProps<DataItem> = {
768
+ name?: string;
768
769
  columns: TableColumn<DataItem>[];
769
770
  data: DataItem[];
770
771
  /** @default false */
@@ -780,6 +781,16 @@ type TableProps<DataItem> = {
780
781
  isInsideTableExpandRow?: boolean;
781
782
  containsOverflowComponents?: boolean;
782
783
  wrapperComponentRef?: React.Ref<HTMLDivElement>;
784
+ /**
785
+ * @default false
786
+ * @requires name
787
+ */
788
+ memoizeFilters?: boolean;
789
+ /**
790
+ * The lifespan of the memoized filters in milliseconds. The time will reset if the user changes the filters or reloads the page.
791
+ * @default 7200000 (2 hours)
792
+ */
793
+ memoizeFiltersLifespan?: number;
783
794
  getRowStyle?: (item: DataItem, index: number) => ComponentStyle;
784
795
  onClickRow?: (item: DataItem, index: number) => void;
785
796
  onClickAllCheckboxes?: (checked: boolean) => void;
package/dist/index.js CHANGED
@@ -5898,6 +5898,9 @@ var DropdownComponent = (0, import_react18.forwardRef)(function Dropdown({
5898
5898
  ] }),
5899
5899
  [filteredOptions, value, focusedOptionIndex, theme2.colors, onClickOption, renderOption, renderOptionDivider]
5900
5900
  );
5901
+ (0, import_react18.useEffect)(() => {
5902
+ setInternalValue(controlledValue);
5903
+ }, [controlledValue]);
5901
5904
  (0, import_react18.useEffect)(() => {
5902
5905
  if (isOpen) {
5903
5906
  setIsOpenLate.setTrue();
@@ -5933,7 +5936,7 @@ var DropdownComponent = (0, import_react18.forwardRef)(function Dropdown({
5933
5936
  }, [withDebounce, onChangeSearch, debouncedSearchQuery]);
5934
5937
  const displayValue = withSearch && isFocused ? searchQuery : selectedOption?.label ?? "";
5935
5938
  const withClearButton = isOpen && selectedOption;
5936
- const readyPlaceholder = placeholder ? placeholder : `Select an ${label?.toLowerCase() ?? "option"}`;
5939
+ const readyPlaceholder = placeholder ?? `Select an ${label?.toLowerCase() ?? "option"}`;
5937
5940
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Div_default.column, { width: "100%", position: "relative", userSelect: "none", ...props, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(Div_default.row, { position: "relative", width: "100%", children: [
5938
5941
  /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
5939
5942
  InputField_default,
@@ -6218,6 +6221,7 @@ function Calendar({ value, minDate, maxDate, onChange }) {
6218
6221
  days.map((day, index) => {
6219
6222
  const thisDayDate = new Date(currentYear, currentMonth, day);
6220
6223
  const isSelected = day !== void 0 && day === currentDate?.getDate() && currentMonth === currentDate.getMonth() && currentYear === currentDate.getFullYear();
6224
+ const isToday = thisDayDate.getDate() === (/* @__PURE__ */ new Date()).getDate() && thisDayDate.getMonth() === (/* @__PURE__ */ new Date()).getMonth() && thisDayDate.getFullYear() === (/* @__PURE__ */ new Date()).getFullYear();
6221
6225
  const isWeekend = thisDayDate.getDay() === 6 || thisDayDate.getDay() === 0;
6222
6226
  const isDisabled = minDate && thisDayDate.getTime() < minDate.getTime() || maxDate && thisDayDate.getTime() > maxDate.getTime();
6223
6227
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
@@ -6229,7 +6233,8 @@ function Calendar({ value, minDate, maxDate, onChange }) {
6229
6233
  alignItems: "center",
6230
6234
  justifyContent: "center",
6231
6235
  backgroundColor: isSelected ? theme2.colors.primary : theme2.colors.backgroundContent,
6232
- filterHover: !isDisabled ? "brightness(0.9)" : void 0,
6236
+ filterHover: day && !isDisabled ? "brightness(0.9)" : void 0,
6237
+ border: `1px solid ${isToday ? theme2.colors.primary : theme2.colors.primary + "00"}`,
6233
6238
  borderRadius: theme2.styles.borderRadius / 2,
6234
6239
  padding: theme2.styles.space / 2,
6235
6240
  cursor: day ? !isDisabled ? "pointer" : "not-allowed" : void 0,
@@ -7890,6 +7895,7 @@ var filterPresetsText = {
7890
7895
  nextYear: "Next year"
7891
7896
  };
7892
7897
  var TableComponent = (0, import_react25.forwardRef)(function Table({
7898
+ name,
7893
7899
  columns,
7894
7900
  data,
7895
7901
  isStriped,
@@ -7901,6 +7907,8 @@ var TableComponent = (0, import_react25.forwardRef)(function Table({
7901
7907
  isInsideTableExpandRow,
7902
7908
  containsOverflowComponents,
7903
7909
  wrapperComponentRef,
7910
+ memoizeFilters,
7911
+ memoizeFiltersLifespan = 72e5,
7904
7912
  getRowStyle,
7905
7913
  onClickRow,
7906
7914
  onClickAllCheckboxes,
@@ -7918,7 +7926,15 @@ var TableComponent = (0, import_react25.forwardRef)(function Table({
7918
7926
  const [checkedItems, setCheckedItems] = (0, import_react25.useState)([]);
7919
7927
  const [expandedRows, setExpandedRows] = (0, import_react25.useState)([]);
7920
7928
  const [currentPage, setCurrentPage] = (0, import_react25.useState)(1);
7921
- const [filterData, setFilterData] = (0, import_react25.useState)({});
7929
+ const [filterData, setFilterData] = (0, import_react25.useState)(() => {
7930
+ if (!memoizeFilters || !name) return {};
7931
+ const localStorageData = JSON.parse(localStorage.getItem(`react-better-html-table-filters-${name}`) || "{}");
7932
+ const timestamp = localStorageData.timestamp;
7933
+ const data2 = localStorageData.data ?? {};
7934
+ const timeDiff = Date.now() - timestamp;
7935
+ if (timeDiff > memoizeFiltersLifespan) return {};
7936
+ return data2;
7937
+ });
7922
7938
  const [openedFilterColumnIndex, setOpenedFilterColumnIndex] = (0, import_react25.useState)();
7923
7939
  const [filterListSelectedItems, setFilterListSelectedItems] = (0, import_react25.useState)();
7924
7940
  const openedFilterData = openedFilterColumnIndex ? filterData[openedFilterColumnIndex] : void 0;
@@ -8173,6 +8189,10 @@ var TableComponent = (0, import_react25.forwardRef)(function Table({
8173
8189
  } else if (column.filter === "date" && filter.type === "date" || column.filter === "date-time" && filter.type === "date-time") {
8174
8190
  const minDate = filter.min ? new Date(filter.min) : void 0;
8175
8191
  const maxDate = filter.max ? new Date(filter.max) : void 0;
8192
+ if (column.filter === "date") {
8193
+ minDate?.setHours(0, 0, 0, 0);
8194
+ maxDate?.setHours(23, 59, 59, 999);
8195
+ }
8176
8196
  const itemValue = column.getValue?.(item) ?? new Date(column.type === "text" && column.keyName ? String(item[column.keyName]) : "");
8177
8197
  if (filter.min !== void 0 && minDate && itemValue < minDate) return false;
8178
8198
  if (filter.max !== void 0 && maxDate && itemValue > maxDate) return false;
@@ -8256,6 +8276,17 @@ var TableComponent = (0, import_react25.forwardRef)(function Table({
8256
8276
  (0, import_react25.useEffect)(() => {
8257
8277
  onChangeFilter?.(filterData);
8258
8278
  }, [onChangeFilter, filterData]);
8279
+ (0, import_react25.useEffect)(() => {
8280
+ if (!memoizeFilters) return;
8281
+ if (!name) return;
8282
+ localStorage.setItem(
8283
+ `react-better-html-table-filters-${name}`,
8284
+ JSON.stringify({
8285
+ timestamp: Date.now(),
8286
+ data: filterData
8287
+ })
8288
+ );
8289
+ }, [memoizeFilters, name, filterData]);
8259
8290
  (0, import_react25.useEffect)(() => {
8260
8291
  onChangeFilterDataValue?.(dataAfterFilter);
8261
8292
  }, [onChangeFilterDataValue, dataAfterFilter]);