nntc-ui 0.0.93 → 0.0.95

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.
@@ -162,37 +162,41 @@ var MoreVerticalIcon = (props) => /* @__PURE__ */ jsx26(Icon, { ...props, childr
162
162
  import { jsx as jsx27 } from "react/jsx-runtime";
163
163
  var SearchIcon = (props) => /* @__PURE__ */ jsx27(Icon, { ...props, children: /* @__PURE__ */ jsx27("path", { d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" }) });
164
164
 
165
- // src/icons/SettingsIcon.tsx
165
+ // src/icons/SelectUniqueIcon.tsx
166
166
  import { jsx as jsx28 } from "react/jsx-runtime";
167
- var SettingsIcon = (props) => /* @__PURE__ */ jsx28(Icon, { ...props, children: /* @__PURE__ */ jsx28("path", { d: "M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.07.62-.07.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z" }) });
167
+ var SelectUniqueIcon = (props) => /* @__PURE__ */ jsx28(Icon, { ...props, children: /* @__PURE__ */ jsx28("path", { d: "M3 5h18v2H3V5zm0 6h18v2H3v-2zm0 6h10v2H3v-2z" }) });
168
168
 
169
- // src/icons/SortDownIcon.tsx
169
+ // src/icons/SettingsIcon.tsx
170
170
  import { jsx as jsx29 } from "react/jsx-runtime";
171
- var SortDownIcon = (props) => /* @__PURE__ */ jsx29(Icon, { ...props, children: /* @__PURE__ */ jsx29("path", { "fill-rule": "evenodd", "clip-rule": "evenodd", d: "M3 18V16H21V18H3ZM3 6H9V8H3V6ZM15 11H3V13H15V11Z" }) });
171
+ var SettingsIcon = (props) => /* @__PURE__ */ jsx29(Icon, { ...props, children: /* @__PURE__ */ jsx29("path", { d: "M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.07.62-.07.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z" }) });
172
172
 
173
- // src/icons/SortUpIcon.tsx
173
+ // src/icons/SortDownIcon.tsx
174
174
  import { jsx as jsx30 } from "react/jsx-runtime";
175
- var SortUpIcon = (props) => /* @__PURE__ */ jsx30(Icon, { ...props, children: /* @__PURE__ */ jsx30("path", { "fill-rule": "evenodd", "clip-rule": "evenodd", d: "M3 6V8H21V6H3ZM3 18H9V16H3V18ZM15 13H3V11H15V13Z" }) });
175
+ var SortDownIcon = (props) => /* @__PURE__ */ jsx30(Icon, { ...props, children: /* @__PURE__ */ jsx30("path", { "fill-rule": "evenodd", "clip-rule": "evenodd", d: "M3 18V16H21V18H3ZM3 6H9V8H3V6ZM15 11H3V13H15V11Z" }) });
176
176
 
177
- // src/icons/TableChartIcon.tsx
177
+ // src/icons/SortUpIcon.tsx
178
178
  import { jsx as jsx31 } from "react/jsx-runtime";
179
- var TableChartIcon = (props) => /* @__PURE__ */ jsx31(Icon, { ...props, children: /* @__PURE__ */ jsx31("path", { d: "M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z" }) });
179
+ var SortUpIcon = (props) => /* @__PURE__ */ jsx31(Icon, { ...props, children: /* @__PURE__ */ jsx31("path", { "fill-rule": "evenodd", "clip-rule": "evenodd", d: "M3 6V8H21V6H3ZM3 18H9V16H3V18ZM15 13H3V11H15V13Z" }) });
180
180
 
181
- // src/icons/UploadIcon.tsx
181
+ // src/icons/TableChartIcon.tsx
182
182
  import { jsx as jsx32 } from "react/jsx-runtime";
183
- var UploadIcon = (props) => /* @__PURE__ */ jsx32(Icon, { ...props, children: /* @__PURE__ */ jsx32("path", { d: "M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z" }) });
183
+ var TableChartIcon = (props) => /* @__PURE__ */ jsx32(Icon, { ...props, children: /* @__PURE__ */ jsx32("path", { d: "M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z" }) });
184
184
 
185
- // src/icons/WellIcon.tsx
185
+ // src/icons/UploadIcon.tsx
186
186
  import { jsx as jsx33 } from "react/jsx-runtime";
187
- var WellIcon = (props) => /* @__PURE__ */ jsx33(Icon, { ...props, children: /* @__PURE__ */ jsx33("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z" }) });
187
+ var UploadIcon = (props) => /* @__PURE__ */ jsx33(Icon, { ...props, children: /* @__PURE__ */ jsx33("path", { d: "M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z" }) });
188
188
 
189
- // src/icons/EditIcon.tsx
189
+ // src/icons/WellIcon.tsx
190
190
  import { jsx as jsx34 } from "react/jsx-runtime";
191
- var EditIcon = (props) => /* @__PURE__ */ jsx34(Icon, { ...props, children: /* @__PURE__ */ jsx34("path", { d: "M18.3688 3.29L20.7088 5.63C21.0988 6.02 21.0988 6.65 20.7088 7.04L18.8788 8.87L15.1288 5.12L16.9588 3.29C17.1488 3.1 17.3988 3 17.6588 3C17.9188 3 18.1688 3.09 18.3688 3.29ZM2.99878 17.25V21H6.74878L17.8088 9.94L14.0588 6.19L2.99878 17.25ZM5.91878 19H4.99878V18.08L14.0588 9.02L14.9788 9.94L5.91878 19Z" }) });
191
+ var WellIcon = (props) => /* @__PURE__ */ jsx34(Icon, { ...props, children: /* @__PURE__ */ jsx34("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z" }) });
192
192
 
193
- // src/icons/FullScreenOnIcon.tsx
193
+ // src/icons/EditIcon.tsx
194
194
  import { jsx as jsx35 } from "react/jsx-runtime";
195
- var FullScreenOnIcon = (props) => /* @__PURE__ */ jsx35(Icon, { ...props, children: /* @__PURE__ */ jsx35(
195
+ var EditIcon = (props) => /* @__PURE__ */ jsx35(Icon, { ...props, children: /* @__PURE__ */ jsx35("path", { d: "M18.3688 3.29L20.7088 5.63C21.0988 6.02 21.0988 6.65 20.7088 7.04L18.8788 8.87L15.1288 5.12L16.9588 3.29C17.1488 3.1 17.3988 3 17.6588 3C17.9188 3 18.1688 3.09 18.3688 3.29ZM2.99878 17.25V21H6.74878L17.8088 9.94L14.0588 6.19L2.99878 17.25ZM5.91878 19H4.99878V18.08L14.0588 9.02L14.9788 9.94L5.91878 19Z" }) });
196
+
197
+ // src/icons/FullScreenOnIcon.tsx
198
+ import { jsx as jsx36 } from "react/jsx-runtime";
199
+ var FullScreenOnIcon = (props) => /* @__PURE__ */ jsx36(Icon, { ...props, children: /* @__PURE__ */ jsx36(
196
200
  "path",
197
201
  {
198
202
  d: `M3 5v4h2V5h4V3H5c-1.1 0-2 .9-2 2zm2 10H3v4c0 1.1.9 2 2
@@ -201,16 +205,16 @@ var FullScreenOnIcon = (props) => /* @__PURE__ */ jsx35(Icon, { ...props, childr
201
205
  ) });
202
206
 
203
207
  // src/icons/FullScreenOffIcon.tsx
204
- import { jsx as jsx36 } from "react/jsx-runtime";
205
- var FullScreenOffIcon = (props) => /* @__PURE__ */ jsx36(Icon, { ...props, children: /* @__PURE__ */ jsx36("path", { d: "M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z" }) });
208
+ import { jsx as jsx37 } from "react/jsx-runtime";
209
+ var FullScreenOffIcon = (props) => /* @__PURE__ */ jsx37(Icon, { ...props, children: /* @__PURE__ */ jsx37("path", { d: "M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z" }) });
206
210
 
207
211
  // src/icons/BookmarkIcon.tsx
208
- import { jsx as jsx37 } from "react/jsx-runtime";
209
- var BookmarkIcon = (props) => /* @__PURE__ */ jsx37(Icon, { ...props, children: /* @__PURE__ */ jsx37("path", { d: "M17 3H7c-1.1 0-2 .9-2 2v16l7-3 7 3V5c0-1.1-.9-2-2-2zm0 15-5-2.18L7 18V5h10v13z" }) });
212
+ import { jsx as jsx38 } from "react/jsx-runtime";
213
+ var BookmarkIcon = (props) => /* @__PURE__ */ jsx38(Icon, { ...props, children: /* @__PURE__ */ jsx38("path", { d: "M17 3H7c-1.1 0-2 .9-2 2v16l7-3 7 3V5c0-1.1-.9-2-2-2zm0 15-5-2.18L7 18V5h10v13z" }) });
210
214
 
211
215
  // src/icons/BookmarkAddIcon.tsx
212
- import { jsx as jsx38 } from "react/jsx-runtime";
213
- var BookmarkAddIcon = (props) => /* @__PURE__ */ jsx38(Icon, { ...props, children: /* @__PURE__ */ jsx38(
216
+ import { jsx as jsx39 } from "react/jsx-runtime";
217
+ var BookmarkAddIcon = (props) => /* @__PURE__ */ jsx39(Icon, { ...props, children: /* @__PURE__ */ jsx39(
214
218
  "path",
215
219
  {
216
220
  d: `M17 11v6.97l-5-2.14-5 2.14V5h6V3H7c-1.1 0-2
@@ -219,8 +223,8 @@ var BookmarkAddIcon = (props) => /* @__PURE__ */ jsx38(Icon, { ...props, childre
219
223
  ) });
220
224
 
221
225
  // src/icons/ExportTableIcon.tsx
222
- import { jsx as jsx39 } from "react/jsx-runtime";
223
- var ExportTableIcon = (props) => /* @__PURE__ */ jsx39(Icon, { ...props, children: /* @__PURE__ */ jsx39(
226
+ import { jsx as jsx40 } from "react/jsx-runtime";
227
+ var ExportTableIcon = (props) => /* @__PURE__ */ jsx40(Icon, { ...props, children: /* @__PURE__ */ jsx40(
224
228
  "path",
225
229
  {
226
230
  fill: "currentColor",
@@ -236,12 +240,12 @@ var ExportTableIcon = (props) => /* @__PURE__ */ jsx39(Icon, { ...props, childre
236
240
  ) });
237
241
 
238
242
  // src/icons/DownloadIcon.tsx
239
- import { jsx as jsx40 } from "react/jsx-runtime";
240
- var DownloadIcon = (props) => /* @__PURE__ */ jsx40(Icon, { ...props, children: /* @__PURE__ */ jsx40("path", { d: "M19 9h-4V3H9v6H5l7 7 7-7zm-8 2V5h2v6h1.17L12 13.17 9.83 11H11zm-6 7h14v2H5z" }) });
243
+ import { jsx as jsx41 } from "react/jsx-runtime";
244
+ var DownloadIcon = (props) => /* @__PURE__ */ jsx41(Icon, { ...props, children: /* @__PURE__ */ jsx41("path", { d: "M19 9h-4V3H9v6H5l7 7 7-7zm-8 2V5h2v6h1.17L12 13.17 9.83 11H11zm-6 7h14v2H5z" }) });
241
245
 
242
246
  // src/icons/VisibilityIcon.tsx
243
- import { jsx as jsx41 } from "react/jsx-runtime";
244
- var VisibilityIcon = (props) => /* @__PURE__ */ jsx41(Icon, { ...props, children: /* @__PURE__ */ jsx41(
247
+ import { jsx as jsx42 } from "react/jsx-runtime";
248
+ var VisibilityIcon = (props) => /* @__PURE__ */ jsx42(Icon, { ...props, children: /* @__PURE__ */ jsx42(
245
249
  "path",
246
250
  {
247
251
  d: `M12 6.375C15.75 6.375 18.9525 8.7075 20.25 12C18.9525 15.2925 15.75 17.625 12 17.625C8.25
@@ -256,8 +260,8 @@ var VisibilityIcon = (props) => /* @__PURE__ */ jsx41(Icon, { ...props, children
256
260
  ) });
257
261
 
258
262
  // src/icons/PointIcon.tsx
259
- import { jsx as jsx42 } from "react/jsx-runtime";
260
- var PointIcon = (props) => /* @__PURE__ */ jsx42(Icon, { ...props, children: /* @__PURE__ */ jsx42(
263
+ import { jsx as jsx43 } from "react/jsx-runtime";
264
+ var PointIcon = (props) => /* @__PURE__ */ jsx43(Icon, { ...props, children: /* @__PURE__ */ jsx43(
261
265
  "path",
262
266
  {
263
267
  d: "M12 8C9.79086 8 8 9.79086 8 12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12C16 9.79086 14.2091 8 12 8V8Z"
@@ -292,6 +296,7 @@ export {
292
296
  ListIcon,
293
297
  MoreVerticalIcon,
294
298
  SearchIcon,
299
+ SelectUniqueIcon,
295
300
  SettingsIcon,
296
301
  SortDownIcon,
297
302
  SortUpIcon,
package/icons/index.d.ts CHANGED
@@ -58,6 +58,8 @@ declare const MoreVerticalIcon: React__default.FC<IconProps>;
58
58
 
59
59
  declare const SearchIcon: React__default.FC<IconProps>;
60
60
 
61
+ declare const SelectUniqueIcon: React__default.FC<IconProps>;
62
+
61
63
  declare const SettingsIcon: React__default.FC<IconProps>;
62
64
 
63
65
  declare const SortDownIcon: React__default.FC<IconProps>;
@@ -88,4 +90,4 @@ declare const VisibilityIcon: React__default.FC<IconProps>;
88
90
 
89
91
  declare const PointIcon: React__default.FC<IconProps>;
90
92
 
91
- export { AddIcon, AlertIcon, ArrowDropDownIcon, ArrowDropUpIcon, AttachIcon, BarChartIcon, BookmarkAddIcon, BookmarkIcon, CheckboxDeselectedIcon, CheckboxIcon, CheckboxSeveralIcon, ChevronLeftIcon, ChevronRightIcon, CircleFilledIcon, CloseIcon, DateRangeIcon, DeleteIcon, DoneIcon, DownloadIcon, EditIcon, ExportTableIcon, FileUploadIcon, FilterClearIcon, FilterIcon, FullScreenOffIcon, FullScreenOnIcon, InfoIcon, KeyboardArrowDownIcon, ListIcon, MoreVerticalIcon, PointIcon, RadioDeselectedIcon, RadioSelectedIcon, SearchIcon, SettingsIcon, SortDownIcon, SortUpIcon, TableChartIcon, UploadIcon, VisibilityIcon, WellIcon };
93
+ export { AddIcon, AlertIcon, ArrowDropDownIcon, ArrowDropUpIcon, AttachIcon, BarChartIcon, BookmarkAddIcon, BookmarkIcon, CheckboxDeselectedIcon, CheckboxIcon, CheckboxSeveralIcon, ChevronLeftIcon, ChevronRightIcon, CircleFilledIcon, CloseIcon, DateRangeIcon, DeleteIcon, DoneIcon, DownloadIcon, EditIcon, ExportTableIcon, FileUploadIcon, FilterClearIcon, FilterIcon, FullScreenOffIcon, FullScreenOnIcon, InfoIcon, KeyboardArrowDownIcon, ListIcon, MoreVerticalIcon, PointIcon, RadioDeselectedIcon, RadioSelectedIcon, SearchIcon, SelectUniqueIcon, SettingsIcon, SortDownIcon, SortUpIcon, TableChartIcon, UploadIcon, VisibilityIcon, WellIcon };
package/icons/index.js CHANGED
@@ -33,6 +33,7 @@ import {
33
33
  RadioDeselectedIcon,
34
34
  RadioSelectedIcon,
35
35
  SearchIcon,
36
+ SelectUniqueIcon,
36
37
  SettingsIcon,
37
38
  SortDownIcon,
38
39
  SortUpIcon,
@@ -40,7 +41,7 @@ import {
40
41
  UploadIcon,
41
42
  VisibilityIcon,
42
43
  WellIcon
43
- } from "../chunk-SQXO2GJK.js";
44
+ } from "../chunk-MHQGQL5J.js";
44
45
  export {
45
46
  AddIcon,
46
47
  AlertIcon,
@@ -76,6 +77,7 @@ export {
76
77
  RadioDeselectedIcon,
77
78
  RadioSelectedIcon,
78
79
  SearchIcon,
80
+ SelectUniqueIcon,
79
81
  SettingsIcon,
80
82
  SortDownIcon,
81
83
  SortUpIcon,
package/index.d.ts CHANGED
@@ -308,6 +308,7 @@ interface FilterBy {
308
308
  columnName: string;
309
309
  type: 'value' | 'numberRange' | 'dateRange';
310
310
  values: (string | number)[];
311
+ uniqueFirstPerValue?: boolean;
311
312
  }
312
313
 
313
314
  type SortType = 'alphanumeric' | 'locale';
@@ -334,6 +335,7 @@ interface TableColumn {
334
335
  filtrationByNumber?: boolean;
335
336
  filtrationByDate?: boolean;
336
337
  filtrationByValue?: boolean;
338
+ selectUnique?: boolean;
337
339
  width?: number;
338
340
  headerAlign?: ColumnAlign;
339
341
  rowsAlign?: ColumnAlign;
@@ -381,7 +383,8 @@ interface Props$8 {
381
383
  globalSorts?: SortBy[];
382
384
  onFiltersChange?: (filters: FilterBy[]) => void;
383
385
  onSortsChange?: (sorts: SortBy[]) => void;
384
- additionalHeaderContent?: (headerName: string) => ReactNode;
386
+ leftAdditionalHeaderContent?: (headerName: string) => ReactNode;
387
+ rightAdditionalHeaderContent?: (headerName: string) => ReactNode;
385
388
  showRowsNumbers?: boolean;
386
389
  }
387
390
  declare const VirtualTable: React.ForwardRefExoticComponent<Props$8 & {
package/index.js CHANGED
@@ -16,10 +16,11 @@ import {
16
16
  RadioDeselectedIcon,
17
17
  RadioSelectedIcon,
18
18
  SearchIcon,
19
+ SelectUniqueIcon,
19
20
  SortDownIcon,
20
21
  SortUpIcon,
21
22
  __export
22
- } from "./chunk-SQXO2GJK.js";
23
+ } from "./chunk-MHQGQL5J.js";
23
24
 
24
25
  // src/components/common/Button/Button.tsx
25
26
  import classnames from "classnames";
@@ -3705,6 +3706,7 @@ function HeaderDropdown(props) {
3705
3706
  const {
3706
3707
  headerMeta: {
3707
3708
  sortable = false,
3709
+ selectUnique = false,
3708
3710
  sortType,
3709
3711
  sortAnotherName,
3710
3712
  filtrationByNumber = false,
@@ -3720,7 +3722,8 @@ function HeaderDropdown(props) {
3720
3722
  headerName,
3721
3723
  containerRef,
3722
3724
  showUniqueValuesCount,
3723
- additionalContent,
3725
+ leftAdditionalContent,
3726
+ rightAdditionalContent,
3724
3727
  children: children2,
3725
3728
  rows
3726
3729
  } = props;
@@ -3832,7 +3835,12 @@ function HeaderDropdown(props) {
3832
3835
  const selectedValues = Object.keys(selected6);
3833
3836
  setFilterBy((prev) => {
3834
3837
  if (selectedValues.length === 0) {
3835
- return prev.filter((p) => !(p.columnName === headerResultName && p.type === "value"));
3838
+ return prev.map((p) => {
3839
+ if (p.columnName !== headerResultName || p.type !== "value") {
3840
+ return p;
3841
+ }
3842
+ return p.uniqueFirstPerValue ? { ...p, values: [] } : null;
3843
+ }).filter((p) => p !== null);
3836
3844
  }
3837
3845
  const newResult = [...prev];
3838
3846
  const existIndex = newResult.findIndex((p) => p.columnName === headerResultName && p.type === "value");
@@ -3844,14 +3852,68 @@ function HeaderDropdown(props) {
3844
3852
  return newResult;
3845
3853
  });
3846
3854
  };
3847
- const hasAnyFilter = Object.keys(filterSelectedItems).length;
3855
+ const uniqueFirstPerValue = filterBy.some(
3856
+ (fb) => fb.columnName === headerResultName && fb.type === "value" && fb.uniqueFirstPerValue
3857
+ );
3858
+ const toggleUniqueFirstPerValue = () => {
3859
+ setFilterBy((prev) => {
3860
+ const existIndex = prev.findIndex((p) => p.columnName === headerResultName && p.type === "value");
3861
+ if (existIndex !== -1) {
3862
+ const current = prev[existIndex];
3863
+ const nextFlag = !current.uniqueFirstPerValue;
3864
+ if (!nextFlag && current.values.length === 0) {
3865
+ return prev.filter((_, i) => i !== existIndex);
3866
+ }
3867
+ return prev.map((p, i) => {
3868
+ if (i !== existIndex) {
3869
+ return p;
3870
+ }
3871
+ if (nextFlag) {
3872
+ return { ...p, uniqueFirstPerValue: true };
3873
+ }
3874
+ return { columnName: p.columnName, type: p.type, values: p.values };
3875
+ });
3876
+ }
3877
+ return [...prev, { columnName: headerResultName, type: "value", values: [], uniqueFirstPerValue: true }];
3878
+ });
3879
+ };
3880
+ const hasAnyFilter = Object.keys(filterSelectedItems).length > 0 || uniqueFirstPerValue;
3848
3881
  const sortUp = sortBy.some((sb) => sb.columnName === headerResultName && sb.direction === "desc");
3849
3882
  const sortDown = sortBy.some((sb) => sb.columnName === headerResultName && sb.direction === "asc");
3850
3883
  const { t } = useTranslation();
3884
+ const headerActionMenuItems = [];
3885
+ if (selectUnique) {
3886
+ headerActionMenuItems.push({ type: "divider", name: t("\u0423\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439") });
3887
+ headerActionMenuItems.push({
3888
+ type: "item",
3889
+ name: t("\u0422\u043E\u043B\u044C\u043A\u043E \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435"),
3890
+ icon: /* @__PURE__ */ jsx35(SelectUniqueIcon, {}),
3891
+ selected: uniqueFirstPerValue,
3892
+ onClick: toggleUniqueFirstPerValue
3893
+ });
3894
+ }
3895
+ if (sortable) {
3896
+ headerActionMenuItems.push({ type: "divider", name: t("\u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430") });
3897
+ headerActionMenuItems.push({
3898
+ type: "item",
3899
+ name: t("\u041F\u043E \u0432\u043E\u0437\u0440\u0430\u0441\u0442\u0430\u043D\u0438\u044E"),
3900
+ icon: /* @__PURE__ */ jsx35(SortDownIcon, {}),
3901
+ selected: sortBy.some((sb) => sb.columnName === headerResultName && sb.direction === "asc"),
3902
+ onClick: handleSortClick("asc")
3903
+ });
3904
+ headerActionMenuItems.push({
3905
+ type: "item",
3906
+ name: t("\u041F\u043E \u0443\u0431\u044B\u0432\u0430\u043D\u0438\u044E"),
3907
+ icon: /* @__PURE__ */ jsx35(SortUpIcon, {}),
3908
+ selected: sortBy.some((sb) => sb.columnName === headerResultName && sb.direction === "desc"),
3909
+ onClick: handleSortClick("desc")
3910
+ });
3911
+ }
3851
3912
  return /* @__PURE__ */ jsxs20("div", { className: classnames22(root19), children: [
3852
- additionalContent?.(headerResultName),
3913
+ leftAdditionalContent?.(headerResultName),
3853
3914
  children2?.(showUniqueValuesCount && /* @__PURE__ */ jsx35("div", { children: `(${uniqueRows.length})` })),
3854
- (sortable || filtrationByValue || filtrationByDate || filtrationByNumber) && /* @__PURE__ */ jsx35(
3915
+ rightAdditionalContent?.(headerResultName),
3916
+ (sortable || selectUnique || filtrationByValue || filtrationByDate || filtrationByNumber) && /* @__PURE__ */ jsx35(
3855
3917
  Popover,
3856
3918
  {
3857
3919
  placement: "bottom-end",
@@ -3868,31 +3930,7 @@ function HeaderDropdown(props) {
3868
3930
  actionWithSelected: actionWithSelectedObjects
3869
3931
  }
3870
3932
  ) }),
3871
- sortable && /* @__PURE__ */ jsx35("div", { children: /* @__PURE__ */ jsx35(
3872
- Menu,
3873
- {
3874
- items: [
3875
- {
3876
- type: "divider",
3877
- name: t("\u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430")
3878
- },
3879
- {
3880
- type: "item",
3881
- name: t("\u041F\u043E \u0432\u043E\u0437\u0440\u0430\u0441\u0442\u0430\u043D\u0438\u044E"),
3882
- icon: /* @__PURE__ */ jsx35(SortDownIcon, {}),
3883
- selected: sortBy.some((sb) => sb.columnName === headerResultName && sb.direction === "asc"),
3884
- onClick: handleSortClick("asc")
3885
- },
3886
- {
3887
- type: "item",
3888
- name: t("\u041F\u043E \u0443\u0431\u044B\u0432\u0430\u043D\u0438\u044E"),
3889
- icon: /* @__PURE__ */ jsx35(SortUpIcon, {}),
3890
- selected: sortBy.some((sb) => sb.columnName === headerResultName && sb.direction === "desc"),
3891
- onClick: handleSortClick("desc")
3892
- }
3893
- ]
3894
- }
3895
- ) })
3933
+ (sortable || selectUnique) && /* @__PURE__ */ jsx35("div", { children: /* @__PURE__ */ jsx35(Menu, { items: headerActionMenuItems }) })
3896
3934
  ] }),
3897
3935
  children: /* @__PURE__ */ jsx35(Tooltip, { label: t("\u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0438 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F"), placement: "bottom-end", root: containerRef, children: /* @__PURE__ */ jsx35(
3898
3936
  Button,
@@ -3908,6 +3946,21 @@ function HeaderDropdown(props) {
3908
3946
  ] });
3909
3947
  }
3910
3948
 
3949
+ // src/components/view/VirtualTable/utils/dedupeFirstByColumnValue.ts
3950
+ function dedupeFirstByColumnValue(rows, columnName) {
3951
+ const seen = /* @__PURE__ */ new Set();
3952
+ const result = [];
3953
+ rows.forEach((row) => {
3954
+ const key = row[columnName] ? (row[columnName].value || "")?.toString() : "";
3955
+ if (seen.has(key)) {
3956
+ return;
3957
+ }
3958
+ seen.add(key);
3959
+ result.push(row);
3960
+ });
3961
+ return result;
3962
+ }
3963
+
3911
3964
  // src/components/view/VirtualTable/utils/getColumns.ts
3912
3965
  var createMeta = (column) => {
3913
3966
  if (column) {
@@ -3919,6 +3972,7 @@ var createMeta = (column) => {
3919
3972
  filtrationByNumber: column.filtrationByNumber,
3920
3973
  filtrationByDate: column.filtrationByDate,
3921
3974
  filtrationByValue: column.filtrationByValue,
3975
+ selectUnique: column.selectUnique,
3922
3976
  width: column.width,
3923
3977
  headerAlign: column.headerAlign,
3924
3978
  rowsAlign: column.rowsAlign,
@@ -4040,7 +4094,8 @@ var VirtualTable = forwardRef10((props, ref) => {
4040
4094
  globalSorts,
4041
4095
  onFiltersChange,
4042
4096
  onSortsChange,
4043
- additionalHeaderContent,
4097
+ leftAdditionalHeaderContent,
4098
+ rightAdditionalHeaderContent,
4044
4099
  showRowsNumbers
4045
4100
  } = props;
4046
4101
  const fixedWithNumbersCount = fixedColumnsCount + (showRowsNumbers ? 1 : 0);
@@ -4065,6 +4120,9 @@ var VirtualTable = forwardRef10((props, ref) => {
4065
4120
  const memoizedData = useMemo10(() => {
4066
4121
  const newRows = [...rows];
4067
4122
  const nextFilterBy = filterBy.filter((filterByItem) => {
4123
+ if (filterByItem.type === "value" && filterByItem.uniqueFirstPerValue && filterByItem.values.length === 0) {
4124
+ return true;
4125
+ }
4068
4126
  const startDate = filterByItem.type === "dateRange" ? dayjs2(filterByItem.values[0]) : null;
4069
4127
  const endDate = filterByItem.type === "dateRange" ? dayjs2(filterByItem.values[1]) : null;
4070
4128
  return rows.some((row) => {
@@ -4075,7 +4133,12 @@ var VirtualTable = forwardRef10((props, ref) => {
4075
4133
  const filtered = nextFilterBy.length ? recursiveFilter(newRows, nextFilterBy) : filterBy.some(
4076
4134
  (fb) => fb.type === "numberRange" && fb.values.some((v) => v !== Infinity && v !== -Infinity) || fb.type === "dateRange" && fb.values.some((v) => !dayjs2(v).isSame(dayjs2(0)) && !dayjs2(v).isSame(dayjs2(Number.MAX_SAFE_INTEGER)))
4077
4135
  ) ? [] : newRows;
4078
- const sorted = sortBy.length ? recursiveSort(filtered, sortBy) : filtered;
4136
+ let sorted = sortBy.length ? recursiveSort(filtered, sortBy) : filtered;
4137
+ for (const fb of nextFilterBy) {
4138
+ if (fb.type === "value" && fb.uniqueFirstPerValue) {
4139
+ sorted = dedupeFirstByColumnValue(sorted, fb.columnName);
4140
+ }
4141
+ }
4079
4142
  const result = rowNumberColumnId ? sorted.map((row, index) => ({
4080
4143
  ...row,
4081
4144
  [rowNumberColumnId]: {
@@ -4333,7 +4396,7 @@ var VirtualTable = forwardRef10((props, ref) => {
4333
4396
  const headerResultName = headerMeta?.sortAnotherName ?? header2.column.columnDef.id ?? header2.id;
4334
4397
  const columnFilterIndex = filterBy.findIndex((fb) => fb.columnName === headerResultName);
4335
4398
  const rowsForChecklist = columnFilterIndex === -1 ? memoizedData : partialFiltered[columnFilterIndex];
4336
- return /* @__PURE__ */ jsx36("div", { className: classnames23(thCell), children: header2.column.columnDef.id === header2.column.columnDef["accessorKey"] && header2.column.columnDef.id !== rowNumberColumnId && (headerMeta?.sortable || headerMeta?.filtrationByValue || headerMeta?.filtrationByDate || headerMeta?.filtrationByNumber || headerMeta && showUniqueValuesCount) ? /* @__PURE__ */ jsx36(
4399
+ return /* @__PURE__ */ jsx36("div", { className: classnames23(thCell), children: header2.column.columnDef.id === header2.column.columnDef["accessorKey"] && header2.column.columnDef.id !== rowNumberColumnId && (headerMeta?.sortable || headerMeta?.selectUnique || headerMeta?.filtrationByValue || headerMeta?.filtrationByDate || headerMeta?.filtrationByNumber || headerMeta && showUniqueValuesCount) ? /* @__PURE__ */ jsx36(
4337
4400
  HeaderDropdown,
4338
4401
  {
4339
4402
  headerMeta,
@@ -4345,7 +4408,8 @@ var VirtualTable = forwardRef10((props, ref) => {
4345
4408
  headerName: header2.column.columnDef.id ?? header2.id,
4346
4409
  containerRef: useTableContainerAsRootForPopup ? tableContainerRef : void 0,
4347
4410
  showUniqueValuesCount,
4348
- additionalContent: additionalHeaderContent,
4411
+ leftAdditionalContent: leftAdditionalHeaderContent,
4412
+ rightAdditionalContent: rightAdditionalHeaderContent,
4349
4413
  children: (afterNode) => /* @__PURE__ */ jsxs21(
4350
4414
  "div",
4351
4415
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nntc-ui",
3
- "version": "0.0.93",
3
+ "version": "0.0.95",
4
4
  "author": "NNTC",
5
5
  "description": "React UI-kit for NNTC",
6
6
  "type": "module",