next-helios-fe 1.8.129 → 1.8.130
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/components/table/index.d.ts +5 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/components/table/index.tsx +128 -11
package/package.json
CHANGED
@@ -3,16 +3,19 @@ import React, { useState, useEffect, useRef, useMemo } from "react";
|
|
3
3
|
import { Icon } from "@iconify/react";
|
4
4
|
import * as xlsx from "xlsx";
|
5
5
|
import dayjs from "dayjs";
|
6
|
-
import
|
6
|
+
import utc from "dayjs/plugin/utc";
|
7
|
+
import { Form, Button, Dropdown, Tooltip, Calendar } from "../../components";
|
7
8
|
import { Action, type ActionProps } from "./action";
|
8
9
|
|
10
|
+
dayjs.extend(utc);
|
11
|
+
|
9
12
|
interface TableProps {
|
10
13
|
title?: string;
|
11
14
|
header: {
|
12
15
|
title: string;
|
13
16
|
key: string;
|
14
17
|
defaultHide?: boolean;
|
15
|
-
type?: "basic" | "category" | string;
|
18
|
+
type?: "basic" | "category" | "date" | string;
|
16
19
|
render?: (item: any) => React.ReactNode;
|
17
20
|
}[];
|
18
21
|
data: {
|
@@ -79,11 +82,13 @@ interface TableProps {
|
|
79
82
|
maxRow: number;
|
80
83
|
filter: any[];
|
81
84
|
categoryFilter: any[];
|
85
|
+
dateFilter: any[];
|
82
86
|
sortBy: any;
|
83
87
|
}) => void;
|
84
88
|
setValue?: {
|
85
89
|
totalData?: number;
|
86
90
|
categoryFilter?: { [key: string]: (string | number)[] };
|
91
|
+
dateFilter?: { [key: string]: any[] };
|
87
92
|
};
|
88
93
|
};
|
89
94
|
}
|
@@ -107,6 +112,7 @@ export const Table: TableComponentProps = ({
|
|
107
112
|
const [search, setSearch] = useState<string>("");
|
108
113
|
const [filter, setFilter] = useState<any[]>([]);
|
109
114
|
const [categoryFilter, setCategoryFilter] = useState<any>({});
|
115
|
+
const [dateFilter, setDateFilter] = useState<any>({});
|
110
116
|
const [maxRow, setMaxRow] = useState<number>(options?.maxRow || 10);
|
111
117
|
const [page, setPage] = useState<number>(1);
|
112
118
|
const [selected, setSelected] = useState<
|
@@ -155,6 +161,7 @@ export const Table: TableComponentProps = ({
|
|
155
161
|
|
156
162
|
if (data.length !== 0) {
|
157
163
|
const tempCategoryFilter: any = {};
|
164
|
+
const tempDateFilter: any = {};
|
158
165
|
|
159
166
|
header
|
160
167
|
?.filter((item) => item.type === "category")
|
@@ -192,7 +199,19 @@ export const Table: TableComponentProps = ({
|
|
192
199
|
}
|
193
200
|
});
|
194
201
|
|
202
|
+
header
|
203
|
+
?.filter((item) => item.type === "date")
|
204
|
+
?.map((item) => {
|
205
|
+
if (dynamicTable?.setValue?.dateFilter?.[item.key]) {
|
206
|
+
tempDateFilter[item.key] =
|
207
|
+
dynamicTable?.setValue?.dateFilter[item.key];
|
208
|
+
} else {
|
209
|
+
tempDateFilter[item.key] = [];
|
210
|
+
}
|
211
|
+
});
|
212
|
+
|
195
213
|
setCategoryFilter(tempCategoryFilter);
|
214
|
+
setDateFilter(tempDateFilter);
|
196
215
|
setIsReadyForDynamicValue(true);
|
197
216
|
}
|
198
217
|
}, [data, dynamicTable?.setValue?.categoryFilter]);
|
@@ -272,6 +291,24 @@ export const Table: TableComponentProps = ({
|
|
272
291
|
item[headerItem.key as keyof typeof item]
|
273
292
|
);
|
274
293
|
});
|
294
|
+
})
|
295
|
+
?.filter((item) => {
|
296
|
+
if (
|
297
|
+
Object.keys(dateFilter)?.some(
|
298
|
+
(dateItem) => dateFilter[dateItem].length !== 0
|
299
|
+
)
|
300
|
+
) {
|
301
|
+
return Object.keys(dateFilter)
|
302
|
+
?.filter((dateItem) => dateFilter[dateItem].length !== 0)
|
303
|
+
?.every((dateItem) => {
|
304
|
+
return (
|
305
|
+
dayjs(item[dateItem]).isAfter(dateFilter[dateItem][0]) &&
|
306
|
+
dayjs(item[dateItem]).isBefore(dateFilter[dateItem][1])
|
307
|
+
);
|
308
|
+
});
|
309
|
+
} else {
|
310
|
+
return item;
|
311
|
+
}
|
275
312
|
});
|
276
313
|
|
277
314
|
if (sortBy?.column === "") {
|
@@ -297,7 +334,7 @@ export const Table: TableComponentProps = ({
|
|
297
334
|
});
|
298
335
|
}
|
299
336
|
}
|
300
|
-
}, [header, data, filter, categoryFilter, search, sortBy]);
|
337
|
+
}, [header, data, filter, categoryFilter, dateFilter, search, sortBy]);
|
301
338
|
|
302
339
|
useEffect(() => {
|
303
340
|
if (
|
@@ -326,6 +363,7 @@ export const Table: TableComponentProps = ({
|
|
326
363
|
maxRow,
|
327
364
|
filter,
|
328
365
|
categoryFilter,
|
366
|
+
dateFilter,
|
329
367
|
sortBy,
|
330
368
|
})
|
331
369
|
) {
|
@@ -336,6 +374,7 @@ export const Table: TableComponentProps = ({
|
|
336
374
|
maxRow,
|
337
375
|
filter,
|
338
376
|
categoryFilter,
|
377
|
+
dateFilter,
|
339
378
|
sortBy,
|
340
379
|
});
|
341
380
|
setDynamicTableValueCopy({
|
@@ -345,6 +384,7 @@ export const Table: TableComponentProps = ({
|
|
345
384
|
maxRow,
|
346
385
|
filter,
|
347
386
|
categoryFilter,
|
387
|
+
dateFilter,
|
348
388
|
sortBy,
|
349
389
|
});
|
350
390
|
}
|
@@ -358,6 +398,7 @@ export const Table: TableComponentProps = ({
|
|
358
398
|
maxRow,
|
359
399
|
filter,
|
360
400
|
categoryFilter,
|
401
|
+
dateFilter,
|
361
402
|
sortBy,
|
362
403
|
]);
|
363
404
|
|
@@ -367,7 +408,9 @@ export const Table: TableComponentProps = ({
|
|
367
408
|
return (
|
368
409
|
<th
|
369
410
|
key={item.key}
|
370
|
-
className=
|
411
|
+
className={`whitespace-nowrap bg-secondary-bg px-4 py-2 text-left font-medium ${
|
412
|
+
item.type === "date" && "min-w-56"
|
413
|
+
}`}
|
371
414
|
>
|
372
415
|
<div className="flex flex-col">
|
373
416
|
<div className="flex items-center gap-2">
|
@@ -489,6 +532,50 @@ export const Table: TableComponentProps = ({
|
|
489
532
|
</Dropdown>
|
490
533
|
</div>
|
491
534
|
)}
|
535
|
+
{item?.type === "date" && (
|
536
|
+
<div className="font-normal">
|
537
|
+
<Dropdown
|
538
|
+
placement="bottom-end"
|
539
|
+
dismissOnClick={false}
|
540
|
+
trigger={
|
541
|
+
<button
|
542
|
+
type="button"
|
543
|
+
className="flex items-center rounded-full hover:bg-secondary-light"
|
544
|
+
>
|
545
|
+
<Icon icon="akar-icons:calendar" />
|
546
|
+
</button>
|
547
|
+
}
|
548
|
+
>
|
549
|
+
<div className="flex flex-col gap-2">
|
550
|
+
<Calendar
|
551
|
+
options={{ enableSelectRange: true }}
|
552
|
+
value={dateFilter[item.key]}
|
553
|
+
onChange={(e) => {
|
554
|
+
const tempDateFilter = { ...dateFilter };
|
555
|
+
|
556
|
+
tempDateFilter[item.key] = e;
|
557
|
+
|
558
|
+
setDateFilter(tempDateFilter);
|
559
|
+
}}
|
560
|
+
/>
|
561
|
+
{dateFilter[item.key]?.length !== 0 && (
|
562
|
+
<Button
|
563
|
+
options={{ variant: "danger", position: "center" }}
|
564
|
+
onClick={() => {
|
565
|
+
const tempDateFilter = { ...dateFilter };
|
566
|
+
|
567
|
+
tempDateFilter[item.key] = [];
|
568
|
+
|
569
|
+
setDateFilter(tempDateFilter);
|
570
|
+
}}
|
571
|
+
>
|
572
|
+
Remove Filter
|
573
|
+
</Button>
|
574
|
+
)}
|
575
|
+
</div>
|
576
|
+
</Dropdown>
|
577
|
+
</div>
|
578
|
+
)}
|
492
579
|
</div>
|
493
580
|
{options?.toolbar?.columnSearch?.show !== false && (
|
494
581
|
<div
|
@@ -496,17 +583,47 @@ export const Table: TableComponentProps = ({
|
|
496
583
|
item?.type === "category" && "invisible"
|
497
584
|
}`}
|
498
585
|
>
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
586
|
+
{item.type !== "date" && (
|
587
|
+
<Icon
|
588
|
+
icon="ic:round-search"
|
589
|
+
className="absolute text-sm text-disabled"
|
590
|
+
/>
|
591
|
+
)}
|
503
592
|
<input
|
504
593
|
type="search"
|
505
|
-
className=
|
594
|
+
className={`w-full border-x-0 border-t-0 border-default bg-secondary-bg pb-0.5 pt-0 text-sm font-normal placeholder:translate-x-0 placeholder:text-silent placeholder:duration-300 focus:border-primary-dark focus:outline-none focus:ring-0 focus:placeholder:translate-x-1 [&::-webkit-search-cancel-button]:appearance-none ${
|
595
|
+
item.type !== "date" ? "px-6 border-b" : "border-b-0"
|
596
|
+
}`}
|
506
597
|
placeholder="Search..."
|
598
|
+
disabled={item.type === "date"}
|
507
599
|
value={
|
508
|
-
|
509
|
-
?.
|
600
|
+
item.type !== "date"
|
601
|
+
? filter?.find(
|
602
|
+
(filterItem) => filterItem.key === item.key
|
603
|
+
)?.value || ""
|
604
|
+
: dateFilter[item.key]?.length !== 0
|
605
|
+
? `${
|
606
|
+
dayjs(dateFilter[item.key]?.[0])
|
607
|
+
.utc()
|
608
|
+
.local()
|
609
|
+
.format("MMM YYYY") ===
|
610
|
+
dayjs(dateFilter[item.key]?.[1])
|
611
|
+
.utc()
|
612
|
+
.local()
|
613
|
+
.format("MMM YYYY")
|
614
|
+
? dayjs(dateFilter[item.key]?.[0])
|
615
|
+
.utc()
|
616
|
+
.local()
|
617
|
+
.format("DD")
|
618
|
+
: dayjs(dateFilter[item.key]?.[0])
|
619
|
+
.utc()
|
620
|
+
.local()
|
621
|
+
.format("DD MMM YYYY")
|
622
|
+
} - ${dayjs(dateFilter[item.key]?.[1])
|
623
|
+
.utc()
|
624
|
+
.local()
|
625
|
+
.format("DD MMM YYYY")}`
|
626
|
+
: "-"
|
510
627
|
}
|
511
628
|
onChange={(e) => {
|
512
629
|
setFilter(
|