Files
plane/web/ee/components/projects/create/provider.tsx
Nikhil 9b05964f8a [WEB-2963] feat: project templates (#2693)
* chore: add template

* chore: add page template and project template migrations

* chore: add migration file for project and page templates

* chore: page templates

* chore: update template

* feat: page templates

* chore: update model

* chore: asset copy

* chore: update page templates

* feat: add project template create/update endpoint

* improvement: update all templates endpoint

* chore: project template basic types and services

* feat: project template instance and store

* feat: project template store hooks

* chore: feature flags and minor improvements

* feat: project templates list settings

* feat: project templates

* chore: common constants across templates

* improvement: work item template util types

* improvement: moved all project related types to packages and re-exported them to avoid changes in files.

* feat: create project template form with all basic fields and attributes

* chore: add project creation bgtask from template

* chore: update project template configuration

* chore: update project template migrations

* chore: added migration for workspace connection disconnect_meta

* chore: update migration files

* chore: model changes

* chore: add project template validation

* chore: update template task

* chore: project templates endpoints

* fix: base serializers

* chore: add comment edit migrations

* chore: minor improvements and base template store fixes

* chore: minor improvements

* improvement: common template related components

* feat: project template features

* chore: minor formatting

* chore: minor translation updates

* feat: update project template form data

* chore: work item template util improvements

* feat: use project templates in create project modal

* chore: use template endpoint

* chore: update imports

* feat: project creation using templates

* fix: build error

* feat: work item type creation form

* chore: convert project work item types form data to required schema

* feat: update work item type form data extraction and sanitization

* chore: add project template default settings

* chore: update formatting

* improvement: sync all project level features

* revert: utils package build related changes

* feat: project epics in templates

* chore: update background task to handle member and intake creation

* improvement: epic name while creating template

* fix: api server

* revert: utils build

* feat: added work item labels while creating project templates

* chore: update project template task

* refactor: project state list components

* improvement: additional classNames for the group list item and state item

* fix: options

* fix: epic creations

* feat: add project states while creating project templates

* improvements: add empty state for labels

* chore: remove unused exports

* fix: build error

* chore: add intake setting schema

* feat: intake feature settings for project templates

* feat: intake settings and deploy board when creating project from template

* fix: feature children layout

* fix: form keydown events

* fix: template description

* fix: delete state button type

* improvement: UI enhancements related to background, border and shadow

* improvement: project templates dropdown

* improvement: remove empty templates list sections

* improvement: remove empty templates list sections

* improvement: enhance project level template list modularity

* improvement: minor component improvements

* chore: minor type changes

* improvement: template list loader

* improvement: project template form background color

* improvement: work item template form background color

* chore: add asset url validation and resolve pr comments

---------

Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: Henit Chobisa <chobisa.henit@gmail.com>
2025-04-09 15:22:04 +05:30

80 lines
2.6 KiB
TypeScript

import React, { useCallback, useState } from "react";
import { observer } from "mobx-react";
// plane imports
import { DEFAULT_PROJECT_FORM_VALUES } from "@plane/constants";
import { extractAndSanitizeProjectCreationFormData } from "@plane/utils";
// store hooks
import { useMember } from "@/hooks/store";
// plane web imports
import {
ProjectCreationContext,
THandleTemplateChangeProps,
} from "@/plane-web/components/projects/create/project-creation-context";
import { useProjectTemplates, useWorkspaceProjectStates } from "@/plane-web/hooks/store";
export type TProjectCreationProviderProps = {
templateId?: string;
children: React.ReactNode;
};
export const ProjectCreationProvider = observer((props: TProjectCreationProviderProps) => {
const { templateId, children } = props;
// states
const [projectTemplateId, setProjectTemplateId] = useState<string | null>(templateId ?? null);
const [isApplyingTemplate, setIsApplyingTemplate] = useState<boolean>(false);
// store hooks
const { getTemplateById } = useProjectTemplates();
const {
workspace: { getWorkspaceMemberIds },
} = useMember();
const { getProjectStateIdsByWorkspaceId } = useWorkspaceProjectStates();
/**
* Used to handle template change in work item modal
*/
const handleTemplateChange = useCallback(
async (props: THandleTemplateChangeProps) => {
const { workspaceSlug, reset } = props;
// check if work item template id is available
if (!projectTemplateId) return;
// get template details
const template = getTemplateById(projectTemplateId);
// handle local states
setIsApplyingTemplate(true);
if (template) {
// Get the sanitized work item form data
const { valid: sanitizedWorkItemFormData } = extractAndSanitizeProjectCreationFormData({
projectData: template.template_data,
workspaceSlug,
getWorkspaceProjectStateIds: getProjectStateIdsByWorkspaceId,
getWorkspaceMemberIds,
});
// reset form values
reset({
...DEFAULT_PROJECT_FORM_VALUES,
...sanitizedWorkItemFormData,
});
}
// set is applying template to false
setIsApplyingTemplate(false);
},
[projectTemplateId, getTemplateById, getProjectStateIdsByWorkspaceId, getWorkspaceMemberIds]
);
return (
<ProjectCreationContext.Provider
value={{
projectTemplateId,
setProjectTemplateId,
isApplyingTemplate,
setIsApplyingTemplate,
handleTemplateChange,
}}
>
{children}
</ProjectCreationContext.Provider>
);
});