chore: folder structure updates

This commit is contained in:
guru_sainath 2024-05-23 15:37:25 +05:30
parent 67b9d4a8f2
commit d6325320e9
31 changed files with 300 additions and 84 deletions

View File

@ -5,7 +5,7 @@ import { IEstimate } from "@plane/types";
// store hooks // store hooks
import { Button, Loader, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, Loader, TOAST_TYPE, setToast } from "@plane/ui";
import { EmptyState } from "@/components/empty-state"; import { EmptyState } from "@/components/empty-state";
import { CreateUpdateEstimateModal, DeleteEstimateModal, EstimateListItem } from "@/components/estimates"; import { CreateUpdateEstimateModal, DeleteEstimateModal, EstimateListItem } from "@/components/estimates-legacy";
import { EmptyStateType } from "@/constants/empty-state"; import { EmptyStateType } from "@/constants/empty-state";
import { orderArrayBy } from "@/helpers/array.helper"; import { orderArrayBy } from "@/helpers/array.helper";
import { useEstimate, useProject } from "@/hooks/store"; import { useEstimate, useProject } from "@/hooks/store";

View File

@ -0,0 +1,4 @@
export * from "./create-update-estimate-modal";
export * from "./delete-estimate-modal";
export * from "./estimate-list-item";
export * from "./estimates-list";

View File

