feat: inited project
10
svgr.d.ts
vendored
@ -1,10 +0,0 @@
|
|||||||
declare module '*.svg' {
|
|
||||||
import { FC, SVGProps } from 'react'
|
|
||||||
const content: FC<SVGProps<SVGElement>>
|
|
||||||
export default content
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module '*.svg?url' {
|
|
||||||
const content: any
|
|
||||||
export default content
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
0
app/globals.css
Normal file
32
app/layout.tsx
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import type { Metadata } from "next";
|
||||||
|
import { Geist, Geist_Mono } from "next/font/google";
|
||||||
|
import "./globals.css";
|
||||||
|
|
||||||
|
const geistSans = Geist({
|
||||||
|
variable: "--font-geist-sans",
|
||||||
|
subsets: ["latin"],
|
||||||
|
});
|
||||||
|
|
||||||
|
const geistMono = Geist_Mono({
|
||||||
|
variable: "--font-geist-mono",
|
||||||
|
subsets: ["latin"],
|
||||||
|
});
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Create Next App",
|
||||||
|
description: "Generated by create next app",
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function RootLayout({
|
||||||
|
children,
|
||||||
|
}: Readonly<{
|
||||||
|
children: React.ReactNode;
|
||||||
|
}>) {
|
||||||
|
return (
|
||||||
|
<html lang="en">
|
||||||
|
<body className={`${geistSans.variable} ${geistMono.variable}`}>
|
||||||
|
{children}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
);
|
||||||
|
}
|
||||||
168
app/page.module.css
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
.page {
|
||||||
|
--gray-rgb: 0, 0, 0;
|
||||||
|
--gray-alpha-200: rgba(var(--gray-rgb), 0.08);
|
||||||
|
--gray-alpha-100: rgba(var(--gray-rgb), 0.05);
|
||||||
|
|
||||||
|
--button-primary-hover: #383838;
|
||||||
|
--button-secondary-hover: #f2f2f2;
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
grid-template-rows: 20px 1fr 20px;
|
||||||
|
align-items: center;
|
||||||
|
justify-items: center;
|
||||||
|
min-height: 100svh;
|
||||||
|
padding: 80px;
|
||||||
|
gap: 64px;
|
||||||
|
font-family: var(--font-geist-sans);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.page {
|
||||||
|
--gray-rgb: 255, 255, 255;
|
||||||
|
--gray-alpha-200: rgba(var(--gray-rgb), 0.145);
|
||||||
|
--gray-alpha-100: rgba(var(--gray-rgb), 0.06);
|
||||||
|
|
||||||
|
--button-primary-hover: #ccc;
|
||||||
|
--button-secondary-hover: #1a1a1a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 32px;
|
||||||
|
grid-row-start: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main ol {
|
||||||
|
font-family: var(--font-geist-mono);
|
||||||
|
padding-left: 0;
|
||||||
|
margin: 0;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: -0.01em;
|
||||||
|
list-style-position: inside;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main li:not(:last-of-type) {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main code {
|
||||||
|
font-family: inherit;
|
||||||
|
background: var(--gray-alpha-100);
|
||||||
|
padding: 2px 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctas {
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctas a {
|
||||||
|
appearance: none;
|
||||||
|
border-radius: 128px;
|
||||||
|
height: 48px;
|
||||||
|
padding: 0 20px;
|
||||||
|
border: none;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
transition:
|
||||||
|
background 0.2s,
|
||||||
|
color 0.2s,
|
||||||
|
border-color 0.2s;
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 20px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.primary {
|
||||||
|
background: var(--foreground);
|
||||||
|
color: var(--background);
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.secondary {
|
||||||
|
border-color: var(--gray-alpha-200);
|
||||||
|
min-width: 158px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
grid-row-start: 3;
|
||||||
|
display: flex;
|
||||||
|
gap: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer a {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer img {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable hover only on non-touch devices */
|
||||||
|
@media (hover: hover) and (pointer: fine) {
|
||||||
|
a.primary:hover {
|
||||||
|
background: var(--button-primary-hover);
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.secondary:hover {
|
||||||
|
background: var(--button-secondary-hover);
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
text-underline-offset: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
.page {
|
||||||
|
padding: 32px;
|
||||||
|
padding-bottom: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main ol {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctas {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctas a {
|
||||||
|
font-size: 14px;
|
||||||
|
height: 40px;
|
||||||
|
padding: 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.secondary {
|
||||||
|
min-width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.logo {
|
||||||
|
filter: invert();
|
||||||
|
}
|
||||||
|
}
|
||||||
5
app/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
|
||||||
|
export default function Home () {
|
||||||
|
|
||||||
|
}
|
||||||
12
auth.d.ts
vendored
@ -1,12 +0,0 @@
|
|||||||
import { DefaultSession } from "next-auth";
|
|
||||||
|
|
||||||
declare module "next-auth" {
|
|
||||||
export interface User extends Partial<DefaultSession<User>> {
|
|
||||||
access_token: string;
|
|
||||||
refresh_token: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Session {
|
|
||||||
user: User;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,31 +1,7 @@
|
|||||||
module.exports = {
|
import type { NextConfig } from "next";
|
||||||
webpack(config:any) {
|
|
||||||
// Grab the existing rule that handles SVG imports
|
|
||||||
const fileLoaderRule = config.module.rules.find((rule:any) =>
|
|
||||||
rule.test?.test?.('.svg'),
|
|
||||||
)
|
|
||||||
|
|
||||||
config.module.rules.push(
|
const nextConfig: NextConfig = {
|
||||||
// Reapply the existing rule, but only for svg imports ending in ?url
|
/* config options here */
|
||||||
{
|
};
|
||||||
...fileLoaderRule,
|
|
||||||
test: /\.svg$/i,
|
|
||||||
resourceQuery: /url/, // *.svg?url
|
|
||||||
},
|
|
||||||
// Convert all other *.svg imports to React components
|
|
||||||
{
|
|
||||||
test: /\.svg$/i,
|
|
||||||
issuer: fileLoaderRule.issuer,
|
|
||||||
resourceQuery: { not: [...fileLoaderRule.resourceQuery.not, /url/] }, // exclude if *.svg?url
|
|
||||||
use: ['@svgr/webpack'],
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
// Modify the file loader rule to ignore *.svg, since we have it handled now.
|
export default nextConfig;
|
||||||
fileLoaderRule.exclude = /\.svg$/i
|
|
||||||
|
|
||||||
return config
|
|
||||||
},
|
|
||||||
|
|
||||||
// ...other config
|
|
||||||
}
|
|
||||||
|
|||||||
4846
package-lock.json
generated
Normal file
32
package.json
@ -1,45 +1,25 @@
|
|||||||
{
|
{
|
||||||
"name": "privatedocs",
|
"name": "bootstrap-private-docs",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev --turbopack",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "next lint"
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@radix-ui/react-dialog": "^1.1.6",
|
|
||||||
"@radix-ui/themes": "^3.2.1",
|
|
||||||
"@tanstack/react-query": "^5.69.0",
|
|
||||||
"@tanstack/react-table": "^8.21.2",
|
|
||||||
"axios": "^1.8.4",
|
|
||||||
"clsx": "^2.1.1",
|
|
||||||
"jwt-decode": "^4.0.0",
|
|
||||||
"next": "15.2.3",
|
|
||||||
"next-auth": "^4.24.11",
|
|
||||||
"nextjs-toploader": "^3.8.15",
|
|
||||||
"nuqs": "^2.4.1",
|
|
||||||
"radix-ui": "^1.1.3",
|
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
"react-hook-form": "^7.54.2",
|
"next": "15.2.4"
|
||||||
"sass": "^1.86.0",
|
|
||||||
"sonner": "^2.0.2",
|
|
||||||
"zod": "^3.24.2"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3",
|
"typescript": "^5",
|
||||||
"@svgr/webpack": "^8.1.0",
|
|
||||||
"@tailwindcss/postcss": "^4",
|
|
||||||
"@types/node": "^20",
|
"@types/node": "^20",
|
||||||
"@types/react": "^19",
|
"@types/react": "^19",
|
||||||
"@types/react-dom": "^19",
|
"@types/react-dom": "^19",
|
||||||
"eslint": "^9",
|
"eslint": "^9",
|
||||||
"eslint-config-next": "15.2.3",
|
"eslint-config-next": "15.2.4",
|
||||||
"install": "^0.13.0",
|
"@eslint/eslintrc": "^3"
|
||||||
"npm": "^11.2.0",
|
|
||||||
"tailwindcss": "^4",
|
|
||||||
"typescript": "^5"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4919
pnpm-lock.yaml
generated
@ -1,5 +0,0 @@
|
|||||||
const config = {
|
|
||||||
plugins: ["@tailwindcss/postcss"],
|
|
||||||
};
|
|
||||||
|
|
||||||
export default config;
|
|
||||||
|
Before Width: | Height: | Size: 1.3 MiB |
@ -1,12 +0,0 @@
|
|||||||
import Header from "#/components/header";
|
|
||||||
|
|
||||||
export default function AuthLayout({ children }: { children: React.ReactNode }) {
|
|
||||||
return(
|
|
||||||
<div className="flex flex-col min-h-screen">
|
|
||||||
<Header />
|
|
||||||
<div className="flex flex-1 justify-center items-center bg-blue-100">
|
|
||||||
{children}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,77 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import Form from "#/components/form/form"
|
|
||||||
import { loginSchema } from "#/schema"
|
|
||||||
import { useMutation } from "@tanstack/react-query"
|
|
||||||
import { signIn } from "next-auth/react"
|
|
||||||
import { useRouter, useSearchParams } from "next/navigation";
|
|
||||||
|
|
||||||
export default function LoginPage() {
|
|
||||||
const router = useRouter()
|
|
||||||
const params = useSearchParams().get("redirect_to");
|
|
||||||
|
|
||||||
const mutation = useMutation({
|
|
||||||
mutationKey: ['login'],
|
|
||||||
mutationFn: async (data: { email: string; password: string }) => {
|
|
||||||
try {
|
|
||||||
const result = await signIn("credentials", {
|
|
||||||
email: data.email,
|
|
||||||
password: data.password,
|
|
||||||
redirect: false,
|
|
||||||
})
|
|
||||||
|
|
||||||
if (result?.error) {
|
|
||||||
const errorMessage = result.error.includes("CredentialsSignin")
|
|
||||||
? "Email ou mot de passe incorrect"
|
|
||||||
: result.error;
|
|
||||||
console.error(errorMessage)
|
|
||||||
throw new Error(result.error)
|
|
||||||
} else {
|
|
||||||
if (params) {
|
|
||||||
router.push(params);
|
|
||||||
} else {
|
|
||||||
router.push('/admin/home')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
} catch (error: unknown) {
|
|
||||||
if (error instanceof Error && error.message.includes("Network Error")) {
|
|
||||||
console.error("Problème de connexion au serveur");
|
|
||||||
}
|
|
||||||
console.error("Autre = ", error);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
},
|
|
||||||
onError: (error: Error) => {
|
|
||||||
console.error(error.message)
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
return(
|
|
||||||
<div>
|
|
||||||
<Form
|
|
||||||
title="Connexion"
|
|
||||||
formClassName="bg-white p-10 shadow-2xl w-3/4 lg:w-lg"
|
|
||||||
fields={[
|
|
||||||
{
|
|
||||||
label: "Email",
|
|
||||||
name: "email",
|
|
||||||
type: "email",
|
|
||||||
placeholder: "Entrer votre email"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Password",
|
|
||||||
name: "password",
|
|
||||||
type: "password",
|
|
||||||
placeholder: "Enter votre mot de passe",
|
|
||||||
showPasswordToggle: true
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
submit={mutation.mutate}
|
|
||||||
schema={loginSchema}
|
|
||||||
child={<button disabled={mutation.isPending} type="submit" className={`${mutation.isPending ? "btn-auth-loading" : "btn-auth"} mt-4`}>{mutation.isPending ? "Chargement..." : "Connexion"}</button>}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,424 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import { useState } from "react";
|
|
||||||
import Image from "next/image";
|
|
||||||
import { useSession } from "next-auth/react";
|
|
||||||
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
||||||
import { ColumnDef } from "@tanstack/react-table";
|
|
||||||
import axios from "axios";
|
|
||||||
import { DropdownMenu } from "radix-ui";
|
|
||||||
import FloatingLabelInput from "#/components/floatingLabelInput";
|
|
||||||
import { Modal } from "#/components/modal";
|
|
||||||
import Table from "#/components/table/table";
|
|
||||||
import Form from "#/components/form/form";
|
|
||||||
import { icons } from "#/assets/icons";
|
|
||||||
import { adminSchema } from "#/schema";
|
|
||||||
import { Admin } from "#/types";
|
|
||||||
|
|
||||||
export default function Admins() {
|
|
||||||
const { data: session, status } = useSession();
|
|
||||||
const [openModal, setOpenModal] = useState(false);
|
|
||||||
const [openDeleteModal, setOpenDeleteModal] = useState(false);
|
|
||||||
const [openEditModal, setOpenEditModal] = useState(false);
|
|
||||||
const [selectedAdminId, setSelectedAdminId] = useState<string | null>(null);
|
|
||||||
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data: users,
|
|
||||||
refetch,
|
|
||||||
isLoading,
|
|
||||||
} = useQuery({
|
|
||||||
enabled: status === "authenticated",
|
|
||||||
queryKey: ["users"],
|
|
||||||
queryFn: async () => {
|
|
||||||
try {
|
|
||||||
const response = await axios.get(
|
|
||||||
"https://private-docs-api.intside.co/users",
|
|
||||||
{
|
|
||||||
headers: { Authorization: `Bearer ${session?.user.access_token}` },
|
|
||||||
}
|
|
||||||
);
|
|
||||||
return response.data.data as Admin[];
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
const createMutation = useMutation({
|
|
||||||
mutationFn: async (data: {
|
|
||||||
last_name: string;
|
|
||||||
first_name: string;
|
|
||||||
email: string;
|
|
||||||
}) => {
|
|
||||||
try {
|
|
||||||
const response = await axios.post(
|
|
||||||
"https://private-docs-api.intside.co/users/",
|
|
||||||
{ ...data, user_type: "admin" },
|
|
||||||
{ headers: { Authorization: `Bearer ${session?.user.access_token}` } }
|
|
||||||
);
|
|
||||||
|
|
||||||
if (response.status === 200 || response.status === 201) {
|
|
||||||
console.log("ajout réussie !");
|
|
||||||
setOpenModal(false);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Erreur lors de la création", error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSuccess: () => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ["users"] });
|
|
||||||
refetch();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const updateMutation = useMutation({
|
|
||||||
mutationFn: async (data: {
|
|
||||||
id: string;
|
|
||||||
last_name: string;
|
|
||||||
first_name: string;
|
|
||||||
email: string;
|
|
||||||
}) => {
|
|
||||||
try {
|
|
||||||
const response = await axios.put(
|
|
||||||
`https://private-docs-api.intside.co/users/${data.id}/`,
|
|
||||||
data,
|
|
||||||
{ headers: { Authorization: `Bearer ${session?.user.access_token}` } }
|
|
||||||
);
|
|
||||||
|
|
||||||
if (response.status === 200 || response.status === 201) {
|
|
||||||
console.log("modification réussie !");
|
|
||||||
setOpenEditModal(false);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Erreur lors de la mise à jour", error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSuccess: () => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ["users"] });
|
|
||||||
refetch();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const deleteMutation = useMutation({
|
|
||||||
mutationFn: async (id: string) => {
|
|
||||||
try {
|
|
||||||
const response = await axios.delete(
|
|
||||||
`https://private-docs-api.intside.co/users/${id}/`,
|
|
||||||
{
|
|
||||||
headers: { Authorization: `Bearer ${session?.user.access_token}` },
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (response.status === 200 || response.status === 201) {
|
|
||||||
console.log("Suppresion réussie !");
|
|
||||||
setOpenDeleteModal(false);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Erreur lors de la suppression", error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSuccess: () => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ["users"] });
|
|
||||||
refetch();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const bulkDeleteMutation = useMutation({
|
|
||||||
mutationFn: async (ids: string[]) => {
|
|
||||||
try {
|
|
||||||
const deletePromises = ids.map((id) =>
|
|
||||||
axios.delete(`https://private-docs-api.intside.co/users/${id}/`, {
|
|
||||||
headers: { Authorization: `Bearer ${session?.user.access_token}` },
|
|
||||||
})
|
|
||||||
);
|
|
||||||
await Promise.all(deletePromises);
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Erreur lors de la suppression groupée", error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSuccess: () => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ["users"] });
|
|
||||||
refetch();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const columns: ColumnDef<Admin>[] = [
|
|
||||||
{
|
|
||||||
header: "Administrateurs",
|
|
||||||
cell: ({ row }) => {
|
|
||||||
const fullName = `${row.original.first_name} ${row.original.last_name}`;
|
|
||||||
const initials = `${row.original.first_name[0]}${row.original.last_name[0]}`;
|
|
||||||
return (
|
|
||||||
<div className="flex space-x-2 items-center">
|
|
||||||
<div className="flex items-center justify-center bg-[#DCDCFE] text-[#246BFD] w-10 h-10 rounded-full">
|
|
||||||
{initials}
|
|
||||||
</div>
|
|
||||||
<p>{fullName}</p>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "email",
|
|
||||||
header: "Adresse e-mail",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "actions",
|
|
||||||
cell: ({ row }) => {
|
|
||||||
const admin = row.original;
|
|
||||||
return (
|
|
||||||
<div className="flex justify-end p-2 space-x-2">
|
|
||||||
{/* Modal d'édition */}
|
|
||||||
<Modal
|
|
||||||
open={openEditModal && selectedAdminId === admin.id}
|
|
||||||
onOpenChange={(isOpen) => {
|
|
||||||
if (!isOpen) {
|
|
||||||
setSelectedAdminId(null);
|
|
||||||
setOpenEditModal(false);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
trigger={
|
|
||||||
<div
|
|
||||||
onClick={() => {
|
|
||||||
setSelectedAdminId(admin.id);
|
|
||||||
setOpenEditModal(true);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Image
|
|
||||||
alt="Éditer"
|
|
||||||
width={24}
|
|
||||||
height={24}
|
|
||||||
src={icons.editIcon}
|
|
||||||
className="cursor-pointer responsive-icon mr-1"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
title="Modifier un admin"
|
|
||||||
content={
|
|
||||||
<Form
|
|
||||||
fields={[
|
|
||||||
{ name: "id", type: "hidden", defaultValue: admin.id },
|
|
||||||
{
|
|
||||||
name: "last_name",
|
|
||||||
label: "Nom",
|
|
||||||
type: "text",
|
|
||||||
placeholder: "Entrer le nom de l'admin",
|
|
||||||
defaultValue: admin.last_name,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "first_name",
|
|
||||||
label: "Prénom",
|
|
||||||
type: "text",
|
|
||||||
placeholder: "Entrer le prénom de l'admin",
|
|
||||||
defaultValue: admin.first_name,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "email",
|
|
||||||
label: "Adresse e-mail",
|
|
||||||
type: "text",
|
|
||||||
placeholder: "Entrer l'email de l'admin",
|
|
||||||
defaultValue: admin.email,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
submit={updateMutation.mutate}
|
|
||||||
schema={adminSchema}
|
|
||||||
child={
|
|
||||||
<div className="flex justify-center">
|
|
||||||
<button
|
|
||||||
type="submit"
|
|
||||||
disabled={updateMutation.isPending}
|
|
||||||
className={`${updateMutation.isPending ? "btn-auth-loading" : "btn-auth"} cta modal-cta mt-4 cursor-pointer`}
|
|
||||||
>
|
|
||||||
{updateMutation.isPending ? "En cours..." : "Modifier"}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
|
|
||||||
{/* Modal de suppression */}
|
|
||||||
<Modal
|
|
||||||
open={openDeleteModal && selectedAdminId === admin.id}
|
|
||||||
onOpenChange={(isOpen) => {
|
|
||||||
if (!isOpen) {
|
|
||||||
setSelectedAdminId(null);
|
|
||||||
setOpenDeleteModal(false);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
trigger={
|
|
||||||
<div
|
|
||||||
onClick={() => {
|
|
||||||
setSelectedAdminId(admin.id);
|
|
||||||
setOpenDeleteModal(true);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Image
|
|
||||||
alt="Supprimer"
|
|
||||||
src={icons.trash}
|
|
||||||
className="cursor-pointer responsive-icon"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
title="Supprimer un admin"
|
|
||||||
content={
|
|
||||||
<div>
|
|
||||||
<p className="text-center">Voulez-vous vraiment supprimer cet admin ?</p>
|
|
||||||
<div className="grid grid-cols-2 gap-3 mt-3">
|
|
||||||
<button
|
|
||||||
className="bg-blue-100 text-blue-600 py-2 px-4 rounded-full cursor-pointer"
|
|
||||||
onClick={() => {
|
|
||||||
setOpenDeleteModal(false);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Annuler
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
className="bg-red-500 text-white py-2 px-4 rounded-full hover:bg-red-600 cursor-pointer"
|
|
||||||
onClick={() => {
|
|
||||||
deleteMutation.mutate(admin.id);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Supprimer
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Table
|
|
||||||
columns={columns}
|
|
||||||
data={users || []}
|
|
||||||
pageSize={5}
|
|
||||||
isDataLoading={isLoading}
|
|
||||||
header={(table) => {
|
|
||||||
const selectedIds = table
|
|
||||||
.getRowModel()
|
|
||||||
.rows.filter((row) => row.getIsSelected())
|
|
||||||
.map((row) => row.original.id);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="grid grid-cols-1 lg:grid-cols-2 w-full space-y-3">
|
|
||||||
<div className="flex items-center space-x-3">
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
checked={
|
|
||||||
table.getIsAllPageRowsSelected() ||
|
|
||||||
(table.getIsSomePageRowsSelected() && undefined)
|
|
||||||
}
|
|
||||||
onChange={(e) =>
|
|
||||||
table.toggleAllPageRowsSelected(e.target.checked)
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<DropdownMenu.Root>
|
|
||||||
<DropdownMenu.Trigger asChild>
|
|
||||||
<p className="cta cancel flex gap-2">
|
|
||||||
Sélectionner une action
|
|
||||||
<Image src={icons.arrowDown} alt="arrow down" />
|
|
||||||
</p>
|
|
||||||
</DropdownMenu.Trigger>
|
|
||||||
|
|
||||||
<DropdownMenu.Portal>
|
|
||||||
<DropdownMenu.Content
|
|
||||||
className="min-w-[150px] shadow-sm bg-white rounded-md p-1"
|
|
||||||
sideOffset={5}
|
|
||||||
>
|
|
||||||
<DropdownMenu.Item
|
|
||||||
onClick={() => bulkDeleteMutation.mutate(selectedIds)}
|
|
||||||
className="p-2 text-[14px] cursor-pointer hover:bg-blue-100 hover:text-blue-500 rounded-md"
|
|
||||||
>
|
|
||||||
Supprimer
|
|
||||||
</DropdownMenu.Item>
|
|
||||||
</DropdownMenu.Content>
|
|
||||||
</DropdownMenu.Portal>
|
|
||||||
</DropdownMenu.Root>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex justify-between lg:justify-end space-x-3">
|
|
||||||
{/* Modal d'ajout */}
|
|
||||||
<Modal
|
|
||||||
title="Ajouter un admin"
|
|
||||||
open={openModal}
|
|
||||||
onOpenChange={(isOpen) => {
|
|
||||||
if (!isOpen) {
|
|
||||||
setOpenModal(false);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
trigger={
|
|
||||||
<div
|
|
||||||
onClick={() => setOpenModal(true)}
|
|
||||||
className="cta"
|
|
||||||
>
|
|
||||||
Ajouter un admin
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
content={
|
|
||||||
<Form
|
|
||||||
fields={[
|
|
||||||
{
|
|
||||||
name: "last_name",
|
|
||||||
label: "Nom",
|
|
||||||
type: "text",
|
|
||||||
placeholder: "Entrer le nom de l'admin",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "first_name",
|
|
||||||
label: "Prénom",
|
|
||||||
type: "text",
|
|
||||||
placeholder: "Entrer le prénom de l'admin",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "email",
|
|
||||||
label: "Adresse e-mail",
|
|
||||||
type: "text",
|
|
||||||
placeholder: "Entrer l'email de l'admin",
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
submit={createMutation.mutate}
|
|
||||||
schema={adminSchema}
|
|
||||||
child={
|
|
||||||
<div className="flex justify-center">
|
|
||||||
<button
|
|
||||||
type="submit"
|
|
||||||
disabled={createMutation.isPending}
|
|
||||||
className={`${createMutation.isPending ? "btn-auth-loading" : "btn-auth"} cta modal-cta mt-4 cursor-pointer`}
|
|
||||||
>
|
|
||||||
{createMutation.isPending ? "Création de l'admin..." : "Créer le compte"}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<FloatingLabelInput
|
|
||||||
name="search"
|
|
||||||
placeholder="Effectuer une recherche"
|
|
||||||
type="search"
|
|
||||||
onChange={(value) => table.setGlobalFilter(value)}
|
|
||||||
button={
|
|
||||||
<Image
|
|
||||||
alt="Filtrer"
|
|
||||||
src={icons.filterIcon}
|
|
||||||
className="cursor-pointer"
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,209 +0,0 @@
|
|||||||
"use client"
|
|
||||||
|
|
||||||
import { icons } from "#/assets/icons"
|
|
||||||
import Statistics from "#/components/stats"
|
|
||||||
import Table from "#/components/table/table"
|
|
||||||
import { Company } from "#/types"
|
|
||||||
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"
|
|
||||||
import { ColumnDef } from "@tanstack/react-table"
|
|
||||||
import axios from "axios"
|
|
||||||
import { useSession } from "next-auth/react"
|
|
||||||
import Image from "next/image"
|
|
||||||
import { Modal } from "#/components/modal"
|
|
||||||
import { useState } from "react"
|
|
||||||
|
|
||||||
export default function HomePage () {
|
|
||||||
|
|
||||||
const {data: session, status} = useSession()
|
|
||||||
const queryClient = useQueryClient()
|
|
||||||
const [open, setOpen] = useState(false);
|
|
||||||
const [selectedId, setSelectedId] = useState<string | null>(null);
|
|
||||||
|
|
||||||
console.log("Session = ", session)
|
|
||||||
|
|
||||||
const { data: companies, refetch, isLoading} = useQuery({
|
|
||||||
enabled: status === 'authenticated',
|
|
||||||
queryKey: ["companies"],
|
|
||||||
queryFn: async () => {
|
|
||||||
try {
|
|
||||||
const response = await axios.get(
|
|
||||||
'https://private-docs-api.intside.co/companies', {
|
|
||||||
headers: {
|
|
||||||
'Authorization': `Bearer ${session?.user.access_token}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(response.data) {
|
|
||||||
return response.data.data as Company[]
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const { mutate } = useMutation({
|
|
||||||
mutationFn: async (id: string) => {
|
|
||||||
try {
|
|
||||||
const response = await axios.delete(
|
|
||||||
`https://private-docs-api.intside.co/companies/${id}/`, {
|
|
||||||
headers: {
|
|
||||||
'Authorization': `Bearer ${session?.user.access_token}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(response.status === 200 || response.status === 201) {
|
|
||||||
console.log('Suppresion réussie !')
|
|
||||||
setOpen(false)
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSuccess: () => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ["companies"] })
|
|
||||||
|
|
||||||
refetch()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const columns: ColumnDef<Company>[] = [
|
|
||||||
{
|
|
||||||
accessorKey: "name",
|
|
||||||
header: "Organisations",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "total_users",
|
|
||||||
header: "Utilisateurs",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header: "Administrateurs",
|
|
||||||
cell: ({ row }) => {
|
|
||||||
const value = String(row.original.owner.first_name) + " " + String(row.original.owner.last_name)
|
|
||||||
const initials = String(row.original.owner.first_name[0]) + String(row.original.owner.last_name[0])
|
|
||||||
return(
|
|
||||||
<div className="flex space-x-2 items-center">
|
|
||||||
<div className="flex items-center justify-center bg-[#DCDCFE] text-[#246BFD] w-10 h-10 rounded-full">
|
|
||||||
{initials}
|
|
||||||
</div>
|
|
||||||
<p>{value}</p>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "owner.email",
|
|
||||||
header: "Adresse e-mail"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "status",
|
|
||||||
header: "Statut",
|
|
||||||
cell: ({ cell }) => {
|
|
||||||
const status = String(cell.getValue())
|
|
||||||
return (
|
|
||||||
<p
|
|
||||||
className={`rounded-full px-2 py-1 font-medium text-sm w-20 h-6 text-center
|
|
||||||
${
|
|
||||||
status === "active" ? "bg-[#ECF9E8] text-[#49C91E]" :
|
|
||||||
status === "inactive" ? "bg-[#E7EBF3] text-[#9FA8BC]" :
|
|
||||||
status === "pending" ? "bg-[#EAF7FC] text-[#30B2EA]" :
|
|
||||||
status === "blocked" ? "bg-[#FDEBE8] text-[#F33F19]" :
|
|
||||||
""
|
|
||||||
}
|
|
||||||
`}
|
|
||||||
>
|
|
||||||
{
|
|
||||||
status === "active" ? "Actif" :
|
|
||||||
status === "inactive" ? "Inactif" :
|
|
||||||
status === "pending" ? "En attente" :
|
|
||||||
status === "blocked" ? "Bloquée" :
|
|
||||||
""
|
|
||||||
}
|
|
||||||
</p>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "delete",
|
|
||||||
cell: ({ row }) => {
|
|
||||||
const id = String(row.original.id);
|
|
||||||
return (
|
|
||||||
<div className="relative p-2 cursor-pointer">
|
|
||||||
<Modal
|
|
||||||
open={selectedId === id}
|
|
||||||
onOpenChange={(isOpen) => {
|
|
||||||
if (!isOpen) {
|
|
||||||
setSelectedId(null);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
trigger={
|
|
||||||
<div
|
|
||||||
onClick={() => {
|
|
||||||
setSelectedId(id);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Image
|
|
||||||
alt=""
|
|
||||||
src={icons.trash}
|
|
||||||
className="cursor-pointer responsive-icon"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
title={
|
|
||||||
<p className="font-bold text-3xl">
|
|
||||||
Supprimer cette organisation
|
|
||||||
</p>
|
|
||||||
}
|
|
||||||
content={
|
|
||||||
<div>
|
|
||||||
<p className="text-center">
|
|
||||||
Voulez-vous vraiment supprimer l'organisation <span className="font-bold">{row.original.name}</span> ?
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div className="flex justify-between w-full pt-6 r-gap-24">
|
|
||||||
<button
|
|
||||||
className="cta modal-cta cancel"
|
|
||||||
onClick={() => {
|
|
||||||
setSelectedId(null);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Annuler
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
className="cta modal-cta danger"
|
|
||||||
onClick={() => {
|
|
||||||
mutate(id);
|
|
||||||
setSelectedId(null);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Supprimer
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
return(
|
|
||||||
<div className="space-y-10">
|
|
||||||
<Statistics />
|
|
||||||
|
|
||||||
<p className="font-bold text-xl">Dernières organisations actives</p>
|
|
||||||
|
|
||||||
<Table
|
|
||||||
columns={columns}
|
|
||||||
isDataLoading={isLoading}
|
|
||||||
data={companies || []}
|
|
||||||
pageSize={5}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
"use client"
|
|
||||||
|
|
||||||
import { ReactNode, useEffect } from "react";
|
|
||||||
import "../../assets/css/admin.css"
|
|
||||||
import Sidebar from "../../components/admin/sidebar";
|
|
||||||
import Header from "../../components/admin/adminHeader";
|
|
||||||
import { signOutFunc } from "#/lib/function";
|
|
||||||
import { usePathname } from "next/navigation";
|
|
||||||
import { useSession } from "next-auth/react";
|
|
||||||
|
|
||||||
export default function Dashboard({ children }: { children: ReactNode }) {
|
|
||||||
const { status, data } = useSession();
|
|
||||||
const path = usePathname();
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (status !== "loading") {
|
|
||||||
if (status === "unauthenticated" || (data && !data.user.access_token)) {
|
|
||||||
signOutFunc();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, [data, status, path]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
|
|
||||||
<div className="r-flex-between">
|
|
||||||
<Sidebar />
|
|
||||||
<main className="flex-grow-1 min-w-0 pt-md-1 pt-sm-5">
|
|
||||||
<Header/>
|
|
||||||
<div className="main px-[44px] py-[64px] ">
|
|
||||||
{children}
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</div >
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,164 +0,0 @@
|
|||||||
"use client"
|
|
||||||
import { icons } from "#/assets/icons"
|
|
||||||
import Image from "next/image"
|
|
||||||
import axios from "axios";
|
|
||||||
import { useSession } from "next-auth/react";
|
|
||||||
import { useQuery } from "@tanstack/react-query";
|
|
||||||
import { Company, CompanyById, Owner } from "#/types";
|
|
||||||
import Link from "next/link";
|
|
||||||
import { usePathname } from "next/navigation";
|
|
||||||
|
|
||||||
|
|
||||||
export default function Profile() {
|
|
||||||
|
|
||||||
const pathname = usePathname();
|
|
||||||
|
|
||||||
const segments = pathname.split("/");
|
|
||||||
const uid = segments[segments.length - 1];
|
|
||||||
|
|
||||||
|
|
||||||
const { data: session, status } = useSession();
|
|
||||||
|
|
||||||
const { data: companyInfos, isLoading } = useQuery({
|
|
||||||
enabled: status === 'authenticated',
|
|
||||||
queryKey: ["companyStats", session?.user.access_token],
|
|
||||||
queryFn: async () => {
|
|
||||||
try {
|
|
||||||
const response = await axios.get(
|
|
||||||
`https://private-docs-api.intside.co/companies/${uid}`, {
|
|
||||||
headers: {
|
|
||||||
'Authorization': `Bearer ${session?.user.access_token}`
|
|
||||||
},
|
|
||||||
params: {
|
|
||||||
details: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (response.data) {
|
|
||||||
return response.data as CompanyById;
|
|
||||||
}
|
|
||||||
} catch (error: any) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/*
|
|
||||||
const adminId = companyInfos?.owner;
|
|
||||||
console.log('will run the admin request');
|
|
||||||
|
|
||||||
const { data: adminInfos } = useQuery({
|
|
||||||
enabled: !!adminId && status === 'authenticated', // Only run when adminId is available
|
|
||||||
queryKey: ["admin", adminId], // Ensure adminId is used in the query key
|
|
||||||
queryFn: async () => {
|
|
||||||
console.log('running the admin request');
|
|
||||||
//console.log('url :', `https://private-docs-api.intside.co/users/${adminId}`);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await axios.get(
|
|
||||||
`https://private-docs-api.intside.co/users/${adminId}`, { // Use adminId instead of companyInfos
|
|
||||||
headers: {
|
|
||||||
'Authorization': `Bearer ${session?.user.access_token}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (response.data) {
|
|
||||||
return response.data as Owner;
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{/* {companyInfos[0]?.id} */}
|
|
||||||
<div className="p-container ">
|
|
||||||
<div className="r-flex-column">
|
|
||||||
<div className="r-flex-between items-center bg-bluegray p-[24px] m-0 ">
|
|
||||||
<div className=""></div>
|
|
||||||
<h2 className="admin-name text-[20px]" >{companyInfos?.name || "Pentatonic"}</h2>
|
|
||||||
<Link href={`http://localhost:3000/admin/organizations/${uid}/update`} type="Link" className="update-profile-name cta">
|
|
||||||
Modifier
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-column p-[32px] r-gap-24 items-center lg:items-start ">
|
|
||||||
<h3 className="font-semibold">Détails de l'admin</h3>
|
|
||||||
<div className="r-flex flex-wrap r-r-gap-12 gap-[12px]">
|
|
||||||
<div className="r-flex-between items-center w-max">
|
|
||||||
<div className="icon-rounded">
|
|
||||||
<Image src={icons.mailIcon} alt="E-mail" />
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-column p-[14px] admin-card r-gap-2">
|
|
||||||
<h4 className="email-label font-semibold">Adresse e-mail</h4>
|
|
||||||
<p className="email">{companyInfos?.owner?.email || "email"}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-between items-center w-max">
|
|
||||||
<div className="icon-rounded">
|
|
||||||
<Image src={icons.personalCard} alt="E-mail" />
|
|
||||||
</div>
|
|
||||||
<div className="r-flex gap-[12px] admin-card">
|
|
||||||
<div className="r-flex-column p-[14px] r-gap-2">
|
|
||||||
<h4 className="surname-label font-semibold">Prénom</h4>
|
|
||||||
<p className="surname">{companyInfos?.owner?.first_name || "nom"}</p>
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-column p-[14px] r-gap-2">
|
|
||||||
<h4 className="name-label font-semibold">Nom</h4>
|
|
||||||
<p className="name">{companyInfos?.owner?.last_name || "nom"}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr />
|
|
||||||
<div className="r-flex p-[32px] r-gap-24">
|
|
||||||
<div className="admin-infos r-flex flex-wrap justifyy-center lg:justifyy-start ">
|
|
||||||
<div className="r-flex-between items-center w-max">
|
|
||||||
<div className="icon-rounded">
|
|
||||||
<Image src={icons.userGroupBlue} alt="Documents" />
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-column p-[14px] admin-card r-gap-2">
|
|
||||||
<h4 className="users-label font-semibold">Documents</h4>
|
|
||||||
<p className="r-secondary users">{companyInfos?.total_documents || "0"}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-between items-center w-max">
|
|
||||||
<div className="icon-rounded">
|
|
||||||
<Image src={icons.userGroupBlue} alt="Documents" />
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-column p-[14px] admin-card r-gap-2">
|
|
||||||
<h4 className="users-label font-semibold">Utilisateurs</h4>
|
|
||||||
<p className="r-secondary users">{companyInfos?.total_users || "0"}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-between items-center w-max">
|
|
||||||
<div className="icon-rounded">
|
|
||||||
<Image src={icons.maximizeIcon} alt="Fichiers" />
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-column p-[14px] admin-card r-gap-2">
|
|
||||||
<h4 className="files-size-label font-semibold">Taille des fichiers</h4>
|
|
||||||
<p className="r-secondary files-size">{companyInfos?.total_documents_sizes + " "}GB</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-between items-center w-max">
|
|
||||||
<div className="icon-rounded">
|
|
||||||
<Image src={icons.timerIcon} alt="Horlorge" />
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-column p-[14px] admin-card r-gap-2">
|
|
||||||
<h4 className="last-connexion-label font-semibold">Dernière utilisation</h4>
|
|
||||||
<p className="r-secondary last-connexion">{companyInfos?.last_use || "-"}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,147 +0,0 @@
|
|||||||
"use client"
|
|
||||||
import { icons } from "#/assets/icons"
|
|
||||||
import Image from "next/image"
|
|
||||||
import axios from "axios";
|
|
||||||
import { useSession } from "next-auth/react";
|
|
||||||
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
||||||
import { Company, CompanyById } from "#/types";
|
|
||||||
import FloatingLabelInput from "#/components/floatingLabelInput";
|
|
||||||
import { usePathname } from "next/navigation";
|
|
||||||
import Link from "next/link";
|
|
||||||
import Form from "#/components/form/form";
|
|
||||||
import { adminSchema } from "#/schema/loginSchema";
|
|
||||||
|
|
||||||
export default function Update() {
|
|
||||||
|
|
||||||
const pathname = usePathname();
|
|
||||||
|
|
||||||
const segments = pathname.split("/");
|
|
||||||
const uid = segments[segments.length - 2];
|
|
||||||
const queryClient = useQueryClient()
|
|
||||||
|
|
||||||
|
|
||||||
const { data: session, status } = useSession();
|
|
||||||
|
|
||||||
const { data: companyInfos, refetch, isLoading } = useQuery({
|
|
||||||
enabled: status === 'authenticated',
|
|
||||||
queryKey: ["companyStats", session?.user.access_token],
|
|
||||||
queryFn: async () => {
|
|
||||||
try {
|
|
||||||
const response = await axios.get(
|
|
||||||
`https://private-docs-api.intside.co/users/${uid}`, {
|
|
||||||
headers: {
|
|
||||||
'Authorization': `Bearer ${session?.user.access_token}`
|
|
||||||
},
|
|
||||||
params: {
|
|
||||||
details: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (response.data) {
|
|
||||||
return response.data as CompanyById;
|
|
||||||
}
|
|
||||||
} catch (error: any) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const { mutate, isPending } = useMutation({
|
|
||||||
mutationFn: async (id: string) => {
|
|
||||||
try {
|
|
||||||
const response = await axios.delete(
|
|
||||||
`https://private-docs-api.intside.co/companies/${id}/`, {
|
|
||||||
headers: {
|
|
||||||
'Authorization': `Bearer ${session?.user.access_token}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if (response.status === 200 || response.status === 201) {
|
|
||||||
console.log('Suppresion réussie !')
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSuccess: () => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ["companies"] })
|
|
||||||
|
|
||||||
refetch()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{/* { company.map() } */}
|
|
||||||
|
|
||||||
|
|
||||||
{/* <Form
|
|
||||||
title="Connexion"
|
|
||||||
className="grid grid-cols-2"
|
|
||||||
fields={[
|
|
||||||
{
|
|
||||||
label: "Nom de l’organisation",
|
|
||||||
name: "company",
|
|
||||||
type: "text",
|
|
||||||
placeholder: "Nom de l'organisation",
|
|
||||||
defaultValue: companyInfos?.name
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Nom de l’admin",
|
|
||||||
name: "last_name",
|
|
||||||
type: "text",
|
|
||||||
placeholder: "Nom de l'admin",
|
|
||||||
defaultValue: companyInfos?.owner.last_name
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Prénom de l’admin",
|
|
||||||
name: "first_name",
|
|
||||||
type: "text",
|
|
||||||
placeholder: "Prénom de l'admin",
|
|
||||||
defaultValue: companyInfos?.owner.first_name
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
submit={mutate}
|
|
||||||
schema={adminSchema}
|
|
||||||
child={<button type="submit" className="btn-auth">Connexion</button>}
|
|
||||||
/> */}
|
|
||||||
|
|
||||||
|
|
||||||
<div className="p-container ">
|
|
||||||
<div className="r-flex-column">
|
|
||||||
<div className="r-flex-between items-center bg-bluegray p-[24px] m-0 ">
|
|
||||||
<div className=""></div>
|
|
||||||
<h2 className="admin-name text-[20px]" >{companyInfos?.name || "Pentatonic"}</h2>
|
|
||||||
<Link href={`http://localhost:3000/admin/organizations/${uid}/`} type="Link" className="cta cancel">
|
|
||||||
Annuler
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
<div className="r-flex-column p-[32px] r-gap-24">
|
|
||||||
<div className="labels-container ">
|
|
||||||
<div className="label-container">
|
|
||||||
<FloatingLabelInput label="Nom de l’organisation" name="org-name" type="text" placeholder="Intside" defaultValue={companyInfos?.name} />
|
|
||||||
</div>
|
|
||||||
<div className="label-container">
|
|
||||||
<FloatingLabelInput label="Adresse e-mail de l’admin" name="email" type="text" placeholder="contact@intside.com" defaultValue={companyInfos?.owner.email} />
|
|
||||||
</div>
|
|
||||||
<div className="label-container">
|
|
||||||
<FloatingLabelInput label="Nom de l’admin" name="admin-name" type="text" placeholder="Company" defaultValue={companyInfos?.owner.last_name} />
|
|
||||||
</div>
|
|
||||||
<div className="label-container">
|
|
||||||
<FloatingLabelInput label="Prénom de l’admin" name="admin-surname" type="text" placeholder="Intside" defaultValue={companyInfos?.owner.last_name} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="ctas flex gap-12 ">
|
|
||||||
<button type="button" className="cta">Modifier</button>
|
|
||||||
<button type="button" className="cta info">Mot de passe</button>
|
|
||||||
<button type="button" className="cta danger">Bloquer</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,421 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import { useState } from "react";
|
|
||||||
import Image from "next/image";
|
|
||||||
import { useSession } from "next-auth/react";
|
|
||||||
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
||||||
import { ColumnDef } from "@tanstack/react-table";
|
|
||||||
import axios from "axios";
|
|
||||||
import { DropdownMenu } from "radix-ui";
|
|
||||||
import FloatingLabelInput from "#/components/floatingLabelInput";
|
|
||||||
import { Modal } from "#/components/modal";
|
|
||||||
import Table from "#/components/table/table";
|
|
||||||
import Form from "#/components/form/form";
|
|
||||||
import { icons } from "#/assets/icons";
|
|
||||||
import { companySchema } from "#/schema";
|
|
||||||
import { Admin, Company } from "#/types";
|
|
||||||
import Link from "next/link";
|
|
||||||
|
|
||||||
|
|
||||||
export default function Organizations() {
|
|
||||||
const { data: session, status } = useSession();
|
|
||||||
const [openModal, setOpenModal] = useState(false);
|
|
||||||
const [openDeleteModal, setOpenDeleteModal] = useState(false);
|
|
||||||
const [selectedAdminId, setSelectedAdminId] = useState<string | null>(null);
|
|
||||||
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data: companies,
|
|
||||||
refetch,
|
|
||||||
isLoading,
|
|
||||||
} = useQuery({
|
|
||||||
enabled: status === "authenticated",
|
|
||||||
queryKey: ["companies"],
|
|
||||||
queryFn: async () => {
|
|
||||||
try {
|
|
||||||
const response = await axios.get(
|
|
||||||
"https://private-docs-api.intside.co/companies",
|
|
||||||
{
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bearer ${session?.user.access_token}`,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (response.data) {
|
|
||||||
return response.data.data as Company[];
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
|
||||||
data: users,
|
|
||||||
} = useQuery({
|
|
||||||
enabled: status === "authenticated",
|
|
||||||
queryKey: ["organizations"],
|
|
||||||
queryFn: async () => {
|
|
||||||
try {
|
|
||||||
const response = await axios.get(
|
|
||||||
"https://private-docs-api.intside.co/users",
|
|
||||||
{
|
|
||||||
headers: { Authorization: `Bearer ${session?.user.access_token}` },
|
|
||||||
}
|
|
||||||
);
|
|
||||||
return response.data.data.map((user: Admin) => ({
|
|
||||||
id: user.id,
|
|
||||||
name: `${user.first_name} ${user.last_name}`,
|
|
||||||
}));
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const createMutation = useMutation({
|
|
||||||
mutationFn: async (data: {
|
|
||||||
name: string;
|
|
||||||
description: string;
|
|
||||||
status: string;
|
|
||||||
is_premium: string;
|
|
||||||
owner: string;
|
|
||||||
}) => {
|
|
||||||
try {
|
|
||||||
const response = await axios.post(
|
|
||||||
"https://private-docs-api.intside.co/companies/",
|
|
||||||
data,
|
|
||||||
{ headers: { Authorization: `Bearer ${session?.user.access_token}` } }
|
|
||||||
);
|
|
||||||
|
|
||||||
if (response.status === 200 || response.status === 201) {
|
|
||||||
console.log("ajout réussie !");
|
|
||||||
setOpenModal(false);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Erreur lors de la création", error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSuccess: () => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ["organizations"] });
|
|
||||||
refetch();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const deleteMutation = useMutation({
|
|
||||||
mutationFn: async (id: string) => {
|
|
||||||
try {
|
|
||||||
const response = await axios.delete(
|
|
||||||
`https://private-docs-api.intside.co/companies/${id}/`,
|
|
||||||
{
|
|
||||||
headers: { Authorization: `Bearer ${session?.user.access_token}` },
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (response.status === 200 || response.status === 201) {
|
|
||||||
console.log("Suppresion réussie !");
|
|
||||||
setOpenDeleteModal(false);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Erreur lors de la suppression", error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSuccess: () => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ["organizations"] });
|
|
||||||
refetch();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const bulkDeleteMutation = useMutation({
|
|
||||||
mutationFn: async (ids: string[]) => {
|
|
||||||
try {
|
|
||||||
const deletePromises = ids.map((id) =>
|
|
||||||
axios.delete(`https://private-docs-api.intside.co/companies/${id}/`, {
|
|
||||||
headers: { Authorization: `Bearer ${session?.user.access_token}` },
|
|
||||||
})
|
|
||||||
);
|
|
||||||
await Promise.all(deletePromises);
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Erreur lors de la suppression groupée", error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSuccess: () => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ["organizations"] });
|
|
||||||
refetch();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const columns: ColumnDef<Company>[] = [
|
|
||||||
{
|
|
||||||
accessorKey: "name",
|
|
||||||
header: "Organisations",
|
|
||||||
cell: ({ row }) => {
|
|
||||||
const company = row.original;
|
|
||||||
return (
|
|
||||||
<Link href={`/admin/organizations/${company.id}`}>
|
|
||||||
<p className="text-blue-600 hover:underline">{company.name}</p>
|
|
||||||
</Link>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "total_users",
|
|
||||||
header: "Utilisateurs",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header: "Administrateurs",
|
|
||||||
cell: ({ row }) => {
|
|
||||||
const value = String(row.original.owner.first_name) + " " + String(row.original.owner.last_name)
|
|
||||||
const initials = String(row.original.owner.first_name[0]) + String(row.original.owner.last_name[0])
|
|
||||||
return(
|
|
||||||
<div className="flex space-x-2 items-center">
|
|
||||||
<div className="flex items-center justify-center bg-[#DCDCFE] text-[#246BFD] w-10 h-10 rounded-full">
|
|
||||||
{initials}
|
|
||||||
</div>
|
|
||||||
<p>{value}</p>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "owner.email",
|
|
||||||
header: "Adresse e-mail"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "status",
|
|
||||||
header: "Statut",
|
|
||||||
cell: ({ cell }) => {
|
|
||||||
const status = String(cell.getValue())
|
|
||||||
return (
|
|
||||||
<p
|
|
||||||
className={`rounded-full px-2 py-1 font-medium text-sm w-20 h-6 text-center
|
|
||||||
${
|
|
||||||
status === "active" ? "font-medium w-[80px] h-[24px] bg-[#ECF9E8] text-[#49C91E]" :
|
|
||||||
status === "inactive" ? "font-medium w-[80px] h-[24px] bg-[#E7EBF3] text-[#9FA8BC]" :
|
|
||||||
status === "pending" ? "font-medium w-[80px] h-[24px] bg-[#EAF7FC] text-[#30B2EA]" :
|
|
||||||
status === "blocked" ? "font-medium w-[80px] h-[24px] bg-[#FDEBE8] text-[#F33F19]" :
|
|
||||||
""
|
|
||||||
}
|
|
||||||
`}
|
|
||||||
>
|
|
||||||
{
|
|
||||||
status === "active" ? "Actif" :
|
|
||||||
status === "inactive" ? "Inactif" :
|
|
||||||
status === "pending" ? "En attente" :
|
|
||||||
status === "blocked" ? "Bloquée" :
|
|
||||||
""
|
|
||||||
}
|
|
||||||
</p>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "delete",
|
|
||||||
cell: ({ row }) => {
|
|
||||||
const company = row.original;
|
|
||||||
return (
|
|
||||||
<div className="flex justify-end p-2 space-x-2"
|
|
||||||
// onClick={() => { mutate(id) }}
|
|
||||||
>
|
|
||||||
|
|
||||||
{/* Modal de suppression */}
|
|
||||||
<Modal
|
|
||||||
open={openDeleteModal && selectedAdminId === company.id}
|
|
||||||
onOpenChange={(isOpen) => {
|
|
||||||
if (!isOpen) {
|
|
||||||
setSelectedAdminId(null);
|
|
||||||
setOpenDeleteModal(false);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
trigger={
|
|
||||||
<div
|
|
||||||
onClick={() => {
|
|
||||||
setSelectedAdminId(company.id);
|
|
||||||
setOpenDeleteModal(true);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Image
|
|
||||||
alt="Supprimer"
|
|
||||||
src={icons.trash}
|
|
||||||
className="cursor-pointer responsive-icon"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
title="Supprimer une organisation"
|
|
||||||
content={
|
|
||||||
<div>
|
|
||||||
<p className="text-center">
|
|
||||||
Voulez-vous vraiment supprimer l'organisation <span className="font-bold">{row.original.name}</span> ?
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div className="flex justify-between w-full pt-6 r-gap-24">
|
|
||||||
<button
|
|
||||||
className="cta modal-cta cancel"
|
|
||||||
onClick={() => {
|
|
||||||
setOpenDeleteModal(false);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Annuler
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
className="cta modal-cta danger"
|
|
||||||
onClick={() => {
|
|
||||||
deleteMutation.mutate(company.id);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Supprimer
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Table
|
|
||||||
columns={columns}
|
|
||||||
data={companies || []}
|
|
||||||
pageSize={5}
|
|
||||||
isDataLoading={isLoading}
|
|
||||||
header={(table) => {
|
|
||||||
const selectedIds = table
|
|
||||||
.getRowModel()
|
|
||||||
.rows.filter((row) => row.getIsSelected())
|
|
||||||
.map((row) => row.original.id);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="grid grid-cols-1 lg:grid-cols-2 w-full space-y-3">
|
|
||||||
<div className="flex items-center space-x-3">
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
checked={
|
|
||||||
table.getIsAllPageRowsSelected() ||
|
|
||||||
(table.getIsSomePageRowsSelected() && undefined)
|
|
||||||
}
|
|
||||||
onChange={(e) =>
|
|
||||||
table.toggleAllPageRowsSelected(e.target.checked)
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<DropdownMenu.Root>
|
|
||||||
<DropdownMenu.Trigger asChild>
|
|
||||||
<p className="cta cancel flex gap-2">
|
|
||||||
Sélectionner une action
|
|
||||||
<Image src={icons.arrowDown} alt="arrow down" />
|
|
||||||
</p>
|
|
||||||
</DropdownMenu.Trigger>
|
|
||||||
|
|
||||||
<DropdownMenu.Portal>
|
|
||||||
<DropdownMenu.Content
|
|
||||||
className="min-w-[150px] shadow-sm bg-white rounded-md p-1 w-full"
|
|
||||||
sideOffset={0} side="bottom" align="end"
|
|
||||||
>
|
|
||||||
<DropdownMenu.Item
|
|
||||||
onClick={() => bulkDeleteMutation.mutate(selectedIds)}
|
|
||||||
className="p-2 text-[14px] cursor-pointer hover:bg-blue-100 hover:text-blue-500 rounded-md"
|
|
||||||
>
|
|
||||||
Supprimer
|
|
||||||
</DropdownMenu.Item>
|
|
||||||
</DropdownMenu.Content>
|
|
||||||
</DropdownMenu.Portal>
|
|
||||||
</DropdownMenu.Root>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex justify-between lg:justify-end space-x-3">
|
|
||||||
{/* Modal d'ajout */}
|
|
||||||
<Modal
|
|
||||||
title="Ajouter une organisation"
|
|
||||||
open={openModal}
|
|
||||||
onOpenChange={(isOpen) => {
|
|
||||||
if (!isOpen) {
|
|
||||||
setOpenModal(false);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
trigger={
|
|
||||||
<div
|
|
||||||
onClick={() => setOpenModal(true)}
|
|
||||||
className="cta"
|
|
||||||
>
|
|
||||||
Ajouter une organisation
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
content={
|
|
||||||
<Form
|
|
||||||
fields={[
|
|
||||||
{
|
|
||||||
name: "name",
|
|
||||||
label: "Nom de l'organisation",
|
|
||||||
type: "text",
|
|
||||||
placeholder: "Entrer le nom de l'organisation",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "description",
|
|
||||||
label: "Description",
|
|
||||||
type: "textarea",
|
|
||||||
placeholder: "Entrer la description de l'organisation",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "status",
|
|
||||||
label: "Statut",
|
|
||||||
type: "select",
|
|
||||||
options: [
|
|
||||||
{ label: "Actif", value: "active" },
|
|
||||||
{ label: "Inactif", value: "inactive" },
|
|
||||||
{ label: "En attente", value: "pending" },
|
|
||||||
{ label: "Bloqué", value: "blocked" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "owner",
|
|
||||||
label: "Administrateur",
|
|
||||||
type: "select",
|
|
||||||
options: users?.map((user: { id: string; name: string }) => ({
|
|
||||||
label: user.name,
|
|
||||||
value: user.id,
|
|
||||||
})) || [],
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
submit={createMutation.mutate} // Le type est maintenant compatible
|
|
||||||
schema={companySchema}
|
|
||||||
child={
|
|
||||||
<div className="flex justify-center">
|
|
||||||
<button
|
|
||||||
type="submit"
|
|
||||||
disabled={createMutation.isPending}
|
|
||||||
className={`${createMutation.isPending ? "btn-auth-loading" : "btn-auth"} cta modal-cta mt-4 cursor-pointer`}
|
|
||||||
>
|
|
||||||
{createMutation.isPending ? "En cours..." : "Ajouter une organisation"}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<FloatingLabelInput
|
|
||||||
name="search"
|
|
||||||
placeholder="Effectuer une recherche"
|
|
||||||
type="search"
|
|
||||||
onChange={(value) => table.setGlobalFilter(value)}
|
|
||||||
button={
|
|
||||||
<Image
|
|
||||||
alt="Filtrer"
|
|
||||||
src={icons.filterIcon}
|
|
||||||
className="cursor-pointer"
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
export default function Admin () {
|
|
||||||
return(
|
|
||||||
<>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,68 +0,0 @@
|
|||||||
import NextAuth, { User } from "next-auth";
|
|
||||||
import Credentials from "next-auth/providers/credentials";
|
|
||||||
import axios from "axios";
|
|
||||||
import { jwtDecode } from "jwt-decode";
|
|
||||||
|
|
||||||
const handler = NextAuth({
|
|
||||||
providers: [
|
|
||||||
Credentials({
|
|
||||||
credentials: {
|
|
||||||
email: {},
|
|
||||||
password: {},
|
|
||||||
},
|
|
||||||
async authorize(credentials) {
|
|
||||||
try {
|
|
||||||
const response = await axios.post(
|
|
||||||
'https://private-docs-api.intside.co/users/login/',
|
|
||||||
{
|
|
||||||
email: credentials?.email,
|
|
||||||
password: credentials?.password,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
const { access_token, refresh_token } = response.data;
|
|
||||||
const { id } = jwtDecode(access_token) as { id: string };
|
|
||||||
|
|
||||||
return {
|
|
||||||
id: id,
|
|
||||||
email: credentials?.email,
|
|
||||||
access_token: access_token,
|
|
||||||
refresh_token: refresh_token
|
|
||||||
} as User;
|
|
||||||
} catch (error) {
|
|
||||||
if (axios.isAxiosError(error)) {
|
|
||||||
if (error.response?.status === 401) {
|
|
||||||
throw new Error("Email ou mot de passe incorrect");
|
|
||||||
}
|
|
||||||
throw new Error(error.response?.data?.message || error.message);
|
|
||||||
}
|
|
||||||
throw new Error("Une erreur est survenue");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
})
|
|
||||||
],
|
|
||||||
session: {
|
|
||||||
strategy: "jwt",
|
|
||||||
},
|
|
||||||
callbacks: {
|
|
||||||
async jwt({ token, user }) {
|
|
||||||
if (user) {
|
|
||||||
token.access_token = user.access_token;
|
|
||||||
token.refresh_token = user.refresh_token;
|
|
||||||
}
|
|
||||||
return token;
|
|
||||||
},
|
|
||||||
async session({ session, token }) {
|
|
||||||
return {
|
|
||||||
...session,
|
|
||||||
user: {
|
|
||||||
...session.user,
|
|
||||||
...token,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
},
|
|
||||||
secret: process.env.AUTH_SECRET ?? "",
|
|
||||||
});
|
|
||||||
|
|
||||||
export { handler as GET, handler as POST };
|
|
||||||
@ -1,227 +0,0 @@
|
|||||||
@import "tailwindcss";
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Urbanist'; /* Nom que vous donnerez à votre police */
|
|
||||||
src: url('../assets/fonts/Urbanist.ttf') format('truetype'); /* Chemin vers votre fichier */
|
|
||||||
font-weight: normal;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root {
|
|
||||||
--foreground: #04060F;
|
|
||||||
--background: #ffffff;
|
|
||||||
--primary: #246BFD;
|
|
||||||
--secondary: #9FA8BC;
|
|
||||||
--danger: #F33F19;
|
|
||||||
--cinder: #E7E5E4;
|
|
||||||
--bluegray: #E9F0FF;
|
|
||||||
--gray: #E7EBF3;
|
|
||||||
}
|
|
||||||
|
|
||||||
[ data-theme="dark"] {
|
|
||||||
--background: #04060F;
|
|
||||||
--foreground: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--foreground: #2a2a2a;
|
|
||||||
--background: #ffffff;
|
|
||||||
--cinder: #999;
|
|
||||||
--bluegray: --primary;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background: var(--background);
|
|
||||||
color: var(--foreground);
|
|
||||||
font-family: Urbanist, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-form {
|
|
||||||
width: 100%;
|
|
||||||
padding: 12px;
|
|
||||||
border: 1px solid #d1d5dc;
|
|
||||||
border-radius: 9999px;
|
|
||||||
color: black;
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
outline-color: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-label {
|
|
||||||
position: absolute;
|
|
||||||
left: 12px;
|
|
||||||
top: -0.45rem;
|
|
||||||
background-color: white;
|
|
||||||
padding-inline: 4px;
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-floating-right {
|
|
||||||
position: absolute;
|
|
||||||
right: 8px;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-floating-left {
|
|
||||||
position: absolute;
|
|
||||||
left: 8px;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-auth {
|
|
||||||
border-radius: 9999px;
|
|
||||||
background-color: #246BFD;
|
|
||||||
color: white;
|
|
||||||
width: 100%;
|
|
||||||
padding: 8px;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: rgb(22, 77, 185);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-auth-loading {
|
|
||||||
border-radius: 9999px;
|
|
||||||
background-color: #93b4f8;
|
|
||||||
color: white;
|
|
||||||
width: 100%;
|
|
||||||
padding: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.responsive-icon {
|
|
||||||
min-width: 16px;
|
|
||||||
min-height: 16px;
|
|
||||||
width: 24px;
|
|
||||||
height: 24px;
|
|
||||||
transition: width 0.2s, height 0.2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cta{
|
|
||||||
padding: 10px 24px;
|
|
||||||
width: max-content;
|
|
||||||
height: max-content;
|
|
||||||
color: white;
|
|
||||||
background-color: var(--primary);
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 600;
|
|
||||||
border: 1px solid var(--primary);
|
|
||||||
border-radius: 100px;
|
|
||||||
cursor: pointer;
|
|
||||||
text-wrap: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cta.modal-cta{
|
|
||||||
width: 240px;
|
|
||||||
height: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cta.cancel{
|
|
||||||
color: var(--secondary);
|
|
||||||
border: 1px solid var(--gray);
|
|
||||||
background-color: var(--gray);
|
|
||||||
}
|
|
||||||
|
|
||||||
.cta.info{
|
|
||||||
color: var(--primary);
|
|
||||||
background-color: var(--background);
|
|
||||||
}
|
|
||||||
|
|
||||||
.cta.danger{
|
|
||||||
border: 1px solid var(--danger);
|
|
||||||
background-color: var(--danger);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg-bluegray{
|
|
||||||
background-color: var(--bluegray);
|
|
||||||
}
|
|
||||||
.bg-gray{
|
|
||||||
background-color: var(--gray);
|
|
||||||
}
|
|
||||||
hr{
|
|
||||||
color: var(--gray);
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type="checkbox"] {
|
|
||||||
appearance: none;
|
|
||||||
-webkit-appearance: none;
|
|
||||||
-moz-appearance: none;
|
|
||||||
|
|
||||||
width: 24px;
|
|
||||||
height: 24px;
|
|
||||||
border: 1px solid var(--secondary) !important;
|
|
||||||
border-radius: 6px !important;
|
|
||||||
background-color: transparent;
|
|
||||||
cursor: pointer;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
input[type="checkbox"]:checked {
|
|
||||||
background-color: var(--primary);
|
|
||||||
border-color: var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
input[type="checkbox"]:checked::before {
|
|
||||||
content: "✔";
|
|
||||||
font-size: 18px;
|
|
||||||
color: white;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-input{
|
|
||||||
width: 490px;
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Scroll Bar */
|
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
|
||||||
width: 4px;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-track {
|
|
||||||
background: var(--background);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
|
||||||
background: var(--primary);
|
|
||||||
border-radius: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-track:hover {
|
|
||||||
background: var(--background);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb:hover {
|
|
||||||
background: var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
|
||||||
.responsive-icon {
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 480px) {
|
|
||||||
.responsive-icon {
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
import type { Metadata } from "next";
|
|
||||||
import "./globals.css";
|
|
||||||
import NextTopLoader from "nextjs-toploader";
|
|
||||||
import "../assets/css/ruben-ui.css"
|
|
||||||
import { AuthProvider } from "#/components/provider/authProvider";
|
|
||||||
import { QueryClientProvide } from "#/components/provider/queryClient";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
|
||||||
title: "Private Docs",
|
|
||||||
description: "L'appli de gestion de documents par excellence !",
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function RootLayout({
|
|
||||||
children,
|
|
||||||
}: Readonly<{
|
|
||||||
children: React.ReactNode;
|
|
||||||
}>) {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<link rel="icon" href="/favicon.svg" />
|
|
||||||
<link rel="favicon.svg" href="/favicon.svg" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<AuthProvider>
|
|
||||||
<QueryClientProvide>
|
|
||||||
<NextTopLoader color="#246BFD" shadow="0" />
|
|
||||||
{children}
|
|
||||||
</QueryClientProvide>
|
|
||||||
</AuthProvider>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,144 +0,0 @@
|
|||||||
/* Sidebar */
|
|
||||||
|
|
||||||
.sidebar {
|
|
||||||
border-right: 1px solid var(--cinder);
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-item .nav-home {
|
|
||||||
margin-bottom: -10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-item {
|
|
||||||
width: 100%;
|
|
||||||
height: max-content;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-item.active {
|
|
||||||
border-right: 2px solid var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-item svg {
|
|
||||||
color: var(--primary) !important;
|
|
||||||
background-color: var(--primary) !important;
|
|
||||||
fill: var(--primary) !important;
|
|
||||||
stroke: var(--primary) !important
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-home {
|
|
||||||
margin-top: -11px;
|
|
||||||
margin-bottom: -11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Border */
|
|
||||||
.icon-border {
|
|
||||||
border: 1px solid var(--cinder);
|
|
||||||
padding: 8px;
|
|
||||||
border-radius: 12px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-menu {
|
|
||||||
width: max-content;
|
|
||||||
background-color: var(--background);
|
|
||||||
border-radius: 8px;
|
|
||||||
box-shadow: 0 0 24px #0000001A;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-item a {
|
|
||||||
width: max-content;
|
|
||||||
padding: 10px 20px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
gap: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Main */
|
|
||||||
|
|
||||||
.p-container {
|
|
||||||
height: 100vh;
|
|
||||||
border: 1px solid var(--gray);
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-rounded {
|
|
||||||
width: max-content;
|
|
||||||
height: max-content;
|
|
||||||
padding: 8px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
background-color: var(--bluegray);
|
|
||||||
border-radius: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.labels-container {
|
|
||||||
min-width: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.labels-container .label-container {
|
|
||||||
width: 40%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.labels-container .floating-label div.relative {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admin-infos {
|
|
||||||
gap: 12px;
|
|
||||||
}
|
|
||||||
.admin-card {
|
|
||||||
width: 284px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-desktop{
|
|
||||||
display: flex!important;
|
|
||||||
}
|
|
||||||
.mobile{
|
|
||||||
display: none!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 640px) {
|
|
||||||
|
|
||||||
.header, .main{
|
|
||||||
padding-left: 22px;
|
|
||||||
padding-right: 22px;
|
|
||||||
}
|
|
||||||
.header-desktop{
|
|
||||||
display: none!important;
|
|
||||||
}
|
|
||||||
.mobile{
|
|
||||||
display: flex!important;
|
|
||||||
}
|
|
||||||
.mobile-flex{
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
.mobile-none{
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header .name{
|
|
||||||
padding-left: 44px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar{
|
|
||||||
transition: all ease-in-out .4s;
|
|
||||||
}
|
|
||||||
.hamburger{
|
|
||||||
position: absolute;
|
|
||||||
top: 43px;
|
|
||||||
left: 22px;
|
|
||||||
transform: scale(2);
|
|
||||||
}
|
|
||||||
.hamburger.shifted{
|
|
||||||
left: 100px;
|
|
||||||
}
|
|
||||||
.hamburger-icon{
|
|
||||||
color: var(--primary);
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,175 +0,0 @@
|
|||||||
/* @import "@radix-ui/colors/black-alpha.css";
|
|
||||||
@import "@radix-ui/colors/mauve.css";
|
|
||||||
@import "@radix-ui/colors/violet.css"; */
|
|
||||||
|
|
||||||
/* reset */
|
|
||||||
button {
|
|
||||||
all: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
.DropdownMenuContent,
|
|
||||||
.DropdownMenuSubContent {
|
|
||||||
min-width: 220px;
|
|
||||||
background-color: white;
|
|
||||||
border-radius: 6px;
|
|
||||||
padding: 5px;
|
|
||||||
box-shadow:
|
|
||||||
0px 10px 38px -10px rgba(22, 23, 24, 0.35),
|
|
||||||
0px 10px 20px -15px rgba(22, 23, 24, 0.2);
|
|
||||||
animation-duration: 400ms;
|
|
||||||
animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
|
|
||||||
will-change: transform, opacity;
|
|
||||||
}
|
|
||||||
.DropdownMenuContent[data-side="top"],
|
|
||||||
.DropdownMenuSubContent[data-side="top"] {
|
|
||||||
animation-name: slideDownAndFade;
|
|
||||||
}
|
|
||||||
.DropdownMenuContent[data-side="right"],
|
|
||||||
.DropdownMenuSubContent[data-side="right"] {
|
|
||||||
animation-name: slideLeftAndFade;
|
|
||||||
}
|
|
||||||
.DropdownMenuContent[data-side="bottom"],
|
|
||||||
.DropdownMenuSubContent[data-side="bottom"] {
|
|
||||||
animation-name: slideUpAndFade;
|
|
||||||
}
|
|
||||||
.DropdownMenuContent[data-side="left"],
|
|
||||||
.DropdownMenuSubContent[data-side="left"] {
|
|
||||||
animation-name: slideRightAndFade;
|
|
||||||
}
|
|
||||||
|
|
||||||
.DropdownMenuItem,
|
|
||||||
.DropdownMenuCheckboxItem,
|
|
||||||
.DropdownMenuRadioItem,
|
|
||||||
.DropdownMenuSubTrigger {
|
|
||||||
font-size: 13px;
|
|
||||||
line-height: 1;
|
|
||||||
color: var(--violet-11);
|
|
||||||
border-radius: 3px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
height: 25px;
|
|
||||||
padding: 0 5px;
|
|
||||||
position: relative;
|
|
||||||
padding-left: 25px;
|
|
||||||
user-select: none;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
.DropdownMenuSubTrigger[data-state="open"] {
|
|
||||||
background-color: var(--violet-4);
|
|
||||||
color: var(--violet-11);
|
|
||||||
}
|
|
||||||
.DropdownMenuItem[data-disabled],
|
|
||||||
.DropdownMenuCheckboxItem[data-disabled],
|
|
||||||
.DropdownMenuRadioItem[data-disabled],
|
|
||||||
.DropdownMenuSubTrigger[data-disabled] {
|
|
||||||
color: var(--mauve-8);
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.DropdownMenuItem[data-highlighted],
|
|
||||||
.DropdownMenuCheckboxItem[data-highlighted],
|
|
||||||
.DropdownMenuRadioItem[data-highlighted],
|
|
||||||
.DropdownMenuSubTrigger[data-highlighted] {
|
|
||||||
background-color: var(--violet-9);
|
|
||||||
color: var(--violet-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.DropdownMenuLabel {
|
|
||||||
padding-left: 25px;
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 25px;
|
|
||||||
color: var(--mauve-11);
|
|
||||||
}
|
|
||||||
|
|
||||||
.DropdownMenuSeparator {
|
|
||||||
height: 1px;
|
|
||||||
background-color: var(--violet-6);
|
|
||||||
margin: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.DropdownMenuItemIndicator {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
width: 25px;
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.DropdownMenuArrow {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.IconButton {
|
|
||||||
font-family: inherit;
|
|
||||||
border-radius: 100%;
|
|
||||||
height: 35px;
|
|
||||||
width: 35px;
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
color: var(--violet-11);
|
|
||||||
background-color: white;
|
|
||||||
box-shadow: 0 2px 10px var(--black-a7);
|
|
||||||
}
|
|
||||||
.IconButton:hover {
|
|
||||||
background-color: var(--violet-3);
|
|
||||||
}
|
|
||||||
.IconButton:focus {
|
|
||||||
box-shadow: 0 0 0 2px black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.RightSlot {
|
|
||||||
margin-left: auto;
|
|
||||||
padding-left: 20px;
|
|
||||||
color: var(--mauve-11);
|
|
||||||
}
|
|
||||||
[data-highlighted] > .RightSlot {
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
[data-disabled] .RightSlot {
|
|
||||||
color: var(--mauve-8);
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes slideUpAndFade {
|
|
||||||
from {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(2px);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateY(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes slideRightAndFade {
|
|
||||||
from {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateX(-2px);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateX(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes slideDownAndFade {
|
|
||||||
from {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(-2px);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateY(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes slideLeftAndFade {
|
|
||||||
from {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateX(2px);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateX(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,176 +0,0 @@
|
|||||||
/* Extra Small (XS) */
|
|
||||||
|
|
||||||
.r-p-0 {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-m-0 {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.r-p-m-0{
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.r-p-0auto {
|
|
||||||
padding: 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-m-0auto {
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
.r-flex {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-flex-center {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-flex-between {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-flex-around {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-around;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-flex-evenly {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-evenly;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-flex-column {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-column-center,.r-column-md-row, .r-column-lg-row, .r-column-xl-row {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-row-center, .r-row-md-column, .r-row-lg-column, .r-row-xl-column {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-gap-2{
|
|
||||||
gap: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-gap-4{
|
|
||||||
gap: 4px;
|
|
||||||
}
|
|
||||||
.r-gap-6{
|
|
||||||
gap: 6px;
|
|
||||||
}
|
|
||||||
.r-gap-8{
|
|
||||||
gap: 8px;
|
|
||||||
}
|
|
||||||
.r-gap-10{
|
|
||||||
gap: 10px;
|
|
||||||
}
|
|
||||||
.r-gap-12{
|
|
||||||
gap: 12px;
|
|
||||||
}
|
|
||||||
.r-gap-14{
|
|
||||||
gap: 14px;
|
|
||||||
}
|
|
||||||
.r-gap-16{
|
|
||||||
gap: 16px;
|
|
||||||
}
|
|
||||||
.r-gap-18{
|
|
||||||
gap: 18px;
|
|
||||||
}
|
|
||||||
.r-gap-20{
|
|
||||||
gap: 20px;
|
|
||||||
}
|
|
||||||
.r-gap-22{
|
|
||||||
gap: 22px;
|
|
||||||
}
|
|
||||||
.r-gap-24{
|
|
||||||
gap: 24px;
|
|
||||||
}
|
|
||||||
.r-gap-32{
|
|
||||||
gap: 32px;
|
|
||||||
}
|
|
||||||
.r-gap-36{
|
|
||||||
gap: 36px;
|
|
||||||
}
|
|
||||||
.r-gap-40{
|
|
||||||
gap: 40px;
|
|
||||||
}
|
|
||||||
.r-gap-42{
|
|
||||||
gap: 42px;
|
|
||||||
}
|
|
||||||
.r-gap-50{
|
|
||||||
gap: 50px;
|
|
||||||
}
|
|
||||||
.r-gap-60{
|
|
||||||
gap: 60px;
|
|
||||||
}
|
|
||||||
.r-gap-70{
|
|
||||||
gap: 70px;
|
|
||||||
}
|
|
||||||
.r-r-gap-12{
|
|
||||||
row-gap: 12px;
|
|
||||||
}
|
|
||||||
/* Small (SM) */
|
|
||||||
@media (min-width: 640px) {
|
|
||||||
/* Styles for small devices and up */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Medium (MD) */
|
|
||||||
@media (min-width: 768px) {
|
|
||||||
.r-column-md-row {
|
|
||||||
flex-direction: row;
|
|
||||||
}
|
|
||||||
.r-row-md-column{
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Large (LG) */
|
|
||||||
@media (min-width: 1024px) {
|
|
||||||
.r-column-lg-row {
|
|
||||||
flex-direction: row;
|
|
||||||
}
|
|
||||||
.r-row-lg-column{
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Extra Large (XL) */
|
|
||||||
@media (min-width: 1280px) {
|
|
||||||
.r-column-xl-row {
|
|
||||||
flex-direction: row;
|
|
||||||
}
|
|
||||||
.r-row-xl-column{
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 2XL (XXL) */
|
|
||||||
@media (min-width: 1536px) {
|
|
||||||
/* Styles for very large screens */
|
|
||||||
}
|
|
||||||
|
|
||||||
.r-primary{
|
|
||||||
color: var(--primary);
|
|
||||||
}
|
|
||||||
.r-secondary{
|
|
||||||
color: var(--secondary);
|
|
||||||
}
|
|
||||||
.r-info{
|
|
||||||
color: var(--info);
|
|
||||||
}
|
|
||||||
.r-danger{
|
|
||||||
color: var(--danger);
|
|
||||||
}
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M1.3335 8.49984C1.3335 5.98568 1.3335 4.7286 2.11454 3.94755C2.8956 3.1665 4.15267 3.1665 6.66683 3.1665H9.3335C11.8476 3.1665 13.1048 3.1665 13.8858 3.94755C14.6668 4.7286 14.6668 5.98568 14.6668 8.49984V9.83317C14.6668 12.3473 14.6668 13.6044 13.8858 14.3854C13.1048 15.1665 11.8476 15.1665 9.3335 15.1665H6.66683C4.15267 15.1665 2.8956 15.1665 2.11454 14.3854C1.3335 13.6044 1.3335 12.3473 1.3335 9.83317V8.49984Z" stroke="black"/>
|
|
||||||
<path d="M4.6665 3.1665V2.1665" stroke="black" stroke-linecap="round"/>
|
|
||||||
<path d="M11.3335 3.1665V2.1665" stroke="black" stroke-linecap="round"/>
|
|
||||||
<path d="M11 12.5C11.5523 12.5 12 12.0523 12 11.5C12 10.9477 11.5523 10.5 11 10.5C10.4477 10.5 10 10.9477 10 11.5C10 12.0523 10.4477 12.5 11 12.5Z" stroke="black"/>
|
|
||||||
<path d="M1.6665 6.5H14.3332" stroke="black" stroke-linecap="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 927 B |
@ -1,10 +0,0 @@
|
|||||||
<svg width="80" height="64" viewBox="0 0 80 64" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M0 8C0 3.58172 3.58172 0 8 0H34.5776C35.9452 0 37.2674 0.491518 38.3029 1.38494L43.3548 5.74359L46.1749 8.3588C47.3386 9.43797 48 10.9533 48 12.5403V56H0V8Z" fill="#246BFD"/>
|
|
||||||
<rect y="10" width="80" height="54" rx="8" fill="url(#paint0_linear_1170_3315)"/>
|
|
||||||
<defs>
|
|
||||||
<linearGradient id="paint0_linear_1170_3315" x1="-3.33333" y1="14.1535" x2="79.964" y2="68.6663" gradientUnits="userSpaceOnUse">
|
|
||||||
<stop stop-color="#6496FD"/>
|
|
||||||
<stop offset="1" stop-color="#246BFD"/>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 600 B |
|
Before Width: | Height: | Size: 99 KiB |
@ -1,3 +0,0 @@
|
|||||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.0091 12.1536L15.3973 17.5357C15.6833 17.8213 16.0711 17.9818 16.4754 17.9818C16.8797 17.9818 17.2675 17.8213 17.5535 17.5357C17.8394 17.2501 18 16.8628 18 16.4589C18 16.055 17.8394 15.6677 17.5535 15.3821L12.1632 10L17.5524 4.61791C17.6939 4.4765 17.8062 4.30863 17.8827 4.12389C17.9593 3.93916 17.9987 3.74117 17.9986 3.54123C17.9986 3.34129 17.9591 3.14332 17.8825 2.95862C17.8058 2.77392 17.6935 2.60611 17.5519 2.46476C17.4104 2.32342 17.2423 2.21131 17.0574 2.13484C16.8724 2.05837 16.6742 2.01904 16.474 2.01909C16.2739 2.01914 16.0757 2.05856 15.8908 2.13512C15.7058 2.21167 15.5378 2.32386 15.3963 2.46527L10.0091 7.84736L4.62088 2.46527C4.48035 2.31981 4.31223 2.20375 4.12632 2.12388C3.94041 2.04401 3.74044 2.00192 3.53807 2.00006C3.3357 1.99821 3.13499 2.03664 2.94764 2.1131C2.7603 2.18955 2.59008 2.30251 2.44691 2.44539C2.30374 2.58826 2.19049 2.75818 2.11377 2.94524C2.03705 3.13229 1.99839 3.33274 2.00005 3.53488C2.00171 3.73702 2.04366 3.9368 2.12345 4.12258C2.20324 4.30835 2.31927 4.47639 2.46477 4.61689L7.85504 10L2.46579 15.3831C2.32028 15.5236 2.20426 15.6917 2.12447 15.8774C2.04468 16.0632 2.00273 16.263 2.00107 16.4651C1.9994 16.6673 2.03806 16.8677 2.11478 17.0548C2.19151 17.2418 2.30476 17.4117 2.44793 17.5546C2.5911 17.6975 2.76132 17.8104 2.94866 17.8869C3.136 17.9634 3.33671 18.0018 3.53908 17.9999C3.74145 17.9981 3.94142 17.956 4.12733 17.8761C4.31324 17.7963 4.48137 17.6802 4.62189 17.5347L10.0091 12.1536Z" fill="#9FA8BC"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
@ -1,3 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M5 3C4.46957 3 3.96086 3.21071 3.58579 3.58579C3.21071 3.96086 3 4.46957 3 5V19C3 19.5304 3.21071 20.0391 3.58579 20.4142C3.96086 20.7893 4.46957 21 5 21H19C19.5304 21 20.0391 20.7893 20.4142 20.4142C20.7893 20.0391 21 19.5304 21 19V5C21 4.46957 20.7893 3.96086 20.4142 3.58579C20.0391 3.21071 19.5304 3 19 3H5ZM16.95 9.796C17.1376 9.60849 17.2431 9.35412 17.2432 9.08885C17.2433 8.82358 17.138 8.56914 16.9505 8.3815C16.763 8.19386 16.5086 8.08839 16.2434 8.0883C15.9781 8.0882 15.7236 8.19349 15.536 8.381L10.586 13.331L8.465 11.21C8.37216 11.1171 8.26192 11.0434 8.14059 10.9931C8.01926 10.9428 7.8892 10.9168 7.75785 10.9168C7.49258 10.9167 7.23814 11.022 7.0505 11.2095C6.86286 11.397 6.75739 11.6514 6.7573 11.9166C6.7572 12.1819 6.86249 12.4364 7.05 12.624L9.808 15.382C9.91015 15.4842 10.0314 15.5653 10.1649 15.6206C10.2984 15.6759 10.4415 15.7044 10.586 15.7044C10.7305 15.7044 10.8736 15.6759 11.0071 15.6206C11.1406 15.5653 11.2618 15.4842 11.364 15.382L16.95 9.796Z" fill="#246BFD"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,5 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M12 9C11.59 9 11.25 8.71843 11.25 8.37888V5.62112C11.25 5.28157 11.59 5 12 5C12.41 5 12.75 5.28157 12.75 5.62112V8.37888C12.75 8.72671 12.41 9 12 9Z" fill="#9FA8BC"/>
|
|
||||||
<path d="M12.0161 19.6454C9.61036 19.6454 7.21398 19.2668 4.92949 18.5096C4.08097 18.2326 3.43758 17.6324 3.15785 16.8753C2.87811 16.1181 2.97136 15.2502 3.42825 14.493L4.61246 12.5355C4.87354 12.1015 5.10666 11.289 5.10666 10.7811V8.84208C5.10666 5.06555 8.20237 2 12.0161 2C15.8298 2 18.9255 5.06555 18.9255 8.84208V10.7811C18.9255 11.2797 19.1586 12.1015 19.4197 12.5355L20.6039 14.493C21.0421 15.2132 21.1167 16.072 20.8277 16.8568C20.5386 17.6417 19.9046 18.2419 19.1027 18.5096C16.8182 19.276 14.4218 19.6454 12.0161 19.6454ZM12.0161 3.39427C8.9763 3.39427 6.50532 5.84117 6.50532 8.85131V10.7904C6.50532 11.5383 6.20694 12.6186 5.81531 13.2557L4.63111 15.2225C4.38867 15.6195 4.33273 16.0443 4.47259 16.4136C4.61246 16.783 4.92949 17.06 5.37706 17.2077C9.66631 18.6204 14.3845 18.6204 18.6737 17.2077C19.0747 17.0784 19.3824 16.783 19.5223 16.3951C19.6714 16.0073 19.6248 15.5826 19.4104 15.2225L18.2262 13.265C17.8345 12.6278 17.5361 11.5475 17.5361 10.7996V8.86055C17.5268 5.84117 15.0558 3.39427 12.0161 3.39427Z" fill="#9FA8BC"/>
|
|
||||||
<path d="M12 22C10.951 22 9.92157 21.5937 9.17647 20.8919C8.43137 20.1902 8 19.2207 8 18.2327H9.47059C9.47059 18.8605 9.7451 19.47 10.2157 19.9132C10.6863 20.3564 11.3333 20.6149 12 20.6149C13.3922 20.6149 14.5294 19.5438 14.5294 18.2327H16C16 20.3102 14.2059 22 12 22Z" fill="#9FA8BC"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
@ -1,5 +0,0 @@
|
|||||||
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M19.5 10.72V19.5C19.5 21.5 19 22.5 16.5 22.5H7.5C5 22.5 4.5 21.5 4.5 19.5V10.72" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M5 2.5H19C21 2.5 22 3.5 22 5.5V7.5C22 9.5 21 10.5 19 10.5H5C3 10.5 2 9.5 2 7.5V5.5C2 3.5 3 2.5 5 2.5Z" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10.1799 14.5H13.8199" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 592 B |
@ -1,4 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<circle cx="12" cy="12" r="10" stroke="#246BFD" stroke-width="1.5"/>
|
|
||||||
<path d="M12 8V12L14.5 14.5" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 286 B |
@ -1,5 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M12 7C10.8954 7 10 6.10457 10 5C10 3.89543 10.8954 3 12 3C13.1046 3 14 3.89543 14 5C14 6.10457 13.1046 7 12 7Z" fill="#04060F"/>
|
|
||||||
<path d="M12 14C10.8954 14 10 13.1046 10 12C10 10.8954 10.8954 10 12 10C13.1046 10 14 10.8954 14 12C14 13.1046 13.1046 14 12 14Z" fill="#04060F"/>
|
|
||||||
<path d="M12 21C10.8954 21 10 20.1046 10 19C10 17.8954 10.8954 17 12 17C13.1046 17 14 17.8954 14 19C14 20.1046 13.1046 21 12 21Z" fill="#04060F"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 535 B |
@ -1,4 +0,0 @@
|
|||||||
<svg viewBox="0 0 48 49" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M21.02 15.34L15.63 19.54C14.73 20.24 14 21.73 14 22.86V30.27C14 32.59 15.89 34.49 18.21 34.49H29.79C32.11 34.49 34 32.59 34 30.28V23C34 21.79 33.19 20.24 32.2 19.55L26.02 15.22C24.62 14.24 22.37 14.29 21.02 15.34Z" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M24 30.49V27.49" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 500 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="7" height="12" viewBox="0 0 7 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M1 11L6 6L1 1" stroke="#9FA8BC" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 191 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="7" height="12" viewBox="0 0 7 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M6 11L1 6L6 1" stroke="#9FA8BC" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 191 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect x="1" y="1" width="18" height="18" rx="4" fill="white" stroke="#9FA8BC" stroke-linecap="square"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 207 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="24" height="20" viewBox="0 0 24 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M17 15L20 18M19 9.5C19 13.6421 15.6421 17 11.5 17C7.35786 17 4 13.6421 4 9.5C4 5.35786 7.35786 2 11.5 2C15.6421 2 19 5.35786 19 9.5Z" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 331 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="14" height="8" viewBox="0 0 14 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M13 7L7 0.999999L1 7" stroke="#9FA8BC" stroke-width="1.90909" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 244 B |
@ -1,4 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M4 12H20" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M12 20V4" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 307 B |
@ -1,5 +0,0 @@
|
|||||||
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M19.5 10.72V19.5C19.5 21.5 19 22.5 16.5 22.5H7.5C5 22.5 4.5 21.5 4.5 19.5V10.72" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M5 2.5H19C21 2.5 22 3.5 22 5.5V7.5C22 9.5 21 10.5 19 10.5H5C3 10.5 2 9.5 2 7.5V5.5C2 3.5 3 2.5 5 2.5Z" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10.1799 14.5H13.8199" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 592 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="7" height="12" viewBox="0 0 7 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M6 11L1 6L6 1" stroke="#9FA8BC" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 191 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="7" height="12" viewBox="0 0 7 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M1 11L6 6L1 1" stroke="#9FA8BC" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 191 B |
@ -1,9 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M13 22H5C3 22 2 21 2 19V11C2 9 3 8 5 8H10V19C10 21 11 22 13 22Z" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10.11 4C10.03 4.3 10 4.63 10 5V8H5V6C5 4.9 5.9 4 7 4H10.11Z" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M14 8V13" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M18 8V13" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M17 17H15C14.45 17 14 17.45 14 18V22H18V18C18 17.45 17.55 17 17 17Z" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M6 13V17" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10 19V5C10 3 11 2 13 2H19C21 2 22 3 22 5V19C22 21 21 22 19 22H13C11 22 10 21 10 19Z" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB |
@ -1,3 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M5 3C4.46957 3 3.96086 3.21071 3.58579 3.58579C3.21071 3.96086 3 4.46957 3 5V19C3 19.5304 3.21071 20.0391 3.58579 20.4142C3.96086 20.7893 4.46957 21 5 21H19C19.5304 21 20.0391 20.7893 20.4142 20.4142C20.7893 20.0391 21 19.5304 21 19V5C21 4.46957 20.7893 3.96086 20.4142 3.58579C20.0391 3.21071 19.5304 3 19 3H5ZM16.95 9.796C17.1376 9.60849 17.2431 9.35412 17.2432 9.08885C17.2433 8.82358 17.138 8.56914 16.9505 8.3815C16.763 8.19386 16.5086 8.08839 16.2434 8.0883C15.9781 8.0882 15.7236 8.19349 15.536 8.381L10.586 13.331L8.465 11.21C8.37216 11.1171 8.26192 11.0434 8.14059 10.9931C8.01926 10.9428 7.8892 10.9168 7.75785 10.9168C7.49258 10.9167 7.23814 11.022 7.0505 11.2095C6.86286 11.397 6.75739 11.6514 6.7573 11.9166C6.7572 12.1819 6.86249 12.4364 7.05 12.624L9.808 15.382C9.91015 15.4842 10.0314 15.5653 10.1649 15.6206C10.2984 15.6759 10.4415 15.7044 10.586 15.7044C10.7305 15.7044 10.8736 15.6759 11.0071 15.6206C11.1406 15.5653 11.2618 15.4842 11.364 15.382L16.95 9.796Z" fill="#246BFD"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,3 +0,0 @@
|
|||||||
<svg width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M1 1L5 5L9 1" stroke="#9FA8BC" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 207 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.0091 12.1536L15.3973 17.5357C15.6833 17.8213 16.0711 17.9818 16.4754 17.9818C16.8797 17.9818 17.2675 17.8213 17.5535 17.5357C17.8394 17.2501 18 16.8628 18 16.4589C18 16.055 17.8394 15.6677 17.5535 15.3821L12.1632 10L17.5524 4.61791C17.6939 4.4765 17.8062 4.30863 17.8827 4.12389C17.9593 3.93916 17.9987 3.74117 17.9986 3.54123C17.9986 3.34129 17.9591 3.14332 17.8825 2.95862C17.8058 2.77392 17.6935 2.60611 17.5519 2.46476C17.4104 2.32342 17.2423 2.21131 17.0574 2.13484C16.8724 2.05837 16.6742 2.01904 16.474 2.01909C16.2739 2.01914 16.0757 2.05856 15.8908 2.13512C15.7058 2.21167 15.5378 2.32386 15.3963 2.46527L10.0091 7.84736L4.62088 2.46527C4.48035 2.31981 4.31223 2.20375 4.12632 2.12388C3.94041 2.04401 3.74044 2.00192 3.53807 2.00006C3.3357 1.99821 3.13499 2.03664 2.94764 2.1131C2.7603 2.18955 2.59008 2.30251 2.44691 2.44539C2.30374 2.58826 2.19049 2.75818 2.11377 2.94524C2.03705 3.13229 1.99839 3.33274 2.00005 3.53488C2.00171 3.73702 2.04366 3.9368 2.12345 4.12258C2.20324 4.30835 2.31927 4.47639 2.46477 4.61689L7.85504 10L2.46579 15.3831C2.32028 15.5236 2.20426 15.6917 2.12447 15.8774C2.04468 16.0632 2.00273 16.263 2.00107 16.4651C1.9994 16.6673 2.03806 16.8677 2.11478 17.0548C2.19151 17.2418 2.30476 17.4117 2.44793 17.5546C2.5911 17.6975 2.76132 17.8104 2.94866 17.8869C3.136 17.9634 3.33671 18.0018 3.53908 17.9999C3.74145 17.9981 3.94142 17.956 4.12733 17.8761C4.31324 17.7963 4.48137 17.6802 4.62189 17.5347L10.0091 12.1536Z" fill="#9FA8BC"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
@ -1,6 +0,0 @@
|
|||||||
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M21 7.5V17.5C21 20.5 19.5 22.5 16 22.5H8C4.5 22.5 3 20.5 3 17.5V7.5C3 4.5 4.5 2.5 8 2.5H16C19.5 2.5 21 4.5 21 7.5Z" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M14.5 5V7C14.5 8.1 15.4 9 16.5 9H18.5" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M8 13.5H12" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M8 17.5H16" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 750 B |
@ -1,5 +0,0 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M8.84006 2.39982L3.36673 8.19315C3.16006 8.41315 2.96006 8.84649 2.92006 9.14649L2.6734 11.3065C2.58673 12.0865 3.14673 12.6198 3.92006 12.4865L6.06673 12.1198C6.36673 12.0665 6.78673 11.8465 6.9934 11.6198L12.4667 5.82649C13.4134 4.82649 13.8401 3.68649 12.3667 2.29315C10.9001 0.913152 9.78673 1.39982 8.84006 2.39982Z" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M7.92676 3.3667C8.21342 5.2067 9.70676 6.61337 11.5601 6.80003" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M2 14.6665H14" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 855 B |
@ -1,4 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M19.9 13.5H4.1C2.6 13.5 2 14.14 2 15.73V19.77C2 21.36 2.6 22 4.1 22H19.9C21.4 22 22 21.36 22 19.77V15.73C22 14.14 21.4 13.5 19.9 13.5Z" stroke="#E7EBF3" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M19.9 2H4.1C2.6 2 2 2.64 2 4.23V8.27C2 9.86 2.6 10.5 4.1 10.5H19.9C21.4 10.5 22 9.86 22 8.27V4.23C22 2.64 21.4 2 19.9 2Z" stroke="#E7EBF3" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 549 B |
@ -1,6 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M22 8.52V3.98C22 2.57 21.36 2 19.77 2H15.73C14.14 2 13.5 2.57 13.5 3.98V8.51C13.5 9.93 14.14 10.49 15.73 10.49H19.77C21.36 10.5 22 9.93 22 8.52Z" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M22 19.77V15.73C22 14.14 21.36 13.5 19.77 13.5H15.73C14.14 13.5 13.5 14.14 13.5 15.73V19.77C13.5 21.36 14.14 22 15.73 22H19.77C21.36 22 22 21.36 22 19.77Z" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10.5 8.52V3.98C10.5 2.57 9.86 2 8.27 2H4.23C2.64 2 2 2.57 2 3.98V8.51C2 9.93 2.64 10.49 4.23 10.49H8.27C9.86 10.5 10.5 9.93 10.5 8.52Z" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10.5 19.77V15.73C10.5 14.14 9.86 13.5 8.27 13.5H4.23C2.64 13.5 2 14.14 2 15.73V19.77C2 21.36 2.64 22 4.23 22H8.27C9.86 22 10.5 21.36 10.5 19.77Z" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.0 KiB |
@ -1,8 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M14.5299 9.47001L9.46992 14.53C8.81992 13.88 8.41992 12.99 8.41992 12C8.41992 10.02 10.0199 8.42001 11.9999 8.42001C12.9899 8.42001 13.8799 8.82001 14.5299 9.47001Z" stroke="#04060F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M17.8201 5.77001C16.0701 4.45001 14.0701 3.73001 12.0001 3.73001C8.47009 3.73001 5.18009 5.81001 2.89009 9.41001C1.99009 10.82 1.99009 13.19 2.89009 14.6C3.68009 15.84 4.60009 16.91 5.60009 17.77" stroke="#04060F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M8.41992 19.53C9.55992 20.01 10.7699 20.27 11.9999 20.27C15.5299 20.27 18.8199 18.19 21.1099 14.59C22.0099 13.18 22.0099 10.81 21.1099 9.39999C20.7799 8.87999 20.4199 8.38999 20.0499 7.92999" stroke="#04060F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M15.5099 12.7C15.2499 14.11 14.0999 15.26 12.6899 15.52" stroke="#04060F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M9.47 14.53L2 22" stroke="#04060F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M22 2L14.53 9.47" stroke="#04060F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB |
@ -1,4 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M15.58 12C15.58 13.98 13.98 15.58 12 15.58C10.02 15.58 8.41998 13.98 8.41998 12C8.41998 10.02 10.02 8.41998 12 8.41998C13.98 8.41998 15.58 10.02 15.58 12Z" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M12 20.27C15.53 20.27 18.82 18.19 21.11 14.59C22.01 13.18 22.01 10.81 21.11 9.39997C18.82 5.79997 15.53 3.71997 12 3.71997C8.47003 3.71997 5.18003 5.79997 2.89003 9.39997C1.99003 10.81 1.99003 13.18 2.89003 14.59C5.18003 18.19 8.47003 20.27 12 20.27Z" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 699 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16 0C14.8954 0 14 0.895431 14 2V14H2C0.895431 14 0 14.8954 0 16C0 17.1046 0.895431 18 2 18H14V30C14 31.1046 14.8954 32 16 32C17.1046 32 18 31.1046 18 30V18H30C31.1046 18 32 17.1046 32 16C32 14.8954 31.1046 14 30 14H18V2C18 0.895431 17.1046 0 16 0Z" fill="#246BFD"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 419 B |
@ -1,183 +0,0 @@
|
|||||||
import addIcon from "./add.svg"
|
|
||||||
import calendarIcon from "./Calendar Mark.svg"
|
|
||||||
import docummentTextIcon from "./document-text.svg"
|
|
||||||
import folderIcon from "./Document.svg"
|
|
||||||
import editIcon from "./edit-2.svg"
|
|
||||||
import gridIcon from "./element-3-white.svg"
|
|
||||||
import gridBlueIcon from "./element-3.svg"
|
|
||||||
import profilePicture from "./Ellipse 2.svg"
|
|
||||||
import eyeIcon from "./eye.svg"
|
|
||||||
import eyeSlashIcon from "./eye-slash.svg"
|
|
||||||
import checkboxchedIcon from "./checked.svg"
|
|
||||||
import crossIcon from "./cross.svg"
|
|
||||||
import addBlueIcon from "./icon-add.svg"
|
|
||||||
import archivesIcon from "./archives.svg"
|
|
||||||
import notificationsIcon from "./notifications.svg"
|
|
||||||
import timerIcon from "./Line Duotone.svg"
|
|
||||||
import logo from "./logo.svg"
|
|
||||||
import logoutRed from "./logout-red.svg"
|
|
||||||
import logout from "./logout.svg"
|
|
||||||
import maximizeIcon from "./maximize-3.svg"
|
|
||||||
import menuIcon from "./Menu Dots.svg"
|
|
||||||
import messagesIcon from "./message.svg"
|
|
||||||
import homeIcon from "./NavItem.svg"
|
|
||||||
import companiesIcon from "./buildings.svg"
|
|
||||||
import arrowLeft from "./arrowLeft.svg"
|
|
||||||
import arrowRight from "./arrowRight.svg"
|
|
||||||
import filesIcon from "./ph_files.svg"
|
|
||||||
import pdfIcon from "./prime_file-pdf.svg"
|
|
||||||
import wordIcon from "./prime_file-word.svg"
|
|
||||||
import userIcon from "./profile.svg"
|
|
||||||
import userGroup from "./profile-2user.svg"
|
|
||||||
import userGroupBlue from "./profile-2user-blue.svg"
|
|
||||||
import rectanagle from "./Rectangle.svg"
|
|
||||||
import searchIcon from "./Search.svg"
|
|
||||||
import settingsIcon from "./setting-2.svg"
|
|
||||||
import filterIcon from "./setting-3.svg"
|
|
||||||
import shareIcon from "./share.svg"
|
|
||||||
import starIcon from "./star.svg"
|
|
||||||
import arrowUp from "./Vector.svg"
|
|
||||||
import sunIcon from "./sun.svg"
|
|
||||||
import moonIcon from "./moon.svg"
|
|
||||||
import trash from "./trash.svg"
|
|
||||||
import mailIcon from "./sms.svg"
|
|
||||||
import personalCard from "./personalcard.svg"
|
|
||||||
import arrowDown from "#/assets/icons/chevron-down.svg"
|
|
||||||
|
|
||||||
|
|
||||||
export const icons = {
|
|
||||||
addIcon,
|
|
||||||
calendarIcon,
|
|
||||||
docummentTextIcon,
|
|
||||||
folderIcon,
|
|
||||||
editIcon,
|
|
||||||
gridIcon,
|
|
||||||
gridBlueIcon,
|
|
||||||
profilePicture,
|
|
||||||
eyeIcon,
|
|
||||||
eyeSlashIcon,
|
|
||||||
checkboxchedIcon,
|
|
||||||
crossIcon,
|
|
||||||
addBlueIcon,
|
|
||||||
archivesIcon,
|
|
||||||
notificationsIcon,
|
|
||||||
timerIcon,
|
|
||||||
logo,
|
|
||||||
companiesIcon,
|
|
||||||
logout,
|
|
||||||
logoutRed,
|
|
||||||
maximizeIcon,
|
|
||||||
menuIcon,
|
|
||||||
messagesIcon,
|
|
||||||
homeIcon,
|
|
||||||
arrowLeft,
|
|
||||||
arrowRight,
|
|
||||||
filesIcon,
|
|
||||||
pdfIcon,
|
|
||||||
wordIcon,
|
|
||||||
userIcon,
|
|
||||||
userGroup,
|
|
||||||
userGroupBlue,
|
|
||||||
rectanagle,
|
|
||||||
searchIcon,
|
|
||||||
settingsIcon,
|
|
||||||
filterIcon,
|
|
||||||
shareIcon,
|
|
||||||
starIcon,
|
|
||||||
arrowUp,
|
|
||||||
sunIcon,
|
|
||||||
moonIcon,
|
|
||||||
trash,
|
|
||||||
mailIcon,
|
|
||||||
personalCard,
|
|
||||||
arrowDown
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
import AddIcon from "./add.svg";
|
|
||||||
import CalendarIcon from "./Calendar Mark.svg";
|
|
||||||
import DocummentTextIcon from "./document-text.svg";
|
|
||||||
import FolderIcon from "./Document.svg";
|
|
||||||
import EditIcon from "./edit-2.svg";
|
|
||||||
import GridIcon from "./element-3-white.svg";
|
|
||||||
import GridBlueIcon from "./element-3.svg";
|
|
||||||
import ProfilePicture from "./Ellipse 2.svg";
|
|
||||||
import EyeIcon from "./eye.svg";
|
|
||||||
import EyeSlashIcon from "./eye-slash.svg";
|
|
||||||
import CheckboxchedIcon from "./checked.svg";
|
|
||||||
import CrossIcon from "./cross.svg";
|
|
||||||
import AddBlueIcon from "./icon-add.svg";
|
|
||||||
import ArchivesIcon from "./archives.svg";
|
|
||||||
import NotificationsIcon from "./notifications.svg";
|
|
||||||
import TimerIcon from "./Line Duotone.svg";
|
|
||||||
import Logo from "./logo.svg";
|
|
||||||
import LogoutRed from "./logout-red.svg";
|
|
||||||
import Logout from "./logout.svg";
|
|
||||||
import MaximizeIcon from "./maximize-3.svg";
|
|
||||||
import MenuIcon from "./Menu Dots.svg";
|
|
||||||
import MessagesIcon from "./message.svg";
|
|
||||||
import HomeIcon from "./NavItem.svg";
|
|
||||||
import CompaniesIcon from "./buildings.svg";
|
|
||||||
import ArrowLeft from "./arrowLeft.svg";
|
|
||||||
import ArrowRight from "./arrowLeft.svg";
|
|
||||||
import FilesIcon from "./ph_files.svg";
|
|
||||||
import PdfIcon from "./prime_file-pdf.svg";
|
|
||||||
import WordIcon from "./prime_file-word.svg";
|
|
||||||
import UserIcon from "./profile.svg";
|
|
||||||
import UserGroup from "./profile-2user.svg";
|
|
||||||
import UserGroupBlue from "./profile-2user-blue.svg";
|
|
||||||
import Rectanagle from "./Rectangle.svg";
|
|
||||||
import SearchIcon from "./Search.svg";
|
|
||||||
import SettingsIcon from "./setting-2.svg";
|
|
||||||
import FilterIcon from "./setting-3.svg";
|
|
||||||
import ShareIcon from "./share.svg";
|
|
||||||
import StarIcon from "./star.svg";
|
|
||||||
import ArrowUp from "./Vector.svg";
|
|
||||||
|
|
||||||
export const icons = {
|
|
||||||
AddIcon,
|
|
||||||
CalendarIcon,
|
|
||||||
DocummentTextIcon,
|
|
||||||
FolderIcon,
|
|
||||||
EditIcon,
|
|
||||||
GridIcon,
|
|
||||||
GridBlueIcon,
|
|
||||||
ProfilePicture,
|
|
||||||
EyeIcon,
|
|
||||||
EyeSlashIcon,
|
|
||||||
CheckboxchedIcon,
|
|
||||||
CrossIcon,
|
|
||||||
AddBlueIcon,
|
|
||||||
ArchivesIcon,<svg width="16" height="16" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="display:var(--theme-toggle-moon-icon-display)"><path d="M2.89998 0.499976C2.89998 0.279062 2.72089 0.0999756 2.49998 0.0999756C2.27906 0.0999756 2.09998 0.279062 2.09998 0.499976V1.09998H1.49998C1.27906 1.09998 1.09998 1.27906 1.09998 1.49998C1.09998 1.72089 1.27906 1.89998 1.49998 1.89998H2.09998V2.49998C2.09998 2.72089 2.27906 2.89998 2.49998 2.89998C2.72089 2.89998 2.89998 2.72089 2.89998 2.49998V1.89998H3.49998C3.72089 1.89998 3.89998 1.72089 3.89998 1.49998C3.89998 1.27906 3.72089 1.09998 3.49998 1.09998H2.89998V0.499976ZM5.89998 3.49998C5.89998 3.27906 5.72089 3.09998 5.49998 3.09998C5.27906 3.09998 5.09998 3.27906 5.09998 3.49998V4.09998H4.49998C4.27906 4.09998 4.09998 4.27906 4.09998 4.49998C4.09998 4.72089 4.27906 4.89998 4.49998 4.89998H5.09998V5.49998C5.09998 5.72089 5.27906 5.89998 5.49998 5.89998C5.72089 5.89998 5.89998 5.72089 5.89998 5.49998V4.89998H6.49998C6.72089 4.89998 6.89998 4.72089 6.89998 4.49998C6.89998 4.27906 6.72089 4.09998 6.49998 4.09998H5.89998V3.49998ZM1.89998 6.49998C1.89998 6.27906 1.72089 6.09998 1.49998 6.09998C1.27906 6.09998 1.09998 6.27906 1.09998 6.49998V7.09998H0.499976C0.279062 7.09998 0.0999756 7.27906 0.0999756 7.49998C0.0999756 7.72089 0.279062 7.89998 0.499976 7.89998H1.09998V8.49998C1.09998 8.72089 1.27906 8.89997 1.49998 8.89997C1.72089 8.89997 1.89998 8.72089 1.89998 8.49998V7.89998H2.49998C2.72089 7.89998 2.89998 7.72089 2.89998 7.49998C2.89998 7.27906 2.72089 7.09998 2.49998 7.09998H1.89998V6.49998ZM8.54406 0.98184L8.24618 0.941586C8.03275 0.917676 7.90692 1.1655 8.02936 1.34194C8.17013 1.54479 8.29981 1.75592 8.41754 1.97445C8.91878 2.90485 9.20322 3.96932 9.20322 5.10022C9.20322 8.37201 6.82247 11.0878 3.69887 11.6097C3.45736 11.65 3.20988 11.6772 2.96008 11.6906C2.74563 11.702 2.62729 11.9535 2.77721 12.1072C2.84551 12.1773 2.91535 12.2458 2.98667 12.3128L3.05883 12.3795L3.31883 12.6045L3.50684 12.7532L3.62796 12.8433L3.81491 12.9742L3.99079 13.089C4.11175 13.1651 4.23536 13.2375 4.36157 13.3059L4.62496 13.4412L4.88553 13.5607L5.18837 13.6828L5.43169 13.7686C5.56564 13.8128 5.70149 13.8529 5.83857 13.8885C5.94262 13.9155 6.04767 13.9401 6.15405 13.9622C6.27993 13.9883 6.40713 14.0109 6.53544 14.0298L6.85241 14.0685L7.11934 14.0892C7.24637 14.0965 7.37436 14.1002 7.50322 14.1002C11.1483 14.1002 14.1032 11.1453 14.1032 7.50023C14.1032 7.25044 14.0893 7.00389 14.0623 6.76131L14.0255 6.48407C13.991 6.26083 13.9453 6.04129 13.8891 5.82642C13.8213 5.56709 13.7382 5.31398 13.6409 5.06881L13.5279 4.80132L13.4507 4.63542L13.3766 4.48666C13.2178 4.17773 13.0353 3.88295 12.8312 3.60423L12.6782 3.40352L12.4793 3.16432L12.3157 2.98361L12.1961 2.85951L12.0355 2.70246L11.8134 2.50184L11.4925 2.24191L11.2483 2.06498L10.9562 1.87446L10.6346 1.68894L10.3073 1.52378L10.1938 1.47176L9.95488 1.3706L9.67791 1.2669L9.42566 1.1846L9.10075 1.09489L8.83599 1.03486L8.54406 0.98184ZM10.4032 5.30023C10.4032 4.27588 10.2002 3.29829 9.83244 2.40604C11.7623 3.28995 13.1032 5.23862 13.1032 7.50023C13.1032 10.593 10.596 13.1002 7.50322 13.1002C6.63646 13.1002 5.81597 12.9036 5.08355 12.5522C6.5419 12.0941 7.81081 11.2082 8.74322 10.0416C8.87963 10.2284 9.10028 10.3497 9.34928 10.3497C9.76349 10.3497 10.0993 10.0139 10.0993 9.59971C10.0993 9.24256 9.84965 8.94373 9.51535 8.86816C9.57741 8.75165 9.63653 8.63334 9.6926 8.51332C9.88358 8.63163 10.1088 8.69993 10.35 8.69993C11.0403 8.69993 11.6 8.14028 11.6 7.44993C11.6 6.75976 11.0406 6.20024 10.3505 6.19993C10.3853 5.90487 10.4032 5.60464 10.4032 5.30023Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg>
|
|
||||||
NotificationsIcon,
|
|
||||||
TimerIcon,
|
|
||||||
Logo,
|
|
||||||
CompaniesIcon,
|
|
||||||
Logout,
|
|
||||||
LogoutRed,
|
|
||||||
MaximizeIcon,
|
|
||||||
MenuIcon,
|
|
||||||
MessagesIcon,
|
|
||||||
HomeIcon,
|
|
||||||
ArrowLeft,
|
|
||||||
ArrowRight,
|
|
||||||
FilesIcon,
|
|
||||||
PdfIcon,
|
|
||||||
WordIcon,
|
|
||||||
UserIcon,
|
|
||||||
UserGroup,
|
|
||||||
UserGroupBlue,
|
|
||||||
Rectanagle,
|
|
||||||
SearchIcon,
|
|
||||||
SettingsIcon,
|
|
||||||
FilterIcon,
|
|
||||||
ShareIcon,
|
|
||||||
StarIcon,
|
|
||||||
ArrowUp
|
|
||||||
};
|
|
||||||
|
|
||||||
*/
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
// import { GeneralHtmlAttr } from "#/lib/declarations";
|
|
||||||
// import { SVGElementType } from "react";
|
|
||||||
|
|
||||||
// const icons: SVGElementType[] = {
|
|
||||||
// CalendarMark: "Calendar Mark.svg",
|
|
||||||
// Document: "Document.svg",
|
|
||||||
// Ellipse2: "Ellipse 2.svg",
|
|
||||||
// Group1: "Group (1).svg",
|
|
||||||
// Group: "Group.svg",
|
|
||||||
// Icons1: "Icons (1).svg",
|
|
||||||
// Icons: "Icons.svg",
|
|
||||||
// LineDuotone: "Line Duotone.svg",
|
|
||||||
// MenuDots: "Menu Dots.svg",
|
|
||||||
// NavItem: "NavItem.svg",
|
|
||||||
// Path1: "Path (1).svg",
|
|
||||||
// Path: "Path.svg",
|
|
||||||
// Rectangle: "Rectangle.svg",
|
|
||||||
// Search: "Search.svg",
|
|
||||||
// Vector: "Vector.svg",
|
|
||||||
// Add: "add.svg",
|
|
||||||
// Archives: "archives.svg",
|
|
||||||
// ArrowLeft: "arrowLeft.svg",
|
|
||||||
// ArrowRight: "arrowRight.svg",
|
|
||||||
// Buildings: "buildings.svg",
|
|
||||||
// Checked: "checked.svg",
|
|
||||||
// Cross: "cross.svg",
|
|
||||||
// DocumentText: "document-text.svg",
|
|
||||||
// Edit2: "edit-2.svg",
|
|
||||||
// Element3White: "element-3-white.svg",
|
|
||||||
// Element3: "element-3.svg",
|
|
||||||
// EyeSlash: "eye-slash.svg",
|
|
||||||
// Eye: "eye.svg",
|
|
||||||
// IconAdd: "icon-add.svg",
|
|
||||||
// Logo: "logo.svg",
|
|
||||||
// LogoutRed: "logout-red.svg",
|
|
||||||
// Logout: "logout.svg",
|
|
||||||
// Maximize3: "maximize-3.svg",
|
|
||||||
// Message: "message.svg",
|
|
||||||
// Notifications: "notifications.svg",
|
|
||||||
// PhFiles: "ph_files.svg",
|
|
||||||
// PrimeFilePdf: "prime_file-pdf.svg",
|
|
||||||
// PrimeFileWord: "prime_file-word.svg",
|
|
||||||
// Profile2UserBlue: "profile-2user-blue.svg",
|
|
||||||
// Profile2User: "profile-2user.svg",
|
|
||||||
// Profile: "profile.svg",
|
|
||||||
// Setting2: "setting-2.svg",
|
|
||||||
// Setting3: "setting-3.svg",
|
|
||||||
// Share: "share.svg",
|
|
||||||
// Star: "star.svg",
|
|
||||||
// Moon: "moon.svg",
|
|
||||||
// Sun: "sun.svg",
|
|
||||||
// };
|
|
||||||
|
|
||||||
// export const Icon = ({ name, ...props }: { name: keyof typeof icons } & GeneralHtmlAttr) => {
|
|
||||||
// const IconComponent = icons[name];
|
|
||||||
// if (!IconComponent) return null;
|
|
||||||
|
|
||||||
// return (
|
|
||||||
// <div {...props}>
|
|
||||||
// {}
|
|
||||||
// </div>
|
|
||||||
// );
|
|
||||||
// };
|
|
||||||
|
Before Width: | Height: | Size: 1.3 MiB |
@ -1,5 +0,0 @@
|
|||||||
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M5.93311 5.54C6.13977 3.14 7.37311 2.16 10.0731 2.16H10.1598C13.1398 2.16 14.3331 3.35334 14.3331 6.33334V10.68C14.3331 13.66 13.1398 14.8533 10.1598 14.8533H10.0731C7.39311 14.8533 6.15977 13.8867 5.93977 11.5267" stroke="#F33F19" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10.0002 8.5H2.41357" stroke="#F33F19" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M3.89984 6.26666L1.6665 8.5L3.89984 10.7333" stroke="#F33F19" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 667 B |
@ -1,5 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M8.8999 7.55999C9.2099 3.95999 11.0599 2.48999 15.1099 2.48999H15.2399C19.7099 2.48999 21.4999 4.27999 21.4999 8.74999V15.27C21.4999 19.74 19.7099 21.53 15.2399 21.53H15.1099C11.0899 21.53 9.2399 20.08 8.9099 16.54" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M15.0001 12H3.62012" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M5.85 8.65002L2.5 12L5.85 15.35" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 655 B |
@ -1,6 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M9 22H15C20 22 22 20 22 15V9C22 4 20 2 15 2H9C4 2 2 4 2 9V15C2 20 4 22 9 22Z" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M18 6L6 18" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M18 10V6H14" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M6 14V18H10" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 595 B |
@ -1,6 +0,0 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M5.66683 12.6668H5.3335C2.66683 12.6668 1.3335 12.0002 1.3335 8.66683V5.3335C1.3335 2.66683 2.66683 1.3335 5.3335 1.3335H10.6668C13.3335 1.3335 14.6668 2.66683 14.6668 5.3335V8.66683C14.6668 11.3335 13.3335 12.6668 10.6668 12.6668H10.3335C10.1268 12.6668 9.92683 12.7668 9.80016 12.9335L8.80016 14.2668C8.36016 14.8535 7.64016 14.8535 7.20016 14.2668L6.20016 12.9335C6.0935 12.7868 5.84683 12.6668 5.66683 12.6668Z" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10.6641 7.33333H10.6701" stroke="#9FA8BC" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M7.99707 7.3335H8.00306" stroke="#9FA8BC" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M5.32967 7.33333H5.33566" stroke="#9FA8BC" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 989 B |
@ -1 +0,0 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="display:var(--theme-toggle-moon-icon-display)"><path d="M2.89998 0.499976C2.89998 0.279062 2.72089 0.0999756 2.49998 0.0999756C2.27906 0.0999756 2.09998 0.279062 2.09998 0.499976V1.09998H1.49998C1.27906 1.09998 1.09998 1.27906 1.09998 1.49998C1.09998 1.72089 1.27906 1.89998 1.49998 1.89998H2.09998V2.49998C2.09998 2.72089 2.27906 2.89998 2.49998 2.89998C2.72089 2.89998 2.89998 2.72089 2.89998 2.49998V1.89998H3.49998C3.72089 1.89998 3.89998 1.72089 3.89998 1.49998C3.89998 1.27906 3.72089 1.09998 3.49998 1.09998H2.89998V0.499976ZM5.89998 3.49998C5.89998 3.27906 5.72089 3.09998 5.49998 3.09998C5.27906 3.09998 5.09998 3.27906 5.09998 3.49998V4.09998H4.49998C4.27906 4.09998 4.09998 4.27906 4.09998 4.49998C4.09998 4.72089 4.27906 4.89998 4.49998 4.89998H5.09998V5.49998C5.09998 5.72089 5.27906 5.89998 5.49998 5.89998C5.72089 5.89998 5.89998 5.72089 5.89998 5.49998V4.89998H6.49998C6.72089 4.89998 6.89998 4.72089 6.89998 4.49998C6.89998 4.27906 6.72089 4.09998 6.49998 4.09998H5.89998V3.49998ZM1.89998 6.49998C1.89998 6.27906 1.72089 6.09998 1.49998 6.09998C1.27906 6.09998 1.09998 6.27906 1.09998 6.49998V7.09998H0.499976C0.279062 7.09998 0.0999756 7.27906 0.0999756 7.49998C0.0999756 7.72089 0.279062 7.89998 0.499976 7.89998H1.09998V8.49998C1.09998 8.72089 1.27906 8.89997 1.49998 8.89997C1.72089 8.89997 1.89998 8.72089 1.89998 8.49998V7.89998H2.49998C2.72089 7.89998 2.89998 7.72089 2.89998 7.49998C2.89998 7.27906 2.72089 7.09998 2.49998 7.09998H1.89998V6.49998ZM8.54406 0.98184L8.24618 0.941586C8.03275 0.917676 7.90692 1.1655 8.02936 1.34194C8.17013 1.54479 8.29981 1.75592 8.41754 1.97445C8.91878 2.90485 9.20322 3.96932 9.20322 5.10022C9.20322 8.37201 6.82247 11.0878 3.69887 11.6097C3.45736 11.65 3.20988 11.6772 2.96008 11.6906C2.74563 11.702 2.62729 11.9535 2.77721 12.1072C2.84551 12.1773 2.91535 12.2458 2.98667 12.3128L3.05883 12.3795L3.31883 12.6045L3.50684 12.7532L3.62796 12.8433L3.81491 12.9742L3.99079 13.089C4.11175 13.1651 4.23536 13.2375 4.36157 13.3059L4.62496 13.4412L4.88553 13.5607L5.18837 13.6828L5.43169 13.7686C5.56564 13.8128 5.70149 13.8529 5.83857 13.8885C5.94262 13.9155 6.04767 13.9401 6.15405 13.9622C6.27993 13.9883 6.40713 14.0109 6.53544 14.0298L6.85241 14.0685L7.11934 14.0892C7.24637 14.0965 7.37436 14.1002 7.50322 14.1002C11.1483 14.1002 14.1032 11.1453 14.1032 7.50023C14.1032 7.25044 14.0893 7.00389 14.0623 6.76131L14.0255 6.48407C13.991 6.26083 13.9453 6.04129 13.8891 5.82642C13.8213 5.56709 13.7382 5.31398 13.6409 5.06881L13.5279 4.80132L13.4507 4.63542L13.3766 4.48666C13.2178 4.17773 13.0353 3.88295 12.8312 3.60423L12.6782 3.40352L12.4793 3.16432L12.3157 2.98361L12.1961 2.85951L12.0355 2.70246L11.8134 2.50184L11.4925 2.24191L11.2483 2.06498L10.9562 1.87446L10.6346 1.68894L10.3073 1.52378L10.1938 1.47176L9.95488 1.3706L9.67791 1.2669L9.42566 1.1846L9.10075 1.09489L8.83599 1.03486L8.54406 0.98184ZM10.4032 5.30023C10.4032 4.27588 10.2002 3.29829 9.83244 2.40604C11.7623 3.28995 13.1032 5.23862 13.1032 7.50023C13.1032 10.593 10.596 13.1002 7.50322 13.1002C6.63646 13.1002 5.81597 12.9036 5.08355 12.5522C6.5419 12.0941 7.81081 11.2082 8.74322 10.0416C8.87963 10.2284 9.10028 10.3497 9.34928 10.3497C9.76349 10.3497 10.0993 10.0139 10.0993 9.59971C10.0993 9.24256 9.84965 8.94373 9.51535 8.86816C9.57741 8.75165 9.63653 8.63334 9.6926 8.51332C9.88358 8.63163 10.1088 8.69993 10.35 8.69993C11.0403 8.69993 11.6 8.14028 11.6 7.44993C11.6 6.75976 11.0406 6.20024 10.3505 6.19993C10.3853 5.90487 10.4032 5.60464 10.4032 5.30023Z" fill="#9FA8BC" fill-rule="evenodd" clip-rule="evenodd"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.6 KiB |
@ -1,5 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M12 9C11.59 9 11.25 8.71843 11.25 8.37888V5.62112C11.25 5.28157 11.59 5 12 5C12.41 5 12.75 5.28157 12.75 5.62112V8.37888C12.75 8.72671 12.41 9 12 9Z" fill="#9FA8BC"/>
|
|
||||||
<path d="M12.0161 19.6454C9.61036 19.6454 7.21398 19.2668 4.92949 18.5096C4.08097 18.2326 3.43758 17.6324 3.15785 16.8753C2.87811 16.1181 2.97136 15.2502 3.42825 14.493L4.61246 12.5355C4.87354 12.1015 5.10666 11.289 5.10666 10.7811V8.84208C5.10666 5.06555 8.20237 2 12.0161 2C15.8298 2 18.9255 5.06555 18.9255 8.84208V10.7811C18.9255 11.2797 19.1586 12.1015 19.4197 12.5355L20.6039 14.493C21.0421 15.2132 21.1167 16.072 20.8277 16.8568C20.5386 17.6417 19.9046 18.2419 19.1027 18.5096C16.8182 19.276 14.4218 19.6454 12.0161 19.6454ZM12.0161 3.39427C8.9763 3.39427 6.50532 5.84117 6.50532 8.85131V10.7904C6.50532 11.5383 6.20694 12.6186 5.81531 13.2557L4.63111 15.2225C4.38867 15.6195 4.33273 16.0443 4.47259 16.4136C4.61246 16.783 4.92949 17.06 5.37706 17.2077C9.66631 18.6204 14.3845 18.6204 18.6737 17.2077C19.0747 17.0784 19.3824 16.783 19.5223 16.3951C19.6714 16.0073 19.6248 15.5826 19.4104 15.2225L18.2262 13.265C17.8345 12.6278 17.5361 11.5475 17.5361 10.7996V8.86055C17.5268 5.84117 15.0558 3.39427 12.0161 3.39427Z" fill="#9FA8BC"/>
|
|
||||||
<path d="M12 22C10.951 22 9.92157 21.5937 9.17647 20.8919C8.43137 20.1902 8 19.2207 8 18.2327H9.47059C9.47059 18.8605 9.7451 19.47 10.2157 19.9132C10.6863 20.3564 11.3333 20.6149 12 20.6149C13.3922 20.6149 14.5294 19.5438 14.5294 18.2327H16C16 20.3102 14.2059 22 12 22Z" fill="#9FA8BC"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
@ -1,8 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M17 21H7C3 21 2 20 2 16V8C2 4 3 3 7 3H17C21 3 22 4 22 8V16C22 20 21 21 17 21Z" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M14 8H19" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M15 12H19" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M17 16H19" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M8.49994 11.2899C9.49958 11.2899 10.3099 10.4796 10.3099 9.47992C10.3099 8.48029 9.49958 7.66992 8.49994 7.66992C7.50031 7.66992 6.68994 8.48029 6.68994 9.47992C6.68994 10.4796 7.50031 11.2899 8.49994 11.2899Z" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M12 16.33C11.86 14.88 10.71 13.74 9.26 13.61C8.76 13.56 8.25 13.56 7.74 13.61C6.29 13.75 5.14 14.88 5 16.33" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,3 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M20.2806 5.96938L16.5306 2.21938C16.4609 2.14975 16.3782 2.09454 16.2871 2.0569C16.1961 2.01926 16.0985 1.99992 16 2H8.5C8.10218 2 7.72064 2.15804 7.43934 2.43934C7.15804 2.72064 7 3.10218 7 3.5V5H5.5C5.10218 5 4.72064 5.15804 4.43934 5.43934C4.15804 5.72064 4 6.10218 4 6.5V20C4 20.3978 4.15804 20.7794 4.43934 21.0607C4.72064 21.342 5.10218 21.5 5.5 21.5H16C16.3978 21.5 16.7794 21.342 17.0607 21.0607C17.342 20.7794 17.5 20.3978 17.5 20V18.5H19C19.3978 18.5 19.7794 18.342 20.0607 18.0607C20.342 17.7794 20.5 17.3978 20.5 17V6.5C20.5001 6.40148 20.4807 6.30391 20.4431 6.21286C20.4055 6.12182 20.3503 6.03908 20.2806 5.96938ZM16 20H5.5V6.5H12.6897L16 9.81031V17.765V20ZM19 17H17.5V9.5C17.5001 9.40148 17.4807 9.30391 17.4431 9.21286C17.4055 9.12182 17.3503 9.03908 17.2806 8.96937L13.5306 5.21938C13.4609 5.14975 13.3782 5.09454 13.2871 5.0569C13.1961 5.01926 13.0985 4.99992 13 5H8.5V3.5H15.6897L19 6.81031V17ZM13.75 14C13.75 14.1989 13.671 14.3897 13.5303 14.5303C13.3897 14.671 13.1989 14.75 13 14.75H8.5C8.30109 14.75 8.11032 14.671 7.96967 14.5303C7.82902 14.3897 7.75 14.1989 7.75 14C7.75 13.8011 7.82902 13.6103 7.96967 13.4697C8.11032 13.329 8.30109 13.25 8.5 13.25H13C13.1989 13.25 13.3897 13.329 13.5303 13.4697C13.671 13.6103 13.75 13.8011 13.75 14ZM13.75 17C13.75 17.1989 13.671 17.3897 13.5303 17.5303C13.3897 17.671 13.1989 17.75 13 17.75H8.5C8.30109 17.75 8.11032 17.671 7.96967 17.5303C7.82902 17.3897 7.75 17.1989 7.75 17C7.75 16.8011 7.82902 16.6103 7.96967 16.4697C8.11032 16.329 8.30109 16.25 8.5 16.25H13C13.1989 16.25 13.3897 16.329 13.5303 16.4697C13.671 16.6103 13.75 16.8011 13.75 17Z" fill="#246BFD"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@ -1,4 +0,0 @@
|
|||||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M24.7067 11.8858L17.3333 4.30181C17.146 4.10886 16.8918 4.00033 16.6267 4.00009H10.6667C9.69421 4.00009 8.76157 4.39744 8.07394 5.10472C7.38631 5.812 7 6.77128 7 7.77152V24.2287C7 25.2289 7.38631 26.1882 8.07394 26.8955C8.76157 27.6027 9.69421 28.0001 10.6667 28.0001H21.3333C22.3058 28.0001 23.2384 27.6027 23.9261 26.8955C24.6137 26.1882 25 25.2289 25 24.2287V12.5715C24.9895 12.3131 24.8848 12.0683 24.7067 11.8858ZM17.6667 7.51095L21.5867 11.5429H17.6667V7.51095ZM21.3333 25.9429H10.6667C10.2246 25.9429 9.80072 25.7623 9.48816 25.4408C9.17559 25.1194 9 24.6833 9 24.2287V7.77152C9 7.31686 9.17559 6.88083 9.48816 6.55934C9.80072 6.23785 10.2246 6.05723 10.6667 6.05723H15.6667V12.5715C15.6701 12.8432 15.7766 13.1028 15.9634 13.2949C16.1502 13.487 16.4025 13.5965 16.6667 13.6001H23V24.2287C23 24.6833 22.8244 25.1194 22.5118 25.4408C22.1993 25.7623 21.7754 25.9429 21.3333 25.9429Z" fill="#246BFD"/>
|
|
||||||
<path d="M17.8651 19.4151C17.0974 18.9321 16.5198 18.198 16.2297 17.3371C16.4985 16.5317 16.5796 15.6752 16.4669 14.8334C16.4309 14.6213 16.3278 14.4265 16.1728 14.2778C16.0178 14.1291 15.8191 14.0344 15.6063 14.0077C15.3934 13.9811 15.1776 14.0238 14.9909 14.1297C14.8041 14.2356 14.6564 14.3989 14.5694 14.5956C14.4273 15.6076 14.5344 16.6391 14.8815 17.6C14.4074 18.7107 13.8782 19.7969 13.2961 20.8547C12.4098 21.3554 11.1988 22.1065 11.0116 22.9703C10.8618 23.6713 12.1726 25.474 14.4071 21.5683C15.4007 21.1984 16.4184 20.8972 17.4531 20.6669C18.2179 21.1055 19.0711 21.3664 19.9498 21.4306C20.1516 21.4358 20.3504 21.3811 20.5212 21.2734C20.6921 21.1657 20.8274 21.0097 20.9101 20.8251C20.9928 20.6405 21.0192 20.4354 20.9861 20.2358C20.953 20.0362 20.8617 19.8508 20.7238 19.703C20.1995 19.1647 18.639 19.315 17.8651 19.4151ZM11.8979 23.1706C12.2478 22.5703 12.7098 22.0432 13.2586 21.6183C12.4098 22.9703 11.8979 23.2081 11.8979 23.1831V23.1706ZM15.5431 14.6456C15.8677 14.6456 15.8427 16.0852 15.618 16.4733C15.4488 15.883 15.4231 15.2605 15.5431 14.6582V14.6456ZM14.4571 20.7546C14.88 19.9807 15.2471 19.1775 15.5556 18.3511C15.8863 18.9682 16.3462 19.5062 16.9038 19.9284C16.0663 20.1387 15.2478 20.4193 14.4571 20.7671V20.7546ZM20.3243 20.5292C20.3243 20.5292 20.0996 20.8046 18.664 20.1787C20.2244 20.0786 20.4866 20.4416 20.3243 20.5418V20.5292Z" fill="#246BFD"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.3 KiB |
@ -1,4 +0,0 @@
|
|||||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M24.7067 11.8858L17.3333 4.30181C17.146 4.10886 16.8918 4.00033 16.6267 4.00009H10.6667C9.69421 4.00009 8.76157 4.39744 8.07394 5.10472C7.38631 5.812 7 6.77128 7 7.77152V24.2287C7 25.2289 7.38631 26.1882 8.07394 26.8955C8.76157 27.6027 9.69421 28.0001 10.6667 28.0001H21.3333C22.3058 28.0001 23.2384 27.6027 23.9261 26.8955C24.6137 26.1882 25 25.2289 25 24.2287V12.5715C24.9895 12.3131 24.8848 12.0683 24.7067 11.8858ZM17.6667 7.51095L21.5867 11.5429H17.6667V7.51095ZM21.3333 25.9429H10.6667C10.2246 25.9429 9.80072 25.7623 9.48816 25.4408C9.17559 25.1194 9 24.6833 9 24.2287V7.77152C9 7.31686 9.17559 6.88083 9.48816 6.55934C9.80072 6.23785 10.2246 6.05723 10.6667 6.05723H15.6667V12.5715C15.6701 12.8432 15.7766 13.1028 15.9634 13.2949C16.1502 13.487 16.4025 13.5965 16.6667 13.6001H23V24.2287C23 24.6833 22.8244 25.1194 22.5118 25.4408C22.1993 25.7623 21.7754 25.9429 21.3333 25.9429Z" fill="#246BFD"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.3318 16.0663C15.8275 15.8695 15.2775 16.1255 15.1035 16.6382L13.9856 19.9312L12.8795 16.6728C12.7055 16.1601 12.1555 15.9041 11.6512 16.1009C11.1468 16.2977 10.8791 16.8729 11.0531 17.3855L13.0819 23.3619C13.2559 23.8746 13.8059 24.1306 14.3102 23.9338C14.4019 23.898 14.4858 23.8497 14.5606 23.7915C14.7133 23.6815 14.8346 23.5231 14.9011 23.3273L16.0022 20.0839L17.1149 23.3619C17.289 23.8746 17.8389 24.1306 18.3432 23.9338C18.6854 23.8003 18.9187 23.4926 18.979 23.1484L20.947 17.3512C21.121 16.8385 20.8532 16.2634 20.3489 16.0666C19.8445 15.8698 19.2946 16.1258 19.1206 16.6384L18.0107 19.9078L16.9599 16.8123C16.8893 16.4842 16.6609 16.1947 16.3318 16.0663Z" fill="#246BFD"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@ -1,6 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M9.16006 10.87C9.06006 10.86 8.94006 10.86 8.83006 10.87C6.45006 10.79 4.56006 8.84 4.56006 6.44C4.56006 3.99 6.54006 2 9.00006 2C11.4501 2 13.4401 3.99 13.4401 6.44C13.4301 8.84 11.5401 10.79 9.16006 10.87Z" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M16.4098 4C18.3498 4 19.9098 5.57 19.9098 7.5C19.9098 9.39 18.4098 10.93 16.5398 11C16.4598 10.99 16.3698 10.99 16.2798 11" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M4.16021 14.56C1.74021 16.18 1.74021 18.82 4.16021 20.43C6.91021 22.27 11.4202 22.27 14.1702 20.43C16.5902 18.81 16.5902 16.17 14.1702 14.56C11.4302 12.73 6.92021 12.73 4.16021 14.56Z" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M18.3398 20C19.0598 19.85 19.7398 19.56 20.2998 19.13C21.8598 17.96 21.8598 16.03 20.2998 14.86C19.7498 14.44 19.0798 14.16 18.3698 14" stroke="#246BFD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,6 +0,0 @@
|
|||||||
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M9.16006 11.37C9.06006 11.36 8.94006 11.36 8.83006 11.37C6.45006 11.29 4.56006 9.34 4.56006 6.94C4.56006 4.49 6.54006 2.5 9.00006 2.5C11.4501 2.5 13.4401 4.49 13.4401 6.94C13.4301 9.34 11.5401 11.29 9.16006 11.37Z" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M16.41 4.5C18.35 4.5 19.91 6.07 19.91 8C19.91 9.89 18.41 11.43 16.54 11.5C16.46 11.49 16.37 11.49 16.28 11.5" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M4.15997 15.06C1.73997 16.68 1.73997 19.32 4.15997 20.93C6.90997 22.77 11.42 22.77 14.17 20.93C16.59 19.31 16.59 16.67 14.17 15.06C11.43 13.23 6.91997 13.23 4.15997 15.06Z" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M18.3401 20.5C19.0601 20.35 19.7401 20.06 20.3001 19.63C21.8601 18.46 21.8601 16.53 20.3001 15.36C19.7501 14.94 19.0801 14.66 18.3701 14.5" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,4 +0,0 @@
|
|||||||
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M8.10671 7.74667C8.04004 7.74 7.96004 7.74 7.88671 7.74667C6.30004 7.69334 5.04004 6.39334 5.04004 4.79334C5.04004 3.16 6.36004 1.83334 8.00004 1.83334C9.63337 1.83334 10.96 3.16 10.96 4.79334C10.9534 6.39334 9.69337 7.69334 8.10671 7.74667Z" stroke="#9FA8BC" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
|
|
||||||
<path d="M4.77348 10.2067C3.16014 11.2867 3.16014 13.0467 4.77348 14.12C6.60681 15.3467 9.61348 15.3467 11.4468 14.12C13.0601 13.04 13.0601 11.28 11.4468 10.2067C9.62014 8.98666 6.61348 8.98666 4.77348 10.2067Z" stroke="#9FA8BC" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 731 B |
@ -1,4 +0,0 @@
|
|||||||
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M12 15.5C13.6569 15.5 15 14.1569 15 12.5C15 10.8431 13.6569 9.5 12 9.5C10.3431 9.5 9 10.8431 9 12.5C9 14.1569 10.3431 15.5 12 15.5Z" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M2 13.38V11.62C2 10.58 2.85 9.72 3.9 9.72C5.71 9.72 6.45 8.44 5.54 6.87C5.02 5.97 5.33 4.8 6.24 4.28L7.97 3.29C8.76 2.82 9.78 3.1 10.25 3.89L10.36 4.08C11.26 5.65 12.74 5.65 13.65 4.08L13.76 3.89C14.23 3.1 15.25 2.82 16.04 3.29L17.77 4.28C18.68 4.8 18.99 5.97 18.47 6.87C17.56 8.44 18.3 9.72 20.11 9.72C21.15 9.72 22.01 10.57 22.01 11.62V13.38C22.01 14.42 21.16 15.28 20.11 15.28C18.3 15.28 17.56 16.56 18.47 18.13C18.99 19.04 18.68 20.2 17.77 20.72L16.04 21.71C15.25 22.18 14.23 21.9 13.76 21.11L13.65 20.92C12.75 19.35 11.27 19.35 10.36 20.92L10.25 21.11C9.78 21.9 8.76 22.18 7.97 21.71L6.24 20.72C5.33 20.2 5.02 19.03 5.54 18.13C6.45 16.56 5.71 15.28 3.9 15.28C2.85 15.28 2 14.42 2 13.38Z" stroke="#9FA8BC" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,9 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M9 22H15C20 22 22 20 22 15V9C22 4 20 2 15 2H9C4 2 2 4 2 9V15C2 20 4 22 9 22Z" stroke="#04060F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M15.5703 18.5V14.6" stroke="#04060F" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M15.5703 7.45V5.5" stroke="#04060F" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M15.5697 12.65C17.0057 12.65 18.1697 11.4859 18.1697 10.05C18.1697 8.61401 17.0057 7.44995 15.5697 7.44995C14.1338 7.44995 12.9697 8.61401 12.9697 10.05C12.9697 11.4859 14.1338 12.65 15.5697 12.65Z" stroke="#04060F" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M8.42969 18.5V16.55" stroke="#04060F" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M8.42969 9.4V5.5" stroke="#04060F" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M8.43008 16.55C9.86602 16.55 11.0301 15.3859 11.0301 13.95C11.0301 12.514 9.86602 11.35 8.43008 11.35C6.99414 11.35 5.83008 12.514 5.83008 13.95C5.83008 15.3859 6.99414 16.55 8.43008 16.55Z" stroke="#04060F" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.4 KiB |
@ -1,8 +0,0 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M11.3066 4.11328C12.64 5.03995 13.56 6.51328 13.7466 8.21328" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M2.32666 8.24648C2.49999 6.55315 3.40666 5.07982 4.72666 4.14648" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M5.45996 13.96C6.23329 14.3533 7.11329 14.5733 8.03996 14.5733C8.93329 14.5733 9.77329 14.3733 10.5266 14.0066" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M8.03986 5.13342C9.06342 5.13342 9.89319 4.30366 9.89319 3.28009C9.89319 2.25652 9.06342 1.42676 8.03986 1.42676C7.01629 1.42676 6.18652 2.25652 6.18652 3.28009C6.18652 4.30366 7.01629 5.13342 8.03986 5.13342Z" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M3.22003 13.2799C4.2436 13.2799 5.07337 12.4501 5.07337 11.4266C5.07337 10.403 4.2436 9.57324 3.22003 9.57324C2.19646 9.57324 1.3667 10.403 1.3667 11.4266C1.3667 12.4501 2.19646 13.2799 3.22003 13.2799Z" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M12.7801 13.2799C13.8037 13.2799 14.6334 12.4501 14.6334 11.4266C14.6334 10.403 13.8037 9.57324 12.7801 9.57324C11.7565 9.57324 10.9268 10.403 10.9268 11.4266C10.9268 12.4501 11.7565 13.2799 12.7801 13.2799Z" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
@ -1,4 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M17 20.5H7C4 20.5 2 19 2 15.5V8.5C2 5 4 3.5 7 3.5H17C20 3.5 22 5 22 8.5V15.5C22 19 20 20.5 17 20.5Z" stroke="#246BFD" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M17 9L13.87 11.5C12.84 12.32 11.15 12.32 10.12 11.5L7 9" stroke="#246BFD" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 495 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M13.7299 3.51001L15.4899 7.03001C15.7299 7.52002 16.3699 7.99001 16.9099 8.08001L20.0999 8.61001C22.1399 8.95001 22.6199 10.43 21.1499 11.89L18.6699 14.37C18.2499 14.79 18.0199 15.6 18.1499 16.18L18.8599 19.25C19.4199 21.68 18.1299 22.62 15.9799 21.35L12.9899 19.58C12.4499 19.26 11.5599 19.26 11.0099 19.58L8.01991 21.35C5.87991 22.62 4.57991 21.67 5.13991 19.25L5.84991 16.18C5.97991 15.6 5.74991 14.79 5.32991 14.37L2.84991 11.89C1.38991 10.43 1.85991 8.95001 3.89991 8.61001L7.08991 8.08001C7.61991 7.99001 8.25991 7.52002 8.49991 7.03001L10.2599 3.51001C11.2199 1.60001 12.7799 1.60001 13.7299 3.51001Z" stroke="#04060F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 806 B |
@ -1 +0,0 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="display:var(--theme-toggle-sun-icon-display)"><path d="M7.5 0C7.77614 0 8 0.223858 8 0.5V2.5C8 2.77614 7.77614 3 7.5 3C7.22386 3 7 2.77614 7 2.5V0.5C7 0.223858 7.22386 0 7.5 0ZM2.1967 2.1967C2.39196 2.00144 2.70854 2.00144 2.90381 2.1967L4.31802 3.61091C4.51328 3.80617 4.51328 4.12276 4.31802 4.31802C4.12276 4.51328 3.80617 4.51328 3.61091 4.31802L2.1967 2.90381C2.00144 2.70854 2.00144 2.39196 2.1967 2.1967ZM0.5 7C0.223858 7 0 7.22386 0 7.5C0 7.77614 0.223858 8 0.5 8H2.5C2.77614 8 3 7.77614 3 7.5C3 7.22386 2.77614 7 2.5 7H0.5ZM2.1967 12.8033C2.00144 12.608 2.00144 12.2915 2.1967 12.0962L3.61091 10.682C3.80617 10.4867 4.12276 10.4867 4.31802 10.682C4.51328 10.8772 4.51328 11.1938 4.31802 11.3891L2.90381 12.8033C2.70854 12.9986 2.39196 12.9986 2.1967 12.8033ZM12.5 7C12.2239 7 12 7.22386 12 7.5C12 7.77614 12.2239 8 12.5 8H14.5C14.7761 8 15 7.77614 15 7.5C15 7.22386 14.7761 7 14.5 7H12.5ZM10.682 4.31802C10.4867 4.12276 10.4867 3.80617 10.682 3.61091L12.0962 2.1967C12.2915 2.00144 12.608 2.00144 12.8033 2.1967C12.9986 2.39196 12.9986 2.70854 12.8033 2.90381L11.3891 4.31802C11.1938 4.51328 10.8772 4.51328 10.682 4.31802ZM8 12.5C8 12.2239 7.77614 12 7.5 12C7.22386 12 7 12.2239 7 12.5V14.5C7 14.7761 7.22386 15 7.5 15C7.77614 15 8 14.7761 8 14.5V12.5ZM10.682 10.682C10.8772 10.4867 11.1938 10.4867 11.3891 10.682L12.8033 12.0962C12.9986 12.2915 12.9986 12.608 12.8033 12.8033C12.608 12.9986 12.2915 12.9986 12.0962 12.8033L10.682 11.3891C10.4867 11.1938 10.4867 10.8772 10.682 10.682ZM5.5 7.5C5.5 6.39543 6.39543 5.5 7.5 5.5C8.60457 5.5 9.5 6.39543 9.5 7.5C9.5 8.60457 8.60457 9.5 7.5 9.5C6.39543 9.5 5.5 8.60457 5.5 7.5ZM7.5 4.5C5.84315 4.5 4.5 5.84315 4.5 7.5C4.5 9.15685 5.84315 10.5 7.5 10.5C9.15685 10.5 10.5 9.15685 10.5 7.5C10.5 5.84315 9.15685 4.5 7.5 4.5Z" fill="#9FA8BC" fill-rule="evenodd" clip-rule="evenodd"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.9 KiB |
@ -1,7 +0,0 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M21 5.98001C17.67 5.65001 14.32 5.48001 10.98 5.48001C9 5.48001 7.02 5.58001 5.04 5.78001L3 5.98001" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M8.5 4.97L8.72 3.66C8.88 2.71 9 2 10.69 2H13.31C15 2 15.13 2.75 15.28 3.67L15.5 4.97" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M18.8499 9.14001L18.1999 19.21C18.0899 20.78 17.9999 22 15.2099 22H8.7899C5.9999 22 5.9099 20.78 5.7999 19.21L5.1499 9.14001" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10.3301 16.5H13.6601" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M9.5 12.5H14.5" stroke="#9FA8BC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 925 B |
@ -1,65 +0,0 @@
|
|||||||
"use client"
|
|
||||||
import Image from "next/image";
|
|
||||||
import { icons } from "#/assets/icons"
|
|
||||||
|
|
||||||
import * as React from "react";
|
|
||||||
import { DropdownMenu } from "radix-ui";
|
|
||||||
import Link from "next/link";
|
|
||||||
import Theme from "./theme";
|
|
||||||
|
|
||||||
export default function AdminHeader() {
|
|
||||||
const [open, setOpen] = React.useState(false);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<nav className="header r-flex-between items-center px-[44px] py-[20px] ">
|
|
||||||
<p className="name text-[26px]">Bienvenue, <span>Ken B.</span> </p>
|
|
||||||
<div className="r-flex-between justify-center items-center r-gap-12">
|
|
||||||
{/* <ProfilePicture /> */}
|
|
||||||
|
|
||||||
<div className="header-desktop">
|
|
||||||
<Theme />
|
|
||||||
</div>
|
|
||||||
<button type="button" className="icon-border header-desktop">
|
|
||||||
<Image src={icons.notificationsIcon} alt="Notifications" />
|
|
||||||
</button>
|
|
||||||
<div className="relative">
|
|
||||||
<DropdownMenu.Root open={open} onOpenChange={setOpen}>
|
|
||||||
<DropdownMenu.Trigger asChild>
|
|
||||||
<div className="r-flex-between justify-center items-center r-gap-12 cursor-pointer">
|
|
||||||
<button type="button" className="icon-borderd mobile scale-120" >
|
|
||||||
<Image src={icons.arrowLeft} alt="options" className={`transition-transform duration-300 ${open ? "scale-x-[-1]" : ""}`} />
|
|
||||||
</button>
|
|
||||||
<Image src={icons.profilePicture} alt="ProfilePicture" />
|
|
||||||
<button className="IconButton header-desktop" aria-label="Customise options">
|
|
||||||
<Image src={icons.arrowUp} alt="arrowUp" className={`transition-transform duration-300 ${open ? "scale-y-[-1]" : ""}`} />
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</DropdownMenu.Trigger>
|
|
||||||
|
|
||||||
<DropdownMenu.Portal>
|
|
||||||
<DropdownMenu.Content className="DropdownMenuContent dropdown-menu r-flex-column r-secondary" sideOffset={0} side="bottom" align="end" >
|
|
||||||
<DropdownMenu.Item className="DropdownMenuItem dropdown-item text-[14px]">
|
|
||||||
<Link href="#" className="d-flex items-start ">
|
|
||||||
<Image src={icons.userIcon} alt="Profil" />
|
|
||||||
Profil
|
|
||||||
</Link>
|
|
||||||
</DropdownMenu.Item>
|
|
||||||
{/* <DropdownMenu.Item className="DropdownMenuItem dropdown-item flex items-center content-center text-[14px] mobile">
|
|
||||||
<Theme />
|
|
||||||
</DropdownMenu.Item> */}
|
|
||||||
<DropdownMenu.Item className="DropdownMenuItem dropdown-item text-[14px]">
|
|
||||||
<Link href="#" className="d-flex items-start r-danger ">
|
|
||||||
<Image src={icons.logoutRed} alt="Deconnexion" />
|
|
||||||
Déconnexion
|
|
||||||
</Link>
|
|
||||||
</DropdownMenu.Item>
|
|
||||||
</DropdownMenu.Content>
|
|
||||||
</DropdownMenu.Portal>
|
|
||||||
</DropdownMenu.Root>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
import Image from "next/image";
|
|
||||||
import Link from "next/link";
|
|
||||||
|
|
||||||
interface ItemProps {
|
|
||||||
link: string;
|
|
||||||
iconSrc: string;
|
|
||||||
label: string;
|
|
||||||
isActive: boolean;
|
|
||||||
isNavHome?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function NavItem({ link, iconSrc, label, isActive, isNavHome }: ItemProps) {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<Link href={link} className={`nav-item r-flex-center ${isActive ? "active" : ""}`} >
|
|
||||||
<Image src={iconSrc} alt={label} className={`scale-100 ${isNavHome ? "nav-home" : ""}`} />
|
|
||||||
</Link>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
"use client"
|
|
||||||
import Image from "next/image";
|
|
||||||
import { icons } from "#/assets/icons"
|
|
||||||
import NavItem from "./navItem";
|
|
||||||
import { usePathname } from "next/navigation";
|
|
||||||
import Link from "next/link";
|
|
||||||
import { useState } from "react";
|
|
||||||
|
|
||||||
|
|
||||||
export default function Sidebar() {
|
|
||||||
|
|
||||||
const pathname = usePathname();
|
|
||||||
|
|
||||||
const [mobileVisible, setmobileVisible] = useState(false)
|
|
||||||
|
|
||||||
const handleMobileVisible = ()=> {
|
|
||||||
setmobileVisible(!mobileVisible)
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div className={` ${ mobileVisible? "mobile-flex" : "mobile-none" } sidebar-holder min-w-[78px] max-w-[90px] h-[100vh] relative `}>
|
|
||||||
<div className="sidebar r-m-0 d-flex flex-column pt-[25px] max-w-[90px] h-[100vh] ">
|
|
||||||
<div className="logo r-flex-center px-[19px] ">
|
|
||||||
<Image src={icons.logo} alt="Logo" className="scale-95" />
|
|
||||||
</div>
|
|
||||||
<div className="nav-menu r-column-center h-max pt-[160px] r-gap-40 ">
|
|
||||||
<NavItem link="/admin/home" iconSrc={icons.homeIcon} label="Home" isNavHome={true} isActive={(pathname === "/admin/") || (pathname === "/admin/home")} />
|
|
||||||
<NavItem link="/admin/organizations" iconSrc={icons.companiesIcon} label="Organizations" isActive={pathname.startsWith("/admin/organizations")} />
|
|
||||||
<NavItem link="/admin/admins" iconSrc={icons.userGroup} label="Admins" isActive={pathname.startsWith("/admin/admins")} />
|
|
||||||
</div>
|
|
||||||
<div className="logout absolute bottom-[40px] left-[28px]">
|
|
||||||
<Link href="/login" className="cursor-pointer">
|
|
||||||
<Image src={icons.logout} alt="Logout" />
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div onClick={() => handleMobileVisible()} className={`${mobileVisible ? "shifted" : ""} hamburger mobile`}>
|
|
||||||
{/* <Image src={icons.logo} alt="Logo" className="scale-95" /> */}
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" className="bi bi-list hamburger-icon" viewBox="0 0 16 16">
|
|
||||||
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5m0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5m0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5"/>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
"use client"
|
|
||||||
import Image from "next/image";
|
|
||||||
import { useEffect, useState } from "react";
|
|
||||||
import { icons } from "#/assets/icons"
|
|
||||||
|
|
||||||
export default function Theme() {
|
|
||||||
const [theme, setTheme] = useState<string | null>(null);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (typeof window !== "undefined") {
|
|
||||||
const savedTheme = localStorage.getItem("theme") ||
|
|
||||||
(window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light");
|
|
||||||
|
|
||||||
setTheme(savedTheme);
|
|
||||||
document.body.setAttribute("data-theme", savedTheme);
|
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const handleTheme = () => {
|
|
||||||
const newTheme = theme === "light" ? "dark" : "light";
|
|
||||||
setTheme(newTheme);
|
|
||||||
localStorage.setItem("theme", newTheme);
|
|
||||||
document.body.setAttribute("data-theme", newTheme);
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (theme === null) return;
|
|
||||||
|
|
||||||
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
||||||
const handleChange = (e: MediaQueryListEvent) => {
|
|
||||||
const newTheme = e.matches ? "dark" : "light";
|
|
||||||
setTheme(newTheme);
|
|
||||||
localStorage.setItem("theme", newTheme);
|
|
||||||
document.body.setAttribute("data-theme", newTheme);
|
|
||||||
};
|
|
||||||
|
|
||||||
mediaQuery.addEventListener("change", handleChange);
|
|
||||||
return () => mediaQuery.removeEventListener("change", handleChange);
|
|
||||||
}, [theme]);
|
|
||||||
|
|
||||||
if (theme === null) return null;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div onClick={handleTheme} className="theme">
|
|
||||||
<button type="button" className="icon-border">
|
|
||||||
{theme === "light" ? (
|
|
||||||
<Image src={icons.sunIcon} alt="Light Mode" width={20} height={20} className="m-[2px]" />
|
|
||||||
) : (
|
|
||||||
<Image src={icons.moonIcon} alt="Dark Mode" width={20} height={20} className="m-[2px]" />
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,131 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import { FloatingLabelInputProps } from '#/types';
|
|
||||||
import React, { useState } from 'react';
|
|
||||||
import Image from 'next/image';
|
|
||||||
import { icons } from '#/assets/icons';
|
|
||||||
|
|
||||||
export default function FloatingLabelInput({
|
|
||||||
label,
|
|
||||||
placeholder,
|
|
||||||
type,
|
|
||||||
options,
|
|
||||||
button,
|
|
||||||
showPasswordToggle = false,
|
|
||||||
name,
|
|
||||||
defaultValue,
|
|
||||||
onChange,
|
|
||||||
}: FloatingLabelInputProps) {
|
|
||||||
const [showPassword, setShowPassword] = useState(false);
|
|
||||||
|
|
||||||
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {
|
|
||||||
const value = e.target.value;
|
|
||||||
if (onChange) {
|
|
||||||
onChange(value);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const renderInput = () => {
|
|
||||||
switch(type) {
|
|
||||||
case 'select':
|
|
||||||
return (
|
|
||||||
<div className="relative w-full">
|
|
||||||
<select
|
|
||||||
className="input-form modal-input focus:ring-2 focus:ring-blue-500 outline-none"
|
|
||||||
name={name}
|
|
||||||
defaultValue={defaultValue}
|
|
||||||
>
|
|
||||||
{options?.map((option, index) => (
|
|
||||||
<option key={index} value={option.value}>{option.label}</option>
|
|
||||||
))}
|
|
||||||
</select>
|
|
||||||
{button && <div className="btn-floating-right">{button}</div>}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
||||||
case 'password':
|
|
||||||
return (
|
|
||||||
<div className="relative w-full">
|
|
||||||
<input
|
|
||||||
name={name}
|
|
||||||
type={showPassword ? "text" : "password"}
|
|
||||||
placeholder={placeholder}
|
|
||||||
className="input-form focus:ring-2 focus:ring-blue-500 pr-10 outline-none"
|
|
||||||
defaultValue={defaultValue}
|
|
||||||
|
|
||||||
/>
|
|
||||||
{showPasswordToggle && (
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
onClick={() => setShowPassword(!showPassword)}
|
|
||||||
className="btn-floating-right text-gray-500 hover:text-gray-700 focus:outline-none"
|
|
||||||
>
|
|
||||||
{showPassword ? (
|
|
||||||
<Image
|
|
||||||
src={icons.eyeSlashIcon}
|
|
||||||
width={20}
|
|
||||||
height={20}
|
|
||||||
alt=''
|
|
||||||
/>
|
|
||||||
) : (
|
|
||||||
<Image
|
|
||||||
src={icons.eyeIcon}
|
|
||||||
width={20}
|
|
||||||
height={20}
|
|
||||||
alt=''
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
case 'search':
|
|
||||||
return (
|
|
||||||
<div className="relative w-full">
|
|
||||||
<div className='btn-floating-left'>
|
|
||||||
<Image alt='' src={icons.searchIcon} />
|
|
||||||
</div>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
placeholder={placeholder}
|
|
||||||
className="focus:ring-2 focus:ring-blue-500 outline-none px-10 py-2 w-full text-black border border-[#d1d5dc] rounded-full"
|
|
||||||
name={name}
|
|
||||||
defaultValue={defaultValue}
|
|
||||||
onChange={handleChange}
|
|
||||||
/>
|
|
||||||
{button && <div className="btn-floating-right mr-1 ">{button}</div>}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return (
|
|
||||||
<div className="relative w-full">
|
|
||||||
<input
|
|
||||||
type={type}
|
|
||||||
placeholder={placeholder}
|
|
||||||
className="input-form modal-input focus:ring-2 focus:ring-blue-500 outline-none"
|
|
||||||
name={name}
|
|
||||||
defaultValue={defaultValue}
|
|
||||||
onChange={handleChange}
|
|
||||||
/>
|
|
||||||
{button && <div className="btn-floating-right">{button}</div>}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="relative">
|
|
||||||
<label
|
|
||||||
htmlFor={name}
|
|
||||||
className="input-label text-gray-400 text-sm"
|
|
||||||
>
|
|
||||||
{label}
|
|
||||||
</label>
|
|
||||||
{renderInput()}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import FloatingLabelInput from "../floatingLabelInput"
|
|
||||||
import { FormProps } from "#/types"
|
|
||||||
import { FormEvent, useState } from "react"
|
|
||||||
|
|
||||||
export default function Form({
|
|
||||||
fields,
|
|
||||||
submit,
|
|
||||||
className,
|
|
||||||
child,
|
|
||||||
title,
|
|
||||||
schema,
|
|
||||||
formClassName
|
|
||||||
} : FormProps) {
|
|
||||||
const [errors, setErrors] = useState<Record<string, string>>({});
|
|
||||||
|
|
||||||
const handleSubmit = (e: FormEvent<HTMLFormElement>) => {
|
|
||||||
e.preventDefault()
|
|
||||||
|
|
||||||
const formData = new FormData(e.currentTarget)
|
|
||||||
const data = Object.fromEntries(formData)
|
|
||||||
|
|
||||||
console.log("FORM DATA = ", data)
|
|
||||||
const result = schema.safeParse(data);
|
|
||||||
console.log("ZOD = ", result.error?.format())
|
|
||||||
|
|
||||||
if(!result.success) {
|
|
||||||
const formatedErrors = result.error.format() as Record<string, { _errors?: string[] }>;
|
|
||||||
|
|
||||||
const newErrors: Record<string, string> = {};
|
|
||||||
Object.keys(formatedErrors).forEach((field) => {
|
|
||||||
if (field !== "_errors" && formatedErrors[field]._errors?.length) {
|
|
||||||
newErrors[field] = formatedErrors[field]._errors[0];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
setErrors(newErrors)
|
|
||||||
} else {
|
|
||||||
setErrors({})
|
|
||||||
submit(result.data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<form onSubmit={handleSubmit} className={formClassName}>
|
|
||||||
<div className="flex justify-center text-black">
|
|
||||||
<p className="text-3xl font-bold">{title}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className={`space-y-8 my-2 ${className}`}>
|
|
||||||
|
|
||||||
{
|
|
||||||
fields.map((item, index) => (
|
|
||||||
<div key={index}>
|
|
||||||
<FloatingLabelInput
|
|
||||||
label={item.label}
|
|
||||||
name={item.name}
|
|
||||||
type={item.type}
|
|
||||||
button={item.button}
|
|
||||||
defaultValue={item.defaultValue}
|
|
||||||
options={item.options}
|
|
||||||
placeholder={item.placeholder}
|
|
||||||
showPasswordToggle={item.showPasswordToggle}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<span className="text-red-500 text-xs mt-1">{errors[item.name]}</span>
|
|
||||||
</div>
|
|
||||||
))
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
{child}
|
|
||||||
</form>
|
|
||||||
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
import { icons } from "#/assets/icons";
|
|
||||||
import Image from "next/image";
|
|
||||||
|
|
||||||
export default function Header() {
|
|
||||||
return(
|
|
||||||
<div className="w-full bg-white shadow-md py-4">
|
|
||||||
<div className="container mx-auto text-center flex items-center justify-center gap-2">
|
|
||||||
<Image
|
|
||||||
src={icons.logo}
|
|
||||||
alt="Private Docs"
|
|
||||||
className="text-red-500 h-auto"
|
|
||||||
/>
|
|
||||||
<p className="text-2xl font-bold text-black">Private Docs</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
import * as Dialog from "@radix-ui/react-dialog";
|
|
||||||
import { ReactNode } from "react";
|
|
||||||
import { icons } from "#/assets/icons"
|
|
||||||
import Image from "next/image";
|
|
||||||
|
|
||||||
export function Modal({
|
|
||||||
trigger,
|
|
||||||
title,
|
|
||||||
content,
|
|
||||||
open,
|
|
||||||
onOpenChange
|
|
||||||
}: {
|
|
||||||
trigger: ReactNode;
|
|
||||||
title?: string | ReactNode;
|
|
||||||
content: ReactNode;
|
|
||||||
open?: boolean;
|
|
||||||
onOpenChange?: (open: boolean) => void;
|
|
||||||
}) {
|
|
||||||
return (
|
|
||||||
<Dialog.Root open={open} onOpenChange={onOpenChange}>
|
|
||||||
<Dialog.Trigger asChild>
|
|
||||||
{trigger}
|
|
||||||
</Dialog.Trigger>
|
|
||||||
<Dialog.Portal>
|
|
||||||
<Dialog.Overlay className="fixed inset-0 bg-black/25 z-40" />
|
|
||||||
<Dialog.Content className="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-max flex flex-col gap-10 bg-white rounded-lg shadow-xl z-50 px-16 py-12"
|
|
||||||
// onPointerDownOutside={(e) => e.preventDefault()}
|
|
||||||
>
|
|
||||||
<Dialog.Title className="text-xl font-bold text-center text-[30px] ">
|
|
||||||
{title}
|
|
||||||
</Dialog.Title>
|
|
||||||
|
|
||||||
<div className="flex gap-5 justify-center">
|
|
||||||
{content}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="absolute top-5 right-5 text-gray-500 hover:text-gray-700 cursor-pointer"
|
|
||||||
onClick={() => {onOpenChange?.(false)}}
|
|
||||||
>
|
|
||||||
<Image src={icons.crossIcon} alt="fermer"/>
|
|
||||||
</div>
|
|
||||||
</Dialog.Content>
|
|
||||||
</Dialog.Portal>
|
|
||||||
</Dialog.Root>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
'use client'
|
|
||||||
import { SessionProvider } from "next-auth/react";
|
|
||||||
import { ReactNode } from "react";
|
|
||||||
|
|
||||||
export function AuthProvider({ children }: Readonly<{ children: ReactNode }>) {
|
|
||||||
return <SessionProvider>{children}</SessionProvider>;
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
"use client";
|
|
||||||
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
||||||
|
|
||||||
import { ReactNode } from "react";
|
|
||||||
|
|
||||||
export function QueryClientProvide({
|
|
||||||
children,
|
|
||||||
}: Readonly<{ children: ReactNode }>) {
|
|
||||||
const queryClient = new QueryClient();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,70 +0,0 @@
|
|||||||
import Image from "next/image"
|
|
||||||
import { useQuery } from "@tanstack/react-query";
|
|
||||||
import axios from "axios";
|
|
||||||
import { useSession } from "next-auth/react";
|
|
||||||
import { icons } from "#/assets/icons";
|
|
||||||
import { Stats, StatsType, } from "#/types";
|
|
||||||
|
|
||||||
export default function Statistics() {
|
|
||||||
|
|
||||||
const { data: session, status } = useSession();
|
|
||||||
|
|
||||||
const { data: stats, isLoading} = useQuery({
|
|
||||||
enabled: status === 'authenticated',
|
|
||||||
queryKey: ["stats", session?.user.access_token],
|
|
||||||
queryFn: async () => {
|
|
||||||
try {
|
|
||||||
const response = await axios.get(
|
|
||||||
'https://private-docs-api.intside.co/statistics', {
|
|
||||||
headers: {
|
|
||||||
'Authorization': `Bearer ${session?.user.access_token}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(response.data) {
|
|
||||||
return response.data as Stats
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const statsData: StatsType[] = [
|
|
||||||
{ id: 1, title: 'Organisations', value: stats?.companies, icon: icons.companiesIcon, color: 'blue' },
|
|
||||||
{ id: 2, title: 'Utilisateurs', value: stats?.users, icon: icons.userIcon, color: 'blue' },
|
|
||||||
{ id: 3, title: 'Documents', value: stats?.documents, icon: icons.docummentTextIcon, color: 'blue' },
|
|
||||||
{ id: 4, title: 'Stockage', value: stats?.documents_size, icon: icons.archivesIcon, color: 'blue' }
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return(
|
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
|
|
||||||
{statsData.map(({ id, title, value, icon }) => (
|
|
||||||
<div key={id} className="w-full">
|
|
||||||
<div className="flex items-center rounded-xl border-2 border-blue-500 p-4 space-x-3">
|
|
||||||
<div
|
|
||||||
className="flex items-center justify-center rounded-lg bg-[#E9F0FF] bg-opacity-25 p-2"
|
|
||||||
style={{ width: '54px', height: '54px' }}
|
|
||||||
>
|
|
||||||
<Image
|
|
||||||
alt={title}
|
|
||||||
src={icon}
|
|
||||||
width={32}
|
|
||||||
height={32}
|
|
||||||
className="text-blue-500"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="ml-3">
|
|
||||||
<p className="text-sm text-gray-500 mb-0">{title}</p>
|
|
||||||
<p className="font-bold text-2xl mb-0">{ status === "loading" && isLoading ? "Chargement..." : value}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,214 +0,0 @@
|
|||||||
"use client";
|
|
||||||
import {
|
|
||||||
ColumnDef,
|
|
||||||
flexRender,
|
|
||||||
getCoreRowModel,
|
|
||||||
useReactTable,
|
|
||||||
getPaginationRowModel,
|
|
||||||
ColumnFiltersState,
|
|
||||||
getFilteredRowModel,
|
|
||||||
Table as TableType,
|
|
||||||
} from "@tanstack/react-table"
|
|
||||||
import { ReactNode, useEffect, useRef, useState } from "react";
|
|
||||||
import Image from "next/image";
|
|
||||||
import { icons } from "#/assets/icons";
|
|
||||||
import clsx from "clsx";
|
|
||||||
|
|
||||||
interface DataTableProps<TData, TValue> {
|
|
||||||
columns: ColumnDef<TData, TValue>[]
|
|
||||||
data: TData[],
|
|
||||||
pageSize?: number,
|
|
||||||
header?: ReactNode | ((table: TableType<TData>) => ReactNode),
|
|
||||||
isDataLoading?: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function Table<TData, TValue>({
|
|
||||||
columns,
|
|
||||||
data,
|
|
||||||
pageSize = 10,
|
|
||||||
header,
|
|
||||||
isDataLoading = true
|
|
||||||
}: DataTableProps<TData, TValue>) {
|
|
||||||
const [rowSelection, setRowSelection] = useState({})
|
|
||||||
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>(
|
|
||||||
[]
|
|
||||||
)
|
|
||||||
|
|
||||||
const table = useReactTable({
|
|
||||||
data,
|
|
||||||
columns,
|
|
||||||
getCoreRowModel: getCoreRowModel(),
|
|
||||||
getPaginationRowModel: getPaginationRowModel(),
|
|
||||||
|
|
||||||
state: {
|
|
||||||
rowSelection,
|
|
||||||
columnFilters,
|
|
||||||
},
|
|
||||||
initialState: {
|
|
||||||
pagination: {
|
|
||||||
pageSize: pageSize,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
enableRowSelection: true,
|
|
||||||
getFilteredRowModel: getFilteredRowModel(),
|
|
||||||
onRowSelectionChange: setRowSelection,
|
|
||||||
onColumnFiltersChange: setColumnFilters,
|
|
||||||
})
|
|
||||||
|
|
||||||
const headerCheckboxRef = useRef<HTMLInputElement>(null);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (headerCheckboxRef.current) {
|
|
||||||
headerCheckboxRef.current.indeterminate =
|
|
||||||
table.getIsSomePageRowsSelected() && !table.getIsAllPageRowsSelected();
|
|
||||||
}
|
|
||||||
|
|
||||||
const selectedRows = table.getSelectedRowModel().rows;
|
|
||||||
const filteredSelectedRows = table
|
|
||||||
.getRowModel()
|
|
||||||
.rows.filter((row) => row.getIsSelected())
|
|
||||||
.map((row) => row.original);
|
|
||||||
|
|
||||||
console.log("SELECTED ALL = ", selectedRows);
|
|
||||||
console.log("SELECTED = ", filteredSelectedRows);
|
|
||||||
}, [
|
|
||||||
table
|
|
||||||
]);
|
|
||||||
|
|
||||||
const totalPages = table.getPageCount()
|
|
||||||
const currentPage = table.getState().pagination.pageIndex + 1
|
|
||||||
|
|
||||||
const getPageNumbers = () => {
|
|
||||||
const pages = []
|
|
||||||
for (let i = 1; i <= totalPages; i++) {
|
|
||||||
pages.push(i)
|
|
||||||
}
|
|
||||||
return pages
|
|
||||||
}
|
|
||||||
|
|
||||||
const render = () => {
|
|
||||||
if(!header) return null
|
|
||||||
|
|
||||||
return(
|
|
||||||
<div className="mb-4">
|
|
||||||
{typeof header === 'function'
|
|
||||||
? header(table)
|
|
||||||
: header}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return(
|
|
||||||
<div className="w-full">
|
|
||||||
{render()}
|
|
||||||
|
|
||||||
<div className="rounded-lg border border-gray-200 w-auto">
|
|
||||||
<div className="overflow-x-auto">
|
|
||||||
<table className="w-full overflow-x-auto rounded-lg">
|
|
||||||
<thead className="h-10">
|
|
||||||
{table.getHeaderGroups().map((headerGroup) => (
|
|
||||||
<tr key={headerGroup.id} className="rounded-lg">
|
|
||||||
{header
|
|
||||||
?
|
|
||||||
<th className="bg-[#E9F0FF] p-3 text-start first:rounded-tl-lg">
|
|
||||||
|
|
||||||
</th>
|
|
||||||
:
|
|
||||||
<th className="bg-[#E9F0FF] p-3 text-start first:rounded-tl-lg">
|
|
||||||
<input
|
|
||||||
ref={headerCheckboxRef}
|
|
||||||
checked={!!table.getIsAllPageRowsSelected()}
|
|
||||||
onChange={(e) => table.toggleAllPageRowsSelected(e.target.checked)}
|
|
||||||
type="checkbox" name="" id=""
|
|
||||||
/>
|
|
||||||
</th>
|
|
||||||
}
|
|
||||||
{headerGroup.headers.map((header) => {
|
|
||||||
return(
|
|
||||||
<th key={header.id} className="bg-[#E9F0FF] p-3 text-start last:rounded-tr-lg">
|
|
||||||
{flexRender(
|
|
||||||
header.column.columnDef.header,
|
|
||||||
header.getContext()
|
|
||||||
)}
|
|
||||||
</th>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</tr>
|
|
||||||
))}
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{table.getRowModel().rows.length ? (
|
|
||||||
table.getRowModel().rows.map((row) => (
|
|
||||||
<tr key={row.id} className={clsx('hover:bg-gray-100 border-t border-gray-200', { 'bg-gray-300': row.getIsSelected()})}>
|
|
||||||
<td className="p-3 text-start">
|
|
||||||
<input
|
|
||||||
checked={row.getIsSelected()}
|
|
||||||
onChange={(e) => row.toggleSelected(e.target.checked)}
|
|
||||||
type="checkbox" name="" id=""
|
|
||||||
/>
|
|
||||||
</td>
|
|
||||||
{row.getVisibleCells().map((cell) => (
|
|
||||||
<td key={cell.id} className="p-3 text-start">
|
|
||||||
{flexRender(cell.column.columnDef.cell, cell.getContext())}
|
|
||||||
</td>
|
|
||||||
))}
|
|
||||||
</tr>
|
|
||||||
))
|
|
||||||
)
|
|
||||||
: isDataLoading ?
|
|
||||||
(
|
|
||||||
<tr>
|
|
||||||
<td colSpan={columns.length} className="h-20 text-center">
|
|
||||||
Chargement...
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
)
|
|
||||||
: (
|
|
||||||
<tr>
|
|
||||||
<td colSpan={columns.length} className="h-20 text-center">
|
|
||||||
Aucun résultats
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
)}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex items-center justify-end space-x-2 py-4">
|
|
||||||
<button
|
|
||||||
className="hover:bg-gray-300 cursor-pointer px-3 py-1 rounded w-9 h-9"
|
|
||||||
onClick={() => table.previousPage()}
|
|
||||||
disabled={!table.getCanPreviousPage()}
|
|
||||||
>
|
|
||||||
<Image alt="" src={icons.arrowLeft} className="hover:text-blue-400"/>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<div className="flex space-x-1">
|
|
||||||
{getPageNumbers().map((pageNumber) => (
|
|
||||||
<button
|
|
||||||
key={pageNumber}
|
|
||||||
className={clsx(
|
|
||||||
"px-3 py-1 rounded w-9 h-9",
|
|
||||||
pageNumber === currentPage
|
|
||||||
? "bg-[#E9F0FF] text-blue-400"
|
|
||||||
: "hover:bg-gray-300 cursor-pointer"
|
|
||||||
)}
|
|
||||||
onClick={() => table.setPageIndex(pageNumber - 1)}
|
|
||||||
>
|
|
||||||
{pageNumber}
|
|
||||||
</button>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button
|
|
||||||
className="w-9 h-9 hover:bg-gray-300 cursor-pointer hover:text-black px-3 py-1 rounded"
|
|
||||||
onClick={() => table.nextPage()}
|
|
||||||
disabled={!table.getCanNextPage()}
|
|
||||||
>
|
|
||||||
<Image alt="" src={icons.arrowRight} />
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
// src/lib/declarations.ts
|
|
||||||
|
|
||||||
export type GeneralHtmlAttr = React.HTMLProps<HTMLDivElement> | React.HTMLProps<HTMLImageElement>;
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
import { signOut } from "next-auth/react";
|
|
||||||
|
|
||||||
export const signOutFunc = () => {
|
|
||||||
signOut({
|
|
||||||
callbackUrl: `/login?redirect_to=${
|
|
||||||
window.location.pathname === "/logout"
|
|
||||||
? "/home"
|
|
||||||
: window.location.pathname
|
|
||||||
}`,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
import { z } from "zod";
|
|
||||||
|
|
||||||
export const loginSchema = z.object({
|
|
||||||
email: z.string().email("Email invalide"),
|
|
||||||
password: z.string().min(8, "Le mot de passe doit contenir au moins 8 caractères")
|
|
||||||
});
|
|
||||||
|
|
||||||
export const adminSchema = z.object({
|
|
||||||
id: z.string().optional(),
|
|
||||||
last_name: z.string(),
|
|
||||||
first_name: z.string(),
|
|
||||||
email: z.string().min(1, "L'email est requis").email("Email invalide"),
|
|
||||||
organization: z.string().optional(),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const companySchema = z.object({
|
|
||||||
name: z.string().min(1, "Le nom est requis"),
|
|
||||||
description: z.string(),
|
|
||||||
status: z.string(),
|
|
||||||
owner: z.string()
|
|
||||||
})
|
|
||||||
@ -1,72 +0,0 @@
|
|||||||
import { ReactNode } from "react";
|
|
||||||
import { ZodSchema } from "zod";
|
|
||||||
export interface Option {
|
|
||||||
label: string
|
|
||||||
value: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface FloatingLabelInputProps {
|
|
||||||
label?: string;
|
|
||||||
placeholder?: string;
|
|
||||||
type: 'text' | 'password' | 'select' | 'email' | 'number' | 'hidden' | 'search' | 'textarea';
|
|
||||||
options?: Option[];
|
|
||||||
button?: React.ReactNode;
|
|
||||||
showPasswordToggle?: boolean;
|
|
||||||
name: string;
|
|
||||||
defaultValue?: string;
|
|
||||||
onChange?: (value: string) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface FormProps{
|
|
||||||
title?: string,
|
|
||||||
fields: FloatingLabelInputProps[],
|
|
||||||
submit: (param: any) => unknown,
|
|
||||||
className?: string,
|
|
||||||
child: ReactNode,
|
|
||||||
schema: ZodSchema,
|
|
||||||
formClassName?: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StatsType {
|
|
||||||
id: number;
|
|
||||||
title: string;
|
|
||||||
value: number | undefined;
|
|
||||||
icon: string;
|
|
||||||
color: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Stats {
|
|
||||||
companies: number
|
|
||||||
documents: number
|
|
||||||
users: number
|
|
||||||
documents_size: number
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Company {
|
|
||||||
id: string
|
|
||||||
name: string
|
|
||||||
description?: string;
|
|
||||||
is_premium: boolean
|
|
||||||
status: string
|
|
||||||
owner: Owner
|
|
||||||
total_users?: number
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Owner {
|
|
||||||
id: string
|
|
||||||
first_name: string
|
|
||||||
email: string
|
|
||||||
last_name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CompanyById {
|
|
||||||
id: string
|
|
||||||
name: string
|
|
||||||
is_premium: boolean
|
|
||||||
status: string
|
|
||||||
owner: Owner
|
|
||||||
total_users: number
|
|
||||||
total_documents: number
|
|
||||||
total_documents_sizes: number
|
|
||||||
last_use: any
|
|
||||||
}
|
|
||||||
@ -19,10 +19,9 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"paths": {
|
"paths": {
|
||||||
"#/*": ["./src/*"],
|
"@/*": ["./*"]
|
||||||
"@/*": ["./src/*"]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["svgr.d.ts", "next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||||
"exclude": ["node_modules"]
|
"exclude": ["node_modules"]
|
||||||
}
|
}
|
||||||
|
|||||||