From 25c468fa4900e2ea3e8ade6a31519125556acae0 Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Mon, 19 Feb 2024 17:21:03 +0100 Subject: [PATCH 01/18] adding bookOfStandards property to CompanyPublicDto --- packages/types/src/dto/company.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/types/src/dto/company.ts b/packages/types/src/dto/company.ts index aabeae2c..13943b9a 100644 --- a/packages/types/src/dto/company.ts +++ b/packages/types/src/dto/company.ts @@ -23,6 +23,7 @@ export type CompanyPublicDto = { logoImage?: string; landingImage?: string; landingImageCompanyCulture?: string; + bookOfStandards?: string; video?: string; interests?: InterestDto[]; }; From 18353febea5cf96c7896c178309bd93422a4ed44 Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Mon, 19 Feb 2024 17:33:20 +0100 Subject: [PATCH 02/18] adding bookOfStandards column to company table --- apps/api/db/schema.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/api/db/schema.ts b/apps/api/db/schema.ts index 9550915c..ab70e8ee 100644 --- a/apps/api/db/schema.ts +++ b/apps/api/db/schema.ts @@ -90,6 +90,7 @@ export const company = pgTable('company', { logoImage: text('logo_image'), landingImage: text('landing_image'), landingImageCompanyCulture: text('landing_image_company_culture'), + bookOfStandards: text('book_of_standards'), video: text('video'), codeId: integer('code_id').references(() => code.id), }); From ee0c48fd93ccf8d1ea2159cc86f0ffc8b8d17af4 Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:54:20 +0100 Subject: [PATCH 03/18] making updateBookOfStandards service --- apps/api/src/company/company.service.ts | 34 +++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/apps/api/src/company/company.service.ts b/apps/api/src/company/company.service.ts index af11914d..0eab5732 100644 --- a/apps/api/src/company/company.service.ts +++ b/apps/api/src/company/company.service.ts @@ -258,6 +258,40 @@ export class CompanyService { return updatedCompany; } + async updateBookOfStandards( + id: number, + file: Express.Multer.File, + ): Promise { + const bookOfStandards = await this.blobService.upload( + 'book-of-standards', + file.buffer, + file.mimetype, + ); + + const [updatedBookOfStandards] = await db + .update(company) + .set({ + bookOfStandards, + }) + .where(eq(company.id, id)) + .returning({ + id: company.id, + category: company.category, + name: company.name, + description: company.description, + opportunitiesDescription: company.opportunitiesDescription, + website: company.website, + boothLocation: company.boothLocation, + logoImage: company.logoImage, + landingImage: company.landingImage, + landingImageCompanyCulture: company.landingImageCompanyCulture, + bookOfStandards: company.bookOfStandards, + video: company.video, + }); + + return updatedBookOfStandards; + } + async updateLogoImage( id: number, file: Express.Multer.File, From f3f9744d8d50108c4b42c43bbbdf4be1dc9a46db Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Mon, 19 Feb 2024 20:09:20 +0100 Subject: [PATCH 04/18] adding updateBookOfStandardsController --- apps/api/src/company/company.controller.ts | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/apps/api/src/company/company.controller.ts b/apps/api/src/company/company.controller.ts index 576c2faf..916a974c 100644 --- a/apps/api/src/company/company.controller.ts +++ b/apps/api/src/company/company.controller.ts @@ -194,6 +194,37 @@ export class CompanyController { return await this.companyService.updateLogoImage(user.id, file); } + @UseGuards(SponsorGuard) + @ApiBearerAuth() + @ApiConsumes('multipart/form-data') + @ApiBody({ + schema: { + type: 'object', + properties: { + file: { + type: 'string', + format: 'binary', + }, + }, + }, + }) + @Patch('/book-of-standards') + @UseInterceptors(FileInterceptor('file')) + async updateBookOfStandards( + @Req() { user }: AuthenticatedRequest, + @UploadedFile( + new ParseFilePipe({ + validators: [ + new FileTypeValidator({ fileType: 'pdf' }), + new MaxFileSizeValidator({ maxSize: 1024 * 1024 * 10 }), + ], + }), + ) + file: Express.Multer.File, + ): Promise { + return await this.companyService.updateBookOfStandards(user.id, file); + } + @UseGuards(SponsorGuard) @ApiBearerAuth() @ApiConsumes('multipart/form-data') From 685327a038804a0906b324a7eeff67987de2d421 Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Mon, 19 Feb 2024 20:11:41 +0100 Subject: [PATCH 05/18] adding removeBookOfStandards service --- apps/api/src/company/company.service.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/api/src/company/company.service.ts b/apps/api/src/company/company.service.ts index 0eab5732..54ea4d5f 100644 --- a/apps/api/src/company/company.service.ts +++ b/apps/api/src/company/company.service.ts @@ -133,6 +133,13 @@ export class CompanyService { .where(eq(company.id, id)); } + async removeBookOfStandards(id: number): Promise { + await db + .update(company) + .set({ landingImageCompanyCulture: null }) + .where(eq(company.id, id)); + } + async removeVideo(id: number): Promise { await db .update(company) From 590b91c26b82b286c956e117b90411dbaa5777e4 Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Mon, 19 Feb 2024 20:13:42 +0100 Subject: [PATCH 06/18] adding removeBookOfStandards controller --- apps/api/src/company/company.controller.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/api/src/company/company.controller.ts b/apps/api/src/company/company.controller.ts index 916a974c..93c47e90 100644 --- a/apps/api/src/company/company.controller.ts +++ b/apps/api/src/company/company.controller.ts @@ -74,6 +74,15 @@ export class CompanyController { return await this.companyService.removeLandingImageCompanyCulture(user.id); } + @UseGuards(SponsorGuard) + @ApiBearerAuth() + @Delete('/book-of-standards') + async removeBookOfStandards( + @Req() { user }: AuthenticatedRequest, + ): Promise { + return await this.companyService.removeBookOfStandards(user.id); + } + @UseGuards(SponsorGuard) @ApiBearerAuth() @Delete('/logo-image') From 9a86f30cac269cee080c0d631f708b69f9678fce Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Mon, 19 Feb 2024 20:27:48 +0100 Subject: [PATCH 07/18] adding useCompanyUpdateBookOfStandards.ts --- .../useCompanyUpdateBookOfStandards.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 apps/sponsor/src/api/company/useCompanyUpdateBookOfStandards.ts diff --git a/apps/sponsor/src/api/company/useCompanyUpdateBookOfStandards.ts b/apps/sponsor/src/api/company/useCompanyUpdateBookOfStandards.ts new file mode 100644 index 00000000..517c23a6 --- /dev/null +++ b/apps/sponsor/src/api/company/useCompanyUpdateBookOfStandards.ts @@ -0,0 +1,25 @@ +import toast from 'react-hot-toast'; +import { useMutation, useQueryClient } from 'react-query'; + +import { api } from '..'; + +const companyUpdateBookOfStandards = async (file: File) => { + const data = new FormData(); + data.append('file', file); + + return await api.patchForm('company/book-of-standards', data); +}; + +export const useCompanyUpdateBookOfStandards = () => { + const queryClient = useQueryClient(); + + return useMutation(companyUpdateBookOfStandards, { + onSuccess: () => { + queryClient.invalidateQueries(['company', 'current']); + toast.success('Knjiga standarda uspješno uploadana'); + }, + onError: (error: string) => { + toast.error(error); + }, + }); +}; From 5e472f2e71886a3c03fa2352d1872d3699ad2474 Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Mon, 19 Feb 2024 20:31:56 +0100 Subject: [PATCH 08/18] adding useCopmanyuseCompanyRemoveBookOfStandards --- .../useCompanyRemoveBookOfStandards.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 apps/sponsor/src/api/company/useCompanyRemoveBookOfStandards.ts diff --git a/apps/sponsor/src/api/company/useCompanyRemoveBookOfStandards.ts b/apps/sponsor/src/api/company/useCompanyRemoveBookOfStandards.ts new file mode 100644 index 00000000..69fcc567 --- /dev/null +++ b/apps/sponsor/src/api/company/useCompanyRemoveBookOfStandards.ts @@ -0,0 +1,22 @@ +import toast from 'react-hot-toast'; +import { useMutation, useQueryClient } from 'react-query'; + +import { api } from '..'; + +const companyRemoveBookOfStandards = async () => { + return await api.delete('/company/book-of-standards'); +}; + +export const useCompanyRemoveBookOfStandards = () => { + const queryClient = useQueryClient(); + + return useMutation(companyRemoveBookOfStandards, { + onSuccess: () => { + queryClient.invalidateQueries(['company', 'current']); + toast.success('Knjiga standarda uspješno izbrisana'); + }, + onError: (error: string) => { + toast.error(error); + }, + }); +}; From e4be1390a038d664c9b205829f4128168e717a8e Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:03:26 +0100 Subject: [PATCH 09/18] adding PdfInputComponent --- apps/api/db/migrations/meta/_journal.json | 7 ++ .../src/components/PdfUpload/PdfInput.tsx | 70 +++++++++++++++++++ .../src/formSteps/PhotoUpload/PhotoUpload.tsx | 21 ++++++ 3 files changed, 98 insertions(+) create mode 100644 apps/sponsor/src/components/PdfUpload/PdfInput.tsx diff --git a/apps/api/db/migrations/meta/_journal.json b/apps/api/db/migrations/meta/_journal.json index 95fa4bed..28a9241e 100644 --- a/apps/api/db/migrations/meta/_journal.json +++ b/apps/api/db/migrations/meta/_journal.json @@ -29,6 +29,13 @@ "when": 1708296701123, "tag": "0003_cute_glorian", "breakpoints": true + }, + { + "idx": 4, + "version": "5", + "when": 1708359959766, + "tag": "0004_flimsy_zarda", + "breakpoints": true } ] } \ No newline at end of file diff --git a/apps/sponsor/src/components/PdfUpload/PdfInput.tsx b/apps/sponsor/src/components/PdfUpload/PdfInput.tsx new file mode 100644 index 00000000..532553b0 --- /dev/null +++ b/apps/sponsor/src/components/PdfUpload/PdfInput.tsx @@ -0,0 +1,70 @@ +import { useDropzone } from 'react-dropzone'; + +import RemoveSvg from '../../assets/icons/remove.svg'; +import sprite from '../../assets/icons/sprite.svg'; +import c from '../PhotoInput/PhotoInput.module.scss'; + +type PdfInputProps = { + label?: string; + fileSrc?: string; + isDisabled?: boolean; + handleUpload: (files: File[]) => void; + handleRemove: () => void; +}; + +export const PdfInput: React.FC = ({ + label, + fileSrc, + isDisabled = false, + handleRemove, + handleUpload, +}) => { + const { getRootProps, getInputProps } = useDropzone({ + accept: { pdf: ['pdf'] }, + onDrop: async (acceptedFiles) => { + handleUpload(acceptedFiles); + }, + }); + + const height = 300; + + return ( +
+
+ {!fileSrc && ( +
+ +
+ + + +

{label}

+
+
+ )} + {!!fileSrc} + + + {!!fileSrc && ( + + )} +
+
+
+ ); +}; diff --git a/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx b/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx index 81e094b8..6079b1fd 100644 --- a/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx +++ b/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx @@ -1,8 +1,11 @@ import { useCompanyGetCurrentPublic } from '../../api/company/useCompanyGetCurrentPublic'; +import { useCompanyRemoveBookOfStandards } from '../../api/company/useCompanyRemoveBookOfStandards'; import { useCompanyRemoveLandingImage } from '../../api/company/useCompanyRemoveLandingImage'; import { useCompanyRemoveLandingImageCompanyCulture } from '../../api/company/useCompanyRemoveLandingImageCompanyCulture'; +import { useCompanyUpdateBookOfStandards } from '../../api/company/useCompanyUpdateBookOfStandards'; import { useCompanyUpdateLandingImage } from '../../api/company/useCompanyUpdateLandingImage'; import { useCompanyUpdateLandingImageCompanyCulture } from '../../api/company/useCompanyUpdateLandingImageCompanyCulture'; +import { PdfInput } from '../../components/PdfUpload/PdfInput'; import { PhotoInput, PhotoInputLabel } from '../../components/PhotoInput'; import { FormComponent } from '../../types/form'; import styles from './PhotoUpload.module.scss'; @@ -14,6 +17,8 @@ export const PhotoUpload: FormComponent = ({ close }) => { useCompanyUpdateLandingImageCompanyCulture(); const removeLandingImageCompanyCulture = useCompanyRemoveLandingImageCompanyCulture(); + const updateBookOfStandards = useCompanyUpdateBookOfStandards(); + const removeBookOfStandards = useCompanyRemoveBookOfStandards(); const { data: company } = useCompanyGetCurrentPublic(); @@ -33,6 +38,14 @@ export const PhotoUpload: FormComponent = ({ close }) => { await removeLandingImageCompanyCulture.mutateAsync(); }; + const handleUploadBookOfStandards = async (files: File[]) => { + await updateBookOfStandards.mutateAsync(files[0]); + }; + + const handleRemoveBookOfStandards = async () => { + await removeBookOfStandards.mutateAsync(); + }; + return (
@@ -88,6 +101,14 @@ export const PhotoUpload: FormComponent = ({ close }) => { handleRemove={handleRemoveCompanyCulture} /> )} + +
)} - {!!fileSrc} + @@ -64,7 +64,6 @@ export const PdfInput: React.FC = ({ )} -
); }; diff --git a/apps/sponsor/src/components/PhotoInput/PhotoInput.module.scss b/apps/sponsor/src/components/PhotoInput/PhotoInput.module.scss index 30c0f287..d7d38038 100644 --- a/apps/sponsor/src/components/PhotoInput/PhotoInput.module.scss +++ b/apps/sponsor/src/components/PhotoInput/PhotoInput.module.scss @@ -43,7 +43,7 @@ left: 50%; transform: translate(-50%, -50%); - > p { + >p { margin: 0px; } } @@ -158,3 +158,12 @@ body { .removeButton:hover .removeSvg { visibility: visible; } + +.centeredParagraph { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + +} \ No newline at end of file diff --git a/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx b/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx index 6079b1fd..af55535f 100644 --- a/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx +++ b/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx @@ -46,6 +46,8 @@ export const PhotoUpload: FormComponent = ({ close }) => { await removeBookOfStandards.mutateAsync(); }; + console.log('brr', company?.bookOfStandards); + return (
@@ -103,7 +105,11 @@ export const PhotoUpload: FormComponent = ({ close }) => { )} Date: Tue, 20 Feb 2024 07:17:47 +0100 Subject: [PATCH 12/18] adding height prop --- apps/sponsor/src/components/PdfUpload/PdfInput.tsx | 7 ++----- apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx | 1 + 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/sponsor/src/components/PdfUpload/PdfInput.tsx b/apps/sponsor/src/components/PdfUpload/PdfInput.tsx index 27d6aaeb..bcd567ca 100644 --- a/apps/sponsor/src/components/PdfUpload/PdfInput.tsx +++ b/apps/sponsor/src/components/PdfUpload/PdfInput.tsx @@ -9,6 +9,7 @@ type PdfInputProps = { label?: string; fileSrc?: string; isDisabled?: boolean; + height?: number; handleUpload: (files: File[]) => void; handleRemove: () => void; }; @@ -17,6 +18,7 @@ export const PdfInput: React.FC = ({ label, fileSrc, isDisabled = false, + height = 300, handleRemove, handleUpload, }) => { @@ -31,9 +33,6 @@ export const PdfInput: React.FC = ({ }, }); - console.log('MRTVI file', fileSrc); - const height = 300; - return (
@@ -51,9 +50,7 @@ export const PdfInput: React.FC = ({ diff --git a/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx b/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx index af55535f..521f497b 100644 --- a/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx +++ b/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx @@ -112,6 +112,7 @@ export const PhotoUpload: FormComponent = ({ close }) => { } isDisabled={false} fileSrc={company?.bookOfStandards} + height={326} handleUpload={handleUploadBookOfStandards} handleRemove={handleRemoveBookOfStandards} /> From fcd73f8e3bcea27810b7bca5247bf5f743f9b291 Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Tue, 20 Feb 2024 07:18:07 +0100 Subject: [PATCH 13/18] cleanup --- apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx b/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx index 521f497b..18083313 100644 --- a/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx +++ b/apps/sponsor/src/formSteps/PhotoUpload/PhotoUpload.tsx @@ -46,8 +46,6 @@ export const PhotoUpload: FormComponent = ({ close }) => { await removeBookOfStandards.mutateAsync(); }; - console.log('brr', company?.bookOfStandards); - return (
From b26857a62280635f00a6a3b481110e9c0ae1d5cc Mon Sep 17 00:00:00 2001 From: tsiklic1 <100917481+tsiklic1@users.noreply.github.com> Date: Tue, 20 Feb 2024 07:27:02 +0100 Subject: [PATCH 14/18] moving PdfInput to LogoUpload form step --- .../src/formSteps/LogoUpload/LogoUpload.tsx | 26 +++++++++++++++++++ .../src/formSteps/PhotoUpload/PhotoUpload.tsx | 26 ------------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/apps/sponsor/src/formSteps/LogoUpload/LogoUpload.tsx b/apps/sponsor/src/formSteps/LogoUpload/LogoUpload.tsx index d5dba15f..d0f99318 100644 --- a/apps/sponsor/src/formSteps/LogoUpload/LogoUpload.tsx +++ b/apps/sponsor/src/formSteps/LogoUpload/LogoUpload.tsx @@ -1,6 +1,9 @@ import { useCompanyGetCurrentPublic } from '../../api/company/useCompanyGetCurrentPublic'; +import { useCompanyRemoveBookOfStandards } from '../../api/company/useCompanyRemoveBookOfStandards'; import { useCompanyRemoveLogoImage } from '../../api/company/useCompanyRemoveLogoImage'; +import { useCompanyUpdateBookOfStandards } from '../../api/company/useCompanyUpdateBookOfStandards'; import { useCompanyUpdateLogoImage } from '../../api/company/useCompanyUpdateLogoImage'; +import { PdfInput } from '../../components/PdfUpload/PdfInput'; import { PhotoInput, PhotoInputLabel } from '../../components/PhotoInput'; import { FormComponent } from '../../types/form'; import styles from './LogoUpload.module.scss'; @@ -9,6 +12,8 @@ export const LogoUpload: FormComponent = ({ close }) => { const updateLogoImage = useCompanyUpdateLogoImage(); const removeLogoImage = useCompanyRemoveLogoImage(); const { data: company } = useCompanyGetCurrentPublic(); + const updateBookOfStandards = useCompanyUpdateBookOfStandards(); + const removeBookOfStandards = useCompanyRemoveBookOfStandards(); const handleUpload = async (files: File[]) => { await updateLogoImage.mutateAsync(files[0]); @@ -18,6 +23,14 @@ export const LogoUpload: FormComponent = ({ close }) => { await removeLogoImage.mutateAsync(); }; + const handleUploadBookOfStandards = async (files: File[]) => { + await updateBookOfStandards.mutateAsync(files[0]); + }; + + const handleRemoveBookOfStandards = async () => { + await removeBookOfStandards.mutateAsync(); + }; + return (
@@ -52,6 +65,19 @@ export const LogoUpload: FormComponent = ({ close }) => { handleUpload={handleUpload} handleRemove={handleRemove} /> + +