@ -6,12 +6,11 @@ import { IEstimate } from "@plane/types";
import { Button } from "@plane/ui"; import { Button } from "@plane/ui";
// components // components
import { EModalPosition, EModalWidth, ModalCore } from "@/components/core"; import { EModalPosition, EModalWidth, ModalCore } from "@/components/core";
import { EstimateCreateStageOne, EstimateCreateStageTwo } from "@/components/estimates";
import { TEstimateSystemKeys, EEstimateSystem, TEstimateSystemKeyObject } from "@/components/estimates/types";
// constants // constants
import { ESTIMATE_SYSTEMS } from "@/constants/estimates"; import { ESTIMATE_SYSTEMS } from "@/constants/estimates";
// ee components // ee components
import { EstimateCreateStageOne, EstimateCreateStageTwo } from "@/ee/components/estimates";
// types
import { TEstimateSystemKeys, EEstimateSystem, TEstimateSystemKeyObject } from "@/ee/components/estimates/types";
type Props = { type Props = {
isOpen: boolean; isOpen: boolean;

View File

@ -4,7 +4,7 @@ import { RadioInput } from "@/components/radio-group";
// constants // constants
import { ESTIMATE_SYSTEMS } from "@/constants/estimates"; import { ESTIMATE_SYSTEMS } from "@/constants/estimates";
// types // types
import { TEstimateSystemKeys } from "@/ee/components/estimates/types"; import { TEstimateSystemKeys } from "@/components/estimates/types";
type TEstimateCreateStageOne = { type TEstimateCreateStageOne = {
estimateSystem: TEstimateSystemKeys; estimateSystem: TEstimateSystemKeys;

View File

@ -2,18 +2,17 @@ import { FC } from "react";
import { Plus } from "lucide-react"; import { Plus } from "lucide-react";
import { Button } from "@plane/ui"; import { Button } from "@plane/ui";
// components // components
import { Sortable } from "@/components/sortable/sortable"; import { EstimateItem } from "@/components/estimates";
// constants
import { ESTIMATE_SYSTEMS } from "@/constants/estimates";
import { EstimateItem } from "@/ee/components/estimates";
// types
import { import {
EEstimateSystem, EEstimateSystem,
TEstimatePointNumeric, TEstimatePointNumeric,
TEstimatePointString, TEstimatePointString,
TEstimateSystemKeyObject, TEstimateSystemKeyObject,
TEstimateSystemKeys, TEstimateSystemKeys,
} from "@/ee/components/estimates/types"; } from "@/components/estimates/types";
import { Sortable } from "@/components/sortable/sortable";
// constants
import { ESTIMATE_SYSTEMS } from "@/constants/estimates";
type TEstimateCreateStageTwo = { type TEstimateCreateStageTwo = {
estimateSystem: EEstimateSystem; estimateSystem: EEstimateSystem;

View File

@ -0,0 +1,39 @@
import { FC } from "react";
import Image from "next/image";
import { useTheme } from "next-themes";
import { Button } from "@plane/ui";
type TEstimateEmptyScreen = {
onButtonClick: () => void;
};
export const EstimateEmptyScreen: FC<TEstimateEmptyScreen> = (props) => {
// props
const { onButtonClick } = props;
const { resolvedTheme } = useTheme();
const emptyScreenImage = `/empty-state/project-settings/estimates-${
resolvedTheme === "light" ? "light" : "dark"
}.webp`;
return (
<div className="relative flex flex-col justify-center items-center text-center gap-8 border border-custom-border-300 rounded bg-custom-background-90 py-20">
<div className="flex-shrink-0 w-[120px] h-[120px] overflow-hidden relative flex justify-center items-center">
<Image
src={emptyScreenImage}
alt="Empty estimate image"
width={100}
height={100}
className="object-contain w-full h-full"
/>
</div>
<div className="space-y-2">
<h3 className="text-xl font-medium text-custom-text-100">No estimate systems yet</h3>
<p className="text-base text-custom-text-300">Explain estimates system here</p>
</div>
<div>
<Button onClick={onButtonClick}>Add Estimate System</Button>
</div>
</div>
);
};

View File

@ -1,4 +1,12 @@
export * from "./create-update-estimate-modal"; export * from "./root";
export * from "./delete-estimate-modal"; export * from "./empty-screen";
export * from "./estimate-list-item"; export * from "./estimate-search";
export * from "./estimates-list"; export * from "./estimate-disable";
export * from "./estimate-item";
// estimate create
export * from "./create";
// estimate update
// estimate delete

View File

@ -4,11 +4,11 @@ import { IEstimate } from "@plane/types";
import { Button, Loader, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, Loader, TOAST_TYPE, setToast } from "@plane/ui";
// components // components
import { EmptyState } from "@/components/empty-state"; import { EmptyState } from "@/components/empty-state";
import { DeleteEstimateModal, EstimateListItem } from "@/components/estimates"; import { CreateEstimateModal, EstimateEmptyScreen } from "@/components/estimates";
import { DeleteEstimateModal, EstimateListItem } from "@/components/estimates-legacy";
// constants // constants
import { EmptyStateType } from "@/constants/empty-state"; import { EmptyStateType } from "@/constants/empty-state";
// ee components // ee components
import { CreateEstimateModal } from "@/ee/components/estimates";
// hooks // hooks
import { useProject, useProjectEstimates } from "@/hooks/store"; import { useProject, useProjectEstimates } from "@/hooks/store";
@ -23,13 +23,16 @@ export const EstimateRoot: FC<TEstimateRoot> = (props) => {
const { updateProject, currentProjectDetails } = useProject(); const { updateProject, currentProjectDetails } = useProject();
const { loader, projectEstimateIds, estimateById, getAllEstimates } = useProjectEstimates(projectId); const { loader, projectEstimateIds, estimateById, getAllEstimates } = useProjectEstimates(projectId);
// states // states
const [isEstimateCreateModalOpen, setIsEstimateCreateModalOpen] = useState(true); const [isEstimateCreateModalOpen, setIsEstimateCreateModalOpen] = useState(false);
const [isEstimateDeleteModalOpen, setIsEstimateDeleteModalOpen] = useState<string | null>(null); const [isEstimateDeleteModalOpen, setIsEstimateDeleteModalOpen] = useState<string | null>(null);
const [estimateToUpdate, setEstimateToUpdate] = useState<IEstimate | undefined>(); const [estimateToUpdate, setEstimateToUpdate] = useState<IEstimate | undefined>();
console.log("workspaceSlug", workspaceSlug);
console.log("projectId", projectId);
const { isLoading: isSWRLoading } = useSWR( const { isLoading: isSWRLoading } = useSWR(
workspaceSlug && projectId ? `PROJECT_ESTIMATES_${workspaceSlug}_${projectId}` : null, workspaceSlug && projectId ? `PROJECT_ESTIMATES_${workspaceSlug}_${projectId}` : null,
workspaceSlug && projectId ? () => getAllEstimates() : null async () => workspaceSlug && projectId && getAllEstimates()
); );
const editEstimate = (estimate: IEstimate) => { const editEstimate = (estimate: IEstimate) => {
@ -57,32 +60,9 @@ export const EstimateRoot: FC<TEstimateRoot> = (props) => {
}); });
}; };
if (!workspaceSlug || !projectId) return <></>;
return ( return (
<div> <div>
{/* modals */} <EstimateEmptyScreen onButtonClick={() => {}} />
{/* create modal */}
<CreateEstimateModal
isOpen={isEstimateCreateModalOpen}
data={estimateToUpdate}
handleClose={() => {
setIsEstimateCreateModalOpen(false);
setEstimateToUpdate(undefined);
}}
/>
{/* edit modal */}
{/* delete modal */}
<DeleteEstimateModal
isOpen={!!isEstimateDeleteModalOpen}
handleClose={() => setIsEstimateDeleteModalOpen(null)}
data={
null
// getProjectEstimateById(isEstimateDeleteModalOpen!)
}
/>
{/* handling the estimates list */}
{loader === "init-loader" || isSWRLoading ? ( {loader === "init-loader" || isSWRLoading ? (
<Loader className="mt-5 space-y-5"> <Loader className="mt-5 space-y-5">
<Loader.Item height="40px" /> <Loader.Item height="40px" />
@ -140,6 +120,23 @@ export const EstimateRoot: FC<TEstimateRoot> = (props) => {
)} )}
</> </>
)} )}
<CreateEstimateModal
isOpen={isEstimateCreateModalOpen}
data={estimateToUpdate}
handleClose={() => {
setIsEstimateCreateModalOpen(false);
setEstimateToUpdate(undefined);
}}
/>
<DeleteEstimateModal
isOpen={!!isEstimateDeleteModalOpen}
handleClose={() => setIsEstimateDeleteModalOpen(null)}
data={
null
// getProjectEstimateById(isEstimateDeleteModalOpen!)
}
/>
</div> </div>
); );
}; };

