diff --git a/services/common/src/components/forms/RenderFileUpload.tsx b/services/common/src/components/forms/RenderFileUpload.tsx index f38ba74cf4..d17daa9b93 100644 --- a/services/common/src/components/forms/RenderFileUpload.tsx +++ b/services/common/src/components/forms/RenderFileUpload.tsx @@ -297,7 +297,6 @@ export const FileUpload: FC = ({ metadata: { filename: file.name, filetype: file.type || APPLICATION_OCTET_STREAM, - maxfilenamelength: metadata.maxfilenamelength, }, onError: (err, uploadResult) => { setUploadResultsFor(fileId, uploadResult); @@ -326,7 +325,6 @@ export const FileUpload: FC = ({ metadata: { filename: file.name, filetype: file.type || APPLICATION_OCTET_STREAM, - maxfilenamelength: metadata.maxfilenamelength, }, onBeforeRequest: (req) => { // Set authorization header on each request to make use @@ -465,9 +463,8 @@ export const FileUpload: FC = ({ }, []); const handleFileAdd = (err, file) => { - // Add properties to file metadata so we can reference it later + // Add ID to file metadata so we can reference it later file.setMetadata("filepondid", file.id); - file.setMetadata("maxfilenamelength", maxFileNameLength); }; const getLabel = () => { diff --git a/services/common/src/components/projectSummary/__snapshots__/ProjectManagement.spec.tsx.snap b/services/common/src/components/projectSummary/__snapshots__/ProjectManagement.spec.tsx.snap index f9ac708394..ef8956ff51 100644 --- a/services/common/src/components/projectSummary/__snapshots__/ProjectManagement.spec.tsx.snap +++ b/services/common/src/components/projectSummary/__snapshots__/ProjectManagement.spec.tsx.snap @@ -480,7 +480,7 @@ exports[`Project Management renders properly 1`] = ` @@ -546,7 +546,7 @@ exports[`Project Management renders properly 1`] = ` @@ -612,7 +612,7 @@ exports[`Project Management renders properly 1`] = ` diff --git a/services/common/src/utils/fileUploadHelper.interface.ts b/services/common/src/utils/fileUploadHelper.interface.ts index e378e17ee0..870e803ead 100644 --- a/services/common/src/utils/fileUploadHelper.interface.ts +++ b/services/common/src/utils/fileUploadHelper.interface.ts @@ -6,7 +6,6 @@ export interface FileUploadHelperProps { metadata: { filename: string; filetype: string; - maxfilenamelength: string; }; uploadResults?: UploadResult[]; uploadData?: MultipartDocumentUpload; diff --git a/services/core-api/app/api/constants.py b/services/core-api/app/api/constants.py index 814489289e..598b4b36c6 100644 --- a/services/core-api/app/api/constants.py +++ b/services/core-api/app/api/constants.py @@ -183,6 +183,10 @@ def EXPLOSIVES_PERMIT_DOCUMENT_DOWNLOAD_TOKEN(token_guid): PERM_RECL_EMAIL = 'permrecl@gov.bc.ca' +MAX_DOCUMENT_NAME_LENGTHS = { + "MAJOR_PROJECTS": 50, +} + CORE_PURPLE_LOGO_BASE64_ENCODED = 'data:image/png;base64,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' BC_GOV_LOGO_BASE64_ENCODED = 'data:image/png;base64,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' diff --git a/services/core-api/app/api/projects/information_requirements_table/resources/information_requirements_table_document_upload.py b/services/core-api/app/api/projects/information_requirements_table/resources/information_requirements_table_document_upload.py index 476a4d8bab..8e0601c434 100644 --- a/services/core-api/app/api/projects/information_requirements_table/resources/information_requirements_table_document_upload.py +++ b/services/core-api/app/api/projects/information_requirements_table/resources/information_requirements_table_document_upload.py @@ -6,7 +6,7 @@ from app.api.projects.project.models.project import Project from app.api.mines.mine.models.mine import Mine from app.api.services.document_manager_service import DocumentManagerService - +from app.api.constants import MAX_DOCUMENT_NAME_LENGTHS class InformationRequirementsTableDocumentUploadResource(Resource, UserMixin): @api.doc( @@ -14,12 +14,14 @@ class InformationRequirementsTableDocumentUploadResource(Resource, UserMixin): params={'project_guid': 'The GUID of the project the IRT belongs to.'}) def post(self, project_guid): project = Project.find_by_project_guid(project_guid) + if not project: raise NotFound('Project not found.') + mine = Mine.find_by_mine_guid(str(project.mine_guid)) if not mine: raise NotFound('Mine not found.') return DocumentManagerService.initializeFileUploadWithDocumentManager( - request, mine, 'information_requirements_table') + request, mine, 'information_requirements_table', MAX_DOCUMENT_NAME_LENGTHS['MAJOR_PROJECTS']) diff --git a/services/core-api/app/api/projects/major_mine_application/resources/major_mine_application_document_upload.py b/services/core-api/app/api/projects/major_mine_application/resources/major_mine_application_document_upload.py index de40b04671..14092a94d1 100644 --- a/services/core-api/app/api/projects/major_mine_application/resources/major_mine_application_document_upload.py +++ b/services/core-api/app/api/projects/major_mine_application/resources/major_mine_application_document_upload.py @@ -8,6 +8,7 @@ from app.api.projects.project.models.project import Project from app.api.mines.mine.models.mine import Mine from app.api.services.document_manager_service import DocumentManagerService +from app.api.constants import MAX_DOCUMENT_NAME_LENGTHS class MajorMineApplicationDocumentUploadResource(Resource, UserMixin): @@ -30,4 +31,4 @@ def post(self, project_guid): raise NotFound('Mine not found.') return DocumentManagerService.initializeFileUploadWithDocumentManager( - request, mine, 'major_mine_application') + request, mine, 'major_mine_application', MAX_DOCUMENT_NAME_LENGTHS['MAJOR_PROJECTS']) diff --git a/services/core-api/app/api/projects/project_decision_package/resources/project_decision_package_document_upload.py b/services/core-api/app/api/projects/project_decision_package/resources/project_decision_package_document_upload.py index 5cbbcf78ec..2cf165fd6d 100644 --- a/services/core-api/app/api/projects/project_decision_package/resources/project_decision_package_document_upload.py +++ b/services/core-api/app/api/projects/project_decision_package/resources/project_decision_package_document_upload.py @@ -8,6 +8,7 @@ from app.api.projects.project.models.project import Project from app.api.mines.mine.models.mine import Mine from app.api.services.document_manager_service import DocumentManagerService +from app.api.constants import MAX_DOCUMENT_NAME_LENGTHS class ProjectDecisionPackageDocumentUploadResource(Resource, UserMixin): @@ -30,4 +31,4 @@ def post(self, project_guid): raise NotFound('Mine not found.') return DocumentManagerService.initializeFileUploadWithDocumentManager( - request, mine, 'project_decision_package') + request, mine, 'project_decision_package', MAX_DOCUMENT_NAME_LENGTHS['MAJOR_PROJECTS']) diff --git a/services/core-api/app/api/projects/project_summary/resources/project_summary_document_upload.py b/services/core-api/app/api/projects/project_summary/resources/project_summary_document_upload.py index 8d2aa1af89..48d92abfc9 100644 --- a/services/core-api/app/api/projects/project_summary/resources/project_summary_document_upload.py +++ b/services/core-api/app/api/projects/project_summary/resources/project_summary_document_upload.py @@ -9,6 +9,7 @@ from app.api.services.document_manager_service import DocumentManagerService from app.config import Config from app.api.utils.feature_flag import is_feature_enabled, Feature +from app.api.constants import MAX_DOCUMENT_NAME_LENGTHS class ProjectSummaryDocumentUploadResource(Resource, UserMixin): @api.doc( @@ -29,7 +30,8 @@ def post(self, project_guid, project_summary_guid): if is_feature_enabled(Feature.MAJOR_PROJECT_REPLACE_FILE): return DocumentManagerService.validateFileNameAndInitializeFileUploadWithDocumentManager( - request, mine, project_guid, 'project_summaries') + request, mine, project_guid, 'project_summaries', MAX_DOCUMENT_NAME_LENGTHS['MAJOR_PROJECTS']) else: - return DocumentManagerService.initializeFileUploadWithDocumentManager(request, mine, 'project_summaries') + return DocumentManagerService.initializeFileUploadWithDocumentManager( + request, mine, 'project_summaries', MAX_DOCUMENT_NAME_LENGTHS['MAJOR_PROJECTS']) \ No newline at end of file diff --git a/services/core-api/app/api/services/document_manager_service.py b/services/core-api/app/api/services/document_manager_service.py index 0ed336b57f..c00ad2b0fd 100644 --- a/services/core-api/app/api/services/document_manager_service.py +++ b/services/core-api/app/api/services/document_manager_service.py @@ -35,7 +35,8 @@ class DocumentManagerService(): document_manager_document_resource_url = f'{Config.DOCUMENT_MANAGER_URL}/documents' @classmethod - def validateFileNameAndInitializeFileUploadWithDocumentManager(cls, request, mine, project_guid, document_category): + def validateFileNameAndInitializeFileUploadWithDocumentManager( + cls, request, mine, project_guid, document_category, max_document_name_length=None): metadata = cls._parse_request_metadata(request) file_name = metadata.get('filename') @@ -44,7 +45,7 @@ def validateFileNameAndInitializeFileUploadWithDocumentManager(cls, request, min resp = None if not mine_document: # No existing file found in this application hence continuing the file uploading - resp = DocumentManagerService.initializeFileUploadWithDocumentManager(request, mine, document_category) + resp = DocumentManagerService.initializeFileUploadWithDocumentManager(request, mine, document_category, max_document_name_length) elif mine_document.is_archived: # An archived file with the same name in this application found, hence responing with 409 content = { "description" : f"Archived file already exist with the given name: {file_name}", @@ -76,15 +77,14 @@ def validateFileNameAndInitializeFileUploadWithDocumentManager(cls, request, min return resp @classmethod - def initializeFileUploadWithDocumentManager(cls, request, mine, document_category): + def initializeFileUploadWithDocumentManager(cls, request, mine, document_category, max_document_name_length=None): metadata = cls._parse_request_metadata(request) if not metadata or not metadata.get('filename'): raise Exception('Request metadata missing filename') - max_file_name_length = metadata.get('maxfilenamelength', None) file_name = ((metadata.get('filename')).rsplit('.', 1))[0] - if max_file_name_length and max_file_name_length.isdigit() and len(file_name) > int(max_file_name_length): - raise BadRequest(f'File name exceeds the {max_file_name_length} character limit') + if max_document_name_length and len(file_name) > max_document_name_length: + raise BadRequest(f'File name exceeds the {max_document_name_length} character limit') folder, pretty_folder = cls._parse_upload_folders(mine, document_category) data = { diff --git a/services/core-web/cypress/e2e/majorprojects.cy.ts b/services/core-web/cypress/e2e/majorprojects.cy.ts index fbf9c20935..55beab3c03 100644 --- a/services/core-web/cypress/e2e/majorprojects.cy.ts +++ b/services/core-web/cypress/e2e/majorprojects.cy.ts @@ -77,7 +77,7 @@ describe("Major Projects", () => { expect(interception.request.headers["upload-length"]).to.equal("16368"); expect(interception.request.headers["upload-protocol"]).to.equal("s3-multipart"); expect(interception.request.headers["upload-metadata"]).to.equal( - "filename ZHVtbXkucGRm,filetype YXBwbGljYXRpb24vcGRm,maxfilenamelength NTA=" + "filename ZHVtbXkucGRm,filetype YXBwbGljYXRpb24vcGRm" ); }); diff --git a/services/core-web/src/components/Forms/UploadProjectDecisionPackageDocumentForm.js b/services/core-web/src/components/Forms/UploadProjectDecisionPackageDocumentForm.js index 424ad7b3be..b194ce8580 100644 --- a/services/core-web/src/components/Forms/UploadProjectDecisionPackageDocumentForm.js +++ b/services/core-web/src/components/Forms/UploadProjectDecisionPackageDocumentForm.js @@ -3,9 +3,7 @@ import PropTypes from "prop-types"; import { compose } from "redux"; import { Field, reduxForm, getFormValues } from "redux-form"; import { connect } from "react-redux"; -import { Form } from "@ant-design/compatible"; -import "@ant-design/compatible/assets/index.css"; -import { Button, Col, Row, Popconfirm, Typography, Divider, Checkbox } from "antd"; +import { Button, Col, Row, Popconfirm, Typography, Divider, Checkbox, Form } from "antd"; import { resetForm } from "@common/utils/helpers"; import * as FORM from "@/constants/forms"; import ProjectDecisionPackageFileUpload from "@/components/mine/Projects/ProjectDecisionPackageFileUpload"; @@ -65,16 +63,14 @@ export const UploadProjectDecisionPackageDocumentForm = (props) => { - - - + {isDecisionPackageEligible && ( diff --git a/services/core-web/src/components/mine/Projects/ProjectDecisionPackageFileUpload.js b/services/core-web/src/components/mine/Projects/ProjectDecisionPackageFileUpload.js index 74358396a6..fa666f3c27 100644 --- a/services/core-web/src/components/mine/Projects/ProjectDecisionPackageFileUpload.js +++ b/services/core-web/src/components/mine/Projects/ProjectDecisionPackageFileUpload.js @@ -1,8 +1,6 @@ import React from "react"; import PropTypes from "prop-types"; import { Field } from "redux-form"; -import { Form } from "@ant-design/compatible"; -import "@ant-design/compatible/assets/index.css"; import { PROJECT_DECISION_PACKAGE_DOCUMENTS } from "@mds/common/constants/API"; import FileUpload from "@/components/common/FileUpload"; import { DOCUMENT, EXCEL, IMAGE, SPATIAL } from "@/constants/fileTypes"; @@ -16,22 +14,20 @@ const propTypes = { }; export const ProjectDecisionPackageFileUpload = (props) => ( - - - + ); ProjectDecisionPackageFileUpload.propTypes = propTypes; diff --git a/services/core-web/src/styles/components/MajorMineApplication.scss b/services/core-web/src/styles/components/MajorMineApplication.scss deleted file mode 100644 index ad752809d9..0000000000 --- a/services/core-web/src/styles/components/MajorMineApplication.scss +++ /dev/null @@ -1,5 +0,0 @@ -.decision-package-uploads { - .ant-form-item-label { - text-align: left; - } -} \ No newline at end of file diff --git a/services/core-web/src/styles/index.scss b/services/core-web/src/styles/index.scss index 58b893c2dc..c545c9b517 100755 --- a/services/core-web/src/styles/index.scss +++ b/services/core-web/src/styles/index.scss @@ -66,6 +66,5 @@ @import "./components/PermitConditions.scss"; @import "./components/HelpGuide.scss"; @import "./components/RichTextEditor.scss"; -@import "./components/MajorMineApplication.scss"; // UTILITIES - utilities and helper classes. This layer has the highest specificity. \ No newline at end of file diff --git a/services/core-web/src/tests/components/Forms/__snapshots__/UploadProjectDecisionPackageDocumentForm.spec.js.snap b/services/core-web/src/tests/components/Forms/__snapshots__/UploadProjectDecisionPackageDocumentForm.spec.js.snap index bd9c9a6e3d..6216510193 100644 --- a/services/core-web/src/tests/components/Forms/__snapshots__/UploadProjectDecisionPackageDocumentForm.spec.js.snap +++ b/services/core-web/src/tests/components/Forms/__snapshots__/UploadProjectDecisionPackageDocumentForm.spec.js.snap @@ -1,11 +1,8 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`UploadProjectDecisionPackageDocumentForm renders properly 1`] = ` -
- - - +
-
+ `;