Skip to content

Commit 4192da1

Browse files
shreeyash07samshara
authored andcommitted
Add local unit modal in map popup
1 parent 41022e6 commit 4192da1

File tree

6 files changed

+115
-46
lines changed

6 files changed

+115
-46
lines changed

.changeset/six-hounds-film.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
"go-web-app": patch
3+
---
4+
5+
- Local Units popup, view/edit mode improvements in [#1178](https://github.com/IFRCGo/go-web-app/issues/1178)
6+
- Remove ellipsize heading option in local units map popup
7+
- Local units title on popup are now clickable that opens up a modal to show details
8+
- Added an Edit button to the View Mode for users with edit permissions
9+
- Users will now see a **disabled grey button** when the content is already validated

app/src/views/CountryNsOverviewContextAndStructure/NationalSocietyLocalUnits/LocalUnitValidateButton/styles.module.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
}
66

77
.local-unit-validated-button {
8-
background-color: var(--go-ui-color-gray-40);
98
border: none;
9+
background-color: var(--go-ui-color-gray-40);
1010

1111
.icon {
1212
font-size: var(--go-ui-height-icon-multiplier);

app/src/views/CountryNsOverviewContextAndStructure/NationalSocietyLocalUnits/LocalUnitsFormModal/LocalUnitsForm/index.tsx

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ interface Props {
110110
onSuccess?: () => void;
111111
onEditButtonClick?: () => void;
112112
localUnitId?: number;
113-
actionsContainerRef?: RefObject<HTMLDivElement>;
113+
actionsContainerRef: RefObject<HTMLDivElement>;
114114
headingDescriptionRef?: RefObject<HTMLDivElement>;
115115
headerDescriptionRef: RefObject<HTMLDivElement>;
116116
}
@@ -316,14 +316,21 @@ function LocalUnitsForm(props: Props) {
316316

317317
return (
318318
<div className={styles.localUnitsForm}>
319-
{!readOnly
320-
&& isDefined(actionsContainerRef)
321-
&& isDefined(actionsContainerRef.current)
322-
&& (
323-
<Portal container={actionsContainerRef.current}>
324-
{submitButton}
325-
</Portal>
326-
)}
319+
{readOnly && isDefined(actionsContainerRef.current) && (
320+
<Portal container={actionsContainerRef.current}>
321+
<Button
322+
name={undefined}
323+
onClick={onEditButtonClick}
324+
>
325+
{strings.editButtonLabel}
326+
</Button>
327+
</Portal>
328+
)}
329+
{!readOnly && isDefined(actionsContainerRef.current) && (
330+
<Portal container={actionsContainerRef.current}>
331+
{submitButton}
332+
</Portal>
333+
)}
327334
{isDefined(headingDescriptionRef) && isDefined(headingDescriptionRef.current) && (
328335
<Portal container={headingDescriptionRef.current}>
329336
<div className={styles.lastUpdateLabel}>
@@ -389,14 +396,6 @@ function LocalUnitsForm(props: Props) {
389396
onActionSuccess={onSuccess}
390397
disabled={!pristine}
391398
/>
392-
{readOnly && (
393-
<Button
394-
name=""
395-
onClick={onEditButtonClick}
396-
>
397-
{strings.editButtonLabel}
398-
</Button>
399-
)}
400399
<LocalUnitValidateButton
401400
countryId={Number(countryId)}
402401
localUnitId={localUnitId}

app/src/views/CountryNsOverviewContextAndStructure/NationalSocietyLocalUnits/LocalUnitsFormModal/index.tsx

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import {
22
useCallback,
33
useRef,
4-
useState,
54
} from 'react';
65
import { Modal } from '@ifrc-go/ui';
76
import { useTranslation } from '@ifrc-go/ui/hooks';
7+
import { isDefined } from '@togglecorp/fujs';
88

99
import LocalUnitsForm from './LocalUnitsForm';
1010

@@ -13,32 +13,38 @@ import styles from './styles.module.css';
1313

1414
interface Props {
1515
localUnitId?: number;
16-
viewMode?: boolean;
16+
readOnly?: boolean;
17+
setReadOnly?: React.Dispatch<React.SetStateAction<boolean>>;
1718
onClose: (requestDone?: boolean) => void;
1819
}
1920

2021
function LocalUnitsFormModal(props: Props) {
2122
const {
2223
onClose,
2324
localUnitId,
24-
viewMode = false,
25+
readOnly,
26+
setReadOnly,
2527
} = props;
2628

2729
const strings = useTranslation(i18n);
2830
const actionsContainerRef = useRef<HTMLDivElement>(null);
2931
const headingDescriptionRef = useRef<HTMLDivElement>(null);
3032
const headerDescriptionRef = useRef<HTMLDivElement>(null);
3133

32-
const [readOnly, setReadOnly] = useState<boolean>(viewMode);
33-
3434
const handleSuccess = useCallback(
35-
() => { onClose(true); },
35+
() => {
36+
onClose(true);
37+
},
3638
[onClose],
3739
);
3840

3941
const handleEditButtonClick = useCallback(
40-
() => { setReadOnly(false); },
41-
[],
42+
() => {
43+
if (isDefined(setReadOnly)) {
44+
setReadOnly(false);
45+
}
46+
},
47+
[setReadOnly],
4248
);
4349

4450
return (
@@ -49,9 +55,7 @@ function LocalUnitsFormModal(props: Props) {
4955
size="pageWidth"
5056
withHeaderBorder
5157
headingLevel={2}
52-
actions={!readOnly && (
53-
<div ref={actionsContainerRef} />
54-
)}
58+
actions={<div ref={actionsContainerRef} />}
5559
headingContainerClassName={styles.headingContainer}
5660
headingDescription={
5761
<div ref={headingDescriptionRef} />

app/src/views/CountryNsOverviewContextAndStructure/NationalSocietyLocalUnits/LocalUnitsMap/index.tsx

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ import {
1616
List,
1717
TextOutput,
1818
} from '@ifrc-go/ui';
19-
import { useTranslation } from '@ifrc-go/ui/hooks';
19+
import {
20+
useBooleanState,
21+
useTranslation,
22+
} from '@ifrc-go/ui/hooks';
2023
import {
2124
numericIdSelector,
2225
stringNameSelector,
@@ -65,6 +68,7 @@ import {
6568
VALIDATED,
6669
} from '../common';
6770
import type { FilterValue } from '../Filters';
71+
import LocalUnitsFormModal from '../LocalUnitsFormModal';
6872
import { TYPE_HEALTH_CARE } from '../LocalUnitsFormModal/LocalUnitsForm/schema';
6973

7074
import i18n from './i18n.json';
@@ -132,6 +136,12 @@ function LocalUnitsMap(props: Props) {
132136
} = props;
133137
const { countryResponse } = useOutletContext<CountryOutletContext>();
134138

139+
const [showLocalUnitModal, {
140+
setTrue: setShowLocalUnitViewModalTrue,
141+
setFalse: setShowLocalUnitViewModalFalse,
142+
}] = useBooleanState(false);
143+
const [readOnlyLocalUnitModal, setReadOnlyLocalUnitModal] = useState(true);
144+
135145
const urlQuery = useMemo<GoApiUrlQuery<'/api/v2/public-local-units/'>>(
136146
() => ({
137147
limit: MAX_PAGE_LIMIT,
@@ -305,6 +315,22 @@ function LocalUnitsMap(props: Props) {
305315
[setClickedPointProperties],
306316
);
307317

318+
const handleLocalUnitHeadingClick = useCallback(
319+
() => {
320+
setReadOnlyLocalUnitModal(true);
321+
setShowLocalUnitViewModalTrue();
322+
},
323+
[setShowLocalUnitViewModalTrue],
324+
);
325+
326+
const handleLocalUnitsFormModalClose = useCallback(
327+
() => {
328+
setShowLocalUnitViewModalFalse();
329+
setReadOnlyLocalUnitModal(true);
330+
},
331+
[setShowLocalUnitViewModalFalse],
332+
);
333+
308334
const emailRendererParams = useCallback(
309335
(_: string, email: string): LinkProps => ({
310336
className: styles.email,
@@ -417,7 +443,15 @@ function LocalUnitsMap(props: Props) {
417443
popupClassName={styles.mapPopup}
418444
coordinates={clickedPointProperties.lngLat}
419445
onCloseButtonClick={handlePointClose}
420-
heading={localUnitName}
446+
heading={(
447+
<Button
448+
name=""
449+
variant="tertiary"
450+
onClick={handleLocalUnitHeadingClick}
451+
>
452+
{localUnitName}
453+
</Button>
454+
)}
421455
contentViewType="vertical"
422456
pending={localUnitDetailPending}
423457
errored={isDefined(localUnitDetailError)}
@@ -543,6 +577,14 @@ function LocalUnitsMap(props: Props) {
543577
iconElementClassName={styles.legendIcon}
544578
/>
545579
)}
580+
{(showLocalUnitModal && (
581+
<LocalUnitsFormModal
582+
onClose={handleLocalUnitsFormModalClose}
583+
localUnitId={clickedPointProperties?.localUnitId}
584+
readOnly={readOnlyLocalUnitModal}
585+
setReadOnly={setReadOnlyLocalUnitModal}
586+
/>
587+
))}
546588
</Container>
547589
);
548590
}

app/src/views/CountryNsOverviewContextAndStructure/NationalSocietyLocalUnits/LocalUnitsTable/LocalUnitTableActions/index.tsx

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { useCallback } from 'react';
1+
import {
2+
useCallback,
3+
useState,
4+
} from 'react';
25
import { TableActions } from '@ifrc-go/ui';
36
import {
47
useBooleanState,
@@ -39,26 +42,37 @@ function LocalUnitsTableActions(props: Props) {
3942

4043
const hasValidatePermission = !isGuestUser && (isSuperUser || isCountryAdmin(countryId));
4144

42-
const [showLocalUnitViewModal, {
43-
setTrue: setShowLocalUnitViewModalTrue,
44-
setFalse: setShowLocalUnitViewModalFalse,
45-
}] = useBooleanState(false);
45+
const [readOnlyLocalUnitModal, setReadOnlyLocalUnitModal] = useState(false);
4646

47-
const [showLocalUnitEditModal, {
48-
setTrue: setShowLocalUnitEditModalTrue,
49-
setFalse: setShowLocalUnitEditModalFalse,
47+
const [showLocalUnitModal, {
48+
setTrue: setShowLocalUnitModalTrue,
49+
setFalse: setShowLocalUnitModalFalse,
5050
}] = useBooleanState(false);
5151

5252
const handleLocalUnitsFormModalClose = useCallback(
5353
(shouldUpdate?: boolean) => {
54-
setShowLocalUnitEditModalFalse();
55-
setShowLocalUnitViewModalFalse();
54+
setShowLocalUnitModalFalse();
5655

5756
if (shouldUpdate) {
5857
onActionSuccess();
5958
}
6059
},
61-
[setShowLocalUnitViewModalFalse, setShowLocalUnitEditModalFalse, onActionSuccess],
60+
[setShowLocalUnitModalFalse, onActionSuccess],
61+
);
62+
63+
const handleViewLocalUnitClick = useCallback(
64+
() => {
65+
setReadOnlyLocalUnitModal(true);
66+
setShowLocalUnitModalTrue();
67+
},
68+
[setShowLocalUnitModalTrue],
69+
);
70+
const handleEditLocalUnitClick = useCallback(
71+
() => {
72+
setReadOnlyLocalUnitModal(false);
73+
setShowLocalUnitModalTrue();
74+
},
75+
[setShowLocalUnitModalTrue],
6276
);
6377

6478
return (
@@ -70,15 +84,15 @@ function LocalUnitsTableActions(props: Props) {
7084
<DropdownMenuItem
7185
type="button"
7286
name={localUnitId}
73-
onClick={setShowLocalUnitViewModalTrue}
87+
onClick={handleViewLocalUnitClick}
7488
disabled={!hasValidatePermission}
7589
>
7690
{strings.localUnitsView}
7791
</DropdownMenuItem>
7892
<DropdownMenuItem
7993
type="button"
8094
name={localUnitId}
81-
onClick={setShowLocalUnitEditModalTrue}
95+
onClick={handleEditLocalUnitClick}
8296
disabled={!hasValidatePermission}
8397
>
8498
{strings.localUnitsEdit}
@@ -101,11 +115,12 @@ function LocalUnitsTableActions(props: Props) {
101115
localUnitId={localUnitId}
102116
/>
103117
</TableActions>
104-
{(showLocalUnitViewModal || showLocalUnitEditModal) && (
118+
{showLocalUnitModal && (
105119
<LocalUnitsFormModal
106120
onClose={handleLocalUnitsFormModalClose}
107121
localUnitId={localUnitId}
108-
viewMode={showLocalUnitViewModal}
122+
readOnly={readOnlyLocalUnitModal}
123+
setReadOnly={setReadOnlyLocalUnitModal}
109124
/>
110125
)}
111126
</>

0 commit comments

Comments
 (0)