View File

@ -5,7 +5,7 @@ import { Button } from "@plane/ui";
// components // components
import { EModalPosition, EModalWidth, ModalCore } from "@/components/core"; import { EModalPosition, EModalWidth, ModalCore } from "@/components/core";
// types // types
import { TEstimateSystemKeys, TEstimateSystemKeyObject } from "@/ee/components/estimates/types"; import { TEstimateSystemKeys, TEstimateSystemKeyObject } from "@/components/estimates/types";
type Props = { type Props = {
isOpen: boolean; isOpen: boolean;

View File

@ -37,8 +37,6 @@ const RadioInput = ({
aria = "radio-input"; aria = "radio-input";
} }
// return <h1>Hello</h1>;
return ( return (
<RadioGroup value={selected} onChange={setSelected} aria-label={aria} className={className}> <RadioGroup value={selected} onChange={setSelected} aria-label={aria} className={className}>
<Label className={cn(`mb-2`, inputLabelClassName)}>{inputLabel}</Label> <Label className={cn(`mb-2`, inputLabelClassName)}>{inputLabel}</Label>

View File

@ -1,4 +1,4 @@
import { TEstimateSystems } from "@/ee/components/estimates/types"; import { TEstimateSystems } from "@/components/estimates/types";
export const ESTIMATE_SYSTEMS: TEstimateSystems = { export const ESTIMATE_SYSTEMS: TEstimateSystems = {
points: { points: {

View File

@ -1,11 +0,0 @@
export * from "./root";
export * from "./estimate-search";
export * from "./estimate-disable";
export * from "./estimate-item";
// estimate create
export * from "./create";
// estimate update
// estimate delete

View File

@ -16,7 +16,7 @@
"@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^1.3.0", "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^1.3.0",
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3", "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3",
"@blueprintjs/popover2": "^1.13.3", "@blueprintjs/popover2": "^1.13.3",
"@headlessui/react": "^1.7.3", "@headlessui/react": "^2.0.3",
"@hello-pangea/dnd": "^16.3.0", "@hello-pangea/dnd": "^16.3.0",
"@nivo/bar": "0.80.0", "@nivo/bar": "0.80.0",
"@nivo/calendar": "0.80.0", "@nivo/calendar": "0.80.0",
@ -83,4 +83,4 @@
"tsconfig": "*", "tsconfig": "*",
"typescript": "4.7.4" "typescript": "4.7.4"
} }
} }

View File

@ -1,33 +1,38 @@
import { ReactElement } from "react"; import { ReactElement } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
// hooks import { useRouter } from "next/router";
// components
import { PageHead } from "@/components/core"; import { PageHead } from "@/components/core";
import { EstimatesList } from "@/components/estimates"; import { EstimateRoot } from "@/components/estimates";
import { ProjectSettingHeader } from "@/components/headers"; import { ProjectSettingHeader } from "@/components/headers";
// constants
import { EUserProjectRoles } from "@/constants/project"; import { EUserProjectRoles } from "@/constants/project";
// hooks
import { useUser, useProject } from "@/hooks/store"; import { useUser, useProject } from "@/hooks/store";
// layouts // layouts
import { AppLayout } from "@/layouts/app-layout"; import { AppLayout } from "@/layouts/app-layout";
import { ProjectSettingLayout } from "@/layouts/settings-layout"; import { ProjectSettingLayout } from "@/layouts/settings-layout";
// components
// types // types
import { NextPageWithLayout } from "@/lib/types"; import { NextPageWithLayout } from "@/lib/types";
// constants
const EstimatesSettingsPage: NextPageWithLayout = observer(() => { const EstimatesSettingsPage: NextPageWithLayout = observer(() => {
const router = useRouter();
const { workspaceSlug, projectId } = router.query;
const { const {
membership: { currentProjectRole }, membership: { currentProjectRole },
} = useUser(); } = useUser();
const { currentProjectDetails } = useProject(); const { currentProjectDetails } = useProject();
// derived values // derived values
const isAdmin = currentProjectRole === EUserProjectRoles.ADMIN; const isAdmin = currentProjectRole === EUserProjectRoles.ADMIN;
const pageTitle = currentProjectDetails?.name ? `${currentProjectDetails?.name} - Estimates` : undefined; const pageTitle = currentProjectDetails?.name ? `${currentProjectDetails?.name} - Estimates` : undefined;
if (!workspaceSlug || !projectId) return <></>;
return ( return (
<> <>
<PageHead title={pageTitle} /> <PageHead title={pageTitle} />
<div className={`w-full overflow-y-auto py-8 pr-9 ${isAdmin ? "" : "pointer-events-none opacity-60"}`}> <div className={`w-full overflow-y-auto py-8 pr-9 ${isAdmin ? "" : "pointer-events-none opacity-60"}`}>
<EstimatesList /> <EstimateRoot workspaceSlug={workspaceSlug?.toString()} projectId={projectId?.toString()} />
</div> </div>
</> </>
); );

View File

@ -0,0 +1,79 @@
// types
import { IEstimate } from "@plane/types";
// helpers
import { API_BASE_URL } from "@/helpers/common.helper";
// services
import { APIService } from "@/services/api.service";
export class EstimateService extends APIService {
constructor() {
super(API_BASE_URL);
}
// fetching the estimates in workspace level
async fetchWorkspacesList(workspaceSlug: string): Promise<IEstimate[] | undefined> {
try {
const { data } = await this.get(`/api/workspaces/${workspaceSlug}/estimates/`);
return data || undefined;
} catch (error) {
throw error;
}
}
async fetchAll(workspaceSlug: string, projectId: string): Promise<IEstimate[] | undefined> {
try {
const { data } = await this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/estimates/`);
return data || undefined;
} catch (error) {
throw error;
}
}
async fetchById(workspaceSlug: string, projectId: string, estimateId: string): Promise<IEstimate | undefined> {
try {
const { data } = await this.get(
`/api/workspaces/${workspaceSlug}/projects/${projectId}/estimates/${estimateId}/`
);
return data || undefined;
} catch (error) {
throw error;
}
}
async create(workspaceSlug: string, projectId: string, payload: Partial<IEstimate>): Promise<IEstimate | undefined> {
try {
const { data } = await this.post(`/api/workspaces/${workspaceSlug}/projects/${projectId}/estimates/`, payload);
return data || undefined;
} catch (error) {
throw error;
}
}
async update(
workspaceSlug: string,
projectId: string,
estimateId: string,
payload: Partial<IEstimate>
): Promise<IEstimate | undefined> {
try {
const { data } = await this.patch(
`/api/workspaces/${workspaceSlug}/projects/${projectId}/estimates/${estimateId}/`,
payload
);
return data || undefined;
} catch (error) {
throw error;
}
}
async remove(workspaceSlug: string, projectId: string, estimateId: string): Promise<void> {
try {
const { data } = await this.delete(
`/api/workspaces/${workspaceSlug}/projects/${projectId}/estimates/${estimateId}/`
);
return data || undefined;
} catch (error) {
throw error;
}
}
}

View File

@ -1,5 +1,6 @@
export * from "./project.service"; export * from "./project.service";
export * from "./project-estimate.service"; export * from "./project-estimate.service";
export * from "./estimate.service";
export * from "./project-export.service"; export * from "./project-export.service";
export * from "./project-member.service"; export * from "./project-member.service";
export * from "./project-state.service"; export * from "./project-state.service";

View File

@ -25,6 +25,7 @@ export interface IProjectEstimateStore {
projectEstimateIds: string[] | undefined; projectEstimateIds: string[] | undefined;
estimateById: (estimateId: string) => IEstimate | undefined; estimateById: (estimateId: string) => IEstimate | undefined;
// actions // actions
getWorkspaceAllEstimates: () => Promise<IEstimateType[] | undefined>;
getAllEstimates: () => Promise<IEstimateType[] | undefined>; getAllEstimates: () => Promise<IEstimateType[] | undefined>;
getEstimateById: (estimateId: string) => Promise<IEstimateType | undefined>; getEstimateById: (estimateId: string) => Promise<IEstimateType | undefined>;
createEstimate: (data: Partial<IEstimateType>) => Promise<IEstimateType | undefined>; createEstimate: (data: Partial<IEstimateType>) => Promise<IEstimateType | undefined>;
@ -48,6 +49,7 @@ export class ProjectEstimateStore implements IProjectEstimateStore {
// computed // computed
projectEstimateIds: computed, projectEstimateIds: computed,
// actions // actions
getWorkspaceAllEstimates: action,
getAllEstimates: action, getAllEstimates: action,
getEstimateById: action, getEstimateById: action,
createEstimate: action, createEstimate: action,
@ -79,7 +81,7 @@ export class ProjectEstimateStore implements IProjectEstimateStore {
* @description fetch all estimates for a project * @description fetch all estimates for a project
* @returns { IEstimateType[] | undefined } * @returns { IEstimateType[] | undefined }
*/ */
async getWorkspaceAllEstimates(): Promise<IEstimateType[] | undefined> { getWorkspaceAllEstimates = async (): Promise<IEstimateType[] | undefined> => {
try { try {
const { workspaceSlug } = this.store.router; const { workspaceSlug } = this.store.router;
if (!workspaceSlug) return; if (!workspaceSlug) return;
@ -99,9 +101,9 @@ export class ProjectEstimateStore implements IProjectEstimateStore {
message: "Error fetching estimates", message: "Error fetching estimates",
}; };
} }
} };
async getAllEstimates(): Promise<IEstimateType[] | undefined> { getAllEstimates = async (): Promise<IEstimateType[] | undefined> => {
try { try {
const { workspaceSlug, projectId } = this.store.router; const { workspaceSlug, projectId } = this.store.router;
if (!workspaceSlug || !projectId) return; if (!workspaceSlug || !projectId) return;
@ -121,14 +123,14 @@ export class ProjectEstimateStore implements IProjectEstimateStore {
message: "Error fetching estimates", message: "Error fetching estimates",
}; };
} }
} };
/** /**
* @description update an estimate for a project * @description update an estimate for a project
* @param { string } estimateId * @param { string } estimateId
* @returns IEstimateType | undefined * @returns IEstimateType | undefined
*/ */
async getEstimateById(estimateId: string): Promise<IEstimateType | undefined> { getEstimateById = async (estimateId: string): Promise<IEstimateType | undefined> => {
try { try {
const { workspaceSlug, projectId } = this.store.router; const { workspaceSlug, projectId } = this.store.router;
if (!workspaceSlug || !projectId) return; if (!workspaceSlug || !projectId) return;
@ -149,14 +151,14 @@ export class ProjectEstimateStore implements IProjectEstimateStore {
message: "Error fetching estimate by id", message: "Error fetching estimate by id",
}; };
} }
} };
/** /**
* @description create an estimate for a project * @description create an estimate for a project
* @param { Partial<IEstimateType> } data * @param { Partial<IEstimateType> } data
* @returns * @returns
*/ */
async createEstimate(data: Partial<IEstimateType>): Promise<IEstimateType | undefined> { createEstimate = async (data: Partial<IEstimateType>): Promise<IEstimateType | undefined> => {
try { try {
const { workspaceSlug, projectId } = this.store.router; const { workspaceSlug, projectId } = this.store.router;
if (!workspaceSlug || !projectId) return; if (!workspaceSlug || !projectId) return;
@ -174,14 +176,14 @@ export class ProjectEstimateStore implements IProjectEstimateStore {
message: "Error creating estimate", message: "Error creating estimate",
}; };
} }
} };
/** /**
* @description delete an estimate for a project * @description delete an estimate for a project
* @param { string } estimateId * @param { string } estimateId
* @returns void * @returns void
*/ */
async deleteEstimate(estimateId: string): Promise<void> { deleteEstimate = async (estimateId: string): Promise<void> => {
try { try {
const { workspaceSlug, projectId } = this.store.router; const { workspaceSlug, projectId } = this.store.router;
if (!workspaceSlug || !projectId) return; if (!workspaceSlug || !projectId) return;
@ -196,5 +198,5 @@ export class ProjectEstimateStore implements IProjectEstimateStore {
message: "Error deleting estimate", message: "Error deleting estimate",
}; };
} }
} };
} }

114
yarn.lock
View File

@ -1579,7 +1579,7 @@
dependencies: dependencies:
"@floating-ui/dom" "^1.0.0" "@floating-ui/dom" "^1.0.0"
"@floating-ui/react@^0.26.4": "@floating-ui/react@^0.26.13", "@floating-ui/react@^0.26.4":
version "0.26.16" version "0.26.16"
resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.16.tgz#3415a087f452165161c2d313d1d57e8142894679" resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.16.tgz#3415a087f452165161c2d313d1d57e8142894679"
integrity sha512-HEf43zxZNAI/E781QIVpYSF3K2VH4TTYZpqecjdsFkjsaU1EbaWcM++kw0HXFffj7gDUcBFevX8s0rQGQpxkow== integrity sha512-HEf43zxZNAI/E781QIVpYSF3K2VH4TTYZpqecjdsFkjsaU1EbaWcM++kw0HXFffj7gDUcBFevX8s0rQGQpxkow==
@ -1593,7 +1593,7 @@
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.2.tgz#d8bae93ac8b815b2bd7a98078cf91e2724ef11e5" resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.2.tgz#d8bae93ac8b815b2bd7a98078cf91e2724ef11e5"
integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==
"@headlessui/react@^1.7.13", "@headlessui/react@^1.7.17", "@headlessui/react@^1.7.19", "@headlessui/react@^1.7.3": "@headlessui/react@^1.7.13", "@headlessui/react@^1.7.17", "@headlessui/react@^1.7.19":
version "1.7.19" version "1.7.19"
resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.19.tgz#91c78cf5fcb254f4a0ebe96936d48421caf75f40" resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.19.tgz#91c78cf5fcb254f4a0ebe96936d48421caf75f40"
integrity sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw== integrity sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==
@ -1601,6 +1601,16 @@
"@tanstack/react-virtual" "^3.0.0-beta.60" "@tanstack/react-virtual" "^3.0.0-beta.60"
client-only "^0.0.1" client-only "^0.0.1"
"@headlessui/react@^2.0.3":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.0.3.tgz#7506d808a6f3abc307f35354d34b8d642ecfd692"
integrity sha512-Xd1h0YZgfhxZ7W1w4TvK0/TZ1c4qaX4liYVUkAXqW1HCLcXSqnMeYAUGJS/BBroBAUL9HErjyFcRpCWRQZ/0lA==
dependencies:
"@floating-ui/react" "^0.26.13"
"@react-aria/focus" "^3.16.2"
"@react-aria/interactions" "^3.21.1"
"@tanstack/react-virtual" "3.5.0"
"@hello-pangea/dnd@^16.3.0": "@hello-pangea/dnd@^16.3.0":
version "16.6.0" version "16.6.0"
resolved "https://registry.yarnpkg.com/@hello-pangea/dnd/-/dnd-16.6.0.tgz#7509639c7bd13f55e537b65a9dcfcd54e7c99ac7" resolved "https://registry.yarnpkg.com/@hello-pangea/dnd/-/dnd-16.6.0.tgz#7509639c7bd13f55e537b65a9dcfcd54e7c99ac7"
@ -2207,6 +2217,45 @@
dependencies: dependencies:
"@babel/runtime" "^7.13.10" "@babel/runtime" "^7.13.10"
"@react-aria/focus@^3.16.2":
version "3.17.1"
resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.17.1.tgz#c796a188120421e2fedf438cadacdf463c77ad29"
integrity sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==
dependencies:
"@react-aria/interactions" "^3.21.3"
"@react-aria/utils" "^3.24.1"
"@react-types/shared" "^3.23.1"
"@swc/helpers" "^0.5.0"
clsx "^2.0.0"
"@react-aria/interactions@^3.21.1", "@react-aria/interactions@^3.21.3":
version "3.21.3"
resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.21.3.tgz#a2a3e354a8b894bed7a46e1143453f397f2538d7"
integrity sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==
dependencies:
"@react-aria/ssr" "^3.9.4"
"@react-aria/utils" "^3.24.1"
"@react-types/shared" "^3.23.1"
"@swc/helpers" "^0.5.0"
"@react-aria/ssr@^3.9.4":
version "3.9.4"
resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.4.tgz#9da8b10342c156e816dbfa4c9e713b21f274d7ab"
integrity sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==
dependencies:
"@swc/helpers" "^0.5.0"
"@react-aria/utils@^3.24.1":
version "3.24.1"
resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.24.1.tgz#9d16023f07c23c41793c9030a9bd203a9c8cf0a7"
integrity sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==
dependencies:
"@react-aria/ssr" "^3.9.4"
"@react-stately/utils" "^3.10.1"
"@react-types/shared" "^3.23.1"
"@swc/helpers" "^0.5.0"
clsx "^2.0.0"
"@react-spring/animated@~9.4.5": "@react-spring/animated@~9.4.5":
version "9.4.5" version "9.4.5"
resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.4.5.tgz#dd9921c716a4f4a3ed29491e0c0c9f8ca0eb1a54" resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.4.5.tgz#dd9921c716a4f4a3ed29491e0c0c9f8ca0eb1a54"
@ -2253,6 +2302,18 @@
"@react-spring/shared" "~9.4.5" "@react-spring/shared" "~9.4.5"
"@react-spring/types" "~9.4.5" "@react-spring/types" "~9.4.5"
"@react-stately/utils@^3.10.1":
version "3.10.1"
resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.1.tgz#dc8685b4994bef0dc10c37b024074be8afbfba62"
integrity sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==
dependencies:
"@swc/helpers" "^0.5.0"
"@react-types/shared@^3.23.1":
version "3.23.1"
resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.23.1.tgz#2f23c81d819d0ef376df3cd4c944be4d6bce84c3"
integrity sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==
"@remirror/core-constants@^2.0.2": "@remirror/core-constants@^2.0.2":
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-2.0.2.tgz#f05eccdc69e3a65e7d524b52548f567904a11a1a" resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-2.0.2.tgz#f05eccdc69e3a65e7d524b52548f567904a11a1a"
@ -3390,6 +3451,13 @@
"@swc/counter" "^0.1.3" "@swc/counter" "^0.1.3"
tslib "^2.4.0" tslib "^2.4.0"
"@swc/helpers@^0.5.0":
version "0.5.11"
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.11.tgz#5bab8c660a6e23c13b2d23fcd1ee44a2db1b0cb7"
integrity sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==
dependencies:
tslib "^2.4.0"
"@swc/types@0.1.7": "@swc/types@0.1.7":
version "0.1.7" version "0.1.7"
resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.7.tgz#ea5d658cf460abff51507ca8d26e2d391bafb15e" resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.7.tgz#ea5d658cf460abff51507ca8d26e2d391bafb15e"
@ -3407,7 +3475,7 @@
lodash.merge "^4.6.2" lodash.merge "^4.6.2"
postcss-selector-parser "6.0.10" postcss-selector-parser "6.0.10"
"@tanstack/react-virtual@^3.0.0-beta.60": "@tanstack/react-virtual@3.5.0", "@tanstack/react-virtual@^3.0.0-beta.60":
version "3.5.0" version "3.5.0"
resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.5.0.tgz#873b5b77cf78af563a4a11e6251ed51ee8868132" resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.5.0.tgz#873b5b77cf78af563a4a11e6251ed51ee8868132"
integrity sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw== integrity sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==
@ -10177,7 +10245,7 @@ prelude-ls@^1.2.1:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
"prettier-fallback@npm:prettier@^3", prettier@^3.1.1, prettier@^3.2.5, prettier@latest: "prettier-fallback@npm:prettier@^3":
version "3.2.5" version "3.2.5"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368"
integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
@ -10204,6 +10272,11 @@ prettier@^2.8.8:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
prettier@^3.1.1, prettier@^3.2.5, prettier@latest:
version "3.2.5"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368"
integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
@ -11607,8 +11680,16 @@ string-argv@0.3.2:
resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6"
integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: "string-width-cjs@npm:string-width@^4.2.0":
name string-width-cjs version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3" version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@ -11704,7 +11785,14 @@ stringify-object@^3.3.0:
is-obj "^1.0.1" is-obj "^1.0.1"
is-regexp "^1.0.0" is-regexp "^1.0.0"
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: "strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1" version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@ -13100,8 +13188,16 @@ workbox-window@6.6.1, workbox-window@^6.5.4:
"@types/trusted-types" "^2.0.2" "@types/trusted-types" "^2.0.2"
workbox-core "6.6.1" workbox-core "6.6.1"
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
name wrap-ansi-cjs version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0:
version "7.0.0" version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==