From 201cd8e09f3b966ce6b0264db2ea06c385010785 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Wed, 6 Nov 2024 11:19:27 -0500 Subject: [PATCH 01/91] LF-4477 Add expandable view to Inventory container --- .../containers/Animals/Inventory/index.tsx | 31 ++++++++++++++++++- .../Animals/Inventory/styles.module.scss | 29 +++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/packages/webapp/src/containers/Animals/Inventory/index.tsx b/packages/webapp/src/containers/Animals/Inventory/index.tsx index 53165a68fc..426a380a6e 100644 --- a/packages/webapp/src/containers/Animals/Inventory/index.tsx +++ b/packages/webapp/src/containers/Animals/Inventory/index.tsx @@ -40,10 +40,14 @@ import { import { isAdminSelector } from '../../userFarmSlice'; import { useAnimalsFilterReduxState } from './KPI/useAnimalsFilterReduxState'; import FloatingContainer from '../../../components/FloatingContainer'; +import ExpandableItem from '../../../components/Expandable/ExpandableItem'; +import useExpandable from '../../../components/Expandable/useExpandableItem'; +import clsx from 'clsx'; export enum View { DEFAULT = 'default', TASK = 'task', + TASK_SUMMARY = 'task_summary', } interface AnimalInventoryProps { preSelectedIds?: string[]; @@ -70,7 +74,8 @@ function AnimalInventory({ isCompactSideMenu, history, }: AnimalInventoryProps) { - const isTaskView = view === View.TASK; + const isTaskView = [View.TASK, View.TASK_SUMMARY].includes(view); + const isSummaryView = view === View.TASK_SUMMARY; const [selectedInventoryIds, setSelectedInventoryIds] = useState(preSelectedIds); @@ -288,4 +293,28 @@ function AnimalInventory({ ); } +export function ExpandableAnimalInventory(props: AnimalInventoryProps) { + const { expandedIds, toggleExpanded } = useExpandable({ isSingleExpandable: true }); + const isExpanded = expandedIds.includes(1); + return ( +
+ {/* @ts-ignore */} + toggleExpanded(1)} + mainContent={'See detail list of animals to move'} + expandedContent={ +
+ +
+ } + iconClickOnly={false} + // classes = {}, + itemKey={1} + // leftCollapseIcon = false, + /> +
+ ); +} + export default AnimalInventory; diff --git a/packages/webapp/src/containers/Animals/Inventory/styles.module.scss b/packages/webapp/src/containers/Animals/Inventory/styles.module.scss index 871cdaed86..463c6ca20e 100644 --- a/packages/webapp/src/containers/Animals/Inventory/styles.module.scss +++ b/packages/webapp/src/containers/Animals/Inventory/styles.module.scss @@ -29,6 +29,35 @@ } } +.taskViewHeight { + height: calc(100vh - var(--global-navbar-height) - var(--global-multi-step-task-layout-aggregated-height)); +} + +.section { + margin-top: 16px; + padding: 16px; + background: var(--White); + border-radius: 4px; + border: 1px solid var(--Colors-Neutral-Neutral-100); +} + +.expanded { + border: 1px solid var(--Form-focus); + box-shadow: 0px 0px 4px 0px var(--Colors-Neutral-Neutral-200); +} + +.expandedContentWrapper { + margin-top: 16px; +} + +.detailsWrapper { + display: flex; + flex-direction: column; + gap: 8px; + padding: 16px; + background: var(--White); +} + .taskViewHeight { height: calc(100vh - var(--global-navbar-height) - var(--global-multi-step-task-layout-aggregated-height)); } \ No newline at end of file From d33ecf356e7ab6c9ab7fa889859a33e28f35f32c Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Wed, 6 Nov 2024 11:24:26 -0500 Subject: [PATCH 02/91] LF-4477 Add animals inventory to task locations --- .../webapp/src/components/Task/TaskLocations/index.jsx | 9 ++++++++- .../webapp/src/containers/Task/TaskLocations/index.jsx | 3 +++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/webapp/src/components/Task/TaskLocations/index.jsx b/packages/webapp/src/components/Task/TaskLocations/index.jsx index dc2d78f026..b0d1a8bc9c 100644 --- a/packages/webapp/src/components/Task/TaskLocations/index.jsx +++ b/packages/webapp/src/components/Task/TaskLocations/index.jsx @@ -9,6 +9,7 @@ import PropTypes from 'prop-types'; import { useForm } from 'react-hook-form'; import { cloneObject } from '../../../util'; import Checkbox from '../../Form/Checkbox'; +import { ExpandableAnimalInventory, View } from '../../../containers/Animals/Inventory'; export default function PureTaskLocations({ locations, readOnlyPinCoordinates, @@ -24,6 +25,7 @@ export default function PureTaskLocations({ maxZoom, defaultLocation, targetsWildCrop, + isAnimalTask = false, }) { const { t } = useTranslation(); const progress = 43; @@ -124,7 +126,12 @@ export default function PureTaskLocations({ title={t('MANAGEMENT_DETAIL.ADD_A_TASK')} value={progress} /> - + {isAnimalTask && ( + + )}
{title || t('TASK.SELECT_TASK_LOCATIONS')}
diff --git a/packages/webapp/src/containers/Task/TaskLocations/index.jsx b/packages/webapp/src/containers/Task/TaskLocations/index.jsx index c3a5b7fbfc..f2f07298b9 100644 --- a/packages/webapp/src/containers/Task/TaskLocations/index.jsx +++ b/packages/webapp/src/containers/Task/TaskLocations/index.jsx @@ -156,6 +156,7 @@ function TaskAnimalLocations({ history, location }) { title={t('TASK.ANIMAL_MOVING_TO_LOCATION')} onContinue={onContinue} location={location} + isAnimalTask={true} /> ); } @@ -206,6 +207,7 @@ function TaskLocations({ onContinue, readOnlyPinCoordinates, location, + isAnimalTask = false, }) { const { grid_points } = useSelector(userFarmSelector); const { maxZoomRef, getMaxZoom, maxZoom } = useMaxZoom(); @@ -231,6 +233,7 @@ function TaskLocations({ maxZoom={maxZoom} defaultLocation={location?.state?.location ?? null} targetsWildCrop={managementPlan?.crop_management_plan?.is_wild ?? false} + isAnimalTask={isAnimalTask} /> ); From 594fc02495258294354f6b7a02ad39caab30bf32 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Wed, 6 Nov 2024 15:14:57 -0500 Subject: [PATCH 03/91] LF-4477 Hide search and row selection in summary view --- .../components/Animals/Inventory/index.tsx | 68 ++++++++++--------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/packages/webapp/src/components/Animals/Inventory/index.tsx b/packages/webapp/src/components/Animals/Inventory/index.tsx index 400a736c54..fd042af694 100644 --- a/packages/webapp/src/components/Animals/Inventory/index.tsx +++ b/packages/webapp/src/components/Animals/Inventory/index.tsx @@ -83,7 +83,9 @@ const PureAnimalInventory = ({ view?: View; }) => { const { t } = useTranslation(); - const isTaskView = view === View.TASK; + const isTaskView = [View.TASK, View.TASK_SUMMARY].includes(view); + const isSummaryView = view === View.TASK_SUMMARY; + if (isLoading) { return null; } @@ -94,41 +96,45 @@ const PureAnimalInventory = ({ const tableMaxHeight = !isDesktop || !containerHeight ? undefined : containerHeight - usedHeight; const tableSpacerRowHeight = !isTaskView ? (isDesktop ? 96 : 120) : 0; + const showInventorySelection = isAdmin && !isSummaryView; + return ( <> -
- setSearchString(e.target.value)} - isSearchActive={!!searchString} - placeholderText={placeHolderText} - zIndexBase={zIndexBase} - isDesktop={isDesktop} - className={clsx(isDesktop ? styles.searchBarDesktop : styles.searchBar)} - /> - + {!isSummaryView && (
- {searchResultsText} -
-
- setSearchString(e.target.value)} + isSearchActive={!!searchString} + placeholderText={placeHolderText} + zIndexBase={zIndexBase} + isDesktop={isDesktop} + className={clsx(isDesktop ? styles.searchBarDesktop : styles.searchBar)} /> + +
+ {searchResultsText} +
+
+ +
-
+ )}
{!totalInventoryCount || hasSearchResults ? ( Date: Wed, 6 Nov 2024 15:17:34 -0500 Subject: [PATCH 04/91] LF-4477 Add new filter criteria to only show all selected ids --- .../Animals/Inventory/useFilteredInventory.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/webapp/src/containers/Animals/Inventory/useFilteredInventory.ts b/packages/webapp/src/containers/Animals/Inventory/useFilteredInventory.ts index c13f2f4e60..12537fd2f1 100644 --- a/packages/webapp/src/containers/Animals/Inventory/useFilteredInventory.ts +++ b/packages/webapp/src/containers/Animals/Inventory/useFilteredInventory.ts @@ -22,7 +22,19 @@ import { animalMatchesFilter } from '../../Filter/Animals/utils'; import { animalsFilterSelector } from '../../filterSlice'; import { isInactive } from '../../Filter/utils'; -export const useFilteredInventory = (inventory: AnimalInventory[]) => { +export const useFilteredInventory = ( + inventory: AnimalInventory[], + isSummaryView: boolean, + selectedInventoryIds: string[], +) => { + if (isSummaryView) { + return useMemo(() => { + return inventory.filter((entity) => { + return selectedInventoryIds.includes(entity.id); + }); + }, [selectedInventoryIds]); + } + const { [AnimalsFilterKeys.ANIMAL_OR_BATCH]: animalsOrBatchesFilter, [AnimalsFilterKeys.TYPE]: typesFilter, From 3d8ded1f587978de4c5f7236ab31488463211e23 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Wed, 6 Nov 2024 15:19:19 -0500 Subject: [PATCH 05/91] LF-4477 Pass values to updated filter hook and add new option to do nothing for row selection behaviour --- .../src/containers/Animals/Inventory/index.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/webapp/src/containers/Animals/Inventory/index.tsx b/packages/webapp/src/containers/Animals/Inventory/index.tsx index 426a380a6e..54163adc71 100644 --- a/packages/webapp/src/containers/Animals/Inventory/index.tsx +++ b/packages/webapp/src/containers/Animals/Inventory/index.tsx @@ -91,7 +91,7 @@ function AnimalInventory({ const { inventory, isLoading } = useAnimalInventory(); - const filteredInventory = useFilteredInventory(inventory); + const filteredInventory = useFilteredInventory(inventory, isSummaryView, selectedInventoryIds); const isFilterActive = useSelector(isFilterCurrentlyActiveSelector('animals')); const dispatch = useDispatch(); @@ -222,7 +222,15 @@ function AnimalInventory({ }; const onRowClick = (event: ChangeEvent, row: AnimalInventory) => { - !isTaskView ? history.push(row.path) : onSelectInventory(event, row); + switch (view) { + case View.TASK: + onSelectInventory(event, row); + break; + case View.TASK_SUMMARY: + break; + default: + history.push(row.path); + } }; const iconActions: iconAction[] = [ From f5adf8e1dd567b2925ffe82868eb7dbe185c4aff Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Wed, 6 Nov 2024 20:01:40 -0500 Subject: [PATCH 06/91] LF-4477 Extend pill to allow classname --- packages/webapp/src/components/Pill/index.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/webapp/src/components/Pill/index.jsx b/packages/webapp/src/components/Pill/index.jsx index 7bed612e53..704bf99baf 100644 --- a/packages/webapp/src/components/Pill/index.jsx +++ b/packages/webapp/src/components/Pill/index.jsx @@ -3,13 +3,14 @@ import PropTypes from 'prop-types'; import styles from './styles.module.scss'; import clsx from 'clsx'; -const Pill = ({ body, active, spaceBefore }) => { +const Pill = ({ body, active, spaceBefore, className }) => { return ( {body} From 9df06ac75b03493f6b221f2fd294ee78589c0ad2 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Fri, 8 Nov 2024 10:44:14 -0500 Subject: [PATCH 07/91] LF-4477 Add list view option and add styles for desktop --- .../webapp/src/components/Table/TableV2.jsx | 5 +++ .../src/components/Table/styles.module.scss | 31 +++++++++++++++++++ packages/webapp/src/components/Table/types.ts | 1 + 3 files changed, 37 insertions(+) diff --git a/packages/webapp/src/components/Table/TableV2.jsx b/packages/webapp/src/components/Table/TableV2.jsx index f22c79233f..02e954e312 100644 --- a/packages/webapp/src/components/Table/TableV2.jsx +++ b/packages/webapp/src/components/Table/TableV2.jsx @@ -101,6 +101,7 @@ export default function TableV2(props) { maxHeight, spacerRowHeight, headerClass, + listView, } = props; const [order, setOrder] = useState('asc'); @@ -168,6 +169,7 @@ export default function TableV2(props) { styles.table, shouldFixTableLayout && styles.fixed, alternatingRowColor && styles.alternatingRowColorStyle, + listView && styles.listViewTable, )} stickyHeader={stickyHeader && maxHeight ? true : false} > @@ -200,6 +202,7 @@ export default function TableV2(props) { styles.itemRow, onRowClick && styles.clickable, alternatingRowColor ? styles.alternatingRowColor : styles.plainRowColor, + listView && styles.listViewRow, )} > {shouldShowCheckbox && ( @@ -331,6 +334,7 @@ TableV2.propTypes = { spacerRowHeight: PropTypes.number, /** Cheating here using any since it is not meshing well with ts type */ headerClass: PropTypes.any, + listView: PropTypes.bool, }; TableV2.defaultProps = { @@ -342,4 +346,5 @@ TableV2.defaultProps = { defaultOrderBy: '', alternatingRowColor: false, showHeader: true, + listView: false, }; diff --git a/packages/webapp/src/components/Table/styles.module.scss b/packages/webapp/src/components/Table/styles.module.scss index 6e6834e7c8..f747f3e546 100644 --- a/packages/webapp/src/components/Table/styles.module.scss +++ b/packages/webapp/src/components/Table/styles.module.scss @@ -121,6 +121,37 @@ } } +.listViewRow { + padding: 4px 8px; + border-spacing: 8px; + border: solid 1px var(---Colors-Neutral-Neutral-50); + &.clickable { + cursor: default; + } + & > td { + border-top: solid 1px var(--Colors-Neutral-Neutral-50); + border-bottom: solid 1px var(--Colors-Neutral-Neutral-50); + + &:first-child { + border-radius: 4px 0 0 4px; + border: solid 1px var(--Colors-Neutral-Neutral-50); + border-right: none; + } + &:last-child { + border-radius: 0 4px 4px 0; + border: solid 1px var(--Colors-Neutral-Neutral-50); + border-left: none; + } + }; +} + +.listViewTable { + border-spacing: 0 8px; + .tableBody::before { + content: none; + } +} + .tableCell { padding: 0 12px; height: 56px; diff --git a/packages/webapp/src/components/Table/types.ts b/packages/webapp/src/components/Table/types.ts index 8e5a0f6ae2..476dd41350 100644 --- a/packages/webapp/src/components/Table/types.ts +++ b/packages/webapp/src/components/Table/types.ts @@ -85,4 +85,5 @@ export type TableV2Props = { maxHeight?: number | string; spacerRowHeight?: number; headerClass?: ClassValue; + listView?: boolean; }; From 524df8318b06f6f30c958c05ff8acf7eb014c52b Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Fri, 8 Nov 2024 10:47:46 -0500 Subject: [PATCH 08/91] LF-4477 Hide alternating color and use table list view in summary view --- packages/webapp/src/components/Animals/Inventory/index.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/webapp/src/components/Animals/Inventory/index.tsx b/packages/webapp/src/components/Animals/Inventory/index.tsx index fd042af694..a25fa60b14 100644 --- a/packages/webapp/src/components/Animals/Inventory/index.tsx +++ b/packages/webapp/src/components/Animals/Inventory/index.tsx @@ -94,6 +94,7 @@ const PureAnimalInventory = ({ const hasSearchResults = filteredInventory.length !== 0; const tableMaxHeight = !isDesktop || !containerHeight ? undefined : containerHeight - usedHeight; + const tableSpacerRowHeight = !isTaskView ? (isDesktop ? 96 : 120) : 0; const showInventorySelection = isAdmin && !isSummaryView; @@ -139,13 +140,13 @@ const PureAnimalInventory = ({ {!totalInventoryCount || hasSearchResults ? (
) : ( Date: Fri, 15 Nov 2024 13:51:44 -0500 Subject: [PATCH 09/91] LF-4483 Set a minimum height on location picker map --- packages/webapp/src/assets/variables.scss | 1 + .../LocationPicker/SingleLocationPicker/styles.module.scss | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/webapp/src/assets/variables.scss b/packages/webapp/src/assets/variables.scss index f3c5b88e37..9f92e959e4 100644 --- a/packages/webapp/src/assets/variables.scss +++ b/packages/webapp/src/assets/variables.scss @@ -4,6 +4,7 @@ // GLOBAL CSS VARIABLES --global-navbar-height: 64px; --global-map-header-height: 48px; + --global-min-location-picker-height: 150px; --global-side-menu-width: 188px; --global-compact-side-menu-width: 80px; // 249px = 24px form padding + 41px form title and progress + 24px margin + 24px call to action + 16 px margin + 24px margin + 24 px padding + 48px button + 24 px padding diff --git a/packages/webapp/src/components/LocationPicker/SingleLocationPicker/styles.module.scss b/packages/webapp/src/components/LocationPicker/SingleLocationPicker/styles.module.scss index 19db1b94f3..ac4c679006 100644 --- a/packages/webapp/src/components/LocationPicker/SingleLocationPicker/styles.module.scss +++ b/packages/webapp/src/components/LocationPicker/SingleLocationPicker/styles.module.scss @@ -3,4 +3,5 @@ margin-bottom: 16px; flex-grow: 1; display: flex; + min-height: var(--global-min-location-picker-height); } From 0790dfc266d11e665346c3a6c5323b9e4221824d Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Fri, 15 Nov 2024 13:55:20 -0500 Subject: [PATCH 10/91] LF-4483 Add basic desktop styles to animal inventory summary view, rename the animal inventory type to avoid name clash --- .../containers/Animals/Inventory/index.tsx | 46 ++++++++++++------- .../Animals/Inventory/styles.module.scss | 42 ++++++++++++++--- 2 files changed, 65 insertions(+), 23 deletions(-) diff --git a/packages/webapp/src/containers/Animals/Inventory/index.tsx b/packages/webapp/src/containers/Animals/Inventory/index.tsx index 54163adc71..a9f56e6688 100644 --- a/packages/webapp/src/containers/Animals/Inventory/index.tsx +++ b/packages/webapp/src/containers/Animals/Inventory/index.tsx @@ -22,7 +22,7 @@ import { History } from 'history'; import Cell from '../../../components/Table/Cell'; import { CellKind } from '../../../components/Table/types'; import useAnimalInventory from './useAnimalInventory'; -import type { AnimalInventory } from './useAnimalInventory'; +import type { AnimalInventory as AnimalInventoryType } from './useAnimalInventory'; import ActionMenu, { iconAction } from '../../../components/ActionMenu'; import FixedHeaderContainer, { ContainerKind, @@ -42,6 +42,7 @@ import { useAnimalsFilterReduxState } from './KPI/useAnimalsFilterReduxState'; import FloatingContainer from '../../../components/FloatingContainer'; import ExpandableItem from '../../../components/Expandable/ExpandableItem'; import useExpandable from '../../../components/Expandable/useExpandableItem'; +import Pill from '../../../components/Pill'; import clsx from 'clsx'; export enum View { @@ -58,7 +59,7 @@ interface AnimalInventoryProps { history: History; } -const getVisibleSelectedIds = (visibleRowData: AnimalInventory[], selectedIds: string[]) => { +const getVisibleSelectedIds = (visibleRowData: AnimalInventoryType[], selectedIds: string[]) => { if (!visibleRowData.length || !selectedIds.length) { return []; } @@ -114,7 +115,7 @@ function AnimalInventory({ { id: 'identification', label: t('ANIMAL.ANIMAL_IDENTIFICATION').toLocaleUpperCase(), - format: (d: AnimalInventory) => ( + format: (d: AnimalInventoryType) => ( , + format: (d: AnimalInventoryType) => , }, { id: isDesktop ? 'breed' : null, label: t('ANIMAL.ANIMAL_BREED').toLocaleUpperCase(), - format: (d: AnimalInventory) => , + format: (d: AnimalInventoryType) => , }, { id: isDesktop ? 'groups' : null, label: t('ANIMAL.ANIMAL_GROUPS').toLocaleUpperCase(), - format: (d: AnimalInventory) => ( + format: (d: AnimalInventoryType) => ( , + format: (d: AnimalInventoryType) => ( + + ), columnProps: { style: { width: '40px', padding: `0 ${isDesktop ? 12 : 8}px` }, }, @@ -160,7 +163,7 @@ function AnimalInventory({ [t, isDesktop], ); - const makeAnimalsSearchableString = (animal: AnimalInventory) => { + const makeAnimalsSearchableString = (animal: AnimalInventoryType) => { return [animal.identification, animal.type, animal.breed, ...animal.groups, animal.count] .filter(Boolean) .join(' '); @@ -169,7 +172,7 @@ function AnimalInventory({ const [searchAndFilteredInventory, searchString, setSearchString] = useSearchFilter( filteredInventory, makeAnimalsSearchableString, - ) as [AnimalInventory[], SearchProps['searchString'], SearchProps['setSearchString']]; + ) as [AnimalInventoryType[], SearchProps['searchString'], SearchProps['setSearchString']]; const searchProps: SearchProps = { searchString, @@ -180,7 +183,7 @@ function AnimalInventory({ }), }; - const onSelectInventory = (e: ChangeEvent, row: AnimalInventory): void => { + const onSelectInventory = (e: ChangeEvent, row: AnimalInventoryType): void => { const selectedInventoryId = row.id; let newIds = selectedInventoryIds.slice(); if (selectedInventoryIds.includes(selectedInventoryId)) { @@ -221,7 +224,7 @@ function AnimalInventory({ } }; - const onRowClick = (event: ChangeEvent, row: AnimalInventory) => { + const onRowClick = (event: ChangeEvent, row: AnimalInventoryType) => { switch (view) { case View.TASK: onSelectInventory(event, row); @@ -260,9 +263,15 @@ function AnimalInventory({ header={ !isTaskView ? : null } - classes={{ paper: styles.paper }} + classes={{ paper: isSummaryView ? styles.removePaper : styles.paper }} kind={ContainerKind.PAPER} - wrapperClassName={isTaskView ? styles.taskViewHeight : undefined} + wrapperClassName={ + isSummaryView + ? styles.summaryViewHeight + : isTaskView && !isSummaryView + ? styles.taskViewHeight + : undefined + } > toggleExpanded(1)} - mainContent={'See detail list of animals to move'} + mainContent={ + <> +
See detail list of animals to move
+ + + } expandedContent={
} iconClickOnly={false} - // classes = {}, + classes={{ mainContentWrapper: styles.mainContentWrapper, icon: styles.blueColor }} itemKey={1} - // leftCollapseIcon = false, + leftCollapseIcon /> ); diff --git a/packages/webapp/src/containers/Animals/Inventory/styles.module.scss b/packages/webapp/src/containers/Animals/Inventory/styles.module.scss index 463c6ca20e..89f10d07c2 100644 --- a/packages/webapp/src/containers/Animals/Inventory/styles.module.scss +++ b/packages/webapp/src/containers/Animals/Inventory/styles.module.scss @@ -29,16 +29,29 @@ } } +.removePaper { + border-radius: 0; + border: none; + margin: 0; +} + .taskViewHeight { - height: calc(100vh - var(--global-navbar-height) - var(--global-multi-step-task-layout-aggregated-height)); + max-height: calc(100vh - var(--global-navbar-height) - var(--global-multi-step-task-layout-aggregated-height)); +} + +.summaryViewHeight { + height: auto; + // 58 px is border 2px, expanded content padding 16px, 24px collapse content title, 16px margin between table and title + max-height: calc(100vh - var(--global-navbar-height) - var(--global-multi-step-task-layout-aggregated-height) - var(--global-min-location-picker-height) - 58px); } .section { - margin-top: 16px; - padding: 16px; + margin-top: 24px; + padding: 8px 16px; background: var(--White); - border-radius: 4px; - border: 1px solid var(--Colors-Neutral-Neutral-100); + border-radius: 8px; + border: 1px solid var(--Colors-Neutral-Neutral-50); + gap: 8px; } .expanded { @@ -58,6 +71,21 @@ background: var(--White); } -.taskViewHeight { - height: calc(100vh - var(--global-navbar-height) - var(--global-multi-step-task-layout-aggregated-height)); +.pill { + height: 24px; + padding: 8px 16px; + background: var(--Colors-Neutral-Neutral-50); + color: var(--Colors-Neutral-Neutral-600); +} + +.mainContentWrapper { + display: flex; + gap: 8px; +} + +.blueColor { + color: var(--Colors-Accent---singles-Blue-full); + svg { + color: var(--Colors-Accent---singles-Blue-full); + } } \ No newline at end of file From d887f770611b1d838752403135addb38ab754c05 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Fri, 15 Nov 2024 13:59:57 -0500 Subject: [PATCH 11/91] LF-4483 Fix maxHeight bug with resize observer, height:auto and MUI maxHeight not playing well --- packages/webapp/src/components/Animals/Inventory/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/webapp/src/components/Animals/Inventory/index.tsx b/packages/webapp/src/components/Animals/Inventory/index.tsx index a25fa60b14..96dbe048f1 100644 --- a/packages/webapp/src/components/Animals/Inventory/index.tsx +++ b/packages/webapp/src/components/Animals/Inventory/index.tsx @@ -93,7 +93,8 @@ const PureAnimalInventory = ({ const { searchString, setSearchString, placeHolderText, searchResultsText } = searchProps; const hasSearchResults = filteredInventory.length !== 0; - const tableMaxHeight = !isDesktop || !containerHeight ? undefined : containerHeight - usedHeight; + const tableMaxHeight = + !isDesktop || !containerHeight || isSummaryView ? undefined : containerHeight - usedHeight; const tableSpacerRowHeight = !isTaskView ? (isDesktop ? 96 : 120) : 0; From 70159708a57b3bec610932781aad6dac4619b6c8 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Fri, 15 Nov 2024 19:45:04 -0500 Subject: [PATCH 12/91] LF-4483 Remove table style changes on mobile in summary view --- packages/webapp/src/components/Animals/Inventory/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webapp/src/components/Animals/Inventory/index.tsx b/packages/webapp/src/components/Animals/Inventory/index.tsx index 96dbe048f1..22d28febe9 100644 --- a/packages/webapp/src/components/Animals/Inventory/index.tsx +++ b/packages/webapp/src/components/Animals/Inventory/index.tsx @@ -141,7 +141,7 @@ const PureAnimalInventory = ({ {!totalInventoryCount || hasSearchResults ? (
) : ( Date: Fri, 15 Nov 2024 19:46:28 -0500 Subject: [PATCH 13/91] LF-4483 Hide empty scrollbar when there is no overflow needed --- .../webapp/src/components/Animals/Inventory/styles.module.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webapp/src/components/Animals/Inventory/styles.module.scss b/packages/webapp/src/components/Animals/Inventory/styles.module.scss index 48c3432bb2..ee31fc2336 100644 --- a/packages/webapp/src/components/Animals/Inventory/styles.module.scss +++ b/packages/webapp/src/components/Animals/Inventory/styles.module.scss @@ -70,7 +70,7 @@ } .tableWrapper { - overflow-y: scroll; + overflow-y: auto; } .tableWrapperCommon { From ea943e0de1b4c5e6b0957e07fef23585f33def61 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Fri, 15 Nov 2024 20:03:47 -0500 Subject: [PATCH 14/91] LF-4483 Add pill to expandable item --- .../components/Expandable/ExpandableItem.jsx | 44 +++++++++++-------- .../components/Expandable/styles.module.scss | 13 ++++++ 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/packages/webapp/src/components/Expandable/ExpandableItem.jsx b/packages/webapp/src/components/Expandable/ExpandableItem.jsx index 14c06322ad..b2c8d5b16f 100644 --- a/packages/webapp/src/components/Expandable/ExpandableItem.jsx +++ b/packages/webapp/src/components/Expandable/ExpandableItem.jsx @@ -16,6 +16,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import clsx from 'clsx'; import { Collapse } from '@mui/material'; +import Pill from '../Pill'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; import styles from './styles.module.scss'; @@ -29,6 +30,7 @@ export default function ExpandableItem({ isExpanded, onClick, mainContent, + pillBody, expandedContent, iconClickOnly = true, classes = {}, @@ -52,31 +54,35 @@ export default function ExpandableItem({ return (
- {mainContent} -
-
- {icons[isExpanded ? 'up' : 'down']} +
+ {mainContent} +
+
+ {icons[isExpanded ? 'up' : 'down']} +
+ {pillBody && leftCollapseIcon && }
{expandedContent} @@ -89,10 +95,12 @@ ExpandableItem.propTypes = { isExpanded: PropTypes.bool, onClick: PropTypes.func, mainContent: PropTypes.node, + pillBody: PropTypes.string, expandedContent: PropTypes.node, iconClickOnly: PropTypes.bool, classes: PropTypes.shape({ container: PropTypes.string, + alwaysVisibleContent: PropTypes.string, expandedContainer: PropTypes.string, expandedMainContentWithIcon: PropTypes.string, mainContentWithIcon: PropTypes.string, diff --git a/packages/webapp/src/components/Expandable/styles.module.scss b/packages/webapp/src/components/Expandable/styles.module.scss index 5f2a60d85a..47ff0d6734 100644 --- a/packages/webapp/src/components/Expandable/styles.module.scss +++ b/packages/webapp/src/components/Expandable/styles.module.scss @@ -12,6 +12,7 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details, see . */ +@import '@assets/mixin.scss'; .mainContentWithIcon { display: flex; @@ -36,3 +37,15 @@ .mainContentWrapper.leftCollapse { order: 1; } + +.pill { + height: 24px; + padding: 8px 16px; + background: var(--Colors-Neutral-Neutral-50); + color: var(--Colors-Neutral-Neutral-600); + width: 100%; + justify-content: center; + @include lg-breakpoint { + width: unset; + } +} \ No newline at end of file From dc104cf7b536563eaec03aa9598047724976a141 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Fri, 15 Nov 2024 20:10:26 -0500 Subject: [PATCH 15/91] LF-4483 Allow full width content in task locations for animals mobile inventory --- .../src/components/Task/TaskLocations/index.jsx | 13 ++++++++++++- .../Task/TaskLocations/styles.module.scss | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/webapp/src/components/Task/TaskLocations/index.jsx b/packages/webapp/src/components/Task/TaskLocations/index.jsx index b0d1a8bc9c..15e15bfc10 100644 --- a/packages/webapp/src/components/Task/TaskLocations/index.jsx +++ b/packages/webapp/src/components/Task/TaskLocations/index.jsx @@ -10,6 +10,7 @@ import { useForm } from 'react-hook-form'; import { cloneObject } from '../../../util'; import Checkbox from '../../Form/Checkbox'; import { ExpandableAnimalInventory, View } from '../../../containers/Animals/Inventory'; +import styles from './styles.module.scss'; export default function PureTaskLocations({ locations, readOnlyPinCoordinates, @@ -118,6 +119,7 @@ export default function PureTaskLocations({ } + fullWidthContent={isAnimalTask} > {isAnimalTask && ( )} -
+
{title || t('TASK.SELECT_TASK_LOCATIONS')}
{showWildCropCheckBox && ( Date: Fri, 15 Nov 2024 20:12:30 -0500 Subject: [PATCH 16/91] LF-4483 Augment multi-step page title to accept classnames --- .../src/components/PageTitle/MultiStepPageTitle/index.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/webapp/src/components/PageTitle/MultiStepPageTitle/index.jsx b/packages/webapp/src/components/PageTitle/MultiStepPageTitle/index.jsx index 8538e985ba..99bfdea30e 100644 --- a/packages/webapp/src/components/PageTitle/MultiStepPageTitle/index.jsx +++ b/packages/webapp/src/components/PageTitle/MultiStepPageTitle/index.jsx @@ -16,11 +16,12 @@ function MultiStepPageTitle({ cancelModalTitle, showConfirmCancelModal, setShowConfirmCancelModal, + className, }) { const [localShowModal, setLocalShowModal] = useState(false); // original form flow return ( -
+
{onGoBack && ( @@ -54,4 +55,5 @@ MultiStepPageTitle.prototype = { cancelModalTitle: PropTypes.string, showConfirmCancelModal: PropTypes.bool, setShowConfirmCancelModal: PropTypes.func, + className: PropTypes.string, }; From 6108ded7f850067ee0cc81bd0bd8d04cf0194821 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Fri, 15 Nov 2024 20:13:51 -0500 Subject: [PATCH 17/91] LF-4483 Add mobile and desktop styles using new expanable item including pill --- .../containers/Animals/Inventory/index.tsx | 17 +++++----- .../Animals/Inventory/styles.module.scss | 34 ++++++++++++++++--- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/packages/webapp/src/containers/Animals/Inventory/index.tsx b/packages/webapp/src/containers/Animals/Inventory/index.tsx index a9f56e6688..6ba8615028 100644 --- a/packages/webapp/src/containers/Animals/Inventory/index.tsx +++ b/packages/webapp/src/containers/Animals/Inventory/index.tsx @@ -314,24 +314,25 @@ export function ExpandableAnimalInventory(props: AnimalInventoryProps) { const { expandedIds, toggleExpanded } = useExpandable({ isSingleExpandable: true }); const isExpanded = expandedIds.includes(1); return ( -
+
{/* @ts-ignore */} toggleExpanded(1)} - mainContent={ - <> -
See detail list of animals to move
- - - } + mainContent={
See detail list of animals to move
} + pillBody={'5 animals'} expandedContent={
} iconClickOnly={false} - classes={{ mainContentWrapper: styles.mainContentWrapper, icon: styles.blueColor }} + classes={{ + mainContentWrapper: styles.mainContentWrapper, + mainContentWithIcon: styles.mainContentWithIcon, + icon: styles.blueColor, + alwaysVisibleContent: styles.alwaysVisibleContent, + }} itemKey={1} leftCollapseIcon /> diff --git a/packages/webapp/src/containers/Animals/Inventory/styles.module.scss b/packages/webapp/src/containers/Animals/Inventory/styles.module.scss index 89f10d07c2..b9201b3f5f 100644 --- a/packages/webapp/src/containers/Animals/Inventory/styles.module.scss +++ b/packages/webapp/src/containers/Animals/Inventory/styles.module.scss @@ -47,16 +47,25 @@ .section { margin-top: 24px; - padding: 8px 16px; + padding: 8px 0; background: var(--White); border-radius: 8px; border: 1px solid var(--Colors-Neutral-Neutral-50); gap: 8px; + + @include lg-breakpoint { + margin: 24px 24px 0 24px; + padding: 8px 16px; + } } -.expanded { - border: 1px solid var(--Form-focus); - box-shadow: 0px 0px 4px 0px var(--Colors-Neutral-Neutral-200); +.alwaysVisibleContent { + padding: 0 16px; + @include lg-breakpoint { + align-items: center; + gap: 8px; + display: flex; + } } .expandedContentWrapper { @@ -76,11 +85,26 @@ padding: 8px 16px; background: var(--Colors-Neutral-Neutral-50); color: var(--Colors-Neutral-Neutral-600); + width: 100%; + justify-content: center; + @include lg-breakpoint { + width: unset; + justify-content: unset; + } } .mainContentWrapper { - display: flex; + width: auto !important; + gap: 8px; + @include lg-breakpoint { + display: flex; + } +} + +.mainContentWithIcon { + text-align: center; gap: 8px; + justify-content: center; } .blueColor { From 41659c819259e6ae4f6c3cc6d0ca978aa87289e7 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Fri, 15 Nov 2024 20:15:44 -0500 Subject: [PATCH 18/91] LF-4483 Remove unused styles --- .../containers/Animals/Inventory/styles.module.scss | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/webapp/src/containers/Animals/Inventory/styles.module.scss b/packages/webapp/src/containers/Animals/Inventory/styles.module.scss index b9201b3f5f..667f018506 100644 --- a/packages/webapp/src/containers/Animals/Inventory/styles.module.scss +++ b/packages/webapp/src/containers/Animals/Inventory/styles.module.scss @@ -80,19 +80,6 @@ background: var(--White); } -.pill { - height: 24px; - padding: 8px 16px; - background: var(--Colors-Neutral-Neutral-50); - color: var(--Colors-Neutral-Neutral-600); - width: 100%; - justify-content: center; - @include lg-breakpoint { - width: unset; - justify-content: unset; - } -} - .mainContentWrapper { width: auto !important; gap: 8px; From e20bc19c17684df3dc555137878895ac67b19e16 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Mon, 18 Nov 2024 14:05:37 -0500 Subject: [PATCH 19/91] LF-4483 Remove unnecessary logic, unecessary import, fix useMemo dependency --- .../webapp/src/components/Task/TaskAnimalInventory/index.jsx | 2 +- packages/webapp/src/components/Task/TaskLocations/index.jsx | 2 +- packages/webapp/src/containers/Animals/Inventory/index.tsx | 1 - .../src/containers/Animals/Inventory/useFilteredInventory.ts | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/webapp/src/components/Task/TaskAnimalInventory/index.jsx b/packages/webapp/src/components/Task/TaskAnimalInventory/index.jsx index be1df15256..7cb48a4f5c 100644 --- a/packages/webapp/src/components/Task/TaskAnimalInventory/index.jsx +++ b/packages/webapp/src/components/Task/TaskAnimalInventory/index.jsx @@ -107,7 +107,7 @@ export default function PureTaskAnimalInventory({ onSelect={onSelect} view={View.TASK} history={history} - preSelectedIds={persistedFormData?.animalIds ?? []} + preSelectedIds={persistedFormData?.animalIds} />
diff --git a/packages/webapp/src/components/Task/TaskLocations/index.jsx b/packages/webapp/src/components/Task/TaskLocations/index.jsx index 15e15bfc10..4c9294acec 100644 --- a/packages/webapp/src/components/Task/TaskLocations/index.jsx +++ b/packages/webapp/src/components/Task/TaskLocations/index.jsx @@ -132,7 +132,7 @@ export default function PureTaskLocations({ {isAnimalTask && ( )}
{ return selectedInventoryIds.includes(entity.id); }); - }, [selectedInventoryIds]); + }, [inventory, selectedInventoryIds]); } const { From 20c1bc5b551fd166251e9490f8a08d5c8743cb5e Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Mon, 18 Nov 2024 18:28:24 -0500 Subject: [PATCH 20/91] LF-4483 Allow y overflow when animals inventory summary is expanded --- packages/webapp/src/assets/variables.scss | 1 - .../SingleLocationPicker/styles.module.scss | 3 ++- .../src/containers/Animals/Inventory/index.tsx | 16 +++++++--------- .../Animals/Inventory/styles.module.scss | 12 ++++++++---- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/packages/webapp/src/assets/variables.scss b/packages/webapp/src/assets/variables.scss index 9f92e959e4..f3c5b88e37 100644 --- a/packages/webapp/src/assets/variables.scss +++ b/packages/webapp/src/assets/variables.scss @@ -4,7 +4,6 @@ // GLOBAL CSS VARIABLES --global-navbar-height: 64px; --global-map-header-height: 48px; - --global-min-location-picker-height: 150px; --global-side-menu-width: 188px; --global-compact-side-menu-width: 80px; // 249px = 24px form padding + 41px form title and progress + 24px margin + 24px call to action + 16 px margin + 24px margin + 24 px padding + 48px button + 24 px padding diff --git a/packages/webapp/src/components/LocationPicker/SingleLocationPicker/styles.module.scss b/packages/webapp/src/components/LocationPicker/SingleLocationPicker/styles.module.scss index ac4c679006..72aacdd93d 100644 --- a/packages/webapp/src/components/LocationPicker/SingleLocationPicker/styles.module.scss +++ b/packages/webapp/src/components/LocationPicker/SingleLocationPicker/styles.module.scss @@ -3,5 +3,6 @@ margin-bottom: 16px; flex-grow: 1; display: flex; - min-height: var(--global-min-location-picker-height); + // Based on animals summary view: 98px = 24px margin top, 2px border, 16 px padding, 24px mobile max-height pill and 24px expandable item text, 8px margin-bottom + min-height: calc(100vh - var(--global-navbar-height) - var(--global-multi-step-task-layout-aggregated-height) - 98px); } diff --git a/packages/webapp/src/containers/Animals/Inventory/index.tsx b/packages/webapp/src/containers/Animals/Inventory/index.tsx index 5583bb4e70..4351f22d09 100644 --- a/packages/webapp/src/containers/Animals/Inventory/index.tsx +++ b/packages/webapp/src/containers/Animals/Inventory/index.tsx @@ -74,8 +74,9 @@ function AnimalInventory({ isCompactSideMenu, history, }: AnimalInventoryProps) { - const isTaskView = [View.TASK, View.TASK_SUMMARY].includes(view); + const isTaskInventoryView = view === View.TASK; const isSummaryView = view === View.TASK_SUMMARY; + const isTaskView = isTaskInventoryView || isSummaryView; const [selectedInventoryIds, setSelectedInventoryIds] = useState(preSelectedIds); @@ -262,15 +263,12 @@ function AnimalInventory({ header={ !isTaskView ? : null } - classes={{ paper: isSummaryView ? styles.removePaper : styles.paper }} + classes={{ paper: isSummaryView ? styles.hidePaperBorder : styles.paper }} kind={ContainerKind.PAPER} - wrapperClassName={ - isSummaryView - ? styles.summaryViewHeight - : isTaskView && !isSummaryView - ? styles.taskViewHeight - : undefined - } + wrapperClassName={clsx( + isTaskInventoryView && styles.taskViewMaxHeight, + isSummaryView && styles.summaryViewHeight, + )} > Date: Mon, 18 Nov 2024 19:44:33 -0500 Subject: [PATCH 21/91] LF-4483 Add translation string and count --- .../webapp/public/locales/de/translation.json | 1 + .../webapp/public/locales/en/translation.json | 1 + .../webapp/public/locales/es/translation.json | 1 + .../webapp/public/locales/fr/translation.json | 1 + .../webapp/public/locales/hi/translation.json | 1 + .../webapp/public/locales/ml/translation.json | 1 + .../webapp/public/locales/pa/translation.json | 1 + .../webapp/public/locales/pt/translation.json | 1 + .../containers/Animals/Inventory/index.tsx | 21 +++++++++++++++---- 9 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/webapp/public/locales/de/translation.json b/packages/webapp/public/locales/de/translation.json index 768e54bda2..74107f3cd0 100644 --- a/packages/webapp/public/locales/de/translation.json +++ b/packages/webapp/public/locales/de/translation.json @@ -1800,6 +1800,7 @@ "ADD_TASK_FLOW": "Aufgabenerstellung", "AMOUNT_TO_ALLOCATE": "Zuzuweisender Betrag", "ANIMAL_MOVING_TO_LOCATION": "MISSING", + "ANIMAL_MOVEMENT_EXPANDING_SUMMARY_TITLE": "MISSING", "CARD": { "MULTIPLE_CROPS": "Mehrere Kulturpflanzen", "MULTIPLE_LOCATIONS": "Mehrere Standorte" diff --git a/packages/webapp/public/locales/en/translation.json b/packages/webapp/public/locales/en/translation.json index 5459a72a5a..ee8bc93094 100644 --- a/packages/webapp/public/locales/en/translation.json +++ b/packages/webapp/public/locales/en/translation.json @@ -1941,6 +1941,7 @@ "ADD_TASK_FLOW": "task creation", "AMOUNT_TO_ALLOCATE": "Amount to allocate", "ANIMAL_MOVING_TO_LOCATION": "Moving to:", + "ANIMAL_MOVEMENT_EXPANDING_SUMMARY_TITLE": "See detail list of animals to move", "CARD": { "MULTIPLE_CROPS": "Multiple crops", "MULTIPLE_LOCATIONS": "Multiple locations" diff --git a/packages/webapp/public/locales/es/translation.json b/packages/webapp/public/locales/es/translation.json index bc545b213f..d6e156db3e 100644 --- a/packages/webapp/public/locales/es/translation.json +++ b/packages/webapp/public/locales/es/translation.json @@ -1948,6 +1948,7 @@ "ADD_TASK_FLOW": "creación de tareas", "AMOUNT_TO_ALLOCATE": "Cantidad a asignar", "ANIMAL_MOVING_TO_LOCATION": "MISSING", + "ANIMAL_MOVEMENT_EXPANDING_SUMMARY_TITLE": "MISSING", "CARD": { "MULTIPLE_CROPS": "Múltiples cultivos", "MULTIPLE_LOCATIONS": "Múltiples ubicaciones" diff --git a/packages/webapp/public/locales/fr/translation.json b/packages/webapp/public/locales/fr/translation.json index a131997c67..14d7335952 100644 --- a/packages/webapp/public/locales/fr/translation.json +++ b/packages/webapp/public/locales/fr/translation.json @@ -1947,6 +1947,7 @@ "ADD_TASK_FLOW": "création de tâche", "AMOUNT_TO_ALLOCATE": "Montant à allouer", "ANIMAL_MOVING_TO_LOCATION": "MISSING", + "ANIMAL_MOVEMENT_EXPANDING_SUMMARY_TITLE": "MISSING", "CARD": { "MULTIPLE_CROPS": "Plusieurs cultures", "MULTIPLE_LOCATIONS": "Plusieurs emplacements" diff --git a/packages/webapp/public/locales/hi/translation.json b/packages/webapp/public/locales/hi/translation.json index 4dadf73558..e177a1b5ce 100644 --- a/packages/webapp/public/locales/hi/translation.json +++ b/packages/webapp/public/locales/hi/translation.json @@ -1797,6 +1797,7 @@ "ADD_TASK_FLOW": "कार्य निर्माण", "AMOUNT_TO_ALLOCATE": "आवंटित राशि", "ANIMAL_MOVING_TO_LOCATION": "MISSING", + "ANIMAL_MOVEMENT_EXPANDING_SUMMARY_TITLE": "MISSING", "CARD": { "MULTIPLE_CROPS": "कई फसलें", "MULTIPLE_LOCATIONS": "कई स्थान" diff --git a/packages/webapp/public/locales/ml/translation.json b/packages/webapp/public/locales/ml/translation.json index 11557eee15..43e1bd0795 100644 --- a/packages/webapp/public/locales/ml/translation.json +++ b/packages/webapp/public/locales/ml/translation.json @@ -1797,6 +1797,7 @@ "ADD_TASK_FLOW": "ചുമതല സൃഷ്ടിക്കൽ", "AMOUNT_TO_ALLOCATE": "അനുവദിക്കേണ്ട തുക", "ANIMAL_MOVING_TO_LOCATION": "MISSING", + "ANIMAL_MOVEMENT_EXPANDING_SUMMARY_TITLE": "MISSING", "CARD": { "MULTIPLE_CROPS": "ഒന്നിലധികം വിളകൾ", "MULTIPLE_LOCATIONS": "ഒന്നിലധികം സ്ഥാനങ്ങൾ" diff --git a/packages/webapp/public/locales/pa/translation.json b/packages/webapp/public/locales/pa/translation.json index 955f327961..cd23df0495 100644 --- a/packages/webapp/public/locales/pa/translation.json +++ b/packages/webapp/public/locales/pa/translation.json @@ -1797,6 +1797,7 @@ "ADD_TASK_FLOW": "ਕਾਰਜ ਰਚਨਾ", "AMOUNT_TO_ALLOCATE": "ਅਲਾਟ ਕਰਨ ਲਈ ਰਕਮ", "ANIMAL_MOVING_TO_LOCATION": "MISSING", + "ANIMAL_MOVEMENT_EXPANDING_SUMMARY_TITLE": "MISSING", "CARD": { "MULTIPLE_CROPS": "ਕਈ ਫਸਲਾਂ", "MULTIPLE_LOCATIONS": "ਕਈ ਸਥਾਨਾਂ" diff --git a/packages/webapp/public/locales/pt/translation.json b/packages/webapp/public/locales/pt/translation.json index 345971e00c..77c328b192 100644 --- a/packages/webapp/public/locales/pt/translation.json +++ b/packages/webapp/public/locales/pt/translation.json @@ -1947,6 +1947,7 @@ "ADD_TASK_FLOW": "criação de tarefa", "AMOUNT_TO_ALLOCATE": "Quantidade a ser alocada", "ANIMAL_MOVING_TO_LOCATION": "MISSING", + "ANIMAL_MOVEMENT_EXPANDING_SUMMARY_TITLE": "MISSING", "CARD": { "MULTIPLE_CROPS": "Múltiplos cultivos", "MULTIPLE_LOCATIONS": "Múltiplos locais" diff --git a/packages/webapp/src/containers/Animals/Inventory/index.tsx b/packages/webapp/src/containers/Animals/Inventory/index.tsx index 4351f22d09..dd1822a86f 100644 --- a/packages/webapp/src/containers/Animals/Inventory/index.tsx +++ b/packages/webapp/src/containers/Animals/Inventory/index.tsx @@ -58,6 +58,10 @@ interface AnimalInventoryProps { history: History; } +interface ExpandableAnimalInventoryProps extends AnimalInventoryProps { + preSelectedIds: string[]; +} + const getVisibleSelectedIds = (visibleRowData: AnimalInventoryType[], selectedIds: string[]) => { if (!visibleRowData.length || !selectedIds.length) { return []; @@ -307,17 +311,26 @@ function AnimalInventory({ ); } -export function ExpandableAnimalInventory(props: AnimalInventoryProps) { +export function ExpandableAnimalInventory(props: ExpandableAnimalInventoryProps) { + const { t } = useTranslation(); + const { inventory } = useAnimalInventory(); + const animalCount = props.preSelectedIds.reduce((acc, cur) => { + return acc + (inventory.find((animalOrBatch) => animalOrBatch.id === cur)?.count || 0); + }, 0); + const { expandedIds, toggleExpanded } = useExpandable({ isSingleExpandable: true }); const isExpanded = expandedIds.includes(1); return (
- {/* @ts-ignore */} toggleExpanded(1)} - mainContent={
See detail list of animals to move
} - pillBody={'5 animals'} + mainContent={ +
+ {t('TASK.ANIMAL_MOVEMENT_EXPANDING_SUMMARY_TITLE')} +
+ } + pillBody={t('ANIMAL.ANIMAL_COUNT', { count: animalCount })} expandedContent={
From 75a2801c09010bf505cd959ae3626576672f174a Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Tue, 19 Nov 2024 10:18:26 -0500 Subject: [PATCH 22/91] LF-4483 Use classes in fixedHeaderContainer --- .../src/components/Animals/FixedHeaderContainer/index.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/webapp/src/components/Animals/FixedHeaderContainer/index.tsx b/packages/webapp/src/components/Animals/FixedHeaderContainer/index.tsx index 135a7a94cc..b267c398ac 100644 --- a/packages/webapp/src/components/Animals/FixedHeaderContainer/index.tsx +++ b/packages/webapp/src/components/Animals/FixedHeaderContainer/index.tsx @@ -45,8 +45,8 @@ type FixedHeaderContainerProps = { classes?: { paper?: string; divWrapper?: string; + wrapper?: string; }; - wrapperClassName?: string; }; type WrapperProps = Pick & { @@ -77,7 +77,6 @@ const FixedHeaderContainer = ({ children, classes = {}, kind = ContainerKind.OVERFLOW, - wrapperClassName, }: FixedHeaderContainerProps) => { const [paperHeightInPx, setPaperHeightInPx] = useState(null); const paperRef = useRef(null); @@ -123,7 +122,7 @@ const FixedHeaderContainer = ({ const Wrapper = kind === ContainerKind.OVERFLOW ? DivWrapper : PaperWrapper; return ( -
+
{header} {childrenWithProps} From 0005afe27e4a0557ec325f886126a4abe039315d Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Tue, 19 Nov 2024 10:21:46 -0500 Subject: [PATCH 23/91] LF-4483 Undo hide empty scrollbar - maybe this is important for mobile link clicking --- .../webapp/src/components/Animals/Inventory/styles.module.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webapp/src/components/Animals/Inventory/styles.module.scss b/packages/webapp/src/components/Animals/Inventory/styles.module.scss index ee31fc2336..48c3432bb2 100644 --- a/packages/webapp/src/components/Animals/Inventory/styles.module.scss +++ b/packages/webapp/src/components/Animals/Inventory/styles.module.scss @@ -70,7 +70,7 @@ } .tableWrapper { - overflow-y: auto; + overflow-y: scroll; } .tableWrapperCommon { From a5b2fced03c668fe108857290da6de94a884910c Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Tue, 19 Nov 2024 10:22:16 -0500 Subject: [PATCH 24/91] LF-4483 Instead of complex logic use view based config --- .../components/Animals/Inventory/index.tsx | 68 +++++++++++++++---- .../containers/Animals/Inventory/index.tsx | 65 +++++++++++++----- .../Animals/Inventory/styles.module.scss | 7 +- .../Animals/Inventory/useFilteredInventory.ts | 4 +- 4 files changed, 108 insertions(+), 36 deletions(-) diff --git a/packages/webapp/src/components/Animals/Inventory/index.tsx b/packages/webapp/src/components/Animals/Inventory/index.tsx index 22d28febe9..a118e75d4b 100644 --- a/packages/webapp/src/components/Animals/Inventory/index.tsx +++ b/packages/webapp/src/components/Animals/Inventory/index.tsx @@ -83,8 +83,55 @@ const PureAnimalInventory = ({ view?: View; }) => { const { t } = useTranslation(); - const isTaskView = [View.TASK, View.TASK_SUMMARY].includes(view); - const isSummaryView = view === View.TASK_SUMMARY; + + const viewConfig = () => { + switch (view) { + case View.TASK: + return { + tableMaxHeight: !isDesktop || !containerHeight ? undefined : containerHeight - usedHeight, + tableSpacerRowHeight: 0, + showInventorySelection: isAdmin, + showSearchBarAndFilter: true, + alternatingRowColor: true, + showTableHeader: isDesktop, + listView: false, + showActionFloaterButton: false, + }; + case View.TASK_SUMMARY: + return { + tableMaxHeight: undefined, + tableSpacerRowHeight: 0, + showInventorySelection: false, + showSearchBarAndFilter: false, + alternatingRowColor: isDesktop ? false : true, + showTableHeader: false, + listView: isDesktop, + showActionFloaterButton: false, + }; + default: + return { + tableMaxHeight: !isDesktop || !containerHeight ? undefined : containerHeight - usedHeight, + tableSpacerRowHeight: isDesktop ? 96 : 120, + showInventorySelection: isAdmin, + showSearchBarAndFilter: true, + alternatingRowColor: true, + showTableHeader: isDesktop, + listView: false, + showActionFloaterButton: isAdmin, + }; + } + }; + + const { + tableMaxHeight, + tableSpacerRowHeight, + showInventorySelection, + showSearchBarAndFilter, + alternatingRowColor, + showTableHeader, + listView, + showActionFloaterButton, + } = viewConfig(); if (isLoading) { return null; @@ -93,16 +140,9 @@ const PureAnimalInventory = ({ const { searchString, setSearchString, placeHolderText, searchResultsText } = searchProps; const hasSearchResults = filteredInventory.length !== 0; - const tableMaxHeight = - !isDesktop || !containerHeight || isSummaryView ? undefined : containerHeight - usedHeight; - - const tableSpacerRowHeight = !isTaskView ? (isDesktop ? 96 : 120) : 0; - - const showInventorySelection = isAdmin && !isSummaryView; - return ( <> - {!isSummaryView && ( + {showSearchBarAndFilter && (
) : ( )}
- {isAdmin && !isTaskView && ( + {showActionFloaterButton && ( (preSelectedIds); const { selectedTypeIds, updateSelectedTypeIds } = useAnimalsFilterReduxState(); @@ -96,7 +92,50 @@ function AnimalInventory({ const { inventory, isLoading } = useAnimalInventory(); - const filteredInventory = useFilteredInventory(inventory, isSummaryView, selectedInventoryIds); + const viewConfig = () => { + switch (view) { + case View.TASK: + return { + showOnlySelected: false, + showDetailLink: false, + showPaperBorder: true, + headerContainerKind: ContainerKind.PAPER, + wrapperClass: styles.taskViewMaxHeight, + showActionMenu: false, + showKPI: false, + }; + case View.TASK_SUMMARY: + return { + showOnlySelected: true, + showDetailLink: false, + headerContainerKind: ContainerKind.OVERFLOW, + wrapperClass: styles.summaryViewHeight, + showActionMenu: false, + showKPI: false, + }; + default: + return { + showOnlySelected: false, + showDetailLink: true, + showPaperBorder: true, + headerContainerKind: ContainerKind.PAPER, + wrapperClass: undefined, + showActionMenu: isAdmin && selectedInventoryIds.length, + showKPI: true, + }; + } + }; + + const { + showOnlySelected, + showDetailLink, + headerContainerKind, + wrapperClass, + showActionMenu, + showKPI, + } = viewConfig(); + + const filteredInventory = useFilteredInventory(inventory, showOnlySelected, selectedInventoryIds); const isFilterActive = useSelector(isFilterCurrentlyActiveSelector('animals')); const dispatch = useDispatch(); @@ -153,7 +192,7 @@ function AnimalInventory({ sortable: false, }, { - id: !isTaskView ? 'path' : null, + id: showDetailLink ? 'path' : null, label: '', format: (d: AnimalInventoryType) => ( @@ -264,15 +303,9 @@ function AnimalInventory({ return ( : null - } - classes={{ paper: isSummaryView ? styles.hidePaperBorder : styles.paper }} - kind={ContainerKind.PAPER} - wrapperClassName={clsx( - isTaskInventoryView && styles.taskViewMaxHeight, - isSummaryView && styles.summaryViewHeight, - )} + header={showKPI ? : null} + classes={{ paper: styles.paper, divWrapper: styles.divWrapper, wrapper: wrapperClass }} + kind={headerContainerKind} > - {isAdmin && selectedInventoryIds.length && !isTaskView ? ( + {showActionMenu ? ( { - if (isSummaryView) { + if (showOnlySelected) { return useMemo(() => { return inventory.filter((entity) => { return selectedInventoryIds.includes(entity.id); From bd2f15ca9d9e3a96edc59a14c7f42c14284c963a Mon Sep 17 00:00:00 2001 From: Joyce Yuki <82857964+kathyavini@users.noreply.github.com> Date: Tue, 19 Nov 2024 09:03:51 -0800 Subject: [PATCH 25/91] LF-4372 Remove help request route --- packages/webapp/src/routes/index.jsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/webapp/src/routes/index.jsx b/packages/webapp/src/routes/index.jsx index cccc4060d8..ac94858e12 100644 --- a/packages/webapp/src/routes/index.jsx +++ b/packages/webapp/src/routes/index.jsx @@ -31,7 +31,6 @@ import { useReduxSnackbar } from '../containers/Snackbar/useReduxSnackbar'; //dynamic imports const Home = React.lazy(() => import('../containers/Home')); -const HelpRequest = React.lazy(() => import('../containers/Help')); const Account = React.lazy(() => import('../containers/Profile/Account')); const Farm = React.lazy(() => import('../containers/Profile/Farm/Farm')); const People = React.lazy(() => import('../containers/Profile/People/People')); @@ -560,7 +559,6 @@ const Routes = ({ isCompactSideMenu }) => { - @@ -642,7 +640,6 @@ const Routes = ({ isCompactSideMenu }) => { - @@ -977,7 +974,6 @@ const Routes = ({ isCompactSideMenu }) => { - From b810fb99ecd433c5c93ca83a350e86291864f119 Mon Sep 17 00:00:00 2001 From: Joyce Yuki <82857964+kathyavini@users.noreply.github.com> Date: Tue, 19 Nov 2024 09:04:45 -0800 Subject: [PATCH 26/91] LF-4372 Remove Help item from TopMenu --- packages/webapp/src/assets/images/navbar/help.svg | 5 ----- .../webapp/src/components/Navigation/TopMenu/TopMenu.jsx | 8 -------- 2 files changed, 13 deletions(-) delete mode 100644 packages/webapp/src/assets/images/navbar/help.svg diff --git a/packages/webapp/src/assets/images/navbar/help.svg b/packages/webapp/src/assets/images/navbar/help.svg deleted file mode 100644 index 76b5db0498..0000000000 --- a/packages/webapp/src/assets/images/navbar/help.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packages/webapp/src/components/Navigation/TopMenu/TopMenu.jsx b/packages/webapp/src/components/Navigation/TopMenu/TopMenu.jsx index 87620abcfd..f57e1c5a0c 100644 --- a/packages/webapp/src/components/Navigation/TopMenu/TopMenu.jsx +++ b/packages/webapp/src/components/Navigation/TopMenu/TopMenu.jsx @@ -3,7 +3,6 @@ import { logout } from '../../../util/jwt'; import { getLanguageFromLocalStorage } from '../../../util/getLanguageFromLocalStorage'; import { ReactComponent as LogoutIcon } from '../../../assets/images/navbar/logout.svg'; import { ReactComponent as MyInfoIcon } from '../../../assets/images/navbar/my-info.svg'; -import { ReactComponent as HelpIcon } from '../../../assets/images/navbar/help.svg'; import { ReactComponent as VideoIcon } from '../../../assets/images/navbar/play-square.svg'; import { ReactComponent as SwitchFarmIcon } from '../../../assets/images/navbar/switch-farm.svg'; import { ReactComponent as LaunchIcon } from '../../../assets/images/icon_launch.svg'; @@ -103,13 +102,6 @@ const TopMenu = ({ history, isMobile, showNavActions, onClickBurger, showNav }) label: t('PROFILE_FLOATER.SWITCH'), externalLink: false, }, - { - id: 'help', - onClick: () => handleClick('/help'), - icon: , - label: t('PROFILE_FLOATER.HELP'), - externalLink: false, - }, { id: 'tutorials', onClick: openTutorialsClick, From d992d32120de47de911a61390a40a6fec818ca23 Mon Sep 17 00:00:00 2001 From: Joyce Yuki <82857964+kathyavini@users.noreply.github.com> Date: Tue, 19 Nov 2024 09:20:31 -0800 Subject: [PATCH 27/91] LF-4372 Remove inner form title 'Request help' --- packages/webapp/public/locales/de/translation.json | 1 - packages/webapp/public/locales/en/translation.json | 1 - packages/webapp/public/locales/es/translation.json | 1 - packages/webapp/public/locales/fr/translation.json | 1 - packages/webapp/public/locales/hi/translation.json | 1 - packages/webapp/public/locales/ml/translation.json | 1 - packages/webapp/public/locales/pa/translation.json | 1 - packages/webapp/public/locales/pt/translation.json | 1 - packages/webapp/src/components/Help/index.jsx | 5 ++--- 9 files changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/webapp/public/locales/de/translation.json b/packages/webapp/public/locales/de/translation.json index 17829a62f4..e51ee59d5f 100644 --- a/packages/webapp/public/locales/de/translation.json +++ b/packages/webapp/public/locales/de/translation.json @@ -943,7 +943,6 @@ }, "PREFERRED_CONTACT": "Bevorzugte Kontaktmethode", "REQUIRED_LABEL": "Erforderliches Feld", - "TITLE": "Anfrage einreichen", "TYPE_SUPPORT_LABEL": "Art der Anfrage", "TYPE_SUPPORT_PLACEHOLDER": "Wählen Sie die Art der Unterstützung", "WHATSAPP": "Whatsapp", diff --git a/packages/webapp/public/locales/en/translation.json b/packages/webapp/public/locales/en/translation.json index 91f126efcc..3a3a475da7 100644 --- a/packages/webapp/public/locales/en/translation.json +++ b/packages/webapp/public/locales/en/translation.json @@ -1054,7 +1054,6 @@ }, "PREFERRED_CONTACT": "Preferred contact method", "REQUIRED_LABEL": "Required Field", - "TITLE": "Request Help", "TYPE_SUPPORT_LABEL": "Type of support", "TYPE_SUPPORT_PLACEHOLDER": "Choose type of support", "WHATSAPP": "Whatsapp", diff --git a/packages/webapp/public/locales/es/translation.json b/packages/webapp/public/locales/es/translation.json index 97c11a6b55..d75c4d3fdb 100644 --- a/packages/webapp/public/locales/es/translation.json +++ b/packages/webapp/public/locales/es/translation.json @@ -1061,7 +1061,6 @@ }, "PREFERRED_CONTACT": "Método de contacto preferido", "REQUIRED_LABEL": "Campo solicitado", - "TITLE": "Solicitar ayuda", "TYPE_SUPPORT_LABEL": "Tipo de ayuda", "TYPE_SUPPORT_PLACEHOLDER": "Elija tipo de ayuda", "WHATSAPP": "Whatsapp", diff --git a/packages/webapp/public/locales/fr/translation.json b/packages/webapp/public/locales/fr/translation.json index 85f8a82c41..74db3c90df 100644 --- a/packages/webapp/public/locales/fr/translation.json +++ b/packages/webapp/public/locales/fr/translation.json @@ -1060,7 +1060,6 @@ }, "PREFERRED_CONTACT": "Méthode de contact préférée", "REQUIRED_LABEL": "Champ obligatoire", - "TITLE": "Demander de l'aide", "TYPE_SUPPORT_LABEL": "Type de support", "TYPE_SUPPORT_PLACEHOLDER": "Choisissez le type de support", "WHATSAPP": "Whatsapp", diff --git a/packages/webapp/public/locales/hi/translation.json b/packages/webapp/public/locales/hi/translation.json index 8c33a7c357..ae34a770f5 100644 --- a/packages/webapp/public/locales/hi/translation.json +++ b/packages/webapp/public/locales/hi/translation.json @@ -940,7 +940,6 @@ }, "PREFERRED_CONTACT": "पसंदीदा संपर्क विधि", "REQUIRED_LABEL": "आवश्यक फील्ड", - "TITLE": "सहायता का अनुरोध", "TYPE_SUPPORT_LABEL": "समर्थन का प्रकार", "TYPE_SUPPORT_PLACEHOLDER": "समर्थन का प्रकार चुनें", "WHATSAPP": "व्हाट्सएप", diff --git a/packages/webapp/public/locales/ml/translation.json b/packages/webapp/public/locales/ml/translation.json index f79f8f4e51..4a3cf3457b 100644 --- a/packages/webapp/public/locales/ml/translation.json +++ b/packages/webapp/public/locales/ml/translation.json @@ -940,7 +940,6 @@ }, "PREFERRED_CONTACT": "കോൺടാക്ട് ചെയ്യാനുള്ള രീതി തിരഞ്ഞെടുക്കുക", "REQUIRED_LABEL": "ആവശ്യമായ ഫീൽഡ്", - "TITLE": "സഹായം അഭ്യർത്ഥിക്കുക", "TYPE_SUPPORT_LABEL": "എന്തുതരം സഹായമാണ് വേണ്ടത്", "TYPE_SUPPORT_PLACEHOLDER": "എന്തുതരം സഹായമാണ് വേണ്ടതെന്ന് തിരഞ്ഞെടുക്കുക", "WHATSAPP": "വാട്സ്ആപ്പ്", diff --git a/packages/webapp/public/locales/pa/translation.json b/packages/webapp/public/locales/pa/translation.json index 3b8a516a6b..80697e907a 100644 --- a/packages/webapp/public/locales/pa/translation.json +++ b/packages/webapp/public/locales/pa/translation.json @@ -940,7 +940,6 @@ }, "PREFERRED_CONTACT": "ਪਸੰਦੀਦਾ ਸੰਪਰਕ ਵਿਧੀ", "REQUIRED_LABEL": "ਲੋੜੀਂਦਾ ਖੇਤਰ", - "TITLE": "ਮਦਦ ਲਈ ਬੇਨਤੀ ਕਰੋ", "TYPE_SUPPORT_LABEL": "ਸਹਾਇਤਾ ਦੀ ਕਿਸਮ", "TYPE_SUPPORT_PLACEHOLDER": "ਸਹਾਇਤਾ ਦੀ ਕਿਸਮ ਚੁਣੋ", "WHATSAPP": "ਵਟਸਐਪ", diff --git a/packages/webapp/public/locales/pt/translation.json b/packages/webapp/public/locales/pt/translation.json index 31c21fac66..8d1774e8c4 100644 --- a/packages/webapp/public/locales/pt/translation.json +++ b/packages/webapp/public/locales/pt/translation.json @@ -1060,7 +1060,6 @@ }, "PREFERRED_CONTACT": "Método de contato preferido", "REQUIRED_LABEL": "Campo Obrigatório", - "TITLE": "Solicite Ajuda", "TYPE_SUPPORT_LABEL": "Tipo de suporte", "TYPE_SUPPORT_PLACEHOLDER": "Escolha o tipo de suporte", "WHATSAPP": "WhatsApp", diff --git a/packages/webapp/src/components/Help/index.jsx b/packages/webapp/src/components/Help/index.jsx index 6f028d4117..c3bb278b2c 100644 --- a/packages/webapp/src/components/Help/index.jsx +++ b/packages/webapp/src/components/Help/index.jsx @@ -2,7 +2,7 @@ import Form from '../Form'; import Button from '../Form/Button'; import { ReactComponent as AddFile } from './../../assets/images/help/AddFile.svg'; import React, { useEffect, useState } from 'react'; -import { Error, Title } from '../Typography'; +import { Error } from '../Typography'; import PropTypes from 'prop-types'; import { Controller, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -17,7 +17,7 @@ export default function PureHelpRequestPage({ onSubmit, goBack, email, phone_num const validEmailRegex = RegExp(/^$|^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i); const { register, handleSubmit, watch, control, setValue, formState } = useForm({ mode: 'onTouched', - defaultValues: { 'contact_method': 'email' } + defaultValues: { contact_method: 'email' }, }); const { errors } = formState; @@ -70,7 +70,6 @@ export default function PureHelpRequestPage({ onSubmit, goBack, email, phone_num } > - {t('HELP.TITLE')} Date: Tue, 19 Nov 2024 10:29:25 -0800 Subject: [PATCH 28/91] LF-4372 Replace image uploader --- packages/webapp/src/components/Help/index.jsx | 26 ++++--------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/packages/webapp/src/components/Help/index.jsx b/packages/webapp/src/components/Help/index.jsx index c3bb278b2c..fb88031c93 100644 --- a/packages/webapp/src/components/Help/index.jsx +++ b/packages/webapp/src/components/Help/index.jsx @@ -11,6 +11,7 @@ import TextArea from '../Form/TextArea'; import Input from '../Form/Input'; import Radio from '../Form/Radio'; import { Label } from '../Typography/index'; +import ImagePicker from '../ImagePicker'; export default function PureHelpRequestPage({ onSubmit, goBack, email, phone_number, isLoading }) { const [file, setFile] = useState(null); @@ -50,9 +51,6 @@ export default function PureHelpRequestPage({ onSubmit, goBack, email, phone_num delete data.contactInfo; onSubmit(file, data); }; - const fileChangeHandler = (event) => { - setFile(event.target.files[0]); - }; const supportType = watch(SUPPORT_TYPE); const message = watch(MESSAGE); const disabled = Object.keys(errors).length || !supportType || !message || formState.isSubmitting; @@ -97,26 +95,12 @@ export default function PureHelpRequestPage({ onSubmit, goBack, email, phone_num ) : ( '' )} -
- + setFile(null)} /> -
- - -
Date: Tue, 19 Nov 2024 15:21:00 -0500 Subject: [PATCH 29/91] LF-4483 Fix onRowClick and rename listview to extraRowSpacing --- .../components/Animals/Inventory/index.tsx | 12 +++++------ .../webapp/src/components/Table/TableV2.jsx | 10 +++++----- .../src/components/Table/styles.module.scss | 8 +++----- packages/webapp/src/components/Table/types.ts | 2 +- .../containers/Animals/Inventory/index.tsx | 20 ++++++++----------- .../src/stories/Table/TableV2.stories.jsx | 11 ++++++++++ 6 files changed, 34 insertions(+), 29 deletions(-) diff --git a/packages/webapp/src/components/Animals/Inventory/index.tsx b/packages/webapp/src/components/Animals/Inventory/index.tsx index a118e75d4b..c04d14588f 100644 --- a/packages/webapp/src/components/Animals/Inventory/index.tsx +++ b/packages/webapp/src/components/Animals/Inventory/index.tsx @@ -71,7 +71,7 @@ const PureAnimalInventory = ({ searchProps: SearchProps; onSelectInventory: (event: ChangeEvent, row: AnimalInventory) => void; handleSelectAllClick: (event: ChangeEvent) => void; - onRowClick: (event: ChangeEvent, row: AnimalInventory) => void; + onRowClick?: (event: ChangeEvent, row: AnimalInventory) => void; selectedIds: string[]; totalInventoryCount: number; isFilterActive: boolean; @@ -94,7 +94,7 @@ const PureAnimalInventory = ({ showSearchBarAndFilter: true, alternatingRowColor: true, showTableHeader: isDesktop, - listView: false, + extraRowSpacing: false, showActionFloaterButton: false, }; case View.TASK_SUMMARY: @@ -105,7 +105,7 @@ const PureAnimalInventory = ({ showSearchBarAndFilter: false, alternatingRowColor: isDesktop ? false : true, showTableHeader: false, - listView: isDesktop, + extraRowSpacing: isDesktop, showActionFloaterButton: false, }; default: @@ -116,7 +116,7 @@ const PureAnimalInventory = ({ showSearchBarAndFilter: true, alternatingRowColor: true, showTableHeader: isDesktop, - listView: false, + extraRowSpacing: false, showActionFloaterButton: isAdmin, }; } @@ -129,7 +129,7 @@ const PureAnimalInventory = ({ showSearchBarAndFilter, alternatingRowColor, showTableHeader, - listView, + extraRowSpacing, showActionFloaterButton, } = viewConfig(); @@ -196,7 +196,7 @@ const PureAnimalInventory = ({ spacerRowHeight={tableSpacerRowHeight} headerClass={styles.headerClass} onRowClick={onRowClick} - listView={listView} + extraRowSpacing={extraRowSpacing} /> ) : ( @@ -202,7 +202,7 @@ export default function TableV2(props) { styles.itemRow, onRowClick && styles.clickable, alternatingRowColor ? styles.alternatingRowColor : styles.plainRowColor, - listView && styles.listViewRow, + extraRowSpacing && styles.extraRowSpacing, )} > {shouldShowCheckbox && ( @@ -334,7 +334,7 @@ TableV2.propTypes = { spacerRowHeight: PropTypes.number, /** Cheating here using any since it is not meshing well with ts type */ headerClass: PropTypes.any, - listView: PropTypes.bool, + extraRowSpacing: PropTypes.bool, }; TableV2.defaultProps = { @@ -346,5 +346,5 @@ TableV2.defaultProps = { defaultOrderBy: '', alternatingRowColor: false, showHeader: true, - listView: false, + extraRowSpacing: false, }; diff --git a/packages/webapp/src/components/Table/styles.module.scss b/packages/webapp/src/components/Table/styles.module.scss index f747f3e546..0690a88426 100644 --- a/packages/webapp/src/components/Table/styles.module.scss +++ b/packages/webapp/src/components/Table/styles.module.scss @@ -121,13 +121,11 @@ } } -.listViewRow { +.extraRowSpacing { padding: 4px 8px; border-spacing: 8px; border: solid 1px var(---Colors-Neutral-Neutral-50); - &.clickable { - cursor: default; - } + & > td { border-top: solid 1px var(--Colors-Neutral-Neutral-50); border-bottom: solid 1px var(--Colors-Neutral-Neutral-50); @@ -145,7 +143,7 @@ }; } -.listViewTable { +.extraRowSpacingTable { border-spacing: 0 8px; .tableBody::before { content: none; diff --git a/packages/webapp/src/components/Table/types.ts b/packages/webapp/src/components/Table/types.ts index 476dd41350..1e7010eb72 100644 --- a/packages/webapp/src/components/Table/types.ts +++ b/packages/webapp/src/components/Table/types.ts @@ -85,5 +85,5 @@ export type TableV2Props = { maxHeight?: number | string; spacerRowHeight?: number; headerClass?: ClassValue; - listView?: boolean; + extraRowSpacing?: boolean; }; diff --git a/packages/webapp/src/containers/Animals/Inventory/index.tsx b/packages/webapp/src/containers/Animals/Inventory/index.tsx index 49d1c9bdbc..70ff470586 100644 --- a/packages/webapp/src/containers/Animals/Inventory/index.tsx +++ b/packages/webapp/src/containers/Animals/Inventory/index.tsx @@ -96,6 +96,9 @@ function AnimalInventory({ switch (view) { case View.TASK: return { + onRowClick: (event: ChangeEvent, row: AnimalInventoryType) => { + onSelectInventory(event, row); + }, showOnlySelected: false, showDetailLink: false, showPaperBorder: true, @@ -106,6 +109,7 @@ function AnimalInventory({ }; case View.TASK_SUMMARY: return { + onRowClick: undefined, showOnlySelected: true, showDetailLink: false, headerContainerKind: ContainerKind.OVERFLOW, @@ -115,6 +119,9 @@ function AnimalInventory({ }; default: return { + onRowClick: (event: ChangeEvent, row: AnimalInventoryType) => { + history.push(row.path); + }, showOnlySelected: false, showDetailLink: true, showPaperBorder: true, @@ -127,6 +134,7 @@ function AnimalInventory({ }; const { + onRowClick, showOnlySelected, showDetailLink, headerContainerKind, @@ -267,18 +275,6 @@ function AnimalInventory({ } }; - const onRowClick = (event: ChangeEvent, row: AnimalInventoryType) => { - switch (view) { - case View.TASK: - onSelectInventory(event, row); - break; - case View.TASK_SUMMARY: - break; - default: - history.push(row.path); - } - }; - const iconActions: iconAction[] = [ { label: t(`common:ADD_TO_GROUP`), iconName: 'ADD_ANIMAL', onClick: () => ({}) }, { label: t(`common:CREATE_A_TASK`), iconName: 'TASK_CREATION', onClick: () => ({}) }, diff --git a/packages/webapp/src/stories/Table/TableV2.stories.jsx b/packages/webapp/src/stories/Table/TableV2.stories.jsx index 65f6db6bfa..76c51619e0 100644 --- a/packages/webapp/src/stories/Table/TableV2.stories.jsx +++ b/packages/webapp/src/stories/Table/TableV2.stories.jsx @@ -274,3 +274,14 @@ export const stickyHeader = { maxHeight: 200, }, }; + +export const extraRowSpacing = { + args: { + kind: TableKind.V2, + columns: getCropSalesColumns(false), + data: getCropSalesData(10), + minRows: 10, + maxHeight: 200, + extraRowSpacing: true, + }, +}; From 5c6840c913650b6a8fb7d4ad7700a1f060764ef5 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Tue, 19 Nov 2024 15:27:12 -0500 Subject: [PATCH 30/91] LF-4483 Remove config using default values --- packages/webapp/src/components/Animals/Inventory/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/webapp/src/components/Animals/Inventory/index.tsx b/packages/webapp/src/components/Animals/Inventory/index.tsx index c04d14588f..d04b3bdf61 100644 --- a/packages/webapp/src/components/Animals/Inventory/index.tsx +++ b/packages/webapp/src/components/Animals/Inventory/index.tsx @@ -94,7 +94,6 @@ const PureAnimalInventory = ({ showSearchBarAndFilter: true, alternatingRowColor: true, showTableHeader: isDesktop, - extraRowSpacing: false, showActionFloaterButton: false, }; case View.TASK_SUMMARY: @@ -116,7 +115,6 @@ const PureAnimalInventory = ({ showSearchBarAndFilter: true, alternatingRowColor: true, showTableHeader: isDesktop, - extraRowSpacing: false, showActionFloaterButton: isAdmin, }; } From 983e3608b945196f43f52a199c847c6df3f64475 Mon Sep 17 00:00:00 2001 From: Duncan-Brain Date: Tue, 19 Nov 2024 15:36:19 -0500 Subject: [PATCH 31/91] LF-4483 Change className to classes for MultistepPageTitle --- .../src/components/PageTitle/MultiStepPageTitle/index.jsx | 6 +++--- packages/webapp/src/components/Task/TaskLocations/index.jsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/webapp/src/components/PageTitle/MultiStepPageTitle/index.jsx b/packages/webapp/src/components/PageTitle/MultiStepPageTitle/index.jsx index 99bfdea30e..7267ce2d72 100644 --- a/packages/webapp/src/components/PageTitle/MultiStepPageTitle/index.jsx +++ b/packages/webapp/src/components/PageTitle/MultiStepPageTitle/index.jsx @@ -16,12 +16,12 @@ function MultiStepPageTitle({ cancelModalTitle, showConfirmCancelModal, setShowConfirmCancelModal, - className, + classes, }) { const [localShowModal, setLocalShowModal] = useState(false); // original form flow return ( -
+
{onGoBack && ( @@ -55,5 +55,5 @@ MultiStepPageTitle.prototype = { cancelModalTitle: PropTypes.string, showConfirmCancelModal: PropTypes.bool, setShowConfirmCancelModal: PropTypes.func, - className: PropTypes.string, + classes: PropTypes.object, }; diff --git a/packages/webapp/src/components/Task/TaskLocations/index.jsx b/packages/webapp/src/components/Task/TaskLocations/index.jsx index 4c9294acec..d80dc9b4e5 100644 --- a/packages/webapp/src/components/Task/TaskLocations/index.jsx +++ b/packages/webapp/src/components/Task/TaskLocations/index.jsx @@ -127,7 +127,7 @@ export default function PureTaskLocations({ cancelModalTitle={t('TASK.ADD_TASK_FLOW')} title={t('MANAGEMENT_DETAIL.ADD_A_TASK')} value={progress} - className={isAnimalTask && styles.titlePadding} + classes={{ container: isAnimalTask && styles.titlePadding }} /> {isAnimalTask && ( Date: Tue, 19 Nov 2024 13:48:39 -0800 Subject: [PATCH 32/91] LF-4372 Add missing md size to Button; update Stories Stories were updated to make the sizes clearer, use the icon sizes specified in Figma, and remove the redunancy of showing every style in default and small. --- .../components/Form/Button/button.module.scss | 5 ++ .../src/components/Form/Button/index.tsx | 3 ++ .../src/stories/Button/Button.stories.jsx | 50 ++++++++++++------- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/packages/webapp/src/components/Form/Button/button.module.scss b/packages/webapp/src/components/Form/Button/button.module.scss index 1576aaabfb..5cb23d02b5 100644 --- a/packages/webapp/src/components/Form/Button/button.module.scss +++ b/packages/webapp/src/components/Form/Button/button.module.scss @@ -212,6 +212,11 @@ gap: 4px; } +.md { + min-height: 40px; + padding: 8px 16px; +} + .textButton { background-color: transparent; border: none; diff --git a/packages/webapp/src/components/Form/Button/index.tsx b/packages/webapp/src/components/Form/Button/index.tsx index d70cf3b38b..7da436e261 100644 --- a/packages/webapp/src/components/Form/Button/index.tsx +++ b/packages/webapp/src/components/Form/Button/index.tsx @@ -21,6 +21,7 @@ type ButtonProps = { color?: 'primary' | 'secondary' | 'secondary-2' | 'secondary-cta' | 'warning' | 'error' | 'none'; children?: ReactNode; sm?: boolean; + md?: boolean; disabled?: boolean; fullLength?: boolean; className?: string; @@ -34,6 +35,7 @@ const Button = ({ color = 'primary', children = 'Button', sm, + md, disabled = false, fullLength = false, className, @@ -49,6 +51,7 @@ const Button = ({ styles.btn, color && styles[color], sm && styles.sm, + md && styles.md, fullLength && styles.fullLength, className, )} diff --git a/packages/webapp/src/stories/Button/Button.stories.jsx b/packages/webapp/src/stories/Button/Button.stories.jsx index c658de8eb2..1d666f1235 100644 --- a/packages/webapp/src/stories/Button/Button.stories.jsx +++ b/packages/webapp/src/stories/Button/Button.stories.jsx @@ -1,4 +1,3 @@ -import React from 'react'; import Button from '../../components/Form/Button'; import { componentDecorators } from '../Pages/config/Decorators'; import { ReactComponent as EditIcon } from '../../assets/images/edit.svg'; @@ -65,36 +64,51 @@ Error.args = { children: 'Error', }; -export const PrimarySmall = Template.bind({}); -PrimarySmall.args = { - color: 'primary', - children: 'Primary', +export const Small = Template.bind({}); +Small.args = { + color: 'secondary', + children: 'Small', sm: true, }; -export const SecondarySmall = Template.bind({}); -SecondarySmall.args = { +export const Medium = Template.bind({}); +Medium.args = { color: 'secondary', - children: 'Secondary', - sm: true, + children: 'Medium', + md: true, }; -export const DisabledSmall = Template.bind({}); -DisabledSmall.args = { +export const SmallWithIcon = Template.bind({}); +SmallWithIcon.args = { color: 'primary', - children: 'Disabled', - disabled: true, sm: true, + children: ( + <> + + Edit + + ), }; -export const WithIconSmall = Template.bind({}); -WithIconSmall.args = { +export const MediumWithIcon = Template.bind({}); +MediumWithIcon.args = { color: 'primary', - sm: true, + md: true, children: ( <> + + Edit + + ), +}; + +export const LargeDefaultWithIcon = Template.bind({}); +LargeDefaultWithIcon.args = { + color: 'primary', + children: ( + <> + Edit - ), }; @@ -105,8 +119,8 @@ WithIconDisabled.args = { disabled: true, children: ( <> + Edit - ), }; From 40fe7eea3df58a4e89b9fbd8207f3bd172dc08f4 Mon Sep 17 00:00:00 2001 From: Joyce Yuki <82857964+kathyavini@users.noreply.github.com> Date: Tue, 19 Nov 2024 13:56:55 -0800 Subject: [PATCH 33/91] LF-4372 Pass correct behaviour to onCancel: close drawer and remount form, no path changes --- packages/webapp/src/components/Help/index.jsx | 17 +++++++++++++++-- .../src/containers/FeedbackSurvey/index.jsx | 2 +- packages/webapp/src/containers/Help/index.jsx | 16 ++++++++++------ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/packages/webapp/src/components/Help/index.jsx b/packages/webapp/src/components/Help/index.jsx index fb88031c93..2e2f993381 100644 --- a/packages/webapp/src/components/Help/index.jsx +++ b/packages/webapp/src/components/Help/index.jsx @@ -13,7 +13,13 @@ import Radio from '../Form/Radio'; import { Label } from '../Typography/index'; import ImagePicker from '../ImagePicker'; -export default function PureHelpRequestPage({ onSubmit, goBack, email, phone_number, isLoading }) { +export default function PureHelpRequestPage({ + onSubmit, + onCancel, + email, + phone_number, + isLoading, +}) { const [file, setFile] = useState(null); const validEmailRegex = RegExp(/^$|^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i); const { register, handleSubmit, watch, control, setValue, formState } = useForm({ @@ -40,10 +46,15 @@ export default function PureHelpRequestPage({ onSubmit, goBack, email, phone_num console.log(error); }; + const handleCancel = () => { + onCancel?.(); + }; + useEffect(() => { const contactInformation = contactMethodSelection === 'email' ? email : phone_number; setValue(CONTACT_INFO, contactInformation); }, [contactMethodSelection]); + const submit = (data) => { data.support_type = data.support_type.value; data[data[CONTACT_METHOD]] = data.contactInfo; @@ -51,15 +62,17 @@ export default function PureHelpRequestPage({ onSubmit, goBack, email, phone_num delete data.contactInfo; onSubmit(file, data); }; + const supportType = watch(SUPPORT_TYPE); const message = watch(MESSAGE); const disabled = Object.keys(errors).length || !supportType || !message || formState.isSubmitting; + return (
- - } + fullWidthContent={true} + classes={{ + container: { + display: 'flex', + flexDirection: 'column', + gap: '36px', + padding: '16px 24px 36px 24px', + }, + }} > - ( - - )} - /> - {errors[SUPPORT_TYPE] ? {t('HELP.REQUIRED_LABEL')} : ''} -