From 20a7263c587d179fa5b8412ad4fc5bd614b0e08a Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Wed, 26 Jul 2023 18:16:00 +0100 Subject: [PATCH 01/62] Add Form and Code Update and Cleanup --- demand-capacity-mgmt-frontend/package.json | 2 + demand-capacity-mgmt-frontend/src/App.css | 20 +- .../src/App.test.tsx | 20 +- demand-capacity-mgmt-frontend/src/App.tsx | 20 +- .../src/components/AddForm.tsx | 285 ++++++++++-------- .../src/components/CompanyOptions.tsx | 46 +++ .../src/components/Demand.tsx | 9 +- .../src/components/DemandCategoryOptions.tsx | 45 +++ .../src/components/DemandPage.tsx | 43 +-- .../src/components/EditForm.tsx | 7 +- .../src/components/Home.tsx | 3 +- .../src/components/Pagination.tsx | 1 - .../src/components/QuickAcessItems.tsx | 12 +- .../src/components/Search.tsx | 1 - .../src/components/TopMenu.tsx | 2 +- .../src/components/UnitsofMeasureOptions.tsx | 46 +++ .../defaultview/DefaultviewPage.tsx | 21 +- .../CapacityGroupsContextProvider.tsx | 26 +- .../src/contexts/CompanyContextProvider.tsx | 72 +++++ .../src/contexts/DemandCategoryProvider.tsx | 69 +++++ .../src/contexts/DemandContextProvider.tsx | 28 +- .../UnitsOfMeasureContextProvider.tsx | 69 +++++ demand-capacity-mgmt-frontend/src/index.css | 20 +- demand-capacity-mgmt-frontend/src/index.js | 20 +- .../capacitygroup_interfaces.tsx} | 28 +- .../src/interfaces/customer_interfaces.tsx | 41 +++ .../src/interfaces/demand_interfaces.tsx | 85 ++++++ .../src/interfaces/supplier_interfaces.tsx | 40 +++ .../src/reportWebVitals.tsx | 20 +- .../src/setupTests.tsx | 20 +- demand-capacity-mgmt-frontend/yarn.lock | 11 + 31 files changed, 790 insertions(+), 342 deletions(-) create mode 100644 demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx create mode 100644 demand-capacity-mgmt-frontend/src/components/DemandCategoryOptions.tsx create mode 100644 demand-capacity-mgmt-frontend/src/components/UnitsofMeasureOptions.tsx create mode 100644 demand-capacity-mgmt-frontend/src/contexts/CompanyContextProvider.tsx create mode 100644 demand-capacity-mgmt-frontend/src/contexts/DemandCategoryProvider.tsx create mode 100644 demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx rename demand-capacity-mgmt-frontend/src/{hooks/ToggleModal.tsx => interfaces/capacitygroup_interfaces.tsx} (77%) create mode 100644 demand-capacity-mgmt-frontend/src/interfaces/customer_interfaces.tsx create mode 100644 demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx create mode 100644 demand-capacity-mgmt-frontend/src/interfaces/supplier_interfaces.tsx diff --git a/demand-capacity-mgmt-frontend/package.json b/demand-capacity-mgmt-frontend/package.json index 16e7f079..aa029d8d 100644 --- a/demand-capacity-mgmt-frontend/package.json +++ b/demand-capacity-mgmt-frontend/package.json @@ -2,6 +2,7 @@ "name": "tx-demand-capacity-mgmt", "version": "0.1.0", "private": true, + "proxy": "http://localhost:8080", "dependencies": { "@popperjs/core": "^2.11.8", "@react-icons/all-files": "^4.1.0", @@ -14,6 +15,7 @@ "@types/react-dom": "^18.2.6", "axios": "^1.4.0", "bootstrap": "^5.3.0", + "http-proxy-middleware": "^2.0.6", "prop-types": "^15.8.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/demand-capacity-mgmt-frontend/src/App.css b/demand-capacity-mgmt-frontend/src/App.css index 4065397d..d2b35683 100644 --- a/demand-capacity-mgmt-frontend/src/App.css +++ b/demand-capacity-mgmt-frontend/src/App.css @@ -1,23 +1,13 @@ /* - * ******************************************************************************* - * Copyright (c) 2023 BMW AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. * - * SPDX-License-Identifier: Apache-2.0 - * ******************************************************************************** + * SPDX-License-Identifier: Apache-2.0 */ .App { diff --git a/demand-capacity-mgmt-frontend/src/App.test.tsx b/demand-capacity-mgmt-frontend/src/App.test.tsx index a1f31231..57b58742 100644 --- a/demand-capacity-mgmt-frontend/src/App.test.tsx +++ b/demand-capacity-mgmt-frontend/src/App.test.tsx @@ -1,23 +1,13 @@ /* - * ******************************************************************************* - * Copyright (c) 2023 BMW AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. * - * SPDX-License-Identifier: Apache-2.0 - * ******************************************************************************** + * SPDX-License-Identifier: Apache-2.0 */ import { render, screen } from '@testing-library/react'; diff --git a/demand-capacity-mgmt-frontend/src/App.tsx b/demand-capacity-mgmt-frontend/src/App.tsx index 119674a5..b5c51c61 100644 --- a/demand-capacity-mgmt-frontend/src/App.tsx +++ b/demand-capacity-mgmt-frontend/src/App.tsx @@ -1,23 +1,13 @@ /* - * ******************************************************************************* - * Copyright (c) 2023 BMW AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. * - * SPDX-License-Identifier: Apache-2.0 - * ******************************************************************************** + * SPDX-License-Identifier: Apache-2.0 */ import './App.css'; diff --git a/demand-capacity-mgmt-frontend/src/components/AddForm.tsx b/demand-capacity-mgmt-frontend/src/components/AddForm.tsx index 2fda8b8b..ddc96aeb 100644 --- a/demand-capacity-mgmt-frontend/src/components/AddForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/AddForm.tsx @@ -21,180 +21,199 @@ */ import React, { useContext, useState, ChangeEvent, FormEvent } from 'react'; -import { Form, Button } from 'react-bootstrap'; +import { Form, Button, Row,Col } from 'react-bootstrap'; import { DemandContext } from '../contexts/DemandContextProvider'; +import DemandCategoryContextProvider from '../contexts/DemandCategoryProvider'; +import DemandCategoryOptions from './DemandCategoryOptions'; +import CompanyContextProvider from '../contexts/CompanyContextProvider'; +import CompanyOptions from './CompanyOptions'; +import UnitsofMeasureContextContextProvider from '../contexts/UnitsOfMeasureContextProvider'; +import UnitsOfMeasureOptions from './UnitsofMeasureOptions'; +import {Demand} from '../interfaces/demand_interfaces' + const AddForm: React.FC = () => { const { createDemand } = useContext(DemandContext)!; - const [description, setDescription] = useState(''); - const [startDate, setStartDate] = useState(''); - const [endDate, setEndDate] = useState(''); - const [requiredValue, setRequiredValue] = useState(''); - const [deliveredValue, setDeliveredValue] = useState(''); - const [maximumValue, setMaximumValue] = useState(''); - const [demandCategory, setDemandCategory] = useState(''); - + const initialFormState: Demand = { + id: '', + materialDescriptionCustomer: '', + materialNumberCustomer: '', + materialNumberSupplier: '', + customerId: '5d210fb8-260d-4190-9578-f62f9c459703', //Id do submiter + supplierId: '', + unitMeasureId: '', + materialDemandSeries: { + customerLocationId: 'string', + expectedSupplierLocationId: [], + demandCategoryId: '', + demandSeriesValues: [] + } + }; + + const [formState, setFormState] = useState(initialFormState); const handleSubmit = (e: FormEvent) => { e.preventDefault(); - - const newDemand = { - id: 0, // Assign an appropriate ID here - product: '', // Assign the product name here - startDate, - endDate, - requiredValue: parseInt(requiredValue), - deliveredValue: parseInt(deliveredValue), - maximumValue: parseInt(maximumValue), - productId: '1', - projectId: '1', - demandCategory, - companyId: '1', - description, - }; - - createDemand(newDemand); - resetForm(); + createDemand(formState); + {/*resetForm();*/} }; const resetForm = () => { - setDescription(''); - setStartDate(''); - setEndDate(''); - setRequiredValue(''); - setDeliveredValue(''); - setMaximumValue(''); - setDemandCategory(''); + setFormState(initialFormState); }; const onInputChange = (e: ChangeEvent) => { const { name, value } = e.target; - switch (name) { - case 'description': - setDescription(value); - break; - case 'startDate': - setStartDate(value); - break; - case 'endDate': - setEndDate(value); - break; - case 'requiredValue': - if (value >= '0') { - setRequiredValue(value); - } - break; - case 'deliveredValue': - if (value >= '0') { - setDeliveredValue(value); - } - break; - case 'maximumValue': - if (value >= '0') { - setMaximumValue(value); - } - break; - case 'demandCategory': - setDemandCategory(value); - break; - default: - break; + setFormState((prevFormState) => ({ + ...prevFormState, + [name]: value + })); + }; + + const onInputChangeSelect = (e: ChangeEvent) => { + const { name, value } = e.target; + if (name === 'supplierId') { + setFormState((prevFormState) => ({ + ...prevFormState, + supplierId: value, // Update supplierId in the top-level formState + materialDemandSeries: { + ...prevFormState.materialDemandSeries, + expectedSupplierLocationId: [value], // Fill the expectedSupplierLocationId array with the value of supplierId + }, + })); + } else if (name === 'demandCategoryId') { + setFormState((prevFormState) => ({ + ...prevFormState, + materialDemandSeries: { + ...prevFormState.materialDemandSeries, + [name]: value, + }, + })); + } else { + setFormState((prevFormState) => ({ + ...prevFormState, + [name]: value, + })); } }; return (
-

Description *

- - - -

-

Start Date *

- - + + + Start Date + + + + End Date + + + + + + + Unit of Measure + + + + + -

-

End Date *

- - +
+ + Supplier + + + + + + -

-

Required Value *

- - + + + Demand Category + + + + + -

-

Delivered Value *

- + + + Material Number Customer -

-

Maximum Value *

- + + + Material Number Supplier -

-

Demand Category *

- + + Description -

+

); diff --git a/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx b/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx new file mode 100644 index 00000000..c2f926b8 --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx @@ -0,0 +1,46 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + +import React, { useContext } from 'react'; +import { CompanyContext } from '../contexts/CompanyContextProvider'; + + +const CompanyOptions: React.FC = () => { + const companiesContextData = useContext(CompanyContext); + const { companies } = companiesContextData || {}; // Ensure context data is available + + // Use the demandcategories array to fill the options + return ( +<> + + {demandcategories && + demandcategories.map((category) => ( + + ))} + + ); +}; + export default DemandCategoryOptions; diff --git a/demand-capacity-mgmt-frontend/src/components/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/DemandPage.tsx index cea8c706..ffbfcfd9 100644 --- a/demand-capacity-mgmt-frontend/src/components/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/DemandPage.tsx @@ -1,37 +1,30 @@ /* - * ******************************************************************************* - * Copyright (c) 2023 BMW AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. * - * SPDX-License-Identifier: Apache-2.0 - * ******************************************************************************** + * SPDX-License-Identifier: Apache-2.0 */ import React, { useContext, useState, useMemo, useCallback } from 'react'; import { Modal, Button,Form,Col,Row } from 'react-bootstrap'; -import { DemandContext, Demand } from '../contexts/DemandContextProvider'; +import { DemandContext } from '../contexts/DemandContextProvider'; +import { Demand } from '../interfaces/demand_interfaces'; import Pagination from './Pagination'; import DemandsTable from './DemandsTable'; import DemandsSearch from './Search'; import EditForm from './EditForm'; import { FcCancel } from 'react-icons/fc'; +import AddForm from './AddForm'; const DemandsPage: React.FC = () => { const [showEditModal, setShowEditModal] = useState(false); + const [showAddModal, setShowAddModal] = useState(false); const [selectedDemand, setSelectedDemand] = useState(null); const { demands, deleteDemand } = useContext(DemandContext)!; @@ -69,6 +62,7 @@ const DemandsPage: React.FC = () => { }; const handleCloseEdit = () => setShowEditModal(false); + const handleCloseAdd = () => setShowAddModal(false); const filteredDemands = useMemo(() => { @@ -158,7 +152,7 @@ const DemandsPage: React.FC = () => { />
-
@@ -218,6 +212,21 @@ const DemandsPage: React.FC = () => { {selectedDemand && } + + + + New Material Demand + + + + + ); }; diff --git a/demand-capacity-mgmt-frontend/src/components/EditForm.tsx b/demand-capacity-mgmt-frontend/src/components/EditForm.tsx index d64211c3..6e5aa86c 100644 --- a/demand-capacity-mgmt-frontend/src/components/EditForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/EditForm.tsx @@ -22,7 +22,8 @@ import React, { useContext, useState, useEffect } from 'react'; import { Form, Button, Col,Row} from 'react-bootstrap'; -import { DemandContext, Demand } from '../contexts/DemandContextProvider'; +import { DemandContext} from '../contexts/DemandContextProvider'; +import { Demand } from '../interfaces/demand_interfaces'; interface EditFormProps { theDemand: Demand; @@ -47,10 +48,10 @@ const EditForm: React.FC = ({ theDemand }) => { updateDemand(demand); }; - /*const handleInputChange = (e: React.ChangeEvent) => { + const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setDemand((prevDemand) => ({ ...prevDemand, [name]: value })); - };*/ + }; return ( diff --git a/demand-capacity-mgmt-frontend/src/components/Home.tsx b/demand-capacity-mgmt-frontend/src/components/Home.tsx index 3d0dcc8e..6327de2d 100644 --- a/demand-capacity-mgmt-frontend/src/components/Home.tsx +++ b/demand-capacity-mgmt-frontend/src/components/Home.tsx @@ -25,9 +25,8 @@ import CapacityGroupContext from "../contexts/CapacityGroupsContextProvider"; import TopMenu from "./TopMenu"; import QuickAcessItems from "./QuickAcessItems"; import DemandContextProvider from "../contexts/DemandContextProvider"; - - function Home() { + return ( <>
diff --git a/demand-capacity-mgmt-frontend/src/components/Pagination.tsx b/demand-capacity-mgmt-frontend/src/components/Pagination.tsx index c2ef2e50..fa7833cb 100644 --- a/demand-capacity-mgmt-frontend/src/components/Pagination.tsx +++ b/demand-capacity-mgmt-frontend/src/components/Pagination.tsx @@ -19,7 +19,6 @@ * SPDX-License-Identifier: Apache-2.0 * ******************************************************************************** */ - import React, { useEffect, useState } from 'react'; import Pagination from 'react-bootstrap/Pagination'; diff --git a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx index 49112644..21925261 100644 --- a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx +++ b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx @@ -1,4 +1,3 @@ - /* * ******************************************************************************* * Copyright (c) 2023 BMW AG @@ -20,8 +19,7 @@ * SPDX-License-Identifier: Apache-2.0 * ******************************************************************************** */ - -//import {AiOutlineStock, AiOutlineLink} from 'react-icons/ai'; +import {AiOutlineStock, AiOutlineLink} from 'react-icons/ai'; import { Modal, Button } from 'react-bootstrap'; import { useState } from 'react'; import DemandsPage from './DemandPage'; @@ -32,14 +30,14 @@ function QuickAcessItems() { const [show, setShow] = useState(false); const handleClose = () => setShow(false); - // const handleShow = () => setShow(true); + const handleShow = () => setShow(true); return ( <>
- {/**/} -
- {/**/} + +
+
{ + const UnitsOfMeasureContextData = useContext(UnitsofMeasureContext); + const { unitsofmeasure } = UnitsOfMeasureContextData || {}; // Ensure context data is available + + // Use the demandcategories array to fill the options + return ( +<> + + {companies && + companies.map((company) => ( + + ))} + + ); +}; + export default CompanyOptions; diff --git a/demand-capacity-mgmt-frontend/src/components/Demand.tsx b/demand-capacity-mgmt-frontend/src/components/Demand.tsx index 88d85ab1..cf36830c 100644 --- a/demand-capacity-mgmt-frontend/src/components/Demand.tsx +++ b/demand-capacity-mgmt-frontend/src/components/Demand.tsx @@ -21,12 +21,13 @@ */ import React, { useContext, useState } from 'react'; -import { DemandContext, Demand } from '../contexts/DemandContextProvider'; +import { DemandContext } from '../contexts/DemandContextProvider'; +import { DemandProp } from '../interfaces/demand_interfaces'; import { Modal, Button, OverlayTrigger, Tooltip } from 'react-bootstrap'; import EditForm from './EditForm'; interface DemandProps { - demand: Demand; + demand: DemandProp; } const DemandComponent: React.FC = ({ demand }) => { @@ -38,8 +39,8 @@ const DemandComponent: React.FC = ({ demand }) => { - const startDate = new Date(demand.startDate); - const endDate = new Date(demand.endDate); + const startDate = new Date(); + const endDate = new Date(); const formattedStartDate = startDate.toISOString().split('T')[0]; const formattedEndDate = endDate.toISOString().split('T')[0]; diff --git a/demand-capacity-mgmt-frontend/src/components/DemandCategoryOptions.tsx b/demand-capacity-mgmt-frontend/src/components/DemandCategoryOptions.tsx new file mode 100644 index 00000000..646d5d51 --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/components/DemandCategoryOptions.tsx @@ -0,0 +1,45 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + +import React, { useContext } from 'react'; +import { DemandCategoryContext} from '../contexts/DemandCategoryProvider'; + +const DemandCategoryOptions: React.FC = () => { + const demandCategoryContextData = useContext(DemandCategoryContext); + const { demandcategories } = demandCategoryContextData || {}; // Ensure context data is available + + // Use the demandcategories array to fill the options + return ( +<> + + {unitsofmeasure && + unitsofmeasure.map((unit) => ( + + ))} + + ); +}; + export default UnitsOfMeasureOptions; diff --git a/demand-capacity-mgmt-frontend/src/components/defaultview/DefaultviewPage.tsx b/demand-capacity-mgmt-frontend/src/components/defaultview/DefaultviewPage.tsx index 0987db86..e7788a0d 100644 --- a/demand-capacity-mgmt-frontend/src/components/defaultview/DefaultviewPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/defaultview/DefaultviewPage.tsx @@ -20,9 +20,10 @@ * ******************************************************************************** */ -import React, { useContext, useState, useMemo } from 'react'; +import React, { useContext, useState, useMemo, useCallback } from 'react'; import { Modal, Button,Form,Col,Row } from 'react-bootstrap'; -import { CapacityGroupContext } from '../../contexts/CapacityGroupsContextProvider'; +import { CapacityGroupContext } from '../../contexts/CapacityGroupsContextProvider'; +import { CapacityGroup } from '../../interfaces/capacitygroup_interfaces'; import AddForm from '../AddForm'; import Pagination from '../Pagination'; import CapacityGroupsTable from './CapacityGroupsTable'; @@ -30,8 +31,8 @@ import Search from '../Search'; import CapacityGroupsModal from './CapacityGroupsModal'; const CapacityGroupsList: React.FC = () => { - // const [, setShowEditModal] = useState(false); - // const [, setSelectedCapacityGroup] = useState(null); + const [showEditModal, setShowEditModal] = useState(false); + const [selectedCapacityGroup, setSelectedCapacityGroup] = useState(null); const { capacitygroups } = useContext(CapacityGroupContext)!; const [searchQuery, setSearchQuery] = useState(''); @@ -41,9 +42,9 @@ const CapacityGroupsList: React.FC = () => { const [sortOrder, setSortOrder] = useState(''); const [capacitygroupsPerPage, setcapacitygroupsPerPage] = useState(20); // Set the default value here - /*const handleShow = () => { + const handleShow = () => { setShow(true); - };*/ + }; const handleClose = () => { setShow(false); @@ -60,14 +61,14 @@ const CapacityGroupsList: React.FC = () => { } }; - /* const handleEdit = (capacitygroup: CapacityGroup) => { + const handleEdit = (capacitygroup: CapacityGroup) => { setSelectedCapacityGroup(capacitygroup); setShowEditModal(true); - };*/ + }; - /* const handleCloseEditModal = () => { + const handleCloseEditModal = () => { setShowEditModal(false); - };*/ + }; const filteredcapacitygroups = useMemo(() => { let sortedcapacitygroups = [...capacitygroups]; diff --git a/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx index bcb32150..5736f605 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx @@ -22,20 +22,7 @@ import React, { createContext, useState, useEffect } from 'react'; import axios from 'axios'; - -export interface CapacityGroup { - id: number; - product: string; - companyId: string; - requiredValue: number; - deliveredValue: number; - maximumValue: number; - category: string; - description: string; - startDate: string; - endDate: string; - [key: string]: any; -} +import { CapacityGroup } from '../interfaces/capacitygroup_interfaces'; interface CapacityGroupContextData { capacitygroups: CapacityGroup[]; @@ -47,16 +34,13 @@ interface CapacityGroupContextData { export const CapacityGroupContext = createContext(undefined); const CapacityGroupsProvider: React.FC> = (props) => { - const api = axios.create({ - baseURL: 'http://localhost:8080', // Set the correct API URL here - }); const [capacitygroups, setCapacityGroups] = useState([]); useEffect(() => { const fetchCapacityGroups = async () => { try { - const response = await api.get('/capacitygroup', { + const response = await axios.get('/capacitygroup', { params: { project_id: 1, // Adjust the project ID parameter as needed }, @@ -75,7 +59,7 @@ const CapacityGroupsProvider: React.FC> = (props) => const deleteCapacityGroup = async (id: number) => { try { - await api.delete(`/capacitygroup/${id}`); + await axios.delete(`/capacitygroup/${id}`); setCapacityGroups((prevCapacityGroups) => prevCapacityGroups.filter((capacitygroup) => capacitygroup.id !== id)); } catch (error) { console.error('Error deleting capacitygroup:', error); @@ -84,7 +68,7 @@ const CapacityGroupsProvider: React.FC> = (props) => const createCapacityGroup = async (newCapacityGroup: CapacityGroup) => { try { - const response = await api.post('/demand', newCapacityGroup); + const response = await axios.post('/demand', newCapacityGroup); const createdDemand: CapacityGroup = response.data; setCapacityGroups((prevCapacityGroups) => [...prevCapacityGroups, createdDemand]); } catch (error) { @@ -94,7 +78,7 @@ const CapacityGroupsProvider: React.FC> = (props) => const updateCapacityGroup = async (updatedCapacityGroup: CapacityGroup) => { try { - const response = await api.put(`/demand/${updatedCapacityGroup.id}`, updatedCapacityGroup); + const response = await axios.put(`/demand/${updatedCapacityGroup.id}`, updatedCapacityGroup); const modifiedDemand: CapacityGroup = response.data; setCapacityGroups((prevCapacityGroups) => prevCapacityGroups.map((demand) => (demand.id === modifiedDemand.id ? modifiedDemand : demand)) diff --git a/demand-capacity-mgmt-frontend/src/contexts/CompanyContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/CompanyContextProvider.tsx new file mode 100644 index 00000000..7ddf0e6c --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/contexts/CompanyContextProvider.tsx @@ -0,0 +1,72 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + +import React, { createContext, useState, useEffect } from 'react'; +import axios from 'axios'; + +export interface Company { + bpn: string + companyName: string + street: string + number: string + zipCode: string + country: string + myCompany: string +} + + +interface CompanyContextData { + companies: Company[]; +} + +export const CompanyContext = createContext(undefined); + +const CompanyContextProvider: React.FC> = (props) => { + + const [companies, setCompanies] = useState([]); + + useEffect(() => { + const fetchCompanies = async () => { + try { + const response = await axios.get('/company', { + + }); + const result: Company[] = response.data; + setCompanies(result); + } catch (error) { + console.error('Error fetching companies:', error); + } + }; + + fetchCompanies(); + }, []); + + + + return ( + + {props.children} + + ); +}; + +export default CompanyContextProvider; diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandCategoryProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandCategoryProvider.tsx new file mode 100644 index 00000000..bd54cfd6 --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandCategoryProvider.tsx @@ -0,0 +1,69 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + +import React, { createContext, useState, useEffect } from 'react'; +import axios from 'axios'; + +export interface DemandCategory { + id: string + demandCategoryCode: string + demandCategoryName: string +} + +interface DemandContextData { + demandcategories: DemandCategory[]; +} + +export const DemandCategoryContext = createContext(undefined); + +const DemandCategoryContextProvider: React.FC> = (props) => { + + const [demandcategories, setDemandCategory] = useState([]); + + useEffect(() => { + const fetchDemandCategories = async () => { + try { + const response = await axios.get('/demandcategory', { + params: { + project_id: 1, // Adjust the project ID parameter as needed + }, + }); + const result: DemandCategory[] = response.data; + setDemandCategory(result); + } catch (error) { + console.error('Error fetching demands:', error); + } + }; + + fetchDemandCategories(); + }, []); + + + + return ( + + {props.children} + + ); +}; + +export default DemandCategoryContextProvider; diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx index e517eb2d..7550cd5b 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx @@ -19,23 +19,10 @@ * SPDX-License-Identifier: Apache-2.0 * ******************************************************************************** */ - import React, { createContext, useState, useEffect } from 'react'; import axios from 'axios'; +import { Demand } from '../interfaces/demand_interfaces'; -export interface Demand { - id: number; - product: string; - companyId: string; - requiredValue: number; - deliveredValue: number; - maximumValue: number; - demandCategory: string; - description: string; - startDate: string; - endDate: string; - [key: string]: any; -} interface DemandContextData { demands: Demand[]; @@ -47,16 +34,13 @@ interface DemandContextData { export const DemandContext = createContext(undefined); const DemandContextProvider: React.FC> = (props) => { - const api = axios.create({ - baseURL: 'http://localhost:8080', // Set the correct API URL here - }); const [demands, setDemands] = useState([]); useEffect(() => { const fetchDemands = async () => { try { - const response = await api.get('/demand', { + const response = await axios.get('/demand', { params: { project_id: 1, // Adjust the project ID parameter as needed }, @@ -69,13 +53,12 @@ const DemandContextProvider: React.FC> = (props) => }; fetchDemands(); - // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const deleteDemand = async (id: number) => { try { - await api.delete(`/demand/${id}`); + await axios.delete(`/demand/${id}`); setDemands((prevDemands) => prevDemands.filter((demand) => demand.id !== id)); } catch (error) { console.error('Error deleting demand:', error); @@ -84,7 +67,8 @@ const DemandContextProvider: React.FC> = (props) => const createDemand = async (newDemand: Demand) => { try { - const response = await api.post('/demand', newDemand); + console.log(newDemand); + const response = await axios.post('/demand', newDemand); const createdDemand: Demand = response.data; setDemands((prevDemands) => [...prevDemands, createdDemand]); } catch (error) { @@ -94,7 +78,7 @@ const DemandContextProvider: React.FC> = (props) => const updateDemand = async (updatedDemand: Demand) => { try { - const response = await api.put(`/demand/${updatedDemand.id}`, updatedDemand); + const response = await axios.put(`/demand/${updatedDemand.id}`, updatedDemand); const modifiedDemand: Demand = response.data; setDemands((prevDemands) => prevDemands.map((demand) => (demand.id === modifiedDemand.id ? modifiedDemand : demand)) diff --git a/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx new file mode 100644 index 00000000..53fe5d44 --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx @@ -0,0 +1,69 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + +import React, { createContext, useState, useEffect } from 'react'; +import axios from 'axios'; + +export interface UnitMeasure { + id: string + codeValue: string + displayValue: string +} + + + +interface UnitsOfMeasureContextData { + unitsofmeasure: UnitMeasure[]; +} + +export const UnitsofMeasureContext = createContext(undefined); + +const UnitsofMeasureContextContextProvider: React.FC> = (props) => { + + const [unitsofmeasure, setUnitsofMeasure] = useState([]); + + useEffect(() => { + const fetchUnitsofMeasure = async () => { + try { + const response = await axios.get('/unitmeasure', { + + }); + const result: UnitMeasure[] = response.data; + setUnitsofMeasure(result); + } catch (error) { + console.error('Error fetching units of measure:', error); + } + }; + + fetchUnitsofMeasure(); + }, []); + + + + return ( + + {props.children} + + ); +}; + +export default UnitsofMeasureContextContextProvider; diff --git a/demand-capacity-mgmt-frontend/src/index.css b/demand-capacity-mgmt-frontend/src/index.css index 382d1d8f..566f73ca 100644 --- a/demand-capacity-mgmt-frontend/src/index.css +++ b/demand-capacity-mgmt-frontend/src/index.css @@ -1,23 +1,13 @@ /* - * ******************************************************************************* - * Copyright (c) 2023 BMW AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. * - * SPDX-License-Identifier: Apache-2.0 - * ******************************************************************************** + * SPDX-License-Identifier: Apache-2.0 */ body { diff --git a/demand-capacity-mgmt-frontend/src/index.js b/demand-capacity-mgmt-frontend/src/index.js index 4c6ce13a..1247e527 100644 --- a/demand-capacity-mgmt-frontend/src/index.js +++ b/demand-capacity-mgmt-frontend/src/index.js @@ -1,24 +1,14 @@ /* - * ******************************************************************************* - * Copyright (c) 2023 BMW AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. * - * SPDX-License-Identifier: Apache-2.0 - * ******************************************************************************** + * SPDX-License-Identifier: Apache-2.0 */ import React from 'react'; diff --git a/demand-capacity-mgmt-frontend/src/hooks/ToggleModal.tsx b/demand-capacity-mgmt-frontend/src/interfaces/capacitygroup_interfaces.tsx similarity index 77% rename from demand-capacity-mgmt-frontend/src/hooks/ToggleModal.tsx rename to demand-capacity-mgmt-frontend/src/interfaces/capacitygroup_interfaces.tsx index 8efd6349..961dd8f4 100644 --- a/demand-capacity-mgmt-frontend/src/hooks/ToggleModal.tsx +++ b/demand-capacity-mgmt-frontend/src/interfaces/capacitygroup_interfaces.tsx @@ -1,4 +1,3 @@ - /* * ******************************************************************************* * Copyright (c) 2023 BMW AG @@ -21,17 +20,16 @@ * ******************************************************************************** */ -import { useState } from "react"; - -export default function useModal() { - const [isOpen, setisOpen] = useState(false); - - const toggle = () => { - setisOpen(!isOpen); - }; - - return { - isOpen, - toggle - }; -} +export interface CapacityGroup { + id: number; + product: string; + companyId: string; + requiredValue: number; + deliveredValue: number; + maximumValue: number; + category: string; + description: string; + startDate: string; + endDate: string; + [key: string]: any; + } \ No newline at end of file diff --git a/demand-capacity-mgmt-frontend/src/interfaces/customer_interfaces.tsx b/demand-capacity-mgmt-frontend/src/interfaces/customer_interfaces.tsx new file mode 100644 index 00000000..78902e55 --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/interfaces/customer_interfaces.tsx @@ -0,0 +1,41 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + +export interface Customer { + bpn: string + companyName: string + street: string + number: string + zipCode: string + country: string + myCompany: string + } + + export interface CustomerLocation { + bpn: string + companyName: string + street: string + number: string + zipCode: string + country: string + myCompany: string + } \ No newline at end of file diff --git a/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx b/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx new file mode 100644 index 00000000..889dbff5 --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx @@ -0,0 +1,85 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + +import { Customer, CustomerLocation } from "./customer_interfaces"; +import { ExpectedSupplierLocation, Supplier } from "./supplier_interfaces"; + + +export interface Demand { + id: string; + materialDescriptionCustomer: string + materialNumberCustomer: string + materialNumberSupplier: string + customerId: string + supplierId: string + unitMeasureId: string + materialDemandSeries: MaterialDemandSeries + } + + export interface MaterialDemandSeries { + customerLocationId: string + expectedSupplierLocationId: string[] + demandCategoryId: string + demandSeriesValues: DemandSeriesValue[] + } + + export interface DemandSeriesValue { + calendarWeek: string + demand: number + } + + /* Demand List */ + export interface DemandProp { + materialDescriptionCustomer: string + materialNumberCustomer: string + materialNumberSupplier: string + customer: Customer + supplier: Supplier + unitMeasureId: UnitMeasureId + changedAt: string + demandSeries: DemandSeries + } + + export interface UnitMeasureId { + id: string + codeValue: string + displayValue: string + } + + export interface DemandSeries { + customerLocation: CustomerLocation + expectedSupplierLocation: ExpectedSupplierLocation[] + demandCategory: DemandCategory + demandSeriesValues: DemandSeriesValue[] + } + + export interface DemandCategory { + id: string + demandCategoryCode: string + demandCategoryName: string + } + + export interface DemandSeriesValue { + calendarWeek: string + demand: number + } + \ No newline at end of file diff --git a/demand-capacity-mgmt-frontend/src/interfaces/supplier_interfaces.tsx b/demand-capacity-mgmt-frontend/src/interfaces/supplier_interfaces.tsx new file mode 100644 index 00000000..0a5a3ebb --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/interfaces/supplier_interfaces.tsx @@ -0,0 +1,40 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ +export interface Supplier { + bpn: string + companyName: string + street: string + number: string + zipCode: string + country: string + myCompany: string + } + + export interface ExpectedSupplierLocation { + bpn: string + companyName: string + street: string + number: string + zipCode: string + country: string + myCompany: string + } \ No newline at end of file diff --git a/demand-capacity-mgmt-frontend/src/reportWebVitals.tsx b/demand-capacity-mgmt-frontend/src/reportWebVitals.tsx index 64e22bee..fd5cbf20 100644 --- a/demand-capacity-mgmt-frontend/src/reportWebVitals.tsx +++ b/demand-capacity-mgmt-frontend/src/reportWebVitals.tsx @@ -1,23 +1,13 @@ /* - * ******************************************************************************* - * Copyright (c) 2023 BMW AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. * - * SPDX-License-Identifier: Apache-2.0 - * ******************************************************************************** + * SPDX-License-Identifier: Apache-2.0 */ const reportWebVitals = (onPerfEntry: (metric: any) => void) => { diff --git a/demand-capacity-mgmt-frontend/src/setupTests.tsx b/demand-capacity-mgmt-frontend/src/setupTests.tsx index dd37746e..cf779e0f 100644 --- a/demand-capacity-mgmt-frontend/src/setupTests.tsx +++ b/demand-capacity-mgmt-frontend/src/setupTests.tsx @@ -1,23 +1,13 @@ /* - * ******************************************************************************* - * Copyright (c) 2023 BMW AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. * - * SPDX-License-Identifier: Apache-2.0 - * ******************************************************************************** + * SPDX-License-Identifier: Apache-2.0 */ // jest-dom adds custom jest matchers for asserting on DOM nodes. diff --git a/demand-capacity-mgmt-frontend/yarn.lock b/demand-capacity-mgmt-frontend/yarn.lock index 0eaaa57b..5097e9fd 100644 --- a/demand-capacity-mgmt-frontend/yarn.lock +++ b/demand-capacity-mgmt-frontend/yarn.lock @@ -5673,6 +5673,17 @@ http-proxy-middleware@^2.0.3: is-plain-obj "^3.0.0" micromatch "^4.0.2" +http-proxy-middleware@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" From fbffd896ed0ea354d12e2820df71eef60108eb97 Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Thu, 27 Jul 2023 12:22:44 +0100 Subject: [PATCH 26/62] Company API return ID --- .../services/impl/CompanyServiceImpl.java | 2 +- .../public/favicon.ico | Bin 3870 -> 107187 bytes .../src/components/AddForm.tsx | 105 +++++++++++++++--- .../src/components/CompanyOptions.tsx | 2 +- .../src/components/Demand.tsx | 96 ---------------- .../src/components/DemandPage.tsx | 29 ++--- .../src/components/DemandsTable.tsx | 14 +-- .../src/components/Home.tsx | 8 +- .../src/contexts/CompanyContextProvider.tsx | 1 + .../src/interfaces/demand_interfaces.tsx | 3 + .../src/main/resources/openapi.yml | 2 + 11 files changed, 127 insertions(+), 135 deletions(-) delete mode 100644 demand-capacity-mgmt-frontend/src/components/Demand.tsx diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CompanyServiceImpl.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CompanyServiceImpl.java index cd5eddae..793f69a2 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CompanyServiceImpl.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CompanyServiceImpl.java @@ -64,7 +64,7 @@ public List getCompanyIn(List uuidList) { @Override public CompanyDto convertEntityToDto(CompanyEntity companyEntity) { CompanyDto companyDto = new CompanyDto(); - + companyDto.setId(String.valueOf(companyEntity.getId())); companyDto.setBpn(companyEntity.getBpn()); companyDto.setMyCompany(companyEntity.getMyCompany()); companyDto.setCompanyName(companyEntity.getCompanyName()); diff --git a/demand-capacity-mgmt-frontend/public/favicon.ico b/demand-capacity-mgmt-frontend/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..9a363c904d5409463850324db7c93b094406ad8a 100644 GIT binary patch literal 107187 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/demand-capacity-mgmt-frontend/src/components/AddForm.tsx b/demand-capacity-mgmt-frontend/src/components/AddForm.tsx index ddc96aeb..3552c84f 100644 --- a/demand-capacity-mgmt-frontend/src/components/AddForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/AddForm.tsx @@ -29,9 +29,26 @@ import CompanyContextProvider from '../contexts/CompanyContextProvider'; import CompanyOptions from './CompanyOptions'; import UnitsofMeasureContextContextProvider from '../contexts/UnitsOfMeasureContextProvider'; import UnitsOfMeasureOptions from './UnitsofMeasureOptions'; -import {Demand} from '../interfaces/demand_interfaces' +import {Demand} from '../interfaces/demand_interfaces'; +const getMondaysBetweenDates = (startDate: Date, endDate: Date): string[] => { + const mondays: string[] = []; + const current = new Date(startDate); + + while (current <= endDate) { + if (current.getDay() === 1) { + // Monday has index 1 in JS (0 is Sunday, 1 is Monday, etc.) + const formattedDate = current.toISOString().slice(0, 10); + mondays.push(formattedDate); + } + + current.setDate(current.getDate() + 1); + } + + return mondays; +}; + const AddForm: React.FC = () => { const { createDemand } = useContext(DemandContext)!; @@ -40,11 +57,13 @@ const AddForm: React.FC = () => { materialDescriptionCustomer: '', materialNumberCustomer: '', materialNumberSupplier: '', - customerId: '5d210fb8-260d-4190-9578-f62f9c459703', //Id do submiter + startDate:'', + endDate:'', + customerId: '5d210fb8-260d-4190-9578-f62f9c459703', //Id do submiter TODO supplierId: '', unitMeasureId: '', materialDemandSeries: { - customerLocationId: 'string', + customerLocationId: '5d210fb8-260d-4190-9578-f62f9c459703', //In this case im the customer so its my ID expectedSupplierLocationId: [], demandCategoryId: '', demandSeriesValues: [] @@ -52,16 +71,35 @@ const AddForm: React.FC = () => { }; const [formState, setFormState] = useState(initialFormState); + const [demandSeriesValues, setDemandSeriesValues] = useState<{ calendarWeek: string; demand: number }[]>([]); + + // Utility function to calculate the Mondays between the start and end dates + const calculateDemandSeriesValues = (startDate: Date, endDate: Date) => { + const mondays = getMondaysBetweenDates(startDate, endDate); + const values = mondays.map((monday) => ({ + calendarWeek: monday, + demand: 0, + })); + return values; + }; + const handleSubmit = (e: FormEvent) => { e.preventDefault(); - createDemand(formState); - {/*resetForm();*/} + + const startDateObj = new Date(formState.startDate); + const endDateObj = new Date(formState.endDate); + if (startDateObj && endDateObj) { + const calculatedValues = calculateDemandSeriesValues(startDateObj, endDateObj); + // Call createDemand after setting the demandSeriesValues + createDemand({ ...formState, materialDemandSeries: { ...formState.materialDemandSeries, demandSeriesValues: calculatedValues } }); + } }; - const resetForm = () => { + +{/* const resetForm = () => { setFormState(initialFormState); - }; + };*/} const onInputChange = (e: ChangeEvent) => { const { name, value } = e.target; @@ -87,7 +125,7 @@ const AddForm: React.FC = () => { ...prevFormState, materialDemandSeries: { ...prevFormState.materialDemandSeries, - [name]: value, + demandCategoryId: value, // Ensure demandCategoryId is set properly }, })); } else { @@ -98,10 +136,39 @@ const AddForm: React.FC = () => { } }; + const getNextMonday = () => { + const today = new Date(); + const nextMonday = new Date(today); + nextMonday.setDate(today.getDate() + ((1 + 7 - today.getDay()) % 7)); + return nextMonday; + }; + + const [startDateValid, setStartDateValid] = useState(true); + const [endDateValid, setEndDateValid] = useState(true); + + const onStartDateChange = (e: ChangeEvent) => { + const selectedDate = new Date(e.target.value); + setStartDateValid(selectedDate.getDay() === 1); + setEndDateValid(true); + setFormState((prevFormState) => ({ + ...prevFormState, + [e.target.name]: e.target.value, + })); + }; + + const onEndDateChange = (e: ChangeEvent) => { + const selectedDate = new Date(e.target.value); + setEndDateValid(selectedDate.getDay() === 1 && selectedDate >= new Date(formState.startDate)); + setFormState((prevFormState) => ({ + ...prevFormState, + [e.target.name]: e.target.value, + })); + }; + return (
- + Start Date { name="startDate" id="startDate" pattern="\d{4}-\d{2}-\d{2}" - onChange={onInputChange} + min={getNextMonday().toISOString().slice(0, 10)} + onChange={onStartDateChange} required + isInvalid={!startDateValid} /> + + Please select a Monday for the Start Date. + - - End Date - + End Date + + + End Date has to be a Monday after Start Date. + diff --git a/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx b/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx index c2f926b8..d356fdc9 100644 --- a/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx +++ b/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx @@ -36,7 +36,7 @@ const CompanyOptions: React.FC = () => { {companies && companies.map((company) => ( - ))} diff --git a/demand-capacity-mgmt-frontend/src/components/Demand.tsx b/demand-capacity-mgmt-frontend/src/components/Demand.tsx deleted file mode 100644 index cf36830c..00000000 --- a/demand-capacity-mgmt-frontend/src/components/Demand.tsx +++ /dev/null @@ -1,96 +0,0 @@ -/* - * ******************************************************************************* - * Copyright (c) 2023 BMW AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * ******************************************************************************** - */ - -import React, { useContext, useState } from 'react'; -import { DemandContext } from '../contexts/DemandContextProvider'; -import { DemandProp } from '../interfaces/demand_interfaces'; -import { Modal, Button, OverlayTrigger, Tooltip } from 'react-bootstrap'; -import EditForm from './EditForm'; - -interface DemandProps { - demand: DemandProp; -} - -const DemandComponent: React.FC = ({ demand }) => { - const { deleteDemand } = useContext(DemandContext)!; // Add '!' to assert non-null value - const [show, setShow] = useState(false); - - const handleShow = () => setShow(true); - const handleClose = () => setShow(false); - - - - const startDate = new Date(); - const endDate = new Date(); - - const formattedStartDate = startDate.toISOString().split('T')[0]; - const formattedEndDate = endDate.toISOString().split('T')[0]; - - return ( - <> - {demand.id} - {demand.companyId} - {demand.requiredValue} - {demand.deliveredValue} - {demand.maximumValue} - {demand.description} - {formattedStartDate} - {formattedEndDate} - - Edit}> - - - Delete}> - - - - - - - Edit Demand - - - - - - - - - - ); -}; - -export default DemandComponent; diff --git a/demand-capacity-mgmt-frontend/src/components/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/DemandPage.tsx index ffbfcfd9..334ea907 100644 --- a/demand-capacity-mgmt-frontend/src/components/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/DemandPage.tsx @@ -11,9 +11,9 @@ */ import React, { useContext, useState, useMemo, useCallback } from 'react'; -import { Modal, Button,Form,Col,Row } from 'react-bootstrap'; +import { Modal, Button,Form,Col,Row, Toast, ToastContainer } from 'react-bootstrap'; import { DemandContext } from '../contexts/DemandContextProvider'; -import { Demand } from '../interfaces/demand_interfaces'; +import { DemandProp } from '../interfaces/demand_interfaces'; import Pagination from './Pagination'; import DemandsTable from './DemandsTable'; import DemandsSearch from './Search'; @@ -25,7 +25,7 @@ import AddForm from './AddForm'; const DemandsPage: React.FC = () => { const [showEditModal, setShowEditModal] = useState(false); const [showAddModal, setShowAddModal] = useState(false); - const [selectedDemand, setSelectedDemand] = useState(null); + const [selectedDemand, setSelectedDemand] = useState(null); const { demands, deleteDemand } = useContext(DemandContext)!; const [searchQuery, setSearchQuery] = useState(''); @@ -56,7 +56,7 @@ const DemandsPage: React.FC = () => { [deleteDemand] ); - const handleEdit = (demand: Demand) => { + const handleEdit = (demand: DemandProp) => { setSelectedDemand(demand); setShowEditModal(true); }; @@ -66,13 +66,15 @@ const DemandsPage: React.FC = () => { const filteredDemands = useMemo(() => { - let sortedDemands = [...demands]; + let sortedDemands = [...demand]; if (searchQuery !== '') { sortedDemands = sortedDemands.filter((demand) => - demand.description.toLowerCase().includes(searchQuery.toLowerCase()) || + demand.materialDescriptionCustomer.toLowerCase().includes(searchQuery.toLowerCase()) || demand.id.toString().includes(searchQuery.toLowerCase()) || - demand.companyId.toString().includes(searchQuery.toLowerCase()) + demand.customerId.toString().includes(searchQuery.toLowerCase())|| + demand.materialDemandSeries.demandCategoryId.toString().includes(searchQuery.toLowerCase())|| + demand.materialNumberCustomer.toString().includes(searchQuery.toLowerCase()) ); } @@ -116,12 +118,12 @@ const DemandsPage: React.FC = () => { () => slicedDemands.map((demand) => ( + Details {demand.id} - {demand.companyId} - {demand.requiredValue} - {demand.deliveredValue} - {demand.maximumValue} - {demand.description} + {demand.customerId} + {demand.materialNumberCustomer} + {demand.materialDemandSeries?.demandCategoryId} + {demand.materialDescriptionCustomer} {demand.startDate.split('T')[0]} {demand.endDate.split('T')[0]} @@ -153,7 +155,7 @@ const DemandsPage: React.FC = () => {
@@ -227,6 +229,7 @@ const DemandsPage: React.FC = () => { + ); }; diff --git a/demand-capacity-mgmt-frontend/src/components/DemandsTable.tsx b/demand-capacity-mgmt-frontend/src/components/DemandsTable.tsx index 4c23bb38..39df7323 100644 --- a/demand-capacity-mgmt-frontend/src/components/DemandsTable.tsx +++ b/demand-capacity-mgmt-frontend/src/components/DemandsTable.tsx @@ -35,20 +35,20 @@ const DemandsTable: React.FC = ({ sortColumn, sortOrder, hand + - - - - - + - + + - - + + + {/* + */} )), diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx index 39df7323..605aaac4 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx @@ -35,20 +35,20 @@ const DemandsTable: React.FC = ({ sortColumn, sortOrder, hand
+ + handleSort('id')}> Id {sortColumn === 'id' && } handleSort('companyId')}> Company Id {sortColumn === 'companyId' && } handleSort('requiredValue')}> - Required Value {sortColumn === 'requiredValue' && } - handleSort('deliveredValue')}> - Delivered Value {sortColumn === 'deliveredValue' && } + handleSort('materialNumber')}> + Material Number {sortColumn === 'materialNumber' && } handleSort('maximumValue')}> - Maximum Value {sortColumn === 'maximumValue' && } + handleSort('demandCategoryCode')}> + Demand Cat. Code{sortColumn === 'demandCategoryCode' && } handleSort('description')}> Description {sortColumn === 'description' && } diff --git a/demand-capacity-mgmt-frontend/src/components/Home.tsx b/demand-capacity-mgmt-frontend/src/components/Home.tsx index 6327de2d..19f7376d 100644 --- a/demand-capacity-mgmt-frontend/src/components/Home.tsx +++ b/demand-capacity-mgmt-frontend/src/components/Home.tsx @@ -25,10 +25,12 @@ import CapacityGroupContext from "../contexts/CapacityGroupsContextProvider"; import TopMenu from "./TopMenu"; import QuickAcessItems from "./QuickAcessItems"; import DemandContextProvider from "../contexts/DemandContextProvider"; +import { Toast, ToastContainer } from "react-bootstrap"; function Home() { return ( - <> + <> +

@@ -40,9 +42,9 @@ function Home() {
- + - + ); diff --git a/demand-capacity-mgmt-frontend/src/contexts/CompanyContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/CompanyContextProvider.tsx index 7ddf0e6c..75aee778 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/CompanyContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/CompanyContextProvider.tsx @@ -24,6 +24,7 @@ import React, { createContext, useState, useEffect } from 'react'; import axios from 'axios'; export interface Company { + id: string, bpn: string companyName: string street: string diff --git a/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx b/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx index 889dbff5..13d38f33 100644 --- a/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx +++ b/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx @@ -26,6 +26,8 @@ import { ExpectedSupplierLocation, Supplier } from "./supplier_interfaces"; export interface Demand { id: string; + startDate:string, + endDate:string, materialDescriptionCustomer: string materialNumberCustomer: string materialNumberSupplier: string @@ -49,6 +51,7 @@ export interface Demand { /* Demand List */ export interface DemandProp { + id: string; materialDescriptionCustomer: string materialNumberCustomer: string materialNumberSupplier: string diff --git a/demand-capacity-mgmt-specification/src/main/resources/openapi.yml b/demand-capacity-mgmt-specification/src/main/resources/openapi.yml index b7d57f1d..0178bbcd 100644 --- a/demand-capacity-mgmt-specification/src/main/resources/openapi.yml +++ b/demand-capacity-mgmt-specification/src/main/resources/openapi.yml @@ -505,6 +505,8 @@ components: CompanyDto: type: object properties: + id: + type: string bpn: type: string companyName: From 7f50218c7992f1e0030bf88ab289fd5e8ec1655b Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Fri, 28 Jul 2023 17:05:50 +0100 Subject: [PATCH 27/62] Required Fields --- demand-capacity-mgmt-frontend/src/App.css | 26 ++++++++++---- .../src/App.test.tsx | 20 ----------- demand-capacity-mgmt-frontend/src/App.tsx | 36 ------------------- .../src/components/AddForm.tsx | 33 +++++++++-------- .../src/components/DemandPage.tsx | 5 +-- .../src/components/Home.tsx | 2 +- demand-capacity-mgmt-frontend/src/index.css | 20 ++++++++--- demand-capacity-mgmt-frontend/src/index.js | 21 +++++++---- .../src/reportWebVitals.tsx | 20 ++++++++--- .../src/setupTests.tsx | 20 ++++++++--- 10 files changed, 99 insertions(+), 104 deletions(-) delete mode 100644 demand-capacity-mgmt-frontend/src/App.test.tsx delete mode 100644 demand-capacity-mgmt-frontend/src/App.tsx diff --git a/demand-capacity-mgmt-frontend/src/App.css b/demand-capacity-mgmt-frontend/src/App.css index d2b35683..648dbe97 100644 --- a/demand-capacity-mgmt-frontend/src/App.css +++ b/demand-capacity-mgmt-frontend/src/App.css @@ -1,13 +1,23 @@ /* - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. * - * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** */ .App { @@ -61,6 +71,8 @@ button { text-decoration: underline; } -.quickAcessBody{ - z-index: 1020; +.required-field-label::after { + content: "*"; + color: red; + margin-left: 4px; /* Add some spacing between the label text and the asterisk */ } \ No newline at end of file diff --git a/demand-capacity-mgmt-frontend/src/App.test.tsx b/demand-capacity-mgmt-frontend/src/App.test.tsx deleted file mode 100644 index 57b58742..00000000 --- a/demand-capacity-mgmt-frontend/src/App.test.tsx +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -import { render, screen } from '@testing-library/react'; -import App from './App'; - -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/demand-capacity-mgmt-frontend/src/App.tsx b/demand-capacity-mgmt-frontend/src/App.tsx deleted file mode 100644 index b5c51c61..00000000 --- a/demand-capacity-mgmt-frontend/src/App.tsx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -import './App.css'; -import 'bootstrap/dist/css/bootstrap.min.css'; - -function App() { - return ( -
-
-

- Edit src/App.tsx and save to reload. -

- - Learn React - -
-
- ); -} - -export default App; diff --git a/demand-capacity-mgmt-frontend/src/components/AddForm.tsx b/demand-capacity-mgmt-frontend/src/components/AddForm.tsx index 3552c84f..b6263d33 100644 --- a/demand-capacity-mgmt-frontend/src/components/AddForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/AddForm.tsx @@ -30,7 +30,7 @@ import CompanyOptions from './CompanyOptions'; import UnitsofMeasureContextContextProvider from '../contexts/UnitsOfMeasureContextProvider'; import UnitsOfMeasureOptions from './UnitsofMeasureOptions'; import {Demand} from '../interfaces/demand_interfaces'; - +import '../App.css'; const getMondaysBetweenDates = (startDate: Date, endDate: Date): string[] => { const mondays: string[] = []; @@ -168,8 +168,8 @@ const AddForm: React.FC = () => { return ( - - Start Date + + Start Date { Please select a Monday for the Start Date. - - End Date + + End Date { - - Unit of Measure + + Unit of Measure { - - Supplier + + Supplier { - - Demand Category + + Demand Category { - - Material Number Customer + + Material Number Customer { /> - + Material Number Supplier { name="materialNumberSupplier" value={formState.materialNumberSupplier} onChange={onInputChange} - disabled /> - - Description + + Description { const [showEditModal, setShowEditModal] = useState(false); const [showAddModal, setShowAddModal] = useState(false); const [selectedDemand, setSelectedDemand] = useState(null); - const { demands, deleteDemand } = useContext(DemandContext)!; + const { demands, deleteDemand } = useContext(DemandContext)!; //HERE + const [searchQuery, setSearchQuery] = useState(''); const [currentPage, setCurrentPage] = useState(1); @@ -66,7 +67,7 @@ const DemandsPage: React.FC = () => { const filteredDemands = useMemo(() => { - let sortedDemands = [...demand]; + let sortedDemands = [...demands]; if (searchQuery !== '') { sortedDemands = sortedDemands.filter((demand) => diff --git a/demand-capacity-mgmt-frontend/src/components/Home.tsx b/demand-capacity-mgmt-frontend/src/components/Home.tsx index 19f7376d..a2488bfb 100644 --- a/demand-capacity-mgmt-frontend/src/components/Home.tsx +++ b/demand-capacity-mgmt-frontend/src/components/Home.tsx @@ -25,7 +25,7 @@ import CapacityGroupContext from "../contexts/CapacityGroupsContextProvider"; import TopMenu from "./TopMenu"; import QuickAcessItems from "./QuickAcessItems"; import DemandContextProvider from "../contexts/DemandContextProvider"; -import { Toast, ToastContainer } from "react-bootstrap"; + function Home() { return ( diff --git a/demand-capacity-mgmt-frontend/src/index.css b/demand-capacity-mgmt-frontend/src/index.css index 566f73ca..382d1d8f 100644 --- a/demand-capacity-mgmt-frontend/src/index.css +++ b/demand-capacity-mgmt-frontend/src/index.css @@ -1,13 +1,23 @@ /* - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. * - * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** */ body { diff --git a/demand-capacity-mgmt-frontend/src/index.js b/demand-capacity-mgmt-frontend/src/index.js index 1247e527..e9db3b46 100644 --- a/demand-capacity-mgmt-frontend/src/index.js +++ b/demand-capacity-mgmt-frontend/src/index.js @@ -1,14 +1,23 @@ - /* - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. * - * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** */ import React from 'react'; diff --git a/demand-capacity-mgmt-frontend/src/reportWebVitals.tsx b/demand-capacity-mgmt-frontend/src/reportWebVitals.tsx index fd5cbf20..64e22bee 100644 --- a/demand-capacity-mgmt-frontend/src/reportWebVitals.tsx +++ b/demand-capacity-mgmt-frontend/src/reportWebVitals.tsx @@ -1,13 +1,23 @@ /* - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. * - * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** */ const reportWebVitals = (onPerfEntry: (metric: any) => void) => { diff --git a/demand-capacity-mgmt-frontend/src/setupTests.tsx b/demand-capacity-mgmt-frontend/src/setupTests.tsx index cf779e0f..dd37746e 100644 --- a/demand-capacity-mgmt-frontend/src/setupTests.tsx +++ b/demand-capacity-mgmt-frontend/src/setupTests.tsx @@ -1,13 +1,23 @@ /* - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. * - * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** */ // jest-dom adds custom jest matchers for asserting on DOM nodes. From 392bbca35de563240ba8063904c43c982defeaf3 Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Fri, 28 Jul 2023 17:33:16 +0100 Subject: [PATCH 28/62] React Router Implementation --- demand-capacity-mgmt-frontend/package.json | 2 +- .../{Home.tsx => CapacityGroupDetails.tsx} | 14 ++---- .../defaultview/CapacityGroupPage.tsx | 45 +++++++++++++++++++ ...ultviewPage.tsx => CapacityGroupsView.tsx} | 0 demand-capacity-mgmt-frontend/src/index.js | 32 +++++++++---- demand-capacity-mgmt-frontend/yarn.lock | 43 +++++++----------- 6 files changed, 89 insertions(+), 47 deletions(-) rename demand-capacity-mgmt-frontend/src/components/{Home.tsx => CapacityGroupDetails.tsx} (78%) create mode 100644 demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupPage.tsx rename demand-capacity-mgmt-frontend/src/components/defaultview/{DefaultviewPage.tsx => CapacityGroupsView.tsx} (100%) diff --git a/demand-capacity-mgmt-frontend/package.json b/demand-capacity-mgmt-frontend/package.json index aa029d8d..f4846cdf 100644 --- a/demand-capacity-mgmt-frontend/package.json +++ b/demand-capacity-mgmt-frontend/package.json @@ -20,7 +20,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^4.10.1", - "react-router-dom": "^6.14.1", + "react-router-dom": "^6.14.2", "react-scripts": "^5.0.1", "typescript": "^5.1.3", "web-vitals": "^2.1.4" diff --git a/demand-capacity-mgmt-frontend/src/components/Home.tsx b/demand-capacity-mgmt-frontend/src/components/CapacityGroupDetails.tsx similarity index 78% rename from demand-capacity-mgmt-frontend/src/components/Home.tsx rename to demand-capacity-mgmt-frontend/src/components/CapacityGroupDetails.tsx index a2488bfb..afda5c22 100644 --- a/demand-capacity-mgmt-frontend/src/components/Home.tsx +++ b/demand-capacity-mgmt-frontend/src/components/CapacityGroupDetails.tsx @@ -20,17 +20,13 @@ * ******************************************************************************** */ -import CapacityGroupsList from "./defaultview/DefaultviewPage"; +import CapacityGroupsList from "./defaultview/CapacityGroupsView"; import CapacityGroupContext from "../contexts/CapacityGroupsContextProvider"; -import TopMenu from "./TopMenu"; -import QuickAcessItems from "./QuickAcessItems"; -import DemandContextProvider from "../contexts/DemandContextProvider"; -function Home() { +function CapacityGroupDetails() { return ( <> -

@@ -41,13 +37,9 @@ function Home() {
- - - - ); } -export default Home; \ No newline at end of file +export default CapacityGroupDetails; \ No newline at end of file diff --git a/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupPage.tsx b/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupPage.tsx new file mode 100644 index 00000000..c493497d --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupPage.tsx @@ -0,0 +1,45 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + +import CapacityGroupsList from "./CapacityGroupsView"; +import CapacityGroupContext from "../../contexts/CapacityGroupsContextProvider"; + +function CapacityGroupPage() { + + return ( + <> +
+
+
+
+ + + +
+
+
+ + + ); +} + +export default CapacityGroupPage; \ No newline at end of file diff --git a/demand-capacity-mgmt-frontend/src/components/defaultview/DefaultviewPage.tsx b/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsView.tsx similarity index 100% rename from demand-capacity-mgmt-frontend/src/components/defaultview/DefaultviewPage.tsx rename to demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsView.tsx diff --git a/demand-capacity-mgmt-frontend/src/index.js b/demand-capacity-mgmt-frontend/src/index.js index e9db3b46..0b54bf70 100644 --- a/demand-capacity-mgmt-frontend/src/index.js +++ b/demand-capacity-mgmt-frontend/src/index.js @@ -24,20 +24,36 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import reportWebVitals from './reportWebVitals'; import {BrowserRouter as Router, Route,Routes } from "react-router-dom"; -import Home from "./components/Home"; +import Home from "./components/CapacityGroupPage"; -const root = ReactDOM.createRoot(document.getElementById('root')); -root.render( - - +//Import Default always visible components. +import TopMenu from "./components/TopMenu"; +import QuickAcessItems from "./components/QuickAcessItems"; - } /> +//Import Context Providers +import CapacityGroupContext from "../src/contexts/CapacityGroupsContextProvider"; +import DemandContextProvider from "../src/contexts/DemandContextProvider"; +// Import your components for different routes +import CapacityGroupsList from "./components/defaultview/CapacityGroupsView"; - - +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( +<> + + + + } /> + + + + + + + + ); diff --git a/demand-capacity-mgmt-frontend/yarn.lock b/demand-capacity-mgmt-frontend/yarn.lock index 5097e9fd..dd1c297b 100644 --- a/demand-capacity-mgmt-frontend/yarn.lock +++ b/demand-capacity-mgmt-frontend/yarn.lock @@ -1768,10 +1768,10 @@ invariant "^2.2.4" nullthrows "^1.1.1" -"@remix-run/router@1.7.1": - version "1.7.1" - resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.7.1.tgz" - integrity sha512-bgVQM4ZJ2u2CM8k1ey70o1ePFXsEzYVZoWghh6WjM8p59jQ7HxzbHW4SbnWFG7V9ig9chLawQxDTZ3xzOF8MkQ== +"@remix-run/router@1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.7.2.tgz#cba1cf0a04bc04cb66027c51fa600e9cbc388bc8" + integrity sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A== "@restart/hooks@^0.4.9": version "0.4.9" @@ -5662,18 +5662,7 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy-middleware@^2.0.6: +http-proxy-middleware@^2.0.3, http-proxy-middleware@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== @@ -8706,20 +8695,20 @@ react-refresh@^0.11.0: resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz" integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== -react-router-dom@^6.14.1: - version "6.14.1" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.1.tgz" - integrity sha512-ssF6M5UkQjHK70fgukCJyjlda0Dgono2QGwqGvuk7D+EDGHdacEN3Yke2LTMjkrpHuFwBfDFsEjGVXBDmL+bWw== +react-router-dom@^6.14.2: + version "6.14.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.14.2.tgz#88f520118b91aa60233bd08dbd3fdcaea3a68488" + integrity sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg== dependencies: - "@remix-run/router" "1.7.1" - react-router "6.14.1" + "@remix-run/router" "1.7.2" + react-router "6.14.2" -react-router@6.14.1: - version "6.14.1" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.14.1.tgz" - integrity sha512-U4PfgvG55LdvbQjg5Y9QRWyVxIdO1LlpYT7x+tMAxd9/vmiPuJhIwdxZuIQLN/9e3O4KFDHYfR9gzGeYMasW8g== +react-router@6.14.2: + version "6.14.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.14.2.tgz#1f60994d8c369de7b8ba7a78d8f7ec23df76b300" + integrity sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ== dependencies: - "@remix-run/router" "1.7.1" + "@remix-run/router" "1.7.2" react-scripts@^5.0.1: version "5.0.1" From f6b2700c5a034247442402c1fecaaa859103592d Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Fri, 28 Jul 2023 17:38:13 +0100 Subject: [PATCH 29/62] Code Organized --- .../src/components/QuickAcessItems.tsx | 2 +- .../defaultview/CapacityGroupsView.tsx | 2 +- .../{AddForm.tsx => demands/DemandAddForm.tsx} | 16 ++++++++-------- .../{ => demands}/DemandCategoryOptions.tsx | 2 +- .../{EditForm.tsx => demands/DemandEditForm.tsx} | 4 ++-- .../src/components/{ => demands}/DemandPage.tsx | 12 ++++++------ .../components/{ => demands}/DemandsTable.tsx | 0 demand-capacity-mgmt-frontend/src/index.js | 4 ++-- 8 files changed, 21 insertions(+), 21 deletions(-) rename demand-capacity-mgmt-frontend/src/components/{AddForm.tsx => demands/DemandAddForm.tsx} (95%) rename demand-capacity-mgmt-frontend/src/components/{ => demands}/DemandCategoryOptions.tsx (95%) rename demand-capacity-mgmt-frontend/src/components/{EditForm.tsx => demands/DemandEditForm.tsx} (96%) rename demand-capacity-mgmt-frontend/src/components/{ => demands}/DemandPage.tsx (96%) rename demand-capacity-mgmt-frontend/src/components/{ => demands}/DemandsTable.tsx (100%) diff --git a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx index 21925261..d7abeeb5 100644 --- a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx +++ b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx @@ -22,7 +22,7 @@ import {AiOutlineStock, AiOutlineLink} from 'react-icons/ai'; import { Modal, Button } from 'react-bootstrap'; import { useState } from 'react'; -import DemandsPage from './DemandPage'; +import DemandsPage from './demands/DemandPage'; import DemandContextProvider from '../contexts/DemandContextProvider'; function QuickAcessItems() { diff --git a/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsView.tsx b/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsView.tsx index e7788a0d..b3e0c031 100644 --- a/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsView.tsx +++ b/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsView.tsx @@ -24,7 +24,7 @@ import React, { useContext, useState, useMemo, useCallback } from 'react'; import { Modal, Button,Form,Col,Row } from 'react-bootstrap'; import { CapacityGroupContext } from '../../contexts/CapacityGroupsContextProvider'; import { CapacityGroup } from '../../interfaces/capacitygroup_interfaces'; -import AddForm from '../AddForm'; +import AddForm from '../demands/DemandAddForm'; import Pagination from '../Pagination'; import CapacityGroupsTable from './CapacityGroupsTable'; import Search from '../Search'; diff --git a/demand-capacity-mgmt-frontend/src/components/AddForm.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx similarity index 95% rename from demand-capacity-mgmt-frontend/src/components/AddForm.tsx rename to demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx index b6263d33..06345ff5 100644 --- a/demand-capacity-mgmt-frontend/src/components/AddForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx @@ -22,15 +22,15 @@ import React, { useContext, useState, ChangeEvent, FormEvent } from 'react'; import { Form, Button, Row,Col } from 'react-bootstrap'; -import { DemandContext } from '../contexts/DemandContextProvider'; -import DemandCategoryContextProvider from '../contexts/DemandCategoryProvider'; +import { DemandContext } from '../../contexts/DemandContextProvider'; +import DemandCategoryContextProvider from '../../contexts/DemandCategoryProvider'; import DemandCategoryOptions from './DemandCategoryOptions'; -import CompanyContextProvider from '../contexts/CompanyContextProvider'; -import CompanyOptions from './CompanyOptions'; -import UnitsofMeasureContextContextProvider from '../contexts/UnitsOfMeasureContextProvider'; -import UnitsOfMeasureOptions from './UnitsofMeasureOptions'; -import {Demand} from '../interfaces/demand_interfaces'; -import '../App.css'; +import CompanyContextProvider from '../../contexts/CompanyContextProvider'; +import CompanyOptions from '../CompanyOptions'; +import UnitsofMeasureContextContextProvider from '../../contexts/UnitsOfMeasureContextProvider'; +import UnitsOfMeasureOptions from '../UnitsofMeasureOptions'; +import {Demand} from '../../interfaces/demand_interfaces'; +import '../../App.css'; const getMondaysBetweenDates = (startDate: Date, endDate: Date): string[] => { const mondays: string[] = []; diff --git a/demand-capacity-mgmt-frontend/src/components/DemandCategoryOptions.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandCategoryOptions.tsx similarity index 95% rename from demand-capacity-mgmt-frontend/src/components/DemandCategoryOptions.tsx rename to demand-capacity-mgmt-frontend/src/components/demands/DemandCategoryOptions.tsx index 646d5d51..b00d09b2 100644 --- a/demand-capacity-mgmt-frontend/src/components/DemandCategoryOptions.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandCategoryOptions.tsx @@ -21,7 +21,7 @@ */ import React, { useContext } from 'react'; -import { DemandCategoryContext} from '../contexts/DemandCategoryProvider'; +import { DemandCategoryContext} from '../../contexts/DemandCategoryProvider'; const DemandCategoryOptions: React.FC = () => { const demandCategoryContextData = useContext(DemandCategoryContext); diff --git a/demand-capacity-mgmt-frontend/src/components/EditForm.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx similarity index 96% rename from demand-capacity-mgmt-frontend/src/components/EditForm.tsx rename to demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx index 6e5aa86c..8b96ceb2 100644 --- a/demand-capacity-mgmt-frontend/src/components/EditForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx @@ -22,8 +22,8 @@ import React, { useContext, useState, useEffect } from 'react'; import { Form, Button, Col,Row} from 'react-bootstrap'; -import { DemandContext} from '../contexts/DemandContextProvider'; -import { Demand } from '../interfaces/demand_interfaces'; +import { DemandContext} from '../../contexts/DemandContextProvider'; +import { Demand } from '../../interfaces/demand_interfaces'; interface EditFormProps { theDemand: Demand; diff --git a/demand-capacity-mgmt-frontend/src/components/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx similarity index 96% rename from demand-capacity-mgmt-frontend/src/components/DemandPage.tsx rename to demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index 4c678ddf..f0a7489f 100644 --- a/demand-capacity-mgmt-frontend/src/components/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -12,14 +12,14 @@ import React, { useContext, useState, useMemo, useCallback } from 'react'; import { Modal, Button,Form,Col,Row, Toast, ToastContainer } from 'react-bootstrap'; -import { DemandContext } from '../contexts/DemandContextProvider'; -import { DemandProp } from '../interfaces/demand_interfaces'; -import Pagination from './Pagination'; +import { DemandContext } from '../../contexts/DemandContextProvider'; +import { DemandProp } from '../../interfaces/demand_interfaces'; +import Pagination from '../Pagination'; import DemandsTable from './DemandsTable'; -import DemandsSearch from './Search'; -import EditForm from './EditForm'; +import DemandsSearch from '../Search'; +import EditForm from './DemandEditForm'; import { FcCancel } from 'react-icons/fc'; -import AddForm from './AddForm'; +import AddForm from './DemandAddForm'; const DemandsPage: React.FC = () => { diff --git a/demand-capacity-mgmt-frontend/src/components/DemandsTable.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx similarity index 100% rename from demand-capacity-mgmt-frontend/src/components/DemandsTable.tsx rename to demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx diff --git a/demand-capacity-mgmt-frontend/src/index.js b/demand-capacity-mgmt-frontend/src/index.js index 0b54bf70..7dba7079 100644 --- a/demand-capacity-mgmt-frontend/src/index.js +++ b/demand-capacity-mgmt-frontend/src/index.js @@ -24,7 +24,7 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import reportWebVitals from './reportWebVitals'; import {BrowserRouter as Router, Route,Routes } from "react-router-dom"; -import Home from "./components/CapacityGroupPage"; + //Import Default always visible components. @@ -32,10 +32,10 @@ import TopMenu from "./components/TopMenu"; import QuickAcessItems from "./components/QuickAcessItems"; //Import Context Providers -import CapacityGroupContext from "../src/contexts/CapacityGroupsContextProvider"; import DemandContextProvider from "../src/contexts/DemandContextProvider"; // Import your components for different routes +import Home from "./components/defaultview/CapacityGroupPage"; import CapacityGroupsList from "./components/defaultview/CapacityGroupsView"; const root = ReactDOM.createRoot(document.getElementById('root')); From 63d4d7b6343afaa9426c3666899a2c5f306c2afd Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Mon, 31 Jul 2023 17:27:54 +0100 Subject: [PATCH 30/62] CapacityGroupDetails Page with buttons and Tabs + React Router --- .../src/components/CapacityGroupDetails.tsx | 2 +- .../CapacityGroupDetailsPage.tsx | 100 ++++++++++++++++++ .../CapacityGroupPage.tsx | 0 .../CapacityGroupsModal.tsx | 0 .../CapacityGroupsTable.tsx | 0 .../CapacityGroupsView.tsx | 0 demand-capacity-mgmt-frontend/src/index.js | 6 +- 7 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx rename demand-capacity-mgmt-frontend/src/components/{defaultview => capacitygroup}/CapacityGroupPage.tsx (100%) rename demand-capacity-mgmt-frontend/src/components/{defaultview => capacitygroup}/CapacityGroupsModal.tsx (100%) rename demand-capacity-mgmt-frontend/src/components/{defaultview => capacitygroup}/CapacityGroupsTable.tsx (100%) rename demand-capacity-mgmt-frontend/src/components/{defaultview => capacitygroup}/CapacityGroupsView.tsx (100%) diff --git a/demand-capacity-mgmt-frontend/src/components/CapacityGroupDetails.tsx b/demand-capacity-mgmt-frontend/src/components/CapacityGroupDetails.tsx index afda5c22..7320dc88 100644 --- a/demand-capacity-mgmt-frontend/src/components/CapacityGroupDetails.tsx +++ b/demand-capacity-mgmt-frontend/src/components/CapacityGroupDetails.tsx @@ -20,7 +20,7 @@ * ******************************************************************************** */ -import CapacityGroupsList from "./defaultview/CapacityGroupsView"; +import CapacityGroupsList from "./capacitygroup/CapacityGroupsView"; import CapacityGroupContext from "../contexts/CapacityGroupsContextProvider"; function CapacityGroupDetails() { diff --git a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx new file mode 100644 index 00000000..39ca58bb --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx @@ -0,0 +1,100 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + +import { useState } from 'react'; +import { Tab, Tabs, ButtonGroup, Button, ToggleButton } from 'react-bootstrap'; + +function CapacityGroupDetailsPage() { + const [editMode, setEditMode] = useState(false); + const [savedChanges, setSavedChanges] = useState(false); + const [activeTab, setActiveTab] = useState('overview'); + + const handleSave = () => { + // Perform save operation here + setEditMode(false); + setSavedChanges(true); + }; + + const handleRevert = () => { + // Revert changes here + setEditMode(false); + setSavedChanges(false); + }; + + + return ( + <> +
+
+
+
+
+ UUID - CapacityGroupName +
+
+
+ {activeTab === 'overview' && ( + + setEditMode(!editMode)} + > + Edit + + + + + )} +
+
+ setActiveTab(tabKey)} + > + + Element for Overview and chronogram here + + + Materials Table here + + + Pre filtered event list here + + +
+ + ); +} + +export default CapacityGroupDetailsPage; diff --git a/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupPage.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupPage.tsx similarity index 100% rename from demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupPage.tsx rename to demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupPage.tsx diff --git a/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsModal.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsModal.tsx similarity index 100% rename from demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsModal.tsx rename to demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsModal.tsx diff --git a/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsTable.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsTable.tsx similarity index 100% rename from demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsTable.tsx rename to demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsTable.tsx diff --git a/demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsView.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx similarity index 100% rename from demand-capacity-mgmt-frontend/src/components/defaultview/CapacityGroupsView.tsx rename to demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx diff --git a/demand-capacity-mgmt-frontend/src/index.js b/demand-capacity-mgmt-frontend/src/index.js index 7dba7079..1d6c3255 100644 --- a/demand-capacity-mgmt-frontend/src/index.js +++ b/demand-capacity-mgmt-frontend/src/index.js @@ -35,8 +35,8 @@ import QuickAcessItems from "./components/QuickAcessItems"; import DemandContextProvider from "../src/contexts/DemandContextProvider"; // Import your components for different routes -import Home from "./components/defaultview/CapacityGroupPage"; -import CapacityGroupsList from "./components/defaultview/CapacityGroupsView"; +import Home from "./components/capacitygroup/CapacityGroupPage"; +import CapacityGroupDetailsPage from './components/capacitygroup/CapacityGroupDetailsPage'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( @@ -46,7 +46,7 @@ root.render( } /> - + } /> From 3468e0c6f1d81b0ccc10f8661a2f6c208634f03c Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Tue, 1 Aug 2023 15:20:02 +0100 Subject: [PATCH 31/62] Button name change --- .../src/components/capacitygroup/CapacityGroupDetailsPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx index 39ca58bb..f817e121 100644 --- a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx @@ -65,10 +65,10 @@ function CapacityGroupDetailsPage() { > Edit - - From cfd464a3cf02e3fb9279c80a2d9805e4d96427ab Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Wed, 2 Aug 2023 18:50:28 +0100 Subject: [PATCH 32/62] Listing and On Submit message --- .../src/components/QuickAcessItems.tsx | 45 +- .../src/components/demands/DemandAddForm.tsx | 416 ++++++++++-------- .../src/components/demands/DemandPage.tsx | 64 +-- .../src/components/demands/DemandsTable.tsx | 14 +- .../contexts/DemandPropContextProvider.tsx | 63 +++ demand-capacity-mgmt-frontend/src/index.js | 3 +- .../src/interfaces/customer_interfaces.tsx | 17 +- .../src/interfaces/demand_interfaces.tsx | 28 +- .../src/interfaces/supplier_interfaces.tsx | 18 +- 9 files changed, 390 insertions(+), 278 deletions(-) create mode 100644 demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx diff --git a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx index d7abeeb5..4dd71493 100644 --- a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx +++ b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx @@ -24,6 +24,7 @@ import { Modal, Button } from 'react-bootstrap'; import { useState } from 'react'; import DemandsPage from './demands/DemandPage'; import DemandContextProvider from '../contexts/DemandContextProvider'; +import DemandPropContextProvider from '../contexts/DemandPropContextProvider'; function QuickAcessItems() { @@ -39,27 +40,29 @@ function QuickAcessItems() {
- - - Demand Management View - - - - - - - - - - + + + + Demand Management View + + + + + + + + + + + ); } diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx index 06345ff5..c5bd0292 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx @@ -20,8 +20,8 @@ * ******************************************************************************** */ -import React, { useContext, useState, ChangeEvent, FormEvent } from 'react'; -import { Form, Button, Row,Col } from 'react-bootstrap'; +import React, { useContext, useState, ChangeEvent, FormEvent, useCallback } from 'react'; +import { Form, Button, Row, Col } from 'react-bootstrap'; import { DemandContext } from '../../contexts/DemandContextProvider'; import DemandCategoryContextProvider from '../../contexts/DemandCategoryProvider'; import DemandCategoryOptions from './DemandCategoryOptions'; @@ -29,7 +29,7 @@ import CompanyContextProvider from '../../contexts/CompanyContextProvider'; import CompanyOptions from '../CompanyOptions'; import UnitsofMeasureContextContextProvider from '../../contexts/UnitsOfMeasureContextProvider'; import UnitsOfMeasureOptions from '../UnitsofMeasureOptions'; -import {Demand} from '../../interfaces/demand_interfaces'; +import { Demand } from '../../interfaces/demand_interfaces'; import '../../App.css'; const getMondaysBetweenDates = (startDate: Date, endDate: Date): string[] => { @@ -49,63 +49,101 @@ const getMondaysBetweenDates = (startDate: Date, endDate: Date): string[] => { return mondays; }; -const AddForm: React.FC = () => { +const useHandleSubmit = (initialFormState: Demand) => { const { createDemand } = useContext(DemandContext)!; + const [submissionStatus, setSubmissionStatus] = useState<'idle' | 'submitting' | 'submitted'>('idle'); + + const handleSubmit = useCallback(async (formState: Demand) => { + + // Utility function to calculate the Mondays between the start and end dates + const calculateDemandSeriesValues = (startDate: Date, endDate: Date) => { + const mondays = getMondaysBetweenDates(startDate, endDate); + const values = mondays.map((monday) => ({ + calendarWeek: monday, + demand: 0, + })); + return values; + }; + + const startDateInput = document.querySelector('#startDate'); + const endDateInput = document.querySelector('#endDate'); + + if (startDateInput && endDateInput) { + const startDateObj = new Date(startDateInput.value); + const endDateObj = new Date(endDateInput.value); + + const calculatedValues = calculateDemandSeriesValues(startDateObj, endDateObj); + + // Build the materialDemandSeries object + const materialDemandSeries = { + customerLocationId: formState.customerId, + expectedSupplierLocationId: [formState.supplierId], + demandCategoryId: formState.materialDemandSeries[0].demandCategoryId, + demandSeriesValues: calculatedValues, + }; + // Build the final demand object + const demand = { + id: formState.id, + materialDescriptionCustomer: formState.materialDescriptionCustomer, + materialNumberCustomer: formState.materialNumberCustomer, + materialNumberSupplier: formState.materialNumberSupplier, + customerId: formState.customerId, + supplierId: formState.supplierId, + unitMeasureId: formState.unitMeasureId, + materialDemandSeries: [materialDemandSeries], // Wrap materialDemandSeries in an array + }; + + try { + setSubmissionStatus('submitting'); // Set the submission status to 'submitting' while the API call is in progress + + await createDemand(demand); + setSubmissionStatus('submitted'); // Set the submission status to 'submitted' if the API call is successful + } catch (error) { + console.error('Error creating demand:', error); + setSubmissionStatus('idle'); // Set the submission status back to 'idle' if the API call fails + // Handle error if needed + } + } + }, []); + + return { submissionStatus, handleSubmit }; +}; + +const AddForm: React.FC = () => { const initialFormState: Demand = { id: '', materialDescriptionCustomer: '', materialNumberCustomer: '', materialNumberSupplier: '', - startDate:'', - endDate:'', - customerId: '5d210fb8-260d-4190-9578-f62f9c459703', //Id do submiter TODO + customerId: 'e1abe001-4e24-471f-9b66-a4b3408e3bf6', supplierId: '', - unitMeasureId: '', - materialDemandSeries: { - customerLocationId: '5d210fb8-260d-4190-9578-f62f9c459703', //In this case im the customer so its my ID - expectedSupplierLocationId: [], - demandCategoryId: '', - demandSeriesValues: [] - } + unitMeasureId: '6d923b18-2a57-47d5-a769-b8fde475c355', + materialDemandSeries: [ + { + customerLocationId: 'e1abe001-4e24-471f-9b66-a4b3408e3bf6', + expectedSupplierLocationId: [], + demandCategoryId: '1d185139-0d50-4bb6-9780-b1587da8e7f5', + demandSeriesValues: [], + }, + ], }; const [formState, setFormState] = useState(initialFormState); - const [demandSeriesValues, setDemandSeriesValues] = useState<{ calendarWeek: string; demand: number }[]>([]); - - // Utility function to calculate the Mondays between the start and end dates - const calculateDemandSeriesValues = (startDate: Date, endDate: Date) => { - const mondays = getMondaysBetweenDates(startDate, endDate); - const values = mondays.map((monday) => ({ - calendarWeek: monday, - demand: 0, - })); - return values; - }; - + const [showSuccessMessage, setShowSuccessMessage] = useState(false); // New state to handle the success message + const { submissionStatus, handleSubmit } = useHandleSubmit(initialFormState); - const handleSubmit = (e: FormEvent) => { + const handleFormSubmit = async (e: FormEvent) => { e.preventDefault(); - - const startDateObj = new Date(formState.startDate); - const endDateObj = new Date(formState.endDate); - if (startDateObj && endDateObj) { - const calculatedValues = calculateDemandSeriesValues(startDateObj, endDateObj); - // Call createDemand after setting the demandSeriesValues - createDemand({ ...formState, materialDemandSeries: { ...formState.materialDemandSeries, demandSeriesValues: calculatedValues } }); - } + await handleSubmit(formState); + setShowSuccessMessage(true); }; - -{/* const resetForm = () => { - setFormState(initialFormState); - };*/} - const onInputChange = (e: ChangeEvent) => { const { name, value } = e.target; setFormState((prevFormState) => ({ ...prevFormState, - [name]: value + [name]: value, })); }; @@ -115,18 +153,22 @@ const AddForm: React.FC = () => { setFormState((prevFormState) => ({ ...prevFormState, supplierId: value, // Update supplierId in the top-level formState - materialDemandSeries: { - ...prevFormState.materialDemandSeries, - expectedSupplierLocationId: [value], // Fill the expectedSupplierLocationId array with the value of supplierId - }, + materialDemandSeries: [ + { + ...prevFormState.materialDemandSeries[0], + expectedSupplierLocationId: [value], // Fill the expectedSupplierLocationId array with the value of supplierId + }, + ], })); } else if (name === 'demandCategoryId') { setFormState((prevFormState) => ({ ...prevFormState, - materialDemandSeries: { - ...prevFormState.materialDemandSeries, - demandCategoryId: value, // Ensure demandCategoryId is set properly - }, + materialDemandSeries: [ + { + ...prevFormState.materialDemandSeries[0], + demandCategoryId: value, // Ensure demandCategoryId is set properly + }, + ], })); } else { setFormState((prevFormState) => ({ @@ -142,156 +184,164 @@ const AddForm: React.FC = () => { nextMonday.setDate(today.getDate() + ((1 + 7 - today.getDay()) % 7)); return nextMonday; }; - + const [startDateValid, setStartDateValid] = useState(true); const [endDateValid, setEndDateValid] = useState(true); - + const onStartDateChange = (e: ChangeEvent) => { - const selectedDate = new Date(e.target.value); - setStartDateValid(selectedDate.getDay() === 1); + const selectedStartDate = new Date(e.target.value); + setStartDateValid(selectedStartDate.getDay() === 1); setEndDateValid(true); setFormState((prevFormState) => ({ ...prevFormState, [e.target.name]: e.target.value, })); }; - + const onEndDateChange = (e: ChangeEvent) => { - const selectedDate = new Date(e.target.value); - setEndDateValid(selectedDate.getDay() === 1 && selectedDate >= new Date(formState.startDate)); + const selectedEndDate = new Date(e.target.value); + setEndDateValid(selectedEndDate.getDay() === 1 && selectedEndDate >= new Date(e.target.value)); setFormState((prevFormState) => ({ ...prevFormState, [e.target.name]: e.target.value, })); }; - + return ( - - - - Start Date - - - Please select a Monday for the Start Date. - - - - End Date - - - End Date has to be a Monday after Start Date. - - - - - - - Unit of Measure - - - - - - - - - Supplier - - - - - - - - - - Demand Category - - - - - - - - - Material Number Customer - - - - - Material Number Supplier - - - - - Description - - - - - - + <> + {showSuccessMessage && submissionStatus === 'submitted' ? ( +
+ Material demand has been created! + Please reach to the Overview to adjust the demand. +
+ ) : ( +
+ + + Start Date + + Please select a Monday for the Start Date. + + + End Date + + End Date has to be a Monday after Start Date. + + + + + + Unit of Measure + + + + + + + + + Supplier + + + + + + + + + Demand Category + + + + + + + + + Material Number Customer + + + + + Material Number Supplier + + + + + Description + + + + +
+ )} + ); }; diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index f0a7489f..f503f777 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -10,32 +10,32 @@ * SPDX-License-Identifier: Apache-2.0 */ -import React, { useContext, useState, useMemo, useCallback } from 'react'; -import { Modal, Button,Form,Col,Row, Toast, ToastContainer } from 'react-bootstrap'; -import { DemandContext } from '../../contexts/DemandContextProvider'; -import { DemandProp } from '../../interfaces/demand_interfaces'; +import React, { useContext, useState, useMemo ,useCallback} from 'react'; +import { Modal, Button, Form, Col, Row } from 'react-bootstrap'; +import { DemandPropContext } from '../../contexts/DemandPropContextProvider'; +import { Demand, DemandProp } from '../../interfaces/demand_interfaces'; import Pagination from '../Pagination'; import DemandsTable from './DemandsTable'; import DemandsSearch from '../Search'; import EditForm from './DemandEditForm'; import { FcCancel } from 'react-icons/fc'; import AddForm from './DemandAddForm'; - +import { DemandContext } from '../../contexts/DemandContextProvider'; const DemandsPage: React.FC = () => { const [showEditModal, setShowEditModal] = useState(false); const [showAddModal, setShowAddModal] = useState(false); - const [selectedDemand, setSelectedDemand] = useState(null); - const { demands, deleteDemand } = useContext(DemandContext)!; //HERE - + const [selectedDemand, setSelectedDemand] = useState(null); + const { demands, deleteDemand } = useContext(DemandContext)!; + const { demandprops } = useContext(DemandPropContext)!; const [searchQuery, setSearchQuery] = useState(''); const [currentPage, setCurrentPage] = useState(1); - const [sortColumn, setSortColumn] = useState(''); + const [sortColumn, setSortColumn] = useState(null); const [sortOrder, setSortOrder] = useState(''); - const [demandsPerPage, setDemandsPerPage] = useState(5); // Set the default value here + const [demandsPerPage, setDemandsPerPage] = useState(5); - const handleSort = (column: string) => { + const handleSort = (column: keyof DemandProp) => { // Adjust the parameter type here if (sortColumn === column) { // If the same column is clicked again, toggle the sort order setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc'); @@ -57,52 +57,56 @@ const DemandsPage: React.FC = () => { [deleteDemand] ); - const handleEdit = (demand: DemandProp) => { + const handleEdit = (demand: Demand) => { + //GetDemand with demand ID TODO setSelectedDemand(demand); setShowEditModal(true); }; const handleCloseEdit = () => setShowEditModal(false); const handleCloseAdd = () => setShowAddModal(false); + const filteredDemands = useMemo(() => { - let sortedDemands = [...demands]; + let sortedDemands = [...demandprops]; if (searchQuery !== '') { sortedDemands = sortedDemands.filter((demand) => demand.materialDescriptionCustomer.toLowerCase().includes(searchQuery.toLowerCase()) || demand.id.toString().includes(searchQuery.toLowerCase()) || - demand.customerId.toString().includes(searchQuery.toLowerCase())|| - demand.materialDemandSeries.demandCategoryId.toString().includes(searchQuery.toLowerCase())|| - demand.materialNumberCustomer.toString().includes(searchQuery.toLowerCase()) + demand.customer.id.toString().includes(searchQuery.toLowerCase()) || + demand.materialNumberCustomer.toString().includes(searchQuery.toLowerCase()) || + demand.materialNumberSupplier.toString().includes(searchQuery.toLowerCase()) ); } - if (sortColumn !== '') { + if (sortColumn) { sortedDemands.sort((a, b) => { const aValue = a[sortColumn]; const bValue = b[sortColumn]; - - if (typeof aValue === 'string') { + + if (typeof aValue === 'string' && typeof bValue === 'string') { // Sort strings alphabetically return aValue.localeCompare(bValue, undefined, { sensitivity: 'base' }); - } else if (typeof aValue === 'number') { + } else if (typeof aValue === 'number' && typeof bValue === 'number') { // Sort numbers numerically return aValue - bValue; } - + + // If the types are not string or number, return 0 (no sorting) return 0; }); - + if (sortOrder === 'desc') { // Reverse the array if the sort order is descending sortedDemands.reverse(); } } + return sortedDemands; - }, [demands, searchQuery, sortColumn, sortOrder]); + }, [demandprops, searchQuery, sortColumn, sortOrder]); const slicedDemands = useMemo(() => { const indexOfLastDemand = currentPage * demandsPerPage; @@ -120,13 +124,15 @@ const DemandsPage: React.FC = () => { slicedDemands.map((demand) => (
Details{demand.id}{demand.customerId}{demand.customer.id} {demand.materialNumberCustomer}{demand.materialDemandSeries?.demandCategoryId}{demand.materialNumberSupplier}{demand.demandSeries?.demandCategory} {demand.materialDescriptionCustomer}{demand.startDate.split('T')[0]}{demand.endDate.split('T')[0]}{demand ? demand.startDate.split('T')[0] : ''}{demand.endDate ? demand.endDate.split('T')[0] : ''} {/* TODO Depending on status, this should be a different span*/} OK @@ -137,7 +143,7 @@ const DemandsPage: React.FC = () => { - +
- - + -
- - handleSort('id')}> Id {sortColumn === 'id' && } handleSort('companyId')}> Company Id {sortColumn === 'companyId' && } handleSort('materialNumber')}> - Material Number {sortColumn === 'materialNumber' && } + handleSort('materialNumberCustomer')}> + Material No. Customer {sortColumn === 'materialNumberCustomer' && } + handleSort('materialNumberSupplier')}> + Material No. Supplier {sortColumn === 'materialNumberSupplier' && } handleSort('demandCategoryCode')}> - Demand Cat. Code{sortColumn === 'demandCategoryCode' && } + handleSort('demandCategory')}> + Demand cat.{sortColumn === 'demandCategory' && } handleSort('description')}> Description {sortColumn === 'description' && } diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx new file mode 100644 index 00000000..9d0a55a1 --- /dev/null +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx @@ -0,0 +1,63 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ +import React, { createContext, useState, useEffect } from 'react'; +import axios from 'axios'; +import { DemandProp } from '../interfaces/demand_interfaces'; + + +interface DemandPropContextData { + demandprops: DemandProp[]; +} + +export const DemandPropContext = createContext(undefined); + +const DemandPropContextProvider: React.FC> = (props) => { + + const [demandprops, setDemands] = useState([]); + + useEffect(() => { + const fetchDemands = async () => { + try { + const response = await axios.get('/demand', { + params: { + project_id: 1, // Adjust the project ID parameter as needed + }, + }); + const result: DemandProp[] = response.data; + setDemands(result); + } catch (error) { + console.error('Error fetching demands:', error); + } + }; + + fetchDemands(); + }, []); + + + return ( + + {props.children} + + ); +}; + +export default DemandPropContextProvider; diff --git a/demand-capacity-mgmt-frontend/src/index.js b/demand-capacity-mgmt-frontend/src/index.js index 1d6c3255..9e7bad32 100644 --- a/demand-capacity-mgmt-frontend/src/index.js +++ b/demand-capacity-mgmt-frontend/src/index.js @@ -37,6 +37,7 @@ import DemandContextProvider from "../src/contexts/DemandContextProvider"; // Import your components for different routes import Home from "./components/capacitygroup/CapacityGroupPage"; import CapacityGroupDetailsPage from './components/capacitygroup/CapacityGroupDetailsPage'; +import DemandPropContextProvider from './contexts/DemandPropContextProvider'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( @@ -52,7 +53,7 @@ root.render( - + ); diff --git a/demand-capacity-mgmt-frontend/src/interfaces/customer_interfaces.tsx b/demand-capacity-mgmt-frontend/src/interfaces/customer_interfaces.tsx index 78902e55..c26b5d3d 100644 --- a/demand-capacity-mgmt-frontend/src/interfaces/customer_interfaces.tsx +++ b/demand-capacity-mgmt-frontend/src/interfaces/customer_interfaces.tsx @@ -21,14 +21,15 @@ */ export interface Customer { - bpn: string - companyName: string - street: string - number: string - zipCode: string - country: string - myCompany: string - } + id: string + bpn: string + companyName: string + street: string + number: string + zipCode: string + country: string + myCompany: string +} export interface CustomerLocation { bpn: string diff --git a/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx b/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx index 13d38f33..1a9bbd71 100644 --- a/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx +++ b/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx @@ -26,18 +26,16 @@ import { ExpectedSupplierLocation, Supplier } from "./supplier_interfaces"; export interface Demand { id: string; - startDate:string, - endDate:string, materialDescriptionCustomer: string materialNumberCustomer: string materialNumberSupplier: string customerId: string supplierId: string unitMeasureId: string - materialDemandSeries: MaterialDemandSeries + materialDemandSeries: MaterialDemandSery[] } - export interface MaterialDemandSeries { + export interface MaterialDemandSery { customerLocationId: string expectedSupplierLocationId: string[] demandCategoryId: string @@ -51,36 +49,24 @@ export interface Demand { /* Demand List */ export interface DemandProp { - id: string; + id: string materialDescriptionCustomer: string materialNumberCustomer: string materialNumberSupplier: string customer: Customer supplier: Supplier - unitMeasureId: UnitMeasureId + unitMeasureId: any changedAt: string demandSeries: DemandSeries } - - export interface UnitMeasureId { - id: string - codeValue: string - displayValue: string - } - + export interface DemandSeries { customerLocation: CustomerLocation expectedSupplierLocation: ExpectedSupplierLocation[] - demandCategory: DemandCategory + demandCategory: string demandSeriesValues: DemandSeriesValue[] } - - export interface DemandCategory { - id: string - demandCategoryCode: string - demandCategoryName: string - } - + export interface DemandSeriesValue { calendarWeek: string demand: number diff --git a/demand-capacity-mgmt-frontend/src/interfaces/supplier_interfaces.tsx b/demand-capacity-mgmt-frontend/src/interfaces/supplier_interfaces.tsx index 0a5a3ebb..f4d6840d 100644 --- a/demand-capacity-mgmt-frontend/src/interfaces/supplier_interfaces.tsx +++ b/demand-capacity-mgmt-frontend/src/interfaces/supplier_interfaces.tsx @@ -20,14 +20,16 @@ * ******************************************************************************** */ export interface Supplier { - bpn: string - companyName: string - street: string - number: string - zipCode: string - country: string - myCompany: string - } + id: string + bpn: string + companyName: string + street: string + number: string + zipCode: string + country: string + myCompany: string +} + export interface ExpectedSupplierLocation { bpn: string From 14f99d0fa1d4f5cb3963a920ba4d5fae6e9fda0b Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Fri, 4 Aug 2023 13:32:36 +0100 Subject: [PATCH 33/62] Table Refresh Start --- .../src/components/demands/DemandAddForm.tsx | 15 ++++++++---- .../src/components/demands/DemandPage.tsx | 5 +++- .../src/components/demands/DemandsTable.tsx | 23 ++++++++++++++++--- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx index c5bd0292..7803aad1 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx @@ -32,6 +32,10 @@ import UnitsOfMeasureOptions from '../UnitsofMeasureOptions'; import { Demand } from '../../interfaces/demand_interfaces'; import '../../App.css'; +type AddFormProps = { + setRefreshTable: React.Dispatch>; +}; + const getMondaysBetweenDates = (startDate: Date, endDate: Date): string[] => { const mondays: string[] = []; const current = new Date(startDate); @@ -110,20 +114,20 @@ const useHandleSubmit = (initialFormState: Demand) => { return { submissionStatus, handleSubmit }; }; -const AddForm: React.FC = () => { +const AddForm: React.FC = ({ setRefreshTable }) => { const initialFormState: Demand = { id: '', materialDescriptionCustomer: '', materialNumberCustomer: '', materialNumberSupplier: '', - customerId: 'e1abe001-4e24-471f-9b66-a4b3408e3bf6', + customerId: 'e1abe001-4e24-471f-9b66-a4b3408e3bf6', //This is my current login ID supplierId: '', - unitMeasureId: '6d923b18-2a57-47d5-a769-b8fde475c355', + unitMeasureId: '', materialDemandSeries: [ { - customerLocationId: 'e1abe001-4e24-471f-9b66-a4b3408e3bf6', + customerLocationId: 'e1abe001-4e24-471f-9b66-a4b3408e3bf6', //This is my current login ID expectedSupplierLocationId: [], - demandCategoryId: '1d185139-0d50-4bb6-9780-b1587da8e7f5', + demandCategoryId: '', demandSeriesValues: [], }, ], @@ -136,6 +140,7 @@ const AddForm: React.FC = () => { const handleFormSubmit = async (e: FormEvent) => { e.preventDefault(); await handleSubmit(formState); + setRefreshTable(true); setShowSuccessMessage(true); }; diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index f503f777..dc12359a 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -35,6 +35,8 @@ const DemandsPage: React.FC = () => { const [sortOrder, setSortOrder] = useState(''); const [demandsPerPage, setDemandsPerPage] = useState(5); + const [refreshTable, setRefreshTable] = useState(false); + const handleSort = (column: keyof DemandProp) => { // Adjust the parameter type here if (sortColumn === column) { // If the same column is clicked again, toggle the sort order @@ -173,6 +175,7 @@ const DemandsPage: React.FC = () => { sortOrder={sortOrder} handleSort={handleSort} demandItems={demandItems} + refreshTable={refreshTable} />
@@ -233,7 +236,7 @@ const DemandsPage: React.FC = () => { New Material Demand - + diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx index 605aaac4..982428ba 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx @@ -20,17 +20,34 @@ * ******************************************************************************** */ -import React from 'react'; - +import React, { useEffect, useState } from 'react'; type DemandsTableProps = { sortColumn: string; sortOrder: string; handleSort: (column: string) => void; demandItems: React.ReactNode; + refreshTable: boolean; // Add the refreshTable prop here }; -const DemandsTable: React.FC = ({ sortColumn, sortOrder, handleSort, demandItems }) => { +const DemandsTable: React.FC = ({ sortColumn, sortOrder, handleSort, demandItems, refreshTable }) => { + const [tableRefreshed, setTableRefreshed] = useState(false); + + // When the refreshTable prop changes, set the tableRefreshed state to true to trigger the refresh + useEffect(() => { + if (refreshTable) { + setTableRefreshed(true); + } + }, [refreshTable]); + + // Use the tableRefreshed state to re-render the table when it's set to true + useEffect(() => { + if (tableRefreshed) { + setTableRefreshed(false); // Reset the tableRefreshed state + } + }, [tableRefreshed]); + + return ( From ac6a58e2cb160d8ee9bf71ebcb75f7a3d82cd2cb Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Fri, 4 Aug 2023 16:07:09 +0100 Subject: [PATCH 34/62] Start Date end Date --- .../src/components/demands/DemandPage.tsx | 20 +++++++++++++------ .../src/interfaces/demand_interfaces.tsx | 5 ++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index dc12359a..49a48ca1 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -125,16 +125,24 @@ const DemandsPage: React.FC = () => { () => slicedDemands.map((demand) => ( - + - - - {/* - */} + + - + - + + - + {demand.demandSeries && demand.demandSeries.length > 0 && demand.demandSeries[0].demandSeriesValues && demand.demandSeries[0].demandSeriesValues.length > 0 + ? demand.demandSeries[0].demandSeriesValues[demand.demandSeries[0].demandSeriesValues.length - 1]?.calendarWeek?.split('T')[0] ?? 'N/A' + : 'N/A'} + )), @@ -183,7 +190,6 @@ const DemandsPage: React.FC = () => { sortOrder={sortOrder} handleSort={handleSort} demandItems={demandItems} - refreshTable={refreshTable} />
@@ -229,7 +235,13 @@ const DemandsPage: React.FC = () => { Edit - {selectedDemand && } + + + + {selectedDemand && } + + + @@ -244,7 +256,7 @@ const DemandsPage: React.FC = () => { New Material Demand - + diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx index 982428ba..d59ea624 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx @@ -27,33 +27,17 @@ type DemandsTableProps = { sortOrder: string; handleSort: (column: string) => void; demandItems: React.ReactNode; - refreshTable: boolean; // Add the refreshTable prop here }; -const DemandsTable: React.FC = ({ sortColumn, sortOrder, handleSort, demandItems, refreshTable }) => { - const [tableRefreshed, setTableRefreshed] = useState(false); - - // When the refreshTable prop changes, set the tableRefreshed state to true to trigger the refresh - useEffect(() => { - if (refreshTable) { - setTableRefreshed(true); - } - }, [refreshTable]); - - // Use the tableRefreshed state to re-render the table when it's set to true - useEffect(() => { - if (tableRefreshed) { - setTableRefreshed(false); // Reset the tableRefreshed state - } - }, [tableRefreshed]); +const DemandsTable: React.FC = ({ sortColumn, sortOrder, handleSort, demandItems }) => { return (
DetailsDetails {demand.customer.id} {demand.materialNumberCustomer} {demand.materialNumberSupplier} {demand.demandSeries?.demandCategory} {demand.materialDescriptionCustomer}{demand ? demand.startDate.split('T')[0] : ''}{demand.endDate ? demand.endDate.split('T')[0] : ''} + {demand.demandSeries?.demandSeriesValues?.length > 1 + ? demand.demandSeries.demandSeriesValues[0].calendarWeek + : 'N/A' + } + + {demand.demandSeries?.demandSeriesValues?.length > 0 + ? demand.demandSeries.demandSeriesValues[demand.demandSeries.demandSeriesValues.length - 1].calendarWeek + : 'N/A' + } + {/* TODO Depending on status, this should be a different span*/} OK @@ -236,7 +244,7 @@ const DemandsPage: React.FC = () => { New Material Demand - + diff --git a/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx b/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx index 1a9bbd71..4cd6680f 100644 --- a/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx +++ b/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx @@ -63,12 +63,11 @@ export interface Demand { export interface DemandSeries { customerLocation: CustomerLocation expectedSupplierLocation: ExpectedSupplierLocation[] - demandCategory: string + demandCategory: any demandSeriesValues: DemandSeriesValue[] } export interface DemandSeriesValue { calendarWeek: string demand: number - } - \ No newline at end of file + } \ No newline at end of file From 7cf5868438890f0331d71215b4c98b33e2b3df25 Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Fri, 4 Aug 2023 19:52:47 +0100 Subject: [PATCH 35/62] Error Fixing, Edit Form Preload, Delete, and Cleanup --- .../src/components/CompanyOptions.tsx | 34 ++-- .../src/components/QuickAcessItems.tsx | 7 + .../src/components/UnitsofMeasureOptions.tsx | 33 ++-- .../CapacityGroupDetailsPage.tsx | 6 +- .../capacitygroup/CapacityGroupsView.tsx | 2 +- .../src/components/demands/DemandAddForm.tsx | 12 +- .../demands/DemandCategoryOptions.tsx | 35 ++-- .../src/components/demands/DemandEditForm.tsx | 163 +++++++++++------- .../src/components/demands/DemandPage.tsx | 66 ++++--- .../src/components/demands/DemandsTable.tsx | 22 +-- .../src/contexts/DemandContextProvider.tsx | 4 +- .../contexts/DemandPropContextProvider.tsx | 41 +++-- .../UnitsOfMeasureContextProvider.tsx | 8 +- .../src/interfaces/demand_interfaces.tsx | 20 ++- 14 files changed, 261 insertions(+), 192 deletions(-) diff --git a/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx b/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx index d356fdc9..aa9f500d 100644 --- a/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx +++ b/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx @@ -23,24 +23,28 @@ import React, { useContext } from 'react'; import { CompanyContext } from '../contexts/CompanyContextProvider'; +interface CompanyOptionsProps { + selectedCompanyName: string; +} -const CompanyOptions: React.FC = () => { +const CompanyOptions: React.FC = ({ selectedCompanyName }) => { const companiesContextData = useContext(CompanyContext); - const { companies } = companiesContextData || {}; // Ensure context data is available + const { companies } = companiesContextData || {}; - // Use the demandcategories array to fill the options return ( -<> - - {companies && - companies.map((company) => ( - - ))} - + <> + + {companies && + companies.map((company) => ( + + ))} + ); }; - export default CompanyOptions; + +export default CompanyOptions; diff --git a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx index 4dd71493..6de5b6ab 100644 --- a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx +++ b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx @@ -25,9 +25,16 @@ import { useState } from 'react'; import DemandsPage from './demands/DemandPage'; import DemandContextProvider from '../contexts/DemandContextProvider'; import DemandPropContextProvider from '../contexts/DemandPropContextProvider'; +import { DemandProp } from '../interfaces/demand_interfaces'; function QuickAcessItems() { + const [demandprops, setDemandProps] = useState([]); + + const updateDemandProps = (updatedDemandProps: DemandProp[]) => { + setDemandProps(updatedDemandProps); + }; + const [show, setShow] = useState(false); const handleClose = () => setShow(false); diff --git a/demand-capacity-mgmt-frontend/src/components/UnitsofMeasureOptions.tsx b/demand-capacity-mgmt-frontend/src/components/UnitsofMeasureOptions.tsx index 882248b4..4d5240f1 100644 --- a/demand-capacity-mgmt-frontend/src/components/UnitsofMeasureOptions.tsx +++ b/demand-capacity-mgmt-frontend/src/components/UnitsofMeasureOptions.tsx @@ -23,24 +23,29 @@ import React, { useContext } from 'react'; import { UnitsofMeasureContext } from '../contexts/UnitsOfMeasureContextProvider'; +interface UnitsOfMeasureOptionsProps { + selectedUnitMeasureId: string; +} -const UnitsOfMeasureOptions: React.FC = () => { +const UnitsOfMeasureOptions: React.FC = ({ selectedUnitMeasureId }) => { const UnitsOfMeasureContextData = useContext(UnitsofMeasureContext); - const { unitsofmeasure } = UnitsOfMeasureContextData || {}; // Ensure context data is available + const { unitsofmeasure } = UnitsOfMeasureContextData || {}; // Use the demandcategories array to fill the options return ( -<> - - {demandcategories && - demandcategories.map((category) => ( - - ))} - + <> + + {demandcategories && + demandcategories.map((category) => ( + + ))} + ); }; - export default DemandCategoryOptions; + +export default DemandCategoryOptions; diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx index 8b96ceb2..f1879385 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx @@ -23,16 +23,19 @@ import React, { useContext, useState, useEffect } from 'react'; import { Form, Button, Col,Row} from 'react-bootstrap'; import { DemandContext} from '../../contexts/DemandContextProvider'; -import { Demand } from '../../interfaces/demand_interfaces'; +import { DemandProp} from '../../interfaces/demand_interfaces'; +import CompanyOptions from '../CompanyOptions'; +import DemandCategoryOptions from './DemandCategoryOptions'; +import UnitsOfMeasureOptions from '../UnitsofMeasureOptions'; +import { FiSave } from 'react-icons/fi'; interface EditFormProps { - theDemand: Demand; + theDemand: DemandProp; } const EditForm: React.FC = ({ theDemand }) => { const { updateDemand } = useContext(DemandContext)!; - - const [demand, setDemand] = useState(theDemand); + const [demand, setDemand] = useState(theDemand); useEffect(() => { setDemand(theDemand); @@ -40,78 +43,114 @@ const EditForm: React.FC = ({ theDemand }) => { const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - - if (demand.requiredValue <= 0) { - console.log('Required value must be greater than 0'); - return; - } - updateDemand(demand); - }; - const handleInputChange = (e: React.ChangeEvent) => { - const { name, value } = e.target; - setDemand((prevDemand) => ({ ...prevDemand, [name]: value })); + {/*updateDemand(demand);*/} //We need to map a demand prop to a demand }; return ( -
+ - - Start Date - + + Start Date + + Please select a Monday for the Start Date. - - End Date - + + End Date + + End Date has to be a Monday after Start Date. - + - - Required Value - - - - Delivered Value + + Unit of Measure + + + + + + + Supplier + + + + + + + Demand Category + + + + + + + Material Number Customer - - - Maximum Value - - - + type="text" + placeholder="Material Number" + id="materialNumberCustomer" + name="materialNumberCustomer" + defaultValue={demand.materialNumberCustomer} + required + /> - - Description - + + + Material Number Supplier + + + + Description + + + diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index 49a48ca1..968a6bcc 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -10,7 +10,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import React, { useContext, useState, useMemo ,useCallback} from 'react'; +import React, { useContext, useState, useMemo ,useCallback, useEffect} from 'react'; import { Modal, Button, Form, Col, Row } from 'react-bootstrap'; import { DemandPropContext } from '../../contexts/DemandPropContextProvider'; import { Demand, DemandProp } from '../../interfaces/demand_interfaces'; @@ -21,21 +21,24 @@ import EditForm from './DemandEditForm'; import { FcCancel } from 'react-icons/fc'; import AddForm from './DemandAddForm'; import { DemandContext } from '../../contexts/DemandContextProvider'; +import UnitsofMeasureContextContextProvider from '../../contexts/UnitsOfMeasureContextProvider'; +import DemandCategoryContextProvider from '../../contexts/DemandCategoryProvider'; +import CompanyContextProvider from '../../contexts/CompanyContextProvider'; const DemandsPage: React.FC = () => { const [showEditModal, setShowEditModal] = useState(false); const [showAddModal, setShowAddModal] = useState(false); const [selectedDemand, setSelectedDemand] = useState(null); const { demands, deleteDemand } = useContext(DemandContext)!; - const { demandprops } = useContext(DemandPropContext)!; + const { demandprops, fetchDemandProps } = useContext(DemandPropContext)!; // Make sure to get the fetchDemands function from the context. const [searchQuery, setSearchQuery] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [sortColumn, setSortColumn] = useState(null); const [sortOrder, setSortOrder] = useState(''); - const [demandsPerPage, setDemandsPerPage] = useState(5); - + const [demandsPerPage, setDemandsPerPage] = useState(5); //Only show 5 items by default const [refreshTable, setRefreshTable] = useState(false); + const [filteredDemands, setFilteredDemands] = useState([]); const handleSort = (column: keyof DemandProp) => { // Adjust the parameter type here if (sortColumn === column) { @@ -49,9 +52,10 @@ const DemandsPage: React.FC = () => { }; const handleDeleteDemand = useCallback( - async (id: number) => { + async (id: string) => { try { await deleteDemand(id); + fetchDemandProps(); } catch (error) { console.error('Error deleting demand:', error); } @@ -67,10 +71,8 @@ const DemandsPage: React.FC = () => { const handleCloseEdit = () => setShowEditModal(false); const handleCloseAdd = () => setShowAddModal(false); - - - const filteredDemands = useMemo(() => { + useMemo(() => { let sortedDemands = [...demandprops]; if (searchQuery !== '') { @@ -107,7 +109,7 @@ const DemandsPage: React.FC = () => { } - return sortedDemands; + setFilteredDemands(sortedDemands); }, [demandprops, searchQuery, sortColumn, sortOrder]); const slicedDemands = useMemo(() => { @@ -121,30 +123,35 @@ const DemandsPage: React.FC = () => { demandsPerPage, ]); + useEffect(() => { + setRefreshTable((prev) => !prev); + }, [demandprops]); + const demandItems = useMemo( () => slicedDemands.map((demand) => (
Details{demand.customer.id}{demand.customer.bpn} {demand.materialNumberCustomer} {demand.materialNumberSupplier}{demand.demandSeries?.demandCategory} + {demand.demandSeries && demand.demandSeries.length > 0 + ? demand.demandSeries[0].demandCategory?.demandCategoryName || 'N/A' + : 'N/A'} + {demand.materialDescriptionCustomer} + {demand.demandSeries && demand.demandSeries.length > 0 && demand.demandSeries[0].demandSeriesValues && demand.demandSeries[0].demandSeriesValues.length > 0 + ? demand.demandSeries[0].demandSeriesValues[0]?.calendarWeek?.split('T')[0] ?? 'N/A' + : 'N/A'} + - {demand.demandSeries?.demandSeriesValues?.length > 1 - ? demand.demandSeries.demandSeriesValues[0].calendarWeek - : 'N/A' - } - - {demand.demandSeries?.demandSeriesValues?.length > 0 - ? demand.demandSeries.demandSeriesValues[demand.demandSeries.demandSeriesValues.length - 1].calendarWeek - : 'N/A' - } - - {/* TODO Depending on status, this should be a different span*/} OK {/*Warning Danger*/} @@ -153,7 +160,7 @@ const DemandsPage: React.FC = () => { - +
-
handleSort('id')}> - Id {sortColumn === 'id' && } + + handleSort('companyId')}> Company Id {sortColumn === 'companyId' && } diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx index 7550cd5b..11348774 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx @@ -26,7 +26,7 @@ import { Demand } from '../interfaces/demand_interfaces'; interface DemandContextData { demands: Demand[]; - deleteDemand: (id: number) => Promise; + deleteDemand: (id: string) => Promise; createDemand: (newDemand: Demand) => Promise; updateDemand: (updatedDemand: Demand) => Promise; } @@ -56,7 +56,7 @@ const DemandContextProvider: React.FC> = (props) => }, []); - const deleteDemand = async (id: number) => { + const deleteDemand = async (id: string) => { try { await axios.delete(`/demand/${id}`); setDemands((prevDemands) => prevDemands.filter((demand) => demand.id !== id)); diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx index 9d0a55a1..6cdc4567 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx @@ -19,45 +19,44 @@ * SPDX-License-Identifier: Apache-2.0 * ******************************************************************************** */ -import React, { createContext, useState, useEffect } from 'react'; +import React, { createContext, useState, useEffect, useCallback } from 'react'; import axios from 'axios'; import { DemandProp } from '../interfaces/demand_interfaces'; - interface DemandPropContextData { demandprops: DemandProp[]; + fetchDemandProps: () => void; } export const DemandPropContext = createContext(undefined); const DemandPropContextProvider: React.FC> = (props) => { - const [demandprops, setDemands] = useState([]); - useEffect(() => { - const fetchDemands = async () => { - try { - const response = await axios.get('/demand', { - params: { - project_id: 1, // Adjust the project ID parameter as needed - }, - }); - const result: DemandProp[] = response.data; - setDemands(result); - } catch (error) { - console.error('Error fetching demands:', error); - } - }; - - fetchDemands(); + const fetchDemandProps = useCallback(async () => { + try { + const response = await axios.get('/demand', { + params: { + project_id: 1, // Adjust the project ID parameter as needed + }, + }); + const result: DemandProp[] = response.data; + setDemands(result); + } catch (error) { + console.error('Error fetching demands:', error); + } }, []); - + + useEffect(() => { + fetchDemandProps(); + }, [fetchDemandProps]); return ( - + {props.children} ); }; export default DemandPropContextProvider; + diff --git a/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx index 53fe5d44..bab46f01 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx @@ -29,8 +29,6 @@ export interface UnitMeasure { displayValue: string } - - interface UnitsOfMeasureContextData { unitsofmeasure: UnitMeasure[]; } @@ -44,10 +42,9 @@ const UnitsofMeasureContextContextProvider: React.FC useEffect(() => { const fetchUnitsofMeasure = async () => { try { - const response = await axios.get('/unitmeasure', { - - }); + const response = await axios.get('/unitmeasure'); const result: UnitMeasure[] = response.data; + console.log(result); // Check if data is received correctly setUnitsofMeasure(result); } catch (error) { console.error('Error fetching units of measure:', error); @@ -57,6 +54,7 @@ const UnitsofMeasureContextContextProvider: React.FC fetchUnitsofMeasure(); }, []); + return ( diff --git a/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx b/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx index 4cd6680f..467b628b 100644 --- a/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx +++ b/demand-capacity-mgmt-frontend/src/interfaces/demand_interfaces.tsx @@ -55,19 +55,31 @@ export interface Demand { materialNumberSupplier: string customer: Customer supplier: Supplier - unitMeasureId: any + unitMeasureId: UnitMeasureId changedAt: string - demandSeries: DemandSeries + demandSeries?: DemandSeries[] | undefined; } export interface DemandSeries { customerLocation: CustomerLocation expectedSupplierLocation: ExpectedSupplierLocation[] - demandCategory: any - demandSeriesValues: DemandSeriesValue[] + demandCategory: DemandCategory + demandSeriesValues: DemandSeriesValue[]; } export interface DemandSeriesValue { calendarWeek: string demand: number + } + + export interface DemandCategory { + id: string + demandCategoryCode: string + demandCategoryName: string + } + + export interface UnitMeasureId { + id: string + codeValue: string + displayValue: string } \ No newline at end of file From 4fc6041c1f4422fbd36fd834ce15878f28b46a73 Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Tue, 8 Aug 2023 19:05:48 +0100 Subject: [PATCH 36/62] Clearup unecessary code, and load up Edit form --- .../src/components/CompanyOptions.tsx | 2 +- .../src/components/QuickAcessItems.tsx | 9 +-- .../src/components/demands/DemandAddForm.tsx | 59 ++++++++-------- .../src/components/demands/DemandEditForm.tsx | 48 +++++++++---- .../src/components/demands/DemandPage.tsx | 20 ++---- .../src/contexts/DemandContextProvider.tsx | 70 +++++++++++-------- .../contexts/DemandPropContextProvider.tsx | 62 ---------------- demand-capacity-mgmt-frontend/src/index.js | 1 - 8 files changed, 118 insertions(+), 153 deletions(-) delete mode 100644 demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx diff --git a/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx b/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx index aa9f500d..7ab7c7cf 100644 --- a/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx +++ b/demand-capacity-mgmt-frontend/src/components/CompanyOptions.tsx @@ -39,7 +39,7 @@ const CompanyOptions: React.FC = ({ selectedCompanyName }) {companies && companies.map((company) => ( - ))} diff --git a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx index 6de5b6ab..61aeb0f5 100644 --- a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx +++ b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx @@ -24,17 +24,12 @@ import { Modal, Button } from 'react-bootstrap'; import { useState } from 'react'; import DemandsPage from './demands/DemandPage'; import DemandContextProvider from '../contexts/DemandContextProvider'; -import DemandPropContextProvider from '../contexts/DemandPropContextProvider'; import { DemandProp } from '../interfaces/demand_interfaces'; function QuickAcessItems() { const [demandprops, setDemandProps] = useState([]); - const updateDemandProps = (updatedDemandProps: DemandProp[]) => { - setDemandProps(updatedDemandProps); - }; - const [show, setShow] = useState(false); const handleClose = () => setShow(false); @@ -47,7 +42,7 @@ function QuickAcessItems() {
- + - + ); } diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx index 80958fc5..b4e70693 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx @@ -154,33 +154,36 @@ const AddForm: React.FC = ({ fetchDemandProps }) => { const onInputChangeSelect = (e: ChangeEvent) => { const { name, value } = e.target; - if (name === 'supplierId') { - setFormState((prevFormState) => ({ - ...prevFormState, - supplierId: value, // Update supplierId in the top-level formState - materialDemandSeries: [ - { - ...prevFormState.materialDemandSeries[0], - expectedSupplierLocationId: [value], // Fill the expectedSupplierLocationId array with the value of supplierId - }, - ], - })); - } else if (name === 'demandCategoryId') { - setFormState((prevFormState) => ({ - ...prevFormState, - materialDemandSeries: [ - { - ...prevFormState.materialDemandSeries[0], - demandCategoryId: value, // Ensure demandCategoryId is set properly - }, - ], - })); - } else { - setFormState((prevFormState) => ({ - ...prevFormState, - [name]: value, - })); - } + + setFormState((prevFormState) => { + if (name === 'supplierId') { + return { + ...prevFormState, + supplierId: value, + materialDemandSeries: [ + { + ...prevFormState.materialDemandSeries[0], + expectedSupplierLocationId: [value], + }, + ], + }; + } else if (name === 'demandCategoryId') { + return { + ...prevFormState, + materialDemandSeries: [ + { + ...prevFormState.materialDemandSeries[0], + demandCategoryId: value, + }, + ], + }; + } else { + return { + ...prevFormState, + [name]: value, + }; + } + }); }; const getNextMonday = () => { @@ -217,7 +220,7 @@ const AddForm: React.FC = ({ fetchDemandProps }) => { {showSuccessMessage && submissionStatus === 'submitted' ? (
Material demand has been created! - Please reach to the Overview to adjust the demand. + Please reach to the Overview to adjust the demand.
) : (
diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx index f1879385..5dffe71a 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx @@ -21,9 +21,9 @@ */ import React, { useContext, useState, useEffect } from 'react'; -import { Form, Button, Col,Row} from 'react-bootstrap'; -import { DemandContext} from '../../contexts/DemandContextProvider'; -import { DemandProp} from '../../interfaces/demand_interfaces'; +import { Form, Button, Col, Row } from 'react-bootstrap'; +import { DemandContext } from '../../contexts/DemandContextProvider'; +import { DemandProp } from '../../interfaces/demand_interfaces'; // Import DemandProp interface import CompanyOptions from '../CompanyOptions'; import DemandCategoryOptions from './DemandCategoryOptions'; import UnitsOfMeasureOptions from '../UnitsofMeasureOptions'; @@ -34,22 +34,38 @@ interface EditFormProps { } const EditForm: React.FC = ({ theDemand }) => { - const { updateDemand } = useContext(DemandContext)!; - const [demand, setDemand] = useState(theDemand); + const { updateDemand, getDemandbyId } = useContext(DemandContext)!; + const [demand, setDemand] = useState(undefined); useEffect(() => { - setDemand(theDemand); - }, [theDemand]); - - const handleSubmit = (e: React.FormEvent) => { + const fetchDemand = async () => { + try { + const fetchedDemand = await getDemandbyId(theDemand.id); + setDemand(fetchedDemand); + } catch (error) { + console.error('Error fetching demand:', error); + } + }; + + fetchDemand(); + }, [theDemand, getDemandbyId]); + + const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); - {/*updateDemand(demand);*/} //We need to map a demand prop to a demand + if (demand) { + await updateDemand(demand); + } }; + if (!demand) { + return
Loading...
; + } + + return ( - + Start Date @@ -121,7 +137,7 @@ const EditForm: React.FC = ({ theDemand }) => { placeholder="Material Number" id="materialNumberCustomer" name="materialNumberCustomer" - defaultValue={demand.materialNumberCustomer} + value={demand.materialNumberCustomer} required /> @@ -144,7 +160,13 @@ const EditForm: React.FC = ({ theDemand }) => { placeholder="Description" id="materialDescriptionCustomer" name="materialDescriptionCustomer" - defaultValue={demand.materialDescriptionCustomer} + value={demand.materialDescriptionCustomer} + onChange={(e) => + setDemand((prevDemand) => ({ + ...prevDemand, + materialDescriptionCustomer: e.target.value, + })) + } required /> diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index 968a6bcc..b0a2d1f3 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -12,7 +12,6 @@ import React, { useContext, useState, useMemo ,useCallback, useEffect} from 'react'; import { Modal, Button, Form, Col, Row } from 'react-bootstrap'; -import { DemandPropContext } from '../../contexts/DemandPropContextProvider'; import { Demand, DemandProp } from '../../interfaces/demand_interfaces'; import Pagination from '../Pagination'; import DemandsTable from './DemandsTable'; @@ -28,16 +27,15 @@ import CompanyContextProvider from '../../contexts/CompanyContextProvider'; const DemandsPage: React.FC = () => { const [showEditModal, setShowEditModal] = useState(false); const [showAddModal, setShowAddModal] = useState(false); - const [selectedDemand, setSelectedDemand] = useState(null); - const { demands, deleteDemand } = useContext(DemandContext)!; - const { demandprops, fetchDemandProps } = useContext(DemandPropContext)!; // Make sure to get the fetchDemands function from the context. + const [selectedDemand, setSelectedDemand] = useState(null); + const { deleteDemand } = useContext(DemandContext)!; + const { demandprops, fetchDemandProps } = useContext(DemandContext)!; // Make sure to get the fetchDemands function from the context. const [searchQuery, setSearchQuery] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [sortColumn, setSortColumn] = useState(null); const [sortOrder, setSortOrder] = useState(''); const [demandsPerPage, setDemandsPerPage] = useState(5); //Only show 5 items by default - const [refreshTable, setRefreshTable] = useState(false); const [filteredDemands, setFilteredDemands] = useState([]); const handleSort = (column: keyof DemandProp) => { // Adjust the parameter type here @@ -63,7 +61,7 @@ const DemandsPage: React.FC = () => { [deleteDemand] ); - const handleEdit = (demand: Demand) => { + const handleEdit = (demand: DemandProp) => { //GetDemand with demand ID TODO setSelectedDemand(demand); setShowEditModal(true); @@ -79,9 +77,9 @@ const DemandsPage: React.FC = () => { sortedDemands = sortedDemands.filter((demand) => demand.materialDescriptionCustomer.toLowerCase().includes(searchQuery.toLowerCase()) || demand.id.toString().includes(searchQuery.toLowerCase()) || - demand.customer.id.toString().includes(searchQuery.toLowerCase()) || - demand.materialNumberCustomer.toString().includes(searchQuery.toLowerCase()) || - demand.materialNumberSupplier.toString().includes(searchQuery.toLowerCase()) + demand.customer.bpn.toString().toLowerCase().includes(searchQuery.toLowerCase()) || + demand.materialNumberCustomer.toString().toLowerCase().includes(searchQuery.toLowerCase()) || + demand.materialNumberSupplier.toString().toLowerCase().includes(searchQuery.toLowerCase()) ); } @@ -123,10 +121,6 @@ const DemandsPage: React.FC = () => { demandsPerPage, ]); - useEffect(() => { - setRefreshTable((prev) => !prev); - }, [demandprops]); - const demandItems = useMemo( () => slicedDemands.map((demand) => ( diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx index 11348774..ddc9e14a 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx @@ -19,16 +19,19 @@ * SPDX-License-Identifier: Apache-2.0 * ******************************************************************************** */ -import React, { createContext, useState, useEffect } from 'react'; +import React, { createContext, useState, useEffect,useCallback} from 'react'; import axios from 'axios'; -import { Demand } from '../interfaces/demand_interfaces'; +import { Demand, DemandProp } from '../interfaces/demand_interfaces'; interface DemandContextData { - demands: Demand[]; - deleteDemand: (id: string) => Promise; + demandprops: DemandProp[]; createDemand: (newDemand: Demand) => Promise; - updateDemand: (updatedDemand: Demand) => Promise; + getDemandbyId: (id: string) =>Promise; + deleteDemand: (id: string) => Promise; + updateDemand: (updatedDemand: DemandProp) => Promise; + fetchDemandProps: () => void; + } export const DemandContext = createContext(undefined); @@ -36,30 +39,42 @@ export const DemandContext = createContext(undefi const DemandContextProvider: React.FC> = (props) => { const [demands, setDemands] = useState([]); + const [demandprops, setDemandProps] = useState([]); - useEffect(() => { - const fetchDemands = async () => { - try { - const response = await axios.get('/demand', { - params: { - project_id: 1, // Adjust the project ID parameter as needed - }, - }); - const result: Demand[] = response.data; - setDemands(result); - } catch (error) { - console.error('Error fetching demands:', error); - } - }; - - fetchDemands(); + const fetchDemandProps = useCallback(async () => { + try { + const response = await axios.get('/demand', { + params: { + project_id: 1, // Adjust the project ID parameter as needed + }, + }); + const result: DemandProp[] = response.data; + setDemandProps(result); + } catch (error) { + console.error('Error fetching demands:', error); + } }, []); + + useEffect(() => { + fetchDemandProps(); + }, [fetchDemandProps]); + const getDemandbyId = async (id: string): Promise => { + try { + const response = await axios.get(`/demand/${id}`); + const fetchedDemand: DemandProp = response.data; + return fetchedDemand; + } catch (error) { + console.error('Error fetching demand by id:', error); + return undefined; + } + }; + const deleteDemand = async (id: string) => { try { await axios.delete(`/demand/${id}`); - setDemands((prevDemands) => prevDemands.filter((demand) => demand.id !== id)); + setDemandProps((prevDemands) => prevDemands.filter((demand) => demand.id !== id)); } catch (error) { console.error('Error deleting demand:', error); } @@ -69,18 +84,17 @@ const DemandContextProvider: React.FC> = (props) => try { console.log(newDemand); const response = await axios.post('/demand', newDemand); - const createdDemand: Demand = response.data; - setDemands((prevDemands) => [...prevDemands, createdDemand]); + fetchDemandProps(); } catch (error) { console.error('Error creating demand:', error); } }; - const updateDemand = async (updatedDemand: Demand) => { + const updateDemand = async (updatedDemand: DemandProp) => { try { const response = await axios.put(`/demand/${updatedDemand.id}`, updatedDemand); - const modifiedDemand: Demand = response.data; - setDemands((prevDemands) => + const modifiedDemand: DemandProp = response.data; + setDemandProps((prevDemands) => prevDemands.map((demand) => (demand.id === modifiedDemand.id ? modifiedDemand : demand)) ); } catch (error) { @@ -89,7 +103,7 @@ const DemandContextProvider: React.FC> = (props) => }; return ( - + {props.children} ); diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx deleted file mode 100644 index 6cdc4567..00000000 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandPropContextProvider.tsx +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ******************************************************************************* - * Copyright (c) 2023 BMW AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * ******************************************************************************** - */ -import React, { createContext, useState, useEffect, useCallback } from 'react'; -import axios from 'axios'; -import { DemandProp } from '../interfaces/demand_interfaces'; - -interface DemandPropContextData { - demandprops: DemandProp[]; - fetchDemandProps: () => void; -} - -export const DemandPropContext = createContext(undefined); - -const DemandPropContextProvider: React.FC> = (props) => { - const [demandprops, setDemands] = useState([]); - - const fetchDemandProps = useCallback(async () => { - try { - const response = await axios.get('/demand', { - params: { - project_id: 1, // Adjust the project ID parameter as needed - }, - }); - const result: DemandProp[] = response.data; - setDemands(result); - } catch (error) { - console.error('Error fetching demands:', error); - } - }, []); - - useEffect(() => { - fetchDemandProps(); - }, [fetchDemandProps]); - - return ( - - {props.children} - - ); -}; - -export default DemandPropContextProvider; - diff --git a/demand-capacity-mgmt-frontend/src/index.js b/demand-capacity-mgmt-frontend/src/index.js index 9e7bad32..06e1af7d 100644 --- a/demand-capacity-mgmt-frontend/src/index.js +++ b/demand-capacity-mgmt-frontend/src/index.js @@ -37,7 +37,6 @@ import DemandContextProvider from "../src/contexts/DemandContextProvider"; // Import your components for different routes import Home from "./components/capacitygroup/CapacityGroupPage"; import CapacityGroupDetailsPage from './components/capacitygroup/CapacityGroupDetailsPage'; -import DemandPropContextProvider from './contexts/DemandPropContextProvider'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( From b7556ddc3feae0a89b112ba1f6e04fa4564a7837 Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Wed, 9 Aug 2023 09:31:12 +0100 Subject: [PATCH 37/62] Frontend React Errors Fixed --- .../src/components/demands/DemandEditForm.tsx | 91 ++++++++++++++++--- .../src/components/demands/DemandPage.tsx | 34 ++++--- .../src/components/demands/DemandsTable.tsx | 87 ++++++++++-------- .../UnitsOfMeasureContextProvider.tsx | 1 - 4 files changed, 147 insertions(+), 66 deletions(-) diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx index 5dffe71a..7d76536a 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx @@ -19,16 +19,16 @@ * SPDX-License-Identifier: Apache-2.0 * ******************************************************************************** */ - import React, { useContext, useState, useEffect } from 'react'; import { Form, Button, Col, Row } from 'react-bootstrap'; import { DemandContext } from '../../contexts/DemandContextProvider'; -import { DemandProp } from '../../interfaces/demand_interfaces'; // Import DemandProp interface +import { DemandProp } from '../../interfaces/demand_interfaces'; import CompanyOptions from '../CompanyOptions'; import DemandCategoryOptions from './DemandCategoryOptions'; import UnitsOfMeasureOptions from '../UnitsofMeasureOptions'; import { FiSave } from 'react-icons/fi'; + interface EditFormProps { theDemand: DemandProp; } @@ -54,15 +54,53 @@ const EditForm: React.FC = ({ theDemand }) => { e.preventDefault(); if (demand) { - await updateDemand(demand); + try { + await updateDemand(demand); + } catch (error) { + console.error('Error updating demand:', error); + } } }; + const handleFieldChange = (fieldName: string, newValue: any) => { + setDemand((prevDemand) => + prevDemand + ? { + ...prevDemand, + [fieldName]: newValue, + } + : undefined + ); + }; + + const handleUnitMeasureChange = (e: React.ChangeEvent) => { + const selectedUnitMeasureId = e.target.value; + handleFieldChange('unitMeasureId', { id: selectedUnitMeasureId }); + }; + + const handleSupplierChange = (e: React.ChangeEvent) => { + const selectedSupplierId = e.target.value; + handleFieldChange('supplier', { id: selectedSupplierId }); + }; + + const handleDemandCategoryChange = (e: React.ChangeEvent) => { + const selectedCategoryId = e.target.value; + handleFieldChange('demandSeries', (demand?.demandSeries ?? []).map((series)=> ({ + ...series, + demandCategory: { + ...series.demandCategory, + id: selectedCategoryId, + }, + }))); + }; + + + + if (!demand) { return
Loading...
; } - return ( @@ -99,6 +137,8 @@ const EditForm: React.FC = ({ theDemand }) => { @@ -111,6 +151,8 @@ const EditForm: React.FC = ({ theDemand }) => { aria-label="Default select example" name="supplierId" id="supplierId" + value={demand.supplier.id || ''} + onChange={handleSupplierChange} required > @@ -125,6 +167,8 @@ const EditForm: React.FC = ({ theDemand }) => { name="demandCategoryId" id="demandCategoryId" required + value={demand.demandSeries?.[0]?.demandCategory?.id || ''} + onChange={handleDemandCategoryChange} > @@ -137,8 +181,17 @@ const EditForm: React.FC = ({ theDemand }) => { placeholder="Material Number" id="materialNumberCustomer" name="materialNumberCustomer" - value={demand.materialNumberCustomer} - required + defaultValue ={demand.materialNumberCustomer} + onChange={(e) => + setDemand((prevDemand) => + prevDemand + ? { + ...prevDemand, + materialNumberCustomer: e.target.value, + } + : undefined + ) + } /> @@ -149,7 +202,17 @@ const EditForm: React.FC = ({ theDemand }) => { placeholder="Material Number" id="materialNumberSupplier" name="materialNumberSupplier" - defaultValue={demand.materialNumberSupplier} + defaultValue ={demand.materialNumberSupplier} + onChange={(e) => + setDemand((prevDemand) => + prevDemand + ? { + ...prevDemand, + materialNumberSupplier: e.target.value, + } + : undefined + ) + } /> @@ -160,12 +223,16 @@ const EditForm: React.FC = ({ theDemand }) => { placeholder="Description" id="materialDescriptionCustomer" name="materialDescriptionCustomer" - value={demand.materialDescriptionCustomer} + defaultValue ={demand.materialDescriptionCustomer} onChange={(e) => - setDemand((prevDemand) => ({ - ...prevDemand, - materialDescriptionCustomer: e.target.value, - })) + setDemand((prevDemand) => + prevDemand + ? { + ...prevDemand, + materialDescriptionCustomer: e.target.value, + } + : undefined + ) } required /> diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index b0a2d1f3..7af8f16f 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -12,7 +12,7 @@ import React, { useContext, useState, useMemo ,useCallback, useEffect} from 'react'; import { Modal, Button, Form, Col, Row } from 'react-bootstrap'; -import { Demand, DemandProp } from '../../interfaces/demand_interfaces'; +import { DemandProp } from '../../interfaces/demand_interfaces'; import Pagination from '../Pagination'; import DemandsTable from './DemandsTable'; import DemandsSearch from '../Search'; @@ -33,23 +33,27 @@ const DemandsPage: React.FC = () => { const [searchQuery, setSearchQuery] = useState(''); const [currentPage, setCurrentPage] = useState(1); + const [sortColumn, setSortColumn] = useState(null); - const [sortOrder, setSortOrder] = useState(''); + const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc'); + const [demandsPerPage, setDemandsPerPage] = useState(5); //Only show 5 items by default const [filteredDemands, setFilteredDemands] = useState([]); - const handleSort = (column: keyof DemandProp) => { // Adjust the parameter type here + const handleSort = (column: string | null) => { + console.log('Sorting column:', column); if (sortColumn === column) { // If the same column is clicked again, toggle the sort order setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc'); } else { // If a different column is clicked, set it as the new sort column and default to ascending order - setSortColumn(column); + setSortColumn(column as keyof DemandProp | null); setSortOrder('asc'); } }; - - const handleDeleteDemand = useCallback( + + + const handleDeleteDemand = useCallback( async (id: string) => { try { await deleteDemand(id); @@ -87,7 +91,7 @@ const DemandsPage: React.FC = () => { sortedDemands.sort((a, b) => { const aValue = a[sortColumn]; const bValue = b[sortColumn]; - + if (typeof aValue === 'string' && typeof bValue === 'string') { // Sort strings alphabetically return aValue.localeCompare(bValue, undefined, { sensitivity: 'base' }); @@ -95,10 +99,11 @@ const DemandsPage: React.FC = () => { // Sort numbers numerically return aValue - bValue; } - + // If the types are not string or number, return 0 (no sorting) return 0; }); + if (sortOrder === 'desc') { // Reverse the array if the sort order is descending @@ -179,12 +184,13 @@ const DemandsPage: React.FC = () => { - + handleSort(column)} // Pass the correct parameter type + demandItems={demandItems} + /> +
void; + handleSort: (column: string | null) => void; demandItems: React.ReactNode; }; const DemandsTable: React.FC = ({ sortColumn, sortOrder, handleSort, demandItems }) => { - return ( - - - - - - - - - - - - - - - {demandItems} -
- - handleSort('companyId')}> - Company Id {sortColumn === 'companyId' && } - handleSort('materialNumberCustomer')}> - Material No. Customer {sortColumn === 'materialNumberCustomer' && } - handleSort('materialNumberSupplier')}> - Material No. Supplier {sortColumn === 'materialNumberSupplier' && } - handleSort('demandCategory')}> - Demand cat.{sortColumn === 'demandCategory' && } - handleSort('description')}> - Description {sortColumn === 'description' && } - handleSort('startDate')}> - Start Date {sortColumn === 'startDate' && } - handleSort('endDate')}> - End Date {sortColumn === 'endDate' && } - handleSort('status')}> - Status {sortColumn === 'status' && } -
+ + + + + + + + + + + + + + + {demandItems} +
handleSort('customer.bpn')}> + Company Id{' '} + {sortColumn === 'customer.bpn' && sortOrder === 'asc' && } + {sortColumn === 'customer.bpn' && sortOrder === 'desc' && } + {!sortColumn && ...} + handleSort('materialNumberCustomer')}> + Material No. Customer{' '} + {sortColumn === 'materialNumberCustomer' && sortOrder === 'asc' && } + {sortColumn === 'materialNumberCustomer' && sortOrder === 'desc' && } + handleSort('materialNumberSupplier')}> + Material No. Supplier{' '} + {sortColumn === 'materialNumberSupplier' && sortOrder === 'asc' && } + {sortColumn === 'materialNumberSupplier' && sortOrder === 'desc' && } + handleSort('demandSeries.demandCategory')}> + Demand cat. + {sortColumn === 'demandSeries.demandCategory' && sortOrder === 'asc' && } + {sortColumn === 'demandSeries.demandCategory' && sortOrder === 'desc' && } + handleSort('materialDescriptionCustomer')}> + Description{' '} + {sortColumn === 'materialDescriptionCustomer' && sortOrder === 'asc' && } + {sortColumn === 'materialDescriptionCustomer' && sortOrder === 'desc' && } + handleSort('startDate')}> + Start Date {sortColumn === 'startDate' && sortOrder === 'asc' && } + {sortColumn === 'startDate' && sortOrder === 'desc' && } + handleSort('endDate')}> + End Date {sortColumn === 'endDate' && sortOrder === 'asc' && } + {sortColumn === 'endDate' && sortOrder === 'desc' && } + handleSort('status')}> + Status {sortColumn === 'status' && sortOrder === 'asc' && } + {sortColumn === 'status' && sortOrder === 'desc' && } +
); }; diff --git a/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx index bab46f01..8698632c 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/UnitsOfMeasureContextProvider.tsx @@ -44,7 +44,6 @@ const UnitsofMeasureContextContextProvider: React.FC try { const response = await axios.get('/unitmeasure'); const result: UnitMeasure[] = response.data; - console.log(result); // Check if data is received correctly setUnitsofMeasure(result); } catch (error) { console.error('Error fetching units of measure:', error); From c6c2510f8d6c7e46cb1d5de9bf442fa58177e7f6 Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Wed, 9 Aug 2023 14:07:50 +0100 Subject: [PATCH 38/62] Edit and Demands View done --- .../src/components/QuickAcessItems.tsx | 7 +- .../capacitygroup/CapacityGroupPage.tsx | 7 +- .../capacitygroup/CapacityGroupsView.tsx | 2 +- .../src/components/demands/DemandEditForm.tsx | 76 +++++++++++++++++-- .../src/components/demands/DemandPage.tsx | 13 ++-- .../CapacityGroupsContextProvider.tsx | 1 - .../src/contexts/DemandContextProvider.tsx | 10 ++- demand-capacity-mgmt-frontend/src/index.css | 5 ++ 8 files changed, 94 insertions(+), 27 deletions(-) diff --git a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx index 61aeb0f5..0f0cb024 100644 --- a/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx +++ b/demand-capacity-mgmt-frontend/src/components/QuickAcessItems.tsx @@ -24,12 +24,10 @@ import { Modal, Button } from 'react-bootstrap'; import { useState } from 'react'; import DemandsPage from './demands/DemandPage'; import DemandContextProvider from '../contexts/DemandContextProvider'; -import { DemandProp } from '../interfaces/demand_interfaces'; +import '../index.css'; function QuickAcessItems() { - const [demandprops, setDemandProps] = useState([]); - const [show, setShow] = useState(false); const handleClose = () => setShow(false); @@ -48,7 +46,8 @@ function QuickAcessItems() { onHide={handleClose} backdrop="static" keyboard={false} - size="xl" + dialogClassName="custom-modal" + fullscreen="xl" > Demand Management View diff --git a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupPage.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupPage.tsx index c493497d..d178b339 100644 --- a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupPage.tsx @@ -20,8 +20,9 @@ * ******************************************************************************** */ +import CapacityGroupsProvider, { CapacityGroupContext } from "../../contexts/CapacityGroupsContextProvider"; import CapacityGroupsList from "./CapacityGroupsView"; -import CapacityGroupContext from "../../contexts/CapacityGroupsContextProvider"; + function CapacityGroupPage() { @@ -31,9 +32,9 @@ function CapacityGroupPage() {
- + - +
diff --git a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx index b1fbe27f..9bf3439b 100644 --- a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx +++ b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx @@ -24,11 +24,11 @@ import React, { useContext, useState, useMemo, useCallback } from 'react'; import { Modal, Button,Form,Col,Row } from 'react-bootstrap'; import { CapacityGroupContext } from '../../contexts/CapacityGroupsContextProvider'; import { CapacityGroup } from '../../interfaces/capacitygroup_interfaces'; -import AddForm from '../demands/DemandAddForm'; import Pagination from '../Pagination'; import CapacityGroupsTable from './CapacityGroupsTable'; import Search from '../Search'; import CapacityGroupsModal from './CapacityGroupsModal'; +import '../../index.css'; const CapacityGroupsList: React.FC = () => { const [showEditModal, setShowEditModal] = useState(false); diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx index 7d76536a..acf905e4 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandEditForm.tsx @@ -22,18 +22,58 @@ import React, { useContext, useState, useEffect } from 'react'; import { Form, Button, Col, Row } from 'react-bootstrap'; import { DemandContext } from '../../contexts/DemandContextProvider'; -import { DemandProp } from '../../interfaces/demand_interfaces'; +import { Demand,DemandSeriesValue, DemandProp, DemandSeries } from '../../interfaces/demand_interfaces'; import CompanyOptions from '../CompanyOptions'; import DemandCategoryOptions from './DemandCategoryOptions'; import UnitsOfMeasureOptions from '../UnitsofMeasureOptions'; +import Spinner from 'react-bootstrap/Spinner'; import { FiSave } from 'react-icons/fi'; +function convertToDemand(demandProp: DemandProp): Demand { + const { + id, + materialDescriptionCustomer, + materialNumberCustomer, + materialNumberSupplier, + customer, + supplier, + unitMeasureId, + demandSeries, + } = demandProp; + + const demandSeriesValues: DemandSeriesValue[] = demandSeries![0].demandSeriesValues.map((value) => ({ + calendarWeek: value.calendarWeek.split('T')[0], + demand: value.demand, + })); + + const convertedDemand: Demand = { + id, + materialDescriptionCustomer, + materialNumberCustomer, + materialNumberSupplier, + customerId: customer.id, + supplierId: supplier.id, + unitMeasureId: unitMeasureId.id, + materialDemandSeries: [ + { + customerLocationId: customer.id, + expectedSupplierLocationId: [supplier.id], + demandCategoryId: demandSeries![0].demandCategory.id, + demandSeriesValues, + }, + ], + }; + + return convertedDemand; +} + interface EditFormProps { theDemand: DemandProp; + onCloseModal: () => void; } -const EditForm: React.FC = ({ theDemand }) => { +const EditForm: React.FC = ({ theDemand , onCloseModal }) => { const { updateDemand, getDemandbyId } = useContext(DemandContext)!; const [demand, setDemand] = useState(undefined); @@ -52,26 +92,44 @@ const EditForm: React.FC = ({ theDemand }) => { const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); - + if (demand) { + const convertedDemand = convertToDemand(demand); try { - await updateDemand(demand); + await updateDemand(convertedDemand); + onCloseModal(); } catch (error) { console.error('Error updating demand:', error); } } }; - + const handleFieldChange = (fieldName: string, newValue: any) => { setDemand((prevDemand) => prevDemand ? { ...prevDemand, - [fieldName]: newValue, + [fieldName]: + fieldName === 'demandSeries' + ? newValue.map((series: DemandSeries) => ({ + ...series, + demandSeriesValues: series.demandSeriesValues.map((value: DemandSeriesValue) => ({ + ...value, + calendarWeek: value.calendarWeek.split('T')[0], // Extract date portion from datetime string + })), + })) + : fieldName === 'unitMeasureId' + ? { id: newValue } // Wrap unitMeasureId in an object with id property + : fieldName === 'supplier' + ? { id: newValue } // Wrap supplier in an object with id property + : fieldName === 'startDate' || fieldName === 'endDate' + ? newValue.split('T')[0] // Extract date portion from datetime string + : newValue, } : undefined ); }; + const handleUnitMeasureChange = (e: React.ChangeEvent) => { const selectedUnitMeasureId = e.target.value; @@ -98,7 +156,11 @@ const EditForm: React.FC = ({ theDemand }) => { if (!demand) { - return
Loading...
; + return ( + + Loading... + + ); } return ( diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index 7af8f16f..272dc1f3 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -25,8 +25,9 @@ import DemandCategoryContextProvider from '../../contexts/DemandCategoryProvider import CompanyContextProvider from '../../contexts/CompanyContextProvider'; const DemandsPage: React.FC = () => { - const [showEditModal, setShowEditModal] = useState(false); + const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [showAddModal, setShowAddModal] = useState(false); + const [selectedDemand, setSelectedDemand] = useState(null); const { deleteDemand } = useContext(DemandContext)!; const { demandprops, fetchDemandProps } = useContext(DemandContext)!; // Make sure to get the fetchDemands function from the context. @@ -66,12 +67,10 @@ const DemandsPage: React.FC = () => { ); const handleEdit = (demand: DemandProp) => { - //GetDemand with demand ID TODO setSelectedDemand(demand); - setShowEditModal(true); + setIsEditModalOpen(true); }; - const handleCloseEdit = () => setShowEditModal(false); const handleCloseAdd = () => setShowAddModal(false); useMemo(() => { @@ -225,8 +224,8 @@ const DemandsPage: React.FC = () => {
setIsEditModalOpen(false)} backdrop="static" keyboard={false} size="lg" @@ -238,7 +237,7 @@ const DemandsPage: React.FC = () => { - {selectedDemand && } + {selectedDemand && setIsEditModalOpen(false)} />} diff --git a/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx index 5736f605..366d4f1c 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx @@ -53,7 +53,6 @@ const CapacityGroupsProvider: React.FC> = (props) => }; fetchCapacityGroups(); - // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx index ddc9e14a..2c2ecddb 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx @@ -29,7 +29,7 @@ interface DemandContextData { createDemand: (newDemand: Demand) => Promise; getDemandbyId: (id: string) =>Promise; deleteDemand: (id: string) => Promise; - updateDemand: (updatedDemand: DemandProp) => Promise; + updateDemand: (updatedDemand: Demand) => Promise; fetchDemandProps: () => void; } @@ -90,13 +90,15 @@ const DemandContextProvider: React.FC> = (props) => } }; - const updateDemand = async (updatedDemand: DemandProp) => { + const updateDemand = async (updatedDemand: Demand) => { try { + console.log(updatedDemand); const response = await axios.put(`/demand/${updatedDemand.id}`, updatedDemand); - const modifiedDemand: DemandProp = response.data; - setDemandProps((prevDemands) => + const modifiedDemand: Demand = response.data; + setDemands((prevDemands) => prevDemands.map((demand) => (demand.id === modifiedDemand.id ? modifiedDemand : demand)) ); + fetchDemandProps(); } catch (error) { console.error('Error updating demand:', error); } diff --git a/demand-capacity-mgmt-frontend/src/index.css b/demand-capacity-mgmt-frontend/src/index.css index 382d1d8f..2c13bb43 100644 --- a/demand-capacity-mgmt-frontend/src/index.css +++ b/demand-capacity-mgmt-frontend/src/index.css @@ -33,3 +33,8 @@ code { font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; } + + +.custom-modal { + max-width: 1500px; /* Adjust the width as needed */ +} \ No newline at end of file From a82e6cfa6a1676d5c36f21047d50ba83043a6688 Mon Sep 17 00:00:00 2001 From: Sergio Figueiredo Date: Thu, 10 Aug 2023 16:52:18 +0100 Subject: [PATCH 39/62] Capacity Groups, Listing and sorting --- .../capacitygroup/CapacityGroupsTable.tsx | 50 +++++++---- .../capacitygroup/CapacityGroupsView.tsx | 84 +++++-------------- .../src/components/demands/DemandPage.tsx | 1 - .../src/components/demands/DemandsTable.tsx | 34 ++++---- .../CapacityGroupsContextProvider.tsx | 43 +--------- .../interfaces/capacitygroup_interfaces.tsx | 21 +++-- 6 files changed, 84 insertions(+), 149 deletions(-) diff --git a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsTable.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsTable.tsx index 3f7e3736..f44c15e7 100644 --- a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsTable.tsx +++ b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsTable.tsx @@ -21,7 +21,7 @@ */ import React from 'react'; - +import { BiCaretDown, BiCaretUp } from 'react-icons/bi'; type CapacityGroupsTableProps = { sortColumn: string; @@ -35,32 +35,46 @@ const CapacityGroupsTable: React.FC = ({ sortColumn, s - - - - - - - diff --git a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx index 9bf3439b..2261eaf3 100644 --- a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx +++ b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx @@ -21,36 +21,26 @@ */ import React, { useContext, useState, useMemo, useCallback } from 'react'; -import { Modal, Button,Form,Col,Row } from 'react-bootstrap'; +import { Form,Col,Row } from 'react-bootstrap'; import { CapacityGroupContext } from '../../contexts/CapacityGroupsContextProvider'; import { CapacityGroup } from '../../interfaces/capacitygroup_interfaces'; import Pagination from '../Pagination'; import CapacityGroupsTable from './CapacityGroupsTable'; import Search from '../Search'; -import CapacityGroupsModal from './CapacityGroupsModal'; import '../../index.css'; const CapacityGroupsList: React.FC = () => { - const [showEditModal, setShowEditModal] = useState(false); const [selectedCapacityGroup, setSelectedCapacityGroup] = useState(null); const { capacitygroups } = useContext(CapacityGroupContext)!; const [searchQuery, setSearchQuery] = useState(''); - const [show, setShow] = useState(false); // Add setShow to manage modal visibility const [currentPage, setCurrentPage] = useState(1); const [sortColumn, setSortColumn] = useState(''); const [sortOrder, setSortOrder] = useState(''); const [capacitygroupsPerPage, setcapacitygroupsPerPage] = useState(20); // Set the default value here - const handleShow = () => { - setShow(true); - }; - - const handleClose = () => { - setShow(false); - }; - const handleSort = (column: string) => { + console.log('Sorting column:', column); if (sortColumn === column) { // If the same column is clicked again, toggle the sort order setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc'); @@ -61,40 +51,28 @@ const CapacityGroupsList: React.FC = () => { } }; - const handleEdit = (capacitygroup: CapacityGroup) => { - setSelectedCapacityGroup(capacitygroup); - setShowEditModal(true); - }; - - const handleCloseEditModal = () => { - setShowEditModal(false); - }; - const filteredcapacitygroups = useMemo(() => { let sortedcapacitygroups = [...capacitygroups]; if (searchQuery !== '') { sortedcapacitygroups = sortedcapacitygroups.filter((capacitygroup) => - capacitygroup.description.toLowerCase().includes(searchQuery.toLowerCase()) || - capacitygroup.id.toString().includes(searchQuery.toLowerCase()) || - capacitygroup.companyId.toString().includes(searchQuery.toLowerCase()) + capacitygroup.internalId.toString().includes(searchQuery.toLowerCase()) || + capacitygroup.name.toLowerCase().includes(searchQuery.toLowerCase()) || + capacitygroup.customerBPNL.toString().includes(searchQuery.toLowerCase()) || + capacitygroup.customerName.toString().includes(searchQuery.toLowerCase()) || + capacitygroup.supplierBNPL.toString().includes(searchQuery.toLowerCase()) || + capacitygroup.numberOfMaterials.toString().includes(searchQuery.toLowerCase()) || + capacitygroup.favoritedBy.toString().includes(searchQuery.toLowerCase()) || + capacitygroup.status.toString().includes(searchQuery.toLowerCase()) ); } if (sortColumn !== '') { sortedcapacitygroups.sort((a, b) => { - const aValue = a[sortColumn]; - const bValue = b[sortColumn]; - - if (typeof aValue === 'string') { - // Sort strings alphabetically - return aValue.localeCompare(bValue, undefined, { sensitivity: 'base' }); - } else if (typeof aValue === 'number') { - // Sort numbers numerically - return aValue - bValue; - } - - return 0; + const aValue = String(a[sortColumn]); // Convert to string + const bValue = String(b[sortColumn]); // Convert to string + + return aValue.localeCompare(bValue, undefined, { sensitivity: 'base' }); }); if (sortOrder === 'desc') { @@ -120,15 +98,14 @@ const CapacityGroupsList: React.FC = () => { const capacitygroupsItems = useMemo( () => slicedcapacitygroups.map((capacitygroup) => ( - - - - - - - - - + + + + + + + + diff --git a/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx index 366d4f1c..fbbbad5f 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/CapacityGroupsContextProvider.tsx @@ -26,9 +26,6 @@ import { CapacityGroup } from '../interfaces/capacitygroup_interfaces'; interface CapacityGroupContextData { capacitygroups: CapacityGroup[]; - deleteCapacityGroup: (id: number) => Promise; - createCapacityGroup: (newCapacityGroup: CapacityGroup) => Promise; - updateCapacityGroup: (updatedCapacityGroup: CapacityGroup) => Promise; } export const CapacityGroupContext = createContext(undefined); @@ -40,11 +37,7 @@ const CapacityGroupsProvider: React.FC> = (props) => useEffect(() => { const fetchCapacityGroups = async () => { try { - const response = await axios.get('/capacitygroup', { - params: { - project_id: 1, // Adjust the project ID parameter as needed - }, - }); + const response = await axios.get('/capacityGroup', {}); const result: CapacityGroup[] = response.data; setCapacityGroups(result); } catch (error) { @@ -55,40 +48,8 @@ const CapacityGroupsProvider: React.FC> = (props) => fetchCapacityGroups(); }, []); - - const deleteCapacityGroup = async (id: number) => { - try { - await axios.delete(`/capacitygroup/${id}`); - setCapacityGroups((prevCapacityGroups) => prevCapacityGroups.filter((capacitygroup) => capacitygroup.id !== id)); - } catch (error) { - console.error('Error deleting capacitygroup:', error); - } - }; - - const createCapacityGroup = async (newCapacityGroup: CapacityGroup) => { - try { - const response = await axios.post('/demand', newCapacityGroup); - const createdDemand: CapacityGroup = response.data; - setCapacityGroups((prevCapacityGroups) => [...prevCapacityGroups, createdDemand]); - } catch (error) { - console.error('Error creating demand:', error); - } - }; - - const updateCapacityGroup = async (updatedCapacityGroup: CapacityGroup) => { - try { - const response = await axios.put(`/demand/${updatedCapacityGroup.id}`, updatedCapacityGroup); - const modifiedDemand: CapacityGroup = response.data; - setCapacityGroups((prevCapacityGroups) => - prevCapacityGroups.map((demand) => (demand.id === modifiedDemand.id ? modifiedDemand : demand)) - ); - } catch (error) { - console.error('Error updating demand:', error); - } - }; - return ( - + {props.children} ); diff --git a/demand-capacity-mgmt-frontend/src/interfaces/capacitygroup_interfaces.tsx b/demand-capacity-mgmt-frontend/src/interfaces/capacitygroup_interfaces.tsx index 961dd8f4..83efcecc 100644 --- a/demand-capacity-mgmt-frontend/src/interfaces/capacitygroup_interfaces.tsx +++ b/demand-capacity-mgmt-frontend/src/interfaces/capacitygroup_interfaces.tsx @@ -21,15 +21,14 @@ */ export interface CapacityGroup { - id: number; - product: string; - companyId: string; - requiredValue: number; - deliveredValue: number; - maximumValue: number; - category: string; - description: string; - startDate: string; - endDate: string; - [key: string]: any; + internalId: string + catXUuid: string + name: string + customerBPNL: string + customerName: string + supplierBNPL: string + numberOfMaterials: number + favoritedBy: string + status: string + [key: string]: string | number; } \ No newline at end of file From 17e32df277f75dfb65b5eb850c0d5ab529a77fce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Fri, 11 Aug 2023 19:49:02 +0100 Subject: [PATCH 40/62] fix: capacity group creation --- .../WeekBasedCapacityGroupService.java | 3 +++ .../impl/CapacityGroupServiceImpl.java | 18 +++++++++++++++--- .../services/impl/LinkDemandServiceImpl.java | 4 ++-- .../WeekBasedCapacityGroupServiceImpl.java | 13 +++++++++++++ .../impl/WeekBasedMaterialServiceImpl.java | 4 +--- .../src/main/resources/application.yml | 4 ++-- .../src/main/resources/openapi.yml | 2 +- 7 files changed, 37 insertions(+), 11 deletions(-) diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/WeekBasedCapacityGroupService.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/WeekBasedCapacityGroupService.java index 96a417cd..2a98fc1f 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/WeekBasedCapacityGroupService.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/WeekBasedCapacityGroupService.java @@ -25,6 +25,7 @@ import eclipse.tractusx.demand_capacity_mgmt_specification.model.WeekBasedCapacityGroupRequest; import java.util.List; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.CapacityGroupEntity; +import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.WeekBasedCapacityGroupEntity; public interface WeekBasedCapacityGroupService { void createWeekBasedCapacityGroup(List weekBasedCapacityGroupRequest); @@ -34,4 +35,6 @@ public interface WeekBasedCapacityGroupService { void sendWeekBasedCapacityGroup(); void createWeekBasedCapacityGroupRequestFromEntity(CapacityGroupEntity capacityGroupEntity); + + WeekBasedCapacityGroupEntity findById(String capacityGroupId); } diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CapacityGroupServiceImpl.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CapacityGroupServiceImpl.java index c77b1f5b..9105a821 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CapacityGroupServiceImpl.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CapacityGroupServiceImpl.java @@ -38,9 +38,8 @@ import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.exceptions.NotFoundException; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.CapacityGroupRepository; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.LinkDemandRepository; -import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.services.CapacityGroupService; -import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.services.CompanyService; -import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.services.UnityOfMeasureService; +import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.WeekBasedCapacityGroupRepository; +import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.services.*; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.utils.DataConverterUtil; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.utils.UUIDUtil; import org.springframework.stereotype.Service; @@ -58,6 +57,8 @@ public class CapacityGroupServiceImpl implements CapacityGroupService { private final LinkDemandRepository linkDemandRepository; + private final DemandCategoryService demandCategoryService; + @Override public CapacityGroupResponse createCapacityGroup(CapacityGroupRequest capacityGroupRequest) { validateRequestFields(capacityGroupRequest); @@ -175,10 +176,18 @@ private CapacityGroupEntity enrichCapacityGroup(CapacityGroupRequest capacityGro .findById(UUIDUtil.generateUUIDFromString(s)) .orElseThrow(); + WeekBasedMaterialDemandEntity weekBasedMaterialDemandEntity = linkDemandEntity.getWeekBasedMaterialDemand(); + WeekBasedMaterialDemandRequestDto weekBasedMaterialDemandRequestDto = weekBasedMaterialDemandEntity.getWeekBasedMaterialDemand(); + CompanyEntity customerId = companyService.getCompanyById(UUID.fromString(weekBasedMaterialDemandRequestDto.getCustomer())); + materialNumberCustomer.set(linkDemandEntity.getMaterialNumberCustomer()); materialDescriptionCustomer.set(linkDemandEntity.getMaterialNumberCustomer()); + String demandCategoryId = linkDemandEntity.getDemandCategoryId(); + DemandCategoryEntity demandCategoryEntity = demandCategoryService.findById(UUID.fromString(demandCategoryId)); + + linkDemandEntity.setLinked(true); linkDemandRepository.save(linkDemandEntity); @@ -186,6 +195,8 @@ private CapacityGroupEntity enrichCapacityGroup(CapacityGroupRequest capacityGro .builder() .materialNumberSupplier(linkDemandEntity.getMaterialNumberSupplier()) .materialNumberCustomer(linkDemandEntity.getMaterialNumberCustomer()) + .customerId(customerId) + .demandCategory(demandCategoryEntity) .build(); } ) @@ -205,6 +216,7 @@ private CapacityGroupEntity enrichCapacityGroup(CapacityGroupRequest capacityGro .name(capacityGroupRequest.getName()) .materialNumberCustomer(materialNumberCustomer.get()) .materialDescriptionCustomer(materialDescriptionCustomer.get()) + .status(CapacityGroupStatus.DRAFT) .build(); } diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/LinkDemandServiceImpl.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/LinkDemandServiceImpl.java index cd82db8e..c189cda4 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/LinkDemandServiceImpl.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/LinkDemandServiceImpl.java @@ -63,8 +63,8 @@ private List convertFromWeekBasedMaterial(WeekBasedMaterialDem demandWeekSeriesDto -> LinkDemandEntity .builder() - .linked(false) - .demandCategoryId(demandWeekSeriesDto.getDemandCategory().getDemandCategoryCode()) + .linked(false) //Id =id + .demandCategoryId(demandWeekSeriesDto.getDemandCategory().getId()) .weekBasedMaterialDemand(weekBasedMaterialDemand) .materialNumberSupplier( weekBasedMaterialDemand.getWeekBasedMaterialDemand().getMaterialNumberSupplier() diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedCapacityGroupServiceImpl.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedCapacityGroupServiceImpl.java index 47bcb8e4..6b3eff1f 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedCapacityGroupServiceImpl.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedCapacityGroupServiceImpl.java @@ -33,6 +33,7 @@ import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.*; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.enums.CapacityGroupStatus; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.exceptions.BadRequestException; +import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.exceptions.NotFoundException; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.CustomerRepository; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.MaterialDemandRepository; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.WeekBasedCapacityGroupRepository; @@ -166,6 +167,18 @@ public void createWeekBasedCapacityGroupRequestFromEntity(CapacityGroupEntity ca basedCapacityGroupRequest.setCapacities(capacitiesDtos); } + @Override + public WeekBasedCapacityGroupEntity findById(String capacityGroupId) { + Optional weekBasedCapacityGroupEntityOptional = weekBasedCapacityGroupRepository.findById(Integer.getInteger(capacityGroupId)); + + if (weekBasedCapacityGroupEntityOptional.isEmpty()){ + throw new NotFoundException("WeekBasedCapacity not found"); + } + + return weekBasedCapacityGroupEntityOptional.get(); + + } + private static CapacitiesDto getCapacitiesDto(CapacityTimeSeries capacityTimeSeries) { CapacitiesDto capacitiesDto = new CapacitiesDto(); diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedMaterialServiceImpl.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedMaterialServiceImpl.java index 94733db8..359c2bb5 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedMaterialServiceImpl.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedMaterialServiceImpl.java @@ -129,9 +129,7 @@ public void createWeekBasedMaterialRequestFromEntity(MaterialDemandEntity materi ); DemandSeriesCategoryDto demandSeriesCategoryDto = new DemandSeriesCategoryDto(); - demandSeriesCategoryDto.setDemandCategoryCode( - demandSeries.getDemandCategory().getDemandCategoryCode() - ); + demandSeriesCategoryDto.setId(demandSeries.getDemandCategory().getId().toString()); demandWeekSeriesDto.setDemandCategory(demandSeriesCategoryDto); diff --git a/demand-capacity-mgmt-backend/src/main/resources/application.yml b/demand-capacity-mgmt-backend/src/main/resources/application.yml index 250cabf3..15647e30 100644 --- a/demand-capacity-mgmt-backend/src/main/resources/application.yml +++ b/demand-capacity-mgmt-backend/src/main/resources/application.yml @@ -25,8 +25,8 @@ spring: show-sql: true datasource: url: jdbc:postgresql://${DCM_DATASOURCE_HOST:localhost:5432}/${DCM_DATASOURCE_NAME:dcm} - username: ${DCM_DATASOURCE_USER:dcm} - password: ${DCM_DATASOURCE_PASS:dcm} + username: ${DCM_DATASOURCE_USER:postgres} + password: ${DCM_DATASOURCE_PASS:postgres} driverClassName: org.postgresql.Driver sql: init: diff --git a/demand-capacity-mgmt-specification/src/main/resources/openapi.yml b/demand-capacity-mgmt-specification/src/main/resources/openapi.yml index 0178bbcd..b7a6e1a3 100644 --- a/demand-capacity-mgmt-specification/src/main/resources/openapi.yml +++ b/demand-capacity-mgmt-specification/src/main/resources/openapi.yml @@ -393,7 +393,7 @@ components: DemandSeriesCategoryDto: type: object properties: - demandCategoryCode: + id: type: string DemandWeekSeriesDto: From 0760e9e069858d9c93a7f0fc9f08ee1f753d34b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Fri, 11 Aug 2023 19:52:28 +0100 Subject: [PATCH 41/62] Update CapacityGroupController.java --- .../controllers/CapacityGroupController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/controllers/CapacityGroupController.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/controllers/CapacityGroupController.java index 975cf19a..9e3a3999 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/controllers/CapacityGroupController.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/controllers/CapacityGroupController.java @@ -55,5 +55,6 @@ public ResponseEntity getCapacityGroupById(String capacit public ResponseEntity postCapacityGroup(CapacityGroupRequest capacityGroupRequest) { CapacityGroupResponse capacityGroupResponse = capacityGroupService.createCapacityGroup(capacityGroupRequest); return ResponseEntity.status(HttpStatus.OK).body(capacityGroupResponse); + } } From fa45e6ef381595124c3715f6fc943bcf658febca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Fri, 11 Aug 2023 19:55:00 +0100 Subject: [PATCH 42/62] Update WeekBasedMaterialServiceTest.java --- .../services/WeekBasedMaterialServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/WeekBasedMaterialServiceTest.java b/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/WeekBasedMaterialServiceTest.java index e779172e..c7d5283c 100644 --- a/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/WeekBasedMaterialServiceTest.java +++ b/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/WeekBasedMaterialServiceTest.java @@ -60,7 +60,7 @@ private static DemandWeekSeriesDto createDemandWeekSeriesDto() { DemandWeekSeriesDto demandWeekSeriesDto = new DemandWeekSeriesDto(); DemandSeriesCategoryDto demandSeriesCategoryDto = new DemandSeriesCategoryDto(); - demandSeriesCategoryDto.setDemandCategoryCode("default"); + demandSeriesCategoryDto.setId("f50c3e71-a1a7-44c9-9de6-2e7aaaf65ac4"); demandWeekSeriesDto.setCustomerLocation(""); demandWeekSeriesDto.setDemands(List.of(demandSeriesDto)); From e0f24689d78681acf994cf00ddd0a472ef34d52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Wed, 16 Aug 2023 09:49:03 +0100 Subject: [PATCH 43/62] fix: some warnings --- .../src/components/capacitygroup/CapacityGroupDetailsPage.tsx | 1 + .../src/components/capacitygroup/CapacityGroupPage.tsx | 2 +- .../src/contexts/DemandContextProvider.tsx | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx index f9505af1..149a65d2 100644 --- a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupDetailsPage.tsx @@ -32,6 +32,7 @@ function CapacityGroupDetailsPage() { // Perform save operation here setEditMode(false); setSavedChanges(true); + console.log(savedChanges);// todo clean }; const handleRevert = () => { diff --git a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupPage.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupPage.tsx index d178b339..6d6dc662 100644 --- a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupPage.tsx @@ -20,7 +20,7 @@ * ******************************************************************************** */ -import CapacityGroupsProvider, { CapacityGroupContext } from "../../contexts/CapacityGroupsContextProvider"; +import CapacityGroupsProvider from "../../contexts/CapacityGroupsContextProvider"; import CapacityGroupsList from "./CapacityGroupsView"; diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx index 2c2ecddb..0480b863 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx @@ -50,6 +50,7 @@ const DemandContextProvider: React.FC> = (props) => }); const result: DemandProp[] = response.data; setDemandProps(result); + console.log(demands)// todo clean } catch (error) { console.error('Error fetching demands:', error); } @@ -84,6 +85,7 @@ const DemandContextProvider: React.FC> = (props) => try { console.log(newDemand); const response = await axios.post('/demand', newDemand); + console.log(response) //todo clean fetchDemandProps(); } catch (error) { console.error('Error creating demand:', error); From 1c9969483f208a723712d814735b4fa3b6ffd9d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Wed, 16 Aug 2023 11:05:05 +0100 Subject: [PATCH 44/62] fix: workflow --- .../services/CapacityGroupServiceTest.java | 19 +++++++++++++++++++ .../capacitygroup/CapacityGroupsView.tsx | 6 +++--- .../src/components/demands/DemandPage.tsx | 6 +++--- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java b/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java index 99052f62..eb19ce5f 100644 --- a/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java +++ b/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java @@ -35,10 +35,13 @@ import java.util.List; import java.util.Optional; import java.util.UUID; + +import eclipse.tractusx.demand_capacity_mgmt_specification.model.WeekBasedMaterialDemandRequestDto; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.*; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.enums.CapacityGroupStatus; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.CapacityGroupRepository; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.LinkDemandRepository; +import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.WeekBasedMaterialDemandRepository; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.services.impl.CapacityGroupServiceImpl; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -61,6 +64,9 @@ public class CapacityGroupServiceTest { @Mock private CapacityGroupRepository capacityGroupRepository; + @Mock + private WeekBasedMaterialDemandRepository weekBasedMaterialDemandRepository; + @Mock private LinkDemandRepository linkDemandRepository; @@ -72,6 +78,8 @@ public class CapacityGroupServiceTest { private static UnitMeasureEntity unitMeasure = createUnitMeasureEntity(); + private static WeekBasedMaterialDemandEntity weekBasedMaterialDemand = createWeekBasedMaterialDemand(); + private CapacityGroupEntity capacityGroupEntity = createCapacityGroupEntity(); @Test @@ -80,6 +88,7 @@ void shouldCreateCapacityGroup() { when(unityOfMeasureService.findById(any())).thenReturn(null); when(companyService.getCompanyById(any())).thenReturn(company); when(linkDemandRepository.findById(any())).thenReturn(Optional.of(linkDemandEntity)); + when(weekBasedMaterialDemandRepository.findById(any())).thenReturn(Optional.of(weekBasedMaterialDemand)); when(capacityGroupRepository.save(any())).thenReturn(capacityGroupEntity); capacityGroupService.createCapacityGroup(capacityGroupRequest); @@ -180,4 +189,14 @@ private static List createCapacityTimeSeries(CapacityGroupEn return timeSeriesList; } + + private static WeekBasedMaterialDemandEntity createWeekBasedMaterialDemand(){ + WeekBasedMaterialDemandEntity entity = new WeekBasedMaterialDemandEntity(); + + entity.setViewed(false); + entity.setId(Long.valueOf("4")); + + return entity; + } + } diff --git a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx index 2261eaf3..81bd259e 100644 --- a/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx +++ b/demand-capacity-mgmt-frontend/src/components/capacitygroup/CapacityGroupsView.tsx @@ -20,17 +20,17 @@ * ******************************************************************************** */ -import React, { useContext, useState, useMemo, useCallback } from 'react'; +import React, { useContext, useState, useMemo} from 'react'; import { Form,Col,Row } from 'react-bootstrap'; import { CapacityGroupContext } from '../../contexts/CapacityGroupsContextProvider'; -import { CapacityGroup } from '../../interfaces/capacitygroup_interfaces'; +//import { CapacityGroup } from '../../interfaces/capacitygroup_interfaces'; import Pagination from '../Pagination'; import CapacityGroupsTable from './CapacityGroupsTable'; import Search from '../Search'; import '../../index.css'; const CapacityGroupsList: React.FC = () => { - const [selectedCapacityGroup, setSelectedCapacityGroup] = useState(null); + // to do clean /const [selectedCapacityGroup, setSelectedCapacityGroup] = useState(null); const { capacitygroups } = useContext(CapacityGroupContext)!; const [searchQuery, setSearchQuery] = useState(''); diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index dc3945d0..21e1b9e4 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -10,7 +10,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import React, { useContext, useState, useMemo ,useCallback, useEffect} from 'react'; +import React, { useContext, useState, useMemo ,useCallback} from 'react'; import { Modal, Button, Form, Col, Row } from 'react-bootstrap'; import { DemandProp } from '../../interfaces/demand_interfaces'; import Pagination from '../Pagination'; @@ -53,7 +53,7 @@ const DemandsPage: React.FC = () => { }; - const handleDeleteDemand = useCallback( + const handleDeleteDemand = useCallback( async (id: string) => { try { await deleteDemand(id); @@ -62,7 +62,7 @@ const DemandsPage: React.FC = () => { console.error('Error deleting demand:', error); } }, - [deleteDemand] + [deleteDemand, fetchDemandProps] ); const handleEdit = (demand: DemandProp) => { From 7fef54f0726adf17ec294d5108dab0ed9a220101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Wed, 16 Aug 2023 11:12:58 +0100 Subject: [PATCH 45/62] fix: workflows --- .../src/components/demands/DemandAddForm.tsx | 2 +- .../src/contexts/DemandContextProvider.tsx | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx index b4e70693..91d031b3 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandAddForm.tsx @@ -109,7 +109,7 @@ const useHandleSubmit = (initialFormState: Demand) => { // Handle error if needed } } - }, []); + }, [createDemand]); return { submissionStatus, handleSubmit }; }; diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx index 0480b863..6daabef8 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx @@ -50,11 +50,10 @@ const DemandContextProvider: React.FC> = (props) => }); const result: DemandProp[] = response.data; setDemandProps(result); - console.log(demands)// todo clean } catch (error) { console.error('Error fetching demands:', error); } - }, []); + }, [demands]); useEffect(() => { fetchDemandProps(); From 0c893ed5a8bb4c26c9a3bc5afe1da551be99254a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Wed, 16 Aug 2023 11:18:26 +0100 Subject: [PATCH 46/62] Update DemandContextProvider.tsx --- .../src/contexts/DemandContextProvider.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx index 6daabef8..0480b863 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx @@ -50,10 +50,11 @@ const DemandContextProvider: React.FC> = (props) => }); const result: DemandProp[] = response.data; setDemandProps(result); + console.log(demands)// todo clean } catch (error) { console.error('Error fetching demands:', error); } - }, [demands]); + }, []); useEffect(() => { fetchDemandProps(); From 22c76f902a1bbae6c6145317b1b9df978249c040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Wed, 16 Aug 2023 11:25:55 +0100 Subject: [PATCH 47/62] Update DemandContextProvider.tsx --- .../src/contexts/DemandContextProvider.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx index 0480b863..29da7cc9 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx @@ -50,11 +50,11 @@ const DemandContextProvider: React.FC> = (props) => }); const result: DemandProp[] = response.data; setDemandProps(result); - console.log(demands)// todo clean } catch (error) { console.error('Error fetching demands:', error); } - }, []); + }, [demands]); // Include 'demands' in the dependency array + useEffect(() => { fetchDemandProps(); From 8a0474d4833e6f83698f74e9ce57f38ddbfb91c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Wed, 16 Aug 2023 11:34:33 +0100 Subject: [PATCH 48/62] Update DemandContextProvider.tsx --- .../src/contexts/DemandContextProvider.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx index 29da7cc9..512203a4 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx @@ -41,6 +41,7 @@ const DemandContextProvider: React.FC> = (props) => const [demands, setDemands] = useState([]); const [demandprops, setDemandProps] = useState([]); + // eslint-disable-next-line react-hooks/exhaustive-deps const fetchDemandProps = useCallback(async () => { try { const response = await axios.get('/demand', { @@ -50,11 +51,11 @@ const DemandContextProvider: React.FC> = (props) => }); const result: DemandProp[] = response.data; setDemandProps(result); + console.log(demands)// TODO clean } catch (error) { console.error('Error fetching demands:', error); } - }, [demands]); // Include 'demands' in the dependency array - + }, []); useEffect(() => { fetchDemandProps(); @@ -85,7 +86,7 @@ const DemandContextProvider: React.FC> = (props) => try { console.log(newDemand); const response = await axios.post('/demand', newDemand); - console.log(response) //todo clean + console.log(response) //TODO clean fetchDemandProps(); } catch (error) { console.error('Error creating demand:', error); From 9bfe206647c0bf224142bd9519b984a5430f01fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Wed, 16 Aug 2023 11:41:42 +0100 Subject: [PATCH 49/62] Update DemandContextProvider.tsx --- .../src/contexts/DemandContextProvider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx index 512203a4..2122beae 100644 --- a/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx +++ b/demand-capacity-mgmt-frontend/src/contexts/DemandContextProvider.tsx @@ -55,7 +55,7 @@ const DemandContextProvider: React.FC> = (props) => } catch (error) { console.error('Error fetching demands:', error); } - }, []); + }, [demands]); useEffect(() => { fetchDemandProps(); From af88872c3e60ac4506f0cd3fdd4200abc69e1154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Wed, 16 Aug 2023 17:26:34 +0100 Subject: [PATCH 50/62] Update CapacityGroupServiceTest.java --- .../services/CapacityGroupServiceTest.java | 103 +++++++++++------- 1 file changed, 64 insertions(+), 39 deletions(-) diff --git a/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java b/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java index eb19ce5f..a8a99861 100644 --- a/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java +++ b/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java @@ -40,8 +40,8 @@ import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.*; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.enums.CapacityGroupStatus; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.CapacityGroupRepository; +import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.DemandCategoryRepository; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.LinkDemandRepository; -import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.WeekBasedMaterialDemandRepository; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.services.impl.CapacityGroupServiceImpl; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -65,10 +65,10 @@ public class CapacityGroupServiceTest { private CapacityGroupRepository capacityGroupRepository; @Mock - private WeekBasedMaterialDemandRepository weekBasedMaterialDemandRepository; + private LinkDemandRepository linkDemandRepository; @Mock - private LinkDemandRepository linkDemandRepository; + private DemandCategoryService demandCategoryService; private static CapacityGroupRequest capacityGroupRequest = createCapacityGroupRequest(); @@ -78,8 +78,9 @@ public class CapacityGroupServiceTest { private static UnitMeasureEntity unitMeasure = createUnitMeasureEntity(); - private static WeekBasedMaterialDemandEntity weekBasedMaterialDemand = createWeekBasedMaterialDemand(); + private static WeekBasedMaterialDemandEntity weekBasedMaterialDemandEntity = createWeekBasedMaterialDemandEntity(); + private static DemandCategoryEntity demandCategoryEntity = createDemandCategoryEntity(); private CapacityGroupEntity capacityGroupEntity = createCapacityGroupEntity(); @Test @@ -87,8 +88,9 @@ void shouldCreateCapacityGroup() { when(companyService.getCompanyIn(any())).thenReturn(List.of(company)); when(unityOfMeasureService.findById(any())).thenReturn(null); when(companyService.getCompanyById(any())).thenReturn(company); + when(demandCategoryService.findById(any())).thenReturn(demandCategoryEntity); when(linkDemandRepository.findById(any())).thenReturn(Optional.of(linkDemandEntity)); - when(weekBasedMaterialDemandRepository.findById(any())).thenReturn(Optional.of(weekBasedMaterialDemand)); + // when(demandCategoryService.save(any())).thenReturn(demandCategoryEntity); when(capacityGroupRepository.save(any())).thenReturn(capacityGroupEntity); capacityGroupService.createCapacityGroup(capacityGroupRequest); @@ -118,48 +120,50 @@ private static CapacityGroupRequest createCapacityGroupRequest() { private static CompanyEntity createCompanyEntity() { return CompanyEntity - .builder() - .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01641")) - .myCompany("Test") - .companyName("Test") - .build(); + .builder() + .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01641")) + .myCompany("Test") + .companyName("Test") + .build(); } private static LinkDemandEntity createLinkDemandEntity() { return LinkDemandEntity - .builder() - .linked(false) - .demandCategoryId("") - .materialNumberSupplier("") - .materialNumberCustomer("") - .build(); + .builder() + .linked(false) + .demandCategoryId("08b95a75-11a7-4bea-a958-821b9cb01642") + .materialNumberSupplier("08b95a75-11a7-4bea-a958-821b9cb01642") + .materialNumberCustomer("08b95a75-11a7-4bea-a958-821b9cb01642") + .weekBasedMaterialDemand(weekBasedMaterialDemandEntity) + + .build(); } private static UnitMeasureEntity createUnitMeasureEntity() { return UnitMeasureEntity - .builder() - .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01643")) - .codeValue("Kilogram") - .displayValue("Kg") - .build(); + .builder() + .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01643")) + .codeValue("Kilogram") + .displayValue("Kg") + .build(); } private static CapacityGroupEntity createCapacityGroupEntity() { CapacityGroupEntity capacityGroup = CapacityGroupEntity - .builder() - .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) - .capacityGroupId(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) - .materialDescriptionCustomer("08b95a75-11a7-4bea-a958-821b9cb01641") - .materialNumberCustomer("08b95a75-11a7-4bea-a958-821b9cb01641") - .changedAt(LocalDateTime.now()) - .customerId(company) - .supplierId(company) - .unitMeasure(unitMeasure) - .linkedDemandSeries(new ArrayList<>()) - .supplierLocation(new ArrayList<>()) - .name("Test") - .status(CapacityGroupStatus.READY_SYNCHRONIZE) - .build(); + .builder() + .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) + .capacityGroupId(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) + .materialDescriptionCustomer("08b95a75-11a7-4bea-a958-821b9cb01641") + .materialNumberCustomer("08b95a75-11a7-4bea-a958-821b9cb01641") + .changedAt(LocalDateTime.now()) + .customerId(company) + .supplierId(company) + .unitMeasure(unitMeasure) + .linkedDemandSeries(new ArrayList<>()) + .supplierLocation(new ArrayList<>()) + .name("08b95a75-11a7-4bea-a958-821b9cb01642") + .status(CapacityGroupStatus.READY_SYNCHRONIZE) + .build(); List timeSeriesList = createCapacityTimeSeries(capacityGroup); @@ -190,13 +194,34 @@ private static List createCapacityTimeSeries(CapacityGroupEn return timeSeriesList; } - private static WeekBasedMaterialDemandEntity createWeekBasedMaterialDemand(){ - WeekBasedMaterialDemandEntity entity = new WeekBasedMaterialDemandEntity(); - entity.setViewed(false); - entity.setId(Long.valueOf("4")); + private static WeekBasedMaterialDemandEntity createWeekBasedMaterialDemandEntity(){ + + WeekBasedMaterialDemandRequestDto dto = new WeekBasedMaterialDemandRequestDto(); + dto.setUnityOfMeasure("kg"); + dto.setCustomer("08b95a75-11a7-4bea-a958-821b9cb01643"); + dto.setMaterialDemandId("ID"); + dto.setMaterialNumberCustomer("IDD"); + dto.setMaterialDescriptionCustomer("08b95a75-11a7-4bea-a958-821b9cb01643"); + dto.setChangedAt("now"); + + WeekBasedMaterialDemandEntity entity = WeekBasedMaterialDemandEntity + .builder() + .id(Long.valueOf("4")) + .viewed(false) + .weekBasedMaterialDemand(dto) + .build(); return entity; } + private static DemandCategoryEntity createDemandCategoryEntity(){ + DemandCategoryEntity demandCategoryEntity = DemandCategoryEntity + .builder() + .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) + .demandCategoryCode("Test") + .demandCategoryName("test2") + .build(); + return demandCategoryEntity; + } } From ed1878f6682fc5fac4b9306632c282a6428cb61f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Mon, 21 Aug 2023 11:49:00 +0100 Subject: [PATCH 51/62] fix: code cleaning --- .../controllers/CapacityGroupController.java | 1 - .../impl/CapacityGroupServiceImpl.java | 9 +- .../WeekBasedCapacityGroupServiceImpl.java | 11 ++- .../services/CapacityGroupServiceTest.java | 95 +++++++++---------- 4 files changed, 57 insertions(+), 59 deletions(-) diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/controllers/CapacityGroupController.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/controllers/CapacityGroupController.java index 9e3a3999..975cf19a 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/controllers/CapacityGroupController.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/controllers/CapacityGroupController.java @@ -55,6 +55,5 @@ public ResponseEntity getCapacityGroupById(String capacit public ResponseEntity postCapacityGroup(CapacityGroupRequest capacityGroupRequest) { CapacityGroupResponse capacityGroupResponse = capacityGroupService.createCapacityGroup(capacityGroupRequest); return ResponseEntity.status(HttpStatus.OK).body(capacityGroupResponse); - } } diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CapacityGroupServiceImpl.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CapacityGroupServiceImpl.java index 9105a821..a9dd955d 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CapacityGroupServiceImpl.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/CapacityGroupServiceImpl.java @@ -178,15 +178,18 @@ private CapacityGroupEntity enrichCapacityGroup(CapacityGroupRequest capacityGro WeekBasedMaterialDemandEntity weekBasedMaterialDemandEntity = linkDemandEntity.getWeekBasedMaterialDemand(); WeekBasedMaterialDemandRequestDto weekBasedMaterialDemandRequestDto = weekBasedMaterialDemandEntity.getWeekBasedMaterialDemand(); - CompanyEntity customerId = companyService.getCompanyById(UUID.fromString(weekBasedMaterialDemandRequestDto.getCustomer())); + CompanyEntity customerId = companyService.getCompanyById( + UUID.fromString(weekBasedMaterialDemandRequestDto.getCustomer()) + ); materialNumberCustomer.set(linkDemandEntity.getMaterialNumberCustomer()); materialDescriptionCustomer.set(linkDemandEntity.getMaterialNumberCustomer()); String demandCategoryId = linkDemandEntity.getDemandCategoryId(); - DemandCategoryEntity demandCategoryEntity = demandCategoryService.findById(UUID.fromString(demandCategoryId)); - + DemandCategoryEntity demandCategoryEntity = demandCategoryService.findById( + UUID.fromString(demandCategoryId) + ); linkDemandEntity.setLinked(true); linkDemandRepository.save(linkDemandEntity); diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedCapacityGroupServiceImpl.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedCapacityGroupServiceImpl.java index 6b3eff1f..48732eec 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedCapacityGroupServiceImpl.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/impl/WeekBasedCapacityGroupServiceImpl.java @@ -168,15 +168,16 @@ public void createWeekBasedCapacityGroupRequestFromEntity(CapacityGroupEntity ca } @Override - public WeekBasedCapacityGroupEntity findById(String capacityGroupId) { - Optional weekBasedCapacityGroupEntityOptional = weekBasedCapacityGroupRepository.findById(Integer.getInteger(capacityGroupId)); + public WeekBasedCapacityGroupEntity findById(String capacityGroupId) { + Optional weekBasedCapacityGroupEntityOptional = weekBasedCapacityGroupRepository.findById( + Integer.getInteger(capacityGroupId) + ); - if (weekBasedCapacityGroupEntityOptional.isEmpty()){ + if (weekBasedCapacityGroupEntityOptional.isEmpty()) { throw new NotFoundException("WeekBasedCapacity not found"); } - return weekBasedCapacityGroupEntityOptional.get(); - + return weekBasedCapacityGroupEntityOptional.get(); } private static CapacitiesDto getCapacitiesDto(CapacityTimeSeries capacityTimeSeries) { diff --git a/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java b/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java index a8a99861..9ee053fa 100644 --- a/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java +++ b/demand-capacity-mgmt-backend/src/test/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/services/CapacityGroupServiceTest.java @@ -29,14 +29,13 @@ import eclipse.tractusx.demand_capacity_mgmt_specification.model.CapacityGroupRequest; import eclipse.tractusx.demand_capacity_mgmt_specification.model.CapacityRequest; +import eclipse.tractusx.demand_capacity_mgmt_specification.model.WeekBasedMaterialDemandRequestDto; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; - -import eclipse.tractusx.demand_capacity_mgmt_specification.model.WeekBasedMaterialDemandRequestDto; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.*; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.enums.CapacityGroupStatus; import org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.repositories.CapacityGroupRepository; @@ -90,7 +89,7 @@ void shouldCreateCapacityGroup() { when(companyService.getCompanyById(any())).thenReturn(company); when(demandCategoryService.findById(any())).thenReturn(demandCategoryEntity); when(linkDemandRepository.findById(any())).thenReturn(Optional.of(linkDemandEntity)); - // when(demandCategoryService.save(any())).thenReturn(demandCategoryEntity); + // when(demandCategoryService.save(any())).thenReturn(demandCategoryEntity); when(capacityGroupRepository.save(any())).thenReturn(capacityGroupEntity); capacityGroupService.createCapacityGroup(capacityGroupRequest); @@ -120,50 +119,49 @@ private static CapacityGroupRequest createCapacityGroupRequest() { private static CompanyEntity createCompanyEntity() { return CompanyEntity - .builder() - .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01641")) - .myCompany("Test") - .companyName("Test") - .build(); + .builder() + .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01641")) + .myCompany("Test") + .companyName("Test") + .build(); } private static LinkDemandEntity createLinkDemandEntity() { return LinkDemandEntity - .builder() - .linked(false) - .demandCategoryId("08b95a75-11a7-4bea-a958-821b9cb01642") - .materialNumberSupplier("08b95a75-11a7-4bea-a958-821b9cb01642") - .materialNumberCustomer("08b95a75-11a7-4bea-a958-821b9cb01642") - .weekBasedMaterialDemand(weekBasedMaterialDemandEntity) - - .build(); + .builder() + .linked(false) + .demandCategoryId("08b95a75-11a7-4bea-a958-821b9cb01642") + .materialNumberSupplier("08b95a75-11a7-4bea-a958-821b9cb01642") + .materialNumberCustomer("08b95a75-11a7-4bea-a958-821b9cb01642") + .weekBasedMaterialDemand(weekBasedMaterialDemandEntity) + .build(); } private static UnitMeasureEntity createUnitMeasureEntity() { return UnitMeasureEntity - .builder() - .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01643")) - .codeValue("Kilogram") - .displayValue("Kg") - .build(); + .builder() + .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01643")) + .codeValue("Kilogram") + .displayValue("Kg") + .build(); } private static CapacityGroupEntity createCapacityGroupEntity() { CapacityGroupEntity capacityGroup = CapacityGroupEntity - .builder() - .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) - .capacityGroupId(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) - .materialDescriptionCustomer("08b95a75-11a7-4bea-a958-821b9cb01641") - .materialNumberCustomer("08b95a75-11a7-4bea-a958-821b9cb01641") - .changedAt(LocalDateTime.now()) - .customerId(company) - .supplierId(company) - .unitMeasure(unitMeasure) - .linkedDemandSeries(new ArrayList<>()) - .supplierLocation(new ArrayList<>()) - .name("08b95a75-11a7-4bea-a958-821b9cb01642") - .status(CapacityGroupStatus.READY_SYNCHRONIZE) - .build(); + .builder() + .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) + .capacityGroupId(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) + .materialDescriptionCustomer("08b95a75-11a7-4bea-a958-821b9cb01641") + .materialNumberCustomer("08b95a75-11a7-4bea-a958-821b9cb01641") + .changedAt(LocalDateTime.now()) + .customerId(company) + .supplierId(company) + .unitMeasure(unitMeasure) + .linkedDemandSeries(new ArrayList<>()) + .supplierLocation(new ArrayList<>()) + .name("08b95a75-11a7-4bea-a958-821b9cb01642") + .status(CapacityGroupStatus.READY_SYNCHRONIZE) + .build(); List timeSeriesList = createCapacityTimeSeries(capacityGroup); @@ -194,9 +192,7 @@ private static List createCapacityTimeSeries(CapacityGroupEn return timeSeriesList; } - - private static WeekBasedMaterialDemandEntity createWeekBasedMaterialDemandEntity(){ - + private static WeekBasedMaterialDemandEntity createWeekBasedMaterialDemandEntity() { WeekBasedMaterialDemandRequestDto dto = new WeekBasedMaterialDemandRequestDto(); dto.setUnityOfMeasure("kg"); dto.setCustomer("08b95a75-11a7-4bea-a958-821b9cb01643"); @@ -205,23 +201,22 @@ private static WeekBasedMaterialDemandEntity createWeekBasedMaterialDemandEntity dto.setMaterialDescriptionCustomer("08b95a75-11a7-4bea-a958-821b9cb01643"); dto.setChangedAt("now"); - WeekBasedMaterialDemandEntity entity = WeekBasedMaterialDemandEntity - .builder() - .id(Long.valueOf("4")) - .viewed(false) - .weekBasedMaterialDemand(dto) - .build(); + .builder() + .id(Long.valueOf("4")) + .viewed(false) + .weekBasedMaterialDemand(dto) + .build(); return entity; } - private static DemandCategoryEntity createDemandCategoryEntity(){ + private static DemandCategoryEntity createDemandCategoryEntity() { DemandCategoryEntity demandCategoryEntity = DemandCategoryEntity - .builder() - .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) - .demandCategoryCode("Test") - .demandCategoryName("test2") - .build(); + .builder() + .id(UUID.fromString("08b95a75-11a7-4bea-a958-821b9cb01642")) + .demandCategoryCode("Test") + .demandCategoryName("test2") + .build(); return demandCategoryEntity; } } From 7d5497e6162ee1adcbbab7ca29709e6f669b9ee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Mon, 21 Aug 2023 12:04:59 +0100 Subject: [PATCH 52/62] Create veracode.pipeline-frontend.yml --- .../workflows/veracode.pipeline-frontend.yml | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/veracode.pipeline-frontend.yml diff --git a/.github/workflows/veracode.pipeline-frontend.yml b/.github/workflows/veracode.pipeline-frontend.yml new file mode 100644 index 00000000..d8135614 --- /dev/null +++ b/.github/workflows/veracode.pipeline-frontend.yml @@ -0,0 +1,41 @@ +name: Veracode Static Analysis Pipeline Scan + +on: + push: + branches: [ "feature/DCMFOSS-61" ] + paths: + - 'demand-capacity-mgmt-frontend/**' + pull_request: + branches: [ "main" ] + schedule: + - cron: '27 12 * * 6' + +permissions: + contents: read + +jobs: + analyse-frontend: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + + steps: + - name: Checkout repository + - uses: actions/checkout@v3 + with: + repository: '' + + - name: Zip Project + - run: zip -r veracode-scan-target.zip ./ + + - name: Run Veracode Upload And Scan + uses: veracode/veracode-uploadandscan-action@0.2.4 + with: + appname: "demand-capacity-mgmt-frontend" + createprofile: false + filepath: "./veracode-scan-target.zip" + vid: "${{ secrets.VERACODE_API_ID }}" + vkey: "${{ secrets.VERACODE_API_KEY }}" \ No newline at end of file From 63f620a551403270a986e9b4e08fd0eefe7c8fb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Mon, 21 Aug 2023 12:07:43 +0100 Subject: [PATCH 53/62] Update veracode.pipeline-frontend.yml --- .github/workflows/veracode.pipeline-frontend.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/veracode.pipeline-frontend.yml b/.github/workflows/veracode.pipeline-frontend.yml index d8135614..7917215c 100644 --- a/.github/workflows/veracode.pipeline-frontend.yml +++ b/.github/workflows/veracode.pipeline-frontend.yml @@ -2,7 +2,7 @@ name: Veracode Static Analysis Pipeline Scan on: push: - branches: [ "feature/DCMFOSS-61" ] + branches: [ "main" ] paths: - 'demand-capacity-mgmt-frontend/**' pull_request: From de37d22cc225136787e0b63e203ff9cda16b7860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Mon, 21 Aug 2023 12:11:19 +0100 Subject: [PATCH 54/62] Update veracode-pipeline-frontend.yml --- ...ode.pipeline-frontend.yml => veracode-pipeline-frontend.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{veracode.pipeline-frontend.yml => veracode-pipeline-frontend.yml} (95%) diff --git a/.github/workflows/veracode.pipeline-frontend.yml b/.github/workflows/veracode-pipeline-frontend.yml similarity index 95% rename from .github/workflows/veracode.pipeline-frontend.yml rename to .github/workflows/veracode-pipeline-frontend.yml index 7917215c..d8135614 100644 --- a/.github/workflows/veracode.pipeline-frontend.yml +++ b/.github/workflows/veracode-pipeline-frontend.yml @@ -2,7 +2,7 @@ name: Veracode Static Analysis Pipeline Scan on: push: - branches: [ "main" ] + branches: [ "feature/DCMFOSS-61" ] paths: - 'demand-capacity-mgmt-frontend/**' pull_request: From ae6a0871c5916e3bb3f3c8e772e019729287c2fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Mon, 21 Aug 2023 12:15:09 +0100 Subject: [PATCH 55/62] Update veracode-pipeline-frontend.yml --- .../workflows/veracode-pipeline-frontend.yml | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/veracode-pipeline-frontend.yml b/.github/workflows/veracode-pipeline-frontend.yml index d8135614..a1a695ae 100644 --- a/.github/workflows/veracode-pipeline-frontend.yml +++ b/.github/workflows/veracode-pipeline-frontend.yml @@ -1,4 +1,23 @@ -name: Veracode Static Analysis Pipeline Scan +# ******************************************************************************* +# Copyright (c) 2023 BMW AG +# Copyright (c) 2023 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License, Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0. +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************** +name: Veracode Frontend Scan on: push: From 3f356cf6dfef89191e3c9935601e47ce53ee4623 Mon Sep 17 00:00:00 2001 From: Bailonis <72702458+Bailonis@users.noreply.github.com> Date: Mon, 21 Aug 2023 12:22:10 +0100 Subject: [PATCH 56/62] Create veracode.yml --- .github/workflows/veracode.yml | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .github/workflows/veracode.yml diff --git a/.github/workflows/veracode.yml b/.github/workflows/veracode.yml new file mode 100644 index 00000000..590161d4 --- /dev/null +++ b/.github/workflows/veracode.yml @@ -0,0 +1,60 @@ +# ******************************************************************************* +# Copyright (c) 2023 BMW AG +# Copyright (c) 2023 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License, Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0. +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************** +name: Veracode Frontend Scan + +on: + push: + branches: [ "main" ] + paths: + - 'demand-capacity-mgmt-frontend/**' + pull_request: + branches: [ "main" ] + schedule: + - cron: '27 12 * * 6' + +permissions: + contents: read + +jobs: + analyse-frontend: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + + steps: + - name: Checkout repository + - uses: actions/checkout@v3 + with: + repository: '' + + - name: Zip Project + - run: zip -r veracode-scan-target.zip ./ + + - name: Run Veracode Upload And Scan + uses: veracode/veracode-uploadandscan-action@0.2.4 + with: + appname: "demand-capacity-mgmt-frontend" + createprofile: false + filepath: "./veracode-scan-target.zip" + vid: "${{ secrets.VERACODE_API_ID }}" + vkey: "${{ secrets.VERACODE_API_KEY }}" From eaf46ca50201452d149262f755edf7f208ecc746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Mon, 21 Aug 2023 12:27:46 +0100 Subject: [PATCH 57/62] fix: verecode frontend --- .../workflows/veracode-pipeline-frontend.yml | 60 ------------------- .github/workflows/veracode.yml | 6 +- 2 files changed, 3 insertions(+), 63 deletions(-) delete mode 100644 .github/workflows/veracode-pipeline-frontend.yml diff --git a/.github/workflows/veracode-pipeline-frontend.yml b/.github/workflows/veracode-pipeline-frontend.yml deleted file mode 100644 index a1a695ae..00000000 --- a/.github/workflows/veracode-pipeline-frontend.yml +++ /dev/null @@ -1,60 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2023 BMW AG -# Copyright (c) 2023 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License, Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0. -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************** -name: Veracode Frontend Scan - -on: - push: - branches: [ "feature/DCMFOSS-61" ] - paths: - - 'demand-capacity-mgmt-frontend/**' - pull_request: - branches: [ "main" ] - schedule: - - cron: '27 12 * * 6' - -permissions: - contents: read - -jobs: - analyse-frontend: - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - - steps: - - name: Checkout repository - - uses: actions/checkout@v3 - with: - repository: '' - - - name: Zip Project - - run: zip -r veracode-scan-target.zip ./ - - - name: Run Veracode Upload And Scan - uses: veracode/veracode-uploadandscan-action@0.2.4 - with: - appname: "demand-capacity-mgmt-frontend" - createprofile: false - filepath: "./veracode-scan-target.zip" - vid: "${{ secrets.VERACODE_API_ID }}" - vkey: "${{ secrets.VERACODE_API_KEY }}" \ No newline at end of file diff --git a/.github/workflows/veracode.yml b/.github/workflows/veracode.yml index 590161d4..128ca996 100644 --- a/.github/workflows/veracode.yml +++ b/.github/workflows/veracode.yml @@ -21,11 +21,11 @@ name: Veracode Frontend Scan on: push: - branches: [ "main" ] + branches: [ "feature/DCMFOSS-61" ] paths: - 'demand-capacity-mgmt-frontend/**' pull_request: - branches: [ "main" ] + branches: [ "feature/DCMFOSS-61" ] schedule: - cron: '27 12 * * 6' @@ -57,4 +57,4 @@ jobs: createprofile: false filepath: "./veracode-scan-target.zip" vid: "${{ secrets.VERACODE_API_ID }}" - vkey: "${{ secrets.VERACODE_API_KEY }}" + vkey: "${{ secrets.VERACODE_API_KEY }}" \ No newline at end of file From e6935f667112ab940719a91930fce501d1a38277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Mon, 21 Aug 2023 14:32:23 +0100 Subject: [PATCH 58/62] fix: once a day scheduler for veracode workflow --- .github/workflows/veracode-pipeline.yml | 3 +- .github/workflows/veracode.yml | 60 ------------------------- 2 files changed, 2 insertions(+), 61 deletions(-) delete mode 100644 .github/workflows/veracode.yml diff --git a/.github/workflows/veracode-pipeline.yml b/.github/workflows/veracode-pipeline.yml index 49c8f707..a6216755 100644 --- a/.github/workflows/veracode-pipeline.yml +++ b/.github/workflows/veracode-pipeline.yml @@ -28,7 +28,8 @@ on: pull_request: branches: [ "main" ] schedule: - - cron: '27 12 * * 6' + # Once a day + - cron: "0 0 * * *" permissions: contents: read diff --git a/.github/workflows/veracode.yml b/.github/workflows/veracode.yml deleted file mode 100644 index 128ca996..00000000 --- a/.github/workflows/veracode.yml +++ /dev/null @@ -1,60 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2023 BMW AG -# Copyright (c) 2023 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License, Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0. -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************** -name: Veracode Frontend Scan - -on: - push: - branches: [ "feature/DCMFOSS-61" ] - paths: - - 'demand-capacity-mgmt-frontend/**' - pull_request: - branches: [ "feature/DCMFOSS-61" ] - schedule: - - cron: '27 12 * * 6' - -permissions: - contents: read - -jobs: - analyse-frontend: - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - - steps: - - name: Checkout repository - - uses: actions/checkout@v3 - with: - repository: '' - - - name: Zip Project - - run: zip -r veracode-scan-target.zip ./ - - - name: Run Veracode Upload And Scan - uses: veracode/veracode-uploadandscan-action@0.2.4 - with: - appname: "demand-capacity-mgmt-frontend" - createprofile: false - filepath: "./veracode-scan-target.zip" - vid: "${{ secrets.VERACODE_API_ID }}" - vkey: "${{ secrets.VERACODE_API_KEY }}" \ No newline at end of file From a4058ea40baa6af1f0fa845bfad973fa739408eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Tue, 22 Aug 2023 11:11:39 +0100 Subject: [PATCH 59/62] Update DEPENDENCIES files --- DEPENDENCIES.txt | 0 DEPENDENCIES_BACKEND | 101 ++ DEPENDENCIES_FRONTEND | 1571 ++++++++++++++++++++ DEPENDENCIES_SPECIFICATION | 37 + LICENSE.txt | 202 --- NOTICE.md | 2 +- demand-capacity-mgmt-frontend/DEPENDENCIES | 0 7 files changed, 1710 insertions(+), 203 deletions(-) delete mode 100644 DEPENDENCIES.txt create mode 100644 DEPENDENCIES_BACKEND create mode 100644 DEPENDENCIES_FRONTEND create mode 100644 DEPENDENCIES_SPECIFICATION delete mode 100644 LICENSE.txt delete mode 100644 demand-capacity-mgmt-frontend/DEPENDENCIES diff --git a/DEPENDENCIES.txt b/DEPENDENCIES.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/DEPENDENCIES_BACKEND b/DEPENDENCIES_BACKEND new file mode 100644 index 00000000..58fcba0a --- /dev/null +++ b/DEPENDENCIES_BACKEND @@ -0,0 +1,101 @@ +maven/mavencentral/antlr/antlr/2.7.7, BSD-3-Clause, approved, #148 +maven/mavencentral/ch.qos.logback/logback-classic/1.2.11, EPL-1.0, approved, CQ13636 +maven/mavencentral/ch.qos.logback/logback-core/1.2.11, EPL-1.0, approved, CQ13635 +maven/mavencentral/com.fasterxml.jackson.core/jackson-annotations/2.13.4, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.fasterxml.jackson.core/jackson-core/2.13.4, Apache-2.0, approved, #2133 +maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.13.4.2, Apache-2.0, approved, #2134 +maven/mavencentral/com.fasterxml.jackson.datatype/jackson-datatype-jdk8/2.13.4, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.13.4, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.fasterxml.jackson.module/jackson-module-parameter-names/2.13.4, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.fasterxml.uuid/java-uuid-generator/3.1.5, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.fasterxml/classmate/1.5.1, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.google.code.gson/gson/2.10.1, Apache-2.0, approved, #6159 +maven/mavencentral/com.jayway.jsonpath/json-path/2.7.0, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.sun.activation/jakarta.activation/1.2.2, EPL-2.0 OR BSD-3-Clause OR GPL-2.0-only with Classpath-exception-2.0, approved, ee4j.jaf +maven/mavencentral/com.sun.istack/istack-commons-runtime/3.0.12, BSD-3-Clause, approved, ee4j.jaxb-impl +maven/mavencentral/com.vaadin.external.google/android-json/0.0.20131108.vaadin1, Apache-2.0, approved, CQ21310 +maven/mavencentral/com.zaxxer/HikariCP/4.0.3, Apache-2.0, approved, clearlydefined +maven/mavencentral/io.micrometer/micrometer-core/1.9.7, Apache-2.0 AND (Apache-2.0 AND MIT), approved, #7711 +maven/mavencentral/io.swagger.core.v3/swagger-annotations/2.2.8, Apache-2.0, approved, clearlydefined +maven/mavencentral/jakarta.activation/jakarta.activation-api/1.2.2, EPL-2.0 OR BSD-3-Clause OR GPL-2.0-only with Classpath-exception-2.0, approved, ee4j.jaf +maven/mavencentral/jakarta.annotation/jakarta.annotation-api/1.3.5, EPL-2.0 OR GPL-2.0-only with Classpath-exception-2.0, approved, ee4j.ca +maven/mavencentral/jakarta.persistence/jakarta.persistence-api/2.2.3, EPL-2.0 OR BSD-3-Clause, approved, clearlydefined +maven/mavencentral/jakarta.transaction/jakarta.transaction-api/1.3.3, EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0, approved, #7701 +maven/mavencentral/jakarta.xml.bind/jakarta.xml.bind-api/2.3.3, BSD-3-Clause, approved, ee4j.jaxb +maven/mavencentral/javax.annotation/javax.annotation-api/1.3.2, CDDL-1.1 OR GPL-2.0-only WITH Classpath-exception-2.0, approved, CQ16910 +maven/mavencentral/javax.validation/validation-api/2.0.1.Final, Apache-2.0, approved, CQ15302 +maven/mavencentral/net.bytebuddy/byte-buddy-agent/1.12.22, Apache-2.0, approved, #1810 +maven/mavencentral/net.bytebuddy/byte-buddy/1.12.22, Apache-2.0 AND BSD-3-Clause, approved, #1811 +maven/mavencentral/net.minidev/accessors-smart/2.4.8, Apache-2.0, approved, #7515 +maven/mavencentral/net.minidev/json-smart/2.4.8, Apache-2.0, approved, #3288 +maven/mavencentral/org.apache.logging.log4j/log4j-api/2.17.2, Apache-2.0, approved, clearlydefined +maven/mavencentral/org.apache.logging.log4j/log4j-to-slf4j/2.17.2, Apache-2.0, approved, #2163 +maven/mavencentral/org.apache.tomcat.embed/tomcat-embed-core/9.0.71, Apache-2.0 AND (CDDL-1.0 OR GPL-2.0 WITH Classpath-exception-2.0), approved, CQ20188 +maven/mavencentral/org.apache.tomcat.embed/tomcat-embed-el/9.0.71, Apache-2.0, approved, CQ20193 +maven/mavencentral/org.apache.tomcat.embed/tomcat-embed-websocket/9.0.71, Apache-2.0, approved, CQ20194 +maven/mavencentral/org.apiguardian/apiguardian-api/1.1.2, Apache-2.0, approved, clearlydefined +maven/mavencentral/org.aspectj/aspectjweaver/1.9.7, EPL-1.0, approved, tools.aspectj +maven/mavencentral/org.assertj/assertj-core/3.22.0, Apache-2.0, approved, clearlydefined +maven/mavencentral/org.checkerframework/checker-qual/3.5.0, MIT, approved, clearlydefined +maven/mavencentral/org.eclipse.tractusx.demand-capacity-mgmt-specification/demand-capacity-mgmt-specification/1.0-SNAPSHOT, Apache-2.0, approved, automotive.tractusx +maven/mavencentral/org.flywaydb/flyway-core/8.5.13, Apache-2.0, approved, #2764 +maven/mavencentral/org.glassfish.jaxb/jaxb-runtime/2.3.7, BSD-3-Clause, approved, ee4j.jaxb +maven/mavencentral/org.glassfish.jaxb/txw2/2.3.7, BSD-3-Clause, approved, ee4j.jaxb +maven/mavencentral/org.hamcrest/hamcrest/2.2, BSD-3-Clause, approved, clearlydefined +maven/mavencentral/org.hdrhistogram/HdrHistogram/2.1.12, BSD-2-Clause OR LicenseRef-Public-Domain, approved, CQ13192 +maven/mavencentral/org.hibernate.common/hibernate-commons-annotations/5.1.2.Final, LGPL-2.1-or-later, approved, CQ21943 +maven/mavencentral/org.hibernate/hibernate-core/5.6.14.Final, LGPL-2.1-or-later, approved, #1510 +maven/mavencentral/org.jboss.logging/jboss-logging/3.4.3.Final, Apache-2.0, approved, CQ21255 +maven/mavencentral/org.jboss/jandex/2.4.2.Final, Apache-2.0, approved, clearlydefined +maven/mavencentral/org.junit.jupiter/junit-jupiter-api/5.8.2, EPL-2.0, approved, #1291 +maven/mavencentral/org.junit.jupiter/junit-jupiter-engine/5.8.2, EPL-2.0, approved, #1292 +maven/mavencentral/org.junit.jupiter/junit-jupiter-params/5.8.2, EPL-2.0, approved, #1488 +maven/mavencentral/org.junit.jupiter/junit-jupiter/5.8.2, EPL-2.0, approved, clearlydefined +maven/mavencentral/org.junit.platform/junit-platform-commons/1.8.2, EPL-2.0, approved, #1288 +maven/mavencentral/org.junit.platform/junit-platform-engine/1.8.2, EPL-2.0, approved, #1289 +maven/mavencentral/org.latencyutils/LatencyUtils/2.0.3, BSD-2-Clause, approved, CQ17408 +maven/mavencentral/org.mockito/mockito-core/4.5.1, MIT AND (Apache-2.0 AND MIT) AND Apache-2.0, approved, #2360 +maven/mavencentral/org.mockito/mockito-junit-jupiter/4.5.1, MIT, approved, clearlydefined +maven/mavencentral/org.objenesis/objenesis/3.2, Apache-2.0, approved, clearlydefined +maven/mavencentral/org.openapitools/jackson-databind-nullable/0.2.0, Apache-2.0, approved, #3294 +maven/mavencentral/org.opentest4j/opentest4j/1.2.0, Apache-2.0, approved, clearlydefined +maven/mavencentral/org.ow2.asm/asm/9.1, BSD-3-Clause, approved, CQ23029 +maven/mavencentral/org.postgresql/postgresql/42.3.8, BSD-2-Clause, approved, #2487 +maven/mavencentral/org.projectlombok/lombok/1.18.24, MIT AND LicenseRef-Public-Domain, approved, CQ23907 +maven/mavencentral/org.skyscreamer/jsonassert/1.5.1, Apache-2.0, approved, clearlydefined +maven/mavencentral/org.slf4j/jul-to-slf4j/1.7.36, MIT, approved, CQ12842 +maven/mavencentral/org.slf4j/slf4j-api/1.7.36, MIT, approved, CQ13368 +maven/mavencentral/org.springframework.boot/spring-boot-actuator-autoconfigure/2.7.8, Apache-2.0, approved, #3273 +maven/mavencentral/org.springframework.boot/spring-boot-actuator/2.7.8, Apache-2.0, approved, #4316 +maven/mavencentral/org.springframework.boot/spring-boot-autoconfigure/2.7.8, Apache-2.0, approved, #4314 +maven/mavencentral/org.springframework.boot/spring-boot-devtools/2.7.8, Apache-2.0, approved, clearlydefined +maven/mavencentral/org.springframework.boot/spring-boot-starter-actuator/2.7.8, Apache-2.0, approved, #4318 +maven/mavencentral/org.springframework.boot/spring-boot-starter-aop/2.7.8, Apache-2.0, approved, #4310 +maven/mavencentral/org.springframework.boot/spring-boot-starter-data-jpa/2.7.8, Apache-2.0, approved, #4379 +maven/mavencentral/org.springframework.boot/spring-boot-starter-jdbc/2.7.8, Apache-2.0, approved, #4401 +maven/mavencentral/org.springframework.boot/spring-boot-starter-json/2.7.8, Apache-2.0, approved, #4307 +maven/mavencentral/org.springframework.boot/spring-boot-starter-logging/2.7.8, Apache-2.0, approved, #4327 +maven/mavencentral/org.springframework.boot/spring-boot-starter-test/2.7.8, Apache-2.0, approved, #4320 +maven/mavencentral/org.springframework.boot/spring-boot-starter-tomcat/2.7.8, Apache-2.0, approved, #4305 +maven/mavencentral/org.springframework.boot/spring-boot-starter-web/2.7.8, Apache-2.0, approved, #4304 +maven/mavencentral/org.springframework.boot/spring-boot-starter/2.7.8, Apache-2.0, approved, #4308 +maven/mavencentral/org.springframework.boot/spring-boot-test-autoconfigure/2.7.8, Apache-2.0, approved, #4313 +maven/mavencentral/org.springframework.boot/spring-boot-test/2.7.8, Apache-2.0, approved, #4323 +maven/mavencentral/org.springframework.boot/spring-boot/2.7.8, Apache-2.0, approved, #4322 +maven/mavencentral/org.springframework.data/spring-data-commons/2.7.7, Apache-2.0, approved, #2768 +maven/mavencentral/org.springframework.data/spring-data-jpa/2.7.7, Apache-2.0, approved, #2766 +maven/mavencentral/org.springframework/spring-aop/5.3.25, Apache-2.0, approved, CQ23152 +maven/mavencentral/org.springframework/spring-aspects/5.3.25, Apache-2.0, approved, #1546 +maven/mavencentral/org.springframework/spring-beans/5.3.25, Apache-2.0, approved, CQ23153 +maven/mavencentral/org.springframework/spring-context/5.3.25, Apache-2.0, approved, CQ23051 +maven/mavencentral/org.springframework/spring-core/5.3.25, Apache-2.0 AND BSD-3-Clause, approved, CQ23154 +maven/mavencentral/org.springframework/spring-expression/5.3.25, Apache-2.0, approved, CQ23155 +maven/mavencentral/org.springframework/spring-jcl/5.3.25, Apache-2.0, approved, CQ23156 +maven/mavencentral/org.springframework/spring-jdbc/5.3.25, Apache-2.0, approved, #1545 +maven/mavencentral/org.springframework/spring-orm/5.3.25, Apache-2.0, approved, CQ23053 +maven/mavencentral/org.springframework/spring-test/5.3.25, Apache-2.0, approved, CQ23054 +maven/mavencentral/org.springframework/spring-tx/5.3.25, Apache-2.0, approved, CQ23055 +maven/mavencentral/org.springframework/spring-web/5.3.25, Apache-2.0 AND LicenseRef-Public-Domain, approved, CQ23157 +maven/mavencentral/org.springframework/spring-webmvc/5.3.25, Apache-2.0, approved, CQ23158 +maven/mavencentral/org.xmlunit/xmlunit-core/2.9.1, Apache-2.0, approved, #6272 +maven/mavencentral/org.yaml/snakeyaml/1.30, Apache-2.0, approved, clearlydefined diff --git a/DEPENDENCIES_FRONTEND b/DEPENDENCIES_FRONTEND new file mode 100644 index 00000000..0f8c586c --- /dev/null +++ b/DEPENDENCIES_FRONTEND @@ -0,0 +1,1571 @@ +npm/npmjs/-/abab/2.0.6, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/abort-controller/3.0.0, MIT, approved, #7592 +npm/npmjs/-/accepts/1.3.8, MIT, approved, clearlydefined +npm/npmjs/-/acorn-globals/6.0.0, MIT, approved, clearlydefined +npm/npmjs/-/acorn-import-assertions/1.9.0, MIT, approved, clearlydefined +npm/npmjs/-/acorn-jsx/5.3.2, MIT, approved, clearlydefined +npm/npmjs/-/acorn-walk/7.2.0, MIT, approved, clearlydefined +npm/npmjs/-/acorn/7.4.1, MIT, approved, clearlydefined +npm/npmjs/-/acorn/8.10.0, MIT, approved, #9312 +npm/npmjs/-/address/1.2.2, MIT, approved, clearlydefined +npm/npmjs/-/adjust-sourcemap-loader/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/agent-base/6.0.2, MIT, approved, clearlydefined +npm/npmjs/-/ajv-formats/2.1.1, MIT, approved, clearlydefined +npm/npmjs/-/ajv-keywords/3.5.2, MIT, approved, clearlydefined +npm/npmjs/-/ajv-keywords/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/ajv/6.12.6, MIT, approved, #979 +npm/npmjs/-/ajv/8.12.0, MIT AND OFL-1.1 AND (EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0), approved, #6025 +npm/npmjs/-/anser/1.4.10, MIT, approved, clearlydefined +npm/npmjs/-/ansi-colors/4.1.3, MIT, approved, clearlydefined +npm/npmjs/-/ansi-escapes/3.2.0, MIT, approved, #1978 +npm/npmjs/-/ansi-escapes/4.3.2, MIT, approved, clearlydefined +npm/npmjs/-/ansi-fragments/0.2.1, MIT, approved, clearlydefined +npm/npmjs/-/ansi-html-community/0.0.8, Apache-2.0, approved, clearlydefined +npm/npmjs/-/ansi-regex/4.1.1, MIT, approved, clearlydefined +npm/npmjs/-/ansi-regex/5.0.1, MIT, approved, clearlydefined +npm/npmjs/-/ansi-regex/6.0.1, MIT, approved, clearlydefined +npm/npmjs/-/ansi-styles/3.2.1, MIT, approved, clearlydefined +npm/npmjs/-/ansi-styles/4.3.0, MIT, approved, clearlydefined +npm/npmjs/-/ansi-styles/5.2.0, MIT, approved, clearlydefined +npm/npmjs/-/any-promise/1.3.0, MIT, approved, clearlydefined +npm/npmjs/-/anymatch/3.1.3, ISC, approved, #5050 +npm/npmjs/-/appdirsjs/1.2.7, MIT, approved, clearlydefined +npm/npmjs/-/arg/5.0.2, MIT, approved, clearlydefined +npm/npmjs/-/argparse/1.0.10, MIT, approved, #2174 +npm/npmjs/-/argparse/2.0.1, Python-2.0, approved, CQ22954 +npm/npmjs/-/aria-query/5.1.3, Apache-2.0, approved, clearlydefined +npm/npmjs/-/aria-query/5.2.1, Apache-2.0, approved, #9150 +npm/npmjs/-/arr-diff/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/arr-flatten/1.1.0, MIT, approved, clearlydefined +npm/npmjs/-/arr-union/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/array-buffer-byte-length/1.0.0, MIT, approved, #7548 +npm/npmjs/-/array-flatten/1.1.1, MIT, approved, clearlydefined +npm/npmjs/-/array-flatten/2.1.2, MIT, approved, clearlydefined +npm/npmjs/-/array-includes/3.1.6, MIT, approved, #4577 +npm/npmjs/-/array-union/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/array-unique/0.3.2, MIT, approved, clearlydefined +npm/npmjs/-/array.prototype.flat/1.3.1, MIT, approved, #4574 +npm/npmjs/-/array.prototype.flatmap/1.3.1, MIT, approved, #4651 +npm/npmjs/-/array.prototype.reduce/1.0.5, MIT, approved, clearlydefined +npm/npmjs/-/array.prototype.tosorted/1.1.1, MIT, approved, #5051 +npm/npmjs/-/arraybuffer.prototype.slice/1.0.1, MIT, approved, #9657 +npm/npmjs/-/asap/2.0.6, MIT, approved, clearlydefined +npm/npmjs/-/assign-symbols/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/ast-types-flow/0.0.7, ISC, approved, clearlydefined +npm/npmjs/-/ast-types/0.11.7, MIT, approved, clearlydefined +npm/npmjs/-/ast-types/0.14.2, MIT, approved, clearlydefined +npm/npmjs/-/ast-types/0.15.2, MIT, approved, clearlydefined +npm/npmjs/-/astral-regex/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/astral-regex/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/async-limiter/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/async/3.2.4, Apache-2.0 AND MIT, approved, #1553 +npm/npmjs/-/asynckit/0.4.0, MIT, approved, clearlydefined +npm/npmjs/-/at-least-node/1.0.0, ISC, approved, clearlydefined +npm/npmjs/-/atob/2.1.2, MIT OR Apache-2.0, approved, #1027 +npm/npmjs/-/autoprefixer/10.4.14, MIT, approved, #7494 +npm/npmjs/-/available-typed-arrays/1.0.5, MIT, approved, clearlydefined +npm/npmjs/-/axe-core/4.7.2, MPL-2.0 AND MIT AND (Apache-2.0 AND OFL-1.1), approved, #8318 +npm/npmjs/-/axios/1.4.0, MIT, approved, clearlydefined +npm/npmjs/-/axobject-query/3.2.1, Apache-2.0, approved, #9144 +npm/npmjs/-/babel-core/7.0.0-bridge.0, MIT, approved, clearlydefined +npm/npmjs/-/babel-jest/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/babel-loader/8.3.0, MIT, approved, #4618 +npm/npmjs/-/babel-plugin-istanbul/6.1.1, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/babel-plugin-jest-hoist/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/babel-plugin-macros/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/babel-plugin-named-asset-import/0.3.8, MIT, approved, clearlydefined +npm/npmjs/-/babel-plugin-polyfill-corejs2/0.4.4, MIT, approved, #9309 +npm/npmjs/-/babel-plugin-polyfill-corejs3/0.8.2, MIT, approved, #9316 +npm/npmjs/-/babel-plugin-polyfill-regenerator/0.5.1, MIT, approved, #9310 +npm/npmjs/-/babel-plugin-syntax-trailing-function-commas/7.0.0-beta.0, MIT, approved, clearlydefined +npm/npmjs/-/babel-plugin-transform-flow-enums/0.0.2, MIT, approved, clearlydefined +npm/npmjs/-/babel-plugin-transform-react-remove-prop-types/0.4.24, MIT, approved, clearlydefined +npm/npmjs/-/babel-preset-current-node-syntax/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/babel-preset-fbjs/3.4.0, MIT, approved, clearlydefined +npm/npmjs/-/babel-preset-jest/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/babel-preset-react-app/10.0.1, MIT, approved, clearlydefined +npm/npmjs/-/balanced-match/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/base/0.11.2, MIT, approved, clearlydefined +npm/npmjs/-/base64-js/1.5.1, MIT, approved, clearlydefined +npm/npmjs/-/batch/0.6.1, MIT, approved, clearlydefined +npm/npmjs/-/bfj/7.0.2, MIT, approved, clearlydefined +npm/npmjs/-/big.js/5.2.2, MIT, approved, clearlydefined +npm/npmjs/-/binary-extensions/2.2.0, MIT, approved, clearlydefined +npm/npmjs/-/bl/4.1.0, MIT, approved, clearlydefined +npm/npmjs/-/bluebird/3.7.2, MIT, approved, clearlydefined +npm/npmjs/-/body-parser/1.20.1, MIT, approved, clearlydefined +npm/npmjs/-/bonjour-service/1.1.1, MIT, approved, #7474 +npm/npmjs/-/boolbase/1.0.0, ISC, approved, clearlydefined +npm/npmjs/-/bootstrap/5.3.0, MIT AND CC-BY-3.0, approved, #9867 +npm/npmjs/-/brace-expansion/1.1.11, MIT, approved, clearlydefined +npm/npmjs/-/brace-expansion/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/braces/2.3.2, MIT, approved, clearlydefined +npm/npmjs/-/braces/3.0.2, MIT, approved, clearlydefined +npm/npmjs/-/browser-process-hrtime/1.0.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/browserslist/4.21.9, MIT, approved, #7034 +npm/npmjs/-/bser/2.1.1, Apache-2.0, approved, clearlydefined +npm/npmjs/-/buffer-from/1.1.2, MIT, approved, clearlydefined +npm/npmjs/-/buffer/5.7.1, MIT, approved, clearlydefined +npm/npmjs/-/builtin-modules/3.3.0, MIT, approved, clearlydefined +npm/npmjs/-/bytes/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/bytes/3.1.2, MIT, approved, clearlydefined +npm/npmjs/-/cache-base/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/call-bind/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/caller-callsite/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/caller-path/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/callsites/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/callsites/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/camel-case/4.1.2, MIT, approved, clearlydefined +npm/npmjs/-/camelcase-css/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/camelcase/5.3.1, MIT, approved, clearlydefined +npm/npmjs/-/camelcase/6.3.0, MIT, approved, clearlydefined +npm/npmjs/-/caniuse-api/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/caniuse-lite/1.0.30001505, CC-BY-4.0, approved, #1196 +npm/npmjs/-/case-sensitive-paths-webpack-plugin/2.4.0, MIT, approved, clearlydefined +npm/npmjs/-/chalk/2.4.2, MIT, approved, clearlydefined +npm/npmjs/-/chalk/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/chalk/4.1.2, MIT, approved, clearlydefined +npm/npmjs/-/char-regex/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/char-regex/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/check-types/11.2.2, MIT, approved, clearlydefined +npm/npmjs/-/chokidar/3.5.3, MIT, approved, #2317 +npm/npmjs/-/chrome-trace-event/1.0.3, MIT, approved, #2414 +npm/npmjs/-/ci-info/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/ci-info/3.8.0, MIT, approved, clearlydefined +npm/npmjs/-/cjs-module-lexer/1.2.3, MIT, approved, #9069 +npm/npmjs/-/class-utils/0.3.6, MIT, approved, clearlydefined +npm/npmjs/-/classnames/2.3.2, MIT, approved, clearlydefined +npm/npmjs/-/clean-css/5.3.2, MIT, approved, clearlydefined +npm/npmjs/-/cli-cursor/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/cli-cursor/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/cli-spinners/2.9.0, MIT, approved, #8249 +npm/npmjs/-/cliui/6.0.0, ISC, approved, clearlydefined +npm/npmjs/-/cliui/7.0.4, ISC AND Artistic-2.0, approved, #2724 +npm/npmjs/-/cliui/8.0.1, ISC AND Artistic-2.0, approved, #3753 +npm/npmjs/-/clone-deep/4.0.1, MIT, approved, clearlydefined +npm/npmjs/-/clone/1.0.4, MIT, approved, #2729 +npm/npmjs/-/co/4.6.0, MIT, approved, clearlydefined +npm/npmjs/-/coa/2.0.2, MIT, approved, clearlydefined +npm/npmjs/-/collect-v8-coverage/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/collection-visit/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/color-convert/1.9.3, MIT, approved, clearlydefined +npm/npmjs/-/color-convert/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/color-name/1.1.3, MIT, approved, clearlydefined +npm/npmjs/-/color-name/1.1.4, MIT, approved, clearlydefined +npm/npmjs/-/colord/2.9.3, MIT, approved, clearlydefined +npm/npmjs/-/colorette/1.4.0, MIT, approved, clearlydefined +npm/npmjs/-/colorette/2.0.20, MIT, approved, clearlydefined +npm/npmjs/-/colors/1.4.0, MIT, approved, clearlydefined +npm/npmjs/-/combined-stream/1.0.8, MIT, approved, clearlydefined +npm/npmjs/-/command-exists/1.2.9, MIT, approved, clearlydefined +npm/npmjs/-/commander/2.13.0, MIT, approved, clearlydefined +npm/npmjs/-/commander/2.20.3, MIT, approved, clearlydefined +npm/npmjs/-/commander/4.1.1, MIT, approved, clearlydefined +npm/npmjs/-/commander/7.2.0, MIT, approved, clearlydefined +npm/npmjs/-/commander/8.3.0, MIT, approved, clearlydefined +npm/npmjs/-/commander/9.5.0, MIT, approved, #6166 +npm/npmjs/-/common-path-prefix/3.0.0, ISC, approved, clearlydefined +npm/npmjs/-/common-tags/1.8.2, MIT, approved, #2950 +npm/npmjs/-/commondir/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/component-emitter/1.3.0, MIT, approved, clearlydefined +npm/npmjs/-/compressible/2.0.18, MIT, approved, clearlydefined +npm/npmjs/-/compression/1.7.4, MIT, approved, #1975 +npm/npmjs/-/concat-map/0.0.1, MIT, approved, clearlydefined +npm/npmjs/-/confusing-browser-globals/1.0.11, MIT, approved, clearlydefined +npm/npmjs/-/connect-history-api-fallback/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/connect/3.7.0, MIT, approved, clearlydefined +npm/npmjs/-/content-disposition/0.5.4, MIT, approved, clearlydefined +npm/npmjs/-/content-type/1.0.5, MIT, approved, #6950 +npm/npmjs/-/convert-source-map/1.9.0, MIT, approved, clearlydefined +npm/npmjs/-/cookie-signature/1.0.6, MIT, approved, clearlydefined +npm/npmjs/-/cookie/0.5.0, MIT, approved, clearlydefined +npm/npmjs/-/copy-descriptor/0.1.1, MIT, approved, clearlydefined +npm/npmjs/-/core-js-compat/3.31.0, MIT, approved, #9051 +npm/npmjs/-/core-js-pure/3.31.1, MIT, approved, #8969 +npm/npmjs/-/core-js/3.31.1, MIT, approved, #9137 +npm/npmjs/-/core-util-is/1.0.3, MIT, approved, #5898 +npm/npmjs/-/cosmiconfig/5.2.1, MIT, approved, clearlydefined +npm/npmjs/-/cosmiconfig/6.0.0, MIT, approved, clearlydefined +npm/npmjs/-/cosmiconfig/7.1.0, MIT, approved, #4975 +npm/npmjs/-/create-jest-runner/0.5.3, MIT, approved, clearlydefined +npm/npmjs/-/cross-spawn/7.0.3, MIT, approved, clearlydefined +npm/npmjs/-/crypto-random-string/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/css-blank-pseudo/3.0.3, CC0-1.0, approved, clearlydefined +npm/npmjs/-/css-declaration-sorter/6.4.1, ISC, approved, #9434 +npm/npmjs/-/css-has-pseudo/3.0.4, CC0-1.0, approved, clearlydefined +npm/npmjs/-/css-loader/6.8.1, MIT AND Apache-2.0, approved, #8759 +npm/npmjs/-/css-minimizer-webpack-plugin/3.4.1, MIT, approved, clearlydefined +npm/npmjs/-/css-prefers-color-scheme/6.0.3, CC0-1.0, approved, clearlydefined +npm/npmjs/-/css-select-base-adapter/0.1.1, MIT, approved, clearlydefined +npm/npmjs/-/css-select/2.1.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/css-select/4.3.0, BSD-2-Clause AND MIT AND (MIT AND MIT-0), approved, #3227 +npm/npmjs/-/css-tree/1.0.0-alpha.37, MIT, approved, #1287 +npm/npmjs/-/css-tree/1.1.3, MIT, approved, #1283 +npm/npmjs/-/css-what/3.4.2, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/css-what/6.1.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/css.escape/1.5.1, MIT, approved, clearlydefined +npm/npmjs/-/cssdb/7.6.0, CC0-1.0, approved, clearlydefined +npm/npmjs/-/cssesc/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/cssnano-preset-default/5.2.14, MIT, approved, clearlydefined +npm/npmjs/-/cssnano-utils/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/cssnano/5.1.15, MIT, approved, clearlydefined +npm/npmjs/-/csso/4.2.0, MIT, approved, clearlydefined +npm/npmjs/-/cssom/0.3.8, MIT, approved, clearlydefined +npm/npmjs/-/cssom/0.4.4, MIT, approved, clearlydefined +npm/npmjs/-/cssstyle/2.3.0, MIT, approved, clearlydefined +npm/npmjs/-/csstype/3.1.2, MIT, approved, clearlydefined +npm/npmjs/-/damerau-levenshtein/1.0.8, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/data-urls/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/date-fns/2.30.0, MIT, approved, clearlydefined +npm/npmjs/-/dayjs/1.11.9, MIT, approved, #9149 +npm/npmjs/-/debug/2.6.9, MIT, approved, clearlydefined +npm/npmjs/-/debug/3.2.7, MIT, approved, clearlydefined +npm/npmjs/-/debug/4.3.4, MIT, approved, clearlydefined +npm/npmjs/-/decamelize/1.2.0, MIT, approved, clearlydefined +npm/npmjs/-/decimal.js/10.4.3, MIT, approved, clearlydefined +npm/npmjs/-/decode-uri-component/0.2.2, MIT, approved, #5322 +npm/npmjs/-/dedent/0.7.0, MIT, approved, clearlydefined +npm/npmjs/-/deep-equal/2.2.1, MIT, approved, #8406 +npm/npmjs/-/deep-is/0.1.4, MIT, approved, #2130 +npm/npmjs/-/deepmerge/4.3.1, MIT, approved, #7032 +npm/npmjs/-/default-gateway/6.0.3, BSD-2-Clause AND BSD-3-Clause, approved, #2956 +npm/npmjs/-/defaults/1.0.4, MIT, approved, clearlydefined +npm/npmjs/-/define-lazy-prop/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/define-properties/1.2.0, MIT, approved, #7116 +npm/npmjs/-/define-property/0.2.5, MIT, approved, clearlydefined +npm/npmjs/-/define-property/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/define-property/2.0.2, MIT, approved, clearlydefined +npm/npmjs/-/delayed-stream/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/denodeify/1.2.1, MIT, approved, clearlydefined +npm/npmjs/-/depd/1.1.2, MIT, approved, clearlydefined +npm/npmjs/-/depd/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/deprecated-react-native-prop-types/4.1.0, MIT, approved, clearlydefined +npm/npmjs/-/dequal/2.0.3, MIT, approved, clearlydefined +npm/npmjs/-/destroy/1.2.0, MIT, approved, clearlydefined +npm/npmjs/-/detect-newline/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/detect-node/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/detect-port-alt/1.1.6, MIT, approved, clearlydefined +npm/npmjs/-/didyoumean/1.2.2, Apache-2.0, approved, clearlydefined +npm/npmjs/-/diff-sequences/27.5.1, 0BSD AND Apache-2.0 AND BSD-2-Clause AND MIT, approved, #1953 +npm/npmjs/-/diff-sequences/29.4.3, MIT, approved, clearlydefined +npm/npmjs/-/dir-glob/3.0.1, MIT, approved, clearlydefined +npm/npmjs/-/dlv/1.1.3, MIT, approved, clearlydefined +npm/npmjs/-/dns-equal/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/dns-packet/5.6.0, MIT, approved, clearlydefined +npm/npmjs/-/doctrine/2.1.0, Apache-2.0 AND BSD-2-Clause, approved, #1987 +npm/npmjs/-/doctrine/3.0.0, Apache-2.0 AND BSD-2-Clause, approved, CQ22628 +npm/npmjs/-/dom-accessibility-api/0.5.16, MIT, approved, clearlydefined +npm/npmjs/-/dom-converter/0.2.0, MIT, approved, clearlydefined +npm/npmjs/-/dom-helpers/5.2.1, MIT, approved, clearlydefined +npm/npmjs/-/dom-serializer/0.2.2, MIT, approved, clearlydefined +npm/npmjs/-/dom-serializer/1.4.1, MIT, approved, clearlydefined +npm/npmjs/-/domelementtype/1.3.1, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/domelementtype/2.3.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/domexception/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/domhandler/4.3.1, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/domutils/1.7.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/domutils/2.8.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/dot-case/3.0.4, MIT, approved, clearlydefined +npm/npmjs/-/dotenv-expand/5.1.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/dotenv/10.0.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/duplexer/0.1.2, MIT, approved, #1002 +npm/npmjs/-/ee-first/1.1.1, MIT, approved, clearlydefined +npm/npmjs/-/ejs/3.1.9, Apache-2.0, approved, #1373 +npm/npmjs/-/electron-to-chromium/1.4.434, ISC, approved, #1950 +npm/npmjs/-/emittery/0.10.2, MIT, approved, clearlydefined +npm/npmjs/-/emittery/0.8.1, MIT, approved, clearlydefined +npm/npmjs/-/emoji-regex/7.0.3, MIT, approved, clearlydefined +npm/npmjs/-/emoji-regex/8.0.0, MIT, approved, clearlydefined +npm/npmjs/-/emoji-regex/9.2.2, MIT, approved, clearlydefined +npm/npmjs/-/emojis-list/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/encodeurl/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/enhanced-resolve/5.15.0, MIT, approved, #8939 +npm/npmjs/-/enquirer/2.3.6, MIT AND (ISC AND MIT), approved, #2727 +npm/npmjs/-/entities/2.2.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/envinfo/7.10.0, MIT, approved, #9207 +npm/npmjs/-/error-ex/1.3.2, MIT, approved, clearlydefined +npm/npmjs/-/error-stack-parser/2.1.4, MIT, approved, clearlydefined +npm/npmjs/-/errorhandler/1.5.1, MIT, approved, clearlydefined +npm/npmjs/-/es-abstract/1.22.1, MIT, approved, #9656 +npm/npmjs/-/es-array-method-boxes-properly/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/es-get-iterator/1.1.3, MIT, approved, clearlydefined +npm/npmjs/-/es-module-lexer/1.3.0, MIT, approved, #8964 +npm/npmjs/-/es-set-tostringtag/2.0.1, MIT, approved, #6218 +npm/npmjs/-/es-shim-unscopables/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/es-to-primitive/1.2.1, MIT, approved, clearlydefined +npm/npmjs/-/escalade/3.1.1, MIT, approved, clearlydefined +npm/npmjs/-/escape-html/1.0.3, MIT, approved, clearlydefined +npm/npmjs/-/escape-string-regexp/1.0.5, MIT, approved, clearlydefined +npm/npmjs/-/escape-string-regexp/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/escape-string-regexp/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/escodegen/2.1.0, BSD-2-Clause AND (BSD-2-Clause AND BSD-3-Clause), approved, #9306 +npm/npmjs/-/eslint-config-react-app/7.0.1, MIT, approved, clearlydefined +npm/npmjs/-/eslint-import-resolver-node/0.3.7, MIT, approved, #9923 +npm/npmjs/-/eslint-module-utils/2.8.0, MIT, approved, #8209 +npm/npmjs/-/eslint-plugin-flowtype/8.0.3, BSD-3-Clause, approved, #2958 +npm/npmjs/-/eslint-plugin-import/2.27.5, MIT, approved, #6937 +npm/npmjs/-/eslint-plugin-jest/25.7.0, MIT AND (BSD-2-Clause AND MIT), approved, #2961 +npm/npmjs/-/eslint-plugin-jsx-a11y/6.7.1, MIT, approved, clearlydefined +npm/npmjs/-/eslint-plugin-react-hooks/4.6.0, MIT, approved, clearlydefined +npm/npmjs/-/eslint-plugin-react/7.32.2, MIT, approved, #7035 +npm/npmjs/-/eslint-plugin-testing-library/5.11.0, MIT, approved, clearlydefined +npm/npmjs/-/eslint-scope/5.1.1, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/eslint-scope/7.2.1, BSD-2-Clause, approved, #9916 +npm/npmjs/-/eslint-utils/2.1.0, MIT, approved, #2498 +npm/npmjs/-/eslint-visitor-keys/1.3.0, Apache-2.0, approved, #2501 +npm/npmjs/-/eslint-visitor-keys/2.1.0, Apache-2.0, approved, #2433 +npm/npmjs/-/eslint-visitor-keys/3.4.1, Apache-2.0, approved, #7729 +npm/npmjs/-/eslint-webpack-plugin/3.2.0, MIT, approved, clearlydefined +npm/npmjs/-/eslint/7.32.0, MIT, approved, #2726 +npm/npmjs/-/eslint/8.45.0, MIT, approved, #9866 +npm/npmjs/-/espree/7.3.1, BSD-2-Clause AND MIT, approved, #903 +npm/npmjs/-/espree/9.6.1, BSD-2-Clause AND BSD-3-Clause AND MIT AND BSD-2-Clause, approved, #9308 +npm/npmjs/-/esprima/4.0.1, BSD-2-Clause, approved, #995 +npm/npmjs/-/esquery/1.5.0, BSD-3-Clause, approved, #7469 +npm/npmjs/-/esrecurse/4.3.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/estraverse/4.3.0, BSD-2-Clause, approved, #518 +npm/npmjs/-/estraverse/5.3.0, BSD-2-Clause AND MIT, approved, #1557 +npm/npmjs/-/estree-walker/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/esutils/2.0.3, BSD-2-Clause AND BSD-3-Clause, approved, #120 +npm/npmjs/-/etag/1.8.1, MIT, approved, clearlydefined +npm/npmjs/-/event-target-shim/5.0.1, MIT, approved, #7578 +npm/npmjs/-/eventemitter3/4.0.7, MIT, approved, clearlydefined +npm/npmjs/-/events/3.3.0, MIT, approved, clearlydefined +npm/npmjs/-/execa/5.1.1, MIT, approved, clearlydefined +npm/npmjs/-/exit/0.1.2, MIT, approved, clearlydefined +npm/npmjs/-/expand-brackets/2.1.4, MIT, approved, clearlydefined +npm/npmjs/-/expect/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/expect/29.5.0, MIT, approved, clearlydefined +npm/npmjs/-/express/4.18.2, MIT, approved, clearlydefined +npm/npmjs/-/extend-shallow/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/extend-shallow/3.0.2, MIT, approved, clearlydefined +npm/npmjs/-/extglob/2.0.4, MIT, approved, clearlydefined +npm/npmjs/-/fast-deep-equal/3.1.3, MIT, approved, clearlydefined +npm/npmjs/-/fast-glob/3.2.12, MIT, approved, clearlydefined +npm/npmjs/-/fast-json-stable-stringify/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/fast-levenshtein/2.0.6, MIT, approved, #2428 +npm/npmjs/-/fast-xml-parser/4.2.6, MIT, approved, clearlydefined +npm/npmjs/-/fastq/1.15.0, ISC, approved, #6021 +npm/npmjs/-/faye-websocket/0.11.4, Apache-2.0, approved, clearlydefined +npm/npmjs/-/fb-watchman/2.0.2, MIT AND Apache-2.0, approved, #5379 +npm/npmjs/-/figures/3.2.0, MIT, approved, clearlydefined +npm/npmjs/-/file-entry-cache/6.0.1, MIT, approved, clearlydefined +npm/npmjs/-/file-loader/6.2.0, MIT, approved, clearlydefined +npm/npmjs/-/filelist/1.0.4, Apache-2.0, approved, clearlydefined +npm/npmjs/-/filesize/8.0.7, BSD-3-Clause, approved, #2965 +npm/npmjs/-/fill-range/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/fill-range/7.0.1, MIT, approved, clearlydefined +npm/npmjs/-/finalhandler/1.1.2, MIT, approved, clearlydefined +npm/npmjs/-/finalhandler/1.2.0, MIT, approved, clearlydefined +npm/npmjs/-/find-cache-dir/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/find-cache-dir/3.3.2, MIT, approved, clearlydefined +npm/npmjs/-/find-up/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/find-up/4.1.0, MIT, approved, clearlydefined +npm/npmjs/-/find-up/5.0.0, MIT, approved, clearlydefined +npm/npmjs/-/flat-cache/3.0.4, MIT, approved, clearlydefined +npm/npmjs/-/flatted/3.2.7, ISC AND (ISC AND MIT), approved, #2430 +npm/npmjs/-/flow-enums-runtime/0.0.5, MIT, approved, clearlydefined +npm/npmjs/-/flow-parser/0.206.0, MIT, approved, clearlydefined +npm/npmjs/-/flow-parser/0.209.0, MIT, approved, clearlydefined +npm/npmjs/-/follow-redirects/1.15.2, MIT, approved, clearlydefined +npm/npmjs/-/for-each/0.3.3, MIT, approved, clearlydefined +npm/npmjs/-/for-in/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/fork-ts-checker-webpack-plugin/6.5.3, MIT, approved, #7487 +npm/npmjs/-/form-data/3.0.1, MIT, approved, clearlydefined +npm/npmjs/-/form-data/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/forwarded/0.2.0, MIT, approved, clearlydefined +npm/npmjs/-/fraction.js/4.2.0, MIT, approved, clearlydefined +npm/npmjs/-/fragment-cache/0.2.1, MIT, approved, clearlydefined +npm/npmjs/-/fresh/0.5.2, MIT, approved, clearlydefined +npm/npmjs/-/fs-extra/10.1.0, MIT, approved, clearlydefined +npm/npmjs/-/fs-extra/8.1.0, MIT, approved, clearlydefined +npm/npmjs/-/fs-extra/9.1.0, MIT, approved, clearlydefined +npm/npmjs/-/fs-monkey/1.0.4, Unlicense AND (ISC AND MIT), approved, #2964 +npm/npmjs/-/fs.realpath/1.0.0, ISC, approved, clearlydefined +npm/npmjs/-/fsevents/2.3.2, MIT, approved, #2967 +npm/npmjs/-/function-bind/1.1.1, MIT, approved, clearlydefined +npm/npmjs/-/function.prototype.name/1.1.5, MIT, approved, clearlydefined +npm/npmjs/-/functional-red-black-tree/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/functions-have-names/1.2.3, MIT, approved, clearlydefined +npm/npmjs/-/gensync/1.0.0-beta.2, MIT, approved, clearlydefined +npm/npmjs/-/get-caller-file/2.0.5, ISC, approved, clearlydefined +npm/npmjs/-/get-intrinsic/1.2.1, MIT, approved, #8453 +npm/npmjs/-/get-own-enumerable-property-symbols/3.0.2, ISC, approved, clearlydefined +npm/npmjs/-/get-package-type/0.1.0, MIT, approved, clearlydefined +npm/npmjs/-/get-stream/6.0.1, MIT, approved, clearlydefined +npm/npmjs/-/get-symbol-description/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/get-value/2.0.6, MIT, approved, clearlydefined +npm/npmjs/-/glob-parent/5.1.2, ISC, approved, clearlydefined +npm/npmjs/-/glob-parent/6.0.2, ISC, approved, clearlydefined +npm/npmjs/-/glob-to-regexp/0.4.1, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/glob/7.1.6, ISC, approved, #994 +npm/npmjs/-/glob/7.2.3, ISC, approved, clearlydefined +npm/npmjs/-/global-modules/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/global-prefix/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/globals/11.12.0, MIT, approved, clearlydefined +npm/npmjs/-/globals/13.20.0, MIT, approved, #6953 +npm/npmjs/-/globalthis/1.0.3, MIT, approved, clearlydefined +npm/npmjs/-/globby/11.1.0, MIT, approved, clearlydefined +npm/npmjs/-/gopd/1.0.1, MIT, approved, #4863 +npm/npmjs/-/graceful-fs/4.2.11, ISC, approved, #7413 +npm/npmjs/-/graphemer/1.4.0, MIT, approved, clearlydefined +npm/npmjs/-/gzip-size/6.0.0, MIT, approved, clearlydefined +npm/npmjs/-/handle-thing/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/harmony-reflect/1.6.2, Apache-2.0 AND MPL-1.1 AND Apache-2.0, approved, #2966 +npm/npmjs/-/has-bigints/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/has-flag/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/has-flag/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/has-property-descriptors/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/has-proto/1.0.1, MIT, approved, #6175 +npm/npmjs/-/has-symbols/1.0.3, MIT, approved, clearlydefined +npm/npmjs/-/has-tostringtag/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/has-value/0.3.1, MIT, approved, clearlydefined +npm/npmjs/-/has-value/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/has-values/0.1.4, MIT, approved, clearlydefined +npm/npmjs/-/has-values/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/has/1.0.3, MIT, approved, clearlydefined +npm/npmjs/-/he/1.2.0, MIT, approved, clearlydefined +npm/npmjs/-/hermes-estree/0.12.0, MIT, approved, clearlydefined +npm/npmjs/-/hermes-parser/0.12.0, MIT, approved, clearlydefined +npm/npmjs/-/hermes-profile-transformer/0.0.6, MIT AND Apache-2.0, approved, #9855 +npm/npmjs/-/hoopy/0.1.4, MIT, approved, clearlydefined +npm/npmjs/-/hpack.js/2.1.6, MIT, approved, clearlydefined +npm/npmjs/-/html-encoding-sniffer/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/html-entities/2.4.0, MIT, approved, clearlydefined +npm/npmjs/-/html-escaper/2.0.2, MIT, approved, clearlydefined +npm/npmjs/-/html-minifier-terser/6.1.0, MIT AND MPL-1.1, approved, #2968 +npm/npmjs/-/html-webpack-plugin/5.5.3, MIT, approved, #9078 +npm/npmjs/-/htmlparser2/6.1.0, MIT, approved, clearlydefined +npm/npmjs/-/http-deceiver/1.2.7, MIT, approved, clearlydefined +npm/npmjs/-/http-errors/1.6.3, MIT, approved, clearlydefined +npm/npmjs/-/http-errors/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/http-parser-js/0.5.8, MIT, approved, #2970 +npm/npmjs/-/http-proxy-agent/4.0.1, MIT, approved, clearlydefined +npm/npmjs/-/http-proxy-middleware/2.0.6, MIT, approved, clearlydefined +npm/npmjs/-/http-proxy/1.18.1, MIT, approved, clearlydefined +npm/npmjs/-/https-proxy-agent/5.0.1, MIT, approved, clearlydefined +npm/npmjs/-/human-signals/2.1.0, Apache-2.0, approved, clearlydefined +npm/npmjs/-/iconv-lite/0.4.24, MIT, approved, clearlydefined +npm/npmjs/-/iconv-lite/0.6.3, MIT, approved, clearlydefined +npm/npmjs/-/icss-utils/5.1.0, ISC, approved, clearlydefined +npm/npmjs/-/idb/7.1.1, ISC, approved, clearlydefined +npm/npmjs/-/identity-obj-proxy/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/ieee754/1.2.1, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/ignore/4.0.6, MIT, approved, clearlydefined +npm/npmjs/-/ignore/5.2.4, MIT, approved, #5907 +npm/npmjs/-/image-size/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/immer/9.0.21, MIT, approved, #7037 +npm/npmjs/-/import-fresh/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/import-fresh/3.3.0, MIT, approved, clearlydefined +npm/npmjs/-/import-local/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/imurmurhash/0.1.4, MIT, approved, clearlydefined +npm/npmjs/-/indent-string/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/inflight/1.0.6, ISC, approved, clearlydefined +npm/npmjs/-/inherits/2.0.3, ISC, approved, clearlydefined +npm/npmjs/-/inherits/2.0.4, ISC, approved, clearlydefined +npm/npmjs/-/ini/1.3.8, ISC AND MIT AND BSD-3-Clause, approved, CQ23023 +npm/npmjs/-/internal-slot/1.0.5, MIT, approved, #7118 +npm/npmjs/-/invariant/2.2.4, MIT, approved, #1034 +npm/npmjs/-/ip/1.1.8, MIT, approved, #126 +npm/npmjs/-/ipaddr.js/1.9.1, MIT, approved, clearlydefined +npm/npmjs/-/ipaddr.js/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/is-accessor-descriptor/0.1.6, MIT, approved, clearlydefined +npm/npmjs/-/is-accessor-descriptor/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/is-arguments/1.1.1, MIT, approved, clearlydefined +npm/npmjs/-/is-array-buffer/3.0.2, MIT, approved, #6248 +npm/npmjs/-/is-arrayish/0.2.1, MIT, approved, clearlydefined +npm/npmjs/-/is-bigint/1.0.4, MIT, approved, clearlydefined +npm/npmjs/-/is-binary-path/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/is-boolean-object/1.1.2, MIT, approved, clearlydefined +npm/npmjs/-/is-buffer/1.1.6, MIT, approved, clearlydefined +npm/npmjs/-/is-callable/1.2.7, MIT, approved, clearlydefined +npm/npmjs/-/is-core-module/2.12.1, MIT, approved, clearlydefined +npm/npmjs/-/is-data-descriptor/0.1.4, MIT, approved, clearlydefined +npm/npmjs/-/is-data-descriptor/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/is-date-object/1.0.5, MIT, approved, clearlydefined +npm/npmjs/-/is-descriptor/0.1.6, MIT, approved, clearlydefined +npm/npmjs/-/is-descriptor/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/is-directory/0.3.1, MIT, approved, clearlydefined +npm/npmjs/-/is-docker/2.2.1, MIT, approved, clearlydefined +npm/npmjs/-/is-extendable/0.1.1, MIT, approved, clearlydefined +npm/npmjs/-/is-extendable/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/is-extglob/2.1.1, MIT, approved, clearlydefined +npm/npmjs/-/is-fullwidth-code-point/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/is-fullwidth-code-point/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/is-generator-fn/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/is-glob/4.0.3, MIT, approved, clearlydefined +npm/npmjs/-/is-interactive/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/is-map/2.0.2, MIT, approved, clearlydefined +npm/npmjs/-/is-module/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/is-negative-zero/2.0.2, MIT, approved, clearlydefined +npm/npmjs/-/is-number-object/1.0.7, MIT, approved, clearlydefined +npm/npmjs/-/is-number/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/is-number/7.0.0, MIT, approved, clearlydefined +npm/npmjs/-/is-obj/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/is-path-inside/3.0.3, MIT, approved, clearlydefined +npm/npmjs/-/is-plain-obj/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/is-plain-object/2.0.4, MIT, approved, clearlydefined +npm/npmjs/-/is-potential-custom-element-name/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/is-regex/1.1.4, MIT, approved, clearlydefined +npm/npmjs/-/is-regexp/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/is-root/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/is-set/2.0.2, MIT, approved, clearlydefined +npm/npmjs/-/is-shared-array-buffer/1.0.2, MIT, approved, #1207 +npm/npmjs/-/is-stream/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/is-string/1.0.7, MIT, approved, clearlydefined +npm/npmjs/-/is-symbol/1.0.4, MIT, approved, clearlydefined +npm/npmjs/-/is-typed-array/1.1.10, MIT, approved, #4853 +npm/npmjs/-/is-typedarray/1.0.0, MIT, approved, #2531 +npm/npmjs/-/is-unicode-supported/0.1.0, MIT, approved, clearlydefined +npm/npmjs/-/is-weakmap/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/is-weakref/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/is-weakset/2.0.2, MIT, approved, clearlydefined +npm/npmjs/-/is-windows/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/is-wsl/1.1.0, MIT, approved, clearlydefined +npm/npmjs/-/is-wsl/2.2.0, MIT, approved, clearlydefined +npm/npmjs/-/isarray/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/isarray/2.0.5, MIT, approved, clearlydefined +npm/npmjs/-/isexe/2.0.0, ISC, approved, clearlydefined +npm/npmjs/-/isobject/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/isobject/3.0.1, MIT, approved, clearlydefined +npm/npmjs/-/istanbul-lib-coverage/3.2.0, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/istanbul-lib-instrument/5.2.1, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/istanbul-lib-report/3.0.0, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/istanbul-lib-source-maps/4.0.1, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/istanbul-reports/3.1.5, BSD-3-Clause AND MIT, approved, #1710 +npm/npmjs/-/jake/10.8.7, Apache-2.0 AND MIT, approved, #1316 +npm/npmjs/-/jest-changed-files/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-circus/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-cli/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-config/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-diff/27.5.1, 0BSD AND Apache-2.0 AND BSD-2-Clause AND MIT, approved, #1951 +npm/npmjs/-/jest-diff/29.5.0, MIT, approved, clearlydefined +npm/npmjs/-/jest-docblock/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-each/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-environment-jsdom/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-environment-node/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-environment-node/29.6.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-get-type/27.5.1, 0BSD AND Apache-2.0 AND BSD-2-Clause AND MIT, approved, #1947 +npm/npmjs/-/jest-get-type/29.4.3, MIT, approved, clearlydefined +npm/npmjs/-/jest-haste-map/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-jasmine2/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-leak-detector/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-matcher-utils/27.5.1, 0BSD AND Apache-2.0 AND BSD-2-Clause AND MIT, approved, #1945 +npm/npmjs/-/jest-matcher-utils/29.5.0, MIT, approved, clearlydefined +npm/npmjs/-/jest-message-util/27.5.1, 0BSD AND Apache-2.0 AND BSD-2-Clause AND MIT, approved, #1943 +npm/npmjs/-/jest-message-util/28.1.3, MIT, approved, clearlydefined +npm/npmjs/-/jest-message-util/29.6.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-mock/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-mock/29.6.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-pnp-resolver/1.2.3, MIT, approved, clearlydefined +npm/npmjs/-/jest-regex-util/27.5.1, 0BSD AND Apache-2.0 AND BSD-2-Clause AND MIT, approved, #1955 +npm/npmjs/-/jest-regex-util/28.0.2, MIT, approved, clearlydefined +npm/npmjs/-/jest-resolve-dependencies/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-resolve/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-runner/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-runtime/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-serializer/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-snapshot/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-util/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-util/28.1.3, MIT, approved, clearlydefined +npm/npmjs/-/jest-util/29.6.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-validate/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-validate/29.6.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-watch-typeahead/1.1.0, MIT, approved, clearlydefined +npm/npmjs/-/jest-watcher/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jest-watcher/28.1.3, MIT, approved, clearlydefined +npm/npmjs/-/jest-worker/24.9.0, MIT, approved, clearlydefined +npm/npmjs/-/jest-worker/26.6.2, MIT, approved, clearlydefined +npm/npmjs/-/jest-worker/27.5.1, 0BSD AND Apache-2.0 AND BSD-2-Clause AND MIT, approved, #1952 +npm/npmjs/-/jest-worker/28.1.3, MIT, approved, clearlydefined +npm/npmjs/-/jest/27.5.1, MIT, approved, clearlydefined +npm/npmjs/-/jiti/1.19.1, MIT, approved, #9437 +npm/npmjs/-/joi/17.9.2, BSD-3-Clause, approved, #7488 +npm/npmjs/-/js-tokens/4.0.0, MIT, approved, #2401 +npm/npmjs/-/js-yaml/3.14.1, MIT, approved, clearlydefined +npm/npmjs/-/js-yaml/4.1.0, MIT, approved, clearlydefined +npm/npmjs/-/jsc-android/250231.0.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/jsc-safe-url/0.2.4, 0BSD, approved, clearlydefined +npm/npmjs/-/jscodeshift/0.13.1, MIT, approved, #9853 +npm/npmjs/-/jscodeshift/0.14.0, MIT, approved, #9032 +npm/npmjs/-/jscodeshift/0.6.4, BSD-3-Clause AND MIT AND BSD-3-Clause AND Apache-2.0, approved, #9864 +npm/npmjs/-/jsdom/16.7.0, LGPL-2.0-or-later AND MIT, approved, #1370 +npm/npmjs/-/jsesc/0.5.0, MIT, approved, clearlydefined +npm/npmjs/-/jsesc/2.5.2, MIT, approved, clearlydefined +npm/npmjs/-/json-parse-better-errors/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/json-parse-even-better-errors/2.3.1, MIT, approved, clearlydefined +npm/npmjs/-/json-schema-traverse/0.4.1, MIT, approved, clearlydefined +npm/npmjs/-/json-schema-traverse/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/json-schema/0.4.0, AFL-2.1 OR BSD-3-Clause, approved, #2410 +npm/npmjs/-/json-stable-stringify-without-jsonify/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/json5-writer/0.1.8, ISC, approved, clearlydefined +npm/npmjs/-/json5/1.0.2, MIT, approved, CQ22351 +npm/npmjs/-/json5/2.2.3, MIT, approved, #2126 +npm/npmjs/-/jsonfile/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/jsonfile/6.1.0, MIT, approved, clearlydefined +npm/npmjs/-/jsonpointer/5.0.1, MIT, approved, clearlydefined +npm/npmjs/-/jsx-ast-utils/3.3.4, MIT, approved, #9209 +npm/npmjs/-/kind-of/3.2.2, MIT, approved, clearlydefined +npm/npmjs/-/kind-of/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/kind-of/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/kind-of/6.0.3, MIT, approved, clearlydefined +npm/npmjs/-/kleur/3.0.3, MIT, approved, clearlydefined +npm/npmjs/-/klona/2.0.6, MIT, approved, clearlydefined +npm/npmjs/-/language-subtag-registry/0.3.22, CC0-1.0, approved, #3233 +npm/npmjs/-/language-tags/1.0.5, MIT, approved, clearlydefined +npm/npmjs/-/launch-editor/2.6.0, MIT, approved, clearlydefined +npm/npmjs/-/leven/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/levn/0.4.1, MIT, approved, clearlydefined +npm/npmjs/-/lilconfig/2.1.0, MIT, approved, #7313 +npm/npmjs/-/lines-and-columns/1.2.4, MIT, approved, clearlydefined +npm/npmjs/-/loader-runner/4.3.0, MIT, approved, clearlydefined +npm/npmjs/-/loader-utils/2.0.4, MIT, approved, #4986 +npm/npmjs/-/loader-utils/3.2.1, MIT, approved, clearlydefined +npm/npmjs/-/locate-path/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/locate-path/5.0.0, MIT, approved, clearlydefined +npm/npmjs/-/locate-path/6.0.0, MIT, approved, clearlydefined +npm/npmjs/-/lodash.debounce/4.0.8, MIT, approved, clearlydefined +npm/npmjs/-/lodash.memoize/4.1.2, MIT, approved, clearlydefined +npm/npmjs/-/lodash.merge/4.6.2, MIT, approved, clearlydefined +npm/npmjs/-/lodash.sortby/4.7.0, MIT, approved, clearlydefined +npm/npmjs/-/lodash.throttle/4.1.1, MIT, approved, clearlydefined +npm/npmjs/-/lodash.truncate/4.4.2, MIT, approved, clearlydefined +npm/npmjs/-/lodash.uniq/4.5.0, MIT, approved, clearlydefined +npm/npmjs/-/lodash/4.17.21, CC0-1.0 AND MIT, approved, #2096 +npm/npmjs/-/log-symbols/4.1.0, MIT, approved, clearlydefined +npm/npmjs/-/log-update/3.4.0, MIT, approved, clearlydefined +npm/npmjs/-/logkitty/0.7.1, MIT, approved, clearlydefined +npm/npmjs/-/loose-envify/1.4.0, MIT, approved, clearlydefined +npm/npmjs/-/lower-case/2.0.2, MIT, approved, clearlydefined +npm/npmjs/-/lru-cache/5.1.1, ISC, approved, clearlydefined +npm/npmjs/-/lru-cache/6.0.0, ISC, approved, clearlydefined +npm/npmjs/-/lz-string/1.5.0, MIT AND WTFPL, approved, #8398 +npm/npmjs/-/magic-string/0.25.9, MIT, approved, clearlydefined +npm/npmjs/-/make-dir/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/make-dir/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/makeerror/1.0.12, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/map-cache/0.2.2, MIT, approved, clearlydefined +npm/npmjs/-/map-visit/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/mdn-data/2.0.14, CC0-1.0, approved, clearlydefined +npm/npmjs/-/mdn-data/2.0.4, CC0-1.0, approved, clearlydefined +npm/npmjs/-/media-typer/0.3.0, MIT, approved, clearlydefined +npm/npmjs/-/memfs/3.5.3, Unlicense, approved, #8397 +npm/npmjs/-/memoize-one/5.2.1, MIT, approved, clearlydefined +npm/npmjs/-/merge-descriptors/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/merge-stream/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/merge2/1.4.1, MIT, approved, clearlydefined +npm/npmjs/-/methods/1.1.2, MIT, approved, clearlydefined +npm/npmjs/-/metro-babel-transformer/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-cache-key/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-cache/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-config/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-core/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-file-map/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-inspector-proxy/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-minify-terser/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-minify-uglify/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-react-native-babel-preset/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-react-native-babel-transformer/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-resolver/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-runtime/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-source-map/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-symbolicate/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-transform-plugins/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro-transform-worker/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/metro/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/micromatch/3.1.10, MIT, approved, clearlydefined +npm/npmjs/-/micromatch/4.0.5, MIT, approved, clearlydefined +npm/npmjs/-/mime-db/1.52.0, MIT, approved, clearlydefined +npm/npmjs/-/mime-types/2.1.35, MIT, approved, clearlydefined +npm/npmjs/-/mime/1.6.0, MIT, approved, clearlydefined +npm/npmjs/-/mime/2.6.0, MIT, approved, clearlydefined +npm/npmjs/-/mimic-fn/1.2.0, MIT, approved, clearlydefined +npm/npmjs/-/mimic-fn/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/min-indent/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/mini-css-extract-plugin/2.7.6, MIT, approved, #5004 +npm/npmjs/-/minimalistic-assert/1.0.1, ISC, approved, clearlydefined +npm/npmjs/-/minimatch/3.1.2, ISC, approved, clearlydefined +npm/npmjs/-/minimatch/5.1.6, ISC, approved, #5952 +npm/npmjs/-/minimist/1.2.8, MIT, approved, #5886 +npm/npmjs/-/mixin-deep/1.3.2, MIT, approved, clearlydefined +npm/npmjs/-/mkdirp/0.5.6, MIT, approved, clearlydefined +npm/npmjs/-/mkdirp/1.0.4, MIT, approved, clearlydefined +npm/npmjs/-/ms/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/ms/2.1.2, MIT, approved, #5895 +npm/npmjs/-/ms/2.1.3, MIT, approved, #5895 +npm/npmjs/-/multicast-dns/7.2.5, MIT, approved, clearlydefined +npm/npmjs/-/mz/2.7.0, MIT, approved, clearlydefined +npm/npmjs/-/nanoid/3.3.6, MIT, approved, #7571 +npm/npmjs/-/nanomatch/1.2.13, MIT, approved, clearlydefined +npm/npmjs/-/natural-compare-lite/1.4.0, MIT, approved, clearlydefined +npm/npmjs/-/natural-compare/1.4.0, MIT, approved, clearlydefined +npm/npmjs/-/negotiator/0.6.3, MIT, approved, clearlydefined +npm/npmjs/-/neo-async/2.6.2, MIT, approved, clearlydefined +npm/npmjs/-/no-case/3.0.4, MIT, approved, clearlydefined +npm/npmjs/-/nocache/3.0.4, MIT, approved, clearlydefined +npm/npmjs/-/node-abort-controller/3.1.1, MIT, approved, clearlydefined +npm/npmjs/-/node-dir/0.1.17, MIT, approved, #1343 +npm/npmjs/-/node-fetch/2.6.12, MIT, approved, #6954 +npm/npmjs/-/node-forge/1.3.1, (BSD-3-Clause OR GPL-2.0-only) AND MIT, approved, #3014 +npm/npmjs/-/node-int64/0.4.0, MIT, approved, clearlydefined +npm/npmjs/-/node-releases/2.0.12, MIT, approved, #1954 +npm/npmjs/-/node-stream-zip/1.15.0, MIT, approved, clearlydefined +npm/npmjs/-/normalize-path/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/normalize-range/0.1.2, MIT, approved, clearlydefined +npm/npmjs/-/normalize-url/6.1.0, MIT, approved, clearlydefined +npm/npmjs/-/npm-run-path/4.0.1, MIT, approved, clearlydefined +npm/npmjs/-/nth-check/1.0.2, BSD-2-Clause, approved, CQ22629 +npm/npmjs/-/nth-check/2.1.1, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/nullthrows/1.1.1, MIT, approved, clearlydefined +npm/npmjs/-/nwsapi/2.2.7, MIT, approved, #7909 +npm/npmjs/-/ob1/0.76.7, MIT, approved, clearlydefined +npm/npmjs/-/object-assign/4.1.1, MIT, approved, clearlydefined +npm/npmjs/-/object-copy/0.1.0, MIT, approved, clearlydefined +npm/npmjs/-/object-hash/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/object-inspect/1.12.3, MIT, approved, clearlydefined +npm/npmjs/-/object-is/1.1.5, MIT, approved, clearlydefined +npm/npmjs/-/object-keys/1.1.1, MIT, approved, clearlydefined +npm/npmjs/-/object-visit/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/object.assign/4.1.4, MIT, approved, #3232 +npm/npmjs/-/object.entries/1.1.6, MIT, approved, #4671 +npm/npmjs/-/object.fromentries/2.0.6, MIT, approved, #4600 +npm/npmjs/-/object.getownpropertydescriptors/2.1.6, MIT, approved, clearlydefined +npm/npmjs/-/object.hasown/1.1.2, MIT, approved, #4667 +npm/npmjs/-/object.pick/1.3.0, MIT, approved, clearlydefined +npm/npmjs/-/object.values/1.1.6, MIT, approved, #4665 +npm/npmjs/-/obuf/1.1.2, MIT, approved, clearlydefined +npm/npmjs/-/on-finished/2.3.0, MIT, approved, clearlydefined +npm/npmjs/-/on-finished/2.4.1, MIT, approved, clearlydefined +npm/npmjs/-/on-headers/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/once/1.4.0, ISC, approved, clearlydefined +npm/npmjs/-/onetime/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/onetime/5.1.2, MIT, approved, clearlydefined +npm/npmjs/-/open/6.4.0, MIT, approved, clearlydefined +npm/npmjs/-/open/8.4.2, MIT, approved, #7102 +npm/npmjs/-/optionator/0.9.3, MIT, approved, #9208 +npm/npmjs/-/ora/5.4.1, MIT, approved, clearlydefined +npm/npmjs/-/p-limit/2.3.0, MIT, approved, clearlydefined +npm/npmjs/-/p-limit/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/p-locate/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/p-locate/4.1.0, MIT, approved, clearlydefined +npm/npmjs/-/p-locate/5.0.0, MIT, approved, clearlydefined +npm/npmjs/-/p-retry/4.6.2, MIT, approved, clearlydefined +npm/npmjs/-/p-try/2.2.0, MIT, approved, clearlydefined +npm/npmjs/-/param-case/3.0.4, MIT, approved, clearlydefined +npm/npmjs/-/parent-module/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/parse-json/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/parse-json/5.2.0, MIT, approved, clearlydefined +npm/npmjs/-/parse-ms/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/parse5/6.0.1, MIT, approved, clearlydefined +npm/npmjs/-/parseurl/1.3.3, MIT, approved, clearlydefined +npm/npmjs/-/pascal-case/3.1.2, MIT, approved, clearlydefined +npm/npmjs/-/pascalcase/0.1.1, MIT, approved, clearlydefined +npm/npmjs/-/path-browserify/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/path-exists/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/path-exists/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/path-is-absolute/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/path-key/3.1.1, MIT, approved, clearlydefined +npm/npmjs/-/path-parse/1.0.7, MIT, approved, clearlydefined +npm/npmjs/-/path-to-regexp/0.1.7, MIT, approved, clearlydefined +npm/npmjs/-/path-type/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/performance-now/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/picocolors/0.2.1, ISC, approved, clearlydefined +npm/npmjs/-/picocolors/1.0.0, ISC, approved, clearlydefined +npm/npmjs/-/picomatch/2.3.1, MIT, approved, clearlydefined +npm/npmjs/-/pify/2.3.0, MIT, approved, clearlydefined +npm/npmjs/-/pify/4.0.1, MIT, approved, clearlydefined +npm/npmjs/-/pirates/4.0.6, MIT, approved, #680 +npm/npmjs/-/pkg-dir/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/pkg-dir/4.2.0, MIT, approved, clearlydefined +npm/npmjs/-/pkg-up/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/posix-character-classes/0.1.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-attribute-case-insensitive/5.0.2, MIT, approved, clearlydefined +npm/npmjs/-/postcss-browser-comments/4.0.0, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-calc/8.2.4, MIT, approved, clearlydefined +npm/npmjs/-/postcss-clamp/4.1.0, MIT, approved, #3013 +npm/npmjs/-/postcss-color-functional-notation/4.2.4, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-color-hex-alpha/8.0.4, MIT, approved, clearlydefined +npm/npmjs/-/postcss-color-rebeccapurple/7.1.1, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-colormin/5.3.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-convert-values/5.1.3, MIT, approved, clearlydefined +npm/npmjs/-/postcss-custom-media/8.0.2, MIT, approved, clearlydefined +npm/npmjs/-/postcss-custom-properties/12.1.11, MIT, approved, clearlydefined +npm/npmjs/-/postcss-custom-selectors/6.0.3, MIT, approved, clearlydefined +npm/npmjs/-/postcss-dir-pseudo-class/6.0.5, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-discard-comments/5.1.2, MIT, approved, clearlydefined +npm/npmjs/-/postcss-discard-duplicates/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-discard-empty/5.1.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-discard-overridden/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-double-position-gradients/3.1.2, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-env-function/4.0.6, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-flexbugs-fixes/5.0.2, MIT, approved, clearlydefined +npm/npmjs/-/postcss-focus-visible/6.0.4, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-focus-within/5.0.4, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-font-variant/5.0.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-gap-properties/3.0.5, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-image-set-function/4.0.7, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-import/15.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-initial/4.0.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-js/4.0.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-lab-function/4.2.1, CC0-1.0 AND (MIT AND W3C-20150513) AND W3C-20150513 AND MIT, approved, #3020 +npm/npmjs/-/postcss-load-config/4.0.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-loader/6.2.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-logical/5.0.4, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-media-minmax/5.0.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-merge-longhand/5.1.7, MIT, approved, clearlydefined +npm/npmjs/-/postcss-merge-rules/5.1.4, MIT, approved, clearlydefined +npm/npmjs/-/postcss-minify-font-values/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-minify-gradients/5.1.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-minify-params/5.1.4, MIT, approved, clearlydefined +npm/npmjs/-/postcss-minify-selectors/5.2.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-modules-extract-imports/3.0.0, ISC, approved, clearlydefined +npm/npmjs/-/postcss-modules-local-by-default/4.0.3, MIT, approved, #8508 +npm/npmjs/-/postcss-modules-scope/3.0.0, ISC, approved, clearlydefined +npm/npmjs/-/postcss-modules-values/4.0.0, ISC, approved, clearlydefined +npm/npmjs/-/postcss-nested/6.0.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-nesting/10.2.0, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-normalize-charset/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-normalize-display-values/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-normalize-positions/5.1.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-normalize-repeat-style/5.1.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-normalize-string/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-normalize-timing-functions/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-normalize-unicode/5.1.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-normalize-url/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-normalize-whitespace/5.1.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-normalize/10.0.1, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-opacity-percentage/1.1.3, MIT, approved, clearlydefined +npm/npmjs/-/postcss-ordered-values/5.1.3, MIT, approved, clearlydefined +npm/npmjs/-/postcss-overflow-shorthand/3.0.4, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-page-break/3.0.4, MIT, approved, clearlydefined +npm/npmjs/-/postcss-place/7.0.5, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-preset-env/7.8.3, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-pseudo-class-any-link/7.1.6, CC0-1.0, approved, clearlydefined +npm/npmjs/-/postcss-reduce-initial/5.1.2, MIT AND (CC0-1.0 AND MIT) AND CC0-1.0, approved, #2972 +npm/npmjs/-/postcss-reduce-transforms/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-replace-overflow-wrap/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-selector-not/6.0.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-selector-parser/6.0.13, MIT, approved, #5056 +npm/npmjs/-/postcss-svgo/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss-unique-selectors/5.1.1, MIT, approved, clearlydefined +npm/npmjs/-/postcss-value-parser/4.2.0, MIT, approved, clearlydefined +npm/npmjs/-/postcss/7.0.39, MIT, approved, clearlydefined +npm/npmjs/-/postcss/8.4.26, MIT, approved, #3545 +npm/npmjs/-/prelude-ls/1.2.1, MIT, approved, clearlydefined +npm/npmjs/-/pretty-bytes/5.6.0, MIT, approved, clearlydefined +npm/npmjs/-/pretty-error/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/pretty-format/26.6.2, MIT, approved, clearlydefined +npm/npmjs/-/pretty-format/27.5.1, 0BSD AND Apache-2.0 AND BSD-2-Clause AND MIT, approved, #1948 +npm/npmjs/-/pretty-format/28.1.3, MIT, approved, clearlydefined +npm/npmjs/-/pretty-format/29.5.0, MIT, approved, clearlydefined +npm/npmjs/-/pretty-format/29.6.1, MIT, approved, clearlydefined +npm/npmjs/-/pretty-ms/7.0.1, MIT, approved, clearlydefined +npm/npmjs/-/private/0.1.8, MIT, approved, clearlydefined +npm/npmjs/-/process-nextick-args/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/progress/2.0.3, MIT, approved, clearlydefined +npm/npmjs/-/promise/8.3.0, MIT, approved, clearlydefined +npm/npmjs/-/prompts/2.4.2, MIT, approved, clearlydefined +npm/npmjs/-/prop-types-extra/1.1.1, , approved, CQ22354 +npm/npmjs/-/prop-types/15.8.1, MIT, approved, clearlydefined +npm/npmjs/-/proxy-addr/2.0.7, MIT, approved, clearlydefined +npm/npmjs/-/proxy-from-env/1.1.0, MIT, approved, clearlydefined +npm/npmjs/-/psl/1.9.0, MIT AND CC0-1.0, approved, #3080 +npm/npmjs/-/punycode/2.3.0, MIT, approved, #6373 +npm/npmjs/-/q/1.5.1, Apache-2.0 AND MIT, approved, #1020 +npm/npmjs/-/qs/6.11.0, BSD-3-Clause, approved, #7556 +npm/npmjs/-/querystringify/2.2.0, MIT, approved, clearlydefined +npm/npmjs/-/queue-microtask/1.2.3, MIT, approved, clearlydefined +npm/npmjs/-/queue/6.0.2, MIT, approved, clearlydefined +npm/npmjs/-/raf/3.4.1, MIT, approved, clearlydefined +npm/npmjs/-/randombytes/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/range-parser/1.2.1, MIT, approved, clearlydefined +npm/npmjs/-/raw-body/2.5.1, MIT, approved, clearlydefined +npm/npmjs/-/react-app-polyfill/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/react-bootstrap/2.8.0, MIT AND (Apache-2.0 AND BSD-3-Clause AND MIT), approved, #9852 +npm/npmjs/-/react-dev-utils/12.0.1, MIT, approved, clearlydefined +npm/npmjs/-/react-devtools-core/4.28.0, MIT AND (BSD-3-Clause AND MIT), approved, #9859 +npm/npmjs/-/react-dom/18.2.0, MIT, approved, clearlydefined +npm/npmjs/-/react-error-overlay/6.0.11, MIT, approved, clearlydefined +npm/npmjs/-/react-fast-compare/3.2.2, MIT, approved, clearlydefined +npm/npmjs/-/react-icons/4.10.1, MIT, approved, clearlydefined +npm/npmjs/-/react-is/16.13.1, MIT, approved, clearlydefined +npm/npmjs/-/react-is/17.0.2, MIT, approved, clearlydefined +npm/npmjs/-/react-is/18.2.0, MIT, approved, clearlydefined +npm/npmjs/-/react-lifecycles-compat/3.0.4, MIT, approved, clearlydefined +npm/npmjs/-/react-native/0.72.3, MIT, approved, clearlydefined +npm/npmjs/-/react-popper/2.3.0, MIT, approved, clearlydefined +npm/npmjs/-/react-refresh/0.11.0, MIT, approved, clearlydefined +npm/npmjs/-/react-refresh/0.4.3, MIT, approved, clearlydefined +npm/npmjs/-/react-router-dom/6.14.1, MIT, approved, #9432 +npm/npmjs/-/react-router/6.14.1, MIT, approved, clearlydefined +npm/npmjs/-/react-scripts/5.0.1, MIT, approved, clearlydefined +npm/npmjs/-/react-shallow-renderer/16.15.0, MIT, approved, clearlydefined +npm/npmjs/-/react-transition-group/4.4.5, BSD-3-Clause, approved, CQ22955 +npm/npmjs/-/react/18.2.0, MIT, approved, clearlydefined +npm/npmjs/-/read-cache/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/readable-stream/2.3.8, MIT, approved, #945 +npm/npmjs/-/readable-stream/3.6.2, MIT, approved, CQ22627 +npm/npmjs/-/readdirp/3.6.0, MIT, approved, #2977 +npm/npmjs/-/readline/1.3.0, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/recast/0.16.2, MIT, approved, clearlydefined +npm/npmjs/-/recast/0.20.5, MIT, approved, clearlydefined +npm/npmjs/-/recast/0.21.5, MIT, approved, clearlydefined +npm/npmjs/-/recursive-readdir/2.2.3, MIT, approved, clearlydefined +npm/npmjs/-/redent/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/regenerate-unicode-properties/10.1.0, MIT, approved, clearlydefined +npm/npmjs/-/regenerate/1.4.2, MIT, approved, clearlydefined +npm/npmjs/-/regenerator-runtime/0.13.11, MIT, approved, #4978 +npm/npmjs/-/regenerator-transform/0.15.1, MIT, approved, #5001 +npm/npmjs/-/regex-not/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/regex-parser/2.2.11, MIT, approved, clearlydefined +npm/npmjs/-/regexp.prototype.flags/1.5.0, MIT, approved, #8199 +npm/npmjs/-/regexpp/3.2.0, MIT, approved, clearlydefined +npm/npmjs/-/regexpu-core/5.3.2, MIT, approved, #7117 +npm/npmjs/-/regjsparser/0.9.1, BSD-2-Clause AND (BSD-2-Clause AND BSD-3-Clause), approved, #3329 +npm/npmjs/-/relateurl/0.2.7, MIT, approved, clearlydefined +npm/npmjs/-/renderkid/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/repeat-element/1.1.4, MIT, approved, clearlydefined +npm/npmjs/-/repeat-string/1.6.1, MIT, approved, clearlydefined +npm/npmjs/-/require-directory/2.1.1, MIT, approved, clearlydefined +npm/npmjs/-/require-from-string/2.0.2, MIT, approved, clearlydefined +npm/npmjs/-/require-main-filename/2.0.0, ISC, approved, clearlydefined +npm/npmjs/-/requires-port/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/resolve-cwd/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/resolve-from/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/resolve-from/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/resolve-from/5.0.0, MIT, approved, clearlydefined +npm/npmjs/-/resolve-url-loader/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/resolve-url/0.2.1, MIT, approved, #2922 +npm/npmjs/-/resolve.exports/1.1.1, MIT, approved, clearlydefined +npm/npmjs/-/resolve/1.22.2, MIT AND ISC, approved, #2409 +npm/npmjs/-/resolve/2.0.0-next.4, MIT AND ISC, approved, #3078 +npm/npmjs/-/restore-cursor/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/restore-cursor/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/ret/0.1.15, MIT, approved, clearlydefined +npm/npmjs/-/retry/0.13.1, MIT, approved, clearlydefined +npm/npmjs/-/reusify/1.0.4, MIT, approved, clearlydefined +npm/npmjs/-/rimraf/2.6.3, ISC, approved, clearlydefined +npm/npmjs/-/rimraf/3.0.2, ISC, approved, clearlydefined +npm/npmjs/-/rollup-plugin-terser/7.0.2, MIT, approved, clearlydefined +npm/npmjs/-/rollup/2.79.1, MIT, approved, clearlydefined +npm/npmjs/-/run-parallel/1.2.0, MIT, approved, clearlydefined +npm/npmjs/-/safe-array-concat/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/safe-buffer/5.1.2, MIT, approved, clearlydefined +npm/npmjs/-/safe-buffer/5.2.1, MIT, approved, clearlydefined +npm/npmjs/-/safe-regex-test/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/safe-regex/1.1.0, MIT, approved, clearlydefined +npm/npmjs/-/safer-buffer/2.1.2, MIT, approved, clearlydefined +npm/npmjs/-/sanitize.css/13.0.0, CC0-1.0, approved, clearlydefined +npm/npmjs/-/sass-loader/12.6.0, MIT, approved, clearlydefined +npm/npmjs/-/sax/1.2.4, ISC AND MIT AND ISC, approved, #5889 +npm/npmjs/-/saxes/5.0.1, ISC, approved, clearlydefined +npm/npmjs/-/scheduler/0.23.0, MIT, approved, clearlydefined +npm/npmjs/-/scheduler/0.24.0-canary-efb381bbf-20230505, MIT, approved, clearlydefined +npm/npmjs/-/schema-utils/2.7.0, MIT, approved, clearlydefined +npm/npmjs/-/schema-utils/2.7.1, MIT, approved, clearlydefined +npm/npmjs/-/schema-utils/3.3.0, MIT, approved, #8952 +npm/npmjs/-/schema-utils/4.2.0, MIT, approved, #8986 +npm/npmjs/-/select-hose/2.0.0, MIT, approved, #145 +npm/npmjs/-/selfsigned/2.1.1, MIT, approved, clearlydefined +npm/npmjs/-/semver/5.7.2, ISC, approved, #5900 +npm/npmjs/-/semver/6.3.1, ISC, approved, clearlydefined +npm/npmjs/-/semver/7.5.2, ISC, approved, clearlydefined +npm/npmjs/-/semver/7.5.4, ISC, approved, clearlydefined +npm/npmjs/-/send/0.18.0, MIT, approved, clearlydefined +npm/npmjs/-/serialize-error/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/serialize-javascript/4.0.0, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/serialize-javascript/6.0.1, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/serve-index/1.9.1, MIT, approved, clearlydefined +npm/npmjs/-/serve-static/1.15.0, MIT, approved, clearlydefined +npm/npmjs/-/set-blocking/2.0.0, ISC, approved, #5899 +npm/npmjs/-/set-value/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/setprototypeof/1.1.0, ISC, approved, clearlydefined +npm/npmjs/-/setprototypeof/1.2.0, ISC, approved, clearlydefined +npm/npmjs/-/shallow-clone/3.0.1, MIT, approved, clearlydefined +npm/npmjs/-/shebang-command/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/shebang-regex/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/shell-quote/1.8.1, MIT, approved, #7044 +npm/npmjs/-/side-channel/1.0.4, MIT, approved, clearlydefined +npm/npmjs/-/signal-exit/3.0.7, ISC, approved, #5892 +npm/npmjs/-/sisteransi/1.0.5, MIT, approved, clearlydefined +npm/npmjs/-/slash/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/slash/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/slice-ansi/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/slice-ansi/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/snapdragon-node/2.1.1, MIT, approved, clearlydefined +npm/npmjs/-/snapdragon-util/3.0.1, MIT, approved, clearlydefined +npm/npmjs/-/snapdragon/0.8.2, MIT, approved, clearlydefined +npm/npmjs/-/sockjs/0.3.24, MIT, approved, #2985 +npm/npmjs/-/source-list-map/2.0.1, BSD-3-Clause AND MIT, approved, #978 +npm/npmjs/-/source-map-js/1.0.2, BSD-3-Clause, approved, #2412 +npm/npmjs/-/source-map-loader/3.0.2, MIT, approved, clearlydefined +npm/npmjs/-/source-map-resolve/0.5.3, MIT, approved, clearlydefined +npm/npmjs/-/source-map-support/0.5.21, MIT, approved, clearlydefined +npm/npmjs/-/source-map-url/0.4.1, MIT, approved, #2983 +npm/npmjs/-/source-map/0.5.7, BSD-3-Clause, approved, #2400 +npm/npmjs/-/source-map/0.6.1, BSD-3-Clause, approved, #2417 +npm/npmjs/-/source-map/0.7.4, BSD-3-Clause, approved, #2416 +npm/npmjs/-/source-map/0.8.0-beta.0, BSD-3-Clause, approved, #2984 +npm/npmjs/-/sourcemap-codec/1.4.8, MIT, approved, clearlydefined +npm/npmjs/-/spdy-transport/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/spdy/4.0.2, MIT, approved, #2926 +npm/npmjs/-/split-string/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/sprintf-js/1.0.3, BSD-3-Clause, approved, #949 +npm/npmjs/-/stable/0.1.8, MIT, approved, clearlydefined +npm/npmjs/-/stack-utils/2.0.6, MIT, approved, clearlydefined +npm/npmjs/-/stackframe/1.3.4, MIT, approved, clearlydefined +npm/npmjs/-/stacktrace-parser/0.1.10, MIT, approved, clearlydefined +npm/npmjs/-/static-extend/0.1.2, MIT, approved, clearlydefined +npm/npmjs/-/statuses/1.5.0, MIT, approved, clearlydefined +npm/npmjs/-/statuses/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/stop-iteration-iterator/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/string-length/4.0.2, MIT, approved, clearlydefined +npm/npmjs/-/string-length/5.0.1, MIT, approved, clearlydefined +npm/npmjs/-/string-natural-compare/3.0.1, MIT, approved, clearlydefined +npm/npmjs/-/string-width/3.1.0, MIT, approved, clearlydefined +npm/npmjs/-/string-width/4.2.3, MIT, approved, clearlydefined +npm/npmjs/-/string.prototype.matchall/4.0.8, MIT, approved, #4571 +npm/npmjs/-/string.prototype.trim/1.2.7, MIT, approved, clearlydefined +npm/npmjs/-/string.prototype.trimend/1.0.6, MIT, approved, #4564 +npm/npmjs/-/string.prototype.trimstart/1.0.6, MIT, approved, #4647 +npm/npmjs/-/string_decoder/1.1.1, MIT, approved, clearlydefined +npm/npmjs/-/string_decoder/1.3.0, MIT, approved, clearlydefined +npm/npmjs/-/stringify-object/3.3.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/strip-ansi/5.2.0, MIT, approved, clearlydefined +npm/npmjs/-/strip-ansi/6.0.1, MIT, approved, clearlydefined +npm/npmjs/-/strip-ansi/7.1.0, MIT, approved, #8735 +npm/npmjs/-/strip-bom/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/strip-bom/4.0.0, MIT, approved, clearlydefined +npm/npmjs/-/strip-comments/2.0.1, MIT, approved, clearlydefined +npm/npmjs/-/strip-final-newline/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/strip-indent/3.0.0, MIT, approved, clearlydefined +npm/npmjs/-/strip-json-comments/3.1.1, MIT, approved, clearlydefined +npm/npmjs/-/strnum/1.0.5, MIT, approved, clearlydefined +npm/npmjs/-/style-loader/3.3.3, MIT, approved, clearlydefined +npm/npmjs/-/stylehacks/5.1.1, MIT, approved, clearlydefined +npm/npmjs/-/sucrase/3.33.0, MIT, approved, clearlydefined +npm/npmjs/-/sudo-prompt/9.2.1, MIT, approved, clearlydefined +npm/npmjs/-/supports-color/5.5.0, MIT, approved, clearlydefined +npm/npmjs/-/supports-color/6.1.0, MIT, approved, clearlydefined +npm/npmjs/-/supports-color/7.2.0, MIT, approved, clearlydefined +npm/npmjs/-/supports-color/8.1.1, MIT, approved, clearlydefined +npm/npmjs/-/supports-hyperlinks/2.3.0, MIT, approved, clearlydefined +npm/npmjs/-/supports-preserve-symlinks-flag/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/svg-parser/2.0.4, MIT, approved, clearlydefined +npm/npmjs/-/svgo/1.3.2, MIT, approved, clearlydefined +npm/npmjs/-/svgo/2.8.0, MIT AND (0BSD AND BSD-2-Clause AND MIT) AND Apache-2.0, approved, #2989 +npm/npmjs/-/symbol-tree/3.2.4, MIT, approved, clearlydefined +npm/npmjs/-/table/6.8.1, BSD-3-Clause, approved, #4596 +npm/npmjs/-/tailwindcss/3.3.3, MIT AND (Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND CC0-1.0 AND ISC AND MIT) AND CC0-1.0, approved, #8390 +npm/npmjs/-/tapable/1.1.3, MIT, approved, clearlydefined +npm/npmjs/-/tapable/2.2.1, MIT, approved, clearlydefined +npm/npmjs/-/temp-dir/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/temp/0.8.4, MIT, approved, clearlydefined +npm/npmjs/-/tempy/0.6.0, MIT, approved, clearlydefined +npm/npmjs/-/terminal-link/2.1.1, MIT, approved, clearlydefined +npm/npmjs/-/terser-webpack-plugin/5.3.9, MIT AND (Apache-2.0 AND MIT) AND Apache-2.0, approved, #7461 +npm/npmjs/-/terser/5.19.1, BSD-2-Clause AND BSD-3-Clause AND BSD-2-Clause, approved, #9355 +npm/npmjs/-/test-exclude/6.0.0, ISC, approved, clearlydefined +npm/npmjs/-/text-table/0.2.0, MIT, approved, clearlydefined +npm/npmjs/-/thenify-all/1.6.0, MIT, approved, clearlydefined +npm/npmjs/-/thenify/3.3.1, MIT, approved, clearlydefined +npm/npmjs/-/throat/4.1.0, MIT, approved, clearlydefined +npm/npmjs/-/throat/5.0.0, MIT, approved, clearlydefined +npm/npmjs/-/throat/6.0.2, MIT, approved, clearlydefined +npm/npmjs/-/through2/2.0.5, MIT, approved, clearlydefined +npm/npmjs/-/thunky/1.1.0, MIT, approved, clearlydefined +npm/npmjs/-/tmpl/1.0.5, BSD-3-Clause, approved, clearlydefined +npm/npmjs/-/to-fast-properties/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/to-object-path/0.3.0, MIT, approved, clearlydefined +npm/npmjs/-/to-regex-range/2.1.1, MIT, approved, clearlydefined +npm/npmjs/-/to-regex-range/5.0.1, MIT, approved, clearlydefined +npm/npmjs/-/to-regex/3.0.2, MIT, approved, clearlydefined +npm/npmjs/-/toidentifier/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/tough-cookie/4.1.3, BSD-3-Clause AND MIT, approved, #8743 +npm/npmjs/-/tr46/0.0.3, MIT, approved, clearlydefined +npm/npmjs/-/tr46/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/tr46/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/tryer/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/ts-interface-checker/0.1.13, Apache-2.0, approved, clearlydefined +npm/npmjs/-/ts-migrate-plugins/0.1.35, MIT, approved, clearlydefined +npm/npmjs/-/ts-migrate-server/0.1.33, MIT, approved, #9861 +npm/npmjs/-/ts-migrate/0.1.35, MIT, approved, #9865 +npm/npmjs/-/tsconfig-paths/3.14.2, MIT, approved, clearlydefined +npm/npmjs/-/tslib/1.14.1, 0BSD, approved, clearlydefined +npm/npmjs/-/tslib/2.5.3, 0BSD, approved, #6747 +npm/npmjs/-/tsutils/3.21.0, MIT, approved, clearlydefined +npm/npmjs/-/type-check/0.4.0, MIT, approved, clearlydefined +npm/npmjs/-/type-detect/4.0.8, MIT, approved, clearlydefined +npm/npmjs/-/type-fest/0.16.0, MIT OR (CC0-1.0 AND MIT), approved, clearlydefined +npm/npmjs/-/type-fest/0.20.2, MIT OR (CC0-1.0 AND MIT), approved, clearlydefined +npm/npmjs/-/type-fest/0.21.3, MIT OR (CC0-1.0 AND MIT), approved, clearlydefined +npm/npmjs/-/type-fest/0.7.1, MIT OR (CC0-1.0 AND MIT), approved, clearlydefined +npm/npmjs/-/type-is/1.6.18, MIT, approved, clearlydefined +npm/npmjs/-/typed-array-buffer/1.0.0, MIT, approved, #9658 +npm/npmjs/-/typed-array-byte-length/1.0.0, MIT, approved, #9659 +npm/npmjs/-/typed-array-byte-offset/1.0.0, MIT, approved, #9407 +npm/npmjs/-/typed-array-length/1.0.4, MIT, approved, #6246 +npm/npmjs/-/typedarray-to-buffer/3.1.5, MIT, approved, clearlydefined +npm/npmjs/-/typescript/5.1.3, Apache-2.0 AND ODbL-1.0 AND MIT, approved, #8683 +npm/npmjs/-/uglify-es/3.3.9, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/unbox-primitive/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/uncontrollable/7.2.1, MIT AND BSD-3-Clause, approved, #3025 +npm/npmjs/-/uncontrollable/8.0.2, MIT, approved, clearlydefined +npm/npmjs/-/unicode-canonical-property-names-ecmascript/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/unicode-match-property-ecmascript/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/unicode-match-property-value-ecmascript/2.1.0, MIT, approved, #4991 +npm/npmjs/-/unicode-property-aliases-ecmascript/2.1.0, MIT, approved, clearlydefined +npm/npmjs/-/union-value/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/unique-string/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/universalify/0.1.2, MIT, approved, clearlydefined +npm/npmjs/-/universalify/0.2.0, MIT, approved, clearlydefined +npm/npmjs/-/universalify/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/unpipe/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/unquote/1.1.1, MIT, approved, clearlydefined +npm/npmjs/-/unset-value/1.0.0, MIT, approved, clearlydefined +npm/npmjs/-/upath/1.2.0, MIT, approved, clearlydefined +npm/npmjs/-/updatable-log/0.2.0, ISC, approved, clearlydefined +npm/npmjs/-/update-browserslist-db/1.0.11, MIT, approved, #8237 +npm/npmjs/-/uri-js/4.4.1, BSD-2-Clause, approved, #1086 +npm/npmjs/-/urix/0.1.0, MIT, approved, #2937 +npm/npmjs/-/url-parse/1.5.10, MIT, approved, clearlydefined +npm/npmjs/-/use-sync-external-store/1.2.0, MIT, approved, clearlydefined +npm/npmjs/-/use/3.1.1, MIT, approved, clearlydefined +npm/npmjs/-/util-deprecate/1.0.2, MIT, approved, #5885 +npm/npmjs/-/util.promisify/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/utila/0.4.0, MIT, approved, clearlydefined +npm/npmjs/-/utils-merge/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/uuid/8.3.2, MIT AND (BSD-3-Clause AND MIT), approved, #2438 +npm/npmjs/-/v8-compile-cache/2.3.0, MIT, approved, clearlydefined +npm/npmjs/-/v8-to-istanbul/8.1.1, ISC, approved, clearlydefined +npm/npmjs/-/vary/1.1.2, MIT, approved, clearlydefined +npm/npmjs/-/vlq/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/w3c-hr-time/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/w3c-xmlserializer/2.0.0, MIT, approved, clearlydefined +npm/npmjs/-/walker/1.0.8, Apache-2.0, approved, clearlydefined +npm/npmjs/-/warning/4.0.3, MIT, approved, CQ22359 +npm/npmjs/-/watchpack/2.4.0, MIT, approved, clearlydefined +npm/npmjs/-/wbuf/1.7.3, MIT, approved, clearlydefined +npm/npmjs/-/wcwidth/1.0.1, MIT, approved, #944 +npm/npmjs/-/web-vitals/2.1.4, Apache-2.0, approved, clearlydefined +npm/npmjs/-/webidl-conversions/3.0.1, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/webidl-conversions/4.0.2, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/webidl-conversions/5.0.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/webidl-conversions/6.1.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/-/webpack-dev-middleware/5.3.3, MIT, approved, clearlydefined +npm/npmjs/-/webpack-dev-server/4.15.1, MIT, approved, #8400 +npm/npmjs/-/webpack-manifest-plugin/4.1.1, MIT, approved, clearlydefined +npm/npmjs/-/webpack-sources/1.4.3, MIT, approved, clearlydefined +npm/npmjs/-/webpack-sources/2.3.1, MIT, approved, clearlydefined +npm/npmjs/-/webpack-sources/3.2.3, MIT, approved, clearlydefined +npm/npmjs/-/webpack/5.88.1, MIT, approved, #9185 +npm/npmjs/-/websocket-driver/0.7.4, Apache-2.0, approved, clearlydefined +npm/npmjs/-/websocket-extensions/0.1.4, Apache-2.0, approved, CQ23021 +npm/npmjs/-/whatwg-encoding/1.0.5, MIT, approved, clearlydefined +npm/npmjs/-/whatwg-fetch/3.6.2, MIT, approved, clearlydefined +npm/npmjs/-/whatwg-mimetype/2.3.0, MIT, approved, clearlydefined +npm/npmjs/-/whatwg-url/5.0.0, MIT, approved, clearlydefined +npm/npmjs/-/whatwg-url/7.1.0, MIT, approved, clearlydefined +npm/npmjs/-/whatwg-url/8.7.0, MIT, approved, clearlydefined +npm/npmjs/-/which-boxed-primitive/1.0.2, MIT, approved, clearlydefined +npm/npmjs/-/which-collection/1.0.1, MIT, approved, clearlydefined +npm/npmjs/-/which-module/2.0.1, ISC, approved, #8224 +npm/npmjs/-/which-typed-array/1.1.10, MIT, approved, #4864 +npm/npmjs/-/which/1.3.1, ISC, approved, clearlydefined +npm/npmjs/-/which/2.0.2, ISC, approved, clearlydefined +npm/npmjs/-/workbox-background-sync/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-broadcast-update/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-build/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-cacheable-response/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-core/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-expiration/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-google-analytics/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-navigation-preload/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-precaching/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-range-requests/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-recipes/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-routing/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-strategies/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-streams/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-sw/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-webpack-plugin/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/workbox-window/6.6.0, MIT, approved, clearlydefined +npm/npmjs/-/wrap-ansi/5.1.0, MIT, approved, clearlydefined +npm/npmjs/-/wrap-ansi/6.2.0, MIT, approved, clearlydefined +npm/npmjs/-/wrap-ansi/7.0.0, MIT, approved, clearlydefined +npm/npmjs/-/wrappy/1.0.2, ISC, approved, clearlydefined +npm/npmjs/-/write-file-atomic/2.4.3, ISC, approved, clearlydefined +npm/npmjs/-/write-file-atomic/3.0.3, ISC, approved, clearlydefined +npm/npmjs/-/ws/6.2.2, MIT, approved, clearlydefined +npm/npmjs/-/ws/7.5.9, MIT, approved, #1940 +npm/npmjs/-/ws/8.13.0, MIT, approved, #7453 +npm/npmjs/-/xml-name-validator/3.0.0, Apache-2.0, approved, clearlydefined +npm/npmjs/-/xmlchars/2.2.0, MIT, approved, clearlydefined +npm/npmjs/-/xtend/4.0.2, MIT, approved, clearlydefined +npm/npmjs/-/y18n/4.0.3, ISC, approved, clearlydefined +npm/npmjs/-/y18n/5.0.8, ISC, approved, clearlydefined +npm/npmjs/-/yallist/3.1.1, ISC, approved, clearlydefined +npm/npmjs/-/yallist/4.0.0, ISC, approved, clearlydefined +npm/npmjs/-/yaml/1.10.2, ISC, approved, clearlydefined +npm/npmjs/-/yaml/2.3.1, ISC AND 0BSD, approved, #9019 +npm/npmjs/-/yargs-parser/18.1.3, ISC, approved, clearlydefined +npm/npmjs/-/yargs-parser/20.2.9, ISC, approved, clearlydefined +npm/npmjs/-/yargs-parser/21.1.1, ISC, approved, clearlydefined +npm/npmjs/-/yargs/15.4.1, MIT, approved, clearlydefined +npm/npmjs/-/yargs/16.2.0, MIT, approved, clearlydefined +npm/npmjs/-/yargs/17.7.2, MIT, approved, #8222 +npm/npmjs/-/yocto-queue/0.1.0, MIT, approved, clearlydefined +npm/npmjs/@aashutoshrathi/word-wrap/1.2.6, MIT, approved, #9212 +npm/npmjs/@adobe/css-tools/4.2.0, MIT, approved, #7202 +npm/npmjs/@alloc/quick-lru/5.2.0, MIT, approved, clearlydefined +npm/npmjs/@ampproject/remapping/2.2.1, Apache-2.0, approved, clearlydefined +npm/npmjs/@apideck/better-ajv-errors/0.3.6, MIT, approved, clearlydefined +npm/npmjs/@babel/code-frame/7.12.11, MIT, approved, clearlydefined +npm/npmjs/@babel/code-frame/7.22.5, MIT, approved, #8946 +npm/npmjs/@babel/compat-data/7.22.6, MIT, approved, #9062 +npm/npmjs/@babel/core/7.22.5, MIT, approved, #9057 +npm/npmjs/@babel/eslint-parser/7.22.9, MIT, approved, #9138 +npm/npmjs/@babel/generator/7.22.5, MIT, approved, #9002 +npm/npmjs/@babel/helper-annotate-as-pure/7.22.5, MIT, approved, #9009 +npm/npmjs/@babel/helper-builder-binary-assignment-operator-visitor/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8765 +npm/npmjs/@babel/helper-compilation-targets/7.22.6, MIT, approved, #9037 +npm/npmjs/@babel/helper-create-class-features-plugin/7.22.6, MIT, approved, #8985 +npm/npmjs/@babel/helper-create-regexp-features-plugin/7.22.5, MIT, approved, #8950 +npm/npmjs/@babel/helper-define-polyfill-provider/0.4.1, MIT, approved, #9314 +npm/npmjs/@babel/helper-environment-visitor/7.22.5, MIT, approved, #8934 +npm/npmjs/@babel/helper-function-name/7.22.5, MIT, approved, #9071 +npm/npmjs/@babel/helper-hoist-variables/7.22.5, MIT, approved, #8957 +npm/npmjs/@babel/helper-member-expression-to-functions/7.22.5, MIT, approved, #8966 +npm/npmjs/@babel/helper-module-imports/7.22.5, MIT, approved, #8944 +npm/npmjs/@babel/helper-module-transforms/7.22.5, MIT, approved, #9067 +npm/npmjs/@babel/helper-optimise-call-expression/7.22.5, MIT, approved, #9011 +npm/npmjs/@babel/helper-plugin-utils/7.22.5, MIT, approved, #9012 +npm/npmjs/@babel/helper-remap-async-to-generator/7.22.5, MIT, approved, #8981 +npm/npmjs/@babel/helper-replace-supers/7.22.5, MIT, approved, #9068 +npm/npmjs/@babel/helper-simple-access/7.22.5, MIT, approved, #9048 +npm/npmjs/@babel/helper-skip-transparent-expression-wrappers/7.22.5, MIT, approved, #8984 +npm/npmjs/@babel/helper-split-export-declaration/7.22.6, MIT, approved, #8938 +npm/npmjs/@babel/helper-string-parser/7.22.5, MIT, approved, #8962 +npm/npmjs/@babel/helper-validator-identifier/7.22.5, MIT, approved, #8955 +npm/npmjs/@babel/helper-validator-option/7.22.5, MIT, approved, #8961 +npm/npmjs/@babel/helper-wrap-function/7.22.5, MIT, approved, #8951 +npm/npmjs/@babel/helpers/7.22.5, MIT, approved, #9060 +npm/npmjs/@babel/highlight/7.22.5, MIT, approved, #9073 +npm/npmjs/@babel/parser/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8784 +npm/npmjs/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.22.5, MIT, approved, #9072 +npm/npmjs/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8762 +npm/npmjs/@babel/plugin-proposal-async-generator-functions/7.20.7, MIT, approved, #4607 +npm/npmjs/@babel/plugin-proposal-class-properties/7.18.6, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-proposal-decorators/7.22.7, MIT, approved, #9148 +npm/npmjs/@babel/plugin-proposal-export-default-from/7.22.5, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-proposal-nullish-coalescing-operator/7.18.6, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-proposal-numeric-separator/7.18.6, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-proposal-object-rest-spread/7.20.7, MIT, approved, #4581 +npm/npmjs/@babel/plugin-proposal-optional-catch-binding/7.18.6, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-proposal-optional-chaining/7.21.0, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-proposal-private-methods/7.18.6, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-proposal-private-property-in-object/7.21.0-placeholder-for-preset-env.2, MIT, approved, #8768 +npm/npmjs/@babel/plugin-proposal-unicode-property-regex/7.18.6, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-async-generators/7.8.4, MIT, approved, #1973 +npm/npmjs/@babel/plugin-syntax-bigint/7.8.3, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-class-properties/7.12.13, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-class-static-block/7.14.5, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-decorators/7.22.5, MIT, approved, #9141 +npm/npmjs/@babel/plugin-syntax-dynamic-import/7.8.3, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-export-default-from/7.22.5, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-export-namespace-from/7.8.3, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-flow/7.22.5, MIT, approved, #9076 +npm/npmjs/@babel/plugin-syntax-import-assertions/7.22.5, MIT, approved, #9042 +npm/npmjs/@babel/plugin-syntax-import-attributes/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8739 +npm/npmjs/@babel/plugin-syntax-import-meta/7.10.4, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-json-strings/7.8.3, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-jsx/7.22.5, MIT, approved, #9014 +npm/npmjs/@babel/plugin-syntax-logical-assignment-operators/7.10.4, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-numeric-separator/7.10.4, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-object-rest-spread/7.8.3, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-optional-catch-binding/7.8.3, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-optional-chaining/7.8.3, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-private-property-in-object/7.14.5, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-top-level-await/7.14.5, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-syntax-typescript/7.22.5, MIT, approved, #8994 +npm/npmjs/@babel/plugin-syntax-unicode-sets-regex/7.18.6, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-transform-arrow-functions/7.22.5, MIT, approved, #9046 +npm/npmjs/@babel/plugin-transform-async-generator-functions/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8756 +npm/npmjs/@babel/plugin-transform-async-to-generator/7.22.5, MIT, approved, #8963 +npm/npmjs/@babel/plugin-transform-block-scoped-functions/7.22.5, MIT, approved, #9008 +npm/npmjs/@babel/plugin-transform-block-scoping/7.22.5, MIT, approved, #8945 +npm/npmjs/@babel/plugin-transform-class-properties/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8769 +npm/npmjs/@babel/plugin-transform-class-static-block/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8753 +npm/npmjs/@babel/plugin-transform-classes/7.22.5, MIT, approved, #8975 +npm/npmjs/@babel/plugin-transform-computed-properties/7.22.5, MIT, approved, #9022 +npm/npmjs/@babel/plugin-transform-destructuring/7.22.5, MIT, approved, #8971 +npm/npmjs/@babel/plugin-transform-dotall-regex/7.22.5, MIT, approved, #9056 +npm/npmjs/@babel/plugin-transform-duplicate-keys/7.22.5, MIT, approved, #9039 +npm/npmjs/@babel/plugin-transform-dynamic-import/7.22.5, MIT, approved, #9016 +npm/npmjs/@babel/plugin-transform-exponentiation-operator/7.22.5, MIT, approved, #9001 +npm/npmjs/@babel/plugin-transform-export-namespace-from/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8731 +npm/npmjs/@babel/plugin-transform-flow-strip-types/7.22.5, MIT, approved, #9023 +npm/npmjs/@babel/plugin-transform-for-of/7.22.5, MIT, approved, #8933 +npm/npmjs/@babel/plugin-transform-function-name/7.22.5, MIT, approved, #8936 +npm/npmjs/@babel/plugin-transform-json-strings/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8747 +npm/npmjs/@babel/plugin-transform-literals/7.22.5, MIT, approved, #9044 +npm/npmjs/@babel/plugin-transform-logical-assignment-operators/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8720 +npm/npmjs/@babel/plugin-transform-member-expression-literals/7.22.5, MIT, approved, #9065 +npm/npmjs/@babel/plugin-transform-modules-amd/7.22.5, MIT, approved, #8925 +npm/npmjs/@babel/plugin-transform-modules-commonjs/7.22.5, MIT, approved, #9021 +npm/npmjs/@babel/plugin-transform-modules-systemjs/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8767 +npm/npmjs/@babel/plugin-transform-modules-umd/7.22.5, MIT, approved, #8997 +npm/npmjs/@babel/plugin-transform-named-capturing-groups-regex/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8738 +npm/npmjs/@babel/plugin-transform-new-target/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8737 +npm/npmjs/@babel/plugin-transform-nullish-coalescing-operator/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8763 +npm/npmjs/@babel/plugin-transform-numeric-separator/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8734 +npm/npmjs/@babel/plugin-transform-object-rest-spread/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8726 +npm/npmjs/@babel/plugin-transform-object-super/7.22.5, MIT, approved, #9045 +npm/npmjs/@babel/plugin-transform-optional-catch-binding/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8723 +npm/npmjs/@babel/plugin-transform-optional-chaining/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8740 +npm/npmjs/@babel/plugin-transform-parameters/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8741 +npm/npmjs/@babel/plugin-transform-private-methods/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8757 +npm/npmjs/@babel/plugin-transform-private-property-in-object/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8725 +npm/npmjs/@babel/plugin-transform-property-literals/7.22.5, MIT, approved, #8922 +npm/npmjs/@babel/plugin-transform-react-constant-elements/7.22.5, MIT, approved, #9154 +npm/npmjs/@babel/plugin-transform-react-display-name/7.22.5, MIT, approved, #9028 +npm/npmjs/@babel/plugin-transform-react-jsx-development/7.22.5, MIT, approved, #9025 +npm/npmjs/@babel/plugin-transform-react-jsx-self/7.22.5, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-transform-react-jsx-source/7.22.5, MIT, approved, clearlydefined +npm/npmjs/@babel/plugin-transform-react-jsx/7.22.5, MIT, approved, #9007 +npm/npmjs/@babel/plugin-transform-react-pure-annotations/7.22.5, MIT, approved, #9066 +npm/npmjs/@babel/plugin-transform-regenerator/7.22.5, MIT, approved, #9063 +npm/npmjs/@babel/plugin-transform-reserved-words/7.22.5, MIT, approved, #9029 +npm/npmjs/@babel/plugin-transform-runtime/7.22.9, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8746 +npm/npmjs/@babel/plugin-transform-shorthand-properties/7.22.5, MIT, approved, #9013 +npm/npmjs/@babel/plugin-transform-spread/7.22.5, MIT, approved, #8996 +npm/npmjs/@babel/plugin-transform-sticky-regex/7.22.5, MIT, approved, #8988 +npm/npmjs/@babel/plugin-transform-template-literals/7.22.5, MIT, approved, #9080 +npm/npmjs/@babel/plugin-transform-typeof-symbol/7.22.5, MIT, approved, #9061 +npm/npmjs/@babel/plugin-transform-typescript/7.22.5, MIT, approved, #8948 +npm/npmjs/@babel/plugin-transform-unicode-escapes/7.22.5, MIT, approved, #8998 +npm/npmjs/@babel/plugin-transform-unicode-property-regex/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8727 +npm/npmjs/@babel/plugin-transform-unicode-regex/7.22.5, MIT, approved, #8929 +npm/npmjs/@babel/plugin-transform-unicode-sets-regex/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8755 +npm/npmjs/@babel/preset-env/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8748 +npm/npmjs/@babel/preset-flow/7.22.5, MIT, approved, #8974 +npm/npmjs/@babel/preset-modules/0.1.5, MIT, approved, #9932 +npm/npmjs/@babel/preset-react/7.22.5, MIT, approved, #8987 +npm/npmjs/@babel/preset-typescript/7.22.5, MIT, approved, #9074 +npm/npmjs/@babel/register/7.22.5, MIT, approved, #8959 +npm/npmjs/@babel/regjsgen/0.8.0, MIT, approved, #7149 +npm/npmjs/@babel/runtime/7.22.5, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #8730 +npm/npmjs/@babel/template/7.22.5, MIT, approved, #9017 +npm/npmjs/@babel/traverse/7.22.5, MIT, approved, #8954 +npm/npmjs/@babel/types/7.22.5, MIT, approved, #8967 +npm/npmjs/@bcoe/v8-coverage/0.2.3, ISC AND MIT, approved, clearlydefined +npm/npmjs/@csstools/normalize.css/12.0.0, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-cascade-layers/1.1.1, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-color-function/1.1.1, CC0-1.0 AND (MIT AND W3C-20150513) AND W3C-20150513 AND MIT, approved, #3022 +npm/npmjs/@csstools/postcss-font-format-keywords/1.0.1, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-hwb-function/1.0.2, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-ic-unit/1.0.1, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-is-pseudo-class/2.0.7, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-nested-calc/1.0.0, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-normalize-display-values/1.0.1, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-oklab-function/1.1.1, CC0-1.0 AND (MIT AND W3C-20150513) AND W3C-20150513 AND MIT, approved, #3026 +npm/npmjs/@csstools/postcss-progressive-custom-properties/1.3.0, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-stepped-value-functions/1.0.1, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-text-decoration-shorthand/1.0.0, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-trigonometric-functions/1.0.2, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/postcss-unset-value/1.0.2, CC0-1.0, approved, clearlydefined +npm/npmjs/@csstools/selector-specificity/2.2.0, CC0-1.0, approved, clearlydefined +npm/npmjs/@eslint-community/eslint-utils/4.4.0, MIT, approved, #8032 +npm/npmjs/@eslint-community/regexpp/4.5.1, MIT, approved, clearlydefined +npm/npmjs/@eslint/eslintrc/0.4.3, MIT, approved, clearlydefined +npm/npmjs/@eslint/eslintrc/2.1.0, MIT, approved, #9908 +npm/npmjs/@eslint/js/8.44.0, MIT, approved, clearlydefined +npm/npmjs/@hapi/hoek/9.3.0, BSD-3-Clause AND MIT, approved, #6651 +npm/npmjs/@hapi/topo/5.1.0, BSD-3-Clause, approved, clearlydefined +npm/npmjs/@humanwhocodes/config-array/0.11.10, Apache-2.0, approved, #5876 +npm/npmjs/@humanwhocodes/config-array/0.5.0, Apache-2.0, approved, clearlydefined +npm/npmjs/@humanwhocodes/module-importer/1.0.1, Apache-2.0, approved, clearlydefined +npm/npmjs/@humanwhocodes/object-schema/1.2.1, BSD-3-Clause, approved, clearlydefined +npm/npmjs/@istanbuljs/load-nyc-config/1.1.0, ISC, approved, clearlydefined +npm/npmjs/@istanbuljs/schema/0.1.3, MIT, approved, clearlydefined +npm/npmjs/@jest/console/27.5.1, MIT, approved, clearlydefined +npm/npmjs/@jest/console/28.1.3, MIT, approved, clearlydefined +npm/npmjs/@jest/core/27.5.1, MIT, approved, clearlydefined +npm/npmjs/@jest/create-cache-key-function/29.6.1, MIT, approved, clearlydefined +npm/npmjs/@jest/environment/27.5.1, MIT, approved, clearlydefined +npm/npmjs/@jest/environment/29.6.1, MIT, approved, clearlydefined +npm/npmjs/@jest/expect-utils/29.5.0, MIT, approved, clearlydefined +npm/npmjs/@jest/fake-timers/27.5.1, MIT, approved, clearlydefined +npm/npmjs/@jest/fake-timers/29.6.1, MIT, approved, clearlydefined +npm/npmjs/@jest/globals/27.5.1, MIT, approved, clearlydefined +npm/npmjs/@jest/reporters/27.5.1, MIT, approved, clearlydefined +npm/npmjs/@jest/schemas/28.1.3, MIT, approved, clearlydefined +npm/npmjs/@jest/schemas/29.6.0, MIT, approved, clearlydefined +npm/npmjs/@jest/source-map/27.5.1, MIT, approved, clearlydefined +npm/npmjs/@jest/test-result/27.5.1, MIT, approved, clearlydefined +npm/npmjs/@jest/test-result/28.1.3, MIT, approved, clearlydefined +npm/npmjs/@jest/test-sequencer/27.5.1, MIT, approved, clearlydefined +npm/npmjs/@jest/transform/27.5.1, MIT, approved, clearlydefined +npm/npmjs/@jest/types/26.6.2, MIT, approved, clearlydefined +npm/npmjs/@jest/types/27.5.1, 0BSD AND Apache-2.0 AND BSD-2-Clause AND MIT, approved, #1960 +npm/npmjs/@jest/types/28.1.3, MIT, approved, clearlydefined +npm/npmjs/@jest/types/29.6.1, MIT, approved, clearlydefined +npm/npmjs/@jridgewell/gen-mapping/0.3.3, MIT, approved, clearlydefined +npm/npmjs/@jridgewell/resolve-uri/3.1.0, MIT, approved, clearlydefined +npm/npmjs/@jridgewell/set-array/1.1.2, MIT, approved, clearlydefined +npm/npmjs/@jridgewell/source-map/0.3.5, MIT, approved, #9304 +npm/npmjs/@jridgewell/sourcemap-codec/1.4.14, MIT, approved, clearlydefined +npm/npmjs/@jridgewell/sourcemap-codec/1.4.15, MIT, approved, clearlydefined +npm/npmjs/@jridgewell/trace-mapping/0.3.18, MIT, approved, #9904 +npm/npmjs/@leichtgewicht/ip-codec/2.0.4, MIT, approved, clearlydefined +npm/npmjs/@nicolo-ribaudo/eslint-scope-5-internals/5.1.1-v1, MIT, approved, clearlydefined +npm/npmjs/@nicolo-ribaudo/semver-v6/6.3.3, ISC, approved, #9315 +npm/npmjs/@nodelib/fs.scandir/2.1.5, MIT, approved, clearlydefined +npm/npmjs/@nodelib/fs.stat/2.0.5, MIT, approved, clearlydefined +npm/npmjs/@nodelib/fs.walk/1.2.8, MIT, approved, clearlydefined +npm/npmjs/@pmmmwh/react-refresh-webpack-plugin/0.5.10, MIT, approved, clearlydefined +npm/npmjs/@popperjs/core/2.11.8, MIT, approved, clearlydefined +npm/npmjs/@react-aria/ssr/3.6.0, Apache-2.0, approved, clearlydefined +npm/npmjs/@react-icons/all-files/4.1.0, MIT, approved, clearlydefined +npm/npmjs/@react-native-community/cli-clean/11.3.5, MIT, approved, clearlydefined +npm/npmjs/@react-native-community/cli-config/11.3.5, MIT, approved, clearlydefined +npm/npmjs/@react-native-community/cli-debugger-ui/11.3.5, MIT AND Apache-2.0, approved, #9860 +npm/npmjs/@react-native-community/cli-doctor/11.3.5, MIT AND Apache-2.0, approved, #9858 +npm/npmjs/@react-native-community/cli-hermes/11.3.5, MIT, approved, clearlydefined +npm/npmjs/@react-native-community/cli-platform-android/11.3.5, MIT, approved, clearlydefined +npm/npmjs/@react-native-community/cli-platform-ios/11.3.5, MIT, approved, clearlydefined +npm/npmjs/@react-native-community/cli-plugin-metro/11.3.5, MIT, approved, clearlydefined +npm/npmjs/@react-native-community/cli-server-api/11.3.5, MIT, approved, clearlydefined +npm/npmjs/@react-native-community/cli-tools/11.3.5, MIT, approved, clearlydefined +npm/npmjs/@react-native-community/cli-types/11.3.5, MIT, approved, clearlydefined +npm/npmjs/@react-native-community/cli/11.3.5, MIT AND Apache-2.0, approved, #9856 +npm/npmjs/@react-native/assets-registry/0.72.0, MIT, approved, clearlydefined +npm/npmjs/@react-native/codegen/0.72.6, MIT, approved, clearlydefined +npm/npmjs/@react-native/gradle-plugin/0.72.11, MIT, approved, clearlydefined +npm/npmjs/@react-native/js-polyfills/0.72.1, MIT, approved, clearlydefined +npm/npmjs/@react-native/normalize-colors/0.72.0, MIT, approved, clearlydefined +npm/npmjs/@react-native/virtualized-lists/0.72.6, MIT, approved, #9854 +npm/npmjs/@remix-run/router/1.7.1, MIT, approved, clearlydefined +npm/npmjs/@restart/hooks/0.4.9, MIT, approved, #7049 +npm/npmjs/@restart/ui/1.6.6, MIT, approved, clearlydefined +npm/npmjs/@rollup/plugin-babel/5.3.1, MIT, approved, clearlydefined +npm/npmjs/@rollup/plugin-node-resolve/11.2.1, MIT, approved, clearlydefined +npm/npmjs/@rollup/plugin-replace/2.4.2, MIT, approved, clearlydefined +npm/npmjs/@rollup/pluginutils/3.1.0, MIT, approved, clearlydefined +npm/npmjs/@rushstack/eslint-patch/1.3.2, MIT, approved, #9132 +npm/npmjs/@sideway/address/4.1.4, BSD-3-Clause AND MIT, approved, #3098 +npm/npmjs/@sideway/formula/3.0.1, BSD-3-Clause, approved, clearlydefined +npm/npmjs/@sideway/pinpoint/2.0.0, BSD-3-Clause, approved, clearlydefined +npm/npmjs/@sinclair/typebox/0.24.51, MIT, approved, #3330 +npm/npmjs/@sinclair/typebox/0.27.8, MIT, approved, clearlydefined +npm/npmjs/@sinonjs/commons/1.8.6, BSD-3-Clause, approved, #4340 +npm/npmjs/@sinonjs/commons/3.0.0, BSD-3-Clause, approved, clearlydefined +npm/npmjs/@sinonjs/fake-timers/10.3.0, BSD-3-Clause, approved, #9214 +npm/npmjs/@sinonjs/fake-timers/8.1.0, BSD-3-Clause, approved, #2563 +npm/npmjs/@surma/rollup-plugin-off-main-thread/2.2.3, Apache-2.0, approved, #3006 +npm/npmjs/@svgr/babel-plugin-add-jsx-attribute/5.4.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/babel-plugin-remove-jsx-attribute/5.4.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/babel-plugin-remove-jsx-empty-expression/5.0.1, MIT, approved, clearlydefined +npm/npmjs/@svgr/babel-plugin-replace-jsx-attribute-value/5.0.1, MIT, approved, clearlydefined +npm/npmjs/@svgr/babel-plugin-svg-dynamic-title/5.4.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/babel-plugin-svg-em-dimensions/5.4.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/babel-plugin-transform-react-native-svg/5.4.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/babel-plugin-transform-svg-component/5.5.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/babel-preset/5.5.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/core/5.5.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/hast-util-to-babel-ast/5.5.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/plugin-jsx/5.5.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/plugin-svgo/5.5.0, MIT, approved, clearlydefined +npm/npmjs/@svgr/webpack/5.5.0, MIT, approved, clearlydefined +npm/npmjs/@swc/helpers/0.4.14, MIT, approved, clearlydefined +npm/npmjs/@testing-library/dom/8.20.1, MIT, approved, #6929 +npm/npmjs/@testing-library/jest-dom/5.16.5, MIT, approved, clearlydefined +npm/npmjs/@testing-library/react/13.4.0, MIT, approved, #3261 +npm/npmjs/@testing-library/user-event/13.5.0, MIT, approved, clearlydefined +npm/npmjs/@tootallnate/once/1.1.2, MIT, approved, clearlydefined +npm/npmjs/@trysound/sax/0.2.0, ISC, approved, clearlydefined +npm/npmjs/@ts-morph/bootstrap/0.16.0, MIT AND 0BSD, approved, #9857 +npm/npmjs/@ts-morph/common/0.16.0, MIT AND 0BSD AND Apache-2.0, approved, #9863 +npm/npmjs/@types/aria-query/5.0.1, MIT, approved, clearlydefined +npm/npmjs/@types/babel__core/7.20.1, MIT, approved, clearlydefined +npm/npmjs/@types/babel__generator/7.6.4, MIT, approved, clearlydefined +npm/npmjs/@types/babel__template/7.4.1, MIT, approved, clearlydefined +npm/npmjs/@types/babel__traverse/7.20.1, MIT, approved, #8935 +npm/npmjs/@types/body-parser/1.19.2, MIT, approved, clearlydefined +npm/npmjs/@types/bonjour/3.5.10, MIT, approved, clearlydefined +npm/npmjs/@types/connect-history-api-fallback/1.5.0, MIT, approved, #8395 +npm/npmjs/@types/connect/3.4.35, MIT, approved, clearlydefined +npm/npmjs/@types/eslint-scope/3.7.4, MIT, approved, clearlydefined +npm/npmjs/@types/eslint/8.44.0, MIT, approved, #9382 +npm/npmjs/@types/estree/0.0.39, MIT, approved, clearlydefined +npm/npmjs/@types/estree/1.0.1, MIT, approved, #8266 +npm/npmjs/@types/express-serve-static-core/4.17.35, MIT, approved, #6020 +npm/npmjs/@types/express/4.17.17, MIT, approved, #5760 +npm/npmjs/@types/graceful-fs/4.1.6, MIT, approved, clearlydefined +npm/npmjs/@types/html-minifier-terser/6.1.0, MIT, approved, clearlydefined +npm/npmjs/@types/http-errors/2.0.1, MIT, approved, clearlydefined +npm/npmjs/@types/http-proxy/1.17.11, MIT, approved, #8414 +npm/npmjs/@types/istanbul-lib-coverage/2.0.4, MIT, approved, clearlydefined +npm/npmjs/@types/istanbul-lib-report/3.0.0, MIT, approved, clearlydefined +npm/npmjs/@types/istanbul-reports/3.0.1, MIT, approved, clearlydefined +npm/npmjs/@types/jest/29.5.2, MIT, approved, clearlydefined +npm/npmjs/@types/json-schema/7.0.12, MIT, approved, clearlydefined +npm/npmjs/@types/json5/0.0.29, MIT, approved, clearlydefined +npm/npmjs/@types/mime/1.3.2, MIT, approved, clearlydefined +npm/npmjs/@types/node/20.3.1, MIT, approved, clearlydefined +npm/npmjs/@types/parse-json/4.0.0, MIT, approved, clearlydefined +npm/npmjs/@types/prettier/2.7.3, MIT, approved, #9030 +npm/npmjs/@types/prop-types/15.7.5, MIT, approved, clearlydefined +npm/npmjs/@types/q/1.5.5, MIT, approved, clearlydefined +npm/npmjs/@types/qs/6.9.7, MIT, approved, clearlydefined +npm/npmjs/@types/range-parser/1.2.4, MIT, approved, clearlydefined +npm/npmjs/@types/react-datepicker/4.11.2, MIT, approved, clearlydefined +npm/npmjs/@types/react-dom/18.2.6, MIT, approved, #8256 +npm/npmjs/@types/react-native/0.72.2, MIT, approved, #9862 +npm/npmjs/@types/react-test-renderer/18.0.0, MIT, approved, clearlydefined +npm/npmjs/@types/react-transition-group/4.4.6, MIT, approved, #8416 +npm/npmjs/@types/react/18.2.13, MIT, approved, #8234 +npm/npmjs/@types/resolve/1.17.1, MIT, approved, clearlydefined +npm/npmjs/@types/retry/0.12.0, MIT, approved, clearlydefined +npm/npmjs/@types/scheduler/0.16.3, MIT, approved, #7582 +npm/npmjs/@types/semver/7.5.0, MIT, approved, clearlydefined +npm/npmjs/@types/send/0.17.1, MIT, approved, clearlydefined +npm/npmjs/@types/serve-index/1.9.1, MIT, approved, clearlydefined +npm/npmjs/@types/serve-static/1.15.2, MIT, approved, #9188 +npm/npmjs/@types/sockjs/0.3.33, MIT, approved, clearlydefined +npm/npmjs/@types/stack-utils/2.0.1, MIT, approved, clearlydefined +npm/npmjs/@types/testing-library__jest-dom/5.14.6, MIT, approved, #9436 +npm/npmjs/@types/trusted-types/2.0.3, MIT, approved, clearlydefined +npm/npmjs/@types/warning/3.0.0, MIT, approved, clearlydefined +npm/npmjs/@types/ws/8.5.5, MIT, approved, #6016 +npm/npmjs/@types/yargs-parser/21.0.0, MIT, approved, clearlydefined +npm/npmjs/@types/yargs/15.0.15, MIT, approved, #6241 +npm/npmjs/@types/yargs/16.0.5, MIT, approved, clearlydefined +npm/npmjs/@types/yargs/17.0.24, MIT, approved, #7054 +npm/npmjs/@typescript-eslint/eslint-plugin/5.62.0, BSD-2-Clause AND MIT, approved, #9435 +npm/npmjs/@typescript-eslint/experimental-utils/5.62.0, BSD-2-Clause AND MIT, approved, #9438 +npm/npmjs/@typescript-eslint/parser/5.62.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/@typescript-eslint/scope-manager/5.62.0, MIT, approved, clearlydefined +npm/npmjs/@typescript-eslint/type-utils/5.62.0, MIT, approved, clearlydefined +npm/npmjs/@typescript-eslint/types/5.62.0, MIT, approved, clearlydefined +npm/npmjs/@typescript-eslint/typescript-estree/5.62.0, BSD-2-Clause, approved, clearlydefined +npm/npmjs/@typescript-eslint/utils/5.62.0, MIT, approved, clearlydefined +npm/npmjs/@typescript-eslint/visitor-keys/5.62.0, MIT, approved, clearlydefined +npm/npmjs/@webassemblyjs/ast/1.11.6, MIT, approved, #7953 +npm/npmjs/@webassemblyjs/floating-point-hex-parser/1.11.6, MIT, approved, #7959 +npm/npmjs/@webassemblyjs/helper-api-error/1.11.6, MIT, approved, #7969 +npm/npmjs/@webassemblyjs/helper-buffer/1.11.6, MIT, approved, #7955 +npm/npmjs/@webassemblyjs/helper-numbers/1.11.6, MIT, approved, #7954 +npm/npmjs/@webassemblyjs/helper-wasm-bytecode/1.11.6, MIT, approved, #7962 +npm/npmjs/@webassemblyjs/helper-wasm-section/1.11.6, MIT, approved, #7960 +npm/npmjs/@webassemblyjs/ieee754/1.11.6, MIT, approved, #7961 +npm/npmjs/@webassemblyjs/leb128/1.11.6, Apache-2.0, approved, #7958 +npm/npmjs/@webassemblyjs/utf8/1.11.6, MIT, approved, #7966 +npm/npmjs/@webassemblyjs/wasm-edit/1.11.6, Apache-2.0 AND ISC AND MIT, approved, #2186 +npm/npmjs/@webassemblyjs/wasm-gen/1.11.6, MIT, approved, #7964 +npm/npmjs/@webassemblyjs/wasm-opt/1.11.6, MIT, approved, #7967 +npm/npmjs/@webassemblyjs/wasm-parser/1.11.6, MIT, approved, #7965 +npm/npmjs/@webassemblyjs/wast-printer/1.11.6, MIT, approved, #7957 +npm/npmjs/@xtuc/ieee754/1.2.0, BSD-3-Clause, approved, #123 +npm/npmjs/@xtuc/long/4.2.2, Apache-2.0, approved, clearlydefined diff --git a/DEPENDENCIES_SPECIFICATION b/DEPENDENCIES_SPECIFICATION new file mode 100644 index 00000000..5c44e2f4 --- /dev/null +++ b/DEPENDENCIES_SPECIFICATION @@ -0,0 +1,37 @@ +maven/mavencentral/ch.qos.logback/logback-classic/1.2.11, EPL-1.0, approved, CQ13636 +maven/mavencentral/ch.qos.logback/logback-core/1.2.11, EPL-1.0, approved, CQ13635 +maven/mavencentral/com.fasterxml.jackson.core/jackson-annotations/2.13.4, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.fasterxml.jackson.core/jackson-core/2.13.4, Apache-2.0, approved, #2133 +maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.13.4, Apache-2.0, approved, #2134 +maven/mavencentral/com.fasterxml.jackson.datatype/jackson-datatype-jdk8/2.13.4, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.13.4, Apache-2.0, approved, clearlydefined +maven/mavencentral/com.fasterxml.jackson.module/jackson-module-parameter-names/2.13.4, Apache-2.0, approved, clearlydefined +maven/mavencentral/io.swagger.core.v3/swagger-annotations/2.2.8, Apache-2.0, approved, clearlydefined +maven/mavencentral/jakarta.annotation/jakarta.annotation-api/1.3.5, EPL-2.0 OR GPL-2.0-only with Classpath-exception-2.0, approved, ee4j.ca +maven/mavencentral/javax.annotation/javax.annotation-api/1.3.2, CDDL-1.1 OR GPL-2.0-only WITH Classpath-exception-2.0, approved, CQ16910 +maven/mavencentral/javax.validation/validation-api/2.0.1.Final, Apache-2.0, approved, CQ15302 +maven/mavencentral/org.apache.logging.log4j/log4j-api/2.17.2, Apache-2.0, approved, clearlydefined +maven/mavencentral/org.apache.logging.log4j/log4j-to-slf4j/2.17.2, Apache-2.0, approved, #2163 +maven/mavencentral/org.apache.tomcat.embed/tomcat-embed-core/9.0.65, Apache-2.0 AND (CDDL-1.0 OR GPL-2.0 WITH Classpath-exception-2.0), approved, CQ20188 +maven/mavencentral/org.apache.tomcat.embed/tomcat-embed-el/9.0.65, Apache-2.0, approved, CQ20193 +maven/mavencentral/org.apache.tomcat.embed/tomcat-embed-websocket/9.0.65, Apache-2.0, approved, CQ20194 +maven/mavencentral/org.openapitools/jackson-databind-nullable/0.2.0, Apache-2.0, approved, #3294 +maven/mavencentral/org.slf4j/jul-to-slf4j/1.7.36, MIT, approved, CQ12842 +maven/mavencentral/org.slf4j/slf4j-api/1.7.36, MIT, approved, CQ13368 +maven/mavencentral/org.springframework.boot/spring-boot-autoconfigure/2.7.4, Apache-2.0, approved, #4314 +maven/mavencentral/org.springframework.boot/spring-boot-starter-json/2.7.4, Apache-2.0, approved, #4307 +maven/mavencentral/org.springframework.boot/spring-boot-starter-logging/2.7.4, Apache-2.0, approved, #4327 +maven/mavencentral/org.springframework.boot/spring-boot-starter-tomcat/2.7.4, Apache-2.0, approved, #4305 +maven/mavencentral/org.springframework.boot/spring-boot-starter-web/2.7.4, Apache-2.0, approved, #4304 +maven/mavencentral/org.springframework.boot/spring-boot-starter/2.7.4, Apache-2.0, approved, #4308 +maven/mavencentral/org.springframework.boot/spring-boot/2.7.4, Apache-2.0, approved, #4322 +maven/mavencentral/org.springframework.data/spring-data-commons/2.7.3, Apache-2.0, approved, #2768 +maven/mavencentral/org.springframework/spring-aop/5.3.23, Apache-2.0, approved, CQ23152 +maven/mavencentral/org.springframework/spring-beans/5.3.23, Apache-2.0, approved, CQ23153 +maven/mavencentral/org.springframework/spring-context/5.3.23, Apache-2.0, approved, CQ23051 +maven/mavencentral/org.springframework/spring-core/5.3.23, Apache-2.0 AND BSD-3-Clause, approved, CQ23154 +maven/mavencentral/org.springframework/spring-expression/5.3.23, Apache-2.0, approved, CQ23155 +maven/mavencentral/org.springframework/spring-jcl/5.3.23, Apache-2.0, approved, CQ23156 +maven/mavencentral/org.springframework/spring-web/5.3.23, Apache-2.0 AND LicenseRef-Public-Domain, approved, CQ23157 +maven/mavencentral/org.springframework/spring-webmvc/5.3.23, Apache-2.0, approved, CQ23158 +maven/mavencentral/org.yaml/snakeyaml/1.30, Apache-2.0, approved, clearlydefined diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 12b495f7..00000000 --- a/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2022 Catena-X - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/NOTICE.md b/NOTICE.md index ecd55e98..7a6e3a45 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -36,7 +36,7 @@ The project maintains the following source code repositories: This project leverages the following third party content. -See DEPENDENCIES file. +See DEPENDENCIES_BACKEND, DEPENDENCIES_FRONTEND and DEPENDENCIES_SPECIFICATION file. ## Cryptography diff --git a/demand-capacity-mgmt-frontend/DEPENDENCIES b/demand-capacity-mgmt-frontend/DEPENDENCIES deleted file mode 100644 index e69de29b..00000000 From 212a03a96665d9e6b853c5757716a0bc3d7fe189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Tue, 22 Aug 2023 16:58:21 +0100 Subject: [PATCH 60/62] fix: veracode --- .github/workflows/veracode-pipeline.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/veracode-pipeline.yml b/.github/workflows/veracode-pipeline.yml index a6216755..73dbfea8 100644 --- a/.github/workflows/veracode-pipeline.yml +++ b/.github/workflows/veracode-pipeline.yml @@ -18,8 +18,6 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************** - - name: Veracode Static Analysis Pipeline Scan on: @@ -28,8 +26,7 @@ on: pull_request: branches: [ "main" ] schedule: - # Once a day - - cron: "0 0 * * *" + - cron: '27 12 * * 6' permissions: contents: read From bdfaa4ef180df9414520fc1fe8f8e3369ee21af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Tue, 22 Aug 2023 17:08:15 +0100 Subject: [PATCH 61/62] Update veracode-pipeline.yml --- .github/workflows/veracode-pipeline.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/veracode-pipeline.yml b/.github/workflows/veracode-pipeline.yml index 73dbfea8..35ff1912 100644 --- a/.github/workflows/veracode-pipeline.yml +++ b/.github/workflows/veracode-pipeline.yml @@ -22,9 +22,9 @@ name: Veracode Static Analysis Pipeline Scan on: push: - branches: [ "main" ] + branches: [ "feature/DCMFOSS-61" ] pull_request: - branches: [ "main" ] + branches: [ "feature/DCMFOSS-61" ] schedule: - cron: '27 12 * * 6' From 34e5cc6be3268c7f0f8a048e102a8539ac431eee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Bail=C3=A3o?= Date: Wed, 23 Aug 2023 09:22:12 +0100 Subject: [PATCH 62/62] fix: Changes required for github merge --- .github/workflows/veracode-pipeline.yml | 4 ++-- .../entities/enums/CapacityGroupStatus.java | 22 +++++++++++++++++++ .../entities/enums/MaterialDemandStatus.java | 22 +++++++++++++++++++ .../src/components/demands/DemandPage.tsx | 20 ++++++++++++----- 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/.github/workflows/veracode-pipeline.yml b/.github/workflows/veracode-pipeline.yml index 35ff1912..73dbfea8 100644 --- a/.github/workflows/veracode-pipeline.yml +++ b/.github/workflows/veracode-pipeline.yml @@ -22,9 +22,9 @@ name: Veracode Static Analysis Pipeline Scan on: push: - branches: [ "feature/DCMFOSS-61" ] + branches: [ "main" ] pull_request: - branches: [ "feature/DCMFOSS-61" ] + branches: [ "main" ] schedule: - cron: '27 12 * * 6' diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/entities/enums/CapacityGroupStatus.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/entities/enums/CapacityGroupStatus.java index b3368b0a..6a35536c 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/entities/enums/CapacityGroupStatus.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/entities/enums/CapacityGroupStatus.java @@ -1,3 +1,25 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + package org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.enums; public enum CapacityGroupStatus { diff --git a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/entities/enums/MaterialDemandStatus.java b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/entities/enums/MaterialDemandStatus.java index 52985482..a1f60982 100644 --- a/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/entities/enums/MaterialDemandStatus.java +++ b/demand-capacity-mgmt-backend/src/main/java/org/eclipse/tractusx/demandcapacitymgmt/demandcapacitymgmtbackend/entities/enums/MaterialDemandStatus.java @@ -1,3 +1,25 @@ +/* + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** + */ + package org.eclipse.tractusx.demandcapacitymgmt.demandcapacitymgmtbackend.entities.enums; public enum MaterialDemandStatus { diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index 21e1b9e4..334fe7f9 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -1,13 +1,23 @@ /* - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * ******************************************************************************* + * Copyright (c) 2023 BMW AG + * Copyright (c) 2023 Contributors to the Eclipse Foundation * - * See the NOTICE file(s) distributed with this work for additional information regarding copyright ownership. + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. * - * This program and the accompanying materials are made available under the terms of the Apache License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 + * ******************************************************************************** */ import React, { useContext, useState, useMemo ,useCallback} from 'react';
handleSort('id')}> - Internal ID {sortColumn === 'id' && } + + handleSort('internalId')}> + Internal ID + {sortColumn === 'internalId' && sortOrder === 'asc' && } + {sortColumn === 'internalId' && sortOrder === 'desc' && } handleSort('name')}> - Name {sortColumn === 'name' && } - handleSort('customberbpnl')}> - Customber BPNL {sortColumn === 'customberbpnl' && } + Name + {sortColumn === 'name' && sortOrder === 'asc' && } + {sortColumn === 'name' && sortOrder === 'desc' && } handleSort('customername')}> - Customer Name {sortColumn === 'customername' && } + handleSort('customerBPNL')}> + Customber BPNL + {sortColumn === 'customerBPNL' && sortOrder === 'asc' && } + {sortColumn === 'customerBPNL' && sortOrder === 'desc' && } handleSort('supplierbpnl')}> - Supplier BPNL {sortColumn === 'supplierbpnl' && } + handleSort('customerName')}> + Customer Name + {sortColumn === 'customerName' && sortOrder === 'asc' && } + {sortColumn === 'customerName' && sortOrder === 'desc' && } handleSort('suppliername')}> - Supplier Name {sortColumn === 'suppliername' && } + handleSort('supplierBNPL')}> + Supplier BPNL + {sortColumn === 'supplierBNPL' && sortOrder === 'asc' && } + {sortColumn === 'supplierBNPL' && sortOrder === 'desc' && } handleSort('nmaterials')}> - # of Materials {sortColumn === 'nmaterials' && } + handleSort('numberOfMaterials')}> + # of Materials + {sortColumn === 'numberOfMaterials' && sortOrder === 'asc' && } + {sortColumn === 'numberOfMaterials' && sortOrder === 'desc' && } handleSort('favoritedby')}> - Favorited by {sortColumn === 'favoritedby' && } + handleSort('favoritedBy')}> + Favorited by + {sortColumn === 'favoritedBy' && sortOrder === 'asc' && } + {sortColumn === 'favoritedBy' && sortOrder === 'desc' && } handleSort('status')}> - Status {sortColumn === 'status' && } + Status + {sortColumn === 'status' && sortOrder === 'asc' && } + {sortColumn === 'status' && sortOrder === 'desc' && }
{capacitygroup.id}{capacitygroup.companyId}{capacitygroup.requiredValue}{capacitygroup.deliveredValue}{capacitygroup.maximumValue}{capacitygroup.description}{capacitygroup.startDate.split('T')[0]}{capacitygroup.endDate.split('T')[0]}
{capacitygroup.internalId}{capacitygroup.name}{capacitygroup.customerBPNL}{capacitygroup.customerName}{capacitygroup.supplierBNPL}{capacitygroup.numberOfMaterials}{capacitygroup.favoritedBy} {/* TODO Depending on status, this should be a different span*/} OK @@ -194,23 +171,6 @@ const CapacityGroupsList: React.FC = () => { - - - - Add Demand - - - {/* Add form for Capacitygroup here */} - - - - - ); }; diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx index 272dc1f3..dc3945d0 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandPage.tsx @@ -42,7 +42,6 @@ const DemandsPage: React.FC = () => { const [filteredDemands, setFilteredDemands] = useState([]); const handleSort = (column: string | null) => { - console.log('Sorting column:', column); if (sortColumn === column) { // If the same column is clicked again, toggle the sort order setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc'); diff --git a/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx b/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx index 57d24c01..3c075d36 100644 --- a/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx +++ b/demand-capacity-mgmt-frontend/src/components/demands/DemandsTable.tsx @@ -20,6 +20,8 @@ * ******************************************************************************** */ +import { BiCaretDown, BiCaretUp } from 'react-icons/bi'; + type DemandsTableProps = { sortColumn: string | null; sortOrder: string; @@ -36,41 +38,41 @@ const DemandsTable: React.FC = ({ sortColumn, sortOrder, hand handleSort('customer.bpn')}> Company Id{' '} - {sortColumn === 'customer.bpn' && sortOrder === 'asc' && } - {sortColumn === 'customer.bpn' && sortOrder === 'desc' && } + {sortColumn === 'customer.bpn' && sortOrder === 'asc' && } + {sortColumn === 'customer.bpn' && sortOrder === 'desc' && } {!sortColumn && ...} handleSort('materialNumberCustomer')}> Material No. Customer{' '} - {sortColumn === 'materialNumberCustomer' && sortOrder === 'asc' && } - {sortColumn === 'materialNumberCustomer' && sortOrder === 'desc' && } + {sortColumn === 'materialNumberCustomer' && sortOrder === 'asc' && } + {sortColumn === 'materialNumberCustomer' && sortOrder === 'desc' && } handleSort('materialNumberSupplier')}> Material No. Supplier{' '} - {sortColumn === 'materialNumberSupplier' && sortOrder === 'asc' && } - {sortColumn === 'materialNumberSupplier' && sortOrder === 'desc' && } + {sortColumn === 'materialNumberSupplier' && sortOrder === 'asc' && } + {sortColumn === 'materialNumberSupplier' && sortOrder === 'desc' && } handleSort('demandSeries.demandCategory')}> Demand cat. - {sortColumn === 'demandSeries.demandCategory' && sortOrder === 'asc' && } - {sortColumn === 'demandSeries.demandCategory' && sortOrder === 'desc' && } + {sortColumn === 'demandSeries.demandCategory' && sortOrder === 'asc' && } + {sortColumn === 'demandSeries.demandCategory' && sortOrder === 'desc' && } handleSort('materialDescriptionCustomer')}> Description{' '} - {sortColumn === 'materialDescriptionCustomer' && sortOrder === 'asc' && } - {sortColumn === 'materialDescriptionCustomer' && sortOrder === 'desc' && } + {sortColumn === 'materialDescriptionCustomer' && sortOrder === 'asc' && } + {sortColumn === 'materialDescriptionCustomer' && sortOrder === 'desc' && } handleSort('startDate')}> - Start Date {sortColumn === 'startDate' && sortOrder === 'asc' && } - {sortColumn === 'startDate' && sortOrder === 'desc' && } + Start Date {sortColumn === 'startDate' && sortOrder === 'asc' && } + {sortColumn === 'startDate' && sortOrder === 'desc' && } handleSort('endDate')}> - End Date {sortColumn === 'endDate' && sortOrder === 'asc' && } - {sortColumn === 'endDate' && sortOrder === 'desc' && } + End Date {sortColumn === 'endDate' && sortOrder === 'asc' && } + {sortColumn === 'endDate' && sortOrder === 'desc' && } handleSort('status')}> - Status {sortColumn === 'status' && sortOrder === 'asc' && } - {sortColumn === 'status' && sortOrder === 'desc' && } + Status {sortColumn === 'status' && sortOrder === 'asc' && } + {sortColumn === 'status' && sortOrder === 'desc' && }