diff --git a/src/app/deals/components/Funnel/Funnel.tsx b/src/app/deals/components/Funnel/Funnel.tsx index 4bbc3c2..da88377 100644 --- a/src/app/deals/components/Funnel/Funnel.tsx +++ b/src/app/deals/components/Funnel/Funnel.tsx @@ -4,14 +4,14 @@ import React, { FC, ReactNode } from "react"; import DealCard from "@/app/deals/components/DealCard/DealCard"; import DealContainer from "@/app/deals/components/DealContainer/DealContainer"; import StatusColumnWrapper from "@/app/deals/components/StatusColumnWrapper/StatusColumnWrapper"; -import { useStatusesContext } from "@/app/deals/contexts/StatusesContext"; +import { useDealsContext } from "@/app/deals/contexts/DealsContext"; import useDealsAndStatusesDnd from "@/app/deals/hooks/useDealsAndStatusesDnd"; import FunnelDnd from "@/components/dnd/FunnelDnd/FunnelDnd"; import { DealSchema, StatusSchema } from "@/lib/client"; import { sortByLexorank } from "@/utils/lexorank"; const Funnel: FC = () => { - const { deals } = useStatusesContext(); + const { deals } = useDealsContext(); const { sortedStatuses, diff --git a/src/app/deals/components/StatusColumnWrapper/StatusColumnWrapper.tsx b/src/app/deals/components/StatusColumnWrapper/StatusColumnWrapper.tsx index 409f076..c884fd2 100644 --- a/src/app/deals/components/StatusColumnWrapper/StatusColumnWrapper.tsx +++ b/src/app/deals/components/StatusColumnWrapper/StatusColumnWrapper.tsx @@ -1,5 +1,7 @@ -import React, { ReactNode } from "react"; -import { Box, Text } from "@mantine/core"; +import React, { ReactNode, useEffect, useRef, useState } from "react"; +import { Box, Group, Text, TextInput } from "@mantine/core"; +import StatusMenu from "@/app/deals/components/StatusColumnWrapper/StatusMenu"; +import { useStatusesContext } from "@/app/deals/contexts/StatusesContext"; import { StatusSchema } from "@/lib/client"; type Props = { @@ -13,23 +15,98 @@ const StatusColumnWrapper = ({ children, isDragging = false, }: Props) => { + const { onUpdateStatus } = useStatusesContext(); + const [isEditing, setIsEditing] = useState(false); + const [editValue, setEditValue] = useState(status.name); + const inputRef = useRef(null); + + useEffect(() => { + if (isEditing && inputRef.current) { + inputRef.current.focus(); + } + }, [isEditing]); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + isEditing && + inputRef.current && + !inputRef.current.contains(event.target as Node) + ) { + handleSave(); + } + }; + + document.addEventListener("mousedown", handleClickOutside); + return () => + document.removeEventListener("mousedown", handleClickOutside); + }, [isEditing, editValue]); + + const handleEdit = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + + setEditValue(status.name); + setIsEditing(true); + }; + + const handleSave = () => { + const newValue = editValue.trim(); + if (newValue && newValue !== status.name) { + onUpdateStatus(status.id, { name: newValue }); + } + setIsEditing(false); + }; + return ( - - {status.name} - + + {isEditing ? ( + setEditValue(e.target.value)} + onKeyDown={e => { + if (e.key === "Enter") handleSave(); + if (e.key === "Escape") { + setEditValue(status.name); + setIsEditing(false); + } + }} + variant="unstyled" + styles={{ + input: { + height: 25, + minHeight: 25, + }, + }} + /> + ) : ( + + {status.name} + + )} + + {children} ); diff --git a/src/app/deals/components/StatusColumnWrapper/StatusMenu.tsx b/src/app/deals/components/StatusColumnWrapper/StatusMenu.tsx new file mode 100644 index 0000000..e5b4d30 --- /dev/null +++ b/src/app/deals/components/StatusColumnWrapper/StatusMenu.tsx @@ -0,0 +1,48 @@ +import React, { FC } from "react"; +import { IconDotsVertical, IconEdit, IconTrash } from "@tabler/icons-react"; +import { Box, Group, Menu, Text } from "@mantine/core"; +import { useStatusesContext } from "@/app/deals/contexts/StatusesContext"; +import { StatusSchema } from "@/lib/client"; + +type Props = { + status: StatusSchema; + handleEdit: (e: React.MouseEvent) => void; +}; + +const StatusMenu: FC = ({ status, handleEdit }) => { + const { onDeleteStatus } = useStatusesContext(); + + return ( + + + { + e.preventDefault(); + e.stopPropagation(); + }}> + + + + + + + + Переименовать + + + onDeleteStatus(status.id)}> + + + Удалить + + + + + ); +}; + +export default StatusMenu; diff --git a/src/app/deals/contexts/DealsContext.tsx b/src/app/deals/contexts/DealsContext.tsx new file mode 100644 index 0000000..a357019 --- /dev/null +++ b/src/app/deals/contexts/DealsContext.tsx @@ -0,0 +1,80 @@ +"use client"; + +import React, { createContext, FC, useContext } from "react"; +import { useMutation, UseMutationResult } from "@tanstack/react-query"; +import { AxiosError } from "axios"; +import { useBoardsContext } from "@/app/deals/contexts/BoardsContext"; +import useDealsList from "@/hooks/useDealsList"; +import { + DealSchema, + HttpValidationError, + Options, + UpdateDealData, + UpdateDealResponse, +} from "@/lib/client"; +import { updateDealMutation } from "@/lib/client/@tanstack/react-query.gen"; +import { notifications } from "@/lib/notifications"; + +type DealsContextState = { + deals: DealSchema[]; + setDeals: React.Dispatch>; + updateDeal: UseMutationResult< + UpdateDealResponse, + AxiosError, + Options + >; + refetchDeals: () => void; +}; + +const DealsContext = createContext(undefined); + +const useDealsContextState = () => { + const { selectedBoard } = useBoardsContext(); + const { + deals, + setDeals, + refetch: refetchDeals, + } = useDealsList({ boardId: selectedBoard?.id }); + + const updateDeal = useMutation({ + ...updateDealMutation(), + onError: error => { + console.error(error); + notifications.error({ + message: error.response?.data?.detail as string | undefined, + }); + refetchDeals(); + }, + }); + + return { + deals, + setDeals, + updateDeal, + refetchDeals, + }; +}; + +type DealsContextProviderProps = { + children: React.ReactNode; +}; + +export const DealsContextProvider: FC = ({ + children, +}) => { + const state = useDealsContextState(); + + return ( + {children} + ); +}; + +export const useDealsContext = () => { + const context = useContext(DealsContext); + if (!context) { + throw new Error( + "useDealsContext must be used within a DealsContextProvider" + ); + } + return context; +}; diff --git a/src/app/deals/contexts/StatusesContext.tsx b/src/app/deals/contexts/StatusesContext.tsx index 6ab7d3d..c3a79af 100644 --- a/src/app/deals/contexts/StatusesContext.tsx +++ b/src/app/deals/contexts/StatusesContext.tsx @@ -4,22 +4,17 @@ import React, { createContext, FC, useContext, useEffect } from "react"; import { useMutation, UseMutationResult } from "@tanstack/react-query"; import { AxiosError } from "axios"; import { useBoardsContext } from "@/app/deals/contexts/BoardsContext"; -import useDealsList from "@/hooks/useDealsList"; import useStatusesList from "@/hooks/useStatusesList"; +import { useStatusesOperations } from "@/hooks/useStatusesOperations"; import { - DealSchema, HttpValidationError, Options, StatusSchema, - UpdateDealData, - UpdateDealResponse, UpdateStatusData, UpdateStatusResponse, + UpdateStatusSchema, } from "@/lib/client"; -import { - updateDealMutation, - updateStatusMutation, -} from "@/lib/client/@tanstack/react-query.gen"; +import { updateStatusMutation } from "@/lib/client/@tanstack/react-query.gen"; import { notifications } from "@/lib/notifications"; type StatusesContextState = { @@ -31,14 +26,9 @@ type StatusesContextState = { Options >; refetchStatuses: () => void; - deals: DealSchema[]; - setDeals: React.Dispatch>; - updateDeal: UseMutationResult< - UpdateDealResponse, - AxiosError, - Options - >; - refetchDeals: () => void; + onCreateStatus: (name: string) => void; + onUpdateStatus: (statusId: number, status: UpdateStatusSchema) => void; + onDeleteStatus: (statusId: number) => void; }; const StatusesContext = createContext( @@ -55,12 +45,6 @@ const useStatusesContextState = () => { boardId: selectedBoard?.id, }); - const { - deals, - setDeals, - refetch: refetchDeals, - } = useDealsList({ boardId: selectedBoard?.id }); - useEffect(() => { refetchStatuses(); }, [selectedBoard]); @@ -76,26 +60,22 @@ const useStatusesContextState = () => { }, }); - const updateDeal = useMutation({ - ...updateDealMutation(), - onError: error => { - console.error(error); - notifications.error({ - message: error.response?.data?.detail as string | undefined, - }); - refetchDeals(); - }, - }); + const { onCreateStatus, onUpdateStatus, onDeleteStatus } = + useStatusesOperations({ + statuses, + setStatuses, + refetchStatuses, + boardId: selectedBoard?.id, + }); return { statuses, setStatuses, updateStatus, refetchStatuses, - deals, - setDeals, - updateDeal, - refetchDeals, + onCreateStatus, + onUpdateStatus, + onDeleteStatus, }; }; diff --git a/src/app/deals/hooks/useDealsAndStatusesDnd.ts b/src/app/deals/hooks/useDealsAndStatusesDnd.ts index 266cf79..0e1aac9 100644 --- a/src/app/deals/hooks/useDealsAndStatusesDnd.ts +++ b/src/app/deals/hooks/useDealsAndStatusesDnd.ts @@ -1,6 +1,7 @@ import { useMemo, useState } from "react"; import { DragOverEvent, DragStartEvent, Over } from "@dnd-kit/core"; import { useDebouncedCallback } from "@mantine/hooks"; +import { useDealsContext } from "@/app/deals/contexts/DealsContext"; import { useStatusesContext } from "@/app/deals/contexts/StatusesContext"; import useGetNewRank from "@/app/deals/hooks/useGetNewRank"; import { getStatusId, isStatusId } from "@/app/deals/utils/statusId"; @@ -10,8 +11,8 @@ import { sortByLexorank } from "@/utils/lexorank"; const useDealsAndStatusesDnd = () => { const [activeDeal, setActiveDeal] = useState(null); const [activeStatus, setActiveStatus] = useState(null); - const { statuses, deals, setDeals, setStatuses, updateDeal, updateStatus } = - useStatusesContext(); + const { statuses, setStatuses, updateStatus } = useStatusesContext(); + const { deals, setDeals, updateDeal } = useDealsContext(); const sortedStatuses = useMemo(() => sortByLexorank(statuses), [statuses]); const { diff --git a/src/app/deals/page.tsx b/src/app/deals/page.tsx index 6af09ce..823bcb0 100644 --- a/src/app/deals/page.tsx +++ b/src/app/deals/page.tsx @@ -7,6 +7,7 @@ import { ProjectsContextProvider } from "@/app/deals/contexts/ProjectsContext"; import { StatusesContextProvider } from "@/app/deals/contexts/StatusesContext"; import PageBlock from "@/components/layout/PageBlock/PageBlock"; import PageContainer from "@/components/layout/PageContainer/PageContainer"; +import { DealsContextProvider } from "./contexts/DealsContext"; export default function DealsPage() { return ( @@ -18,7 +19,9 @@ export default function DealsPage() { - + + + diff --git a/src/hooks/useStatusesOperations.ts b/src/hooks/useStatusesOperations.ts new file mode 100644 index 0000000..0ab66de --- /dev/null +++ b/src/hooks/useStatusesOperations.ts @@ -0,0 +1,110 @@ +import React from "react"; +import { useMutation } from "@tanstack/react-query"; +import { AxiosError } from "axios"; +import { LexoRank } from "lexorank"; +import { + HttpValidationError, + StatusSchema, + UpdateStatusSchema, +} from "@/lib/client"; +import { + createStatusMutation, + deleteStatusMutation, + updateStatusMutation, +} from "@/lib/client/@tanstack/react-query.gen"; +import { notifications } from "@/lib/notifications"; +import { getMaxByLexorank, getNewLexorank } from "@/utils/lexorank"; + +type Props = { + statuses: StatusSchema[]; + setStatuses: React.Dispatch>; + refetchStatuses: () => void; + boardId?: number; +}; + +export const useStatusesOperations = ({ + statuses, + setStatuses, + refetchStatuses, + boardId, +}: Props) => { + const onError = (error: AxiosError) => { + console.error(error); + notifications.error({ + message: error.response?.data?.detail as string | undefined, + }); + refetchStatuses(); + }; + + const createStatus = useMutation({ + ...createStatusMutation(), + onError, + onSuccess: res => { + setStatuses([...statuses, res.status]); + }, + }); + + const updateStatus = useMutation({ + ...updateStatusMutation(), + onError, + }); + + const deleteStatus = useMutation({ + ...deleteStatusMutation(), + onError, + }); + + const onCreateStatus = (name: string) => { + if (!boardId) return; + const lastStatus = getMaxByLexorank(statuses); + const newLexorank = getNewLexorank( + lastStatus ? LexoRank.parse(lastStatus.lexorank) : null + ); + + createStatus.mutate({ + body: { + status: { + name, + boardId, + lexorank: newLexorank.toString(), + }, + }, + }); + }; + + const onUpdateStatus = (statusId: number, status: UpdateStatusSchema) => { + updateStatus.mutate({ + path: { statusId }, + body: { status }, + }); + + setStatuses(statuses => + statuses.map(oldStatus => + oldStatus.id !== statusId + ? oldStatus + : { + id: oldStatus.id, + name: status.name ? status.name : oldStatus.name, + lexorank: status.lexorank + ? status.lexorank + : oldStatus.lexorank, + } + ) + ); + }; + + const onDeleteStatus = (statusId: number) => { + deleteStatus.mutate({ + path: { statusId }, + }); + setStatuses(statuses => + statuses.filter(status => status.id !== statusId) + ); + }; + + return { + onCreateStatus, + onUpdateStatus, + onDeleteStatus, + }; +}; diff --git a/src/lib/client/@tanstack/react-query.gen.ts b/src/lib/client/@tanstack/react-query.gen.ts index 5a2a195..3ef51ed 100644 --- a/src/lib/client/@tanstack/react-query.gen.ts +++ b/src/lib/client/@tanstack/react-query.gen.ts @@ -1,8 +1,8 @@ // This file is auto-generated by @hey-api/openapi-ts -import { type Options, getBoards, createBoard, deleteBoard, updateBoard, getDeals, updateDeal, getProjects, getStatuses, updateStatus } from '../sdk.gen'; +import { type Options, getBoards, createBoard, deleteBoard, updateBoard, getDeals, updateDeal, getProjects, getStatuses, createStatus, deleteStatus, updateStatus } from '../sdk.gen'; import { queryOptions, type UseMutationOptions } from '@tanstack/react-query'; -import type { GetBoardsData, CreateBoardData, CreateBoardError, CreateBoardResponse2, DeleteBoardData, DeleteBoardError, DeleteBoardResponse2, UpdateBoardData, UpdateBoardError, UpdateBoardResponse2, GetDealsData, UpdateDealData, UpdateDealError, UpdateDealResponse2, GetProjectsData, GetStatusesData, UpdateStatusData, UpdateStatusError, UpdateStatusResponse2 } from '../types.gen'; +import type { GetBoardsData, CreateBoardData, CreateBoardError, CreateBoardResponse2, DeleteBoardData, DeleteBoardError, DeleteBoardResponse2, UpdateBoardData, UpdateBoardError, UpdateBoardResponse2, GetDealsData, UpdateDealData, UpdateDealError, UpdateDealResponse2, GetProjectsData, GetStatusesData, CreateStatusData, CreateStatusError, CreateStatusResponse2, DeleteStatusData, DeleteStatusError, DeleteStatusResponse2, UpdateStatusData, UpdateStatusError, UpdateStatusResponse2 } from '../types.gen'; import type { AxiosError } from 'axios'; import { client as _heyApiClient } from '../client.gen'; @@ -205,6 +205,60 @@ export const getStatusesOptions = (options: Options) => { }); }; +export const createStatusQueryKey = (options: Options) => createQueryKey('createStatus', options); + +/** + * Create Status + */ +export const createStatusOptions = (options: Options) => { + return queryOptions({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await createStatus({ + ...options, + ...queryKey[0], + signal, + throwOnError: true + }); + return data; + }, + queryKey: createStatusQueryKey(options) + }); +}; + +/** + * Create Status + */ +export const createStatusMutation = (options?: Partial>): UseMutationOptions, Options> => { + const mutationOptions: UseMutationOptions, Options> = { + mutationFn: async (localOptions) => { + const { data } = await createStatus({ + ...options, + ...localOptions, + throwOnError: true + }); + return data; + } + }; + return mutationOptions; +}; + +/** + * Delete Status + */ +export const deleteStatusMutation = (options?: Partial>): UseMutationOptions, Options> => { + const mutationOptions: UseMutationOptions, Options> = { + mutationFn: async (localOptions) => { + const { data } = await deleteStatus({ + ...options, + ...localOptions, + throwOnError: true + }); + return data; + } + }; + return mutationOptions; +}; + /** * Update Status */ diff --git a/src/lib/client/sdk.gen.ts b/src/lib/client/sdk.gen.ts index 5e01aa2..8a7f384 100644 --- a/src/lib/client/sdk.gen.ts +++ b/src/lib/client/sdk.gen.ts @@ -1,8 +1,8 @@ // This file is auto-generated by @hey-api/openapi-ts import type { Options as ClientOptions, TDataShape, Client } from './client'; -import type { GetBoardsData, GetBoardsResponses, GetBoardsErrors, CreateBoardData, CreateBoardResponses, CreateBoardErrors, DeleteBoardData, DeleteBoardResponses, DeleteBoardErrors, UpdateBoardData, UpdateBoardResponses, UpdateBoardErrors, GetDealsData, GetDealsResponses, GetDealsErrors, UpdateDealData, UpdateDealResponses, UpdateDealErrors, GetProjectsData, GetProjectsResponses, GetStatusesData, GetStatusesResponses, GetStatusesErrors, UpdateStatusData, UpdateStatusResponses, UpdateStatusErrors } from './types.gen'; -import { zGetBoardsData, zGetBoardsResponse2, zCreateBoardData, zCreateBoardResponse2, zDeleteBoardData, zDeleteBoardResponse2, zUpdateBoardData, zUpdateBoardResponse2, zGetDealsData, zGetDealsResponse2, zUpdateDealData, zUpdateDealResponse2, zGetProjectsData, zGetProjectsResponse2, zGetStatusesData, zGetStatusesResponse2, zUpdateStatusData, zUpdateStatusResponse2 } from './zod.gen'; +import type { GetBoardsData, GetBoardsResponses, GetBoardsErrors, CreateBoardData, CreateBoardResponses, CreateBoardErrors, DeleteBoardData, DeleteBoardResponses, DeleteBoardErrors, UpdateBoardData, UpdateBoardResponses, UpdateBoardErrors, GetDealsData, GetDealsResponses, GetDealsErrors, UpdateDealData, UpdateDealResponses, UpdateDealErrors, GetProjectsData, GetProjectsResponses, GetStatusesData, GetStatusesResponses, GetStatusesErrors, CreateStatusData, CreateStatusResponses, CreateStatusErrors, DeleteStatusData, DeleteStatusResponses, DeleteStatusErrors, UpdateStatusData, UpdateStatusResponses, UpdateStatusErrors } from './types.gen'; +import { zGetBoardsData, zGetBoardsResponse2, zCreateBoardData, zCreateBoardResponse2, zDeleteBoardData, zDeleteBoardResponse2, zUpdateBoardData, zUpdateBoardResponse2, zGetDealsData, zGetDealsResponse2, zUpdateDealData, zUpdateDealResponse2, zGetProjectsData, zGetProjectsResponse2, zGetStatusesData, zGetStatusesResponse2, zCreateStatusData, zCreateStatusResponse2, zDeleteStatusData, zDeleteStatusResponse2, zUpdateStatusData, zUpdateStatusResponse2 } from './zod.gen'; import { client as _heyApiClient } from './client.gen'; export type Options = ClientOptions & { @@ -167,6 +167,44 @@ export const getStatuses = (options: Optio }); }; +/** + * Create Status + */ +export const createStatus = (options: Options) => { + return (options.client ?? _heyApiClient).post({ + requestValidator: async (data) => { + return await zCreateStatusData.parseAsync(data); + }, + responseType: 'json', + responseValidator: async (data) => { + return await zCreateStatusResponse2.parseAsync(data); + }, + url: '/status/', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } + }); +}; + +/** + * Delete Status + */ +export const deleteStatus = (options: Options) => { + return (options.client ?? _heyApiClient).delete({ + requestValidator: async (data) => { + return await zDeleteStatusData.parseAsync(data); + }, + responseType: 'json', + responseValidator: async (data) => { + return await zDeleteStatusResponse2.parseAsync(data); + }, + url: '/status/{statusId}', + ...options + }); +}; + /** * Update Status */ diff --git a/src/lib/client/types.gen.ts b/src/lib/client/types.gen.ts index 52dfea5..9e3420d 100644 --- a/src/lib/client/types.gen.ts +++ b/src/lib/client/types.gen.ts @@ -54,6 +54,42 @@ export type CreateBoardSchema = { lexorank: string; }; +/** + * CreateStatusRequest + */ +export type CreateStatusRequest = { + status: CreateStatusSchema; +}; + +/** + * CreateStatusResponse + */ +export type CreateStatusResponse = { + /** + * Message + */ + message: string; + status: StatusSchema; +}; + +/** + * CreateStatusSchema + */ +export type CreateStatusSchema = { + /** + * Name + */ + name: string; + /** + * Boardid + */ + boardId: number; + /** + * Lexorank + */ + lexorank: string; +}; + /** * DealSchema */ @@ -86,6 +122,16 @@ export type DeleteBoardResponse = { message: string; }; +/** + * DeleteStatusResponse + */ +export type DeleteStatusResponse = { + /** + * Message + */ + message: string; +}; + /** * GetBoardsResponse */ @@ -154,14 +200,14 @@ export type ProjectSchema = { * StatusSchema */ export type StatusSchema = { - /** - * Name - */ - name: string; /** * Id */ id: number; + /** + * Name + */ + name: string; /** * Lexorank */ @@ -504,6 +550,61 @@ export type GetStatusesResponses = { export type GetStatusesResponse2 = GetStatusesResponses[keyof GetStatusesResponses]; +export type CreateStatusData = { + body: CreateStatusRequest; + path?: never; + query?: never; + url: '/status/'; +}; + +export type CreateStatusErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type CreateStatusError = CreateStatusErrors[keyof CreateStatusErrors]; + +export type CreateStatusResponses = { + /** + * Successful Response + */ + 200: CreateStatusResponse; +}; + +export type CreateStatusResponse2 = CreateStatusResponses[keyof CreateStatusResponses]; + +export type DeleteStatusData = { + body?: never; + path: { + /** + * Statusid + */ + statusId: number; + }; + query?: never; + url: '/status/{statusId}'; +}; + +export type DeleteStatusErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type DeleteStatusError = DeleteStatusErrors[keyof DeleteStatusErrors]; + +export type DeleteStatusResponses = { + /** + * Successful Response + */ + 200: DeleteStatusResponse; +}; + +export type DeleteStatusResponse2 = DeleteStatusResponses[keyof DeleteStatusResponses]; + export type UpdateStatusData = { body: UpdateStatusRequest; path: { diff --git a/src/lib/client/zod.gen.ts b/src/lib/client/zod.gen.ts index d2896c1..2e3308e 100644 --- a/src/lib/client/zod.gen.ts +++ b/src/lib/client/zod.gen.ts @@ -35,6 +35,39 @@ export const zCreateBoardResponse = z.object({ board: zBoardSchema }); +/** + * CreateStatusSchema + */ +export const zCreateStatusSchema = z.object({ + name: z.string(), + boardId: z.int(), + lexorank: z.string() +}); + +/** + * CreateStatusRequest + */ +export const zCreateStatusRequest = z.object({ + status: zCreateStatusSchema +}); + +/** + * StatusSchema + */ +export const zStatusSchema = z.object({ + id: z.int(), + name: z.string(), + lexorank: z.string() +}); + +/** + * CreateStatusResponse + */ +export const zCreateStatusResponse = z.object({ + message: z.string(), + status: zStatusSchema +}); + /** * DealSchema */ @@ -52,6 +85,13 @@ export const zDeleteBoardResponse = z.object({ message: z.string() }); +/** + * DeleteStatusResponse + */ +export const zDeleteStatusResponse = z.object({ + message: z.string() +}); + /** * GetBoardsResponse */ @@ -81,15 +121,6 @@ export const zGetProjectsResponse = z.object({ projects: z.array(zProjectSchema) }); -/** - * StatusSchema - */ -export const zStatusSchema = z.object({ - name: z.string(), - id: z.int(), - lexorank: z.string() -}); - /** * GetStatusesResponse */ @@ -304,6 +335,30 @@ export const zGetStatusesData = z.object({ */ export const zGetStatusesResponse2 = zGetStatusesResponse; +export const zCreateStatusData = z.object({ + body: zCreateStatusRequest, + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * Successful Response + */ +export const zCreateStatusResponse2 = zCreateStatusResponse; + +export const zDeleteStatusData = z.object({ + body: z.optional(z.never()), + path: z.object({ + statusId: z.int() + }), + query: z.optional(z.never()) +}); + +/** + * Successful Response + */ +export const zDeleteStatusResponse2 = zDeleteStatusResponse; + export const zUpdateStatusData = z.object({ body: zUpdateStatusRequest, path: z.object({