Skip to content

Commit

Permalink
Merge branch 'upload-images-#1062' into gallery-view-#1081
Browse files Browse the repository at this point in the history
  • Loading branch information
joshuadkitenge committed Nov 1, 2024
2 parents a65b74c + 4b9b8f2 commit 35408f8
Show file tree
Hide file tree
Showing 8 changed files with 22 additions and 69 deletions.
4 changes: 1 addition & 3 deletions cypress/e2e/with_mock_data/items.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -537,12 +537,10 @@ describe('Items', () => {
expect(postRequests.length).eq(1);
});

// Click the "Remove file" button
cy.findByRole('button', { name: 'Remove file' }).click();

//TODO: Assert axios delete request was called

// Assert that the text "Upload 1 file" is not in the document
cy.findByText('Upload 1 file').should('not.exist');
});

Expand Down Expand Up @@ -655,7 +653,7 @@ describe('Items', () => {
cy.findByText('Complete').should('exist');
});

it('displays error if post is unsuccessfully', () => {
it('displays error if post is unsuccessful', () => {
cy.window().its('msw').should('not.equal', undefined);
cy.window().then((window) => {
const { worker, http } = window.msw;
Expand Down
3 changes: 2 additions & 1 deletion src/api/api.types.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -244,15 +244,16 @@ export interface AttachmentPostMetadataResponse
export interface ImagePost {
entity_id: string;
file_name: string;
upload_file: File;
title?: string | null;
description?: string | null;
upload_file: File;
}

export interface Image
extends Required<Omit<ImagePost, 'upload_file'>>,
CreatedModifiedMixin {
id: string;
primary: boolean;
thumbnail_base64: string;
}

Expand Down
29 changes: 14 additions & 15 deletions src/common/actionMenu.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,9 @@ function ActionMenu(props: ActionMenuProps) {
const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);
const menuOpen = Boolean(anchorEl);

const [openUploadAttachmentsDialog, setOpenUploadAttachmentsDialog] =
React.useState(false);

const [openUploadImagesDialog, setOpenUploadImagesDialog] =
React.useState(false);
const [openUploadDialog, setOpenUploadDialog] = React.useState<
'images' | 'attachments' | false
>(false);

const handleMenuClick = (event: React.MouseEvent<HTMLButtonElement>) => {
setAnchorEl(event.currentTarget);
Expand Down Expand Up @@ -96,28 +94,29 @@ function ActionMenu(props: ActionMenuProps) {
<EditIcon fontSize="small" sx={{ mr: 1 }} />
Edit
</MenuItem>
{uploadAttachmentsEntityId && (
{uploadImagesEntityId && (
<MenuItem
onClick={() => {
setOpenUploadAttachmentsDialog(true);
setOpenUploadDialog('images');
handleMenuClose();
}}
>
<UploadIcon fontSize="small" sx={{ mr: 1 }} />
Upload Attachments
Upload Images
</MenuItem>
)}
{uploadImagesEntityId && (
{uploadAttachmentsEntityId && (
<MenuItem
onClick={() => {
setOpenUploadImagesDialog(true);
setOpenUploadDialog('attachments');
handleMenuClose();
}}
>
<UploadIcon fontSize="small" sx={{ mr: 1 }} />
Upload Images
Upload Attachments
</MenuItem>
)}

{printMenuItem && (
<MenuItem
onClick={() => {
Expand All @@ -135,15 +134,15 @@ function ActionMenu(props: ActionMenuProps) {
<StyledUppyBox>
{uploadAttachmentsEntityId && (
<UploadAttachmentsDialog
open={openUploadAttachmentsDialog}
onClose={() => setOpenUploadAttachmentsDialog(false)}
open={openUploadDialog === 'attachments'}
onClose={() => setOpenUploadDialog(false)}
entityId={uploadAttachmentsEntityId}
/>
)}
{uploadImagesEntityId && (
<UploadImagesDialog
open={openUploadImagesDialog}
onClose={() => setOpenUploadImagesDialog(false)}
open={openUploadDialog === 'images'}
onClose={() => setOpenUploadDialog(false)}
entityId={uploadImagesEntityId}
/>
)}
Expand Down
21 changes: 0 additions & 21 deletions src/common/attachments/uploadAttachmentsDialog.component.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -63,40 +63,32 @@ describe('Upload attachment dialog', () => {
});

it('posts attachment metadata successfully', async () => {
// Render the component

createView();

const file1 = new File(['test'], 'test1.txt', {
type: 'text/plain',
});

// Find the Uppy Dashboard's drop zone (it usually has a label like "Drop files here" or "Browse files")
const dropZone = screen.getByText('Files cannot be larger than', {
exact: false,
});

// Create a drag-and-drop event for the file
Object.defineProperty(dropZone, 'files', {
value: [file1],
});

// Fire the drop event

fireEvent.drop(dropZone, {
dataTransfer: {
files: [file1],
},
});

// Wait for the UI to update with the added file
await waitFor(() => {
expect(screen.getByText('test1.txt')).toBeInTheDocument();
});

await user.click(await screen.findByText('Upload 1 file'));

// Assert axios post was called
expect(axiosPostSpy).toHaveBeenCalledWith('/attachments', {
entity_id: '1',
file_name: 'test1.txt',
Expand Down Expand Up @@ -124,32 +116,26 @@ describe('Upload attachment dialog', () => {
type: 'text/plain',
});

// Find the Uppy Dashboard's drop zone (it usually has a label like "Drop files here" or "Browse files")
const dropZone = screen.getByText('Files cannot be larger than', {
exact: false,
});

// Create a drag-and-drop event for the file
Object.defineProperty(dropZone, 'files', {
value: [file1],
});

// Fire the drop event

fireEvent.drop(dropZone, {
dataTransfer: {
files: [file1],
},
});

// Wait for the UI to update with the added file
await waitFor(() => {
expect(screen.getByText('uploadError.txt')).toBeInTheDocument();
});

await user.click(await screen.findByText('Upload 1 file'));

// Assert axios post was called
expect(axiosPostSpy).toHaveBeenCalledWith('/attachments', {
entity_id: '1',
file_name: 'uploadError.txt',
Expand All @@ -175,40 +161,33 @@ describe('Upload attachment dialog', () => {
return new HttpResponse(undefined, { status: 200 });
})
);
// Render the component

createView();

const file1 = new File(['test'], 'removeError.txt', {
type: 'text/plain',
});

// Find the Uppy Dashboard's drop zone (it usually has a label like "Drop files here" or "Browse files")
const dropZone = screen.getByText('Files cannot be larger than', {
exact: false,
});

// Create a drag-and-drop event for the file
Object.defineProperty(dropZone, 'files', {
value: [file1],
});

// Fire the drop event

fireEvent.drop(dropZone, {
dataTransfer: {
files: [file1],
},
});

// Wait for the UI to update with the added file
await waitFor(() => {
expect(screen.getByText('removeError.txt')).toBeInTheDocument();
});

await user.click(await screen.findByText('Upload 1 file'));

// Assert axios post was called
expect(axiosPostSpy).toHaveBeenCalledWith('/attachments', {
entity_id: '1',
file_name: 'removeError.txt',
Expand Down
9 changes: 1 addition & 8 deletions src/common/images/imageGallery.component.test.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
import {
cleanup,
fireEvent,
screen,
waitFor,
within,
} from '@testing-library/react';
import { fireEvent, screen, waitFor, within } from '@testing-library/react';
import userEvent, { UserEvent } from '@testing-library/user-event';
import { http, HttpResponse } from 'msw';
import { act } from 'react';
Expand Down Expand Up @@ -74,7 +68,6 @@ describe('Image Gallery', () => {

afterEach(() => {
vi.clearAllMocks();
cleanup();
});

it('renders correctly', async () => {
Expand Down
15 changes: 1 addition & 14 deletions src/common/images/uploadImagesDialog.component.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,33 +59,26 @@ describe('Upload image dialog', () => {
});

it('uploads an image with a title and description and verifies completion message', async () => {
// Render the component

createView();

const file1 = new File(['hello world'], 'image.png', {
type: 'image/png',
});

// Find the Uppy Dashboard's drop zone (it usually has a label like "Drop files here" or "Browse files")
const dropZone = screen.getByText('files cannot be larger than', {
exact: false,
});

// Create a drag-and-drop event for the file
Object.defineProperty(dropZone, 'files', {
value: [file1],
});

// Fire the drop event

fireEvent.drop(dropZone, {
dataTransfer: {
files: [file1],
},
});

// Wait for the UI to update with the added file
await waitFor(() => {
expect(screen.getByText('image.png')).toBeInTheDocument();
});
Expand All @@ -109,39 +102,33 @@ describe('Upload image dialog', () => {
expect(await screen.findByText('Complete')).toBeInTheDocument();
});

it('displays error if post is unsuccessfully', async () => {
it('displays error if post is unsuccessful', async () => {
server.use(
http.post('/images', async () => {
return HttpResponse.error();
})
);
// Render the component

createView();

const file1 = new File(['hello world'], 'image.png', {
type: 'image/png',
});

// Find the Uppy Dashboard's drop zone (it usually has a label like "Drop files here" or "Browse files")
const dropZone = screen.getByText('files cannot be larger than', {
exact: false,
});

// Create a drag-and-drop event for the file
Object.defineProperty(dropZone, 'files', {
value: [file1],
});

// Fire the drop event

fireEvent.drop(dropZone, {
dataTransfer: {
files: [file1],
},
});

// Wait for the UI to update with the added file
await waitFor(() => {
expect(screen.getByText('image.png')).toBeInTheDocument();
});
Expand Down
5 changes: 0 additions & 5 deletions src/common/images/uploadImagesDialog.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -63,22 +63,17 @@ const UploadImagesDialog = (props: UploadImagesDialogProps) => {

uppy.on('dashboard:file-edit-complete', (file) => {
if (file) {
// Extract existing metadata
const { title, description, ...restMeta } = file.meta;

// Format title and description
const formattedTitle = getNonEmptyTrimmedString(title);
const formattedDescription = getNonEmptyTrimmedString(description);

// Prepare the updated metadata object
const updatedFileData = {
...restMeta,
...(formattedTitle && { title: formattedTitle }),
...(formattedDescription && { description: formattedDescription }),
};

// Use patchFilesState to update the metadata
// Ensure you call the method properly
uppy.patchFilesState({
[file.id]: {
meta: updatedFileData,
Expand Down
5 changes: 3 additions & 2 deletions src/mocks/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -989,8 +989,9 @@ export const handlers = [
modified_time: '2024-10-12T20:51:47.687000Z',
id: '670ae163532106fbaa41f348',
file_name: 'logo.png',
thumbnail:
'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',
primary: false,
thumbnail_base64:
'UklGRp4FAABXRUJQVlA4IJIFAACwGgCdASpAAEAAPm0mj0WkIaEZ+zaoQAbEtgBajeFfGkY2nr7M4eZ1zR44/UB5gHOA8wH7VelB6gP716gH+J6gD0APLZ9jv9uP3U9p/NGP412Wf5boT/bj9XxM/aH9Lwg7Xn+H3gjkX9T70bUCVBKAH5Q8+vNt9PewV+YHrLevL9zvY7/YBzAAnpq9X9UyzVdGM4xoEajakW2OY9gwwKhtAGcXjTfn/2alORgCXWzVF88eQzk6tm58uaTsmzinz5D3/kaSS19P3+Z4FBs1wUmBaE13W+mibzkERT9QRMgA/vCG0oaXFgVbo3Sp3Gho5LvuHRj/1N/26GB5gHxE+e8YU4Hi8GYsiQH2OV9IfWpOfj5UTnzyi5NZYO2pFC1TPEbYJlyoQRbBH7PeMaW/L22irx9GRnoj6onjImzAvfx7cVur2RJkejeihP+cFEyPpxTr9/b8p7dOK5R74V6JXM2c4SQGRxKrEPSp+VbTz864Z/eHBcbFJMl13N7wBb2lRm44irXnEC6992xxX2oIqp+I8QuDnGb813kHOZMmOT/Gc9Hprf0BHNAHEIXB5mg7whrp0yMDvnUzCH4uTHy0pWE7J2TyOiUQ4WuYZCwezaZWbQykXfriecUWK0d4/b6WoUeUSRLRCCRcZ5RsFrKUpHgqb7/c4qRlbG6XpuYAibJ/70JP8YhTA9/B8BLoFjQ3IGcChPnMk/vikMdxbledsUb4Ng5eaj982+y4dCkLnngZf6pUJV5fWQn3KPrvb6Y9xqAoz2CBNmOqqnE9S2r6pP7le9S4156+nVuw3zDWpdyb9VBmePxDYhpoQTRoyFzELNLHNItygB6bKbDlfAaHFQRP2H5ohce20pg9SuTlgFp2lK7F7WjSkwU3mx/OZhM3KsuyVcdb5a/m9TstlEvkYEKfu11xV4nuJcg3eeczuI2zmcxWQziWTL0XHs/guxxsO5BZtBZCeLCJ0c78x9S7VOC++kUXK+464jPfUXEwuse5ggbEG1bT2Dc4wHyQFhu7YakHzKsnHsXYNk/bH+7Nx18Ec9xGbilZeb+ebY6bm3ES7LnHXMpKhQjJmIQZktPidLHH0cuJ+9oImAcnr76cXhgx+pxIlm8TDXqcA17H9VVJ45MRUbdd295LK5XjjBJTigh9dtBq3/UsdW4axmNHC7VadMTwYJVbkTGyJHtHkOG1p7nvDQkLHP71iPrOd2Q9cy10/Iv4K/IInF01tpJ6NmAabEis0rV+Bo1thW50bTV9JE6DCPiOfCrbtdSvMlvNYbnbqOMyn5xdnhKCzCLVCNpKYjIQfVaZ7Bvb9GwXSEP/bbgn8vjYuK9XfnrjVf5MUlJTQiYhxMdWmtdjkr8YtHGTQuRYgESzn/ozLBoXJdioMfcb6J9sexU3UI4f18/Z+blRxk6RulDUL7A8gIKlUyXFBI5/HJfLbChiVunr9aHCd1y9xAS7KNyoMwzxo6X+62x10Izj1IW1b7BOjqABY4RBlZDpKuQoJGICZDizZEXRgfEPQ5G5LsJWGZ0+y42ExIphG/gRmg0IvWzmX1LeSoP8ON4sZEWXbB47AxL3egs5HDMKHNUDfj/EMfxMSYDdjLuyBOmKc4eEmNzZ2FFaddbAhm8Q2GRwh6gTdU5leovVCPyjYVeyk0keaOEEXTxjrW2SpFlF4eH7ejwAgRjIJIfjt+eExwS4Fu9LXXG7rTRXY/4vMN/6bdtasiLPgCR2sG2vqLe0RVEN3NEBGKaCFaE6UzXt6p/cAqedPQCKOEcfCCGbvfAMal692D9Ind1Q1Ga6z5Eg2Ww76AOkF7fAtiwDuj0/VnTYX5XN94UxVENkfx+PUw0JO4ZW5p9fDnr6vj+UFWdETmDZ6ypyoDxcMIiaVx8Un+od6niv6gnORP1gAAAA',
},
{ status: 200 }
);
Expand Down

0 comments on commit 35408f8

Please sign in to comment.