diff --git a/.vscode/settings.json b/.vscode/settings.json index a0ab05d..9f0752d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -32,5 +32,5 @@ ["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"], ["cx\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)"] ], - "editor.inlineSuggest.showToolbar": "onHover" + "editor.inlineSuggest.showToolbar": "always" } diff --git a/apps/web/api/ius/types.ts b/apps/web/api/ius/types.ts index 9a34861..9eac5aa 100644 --- a/apps/web/api/ius/types.ts +++ b/apps/web/api/ius/types.ts @@ -16,11 +16,9 @@ export type DocumentType = { name: string; }; -export type Document = { - documentId: string; - documentTypeId: string; - href: string; - name: string; +export type Document = DocumentType & { + documentId?: string; + href?: string; }; export type ResponseGetData = Record; diff --git a/apps/web/app/ius/[slug]/page.tsx b/apps/web/app/ius/[slug]/page.tsx index 4ffc4ea..8115a1a 100644 --- a/apps/web/app/ius/[slug]/page.tsx +++ b/apps/web/app/ius/[slug]/page.tsx @@ -29,9 +29,10 @@ export default async function Page(pageProps: PageProps) { apiIUS.getData({ pageUrlParams }), apiIUS.getMetaData({ pageUrlParams }), apiIUS.getConfig({ pageUrlParams }), + apiIUS.getDocumentTypes({ pageUrlParams }), apiIUS.getDocuments({ pageUrlParams }), - ]).then(([data, metaData, { title }, documents]) => { - const props = { data, documents, metaData, pageUrlParams, title }; + ]).then(([data, metaData, { title }, documentTypes, documents]) => { + const props = { data, documentTypes, documents, metaData, pageUrlParams, title }; return
; }); diff --git a/apps/web/components/Form/Files.tsx b/apps/web/components/Form/Files.tsx index 08e111b..a22db05 100644 --- a/apps/web/components/Form/Files.tsx +++ b/apps/web/components/Form/Files.tsx @@ -4,6 +4,7 @@ import type * as IUS from '@/api/ius/types'; import { ArrowDownTrayIcon } from '@heroicons/react/24/solid'; import { Heading, InputFile } from '@repo/ui'; import Link from 'next/link'; +import { unique } from 'radash'; import { useContext } from 'react'; type DownloadDocumentProps = Pick; @@ -27,13 +28,13 @@ function DownloadDocument({ document }: DownloadDocumentProps) { } type FileProps = { - readonly document: IUS.Document; + readonly document: Docs[number]; }; function File({ document }: FileProps) { const { formFiles, setFormFiles } = useContext(FormContext); - const { documentId, documentTypeId, name } = document; + const { canUpload, documentTypeId, name } = document; const handleFileChange = (event: React.ChangeEvent) => { if (event.target.files !== null) { @@ -47,23 +48,40 @@ function File({ document }: FileProps) { }; return ( -
+
- +
); } -export function Files({ documents }: Props) { +export function Files({ documentTypes, documents }: Props) { + const docs = getDocs({ documentTypes, documents }); + return (
- Документы + Документы
- {documents.map((document) => ( - + {docs.map((document) => ( + ))}
); } + +type Docs = Array; + +function getDocs({ documentTypes, documents }: Pick): Docs { + if (!documents.length) { + return documentTypes.map((x) => ({ ...x, canUpload: true })); + } + + return unique(documents, ({ documentTypeId }) => documentTypeId).map((document) => ({ + ...document, + canUpload: documentTypes.some( + (documentType) => documentType.documentTypeId === document.documentTypeId + ), + })); +} diff --git a/apps/web/components/Form/types.ts b/apps/web/components/Form/types.ts index d9162df..e4fcd24 100644 --- a/apps/web/components/Form/types.ts +++ b/apps/web/components/Form/types.ts @@ -3,6 +3,7 @@ import type { PageUrlParams } from '@/utils/url'; export type Props = { readonly data: IUS.ResponseGetData; + readonly documentTypes: IUS.ResponseDocumentTypes; readonly documents: IUS.ResponseDocuments; readonly metaData: IUS.ResponseMetaData; readonly pageUrlParams: PageUrlParams; diff --git a/packages/ui/input.tsx b/packages/ui/input.tsx index ca070be..a7f477a 100644 --- a/packages/ui/input.tsx +++ b/packages/ui/input.tsx @@ -29,7 +29,7 @@ export const InputFile = forwardRef((props, ref) = type="file" className="file:bg-primary-50 file:text-primary-500 hover:file:bg-primary-100 block w-full text-sm text-slate-500 file:mr-4 file:rounded-sm file:border-0 - file:px-4 file:py-2 file:text-sm - file:font-semibold hover:file:cursor-pointer" + file:px-4 file:py-2 file:text-sm file:font-semibold + hover:file:cursor-pointer disabled:cursor-not-allowed disabled:opacity-30 disabled:file:cursor-not-allowed" /> ));