From fb7e3bc8124a0e01a898dd0039f711c10681c5e5 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Fri, 2 Aug 2024 15:49:09 -0400 Subject: [PATCH] - Check Point Signed-off-by: Dave Richer --- .../production-board-filters.component.jsx | 1 - .../production-board-kanban.component.jsx | 11 ++- .../production-board-kanban.utils.js | 18 +++- .../settings/FilterSettings.jsx | 93 +++++++++++++++++++ .../settings/InformationSettings.jsx | 2 +- .../settings/LayoutSettings.jsx | 2 +- .../settings/StatisticsSettings.jsx | 60 ++++++------ .../settings/defaultKanbanSettings.js | 4 +- ...uction-board-kanban.settings.component.jsx | 38 +++++++- client/src/translations/en_us/common.json | 5 + client/src/translations/es/common.json | 5 + client/src/translations/fr/common.json | 5 + 12 files changed, 203 insertions(+), 41 deletions(-) create mode 100644 client/src/components/production-board-kanban/settings/FilterSettings.jsx diff --git a/client/src/components/production-board-filters/production-board-filters.component.jsx b/client/src/components/production-board-filters/production-board-filters.component.jsx index 65e26a452..421759534 100644 --- a/client/src/components/production-board-filters/production-board-filters.component.jsx +++ b/client/src/components/production-board-filters/production-board-filters.component.jsx @@ -17,7 +17,6 @@ export default connect(mapStateToProps, mapDispatchToProps)(ProductionBoardFilte export function ProductionBoardFilters({ bodyshop, filter, setFilter, loading }) { const { t } = useTranslation(); - return ( {loading && } diff --git a/client/src/components/production-board-kanban/production-board-kanban.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.component.jsx index dc8a6a929..afd0e94e1 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.component.jsx @@ -59,7 +59,12 @@ function ProductionBoardKanbanComponent({ data, bodyshop, refetch, insertAuditTr useEffect(() => { setIsMoving(true); - const newBoardData = createBoardData({ statuses, data, filter }); + const newBoardData = createBoardData({ + statuses, + data, + filter, + cardSettings: associationSettings?.kanban_settings + }); newBoardData.lanes = newBoardData.lanes.map((lane) => ({ ...lane, @@ -74,7 +79,7 @@ function ProductionBoardKanbanComponent({ data, bodyshop, refetch, insertAuditTr return prevBoardLanes; }); setIsMoving(false); - }, [data, bodyshop.md_ro_statuses, filter, statuses]); + }, [data, bodyshop.md_ro_statuses, filter, statuses, associationSettings?.kanban_settings]); const getCardByID = useCallback((data, cardId) => { for (const lane of data.lanes) { @@ -211,6 +216,8 @@ function ProductionBoardKanbanComponent({ data, bodyshop, refetch, insertAuditTr parentLoading={setLoading} associationSettings={associationSettings} onSettingsChange={handleSettingsChange} + bodyshop={bodyshop} + data={data} /> } diff --git a/client/src/components/production-board-kanban/production-board-kanban.utils.js b/client/src/components/production-board-kanban/production-board-kanban.utils.js index 10eec0771..fed3d12db 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.utils.js +++ b/client/src/components/production-board-kanban/production-board-kanban.utils.js @@ -1,6 +1,6 @@ +// Function to sort an array of objects by parentId import { groupBy } from "lodash"; -// Function to sort an array of objects by parentId const sortByParentId = (arr) => { let parentId = "-1"; const sortedList = []; @@ -28,7 +28,7 @@ const sortByParentId = (arr) => { }; // Function to create board data based on statuses and jobs, with optional filtering -export const createBoardData = ({ statuses, data, filter }) => { +export const createBoardData = ({ statuses, data, filter, cardSettings }) => { const { search, employeeId } = filter; const lanes = statuses.map((status) => ({ @@ -37,9 +37,21 @@ export const createBoardData = ({ statuses, data, filter }) => { cards: [] })); - const filteredJobs = + let filteredJobs = (search === "" || !search) && !employeeId ? data : data.filter((job) => checkFilter(search, employeeId, job)); + // Filter jobs by selectedMdInsCos if it has values + if (cardSettings?.selectedMdInsCos?.length > 0) { + filteredJobs = filteredJobs.filter((job) => cardSettings.selectedMdInsCos.includes(job.ins_co_nm)); + } + + // Filter jobs by selectedEstimators if it has values + if (cardSettings?.selectedEstimators?.length > 0) { + filteredJobs = filteredJobs.filter((job) => + cardSettings.selectedEstimators.includes(`${job.est_ct_fn} ${job.est_ct_ln}`) + ); + } + const DataGroupedByStatus = groupBy(filteredJobs, "status"); Object.keys(DataGroupedByStatus).forEach((statusGroupKey) => { diff --git a/client/src/components/production-board-kanban/settings/FilterSettings.jsx b/client/src/components/production-board-kanban/settings/FilterSettings.jsx new file mode 100644 index 000000000..183f9cf56 --- /dev/null +++ b/client/src/components/production-board-kanban/settings/FilterSettings.jsx @@ -0,0 +1,93 @@ +import React from "react"; +import { Card, Form, Select } from "antd"; +import { useTranslation } from "react-i18next"; +import PropTypes from "prop-types"; + +const FilterSettings = ({ + selectedMdInsCos, + setSelectedMdInsCos, + selectedEstimators, + setSelectedEstimators, + setHasChanges, + bodyshop, + data +}) => { + const { t } = useTranslation(); + + const extractNames = (source, firstNameKey, lastNameKey) => + source.map((item) => ({ + firstName: item[firstNameKey], + lastName: item[lastNameKey] + })); + + const bodyshopNames = extractNames(bodyshop.md_estimators, "est_ct_fn", "est_ct_ln"); + const dataNames = extractNames(data, "est_ct_fn", "est_ct_ln"); + + const combinedNames = [...bodyshopNames, ...dataNames]; + + const uniqueNames = Array.from( + new Map(combinedNames.map((item) => [`${item.firstName} ${item.lastName}`, item])).values() + ); + + return ( + + + { + setSelectedEstimators(value); + setHasChanges(true); + }} + options={uniqueNames.map((item) => { + const name = `${item.firstName} ${item.lastName}`.trim(); + return { + value: name, + label: name + }; + })} + /> + + + ); +}; + +FilterSettings.propTypes = { + selectedMdInsCos: PropTypes.array.isRequired, + setSelectedMdInsCos: PropTypes.func.isRequired, + setHasChanges: PropTypes.func.isRequired, + selectedEstimators: PropTypes.array.isRequired, + setSelectedEstimators: PropTypes.func, + bodyshop: PropTypes.shape({ + md_ins_cos: PropTypes.arrayOf( + PropTypes.shape({ + name: PropTypes.string.isRequired + }) + ).isRequired, + md_estimators: PropTypes.arrayOf( + PropTypes.shape({ + est_ct_fn: PropTypes.string.isRequired, + est_ct_ln: PropTypes.string.isRequired + }) + ).isRequired + }).isRequired, + data: PropTypes.arrayOf(PropTypes.object).isRequired +}; + +export default FilterSettings; diff --git a/client/src/components/production-board-kanban/settings/InformationSettings.jsx b/client/src/components/production-board-kanban/settings/InformationSettings.jsx index 1657d070d..3dd6d7975 100644 --- a/client/src/components/production-board-kanban/settings/InformationSettings.jsx +++ b/client/src/components/production-board-kanban/settings/InformationSettings.jsx @@ -3,7 +3,7 @@ import React from "react"; import PropTypes from "prop-types"; const InformationSettings = ({ t }) => ( - + {[ "model_info", diff --git a/client/src/components/production-board-kanban/settings/LayoutSettings.jsx b/client/src/components/production-board-kanban/settings/LayoutSettings.jsx index a4a050145..9c062e651 100644 --- a/client/src/components/production-board-kanban/settings/LayoutSettings.jsx +++ b/client/src/components/production-board-kanban/settings/LayoutSettings.jsx @@ -3,7 +3,7 @@ import React from "react"; import PropTypes from "prop-types"; const LayoutSettings = ({ t }) => ( - + {[ { diff --git a/client/src/components/production-board-kanban/settings/StatisticsSettings.jsx b/client/src/components/production-board-kanban/settings/StatisticsSettings.jsx index a8326da41..52e21cf97 100644 --- a/client/src/components/production-board-kanban/settings/StatisticsSettings.jsx +++ b/client/src/components/production-board-kanban/settings/StatisticsSettings.jsx @@ -15,35 +15,37 @@ const StatisticsSettings = ({ t, statisticsOrder, setStatisticsOrder, setHasChan }; return ( - - - {(provided) => ( -
- {statisticsOrder.map((itemId, index) => { - const item = statisticsItems.find((stat) => stat.id === itemId); - return ( - - {(provided) => ( -
- - - {t(`production.settings.statistics.${item.label}`)} - - -
- )} -
- ); - })} - {provided.placeholder} -
- )} -
-
+ + + + {(provided) => ( +
+ {statisticsOrder.map((itemId, index) => { + const item = statisticsItems.find((stat) => stat.id === itemId); + return ( + + {(provided) => ( +
+ + + {t(`production.settings.statistics.${item.label}`)} + + +
+ )} +
+ ); + })} + {provided.placeholder} +
+ )} +
+
+
); }; diff --git a/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js b/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js index d06c67e83..a8e813718 100644 --- a/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js +++ b/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js @@ -36,7 +36,9 @@ const defaultKanbanSettings = { totalLAROnBoard: false, jobsOnBoard: false, totalAmountOnBoard: true, - statisticsOrder: statisticsItems.map((item) => item.id) + statisticsOrder: statisticsItems.map((item) => item.id), + selectedMdInsCos: [], + selectedEstimators: [] }; export { defaultKanbanSettings, statisticsItems }; diff --git a/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx b/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx index fd69b3638..38b0c9350 100644 --- a/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx +++ b/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx @@ -7,13 +7,16 @@ import { defaultKanbanSettings } from "./defaultKanbanSettings.js"; import LayoutSettings from "./LayoutSettings.jsx"; import InformationSettings from "./InformationSettings.jsx"; import StatisticsSettings from "./StatisticsSettings.jsx"; +import FilterSettings from "./FilterSettings.jsx"; -export default function ProductionBoardKanbanSettings({ associationSettings, parentLoading }) { +export default function ProductionBoardKanbanSettings({ associationSettings, parentLoading, bodyshop, data }) { const [form] = Form.useForm(); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const [hasChanges, setHasChanges] = useState(false); const [statisticsOrder, setStatisticsOrder] = useState(defaultKanbanSettings.statisticsOrder); + const [selectedMdInsCos, setSelectedMdInsCos] = useState(defaultKanbanSettings.selectedMdInsCos); + const [selectedEstimators, setSelectedEstimators] = useState(defaultKanbanSettings.selectedEstimators); const [updateKbSettings] = useMutation(UPDATE_KANBAN_SETTINGS); const { t } = useTranslation(); @@ -24,6 +27,12 @@ export default function ProductionBoardKanbanSettings({ associationSettings, par if (associationSettings.kanban_settings.statisticsOrder) { setStatisticsOrder(associationSettings.kanban_settings.statisticsOrder); } + if (associationSettings.kanban_settings.selectedMdInsCos) { + setSelectedMdInsCos(associationSettings.kanban_settings.selectedMdInsCos); + } + if (associationSettings.kanban_settings.selectedEstimators) { + setSelectedEstimators(associationSettings.kanban_settings.selectedEstimators); + } } }, [form, associationSettings]); @@ -34,7 +43,13 @@ export default function ProductionBoardKanbanSettings({ associationSettings, par const result = await updateKbSettings({ variables: { id: associationSettings?.id, - ks: { ...associationSettings.kanban_settings, ...values, statisticsOrder } + ks: { + ...associationSettings.kanban_settings, + ...values, + statisticsOrder, + selectedMdInsCos, + selectedEstimators + } } }); @@ -61,11 +76,13 @@ export default function ProductionBoardKanbanSettings({ associationSettings, par statisticsOrder: defaultKanbanSettings.statisticsOrder }); setStatisticsOrder(defaultKanbanSettings.statisticsOrder); + setSelectedMdInsCos(defaultKanbanSettings.selectedMdInsCos); + setSelectedEstimators(defaultKanbanSettings.selectedEstimators); setHasChanges(true); }; const overlay = ( - +
) + }, + { + key: "4", + label: t("production.settings.filters_title"), + children: ( + + ) } ]} /> diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index a1bd6623f..d22f6d99d 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -2736,6 +2736,11 @@ "information": "Information", "statistics_title": "Statistics", "board_settings": "Board Settings", + "filters_title": "Filters", + "filters": { + "md_ins_cos": "Insurance Companies", + "md_estimators": "Estimators" + }, "statistics": { "total_hours_in_production": "Hours in Production", "total_lab_in_production": "Body Hours in Production", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 3e3b3d2f9..045982664 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -2736,6 +2736,11 @@ "information": "", "statistics_title": "", "board_settings": "", + "filters_title": "", + "filters": { + "md_ins_cos": "", + "md_estimators": "" + }, "statistics": { "total_hours_in_production": "", "total_lab_in_production": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index f0ded757f..0282b2b96 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -2736,6 +2736,11 @@ "information": "", "statistics_title": "", "board_settings": "", + "filters_title": "", + "filters": { + "md_ins_cos": "", + "md_estimators": "" + }, "statistics": { "total_hours_in_production": "", "total_lab_in_production": "",