chore: migrate nextui to heroui (#141)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { Button, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@nextui-org/react';
|
import { Button, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@heroui/react';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
isOpen: boolean;
|
isOpen: boolean;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
ModalHeader,
|
ModalHeader,
|
||||||
ModalBody,
|
ModalBody,
|
||||||
ModalFooter,
|
ModalFooter,
|
||||||
} from '@nextui-org/react';
|
} from '@heroui/react';
|
||||||
import { ProjectType, ProjectDialogMessages } from '@/types/project';
|
import { ProjectType, ProjectDialogMessages } from '@/types/project';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Chip } from '@nextui-org/react';
|
import { Chip } from '@heroui/react';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
isPublic: boolean;
|
isPublic: boolean;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import { FC } from 'react';
|
import { FC } from 'react';
|
||||||
import { VisuallyHidden } from '@react-aria/visually-hidden';
|
import { VisuallyHidden } from '@react-aria/visually-hidden';
|
||||||
import { SwitchProps, useSwitch } from '@nextui-org/react';
|
import { SwitchProps, useSwitch } from '@heroui/react';
|
||||||
import { useTheme } from 'next-themes';
|
import { useTheme } from 'next-themes';
|
||||||
import { useIsSSR } from '@react-aria/ssr';
|
import { useIsSSR } from '@react-aria/ssr';
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
|
|||||||
@@ -302,7 +302,7 @@
|
|||||||
"edit_project": "Edit Project",
|
"edit_project": "Edit Project",
|
||||||
"publicity": "Publicity",
|
"publicity": "Publicity",
|
||||||
"public": "Public",
|
"public": "Public",
|
||||||
"update": "Update",
|
"private": "Private",
|
||||||
"delete_project": "Delete Project",
|
"delete_project": "Delete Project",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
|
|||||||
10847
frontend/package-lock.json
generated
10847
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,8 +9,9 @@
|
|||||||
"lint": "next lint"
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nextui-org/react": "^2.6.11",
|
"@heroui/react": "^2.6.11",
|
||||||
"@nextui-org/theme": "^2.4.5",
|
"@heroui/system": "^2.4.10",
|
||||||
|
"@heroui/theme": "^2.4.5",
|
||||||
"@react-aria/ssr": "^3.9.7",
|
"@react-aria/ssr": "^3.9.7",
|
||||||
"@react-aria/visually-hidden": "^3.8.19",
|
"@react-aria/visually-hidden": "^3.8.19",
|
||||||
"@types/node": "22.13.5",
|
"@types/node": "22.13.5",
|
||||||
@@ -33,7 +34,6 @@
|
|||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-apexcharts": "^1.7.0",
|
"react-apexcharts": "^1.7.0",
|
||||||
"react-dom": "18.3.1",
|
"react-dom": "18.3.1",
|
||||||
"react-toastify": "^10.0.6",
|
|
||||||
"sharp": "^0.33.5",
|
"sharp": "^0.33.5",
|
||||||
"tailwind-variants": "^0.3.1",
|
"tailwind-variants": "^0.3.1",
|
||||||
"tailwindcss": "^3.4.17",
|
"tailwindcss": "^3.4.17",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { Image } from '@nextui-org/react';
|
import { Image } from '@heroui/react';
|
||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { useTheme } from 'next-themes';
|
import { useTheme } from 'next-themes';
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { Button, DropdownTrigger, Dropdown, DropdownMenu, DropdownItem } from '@nextui-org/react';
|
import { Button, DropdownTrigger, Dropdown, DropdownMenu, DropdownItem } from '@heroui/react';
|
||||||
import { ChevronDown, PenTool, ArrowRightFromLine, ArrowRightToLine } from 'lucide-react';
|
import { ChevronDown, PenTool, ArrowRightFromLine, ArrowRightToLine } from 'lucide-react';
|
||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { TokenContext } from '@/utils/TokenProvider';
|
import { TokenContext } from '@/utils/TokenProvider';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { Button, DropdownTrigger, Dropdown, DropdownMenu, DropdownItem } from '@nextui-org/react';
|
import { Button, DropdownTrigger, Dropdown, DropdownMenu, DropdownItem } from '@heroui/react';
|
||||||
import { Globe, ChevronDown } from 'lucide-react';
|
import { Globe, ChevronDown } from 'lucide-react';
|
||||||
import { locales } from '@/config/selection';
|
import { locales } from '@/config/selection';
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import {
|
|||||||
Chip,
|
Chip,
|
||||||
ListboxItem,
|
ListboxItem,
|
||||||
Listbox,
|
Listbox,
|
||||||
} from '@nextui-org/react';
|
} from '@heroui/react';
|
||||||
import { ArrowRightFromLine, ArrowRightToLine, File, Globe, MoveUpRight, PenTool } from 'lucide-react';
|
import { ArrowRightFromLine, ArrowRightToLine, File, Globe, MoveUpRight, PenTool } from 'lucide-react';
|
||||||
import { ThemeSwitch } from '@/components/ThemeSwitch';
|
import { ThemeSwitch } from '@/components/ThemeSwitch';
|
||||||
import { GithubIcon } from '@/components/icons';
|
import { GithubIcon } from '@/components/icons';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Card, CardHeader, CardBody, Avatar } from '@nextui-org/react';
|
import { Card, CardHeader, CardBody, Avatar } from '@heroui/react';
|
||||||
import { Scale, Folder, Check, Globe } from 'lucide-react';
|
import { Scale, Folder, Check, Globe } from 'lucide-react';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { title, subtitle } from '@/components/primitives';
|
import { title, subtitle } from '@/components/primitives';
|
||||||
import { Button, Link as NextUiLink } from '@nextui-org/react';
|
import { Button, Link as NextUiLink } from '@heroui/react';
|
||||||
import { MoveUpRight } from 'lucide-react';
|
import { MoveUpRight } from 'lucide-react';
|
||||||
import { Link } from '@/src/i18n/routing';
|
import { Link } from '@/src/i18n/routing';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { useState, useEffect, useContext } from 'react';
|
import { useState, useEffect, useContext } from 'react';
|
||||||
import { Link, NextUiLinkClasses } from '@/src/i18n/routing';
|
import { Link, NextUiLinkClasses } from '@/src/i18n/routing';
|
||||||
import { Button, Card, CardHeader, CardFooter } from '@nextui-org/react';
|
import { Button, Card, CardHeader, CardFooter } from '@heroui/react';
|
||||||
import { TokenContext } from '@/utils/TokenProvider';
|
import { TokenContext } from '@/utils/TokenProvider';
|
||||||
import Avatar from 'boring-avatars';
|
import Avatar from 'boring-avatars';
|
||||||
import { fetchMyProjects } from '@/utils/projectsControl';
|
import { fetchMyProjects } from '@/utils/projectsControl';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useState, useContext } from 'react';
|
import { useState, useContext } from 'react';
|
||||||
import { Input, Button, Card, CardHeader, CardBody } from '@nextui-org/react';
|
import { Input, Button, Card, CardHeader, CardBody } from '@heroui/react';
|
||||||
import { Link } from '@/src/i18n/routing';
|
import { Link } from '@/src/i18n/routing';
|
||||||
import { ChevronRight, Eye, EyeOff } from 'lucide-react';
|
import { ChevronRight, Eye, EyeOff } from 'lucide-react';
|
||||||
import { UserType, AuthMessages } from '@/types/user';
|
import { UserType, AuthMessages } from '@/types/user';
|
||||||
|
|||||||
@@ -3,13 +3,12 @@ import React from 'react';
|
|||||||
import { useState, useEffect, useContext } from 'react';
|
import { useState, useEffect, useContext } from 'react';
|
||||||
import { UserType, AdminMessages } from '@/types/user';
|
import { UserType, AdminMessages } from '@/types/user';
|
||||||
import { TokenContext } from '@/utils/TokenProvider';
|
import { TokenContext } from '@/utils/TokenProvider';
|
||||||
import { ToastContext } from '@/utils/ToastProvider';
|
|
||||||
import { useRouter } from '@/src/i18n/routing';
|
import { useRouter } from '@/src/i18n/routing';
|
||||||
import UsersTable from './UsersTable';
|
import UsersTable from './UsersTable';
|
||||||
import Config from '@/config/config';
|
import Config from '@/config/config';
|
||||||
import { LocaleCodeType } from '@/types/locale';
|
import { LocaleCodeType } from '@/types/locale';
|
||||||
import { updateUserRole } from '@/utils/usersControl';
|
import { updateUserRole } from '@/utils/usersControl';
|
||||||
import { Button } from '@nextui-org/react';
|
import { Button, addToast } from '@heroui/react';
|
||||||
import { roles } from '@/config/selection';
|
import { roles } from '@/config/selection';
|
||||||
import DeleteConfirmDialog from '@/components/DeleteConfirmDialog';
|
import DeleteConfirmDialog from '@/components/DeleteConfirmDialog';
|
||||||
const apiServer = Config.apiServer;
|
const apiServer = Config.apiServer;
|
||||||
@@ -45,7 +44,6 @@ async function fetchUsers(jwt: string) {
|
|||||||
export default function AdminPage({ messages, locale }: Props) {
|
export default function AdminPage({ messages, locale }: Props) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const tokenContext = useContext(TokenContext);
|
const tokenContext = useContext(TokenContext);
|
||||||
const toastContext = useContext(ToastContext);
|
|
||||||
const [users, setUsers] = useState<UserType[]>([]);
|
const [users, setUsers] = useState<UserType[]>([]);
|
||||||
const [myself, setMyself] = useState<UserType | null>(null);
|
const [myself, setMyself] = useState<UserType | null>(null);
|
||||||
|
|
||||||
@@ -85,7 +83,10 @@ export default function AdminPage({ messages, locale }: Props) {
|
|||||||
if (userEdit.id) {
|
if (userEdit.id) {
|
||||||
const data = await updateUserRole(tokenContext.token.access_token, userEdit.id, role);
|
const data = await updateUserRole(tokenContext.token.access_token, userEdit.id, role);
|
||||||
if (data.user) {
|
if (data.user) {
|
||||||
toastContext.showToast(messages.roleChanged, 'dark');
|
addToast({
|
||||||
|
title: 'Info',
|
||||||
|
description: messages.roleChanged,
|
||||||
|
});
|
||||||
setUsers((prevUsers) => {
|
setUsers((prevUsers) => {
|
||||||
return prevUsers.map((user) => {
|
return prevUsers.map((user) => {
|
||||||
if (user.id === userEdit.id) {
|
if (user.id === userEdit.id) {
|
||||||
@@ -104,10 +105,16 @@ export default function AdminPage({ messages, locale }: Props) {
|
|||||||
const data = await updateUserRole(tokenContext.token.access_token, myself.id, userRoleIndex);
|
const data = await updateUserRole(tokenContext.token.access_token, myself.id, userRoleIndex);
|
||||||
|
|
||||||
if (data && data.user) {
|
if (data && data.user) {
|
||||||
toastContext.showToast(messages.lostAdminAuth, 'dark');
|
addToast({
|
||||||
|
title: 'Info',
|
||||||
|
description: messages.lostAdminAuth,
|
||||||
|
});
|
||||||
router.push(`/`, { locale: locale });
|
router.push(`/`, { locale: locale });
|
||||||
} else {
|
} else {
|
||||||
toastContext.showToast(messages.atLeast, 'error');
|
addToast({
|
||||||
|
title: 'Info',
|
||||||
|
description: messages.atLeast,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import {
|
|||||||
Dropdown,
|
Dropdown,
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
DropdownItem,
|
DropdownItem,
|
||||||
} from '@nextui-org/react';
|
} from '@heroui/react';
|
||||||
import { ChevronDown } from 'lucide-react';
|
import { ChevronDown } from 'lucide-react';
|
||||||
import { UserType, AdminMessages } from '@/types/user';
|
import { UserType, AdminMessages } from '@/types/user';
|
||||||
import { roles } from '@/config/selection';
|
import { roles } from '@/config/selection';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Divider } from '@nextui-org/react';
|
import { Divider } from '@heroui/react';
|
||||||
import { title, subtitle } from '@/components/primitives';
|
import { title, subtitle } from '@/components/primitives';
|
||||||
import PaneMainTitle from './PaneMainTitle';
|
import PaneMainTitle from './PaneMainTitle';
|
||||||
import PaneMainFeatures from './PaneMainFeatures';
|
import PaneMainFeatures from './PaneMainFeatures';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { useEffect, useState, useContext } from 'react';
|
import { useEffect, useState, useContext } from 'react';
|
||||||
import { Button } from '@nextui-org/react';
|
import { Button } from '@heroui/react';
|
||||||
import { Plus } from 'lucide-react';
|
import { Plus } from 'lucide-react';
|
||||||
import { TokenContext } from '@/utils/TokenProvider';
|
import { TokenContext } from '@/utils/TokenProvider';
|
||||||
import { ProjectDialogMessages, ProjectType, ProjectsMessages } from '@/types/project';
|
import { ProjectDialogMessages, ProjectType, ProjectsMessages } from '@/types/project';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useState, useMemo, useCallback, ReactNode } from 'react';
|
import { useState, useMemo, useCallback, ReactNode } from 'react';
|
||||||
import { Table, TableHeader, TableColumn, TableBody, TableRow, TableCell, SortDescriptor } from '@nextui-org/react';
|
import { Table, TableHeader, TableColumn, TableBody, TableRow, TableCell, SortDescriptor } from '@heroui/react';
|
||||||
import { Link, NextUiLinkClasses } from '@/src/i18n/routing';
|
import { Link, NextUiLinkClasses } from '@/src/i18n/routing';
|
||||||
import { ProjectType, ProjectsMessages } from '@/types/project';
|
import { ProjectType, ProjectsMessages } from '@/types/project';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Listbox, ListboxItem } from '@nextui-org/react';
|
import { Listbox, ListboxItem } from '@heroui/react';
|
||||||
import { Home, Files, FlaskConical, Users, Settings } from 'lucide-react';
|
import { Home, Files, FlaskConical, Users, Settings } from 'lucide-react';
|
||||||
import { usePathname, useRouter } from '@/src/i18n/routing';
|
import { usePathname, useRouter } from '@/src/i18n/routing';
|
||||||
import useGetCurrentIds from '@/utils/useGetCurrentIds';
|
import useGetCurrentIds from '@/utils/useGetCurrentIds';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Button, Input, Textarea, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@nextui-org/react';
|
import { Button, Input, Textarea, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@heroui/react';
|
||||||
import { FolderType, FoldersMessages } from '@/types/folder';
|
import { FolderType, FoldersMessages } from '@/types/folder';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Button, Dropdown, DropdownTrigger, DropdownMenu, DropdownItem } from '@nextui-org/react';
|
import { Button, Dropdown, DropdownTrigger, DropdownMenu, DropdownItem } from '@heroui/react';
|
||||||
import { MoreVertical } from 'lucide-react';
|
import { MoreVertical } from 'lucide-react';
|
||||||
import { FolderType, FoldersMessages } from '@/types/folder';
|
import { FolderType, FoldersMessages } from '@/types/folder';
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { FolderType, FoldersMessages } from '@/types/folder';
|
import { FolderType, FoldersMessages } from '@/types/folder';
|
||||||
import { useState, useEffect, useContext } from 'react';
|
import { useState, useEffect, useContext } from 'react';
|
||||||
import { Button, Listbox, ListboxItem } from '@nextui-org/react';
|
import { Button, Listbox, ListboxItem } from '@heroui/react';
|
||||||
import { Folder, Plus } from 'lucide-react';
|
import { Folder, Plus } from 'lucide-react';
|
||||||
import { usePathname, useRouter } from '@/src/i18n/routing';
|
import { usePathname, useRouter } from '@/src/i18n/routing';
|
||||||
import { TokenContext } from '@/utils/TokenProvider';
|
import { TokenContext } from '@/utils/TokenProvider';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Button, Input, Textarea, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@nextui-org/react';
|
import { Button, Input, Textarea, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@heroui/react';
|
||||||
import { CasesMessages } from '@/types/case';
|
import { CasesMessages } from '@/types/case';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import {
|
|||||||
DropdownItem,
|
DropdownItem,
|
||||||
Selection,
|
Selection,
|
||||||
SortDescriptor,
|
SortDescriptor,
|
||||||
} from '@nextui-org/react';
|
} from '@heroui/react';
|
||||||
import { Link, NextUiLinkClasses } from '@/src/i18n/routing';
|
import { Link, NextUiLinkClasses } from '@/src/i18n/routing';
|
||||||
import { Plus, MoreVertical, Trash } from 'lucide-react';
|
import { Plus, MoreVertical, Trash } from 'lucide-react';
|
||||||
import { CaseType, CasesMessages } from '@/types/case';
|
import { CaseType, CasesMessages } from '@/types/case';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Image, Button, Tooltip, Card, CardBody } from '@nextui-org/react';
|
import { Image, Button, Tooltip, Card, CardBody } from '@heroui/react';
|
||||||
import { AttachmentType, CaseMessages } from '@/types/case';
|
import { AttachmentType, CaseMessages } from '@/types/case';
|
||||||
import { Trash, ArrowDownToLine, ArrowUpFromLine } from 'lucide-react';
|
import { Trash, ArrowDownToLine, ArrowUpFromLine } from 'lucide-react';
|
||||||
import { isImage } from './isImage';
|
import { isImage } from './isImage';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { useState, useEffect, useContext, ChangeEvent, DragEvent } from 'react';
|
import { useState, useEffect, useContext, ChangeEvent, DragEvent } from 'react';
|
||||||
import { Input, Textarea, Select, SelectItem, Button, Divider, Tooltip } from '@nextui-org/react';
|
import { Input, Textarea, Select, SelectItem, Button, Divider, Tooltip, addToast } from '@heroui/react';
|
||||||
import { useRouter } from '@/src/i18n/routing';
|
import { useRouter } from '@/src/i18n/routing';
|
||||||
import { Save, Plus, ArrowLeft, Circle } from 'lucide-react';
|
import { Save, Plus, ArrowLeft, Circle } from 'lucide-react';
|
||||||
import { priorities, testTypes, templates } from '@/config/selection';
|
import { priorities, testTypes, templates } from '@/config/selection';
|
||||||
@@ -10,7 +10,6 @@ import { fetchCase, updateCase } from '@/utils/caseControl';
|
|||||||
import { updateSteps } from './stepControl';
|
import { updateSteps } from './stepControl';
|
||||||
import { fetchCreateAttachments, fetchDownloadAttachment, fetchDeleteAttachment } from './attachmentControl';
|
import { fetchCreateAttachments, fetchDownloadAttachment, fetchDeleteAttachment } from './attachmentControl';
|
||||||
import { TokenContext } from '@/utils/TokenProvider';
|
import { TokenContext } from '@/utils/TokenProvider';
|
||||||
import { ToastContext } from '@/utils/ToastProvider';
|
|
||||||
import { useFormGuard } from '@/utils/formGuard';
|
import { useFormGuard } from '@/utils/formGuard';
|
||||||
import { CaseType, AttachmentType, CaseMessages, StepType } from '@/types/case';
|
import { CaseType, AttachmentType, CaseMessages, StepType } from '@/types/case';
|
||||||
import { PriorityMessages } from '@/types/priority';
|
import { PriorityMessages } from '@/types/priority';
|
||||||
@@ -54,7 +53,6 @@ export default function CaseEditor({
|
|||||||
locale,
|
locale,
|
||||||
}: Props) {
|
}: Props) {
|
||||||
const tokenContext = useContext(TokenContext);
|
const tokenContext = useContext(TokenContext);
|
||||||
const toastContext = useContext(ToastContext);
|
|
||||||
const [testCase, setTestCase] = useState<CaseType>(defaultTestCase);
|
const [testCase, setTestCase] = useState<CaseType>(defaultTestCase);
|
||||||
const [isTitleInvalid, setIsTitleInvalid] = useState<boolean>(false);
|
const [isTitleInvalid, setIsTitleInvalid] = useState<boolean>(false);
|
||||||
const [isUpdating, setIsUpdating] = useState<boolean>(false);
|
const [isUpdating, setIsUpdating] = useState<boolean>(false);
|
||||||
@@ -242,7 +240,10 @@ export default function CaseEditor({
|
|||||||
await updateSteps(tokenContext.token.access_token, Number(caseId), testCase.Steps);
|
await updateSteps(tokenContext.token.access_token, Number(caseId), testCase.Steps);
|
||||||
}
|
}
|
||||||
|
|
||||||
toastContext.showToast(messages.updatedTestCase, 'dark');
|
addToast({
|
||||||
|
title: 'Info',
|
||||||
|
description: messages.updatedTestCase,
|
||||||
|
});
|
||||||
setIsUpdating(false);
|
setIsUpdating(false);
|
||||||
setIsDirty(false);
|
setIsDirty(false);
|
||||||
}}
|
}}
|
||||||
@@ -298,10 +299,8 @@ export default function CaseEditor({
|
|||||||
label={messages.priority}
|
label={messages.priority}
|
||||||
className="mt-3 max-w-xs"
|
className="mt-3 max-w-xs"
|
||||||
>
|
>
|
||||||
{priorities.map((priority, index) => (
|
{priorities.map((priority) => (
|
||||||
<SelectItem key={priority.uid} value={index}>
|
<SelectItem key={priority.uid}>{priorityMessages[priority.uid]}</SelectItem>
|
||||||
{priorityMessages[priority.uid]}
|
|
||||||
</SelectItem>
|
|
||||||
))}
|
))}
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
@@ -321,10 +320,8 @@ export default function CaseEditor({
|
|||||||
label={messages.type}
|
label={messages.type}
|
||||||
className="mt-3 max-w-xs"
|
className="mt-3 max-w-xs"
|
||||||
>
|
>
|
||||||
{testTypes.map((type, index) => (
|
{testTypes.map((type) => (
|
||||||
<SelectItem key={type.uid} value={index}>
|
<SelectItem key={type.uid}>{testTypeMessages[type.uid]}</SelectItem>
|
||||||
{testTypeMessages[type.uid]}
|
|
||||||
</SelectItem>
|
|
||||||
))}
|
))}
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
@@ -344,10 +341,8 @@ export default function CaseEditor({
|
|||||||
label={messages.template}
|
label={messages.template}
|
||||||
className="mt-3 max-w-xs"
|
className="mt-3 max-w-xs"
|
||||||
>
|
>
|
||||||
{templates.map((template, index) => (
|
{templates.map((template) => (
|
||||||
<SelectItem key={template.uid} value={index}>
|
<SelectItem key={template.uid}>{messages[template.uid]}</SelectItem>
|
||||||
{messages[template.uid]}
|
|
||||||
</SelectItem>
|
|
||||||
))}
|
))}
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Textarea, Button, Tooltip, Avatar } from '@nextui-org/react';
|
import { Textarea, Button, Tooltip, Avatar } from '@heroui/react';
|
||||||
import { CaseMessages, StepType } from '@/types/case';
|
import { CaseMessages, StepType } from '@/types/case';
|
||||||
import { Plus, Trash } from 'lucide-react';
|
import { Plus, Trash } from 'lucide-react';
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { useState, useEffect, useContext } from 'react';
|
import { useState, useEffect, useContext } from 'react';
|
||||||
import { title, subtitle } from '@/components/primitives';
|
import { title, subtitle } from '@/components/primitives';
|
||||||
import { Card, CardBody, Chip, Divider } from '@nextui-org/react';
|
import { Card, CardBody, Chip, Divider } from '@heroui/react';
|
||||||
import { Folder, Clipboard, FlaskConical } from 'lucide-react';
|
import { Folder, Clipboard, FlaskConical } from 'lucide-react';
|
||||||
import { ProgressSeriesType } from '@/types/run';
|
import { ProgressSeriesType } from '@/types/run';
|
||||||
import { HomeMessages } from './page';
|
import { HomeMessages } from './page';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useState, useEffect, useContext } from 'react';
|
import { useState, useEffect, useContext } from 'react';
|
||||||
import { Button, Input, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@nextui-org/react';
|
import { Button, Input, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@heroui/react';
|
||||||
import { TokenContext } from '@/utils/TokenProvider';
|
import { TokenContext } from '@/utils/TokenProvider';
|
||||||
import { UserType } from '@/types/user';
|
import { UserType } from '@/types/user';
|
||||||
import { searchUsers } from '@/utils/usersControl';
|
import { searchUsers } from '@/utils/usersControl';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useMemo, useCallback } from 'react';
|
import { useMemo, useCallback } from 'react';
|
||||||
import { Button, Table, TableHeader, TableColumn, TableBody, TableRow, TableCell } from '@nextui-org/react';
|
import { Button, Table, TableHeader, TableColumn, TableBody, TableRow, TableCell } from '@heroui/react';
|
||||||
import { UserType } from '@/types/user';
|
import { UserType } from '@/types/user';
|
||||||
import Avatar from 'boring-avatars';
|
import Avatar from 'boring-avatars';
|
||||||
import { MembersMessages } from '@/types/member';
|
import { MembersMessages } from '@/types/member';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useState, useEffect, useContext } from 'react';
|
import { useState, useEffect, useContext } from 'react';
|
||||||
import { Button } from '@nextui-org/react';
|
import { Button } from '@heroui/react';
|
||||||
import { Plus } from 'lucide-react';
|
import { Plus } from 'lucide-react';
|
||||||
import { MemberType, UserType } from '@/types/user';
|
import { MemberType, UserType } from '@/types/user';
|
||||||
import { MembersMessages } from '@/types/member';
|
import { MembersMessages } from '@/types/member';
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import {
|
|||||||
Dropdown,
|
Dropdown,
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
DropdownItem,
|
DropdownItem,
|
||||||
} from '@nextui-org/react';
|
} from '@heroui/react';
|
||||||
import { ChevronDown } from 'lucide-react';
|
import { ChevronDown } from 'lucide-react';
|
||||||
import { MemberType, UserType } from '@/types/user';
|
import { MemberType, UserType } from '@/types/user';
|
||||||
import { memberRoles } from '@/config/selection';
|
import { memberRoles } from '@/config/selection';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Button, Input, Textarea, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@nextui-org/react';
|
import { Button, Input, Textarea, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@heroui/react';
|
||||||
import { RunType, RunsMessages } from '@/types/run';
|
import { RunType, RunsMessages } from '@/types/run';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { useEffect, useState, useContext } from 'react';
|
import { useEffect, useState, useContext } from 'react';
|
||||||
import { Button } from '@nextui-org/react';
|
import { Button } from '@heroui/react';
|
||||||
import { Plus } from 'lucide-react';
|
import { Plus } from 'lucide-react';
|
||||||
import RunsTable from './RunsTable';
|
import RunsTable from './RunsTable';
|
||||||
import { fetchRuns, createRun, updateRun, deleteRun } from './runsControl';
|
import { fetchRuns, createRun, updateRun, deleteRun } from './runsControl';
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import {
|
|||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
DropdownItem,
|
DropdownItem,
|
||||||
SortDescriptor,
|
SortDescriptor,
|
||||||
} from '@nextui-org/react';
|
} from '@heroui/react';
|
||||||
import { Link, NextUiLinkClasses } from '@/src/i18n/routing';
|
import { Link, NextUiLinkClasses } from '@/src/i18n/routing';
|
||||||
import { MoreVertical } from 'lucide-react';
|
import { MoreVertical } from 'lucide-react';
|
||||||
import { RunsMessages, RunType } from '@/types/run';
|
import { RunsMessages, RunType } from '@/types/run';
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ import {
|
|||||||
Dropdown,
|
Dropdown,
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
DropdownItem,
|
DropdownItem,
|
||||||
} from '@nextui-org/react';
|
addToast,
|
||||||
|
} from '@heroui/react';
|
||||||
import { Save, Circle, ArrowLeft, Folder, ChevronDown, CopyPlus, CopyMinus, RotateCw } from 'lucide-react';
|
import { Save, Circle, ArrowLeft, Folder, ChevronDown, CopyPlus, CopyMinus, RotateCw } from 'lucide-react';
|
||||||
import RunProgressChart from './RunPregressDonutChart';
|
import RunProgressChart from './RunPregressDonutChart';
|
||||||
import TestCaseSelector from './TestCaseSelector';
|
import TestCaseSelector from './TestCaseSelector';
|
||||||
@@ -35,7 +36,6 @@ import {
|
|||||||
} from '../runsControl';
|
} from '../runsControl';
|
||||||
import { fetchFolders } from '../../folders/foldersControl';
|
import { fetchFolders } from '../../folders/foldersControl';
|
||||||
import { TokenContext } from '@/utils/TokenProvider';
|
import { TokenContext } from '@/utils/TokenProvider';
|
||||||
import { ToastContext } from '@/utils/ToastProvider';
|
|
||||||
import { useTheme } from 'next-themes';
|
import { useTheme } from 'next-themes';
|
||||||
import { useFormGuard } from '@/utils/formGuard';
|
import { useFormGuard } from '@/utils/formGuard';
|
||||||
import { PriorityMessages } from '@/types/priority';
|
import { PriorityMessages } from '@/types/priority';
|
||||||
@@ -75,7 +75,6 @@ export default function RunEditor({
|
|||||||
locale,
|
locale,
|
||||||
}: Props) {
|
}: Props) {
|
||||||
const tokenContext = useContext(TokenContext);
|
const tokenContext = useContext(TokenContext);
|
||||||
const toastContext = useContext(ToastContext);
|
|
||||||
const { theme, setTheme } = useTheme();
|
const { theme, setTheme } = useTheme();
|
||||||
const [testRun, setTestRun] = useState<RunType>(defaultTestRun);
|
const [testRun, setTestRun] = useState<RunType>(defaultTestRun);
|
||||||
const [folders, setFolders] = useState<FolderType[]>([]);
|
const [folders, setFolders] = useState<FolderType[]>([]);
|
||||||
@@ -174,7 +173,10 @@ export default function RunEditor({
|
|||||||
await updateRunCases(tokenContext.token.access_token, Number(runId), testCases);
|
await updateRunCases(tokenContext.token.access_token, Number(runId), testCases);
|
||||||
await initTestCases();
|
await initTestCases();
|
||||||
|
|
||||||
toastContext.showToast(messages.updatedTestRun, 'dark');
|
addToast({
|
||||||
|
title: 'Info',
|
||||||
|
description: messages.updatedTestRun,
|
||||||
|
});
|
||||||
setIsUpdating(false);
|
setIsUpdating(false);
|
||||||
setIsDirty(false);
|
setIsDirty(false);
|
||||||
};
|
};
|
||||||
@@ -279,10 +281,8 @@ export default function RunEditor({
|
|||||||
label={messages.status}
|
label={messages.status}
|
||||||
className="mt-3 max-w-xs"
|
className="mt-3 max-w-xs"
|
||||||
>
|
>
|
||||||
{testRunStatus.map((status, index) => (
|
{testRunStatus.map((status) => (
|
||||||
<SelectItem key={status.uid} value={index}>
|
<SelectItem key={status.uid}>{runStatusMessages[status.uid]}</SelectItem>
|
||||||
{runStatusMessages[status.uid]}
|
|
||||||
</SelectItem>
|
|
||||||
))}
|
))}
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useState, useEffect, useContext } from 'react';
|
import { useState, useEffect, useContext } from 'react';
|
||||||
import { Button, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter, Avatar, Textarea } from '@nextui-org/react';
|
import { Button, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter, Avatar, Textarea } from '@heroui/react';
|
||||||
import { testTypes, templates } from '@/config/selection';
|
import { testTypes, templates } from '@/config/selection';
|
||||||
import { RunMessages } from '@/types/run';
|
import { RunMessages } from '@/types/run';
|
||||||
import { CaseType, StepType } from '@/types/case';
|
import { CaseType, StepType } from '@/types/case';
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import {
|
|||||||
DropdownItem,
|
DropdownItem,
|
||||||
Selection,
|
Selection,
|
||||||
SortDescriptor,
|
SortDescriptor,
|
||||||
} from '@nextui-org/react';
|
} from '@heroui/react';
|
||||||
import {
|
import {
|
||||||
ChevronDown,
|
ChevronDown,
|
||||||
MoveDiagonal,
|
MoveDiagonal,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useState, useEffect, useContext } from 'react';
|
import { useState, useEffect, useContext } from 'react';
|
||||||
import { Button, Table, TableHeader, TableColumn, TableBody, TableRow, TableCell } from '@nextui-org/react';
|
import { Button, Table, TableHeader, TableColumn, TableBody, TableRow, TableCell } from '@heroui/react';
|
||||||
import Avatar from 'boring-avatars';
|
import Avatar from 'boring-avatars';
|
||||||
import { Pencil, Trash } from 'lucide-react';
|
import { Pencil, Trash } from 'lucide-react';
|
||||||
import { SettingsMessages } from '@/types/settings';
|
import { SettingsMessages } from '@/types/settings';
|
||||||
|
|||||||
@@ -1,31 +1,28 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { NextUIProvider } from '@nextui-org/react';
|
import { HeroUIProvider } from '@heroui/react';
|
||||||
|
import { ToastProvider } from '@heroui/react';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { ThemeProvider as NextThemesProvider, ThemeProviderProps } from 'next-themes';
|
import { ThemeProvider as NextThemesProvider, ThemeProviderProps } from 'next-themes';
|
||||||
import ToastProvider from '@/utils/ToastProvider';
|
|
||||||
import { ToastProps } from '@/types/toast';
|
|
||||||
import TokenProvider from '@/utils/TokenProvider';
|
import TokenProvider from '@/utils/TokenProvider';
|
||||||
import { TokenProps } from '@/types/user';
|
import { TokenProps } from '@/types/user';
|
||||||
|
|
||||||
export interface ProvidersProps {
|
export interface ProvidersProps {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
themeProps?: ThemeProviderProps;
|
themeProps?: ThemeProviderProps;
|
||||||
toastProps?: ToastProps;
|
|
||||||
tokenProps?: TokenProps;
|
tokenProps?: TokenProps;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Providers({ children, themeProps, toastProps, tokenProps }: ProvidersProps) {
|
export function Providers({ children, themeProps, tokenProps }: ProvidersProps) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<NextUIProvider navigate={router.push}>
|
<HeroUIProvider navigate={router.push}>
|
||||||
<NextThemesProvider {...themeProps}>
|
<NextThemesProvider {...themeProps}>
|
||||||
<ToastProvider {...toastProps}>
|
<ToastProvider />
|
||||||
<TokenProvider {...tokenProps}>{children}</TokenProvider>
|
<TokenProvider {...tokenProps}>{children}</TokenProvider>
|
||||||
</ToastProvider>
|
|
||||||
</NextThemesProvider>
|
</NextThemesProvider>
|
||||||
</NextUIProvider>
|
</HeroUIProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { nextui } from '@nextui-org/theme';
|
const { heroui } = require('@heroui/react');
|
||||||
|
|
||||||
/** @type {import('tailwindcss').Config} */
|
/** @type {import('tailwindcss').Config} */
|
||||||
module.exports = {
|
module.exports = {
|
||||||
@@ -7,14 +7,14 @@ module.exports = {
|
|||||||
'./components/**/*.{js,ts,jsx,tsx,mdx}',
|
'./components/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
'./app/**/*.{js,ts,jsx,tsx,mdx}',
|
'./app/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
'./src/app/**/*.{js,ts,jsx,tsx,mdx}',
|
'./src/app/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
'./node_modules/@nextui-org/theme/dist/**/*.{js,ts,jsx,tsx}',
|
'./node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}',
|
||||||
],
|
],
|
||||||
|
darkMode: 'class',
|
||||||
theme: {
|
theme: {
|
||||||
extend: {},
|
extend: {},
|
||||||
},
|
},
|
||||||
darkMode: 'class',
|
|
||||||
plugins: [
|
plugins: [
|
||||||
nextui({
|
heroui({
|
||||||
themes: {
|
themes: {
|
||||||
light: {
|
light: {
|
||||||
colors: {
|
colors: {
|
||||||
|
|||||||
@@ -1,12 +1,4 @@
|
|||||||
export type ToastProps = {
|
|
||||||
children?: React.ReactNode;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type ToastMessages = {
|
export type ToastMessages = {
|
||||||
needSignedIn: string;
|
needSignedIn: string;
|
||||||
sessionExpired: string;
|
sessionExpired: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ToastContextType = {
|
|
||||||
showToast: (text: string, mode: 'error' | 'dark') => void;
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
import { createContext } from 'react';
|
|
||||||
import { ToastContextType, ToastProps } from '@/types/toast';
|
|
||||||
|
|
||||||
// TODO Temporary use until NextUI's Toast is released.
|
|
||||||
import { ToastContainer, toast } from 'react-toastify';
|
|
||||||
import 'react-toastify/dist/ReactToastify.css';
|
|
||||||
|
|
||||||
const defaultContext = {
|
|
||||||
showToast: (text: string, mode: 'error' | 'dark') => {},
|
|
||||||
};
|
|
||||||
const ToastContext = createContext<ToastContextType>(defaultContext);
|
|
||||||
|
|
||||||
const ToastProvider = ({ children }: ToastProps) => {
|
|
||||||
const showToast = (text: string, mode: string) => {
|
|
||||||
if (mode === 'error') {
|
|
||||||
toast.error(text);
|
|
||||||
} else {
|
|
||||||
toast(text, { theme: 'dark' });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const toastContext = {
|
|
||||||
showToast,
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ToastContext.Provider value={toastContext}>
|
|
||||||
<ToastContainer position="bottom-right" hideProgressBar={true} />
|
|
||||||
{children}
|
|
||||||
</ToastContext.Provider>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export { ToastContext };
|
|
||||||
export default ToastProvider;
|
|
||||||
@@ -13,7 +13,7 @@ import {
|
|||||||
checkSignInPage as tokenCheckSignInPage,
|
checkSignInPage as tokenCheckSignInPage,
|
||||||
fetchMyRoles,
|
fetchMyRoles,
|
||||||
} from './token';
|
} from './token';
|
||||||
import { ToastContext } from './ToastProvider';
|
import { addToast } from '@heroui/react';
|
||||||
const LOCAL_STORAGE_KEY = 'unittcms-auth-token';
|
const LOCAL_STORAGE_KEY = 'unittcms-auth-token';
|
||||||
|
|
||||||
function storeTokenToLocalStorage(token: TokenType) {
|
function storeTokenToLocalStorage(token: TokenType) {
|
||||||
@@ -53,7 +53,6 @@ const TokenContext = createContext<TokenContextType>(defaultContext);
|
|||||||
const TokenProvider = ({ toastMessages, locale, children }: TokenProps) => {
|
const TokenProvider = ({ toastMessages, locale, children }: TokenProps) => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const toastContext = useContext(ToastContext);
|
|
||||||
|
|
||||||
const [hasRestoreFinished, setHasRestoreFinished] = useState(false);
|
const [hasRestoreFinished, setHasRestoreFinished] = useState(false);
|
||||||
const [token, setToken] = useState<TokenType>({
|
const [token, setToken] = useState<TokenType>({
|
||||||
@@ -137,11 +136,19 @@ const TokenProvider = ({ toastMessages, locale, children }: TokenProps) => {
|
|||||||
if (!ret.ok) {
|
if (!ret.ok) {
|
||||||
if (ret.reason === 'notoken') {
|
if (ret.reason === 'notoken') {
|
||||||
if (toastMessages) {
|
if (toastMessages) {
|
||||||
toastContext.showToast(toastMessages.needSignedIn, 'error');
|
addToast({
|
||||||
|
title: 'Info',
|
||||||
|
description: toastMessages.needSignedIn,
|
||||||
|
color: 'danger',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
} else if (ret.reason === 'expired') {
|
} else if (ret.reason === 'expired') {
|
||||||
if (toastMessages) {
|
if (toastMessages) {
|
||||||
toastContext.showToast(toastMessages.sessionExpired, 'error');
|
addToast({
|
||||||
|
title: 'Info',
|
||||||
|
description: toastMessages.sessionExpired,
|
||||||
|
color: 'danger',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user