@esic-lab/data-core-ui 0.0.45 → 0.0.46
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.css +18 -9
- package/dist/index.d.mts +35 -1
- package/dist/index.d.ts +35 -1
- package/dist/index.js +406 -0
- package/dist/index.mjs +403 -0
- package/package.json +1 -1
package/dist/index.css
CHANGED
|
@@ -465,6 +465,12 @@
|
|
|
465
465
|
.h-\[47px\] {
|
|
466
466
|
height: 47px;
|
|
467
467
|
}
|
|
468
|
+
.h-\[250px\] {
|
|
469
|
+
height: 250px;
|
|
470
|
+
}
|
|
471
|
+
.h-\[314px\] {
|
|
472
|
+
height: 314px;
|
|
473
|
+
}
|
|
468
474
|
.h-\[500px\] {
|
|
469
475
|
height: 500px;
|
|
470
476
|
}
|
|
@@ -480,12 +486,6 @@
|
|
|
480
486
|
.h-screen {
|
|
481
487
|
height: 100vh;
|
|
482
488
|
}
|
|
483
|
-
.max-h-\[250px\] {
|
|
484
|
-
max-height: 250px;
|
|
485
|
-
}
|
|
486
|
-
.max-h-\[300px\] {
|
|
487
|
-
max-height: 300px;
|
|
488
|
-
}
|
|
489
489
|
.min-h-\[120px\] {
|
|
490
490
|
min-height: 120px;
|
|
491
491
|
}
|
|
@@ -573,9 +573,6 @@
|
|
|
573
573
|
.w-\[250px\] {
|
|
574
574
|
width: 250px;
|
|
575
575
|
}
|
|
576
|
-
.w-\[300px\] {
|
|
577
|
-
width: 300px;
|
|
578
|
-
}
|
|
579
576
|
.w-\[500px\] {
|
|
580
577
|
width: 500px;
|
|
581
578
|
}
|
|
@@ -588,6 +585,12 @@
|
|
|
588
585
|
.w-full {
|
|
589
586
|
width: 100%;
|
|
590
587
|
}
|
|
588
|
+
.max-w-\[400px\] {
|
|
589
|
+
max-width: 400px;
|
|
590
|
+
}
|
|
591
|
+
.min-w-\[261px\] {
|
|
592
|
+
min-width: 261px;
|
|
593
|
+
}
|
|
591
594
|
.min-w-\[400px\] {
|
|
592
595
|
min-width: 400px;
|
|
593
596
|
}
|
|
@@ -1001,6 +1004,9 @@
|
|
|
1001
1004
|
.px-3 {
|
|
1002
1005
|
padding-inline: calc(var(--spacing) * 3);
|
|
1003
1006
|
}
|
|
1007
|
+
.px-4 {
|
|
1008
|
+
padding-inline: calc(var(--spacing) * 4);
|
|
1009
|
+
}
|
|
1004
1010
|
.px-6 {
|
|
1005
1011
|
padding-inline: calc(var(--spacing) * 6);
|
|
1006
1012
|
}
|
|
@@ -1034,6 +1040,9 @@
|
|
|
1034
1040
|
.py-\[10px\] {
|
|
1035
1041
|
padding-block: 10px;
|
|
1036
1042
|
}
|
|
1043
|
+
.pt-2 {
|
|
1044
|
+
padding-top: calc(var(--spacing) * 2);
|
|
1045
|
+
}
|
|
1037
1046
|
.pb-2 {
|
|
1038
1047
|
padding-bottom: calc(var(--spacing) * 2);
|
|
1039
1048
|
}
|
package/dist/index.d.mts
CHANGED
|
@@ -7,6 +7,7 @@ import { InputNumberProps, SelectProps } from 'antd';
|
|
|
7
7
|
import { Color } from 'antd/es/color-picker';
|
|
8
8
|
import { MessageInstance } from 'antd/es/message/interface';
|
|
9
9
|
import { ItemType } from 'antd/es/breadcrumb/Breadcrumb';
|
|
10
|
+
import { ReactNode as ReactNode$1 } from '@tabler/icons-react';
|
|
10
11
|
|
|
11
12
|
type ColorScale = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
|
|
12
13
|
type BaseColor = "primary" | "gray" | "green" | "red" | "yellow" | "blue";
|
|
@@ -542,4 +543,37 @@ declare const FilterPopUp: (filter: {
|
|
|
542
543
|
handleSearch: (listFiler: string[]) => void;
|
|
543
544
|
}) => react_jsx_runtime.JSX.Element;
|
|
544
545
|
|
|
545
|
-
|
|
546
|
+
interface UserData {
|
|
547
|
+
id: string;
|
|
548
|
+
name: string;
|
|
549
|
+
profile: string;
|
|
550
|
+
}
|
|
551
|
+
interface ProfileSelectProp {
|
|
552
|
+
allUser: UserData[];
|
|
553
|
+
assignUser: UserData[];
|
|
554
|
+
mode: "show" | "showAssign" | "icon";
|
|
555
|
+
onUpdateAssignUser: (user: UserData, action?: "add" | "remove") => void;
|
|
556
|
+
}
|
|
557
|
+
declare function ProfileSelect({ allUser, assignUser, mode, onUpdateAssignUser, }: ProfileSelectProp): react_jsx_runtime.JSX.Element;
|
|
558
|
+
|
|
559
|
+
interface QRCodeGeneratorProps {
|
|
560
|
+
url: string;
|
|
561
|
+
previewSize?: number;
|
|
562
|
+
defaultExportSize?: number;
|
|
563
|
+
fileBaseName?: string;
|
|
564
|
+
}
|
|
565
|
+
declare const QRCodeGenerator: react.FC<QRCodeGeneratorProps>;
|
|
566
|
+
|
|
567
|
+
interface TabProjectProp {
|
|
568
|
+
tabOption: {
|
|
569
|
+
key: string;
|
|
570
|
+
label: string;
|
|
571
|
+
icon: ReactNode$1;
|
|
572
|
+
}[];
|
|
573
|
+
projectId: string;
|
|
574
|
+
now: string;
|
|
575
|
+
onChange: (key: string) => void;
|
|
576
|
+
}
|
|
577
|
+
declare function TabProject({ tabOption, now, onChange }: TabProjectProp): react_jsx_runtime.JSX.Element;
|
|
578
|
+
|
|
579
|
+
export { AntDModal, AntDataTable, Breadcrumbs, Calendar, Checkbox, CheckboxGroup, ColorPalettePickerBasic, ColorPickerBasic, DataTable, DatePickerBasic, DatePickerRange, FileUploader, FilterPopUp, GhostButton, HeadingPage, Indicator, InputField, InputFieldNumber, KpiSection, Loader, MenuNavBar, type MenuNavBarProps, PrimaryButton, ProfileSelect, ProgressBar, QRCodeGenerator, Radio, RadioGroup, SecondaryButton, SelectCustom, SelectField, SelectFieldGroup, SelectFieldStatus, SelectFieldStatusReport, SelectFieldTag, Sidebar, SortFilter, Switch, SwitchSelect, TabProject, TabSelectionButton, TextAreaInput, TextInput, TopNavBar, messageError, messageInfo, messageLoading, messageSuccess, messageWarning, setMessageApi };
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { InputNumberProps, SelectProps } from 'antd';
|
|
|
7
7
|
import { Color } from 'antd/es/color-picker';
|
|
8
8
|
import { MessageInstance } from 'antd/es/message/interface';
|
|
9
9
|
import { ItemType } from 'antd/es/breadcrumb/Breadcrumb';
|
|
10
|
+
import { ReactNode as ReactNode$1 } from '@tabler/icons-react';
|
|
10
11
|
|
|
11
12
|
type ColorScale = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
|
|
12
13
|
type BaseColor = "primary" | "gray" | "green" | "red" | "yellow" | "blue";
|
|
@@ -542,4 +543,37 @@ declare const FilterPopUp: (filter: {
|
|
|
542
543
|
handleSearch: (listFiler: string[]) => void;
|
|
543
544
|
}) => react_jsx_runtime.JSX.Element;
|
|
544
545
|
|
|
545
|
-
|
|
546
|
+
interface UserData {
|
|
547
|
+
id: string;
|
|
548
|
+
name: string;
|
|
549
|
+
profile: string;
|
|
550
|
+
}
|
|
551
|
+
interface ProfileSelectProp {
|
|
552
|
+
allUser: UserData[];
|
|
553
|
+
assignUser: UserData[];
|
|
554
|
+
mode: "show" | "showAssign" | "icon";
|
|
555
|
+
onUpdateAssignUser: (user: UserData, action?: "add" | "remove") => void;
|
|
556
|
+
}
|
|
557
|
+
declare function ProfileSelect({ allUser, assignUser, mode, onUpdateAssignUser, }: ProfileSelectProp): react_jsx_runtime.JSX.Element;
|
|
558
|
+
|
|
559
|
+
interface QRCodeGeneratorProps {
|
|
560
|
+
url: string;
|
|
561
|
+
previewSize?: number;
|
|
562
|
+
defaultExportSize?: number;
|
|
563
|
+
fileBaseName?: string;
|
|
564
|
+
}
|
|
565
|
+
declare const QRCodeGenerator: react.FC<QRCodeGeneratorProps>;
|
|
566
|
+
|
|
567
|
+
interface TabProjectProp {
|
|
568
|
+
tabOption: {
|
|
569
|
+
key: string;
|
|
570
|
+
label: string;
|
|
571
|
+
icon: ReactNode$1;
|
|
572
|
+
}[];
|
|
573
|
+
projectId: string;
|
|
574
|
+
now: string;
|
|
575
|
+
onChange: (key: string) => void;
|
|
576
|
+
}
|
|
577
|
+
declare function TabProject({ tabOption, now, onChange }: TabProjectProp): react_jsx_runtime.JSX.Element;
|
|
578
|
+
|
|
579
|
+
export { AntDModal, AntDataTable, Breadcrumbs, Calendar, Checkbox, CheckboxGroup, ColorPalettePickerBasic, ColorPickerBasic, DataTable, DatePickerBasic, DatePickerRange, FileUploader, FilterPopUp, GhostButton, HeadingPage, Indicator, InputField, InputFieldNumber, KpiSection, Loader, MenuNavBar, type MenuNavBarProps, PrimaryButton, ProfileSelect, ProgressBar, QRCodeGenerator, Radio, RadioGroup, SecondaryButton, SelectCustom, SelectField, SelectFieldGroup, SelectFieldStatus, SelectFieldStatusReport, SelectFieldTag, Sidebar, SortFilter, Switch, SwitchSelect, TabProject, TabSelectionButton, TextAreaInput, TextInput, TopNavBar, messageError, messageInfo, messageLoading, messageSuccess, messageWarning, setMessageApi };
|
package/dist/index.js
CHANGED
|
@@ -377,7 +377,9 @@ __export(index_exports, {
|
|
|
377
377
|
Loader: () => Loader,
|
|
378
378
|
MenuNavBar: () => MenuNavBar,
|
|
379
379
|
PrimaryButton: () => PrimaryButton,
|
|
380
|
+
ProfileSelect: () => ProfileSelect,
|
|
380
381
|
ProgressBar: () => ProgressBar,
|
|
382
|
+
QRCodeGenerator: () => QRCodeGenerator,
|
|
381
383
|
Radio: () => Radio,
|
|
382
384
|
RadioGroup: () => RadioGroup,
|
|
383
385
|
SecondaryButton: () => SecondaryButton,
|
|
@@ -391,6 +393,7 @@ __export(index_exports, {
|
|
|
391
393
|
SortFilter: () => SortFilter,
|
|
392
394
|
Switch: () => Switch,
|
|
393
395
|
SwitchSelect: () => SwitchSelect,
|
|
396
|
+
TabProject: () => TabProject,
|
|
394
397
|
TabSelectionButton: () => TabSelectionButton,
|
|
395
398
|
TextAreaInput: () => TextAreaInput,
|
|
396
399
|
TextInput: () => TextInput,
|
|
@@ -3962,6 +3965,406 @@ var FilterPopUp = (filter) => {
|
|
|
3962
3965
|
] }) : void 0
|
|
3963
3966
|
] });
|
|
3964
3967
|
};
|
|
3968
|
+
|
|
3969
|
+
// src/ProfileSelect/ProfileSelect/ProfileSelect.tsx
|
|
3970
|
+
var import_react19 = require("react");
|
|
3971
|
+
var import_icons_react14 = require("@tabler/icons-react");
|
|
3972
|
+
var import_antd21 = require("antd");
|
|
3973
|
+
var import_jsx_runtime42 = require("react/jsx-runtime");
|
|
3974
|
+
function ProfileSelect({
|
|
3975
|
+
allUser,
|
|
3976
|
+
assignUser,
|
|
3977
|
+
mode,
|
|
3978
|
+
onUpdateAssignUser
|
|
3979
|
+
}) {
|
|
3980
|
+
const [maxVisible, setMaxVisible] = (0, import_react19.useState)(4);
|
|
3981
|
+
const [userNotAssign, setUserNotAssign] = (0, import_react19.useState)([]);
|
|
3982
|
+
const [search, setSearch] = (0, import_react19.useState)("");
|
|
3983
|
+
const [isShowSelect, setIsShowSelect] = (0, import_react19.useState)(false);
|
|
3984
|
+
const containerRef = (0, import_react19.useRef)(null);
|
|
3985
|
+
const selectRef = (0, import_react19.useRef)(null);
|
|
3986
|
+
const avatarSize = 30;
|
|
3987
|
+
const spacing = 8;
|
|
3988
|
+
(0, import_react19.useEffect)(() => {
|
|
3989
|
+
const handler = (e) => {
|
|
3990
|
+
if (!selectRef?.current?.contains(e.target) && !containerRef?.current?.contains(e.target)) {
|
|
3991
|
+
setIsShowSelect(false);
|
|
3992
|
+
}
|
|
3993
|
+
};
|
|
3994
|
+
document.addEventListener("mousedown", handler);
|
|
3995
|
+
return () => {
|
|
3996
|
+
document.removeEventListener("mousedown", handler);
|
|
3997
|
+
};
|
|
3998
|
+
}, []);
|
|
3999
|
+
(0, import_react19.useEffect)(() => {
|
|
4000
|
+
if (!containerRef.current) return;
|
|
4001
|
+
const updateWidth = () => {
|
|
4002
|
+
if (containerRef.current) {
|
|
4003
|
+
const rect = containerRef.current.getBoundingClientRect();
|
|
4004
|
+
const count = Math.floor(rect.width / (avatarSize + spacing));
|
|
4005
|
+
setMaxVisible(Math.max(1, count));
|
|
4006
|
+
}
|
|
4007
|
+
};
|
|
4008
|
+
const resizeObserver = new ResizeObserver(updateWidth);
|
|
4009
|
+
resizeObserver.observe(containerRef.current);
|
|
4010
|
+
updateWidth();
|
|
4011
|
+
return () => {
|
|
4012
|
+
resizeObserver.disconnect();
|
|
4013
|
+
};
|
|
4014
|
+
}, [allUser]);
|
|
4015
|
+
(0, import_react19.useEffect)(() => {
|
|
4016
|
+
setUserNotAssign(
|
|
4017
|
+
allUser.filter((u) => !assignUser.some((au) => au.id === u.id))
|
|
4018
|
+
);
|
|
4019
|
+
}, [allUser, assignUser]);
|
|
4020
|
+
const showPlus = assignUser.length > maxVisible;
|
|
4021
|
+
const visibleUsers = showPlus ? assignUser.slice(0, maxVisible - 1) : assignUser;
|
|
4022
|
+
const extraCount = assignUser.length - (maxVisible - 1);
|
|
4023
|
+
const normalizedSearch = search.trim().toLowerCase();
|
|
4024
|
+
const filteredAssigned = normalizedSearch ? assignUser.filter(
|
|
4025
|
+
(u) => u.name.toLowerCase().includes(normalizedSearch)
|
|
4026
|
+
) : assignUser;
|
|
4027
|
+
const filteredUnassigned = normalizedSearch ? userNotAssign.filter(
|
|
4028
|
+
(u) => u.name.toLowerCase().includes(normalizedSearch)
|
|
4029
|
+
) : userNotAssign;
|
|
4030
|
+
return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { ref: containerRef, className: "relative body-1", children: [
|
|
4031
|
+
mode === "icon" ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("button", { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4032
|
+
import_icons_react14.IconUsers,
|
|
4033
|
+
{
|
|
4034
|
+
size: 40,
|
|
4035
|
+
className: "p-2 border rounded cursor-pointer",
|
|
4036
|
+
onClick: () => setIsShowSelect(!isShowSelect)
|
|
4037
|
+
}
|
|
4038
|
+
) }) : mode === "showAssign" ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
|
|
4039
|
+
"button",
|
|
4040
|
+
{
|
|
4041
|
+
className: "w-full h-[40px] flex -space-x-2 p-2 border-1 rounded-sm",
|
|
4042
|
+
onClick: () => setIsShowSelect(!isShowSelect),
|
|
4043
|
+
children: [
|
|
4044
|
+
visibleUsers.map((user) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "flex items-center cursor-point", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("label", { className: "relative group cursor-pointer", children: [
|
|
4045
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4046
|
+
"img",
|
|
4047
|
+
{
|
|
4048
|
+
src: user.profile,
|
|
4049
|
+
alt: user.name,
|
|
4050
|
+
style: {
|
|
4051
|
+
width: avatarSize,
|
|
4052
|
+
height: avatarSize,
|
|
4053
|
+
borderRadius: "50%"
|
|
4054
|
+
},
|
|
4055
|
+
className: "border border-white group-hover:border-2 group-hover:border-red-500 transition"
|
|
4056
|
+
}
|
|
4057
|
+
),
|
|
4058
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4059
|
+
"span",
|
|
4060
|
+
{
|
|
4061
|
+
className: "absolute top-0 right-0 -translate-y-2 translate-x-2 \r\n rounded-full bg-white opacity-0 group-hover:opacity-100 \r\n border-2 border-red-500 flex items-center justify-center transition",
|
|
4062
|
+
onClick: () => onUpdateAssignUser(user, "remove"),
|
|
4063
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_icons_react14.IconX, { className: "w-4 h-4 text-red-500" })
|
|
4064
|
+
}
|
|
4065
|
+
)
|
|
4066
|
+
] }) }, user.id)),
|
|
4067
|
+
showPlus && /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
|
|
4068
|
+
"div",
|
|
4069
|
+
{
|
|
4070
|
+
className: "border border-white flex items-center justify-center bg-gray-300 text-black text-sm",
|
|
4071
|
+
style: {
|
|
4072
|
+
width: avatarSize,
|
|
4073
|
+
height: avatarSize,
|
|
4074
|
+
borderRadius: "50%"
|
|
4075
|
+
},
|
|
4076
|
+
children: [
|
|
4077
|
+
"+",
|
|
4078
|
+
extraCount
|
|
4079
|
+
]
|
|
4080
|
+
}
|
|
4081
|
+
)
|
|
4082
|
+
]
|
|
4083
|
+
}
|
|
4084
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "w-full h-[40px] flex -space-x-2 p-2 border-1 rounded-sm", children: [
|
|
4085
|
+
visibleUsers.map((user) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "flex items-center ", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("label", { className: "relative group ", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4086
|
+
"img",
|
|
4087
|
+
{
|
|
4088
|
+
src: user.profile,
|
|
4089
|
+
alt: user.name,
|
|
4090
|
+
style: {
|
|
4091
|
+
width: avatarSize,
|
|
4092
|
+
height: avatarSize,
|
|
4093
|
+
borderRadius: "50%"
|
|
4094
|
+
},
|
|
4095
|
+
className: "border border-white transition"
|
|
4096
|
+
}
|
|
4097
|
+
) }) }, user.id)),
|
|
4098
|
+
showPlus && /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
|
|
4099
|
+
"div",
|
|
4100
|
+
{
|
|
4101
|
+
className: "border border-white flex items-center justify-center bg-gray-300 text-black text-sm",
|
|
4102
|
+
style: {
|
|
4103
|
+
width: avatarSize,
|
|
4104
|
+
height: avatarSize,
|
|
4105
|
+
borderRadius: "50%"
|
|
4106
|
+
},
|
|
4107
|
+
children: [
|
|
4108
|
+
"+",
|
|
4109
|
+
extraCount
|
|
4110
|
+
]
|
|
4111
|
+
}
|
|
4112
|
+
)
|
|
4113
|
+
] }),
|
|
4114
|
+
isShowSelect ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
|
|
4115
|
+
"div",
|
|
4116
|
+
{
|
|
4117
|
+
className: "absolute top-12 min-w-[261px] max-w-[400px] w-full h-[314px] p-2 text-xs border-1 rounded-sm ",
|
|
4118
|
+
ref: selectRef,
|
|
4119
|
+
children: [
|
|
4120
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "flex border-1 rounded-md p-2 gap-2 items-center", children: [
|
|
4121
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_icons_react14.IconSearch, {}),
|
|
4122
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4123
|
+
import_antd21.Input,
|
|
4124
|
+
{
|
|
4125
|
+
variant: "borderless",
|
|
4126
|
+
placeholder: "\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E0A\u0E37\u0E48\u0E2D",
|
|
4127
|
+
className: "body-3",
|
|
4128
|
+
value: search,
|
|
4129
|
+
onChange: (e) => setSearch(e.target.value)
|
|
4130
|
+
}
|
|
4131
|
+
)
|
|
4132
|
+
] }),
|
|
4133
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "overflow-y-auto h-[250px] pt-2 px-4 body-3", children: [
|
|
4134
|
+
filteredAssigned.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
|
|
4135
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { children: "\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E17\u0E35\u0E48\u0E40\u0E25\u0E37\u0E2D\u0E01" }),
|
|
4136
|
+
filteredAssigned.map((user) => /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
|
|
4137
|
+
"button",
|
|
4138
|
+
{
|
|
4139
|
+
className: "flex items-center group my-1 w-full p-1 rounded hover:bg-gray-100",
|
|
4140
|
+
onClick: () => onUpdateAssignUser(user, "remove"),
|
|
4141
|
+
children: [
|
|
4142
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("label", { className: "relative cursor-pointer", children: [
|
|
4143
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4144
|
+
"img",
|
|
4145
|
+
{
|
|
4146
|
+
src: user.profile,
|
|
4147
|
+
alt: user.name,
|
|
4148
|
+
style: {
|
|
4149
|
+
width: avatarSize,
|
|
4150
|
+
height: avatarSize,
|
|
4151
|
+
borderRadius: "50%"
|
|
4152
|
+
},
|
|
4153
|
+
className: "border-2 border-red-500"
|
|
4154
|
+
}
|
|
4155
|
+
),
|
|
4156
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4157
|
+
"span",
|
|
4158
|
+
{
|
|
4159
|
+
className: "absolute top-0 right-0 -translate-y-2 translate-x-2 \r\n rounded-full bg-white opacity-0 group-hover:opacity-100 \r\n border-2 border-red-500 flex items-center justify-center transition",
|
|
4160
|
+
onClick: () => onUpdateAssignUser(user, "remove"),
|
|
4161
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_icons_react14.IconX, { className: "text-red-500", size: 15 })
|
|
4162
|
+
}
|
|
4163
|
+
)
|
|
4164
|
+
] }),
|
|
4165
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "ml-2", children: user.name })
|
|
4166
|
+
]
|
|
4167
|
+
},
|
|
4168
|
+
user.id
|
|
4169
|
+
))
|
|
4170
|
+
] }),
|
|
4171
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { children: "\u0E1C\u0E39\u0E49\u0E04\u0E19 " }),
|
|
4172
|
+
filteredUnassigned.map((user) => /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
|
|
4173
|
+
"button",
|
|
4174
|
+
{
|
|
4175
|
+
className: "flex items-center my-1 hover:bg-gray-100 w-full p-1 rounded",
|
|
4176
|
+
onClick: () => onUpdateAssignUser(user),
|
|
4177
|
+
children: [
|
|
4178
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4179
|
+
"img",
|
|
4180
|
+
{
|
|
4181
|
+
src: user.profile,
|
|
4182
|
+
alt: user.name,
|
|
4183
|
+
style: {
|
|
4184
|
+
width: avatarSize,
|
|
4185
|
+
height: avatarSize,
|
|
4186
|
+
borderRadius: "50%"
|
|
4187
|
+
},
|
|
4188
|
+
className: "border "
|
|
4189
|
+
}
|
|
4190
|
+
),
|
|
4191
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "ml-2", children: user.name })
|
|
4192
|
+
]
|
|
4193
|
+
},
|
|
4194
|
+
user.id
|
|
4195
|
+
))
|
|
4196
|
+
] })
|
|
4197
|
+
]
|
|
4198
|
+
}
|
|
4199
|
+
) : null
|
|
4200
|
+
] });
|
|
4201
|
+
}
|
|
4202
|
+
|
|
4203
|
+
// src/Button/QRCode/QRCode.tsx
|
|
4204
|
+
var import_react20 = require("react");
|
|
4205
|
+
var import_qrcode = __toESM(require("qrcode"));
|
|
4206
|
+
var import_jsx_runtime43 = require("react/jsx-runtime");
|
|
4207
|
+
var QRCodeGenerator = ({
|
|
4208
|
+
url,
|
|
4209
|
+
previewSize = 200,
|
|
4210
|
+
defaultExportSize = 512,
|
|
4211
|
+
fileBaseName = "qr-code"
|
|
4212
|
+
}) => {
|
|
4213
|
+
const canvasRef = (0, import_react20.useRef)(null);
|
|
4214
|
+
const [format3, setFormat] = (0, import_react20.useState)("png");
|
|
4215
|
+
const [exportSize, setExportSize] = (0, import_react20.useState)(defaultExportSize);
|
|
4216
|
+
const sizeOption = [
|
|
4217
|
+
{
|
|
4218
|
+
label: "64 x 64",
|
|
4219
|
+
value: "64"
|
|
4220
|
+
},
|
|
4221
|
+
{
|
|
4222
|
+
label: "128 x 128",
|
|
4223
|
+
value: "128"
|
|
4224
|
+
},
|
|
4225
|
+
{
|
|
4226
|
+
label: "256 x 256",
|
|
4227
|
+
value: "256"
|
|
4228
|
+
},
|
|
4229
|
+
{
|
|
4230
|
+
label: "512 x 512",
|
|
4231
|
+
value: "512"
|
|
4232
|
+
},
|
|
4233
|
+
{
|
|
4234
|
+
label: "1024 x 1024",
|
|
4235
|
+
value: "1024"
|
|
4236
|
+
},
|
|
4237
|
+
{
|
|
4238
|
+
label: "2048 x 2048",
|
|
4239
|
+
value: "2048"
|
|
4240
|
+
},
|
|
4241
|
+
{
|
|
4242
|
+
label: "4096 x 4096",
|
|
4243
|
+
value: "4096"
|
|
4244
|
+
}
|
|
4245
|
+
];
|
|
4246
|
+
const typeOption = [
|
|
4247
|
+
{
|
|
4248
|
+
label: "PNG",
|
|
4249
|
+
value: "png"
|
|
4250
|
+
},
|
|
4251
|
+
{
|
|
4252
|
+
label: "SVG",
|
|
4253
|
+
value: "svg"
|
|
4254
|
+
},
|
|
4255
|
+
{
|
|
4256
|
+
label: "JPEG",
|
|
4257
|
+
value: "jpeg"
|
|
4258
|
+
}
|
|
4259
|
+
];
|
|
4260
|
+
(0, import_react20.useEffect)(() => {
|
|
4261
|
+
if (!canvasRef.current) return;
|
|
4262
|
+
import_qrcode.default.toCanvas(canvasRef.current, url, { width: previewSize, margin: 1 }, (error) => {
|
|
4263
|
+
if (error) console.error(error);
|
|
4264
|
+
});
|
|
4265
|
+
}, [url, previewSize]);
|
|
4266
|
+
const download = async () => {
|
|
4267
|
+
try {
|
|
4268
|
+
if (format3 === "svg") {
|
|
4269
|
+
const svgString = await import_qrcode.default.toString(url, {
|
|
4270
|
+
type: "svg",
|
|
4271
|
+
width: exportSize,
|
|
4272
|
+
margin: 1
|
|
4273
|
+
});
|
|
4274
|
+
const blob = new Blob([svgString], { type: "image/svg+xml" });
|
|
4275
|
+
const objUrl = URL.createObjectURL(blob);
|
|
4276
|
+
triggerDownload(objUrl, `${fileBaseName}.svg`);
|
|
4277
|
+
URL.revokeObjectURL(objUrl);
|
|
4278
|
+
} else {
|
|
4279
|
+
const offscreen = document.createElement("canvas");
|
|
4280
|
+
await import_qrcode.default.toCanvas(offscreen, url, {
|
|
4281
|
+
width: exportSize,
|
|
4282
|
+
margin: 1
|
|
4283
|
+
});
|
|
4284
|
+
const mime = format3 === "png" ? "image/png" : "image/jpeg";
|
|
4285
|
+
const dataURL = format3 === "jpeg" ? offscreen.toDataURL(mime, 0.92) : offscreen.toDataURL(mime);
|
|
4286
|
+
triggerDownload(dataURL, `${fileBaseName}.${format3}`);
|
|
4287
|
+
}
|
|
4288
|
+
} catch (err) {
|
|
4289
|
+
console.error("Failed to generate QR export:", err);
|
|
4290
|
+
alert("Sorry, something went wrong creating the download.");
|
|
4291
|
+
}
|
|
4292
|
+
};
|
|
4293
|
+
const triggerDownload = (href, filename) => {
|
|
4294
|
+
const a = document.createElement("a");
|
|
4295
|
+
a.href = href;
|
|
4296
|
+
a.download = filename;
|
|
4297
|
+
document.body.appendChild(a);
|
|
4298
|
+
a.click();
|
|
4299
|
+
a.remove();
|
|
4300
|
+
};
|
|
4301
|
+
return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("div", { style: { display: "inline-flex", flexDirection: "column", gap: 8 }, className: "justify-center items-center", children: [
|
|
4302
|
+
url === "" ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: "border-1 p-2 mb-2", style: { width: `${previewSize}px`, height: `${previewSize}px` } }) : /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("canvas", { ref: canvasRef, className: "border-1 p-2 mb-2" }),
|
|
4303
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
|
|
4304
|
+
"div",
|
|
4305
|
+
{
|
|
4306
|
+
style: {
|
|
4307
|
+
display: "flex",
|
|
4308
|
+
gap: 8,
|
|
4309
|
+
alignItems: "center",
|
|
4310
|
+
flexWrap: "wrap"
|
|
4311
|
+
},
|
|
4312
|
+
className: "flex-col",
|
|
4313
|
+
children: [
|
|
4314
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("div", { className: "flex gap-2 mx-2", children: [
|
|
4315
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsx)("label", { className: "border-1 p-2 rounded-md flex flex-col w-1/2 text-sm text-gray-400", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
|
|
4316
|
+
SelectField,
|
|
4317
|
+
{
|
|
4318
|
+
label: "\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A",
|
|
4319
|
+
value: format3,
|
|
4320
|
+
onChange: (e) => setFormat(e.target.value),
|
|
4321
|
+
options: typeOption
|
|
4322
|
+
}
|
|
4323
|
+
) }),
|
|
4324
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsx)("label", { className: "border-1 p-2 rounded-md flex flex-col w-1/2 text-sm text-gray-400", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
|
|
4325
|
+
SelectField,
|
|
4326
|
+
{
|
|
4327
|
+
label: "\u0E02\u0E19\u0E32\u0E14 (px)",
|
|
4328
|
+
value: exportSize,
|
|
4329
|
+
onChange: (e) => setExportSize(Number(e.target.value)),
|
|
4330
|
+
options: sizeOption
|
|
4331
|
+
}
|
|
4332
|
+
) })
|
|
4333
|
+
] }),
|
|
4334
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsx)(PrimaryButton, { onClick: download, disabled: url === "", textColor: "white", title: "\u0E14\u0E32\u0E27\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E2B\u0E31\u0E2A QR" })
|
|
4335
|
+
]
|
|
4336
|
+
}
|
|
4337
|
+
)
|
|
4338
|
+
] });
|
|
4339
|
+
};
|
|
4340
|
+
|
|
4341
|
+
// src/TabPropject/Tabproject/TabProject.tsx
|
|
4342
|
+
var import_antd22 = require("antd");
|
|
4343
|
+
var import_jsx_runtime44 = require("react/jsx-runtime");
|
|
4344
|
+
function TabProject({ tabOption, now, onChange }) {
|
|
4345
|
+
return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
|
|
4346
|
+
import_antd22.Tabs,
|
|
4347
|
+
{
|
|
4348
|
+
activeKey: now,
|
|
4349
|
+
items: tabOption.map((item, i) => {
|
|
4350
|
+
return {
|
|
4351
|
+
key: item.key,
|
|
4352
|
+
label: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
|
|
4353
|
+
"button",
|
|
4354
|
+
{
|
|
4355
|
+
className: "tab-label flex gap-2 items-center body-1",
|
|
4356
|
+
onClick: () => onChange(item.key),
|
|
4357
|
+
children: [
|
|
4358
|
+
item.icon,
|
|
4359
|
+
/* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { children: item.label })
|
|
4360
|
+
]
|
|
4361
|
+
}
|
|
4362
|
+
)
|
|
4363
|
+
};
|
|
4364
|
+
})
|
|
4365
|
+
}
|
|
4366
|
+
);
|
|
4367
|
+
}
|
|
3965
4368
|
// Annotate the CommonJS export names for ESM import in node:
|
|
3966
4369
|
0 && (module.exports = {
|
|
3967
4370
|
AntDModal,
|
|
@@ -3986,7 +4389,9 @@ var FilterPopUp = (filter) => {
|
|
|
3986
4389
|
Loader,
|
|
3987
4390
|
MenuNavBar,
|
|
3988
4391
|
PrimaryButton,
|
|
4392
|
+
ProfileSelect,
|
|
3989
4393
|
ProgressBar,
|
|
4394
|
+
QRCodeGenerator,
|
|
3990
4395
|
Radio,
|
|
3991
4396
|
RadioGroup,
|
|
3992
4397
|
SecondaryButton,
|
|
@@ -4000,6 +4405,7 @@ var FilterPopUp = (filter) => {
|
|
|
4000
4405
|
SortFilter,
|
|
4001
4406
|
Switch,
|
|
4002
4407
|
SwitchSelect,
|
|
4408
|
+
TabProject,
|
|
4003
4409
|
TabSelectionButton,
|
|
4004
4410
|
TextAreaInput,
|
|
4005
4411
|
TextInput,
|
package/dist/index.mjs
CHANGED
|
@@ -3904,6 +3904,406 @@ var FilterPopUp = (filter) => {
|
|
|
3904
3904
|
] }) : void 0
|
|
3905
3905
|
] });
|
|
3906
3906
|
};
|
|
3907
|
+
|
|
3908
|
+
// src/ProfileSelect/ProfileSelect/ProfileSelect.tsx
|
|
3909
|
+
import { useEffect as useEffect7, useRef as useRef6, useState as useState17 } from "react";
|
|
3910
|
+
import { IconSearch, IconUsers, IconX as IconX4 } from "@tabler/icons-react";
|
|
3911
|
+
import { Input as Input5 } from "antd";
|
|
3912
|
+
import { Fragment as Fragment8, jsx as jsx42, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
3913
|
+
function ProfileSelect({
|
|
3914
|
+
allUser,
|
|
3915
|
+
assignUser,
|
|
3916
|
+
mode,
|
|
3917
|
+
onUpdateAssignUser
|
|
3918
|
+
}) {
|
|
3919
|
+
const [maxVisible, setMaxVisible] = useState17(4);
|
|
3920
|
+
const [userNotAssign, setUserNotAssign] = useState17([]);
|
|
3921
|
+
const [search, setSearch] = useState17("");
|
|
3922
|
+
const [isShowSelect, setIsShowSelect] = useState17(false);
|
|
3923
|
+
const containerRef = useRef6(null);
|
|
3924
|
+
const selectRef = useRef6(null);
|
|
3925
|
+
const avatarSize = 30;
|
|
3926
|
+
const spacing = 8;
|
|
3927
|
+
useEffect7(() => {
|
|
3928
|
+
const handler = (e) => {
|
|
3929
|
+
if (!selectRef?.current?.contains(e.target) && !containerRef?.current?.contains(e.target)) {
|
|
3930
|
+
setIsShowSelect(false);
|
|
3931
|
+
}
|
|
3932
|
+
};
|
|
3933
|
+
document.addEventListener("mousedown", handler);
|
|
3934
|
+
return () => {
|
|
3935
|
+
document.removeEventListener("mousedown", handler);
|
|
3936
|
+
};
|
|
3937
|
+
}, []);
|
|
3938
|
+
useEffect7(() => {
|
|
3939
|
+
if (!containerRef.current) return;
|
|
3940
|
+
const updateWidth = () => {
|
|
3941
|
+
if (containerRef.current) {
|
|
3942
|
+
const rect = containerRef.current.getBoundingClientRect();
|
|
3943
|
+
const count = Math.floor(rect.width / (avatarSize + spacing));
|
|
3944
|
+
setMaxVisible(Math.max(1, count));
|
|
3945
|
+
}
|
|
3946
|
+
};
|
|
3947
|
+
const resizeObserver = new ResizeObserver(updateWidth);
|
|
3948
|
+
resizeObserver.observe(containerRef.current);
|
|
3949
|
+
updateWidth();
|
|
3950
|
+
return () => {
|
|
3951
|
+
resizeObserver.disconnect();
|
|
3952
|
+
};
|
|
3953
|
+
}, [allUser]);
|
|
3954
|
+
useEffect7(() => {
|
|
3955
|
+
setUserNotAssign(
|
|
3956
|
+
allUser.filter((u) => !assignUser.some((au) => au.id === u.id))
|
|
3957
|
+
);
|
|
3958
|
+
}, [allUser, assignUser]);
|
|
3959
|
+
const showPlus = assignUser.length > maxVisible;
|
|
3960
|
+
const visibleUsers = showPlus ? assignUser.slice(0, maxVisible - 1) : assignUser;
|
|
3961
|
+
const extraCount = assignUser.length - (maxVisible - 1);
|
|
3962
|
+
const normalizedSearch = search.trim().toLowerCase();
|
|
3963
|
+
const filteredAssigned = normalizedSearch ? assignUser.filter(
|
|
3964
|
+
(u) => u.name.toLowerCase().includes(normalizedSearch)
|
|
3965
|
+
) : assignUser;
|
|
3966
|
+
const filteredUnassigned = normalizedSearch ? userNotAssign.filter(
|
|
3967
|
+
(u) => u.name.toLowerCase().includes(normalizedSearch)
|
|
3968
|
+
) : userNotAssign;
|
|
3969
|
+
return /* @__PURE__ */ jsxs36("div", { ref: containerRef, className: "relative body-1", children: [
|
|
3970
|
+
mode === "icon" ? /* @__PURE__ */ jsx42("button", { children: /* @__PURE__ */ jsx42(
|
|
3971
|
+
IconUsers,
|
|
3972
|
+
{
|
|
3973
|
+
size: 40,
|
|
3974
|
+
className: "p-2 border rounded cursor-pointer",
|
|
3975
|
+
onClick: () => setIsShowSelect(!isShowSelect)
|
|
3976
|
+
}
|
|
3977
|
+
) }) : mode === "showAssign" ? /* @__PURE__ */ jsxs36(
|
|
3978
|
+
"button",
|
|
3979
|
+
{
|
|
3980
|
+
className: "w-full h-[40px] flex -space-x-2 p-2 border-1 rounded-sm",
|
|
3981
|
+
onClick: () => setIsShowSelect(!isShowSelect),
|
|
3982
|
+
children: [
|
|
3983
|
+
visibleUsers.map((user) => /* @__PURE__ */ jsx42("div", { className: "flex items-center cursor-point", children: /* @__PURE__ */ jsxs36("label", { className: "relative group cursor-pointer", children: [
|
|
3984
|
+
/* @__PURE__ */ jsx42(
|
|
3985
|
+
"img",
|
|
3986
|
+
{
|
|
3987
|
+
src: user.profile,
|
|
3988
|
+
alt: user.name,
|
|
3989
|
+
style: {
|
|
3990
|
+
width: avatarSize,
|
|
3991
|
+
height: avatarSize,
|
|
3992
|
+
borderRadius: "50%"
|
|
3993
|
+
},
|
|
3994
|
+
className: "border border-white group-hover:border-2 group-hover:border-red-500 transition"
|
|
3995
|
+
}
|
|
3996
|
+
),
|
|
3997
|
+
/* @__PURE__ */ jsx42(
|
|
3998
|
+
"span",
|
|
3999
|
+
{
|
|
4000
|
+
className: "absolute top-0 right-0 -translate-y-2 translate-x-2 \r\n rounded-full bg-white opacity-0 group-hover:opacity-100 \r\n border-2 border-red-500 flex items-center justify-center transition",
|
|
4001
|
+
onClick: () => onUpdateAssignUser(user, "remove"),
|
|
4002
|
+
children: /* @__PURE__ */ jsx42(IconX4, { className: "w-4 h-4 text-red-500" })
|
|
4003
|
+
}
|
|
4004
|
+
)
|
|
4005
|
+
] }) }, user.id)),
|
|
4006
|
+
showPlus && /* @__PURE__ */ jsxs36(
|
|
4007
|
+
"div",
|
|
4008
|
+
{
|
|
4009
|
+
className: "border border-white flex items-center justify-center bg-gray-300 text-black text-sm",
|
|
4010
|
+
style: {
|
|
4011
|
+
width: avatarSize,
|
|
4012
|
+
height: avatarSize,
|
|
4013
|
+
borderRadius: "50%"
|
|
4014
|
+
},
|
|
4015
|
+
children: [
|
|
4016
|
+
"+",
|
|
4017
|
+
extraCount
|
|
4018
|
+
]
|
|
4019
|
+
}
|
|
4020
|
+
)
|
|
4021
|
+
]
|
|
4022
|
+
}
|
|
4023
|
+
) : /* @__PURE__ */ jsxs36("div", { className: "w-full h-[40px] flex -space-x-2 p-2 border-1 rounded-sm", children: [
|
|
4024
|
+
visibleUsers.map((user) => /* @__PURE__ */ jsx42("div", { className: "flex items-center ", children: /* @__PURE__ */ jsx42("label", { className: "relative group ", children: /* @__PURE__ */ jsx42(
|
|
4025
|
+
"img",
|
|
4026
|
+
{
|
|
4027
|
+
src: user.profile,
|
|
4028
|
+
alt: user.name,
|
|
4029
|
+
style: {
|
|
4030
|
+
width: avatarSize,
|
|
4031
|
+
height: avatarSize,
|
|
4032
|
+
borderRadius: "50%"
|
|
4033
|
+
},
|
|
4034
|
+
className: "border border-white transition"
|
|
4035
|
+
}
|
|
4036
|
+
) }) }, user.id)),
|
|
4037
|
+
showPlus && /* @__PURE__ */ jsxs36(
|
|
4038
|
+
"div",
|
|
4039
|
+
{
|
|
4040
|
+
className: "border border-white flex items-center justify-center bg-gray-300 text-black text-sm",
|
|
4041
|
+
style: {
|
|
4042
|
+
width: avatarSize,
|
|
4043
|
+
height: avatarSize,
|
|
4044
|
+
borderRadius: "50%"
|
|
4045
|
+
},
|
|
4046
|
+
children: [
|
|
4047
|
+
"+",
|
|
4048
|
+
extraCount
|
|
4049
|
+
]
|
|
4050
|
+
}
|
|
4051
|
+
)
|
|
4052
|
+
] }),
|
|
4053
|
+
isShowSelect ? /* @__PURE__ */ jsxs36(
|
|
4054
|
+
"div",
|
|
4055
|
+
{
|
|
4056
|
+
className: "absolute top-12 min-w-[261px] max-w-[400px] w-full h-[314px] p-2 text-xs border-1 rounded-sm ",
|
|
4057
|
+
ref: selectRef,
|
|
4058
|
+
children: [
|
|
4059
|
+
/* @__PURE__ */ jsxs36("div", { className: "flex border-1 rounded-md p-2 gap-2 items-center", children: [
|
|
4060
|
+
/* @__PURE__ */ jsx42(IconSearch, {}),
|
|
4061
|
+
/* @__PURE__ */ jsx42(
|
|
4062
|
+
Input5,
|
|
4063
|
+
{
|
|
4064
|
+
variant: "borderless",
|
|
4065
|
+
placeholder: "\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E0A\u0E37\u0E48\u0E2D",
|
|
4066
|
+
className: "body-3",
|
|
4067
|
+
value: search,
|
|
4068
|
+
onChange: (e) => setSearch(e.target.value)
|
|
4069
|
+
}
|
|
4070
|
+
)
|
|
4071
|
+
] }),
|
|
4072
|
+
/* @__PURE__ */ jsxs36("div", { className: "overflow-y-auto h-[250px] pt-2 px-4 body-3", children: [
|
|
4073
|
+
filteredAssigned.length > 0 && /* @__PURE__ */ jsxs36(Fragment8, { children: [
|
|
4074
|
+
/* @__PURE__ */ jsx42("div", { children: "\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E17\u0E35\u0E48\u0E40\u0E25\u0E37\u0E2D\u0E01" }),
|
|
4075
|
+
filteredAssigned.map((user) => /* @__PURE__ */ jsxs36(
|
|
4076
|
+
"button",
|
|
4077
|
+
{
|
|
4078
|
+
className: "flex items-center group my-1 w-full p-1 rounded hover:bg-gray-100",
|
|
4079
|
+
onClick: () => onUpdateAssignUser(user, "remove"),
|
|
4080
|
+
children: [
|
|
4081
|
+
/* @__PURE__ */ jsxs36("label", { className: "relative cursor-pointer", children: [
|
|
4082
|
+
/* @__PURE__ */ jsx42(
|
|
4083
|
+
"img",
|
|
4084
|
+
{
|
|
4085
|
+
src: user.profile,
|
|
4086
|
+
alt: user.name,
|
|
4087
|
+
style: {
|
|
4088
|
+
width: avatarSize,
|
|
4089
|
+
height: avatarSize,
|
|
4090
|
+
borderRadius: "50%"
|
|
4091
|
+
},
|
|
4092
|
+
className: "border-2 border-red-500"
|
|
4093
|
+
}
|
|
4094
|
+
),
|
|
4095
|
+
/* @__PURE__ */ jsx42(
|
|
4096
|
+
"span",
|
|
4097
|
+
{
|
|
4098
|
+
className: "absolute top-0 right-0 -translate-y-2 translate-x-2 \r\n rounded-full bg-white opacity-0 group-hover:opacity-100 \r\n border-2 border-red-500 flex items-center justify-center transition",
|
|
4099
|
+
onClick: () => onUpdateAssignUser(user, "remove"),
|
|
4100
|
+
children: /* @__PURE__ */ jsx42(IconX4, { className: "text-red-500", size: 15 })
|
|
4101
|
+
}
|
|
4102
|
+
)
|
|
4103
|
+
] }),
|
|
4104
|
+
/* @__PURE__ */ jsx42("span", { className: "ml-2", children: user.name })
|
|
4105
|
+
]
|
|
4106
|
+
},
|
|
4107
|
+
user.id
|
|
4108
|
+
))
|
|
4109
|
+
] }),
|
|
4110
|
+
/* @__PURE__ */ jsx42("div", { children: "\u0E1C\u0E39\u0E49\u0E04\u0E19 " }),
|
|
4111
|
+
filteredUnassigned.map((user) => /* @__PURE__ */ jsxs36(
|
|
4112
|
+
"button",
|
|
4113
|
+
{
|
|
4114
|
+
className: "flex items-center my-1 hover:bg-gray-100 w-full p-1 rounded",
|
|
4115
|
+
onClick: () => onUpdateAssignUser(user),
|
|
4116
|
+
children: [
|
|
4117
|
+
/* @__PURE__ */ jsx42(
|
|
4118
|
+
"img",
|
|
4119
|
+
{
|
|
4120
|
+
src: user.profile,
|
|
4121
|
+
alt: user.name,
|
|
4122
|
+
style: {
|
|
4123
|
+
width: avatarSize,
|
|
4124
|
+
height: avatarSize,
|
|
4125
|
+
borderRadius: "50%"
|
|
4126
|
+
},
|
|
4127
|
+
className: "border "
|
|
4128
|
+
}
|
|
4129
|
+
),
|
|
4130
|
+
/* @__PURE__ */ jsx42("span", { className: "ml-2", children: user.name })
|
|
4131
|
+
]
|
|
4132
|
+
},
|
|
4133
|
+
user.id
|
|
4134
|
+
))
|
|
4135
|
+
] })
|
|
4136
|
+
]
|
|
4137
|
+
}
|
|
4138
|
+
) : null
|
|
4139
|
+
] });
|
|
4140
|
+
}
|
|
4141
|
+
|
|
4142
|
+
// src/Button/QRCode/QRCode.tsx
|
|
4143
|
+
import { useEffect as useEffect8, useRef as useRef7, useState as useState18 } from "react";
|
|
4144
|
+
import QRCode from "qrcode";
|
|
4145
|
+
import { jsx as jsx43, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
4146
|
+
var QRCodeGenerator = ({
|
|
4147
|
+
url,
|
|
4148
|
+
previewSize = 200,
|
|
4149
|
+
defaultExportSize = 512,
|
|
4150
|
+
fileBaseName = "qr-code"
|
|
4151
|
+
}) => {
|
|
4152
|
+
const canvasRef = useRef7(null);
|
|
4153
|
+
const [format3, setFormat] = useState18("png");
|
|
4154
|
+
const [exportSize, setExportSize] = useState18(defaultExportSize);
|
|
4155
|
+
const sizeOption = [
|
|
4156
|
+
{
|
|
4157
|
+
label: "64 x 64",
|
|
4158
|
+
value: "64"
|
|
4159
|
+
},
|
|
4160
|
+
{
|
|
4161
|
+
label: "128 x 128",
|
|
4162
|
+
value: "128"
|
|
4163
|
+
},
|
|
4164
|
+
{
|
|
4165
|
+
label: "256 x 256",
|
|
4166
|
+
value: "256"
|
|
4167
|
+
},
|
|
4168
|
+
{
|
|
4169
|
+
label: "512 x 512",
|
|
4170
|
+
value: "512"
|
|
4171
|
+
},
|
|
4172
|
+
{
|
|
4173
|
+
label: "1024 x 1024",
|
|
4174
|
+
value: "1024"
|
|
4175
|
+
},
|
|
4176
|
+
{
|
|
4177
|
+
label: "2048 x 2048",
|
|
4178
|
+
value: "2048"
|
|
4179
|
+
},
|
|
4180
|
+
{
|
|
4181
|
+
label: "4096 x 4096",
|
|
4182
|
+
value: "4096"
|
|
4183
|
+
}
|
|
4184
|
+
];
|
|
4185
|
+
const typeOption = [
|
|
4186
|
+
{
|
|
4187
|
+
label: "PNG",
|
|
4188
|
+
value: "png"
|
|
4189
|
+
},
|
|
4190
|
+
{
|
|
4191
|
+
label: "SVG",
|
|
4192
|
+
value: "svg"
|
|
4193
|
+
},
|
|
4194
|
+
{
|
|
4195
|
+
label: "JPEG",
|
|
4196
|
+
value: "jpeg"
|
|
4197
|
+
}
|
|
4198
|
+
];
|
|
4199
|
+
useEffect8(() => {
|
|
4200
|
+
if (!canvasRef.current) return;
|
|
4201
|
+
QRCode.toCanvas(canvasRef.current, url, { width: previewSize, margin: 1 }, (error) => {
|
|
4202
|
+
if (error) console.error(error);
|
|
4203
|
+
});
|
|
4204
|
+
}, [url, previewSize]);
|
|
4205
|
+
const download = async () => {
|
|
4206
|
+
try {
|
|
4207
|
+
if (format3 === "svg") {
|
|
4208
|
+
const svgString = await QRCode.toString(url, {
|
|
4209
|
+
type: "svg",
|
|
4210
|
+
width: exportSize,
|
|
4211
|
+
margin: 1
|
|
4212
|
+
});
|
|
4213
|
+
const blob = new Blob([svgString], { type: "image/svg+xml" });
|
|
4214
|
+
const objUrl = URL.createObjectURL(blob);
|
|
4215
|
+
triggerDownload(objUrl, `${fileBaseName}.svg`);
|
|
4216
|
+
URL.revokeObjectURL(objUrl);
|
|
4217
|
+
} else {
|
|
4218
|
+
const offscreen = document.createElement("canvas");
|
|
4219
|
+
await QRCode.toCanvas(offscreen, url, {
|
|
4220
|
+
width: exportSize,
|
|
4221
|
+
margin: 1
|
|
4222
|
+
});
|
|
4223
|
+
const mime = format3 === "png" ? "image/png" : "image/jpeg";
|
|
4224
|
+
const dataURL = format3 === "jpeg" ? offscreen.toDataURL(mime, 0.92) : offscreen.toDataURL(mime);
|
|
4225
|
+
triggerDownload(dataURL, `${fileBaseName}.${format3}`);
|
|
4226
|
+
}
|
|
4227
|
+
} catch (err) {
|
|
4228
|
+
console.error("Failed to generate QR export:", err);
|
|
4229
|
+
alert("Sorry, something went wrong creating the download.");
|
|
4230
|
+
}
|
|
4231
|
+
};
|
|
4232
|
+
const triggerDownload = (href, filename) => {
|
|
4233
|
+
const a = document.createElement("a");
|
|
4234
|
+
a.href = href;
|
|
4235
|
+
a.download = filename;
|
|
4236
|
+
document.body.appendChild(a);
|
|
4237
|
+
a.click();
|
|
4238
|
+
a.remove();
|
|
4239
|
+
};
|
|
4240
|
+
return /* @__PURE__ */ jsxs37("div", { style: { display: "inline-flex", flexDirection: "column", gap: 8 }, className: "justify-center items-center", children: [
|
|
4241
|
+
url === "" ? /* @__PURE__ */ jsx43("div", { className: "border-1 p-2 mb-2", style: { width: `${previewSize}px`, height: `${previewSize}px` } }) : /* @__PURE__ */ jsx43("canvas", { ref: canvasRef, className: "border-1 p-2 mb-2" }),
|
|
4242
|
+
/* @__PURE__ */ jsxs37(
|
|
4243
|
+
"div",
|
|
4244
|
+
{
|
|
4245
|
+
style: {
|
|
4246
|
+
display: "flex",
|
|
4247
|
+
gap: 8,
|
|
4248
|
+
alignItems: "center",
|
|
4249
|
+
flexWrap: "wrap"
|
|
4250
|
+
},
|
|
4251
|
+
className: "flex-col",
|
|
4252
|
+
children: [
|
|
4253
|
+
/* @__PURE__ */ jsxs37("div", { className: "flex gap-2 mx-2", children: [
|
|
4254
|
+
/* @__PURE__ */ jsx43("label", { className: "border-1 p-2 rounded-md flex flex-col w-1/2 text-sm text-gray-400", children: /* @__PURE__ */ jsx43(
|
|
4255
|
+
SelectField,
|
|
4256
|
+
{
|
|
4257
|
+
label: "\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A",
|
|
4258
|
+
value: format3,
|
|
4259
|
+
onChange: (e) => setFormat(e.target.value),
|
|
4260
|
+
options: typeOption
|
|
4261
|
+
}
|
|
4262
|
+
) }),
|
|
4263
|
+
/* @__PURE__ */ jsx43("label", { className: "border-1 p-2 rounded-md flex flex-col w-1/2 text-sm text-gray-400", children: /* @__PURE__ */ jsx43(
|
|
4264
|
+
SelectField,
|
|
4265
|
+
{
|
|
4266
|
+
label: "\u0E02\u0E19\u0E32\u0E14 (px)",
|
|
4267
|
+
value: exportSize,
|
|
4268
|
+
onChange: (e) => setExportSize(Number(e.target.value)),
|
|
4269
|
+
options: sizeOption
|
|
4270
|
+
}
|
|
4271
|
+
) })
|
|
4272
|
+
] }),
|
|
4273
|
+
/* @__PURE__ */ jsx43(PrimaryButton, { onClick: download, disabled: url === "", textColor: "white", title: "\u0E14\u0E32\u0E27\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E2B\u0E31\u0E2A QR" })
|
|
4274
|
+
]
|
|
4275
|
+
}
|
|
4276
|
+
)
|
|
4277
|
+
] });
|
|
4278
|
+
};
|
|
4279
|
+
|
|
4280
|
+
// src/TabPropject/Tabproject/TabProject.tsx
|
|
4281
|
+
import { Tabs } from "antd";
|
|
4282
|
+
import { jsx as jsx44, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
4283
|
+
function TabProject({ tabOption, now, onChange }) {
|
|
4284
|
+
return /* @__PURE__ */ jsx44(
|
|
4285
|
+
Tabs,
|
|
4286
|
+
{
|
|
4287
|
+
activeKey: now,
|
|
4288
|
+
items: tabOption.map((item, i) => {
|
|
4289
|
+
return {
|
|
4290
|
+
key: item.key,
|
|
4291
|
+
label: /* @__PURE__ */ jsxs38(
|
|
4292
|
+
"button",
|
|
4293
|
+
{
|
|
4294
|
+
className: "tab-label flex gap-2 items-center body-1",
|
|
4295
|
+
onClick: () => onChange(item.key),
|
|
4296
|
+
children: [
|
|
4297
|
+
item.icon,
|
|
4298
|
+
/* @__PURE__ */ jsx44("span", { children: item.label })
|
|
4299
|
+
]
|
|
4300
|
+
}
|
|
4301
|
+
)
|
|
4302
|
+
};
|
|
4303
|
+
})
|
|
4304
|
+
}
|
|
4305
|
+
);
|
|
4306
|
+
}
|
|
3907
4307
|
export {
|
|
3908
4308
|
AntDModal,
|
|
3909
4309
|
AntDataTable,
|
|
@@ -3927,7 +4327,9 @@ export {
|
|
|
3927
4327
|
Loader,
|
|
3928
4328
|
MenuNavBar,
|
|
3929
4329
|
PrimaryButton,
|
|
4330
|
+
ProfileSelect,
|
|
3930
4331
|
ProgressBar,
|
|
4332
|
+
QRCodeGenerator,
|
|
3931
4333
|
Radio,
|
|
3932
4334
|
RadioGroup,
|
|
3933
4335
|
SecondaryButton,
|
|
@@ -3941,6 +4343,7 @@ export {
|
|
|
3941
4343
|
SortFilter,
|
|
3942
4344
|
Switch,
|
|
3943
4345
|
SwitchSelect,
|
|
4346
|
+
TabProject,
|
|
3944
4347
|
TabSelectionButton,
|
|
3945
4348
|
TextAreaInput,
|
|
3946
4349
|
TextInput,
|