From 65e3d38ac04b130fc16aaf049de1a5b29650f1b7 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 4 Apr 2024 10:54:11 +0200 Subject: [PATCH 1/9] :sparkles: new pages in config --- package.json | 2 +- .../DesignSystem/Header/Navigation/index.tsx | 11 +++- .../SubscriptionFacturation/index.tsx | 22 ++++--- src/front/Config/Module/development.json | 60 +++++++++++++++++++ src/front/Config/Module/preprod.json | 60 +++++++++++++++++++ src/front/Config/Module/production.json | 60 +++++++++++++++++++ src/front/Config/Module/staging.json | 60 +++++++++++++++++++ 7 files changed, 264 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 870848ea..f3708f42 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", + "dev": "next dev -p 5005", "build": "next build", "start": "next start", "lint": "next lint", diff --git a/src/front/Components/DesignSystem/Header/Navigation/index.tsx b/src/front/Components/DesignSystem/Header/Navigation/index.tsx index fc98f632..d2a1764b 100644 --- a/src/front/Components/DesignSystem/Header/Navigation/index.tsx +++ b/src/front/Components/DesignSystem/Header/Navigation/index.tsx @@ -40,11 +40,11 @@ export default function Navigation() { read: false, }, include: { - notification: true + notification: true, }, orderBy: { - notification: {created_at: "desc"}, - } + notification: { created_at: "desc" }, + }, }); notifications.forEach((notification) => { Toasts.getInstance().open({ @@ -89,6 +89,11 @@ export default function Navigation() { routesActive={[Module.getInstance().get().modules.pages.Collaborators.props.path]} /> + ); } diff --git a/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx index 33e3be63..1f222cb8 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx @@ -6,6 +6,8 @@ import { useCallback, useState } from "react"; import Confirm from "@Front/Components/DesignSystem/Modal/Confirm"; import useOpenable from "@Front/Hooks/useOpenable"; import MessageBox from "@Front/Components/Elements/MessageBox"; +import Link from "next/link"; +import Module from "@Front/Config/Module"; export enum EForfeitType { "standard", @@ -23,7 +25,7 @@ export default function SubscriptionFacturation() { }, [closeCancelSubscription, openConfirmation]); return ( - +
@@ -71,9 +73,12 @@ export default function SubscriptionFacturation() {
{forfeitType !== EForfeitType.standard && ( - + + + )} {forfeitType === EForfeitType.standard && ( )} {forfeitType === EForfeitType.standard && ( - + + + )}
diff --git a/src/front/Config/Module/development.json b/src/front/Config/Module/development.json index ad7eef2a..a80b6c75 100644 --- a/src/front/Config/Module/development.json +++ b/src/front/Config/Module/development.json @@ -270,6 +270,66 @@ "path": "/404", "labelKey": "not_found" } + }, + "Subscription": { + "enabled": true, + "props": { + "path": "/subscription", + "labelKey": "subscription" + }, + "pages": { + "Facturation": { + "enabled": true, + "props": { + "path": "/subscription/facturation", + "labelKey": "facturation" + } + }, + "New": { + "enabled": true, + "props": { + "path": "/subscription/new", + "labelKey": "subscribe" + } + }, + "Error": { + "enabled": true, + "props": { + "path": "/subscription/error", + "labelKey": "error" + } + }, + "Success": { + "enabled": true, + "props": { + "path": "/subscription/success", + "labelKey": "success" + } + }, + "Subscribe": { + "enabled": true, + "props": { + "path": "/subscription/subscribe", + "labelKey": "subscribe" + }, + "pages": { + "Standard": { + "enabled": true, + "props": { + "path": "/subscription/subscribe/standard", + "labelKey": "standard" + } + }, + "Illimity": { + "enabled": true, + "props": { + "path": "/subscription/subscribe/illimity", + "labelKey": "illimity" + } + } + } + } + } } } } diff --git a/src/front/Config/Module/preprod.json b/src/front/Config/Module/preprod.json index ad7eef2a..a80b6c75 100644 --- a/src/front/Config/Module/preprod.json +++ b/src/front/Config/Module/preprod.json @@ -270,6 +270,66 @@ "path": "/404", "labelKey": "not_found" } + }, + "Subscription": { + "enabled": true, + "props": { + "path": "/subscription", + "labelKey": "subscription" + }, + "pages": { + "Facturation": { + "enabled": true, + "props": { + "path": "/subscription/facturation", + "labelKey": "facturation" + } + }, + "New": { + "enabled": true, + "props": { + "path": "/subscription/new", + "labelKey": "subscribe" + } + }, + "Error": { + "enabled": true, + "props": { + "path": "/subscription/error", + "labelKey": "error" + } + }, + "Success": { + "enabled": true, + "props": { + "path": "/subscription/success", + "labelKey": "success" + } + }, + "Subscribe": { + "enabled": true, + "props": { + "path": "/subscription/subscribe", + "labelKey": "subscribe" + }, + "pages": { + "Standard": { + "enabled": true, + "props": { + "path": "/subscription/subscribe/standard", + "labelKey": "standard" + } + }, + "Illimity": { + "enabled": true, + "props": { + "path": "/subscription/subscribe/illimity", + "labelKey": "illimity" + } + } + } + } + } } } } diff --git a/src/front/Config/Module/production.json b/src/front/Config/Module/production.json index ad7eef2a..a80b6c75 100644 --- a/src/front/Config/Module/production.json +++ b/src/front/Config/Module/production.json @@ -270,6 +270,66 @@ "path": "/404", "labelKey": "not_found" } + }, + "Subscription": { + "enabled": true, + "props": { + "path": "/subscription", + "labelKey": "subscription" + }, + "pages": { + "Facturation": { + "enabled": true, + "props": { + "path": "/subscription/facturation", + "labelKey": "facturation" + } + }, + "New": { + "enabled": true, + "props": { + "path": "/subscription/new", + "labelKey": "subscribe" + } + }, + "Error": { + "enabled": true, + "props": { + "path": "/subscription/error", + "labelKey": "error" + } + }, + "Success": { + "enabled": true, + "props": { + "path": "/subscription/success", + "labelKey": "success" + } + }, + "Subscribe": { + "enabled": true, + "props": { + "path": "/subscription/subscribe", + "labelKey": "subscribe" + }, + "pages": { + "Standard": { + "enabled": true, + "props": { + "path": "/subscription/subscribe/standard", + "labelKey": "standard" + } + }, + "Illimity": { + "enabled": true, + "props": { + "path": "/subscription/subscribe/illimity", + "labelKey": "illimity" + } + } + } + } + } } } } diff --git a/src/front/Config/Module/staging.json b/src/front/Config/Module/staging.json index ad7eef2a..a80b6c75 100644 --- a/src/front/Config/Module/staging.json +++ b/src/front/Config/Module/staging.json @@ -270,6 +270,66 @@ "path": "/404", "labelKey": "not_found" } + }, + "Subscription": { + "enabled": true, + "props": { + "path": "/subscription", + "labelKey": "subscription" + }, + "pages": { + "Facturation": { + "enabled": true, + "props": { + "path": "/subscription/facturation", + "labelKey": "facturation" + } + }, + "New": { + "enabled": true, + "props": { + "path": "/subscription/new", + "labelKey": "subscribe" + } + }, + "Error": { + "enabled": true, + "props": { + "path": "/subscription/error", + "labelKey": "error" + } + }, + "Success": { + "enabled": true, + "props": { + "path": "/subscription/success", + "labelKey": "success" + } + }, + "Subscribe": { + "enabled": true, + "props": { + "path": "/subscription/subscribe", + "labelKey": "subscribe" + }, + "pages": { + "Standard": { + "enabled": true, + "props": { + "path": "/subscription/subscribe/standard", + "labelKey": "standard" + } + }, + "Illimity": { + "enabled": true, + "props": { + "path": "/subscription/subscribe/illimity", + "labelKey": "illimity" + } + } + } + } + } } } } From ba451cbfa9e63aed37aea56d35391cab88c74aef Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 4 Apr 2024 10:59:10 +0200 Subject: [PATCH 2/9] :sparkles: new pages in config --- src/front/Config/Module/development.json | 7 +++++++ src/front/Config/Module/preprod.json | 7 +++++++ src/front/Config/Module/production.json | 7 +++++++ src/front/Config/Module/staging.json | 7 +++++++ 4 files changed, 28 insertions(+) diff --git a/src/front/Config/Module/development.json b/src/front/Config/Module/development.json index a80b6c75..9c23ac7e 100644 --- a/src/front/Config/Module/development.json +++ b/src/front/Config/Module/development.json @@ -278,6 +278,13 @@ "labelKey": "subscription" }, "pages": { + "Invite": { + "enabled": true, + "props": { + "path": "/subscription/invite", + "labelKey": "invite" + } + }, "Facturation": { "enabled": true, "props": { diff --git a/src/front/Config/Module/preprod.json b/src/front/Config/Module/preprod.json index a80b6c75..9c23ac7e 100644 --- a/src/front/Config/Module/preprod.json +++ b/src/front/Config/Module/preprod.json @@ -278,6 +278,13 @@ "labelKey": "subscription" }, "pages": { + "Invite": { + "enabled": true, + "props": { + "path": "/subscription/invite", + "labelKey": "invite" + } + }, "Facturation": { "enabled": true, "props": { diff --git a/src/front/Config/Module/production.json b/src/front/Config/Module/production.json index a80b6c75..9c23ac7e 100644 --- a/src/front/Config/Module/production.json +++ b/src/front/Config/Module/production.json @@ -278,6 +278,13 @@ "labelKey": "subscription" }, "pages": { + "Invite": { + "enabled": true, + "props": { + "path": "/subscription/invite", + "labelKey": "invite" + } + }, "Facturation": { "enabled": true, "props": { diff --git a/src/front/Config/Module/staging.json b/src/front/Config/Module/staging.json index a80b6c75..9c23ac7e 100644 --- a/src/front/Config/Module/staging.json +++ b/src/front/Config/Module/staging.json @@ -278,6 +278,13 @@ "labelKey": "subscription" }, "pages": { + "Invite": { + "enabled": true, + "props": { + "path": "/subscription/invite", + "labelKey": "invite" + } + }, "Facturation": { "enabled": true, "props": { From 62997b8f4db57820ee54a492adfedbe9cde91bb8 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 4 Apr 2024 11:55:51 +0200 Subject: [PATCH 3/9] :sparkles: Invite collaborators almost working --- package-lock.json | 41 +++++++------- .../SubscriptionInvite/classes.module.scss | 23 ++++++++ .../Subscription/SubscriptionInvite/index.tsx | 56 +++++++++++++++++++ src/pages/subscription/invite/index.tsx | 5 ++ 4 files changed, 104 insertions(+), 21 deletions(-) create mode 100644 src/front/Components/Layouts/Subscription/SubscriptionInvite/classes.module.scss create mode 100644 src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx create mode 100644 src/pages/subscription/invite/index.tsx diff --git a/package-lock.json b/package-lock.json index 59e4c5e7..e2832b48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -162,9 +162,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -474,23 +474,23 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz", - "integrity": "sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.15.tgz", + "integrity": "sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/material": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.14.tgz", - "integrity": "sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.15.tgz", + "integrity": "sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/base": "5.0.0-beta.40", - "@mui/core-downloads-tracker": "^5.15.14", - "@mui/system": "^5.15.14", + "@mui/core-downloads-tracker": "^5.15.15", + "@mui/system": "^5.15.15", "@mui/types": "^7.2.14", "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", @@ -584,9 +584,9 @@ } }, "node_modules/@mui/system": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.14.tgz", - "integrity": "sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.15.14", @@ -1391,13 +1391,12 @@ "optional": true }, "node_modules/bare-fs": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.2.tgz", - "integrity": "sha512-X9IqgvyB0/VA5OZJyb5ZstoN62AzD7YxVGog13kkfYWYqJYcK0kcqLZ6TrmH5qr4/8//ejVcX4x/a0UvaogXmA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.3.tgz", + "integrity": "sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==", "optional": true, "dependencies": { "bare-events": "^2.0.0", - "bare-os": "^2.0.0", "bare-path": "^2.0.0", "streamx": "^2.13.0" } @@ -4481,9 +4480,9 @@ } }, "node_modules/sass": { - "version": "1.72.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", - "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", + "version": "1.74.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.74.1.tgz", + "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", diff --git a/src/front/Components/Layouts/Subscription/SubscriptionInvite/classes.module.scss b/src/front/Components/Layouts/Subscription/SubscriptionInvite/classes.module.scss new file mode 100644 index 00000000..14c07ee3 --- /dev/null +++ b/src/front/Components/Layouts/Subscription/SubscriptionInvite/classes.module.scss @@ -0,0 +1,23 @@ +.root { + max-width: 1400px; + margin: auto; + + .container { + display: flex; + text-align: center; + justify-content: center; + flex-direction: column; + gap: 32px; + + .emails-form { + display: flex; + flex-direction: column; + gap: 32px; + + .button-container { + display: flex; + justify-content: center; + } + } + } +} diff --git a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx new file mode 100644 index 00000000..aec39557 --- /dev/null +++ b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx @@ -0,0 +1,56 @@ +import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; +import classes from "./classes.module.scss"; +import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; +import { useRouter } from "next/router"; +import TextField from "@Front/Components/DesignSystem/Form/TextField"; +import Button from "@Front/Components/DesignSystem/Button"; +import Form from "@Front/Components/DesignSystem/Form"; + +export enum EForfeitType { + "standard", + "unlimited", +} +export default function SubscriptionInvite() { + const router = useRouter(); + const nbOfCollaborators = parseInt(router.query["nbOfCollaborators"] as string); + + const sendInvitations = (e: React.FormEvent | null) => { + if (!e) return; + e.preventDefault(); + const form = e.target as HTMLFormElement; + const emails: string[] = []; + Object.keys(form.elements).forEach((key) => { + if (isNaN(parseInt(key))) return; + const element = form.elements[key as any] as HTMLInputElement; + if (element.name.includes("email_")) { + emails.push(element.value); + } + }); + + console.log(emails); + }; + return ( + +
+
+ + Inviter vos collaborateurs + + {nbOfCollaborators && ( + + {nbOfCollaborators} collaborateurs à inviter + + )} +
+ {Array.from({ length: nbOfCollaborators }).map((_, index) => { + return ; + })} +
+ +
+ +
+
+
+ ); +} diff --git a/src/pages/subscription/invite/index.tsx b/src/pages/subscription/invite/index.tsx new file mode 100644 index 00000000..7034f54b --- /dev/null +++ b/src/pages/subscription/invite/index.tsx @@ -0,0 +1,5 @@ +import SubscriptionInvite from "@Front/Components/Layouts/Subscription/SubscriptionInvite"; + +export default function Route() { + return ; +} From bd6cd5995a33e647726b536cb75caa9f41663c89 Mon Sep 17 00:00:00 2001 From: Vins Date: Thu, 4 Apr 2024 13:35:25 +0200 Subject: [PATCH 4/9] Send invitation email connected --- package.json | 2 +- .../Admin/Subscriptions/Subscriptions.ts | 35 +++++++++++++++++++ .../Subscription/SubscriptionInvite/index.tsx | 13 +++++-- 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts diff --git a/package.json b/package.json index f3708f42..870848ea 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev -p 5005", + "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint", diff --git a/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts b/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts new file mode 100644 index 00000000..db6fabff --- /dev/null +++ b/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts @@ -0,0 +1,35 @@ +import BaseAdmin from "../../../../../common/Api/LeCoffreApi/Admin/BaseAdmin"; + +export interface IPostSubscriptionsParams { + emails: string[]; +} + +export default class Subscriptions extends BaseAdmin { + private static instance: Subscriptions; + private readonly baseURl = this.namespaceUrl.concat("/subscriptions"); + + private constructor() { + super(); + } + + public static getInstance() { + if (!this.instance) { + return new this(); + } else { + return this.instance; + } + } + + /** + * @description : Create a Document + */ + public async post(body: IPostSubscriptionsParams) { + const url = new URL(this.baseURl.concat(`/invite`)); + try { + return await this.postRequest(url, body as any); + } catch (err) { + this.onError(err); + return Promise.reject(err); + } + } +} diff --git a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx index aec39557..36a76f9b 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx @@ -5,6 +5,7 @@ import { useRouter } from "next/router"; import TextField from "@Front/Components/DesignSystem/Form/TextField"; import Button from "@Front/Components/DesignSystem/Button"; import Form from "@Front/Components/DesignSystem/Form"; +import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions"; export enum EForfeitType { "standard", @@ -14,7 +15,7 @@ export default function SubscriptionInvite() { const router = useRouter(); const nbOfCollaborators = parseInt(router.query["nbOfCollaborators"] as string); - const sendInvitations = (e: React.FormEvent | null) => { + const sendInvitations = async (e: React.FormEvent | null) => { if (!e) return; e.preventDefault(); const form = e.target as HTMLFormElement; @@ -26,8 +27,14 @@ export default function SubscriptionInvite() { emails.push(element.value); } }); - - console.log(emails); + const body = { + emails, + }; + try { + await Subscriptions.getInstance().post(body); + } catch (e) { + console.error(e); + } }; return ( From 098d42d41929285cb0918021d7f7e8ec848ad780 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 4 Apr 2024 14:34:23 +0200 Subject: [PATCH 5/9] :sparkles: multiple email lines working --- .../SubscriptionInvite/classes.module.scss | 15 ++++ .../Subscription/SubscriptionInvite/index.tsx | 74 +++++++++++++++++-- 2 files changed, 81 insertions(+), 8 deletions(-) diff --git a/src/front/Components/Layouts/Subscription/SubscriptionInvite/classes.module.scss b/src/front/Components/Layouts/Subscription/SubscriptionInvite/classes.module.scss index 14c07ee3..35366fac 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionInvite/classes.module.scss +++ b/src/front/Components/Layouts/Subscription/SubscriptionInvite/classes.module.scss @@ -14,6 +14,21 @@ flex-direction: column; gap: 32px; + .input-container { + display: flex; + gap: 16px; + justify-content: flex-start; + align-items: center; + > span { + width: 100%; + flex: 1; + } + } + .add-line-container { + display: flex; + justify-content: flex-start; + } + .button-container { display: flex; justify-content: center; diff --git a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx index 36a76f9b..b36bd706 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx @@ -3,17 +3,40 @@ import classes from "./classes.module.scss"; import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; import { useRouter } from "next/router"; import TextField from "@Front/Components/DesignSystem/Form/TextField"; -import Button from "@Front/Components/DesignSystem/Button"; +import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button"; import Form from "@Front/Components/DesignSystem/Form"; import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions"; +import { useCallback, useState } from "react"; +import { TrashIcon } from "@heroicons/react/24/outline"; +import PlusIcon from "@Assets/Icons/plus.svg"; export enum EForfeitType { "standard", "unlimited", } +type EmailLine = { + element: JSX.Element; + id: number; +}; + export default function SubscriptionInvite() { const router = useRouter(); const nbOfCollaborators = parseInt(router.query["nbOfCollaborators"] as string); + const [incrementalId, setIncrementalId] = useState(isNaN(nbOfCollaborators) ? 0 : nbOfCollaborators); + + const getInitialLines = () => { + const linesToGet = isNaN(nbOfCollaborators) ? 1 : nbOfCollaborators; + const lines: EmailLine[] = []; + for (let i = 0; i < linesToGet; i++) { + lines.push({ + element: , + id: i, + }); + } + return lines; + }; + + const [lines, setLines] = useState(getInitialLines()); const sendInvitations = async (e: React.FormEvent | null) => { if (!e) return; @@ -27,15 +50,32 @@ export default function SubscriptionInvite() { emails.push(element.value); } }); - const body = { - emails, - }; + try { - await Subscriptions.getInstance().post(body); + await Subscriptions.getInstance().post({ + emails, + }); } catch (e) { console.error(e); } }; + + const addLine = useCallback(() => { + const newLine: EmailLine = { + element: ( + + ), + id: incrementalId + 1, + }; + setIncrementalId(incrementalId + 1); + setLines((prev) => [...prev, newLine]); + }, [incrementalId, lines]); + + const deleteLine = (e: React.MouseEvent) => { + const lineId = parseInt(e.currentTarget.getAttribute("data-line") as string); + setLines((prev) => prev.filter((line) => line.id !== lineId)); + }; + return (
@@ -49,9 +89,27 @@ export default function SubscriptionInvite() { )}
- {Array.from({ length: nbOfCollaborators }).map((_, index) => { - return ; - })} + {lines.map((line, index) => ( +
+ {line.element} + {!nbOfCollaborators && ( + + )} +
+ ))} + {isNaN(nbOfCollaborators) && ( +
+ +
+ )}
From eae078f23a1e5bfbac6386bd0bd9347462cea034 Mon Sep 17 00:00:00 2001 From: Vins Date: Thu, 4 Apr 2024 14:36:04 +0200 Subject: [PATCH 6/9] manage facturation --- .../Api/LeCoffreApi/Admin/Stripe/Stripe.ts | 14 ++++++++++++++ .../Admin/Subscriptions/Subscriptions.ts | 13 +++++++++++++ .../SubscribeCheckoutTicket/index.tsx | 2 -- .../SubscriptionFacturation/index.tsx | 18 +++++++++++++++++- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/front/Api/LeCoffreApi/Admin/Stripe/Stripe.ts b/src/front/Api/LeCoffreApi/Admin/Stripe/Stripe.ts index 95e41e74..382e8666 100644 --- a/src/front/Api/LeCoffreApi/Admin/Stripe/Stripe.ts +++ b/src/front/Api/LeCoffreApi/Admin/Stripe/Stripe.ts @@ -10,6 +10,10 @@ export type IPostStripeResponse = { url: string; }; +export type IGetClientPortalSessionResponse = { + url: string; +}; + export default class Stripe extends BaseAdmin { private static instance: Stripe; private readonly baseURl = this.namespaceUrl.concat("/stripe"); @@ -37,4 +41,14 @@ export default class Stripe extends BaseAdmin { return Promise.reject(err); } } + + public async getClientPortalSession(stripe_subscription_id: string) { + const url = new URL(this.baseURl.concat(`/${stripe_subscription_id}`)); + try { + return await this.getRequest(url); + } catch (err) { + this.onError(err); + return Promise.reject(err); + } + } } diff --git a/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts b/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts index db6fabff..c49d43e2 100644 --- a/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts +++ b/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts @@ -1,3 +1,4 @@ +import { Subscription } from "le-coffre-resources/dist/Admin"; import BaseAdmin from "../../../../../common/Api/LeCoffreApi/Admin/BaseAdmin"; export interface IPostSubscriptionsParams { @@ -20,6 +21,18 @@ export default class Subscriptions extends BaseAdmin { } } + public async get(q: any) { + const url = new URL(this.baseURl); + const query = { q }; + if (q) Object.entries(query).forEach(([key, value]) => url.searchParams.set(key, JSON.stringify(value))); + try { + return await this.getRequest(url); + } catch (err) { + this.onError(err); + return Promise.reject(err); + } + } + /** * @description : Create a Document */ diff --git a/src/front/Components/Layouts/Subscription/Subscribe/SubscribeCheckoutTicket/index.tsx b/src/front/Components/Layouts/Subscription/Subscribe/SubscribeCheckoutTicket/index.tsx index 1122913b..4efd2c45 100644 --- a/src/front/Components/Layouts/Subscription/Subscribe/SubscribeCheckoutTicket/index.tsx +++ b/src/front/Components/Layouts/Subscription/Subscribe/SubscribeCheckoutTicket/index.tsx @@ -46,8 +46,6 @@ export default function SubscribeCheckoutTicket(props: IProps) { }; const handleSubmitPayment = async () => { - console.log("handleSubmitPayment"); - const stripeCheckout = { type: EType.Standard, nb_seats: numberOfCollaborators, diff --git a/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx index 1f222cb8..4c783266 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx @@ -8,12 +8,17 @@ import useOpenable from "@Front/Hooks/useOpenable"; import MessageBox from "@Front/Components/Elements/MessageBox"; import Link from "next/link"; import Module from "@Front/Config/Module"; +import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions"; +import JwtService from "@Front/Services/JwtService/JwtService"; +import Stripe from "@Front/Api/LeCoffreApi/Admin/Stripe/Stripe"; +import { useRouter } from "next/router"; export enum EForfeitType { "standard", "unlimited", } export default function SubscriptionFacturation() { + const router = useRouter(); const [forfeitType, _setForfeitType] = useState(EForfeitType.standard); const { close: closeCancelSubscription, isOpen: isCancelSubscriptionOpen, open: openCancelSubscription } = useOpenable(); const { close: closeConfirmation, isOpen: isConfirmationOpen, open: openConfirmation } = useOpenable(); @@ -24,6 +29,17 @@ export default function SubscriptionFacturation() { return; }, [closeCancelSubscription, openConfirmation]); + const manageBilling = async () => { + console.log("handleSubmitPayment"); + + try { + const jwt = JwtService.getInstance().decodeJwt(); + const subscription = await Subscriptions.getInstance().get({ officeId: jwt?.office_Id }); + const stripe_client_portal = await Stripe.getInstance().getClientPortalSession(subscription.stripe_subscription_id!); + router.push(stripe_client_portal.url); + } catch (error) {} + }; + return (
@@ -141,7 +157,7 @@ export default function SubscriptionFacturation() { Arrêter l'abonnement - +
Date: Thu, 4 Apr 2024 14:42:06 +0200 Subject: [PATCH 7/9] :sparkles: renaming page in manage --- .../Components/DesignSystem/Header/Navigation/index.tsx | 6 +++--- .../Layouts/Subscription/SubscriptionFacturation/index.tsx | 2 +- src/front/Config/Module/development.json | 6 +++--- src/front/Config/Module/preprod.json | 6 +++--- src/front/Config/Module/production.json | 6 +++--- src/front/Config/Module/staging.json | 6 +++--- src/pages/subscription/{facturation => manage}/index.tsx | 0 7 files changed, 16 insertions(+), 16 deletions(-) rename src/pages/subscription/{facturation => manage}/index.tsx (100%) diff --git a/src/front/Components/DesignSystem/Header/Navigation/index.tsx b/src/front/Components/DesignSystem/Header/Navigation/index.tsx index d2a1764b..e7c05bdb 100644 --- a/src/front/Components/DesignSystem/Header/Navigation/index.tsx +++ b/src/front/Components/DesignSystem/Header/Navigation/index.tsx @@ -90,9 +90,9 @@ export default function Navigation() { />
); diff --git a/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx index 4c783266..aa437ef3 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx @@ -46,7 +46,7 @@ export default function SubscriptionFacturation() {
- Facturation + Abonnement
diff --git a/src/front/Config/Module/development.json b/src/front/Config/Module/development.json index 9c23ac7e..01977fca 100644 --- a/src/front/Config/Module/development.json +++ b/src/front/Config/Module/development.json @@ -285,11 +285,11 @@ "labelKey": "invite" } }, - "Facturation": { + "Manage": { "enabled": true, "props": { - "path": "/subscription/facturation", - "labelKey": "facturation" + "path": "/subscription/manage", + "labelKey": "manage" } }, "New": { diff --git a/src/front/Config/Module/preprod.json b/src/front/Config/Module/preprod.json index 9c23ac7e..01977fca 100644 --- a/src/front/Config/Module/preprod.json +++ b/src/front/Config/Module/preprod.json @@ -285,11 +285,11 @@ "labelKey": "invite" } }, - "Facturation": { + "Manage": { "enabled": true, "props": { - "path": "/subscription/facturation", - "labelKey": "facturation" + "path": "/subscription/manage", + "labelKey": "manage" } }, "New": { diff --git a/src/front/Config/Module/production.json b/src/front/Config/Module/production.json index 9c23ac7e..01977fca 100644 --- a/src/front/Config/Module/production.json +++ b/src/front/Config/Module/production.json @@ -285,11 +285,11 @@ "labelKey": "invite" } }, - "Facturation": { + "Manage": { "enabled": true, "props": { - "path": "/subscription/facturation", - "labelKey": "facturation" + "path": "/subscription/manage", + "labelKey": "manage" } }, "New": { diff --git a/src/front/Config/Module/staging.json b/src/front/Config/Module/staging.json index 9c23ac7e..01977fca 100644 --- a/src/front/Config/Module/staging.json +++ b/src/front/Config/Module/staging.json @@ -285,11 +285,11 @@ "labelKey": "invite" } }, - "Facturation": { + "Manage": { "enabled": true, "props": { - "path": "/subscription/facturation", - "labelKey": "facturation" + "path": "/subscription/manage", + "labelKey": "manage" } }, "New": { diff --git a/src/pages/subscription/facturation/index.tsx b/src/pages/subscription/manage/index.tsx similarity index 100% rename from src/pages/subscription/facturation/index.tsx rename to src/pages/subscription/manage/index.tsx From ae69cd167ecbbaefa7488e1d880dda17a26e6623 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 4 Apr 2024 14:52:26 +0200 Subject: [PATCH 8/9] :sparkles: modifications lolo --- .../DesignSystem/Header/Navigation/index.tsx | 12 ++++++++++-- .../Subscribe/SubscribeIllimity/index.tsx | 2 +- .../Subscribe/SubscribeStandard/index.tsx | 2 +- .../Layouts/Subscription/SubscriptionError/index.tsx | 2 +- .../Subscription/SubscriptionInvite/index.tsx | 9 +++++++-- .../Layouts/Subscription/SubscriptionNew/index.tsx | 2 +- .../Subscription/SubscriptionSuccess/index.tsx | 8 ++++++-- 7 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/front/Components/DesignSystem/Header/Navigation/index.tsx b/src/front/Components/DesignSystem/Header/Navigation/index.tsx index e7c05bdb..e07a45ab 100644 --- a/src/front/Components/DesignSystem/Header/Navigation/index.tsx +++ b/src/front/Components/DesignSystem/Header/Navigation/index.tsx @@ -90,9 +90,17 @@ export default function Navigation() { />
); diff --git a/src/front/Components/Layouts/Subscription/Subscribe/SubscribeIllimity/index.tsx b/src/front/Components/Layouts/Subscription/Subscribe/SubscribeIllimity/index.tsx index 8ca0c65b..f2c88eda 100644 --- a/src/front/Components/Layouts/Subscription/Subscribe/SubscribeIllimity/index.tsx +++ b/src/front/Components/Layouts/Subscription/Subscribe/SubscribeIllimity/index.tsx @@ -31,7 +31,7 @@ export default function SubscribeIllimity() { return ( <> - +
- +
+
diff --git a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx index b36bd706..a655d6ab 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx @@ -77,17 +77,22 @@ export default function SubscriptionInvite() { }; return ( - +
Inviter vos collaborateurs - {nbOfCollaborators && ( + {!isNaN(nbOfCollaborators) && ( {nbOfCollaborators} collaborateurs à inviter )} + {isNaN(nbOfCollaborators) && ( + + Collaborateurs illimités + + )} {lines.map((line, index) => (
diff --git a/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx index dd780c11..5a98f987 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx @@ -8,7 +8,7 @@ import Link from "next/link"; export default function SubscriptionNew() { return ( - +
diff --git a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx index 9516b3de..2000e70c 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx @@ -5,10 +5,12 @@ import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Ty import MessageBox from "@Front/Components/Elements/MessageBox"; import SubscriptionClientInfos from "../SubscriptionClientInfos"; import Button from "@Front/Components/DesignSystem/Button"; +import Link from "next/link"; +import Module from "@Front/Config/Module"; export default function SubscriptionSuccess() { return ( - +
@@ -29,7 +31,9 @@ export default function SubscriptionSuccess() {
- + + +
From c6c9678b370d9d32740694842e085050430497ae Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 4 Apr 2024 15:12:30 +0200 Subject: [PATCH 9/9] :sparkles: Manage collaborators mocked --- .../LayoutTemplates/DefaultTemplate/index.tsx | 12 ++- .../Subscribe/SubscribeIllimity/index.tsx | 2 +- .../Subscribe/SubscribeStandard/index.tsx | 2 +- .../classes.module.scss | 7 ++ .../SubscriptionFacturation/index.tsx | 20 +++- .../Subscription/SubscriptionInvite/index.tsx | 2 +- .../classes.module.scss | 30 ++++++ .../SubscriptionManageCollaborators/index.tsx | 95 +++++++++++++++++++ .../Subscription/SubscriptionNew/index.tsx | 2 +- src/front/Config/Module/development.json | 7 ++ src/front/Config/Module/preprod.json | 7 ++ src/front/Config/Module/production.json | 7 ++ src/front/Config/Module/staging.json | 7 ++ .../manage-collaborators/index.tsx | 5 + 14 files changed, 195 insertions(+), 10 deletions(-) create mode 100644 src/front/Components/Layouts/Subscription/SubscriptionManageCollaborators/classes.module.scss create mode 100644 src/front/Components/Layouts/Subscription/SubscriptionManageCollaborators/index.tsx create mode 100644 src/pages/subscription/manage-collaborators/index.tsx diff --git a/src/front/Components/LayoutTemplates/DefaultTemplate/index.tsx b/src/front/Components/LayoutTemplates/DefaultTemplate/index.tsx index 938ebea7..487ec305 100644 --- a/src/front/Components/LayoutTemplates/DefaultTemplate/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultTemplate/index.tsx @@ -4,6 +4,7 @@ import classNames from "classnames"; import React, { ReactNode } from "react"; import classes from "./classes.module.scss"; +import BackArrow from "@Front/Components/Elements/BackArrow"; type IProps = { title: string; @@ -14,6 +15,8 @@ type IProps = { scrollTop: number | null; isPadding?: boolean; hasHeaderLinks: boolean; + hasBackArrow?: boolean; + backArrowUrl?: string; }; type IState = {}; @@ -28,7 +31,14 @@ export default class DefaultTemplate extends React.Component { return ( <>
-
{this.props.children}
+
+ {this.props.hasBackArrow && ( +
+ +
+ )} + {this.props.children} +
); diff --git a/src/front/Components/Layouts/Subscription/Subscribe/SubscribeIllimity/index.tsx b/src/front/Components/Layouts/Subscription/Subscribe/SubscribeIllimity/index.tsx index f2c88eda..7d3a0ac1 100644 --- a/src/front/Components/Layouts/Subscription/Subscribe/SubscribeIllimity/index.tsx +++ b/src/front/Components/Layouts/Subscription/Subscribe/SubscribeIllimity/index.tsx @@ -31,7 +31,7 @@ export default function SubscribeIllimity() { return ( <> - +
- +
{ - console.log("handleSubmitPayment"); - try { const jwt = JwtService.getInstance().decodeJwt(); const subscription = await Subscriptions.getInstance().get({ officeId: jwt?.office_Id }); @@ -97,9 +95,21 @@ export default function SubscriptionFacturation() { )} {forfeitType === EForfeitType.standard && ( - + <> + + + + + + + )}
diff --git a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx index a655d6ab..82dbcccb 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx @@ -77,7 +77,7 @@ export default function SubscriptionInvite() { }; return ( - +
diff --git a/src/front/Components/Layouts/Subscription/SubscriptionManageCollaborators/classes.module.scss b/src/front/Components/Layouts/Subscription/SubscriptionManageCollaborators/classes.module.scss new file mode 100644 index 00000000..2bbbf9df --- /dev/null +++ b/src/front/Components/Layouts/Subscription/SubscriptionManageCollaborators/classes.module.scss @@ -0,0 +1,30 @@ +@import "@Themes/constants.scss"; + +.root { + margin-top: 32px; + display: flex; + flex-direction: column; + gap: 16px; + + form { + display: flex; + flex-direction: column; + gap: 16px; + .collaborators-container { + display: flex; + flex-direction: column; + gap: 32px; + margin-top: 24px; + } + + .buttons-container { + display: flex; + gap: 32px; + max-width: 400px; + @media (max-width: $screen-s) { + flex-direction: column; + gap: 16px; + } + } + } +} diff --git a/src/front/Components/Layouts/Subscription/SubscriptionManageCollaborators/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionManageCollaborators/index.tsx new file mode 100644 index 00000000..a08cfe7a --- /dev/null +++ b/src/front/Components/Layouts/Subscription/SubscriptionManageCollaborators/index.tsx @@ -0,0 +1,95 @@ +import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; +import classes from "./classes.module.scss"; +import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; +import Form from "@Front/Components/DesignSystem/Form"; +import CheckBox from "@Front/Components/DesignSystem/CheckBox"; +import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button"; + +export default function SubscriptionManageCollaborators() { + return ( + +
+ + Choisissez les collaborateurs pour votre abonnement + + + 7 sièges disponibles + + +
+ + + + + + + + +
+ + 7 collaborateurs sélectionnés + +
+ + +
+ +
+
+ ); +} diff --git a/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx index 5a98f987..accd6b67 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx @@ -8,7 +8,7 @@ import Link from "next/link"; export default function SubscriptionNew() { return ( - +
diff --git a/src/front/Config/Module/development.json b/src/front/Config/Module/development.json index 01977fca..a7b23134 100644 --- a/src/front/Config/Module/development.json +++ b/src/front/Config/Module/development.json @@ -285,6 +285,13 @@ "labelKey": "invite" } }, + "ManageCollaborators": { + "enabled": true, + "props": { + "path": "/subscription/manage-collaborators", + "labelKey": "manage_collaborators" + } + }, "Manage": { "enabled": true, "props": { diff --git a/src/front/Config/Module/preprod.json b/src/front/Config/Module/preprod.json index 01977fca..a7b23134 100644 --- a/src/front/Config/Module/preprod.json +++ b/src/front/Config/Module/preprod.json @@ -285,6 +285,13 @@ "labelKey": "invite" } }, + "ManageCollaborators": { + "enabled": true, + "props": { + "path": "/subscription/manage-collaborators", + "labelKey": "manage_collaborators" + } + }, "Manage": { "enabled": true, "props": { diff --git a/src/front/Config/Module/production.json b/src/front/Config/Module/production.json index 01977fca..a7b23134 100644 --- a/src/front/Config/Module/production.json +++ b/src/front/Config/Module/production.json @@ -285,6 +285,13 @@ "labelKey": "invite" } }, + "ManageCollaborators": { + "enabled": true, + "props": { + "path": "/subscription/manage-collaborators", + "labelKey": "manage_collaborators" + } + }, "Manage": { "enabled": true, "props": { diff --git a/src/front/Config/Module/staging.json b/src/front/Config/Module/staging.json index 01977fca..a7b23134 100644 --- a/src/front/Config/Module/staging.json +++ b/src/front/Config/Module/staging.json @@ -285,6 +285,13 @@ "labelKey": "invite" } }, + "ManageCollaborators": { + "enabled": true, + "props": { + "path": "/subscription/manage-collaborators", + "labelKey": "manage_collaborators" + } + }, "Manage": { "enabled": true, "props": { diff --git a/src/pages/subscription/manage-collaborators/index.tsx b/src/pages/subscription/manage-collaborators/index.tsx new file mode 100644 index 00000000..d5d03817 --- /dev/null +++ b/src/pages/subscription/manage-collaborators/index.tsx @@ -0,0 +1,5 @@ +import SubscriptionManageCollaborators from "@Front/Components/Layouts/Subscription/SubscriptionManageCollaborators"; + +export default function Route() { + return ; +}