Skip to content

Commit d5f00dd

Browse files
UIREQMED-3: Add Search field for Mediated requests activity page
1 parent ea35535 commit d5f00dd

File tree

21 files changed

+364
-21
lines changed

21 files changed

+364
-21
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
* Add landing page actions: Confirm item arrival, Mediated requests activities and Send item in transit. Refs UIREQMED-2.
66
* Hide permission that should not be visible. Refs UIREQMED-20.
77
* Add caret to `react` peer dependency. Refs UIREQMED-23.
8+
* Add Search field for Mediated requests activity page. Refs UIREQMED-3.
9+
* Add Filters for Mediated requests actions page. Refs UIREQMED-4.
810

911
## 1.0.0
1012
* New app created with stripes-cli. Updated module after created with stripes-cli. Refs UIREQMED-1.

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@
8383
"displayName": "Mediated requests: View",
8484
"subPermissions": [
8585
"module.requests-mediated.enabled",
86+
"settings.circulation.enabled",
87+
"mod-settings.global.read.circulation",
88+
"mod-settings.entries.collection.get",
89+
"mod-settings.entries.item.get",
8690
"settings.requests-mediated.enabled"
8791
],
8892
"visible": true

src/components/MediatedRequestsActivities/MediatedRequestsActivities.js

Lines changed: 61 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
1+
import { useState } from 'react';
2+
13
import { FormattedMessage } from 'react-intl';
24

35
import { AppIcon } from '@folio/stripes/core';
46

57
import {
68
Pane,
9+
PaneMenu,
710
Paneset,
811
} from '@folio/stripes/components';
12+
import {
13+
SearchAndSortQuery,
14+
ExpandFilterPaneButton,
15+
CollapseFilterPaneButton,
16+
} from '@folio/stripes/smart-components';
917

1018
import NavigationMenu from '../NavigationMenu';
19+
import MediatedRequestsFilters from './components/MediatedRequestsFilters';
1120

1221
import {
1322
APP_ICON_NAME,
@@ -16,21 +25,59 @@ import {
1625
} from '../../constants';
1726

1827
const MediatedRequestsActivities = () => {
28+
const [filterPaneIsVisible, setFilterPaneIsVisible] = useState(true);
29+
30+
const toggleFilterPane = () => {
31+
setFilterPaneIsVisible(!filterPaneIsVisible);
32+
};
33+
34+
const renderResultsFirstMenu = () => {
35+
if (filterPaneIsVisible) {
36+
return null;
37+
}
38+
39+
return (
40+
<PaneMenu>
41+
<ExpandFilterPaneButton
42+
onClick={toggleFilterPane}
43+
/>
44+
</PaneMenu>
45+
);
46+
};
47+
1948
return (
20-
<Paneset data-testid="mediatedRequestsActivitiesPaneSet">
21-
<Pane
22-
data-testid="mediatedRequestsActivitiesPane"
23-
defaultWidth={FILTER_PANE_WIDTH}
24-
paneTitle={<FormattedMessage id="ui-requests-mediated.app.filterPane.selectActivity" />}
25-
>
26-
<NavigationMenu value={getMediatedRequestsActivitiesUrl()} />
27-
</Pane>
28-
<Pane
29-
defaultWidth="fill"
30-
appIcon={<AppIcon app={APP_ICON_NAME} />}
31-
paneTitle={<FormattedMessage id="ui-requests-mediated.app.mediatedRequestsActivities.paneTitle" />}
32-
/>
33-
</Paneset>
49+
<SearchAndSortQuery>
50+
{() => {
51+
return (
52+
<Paneset data-testid="mediatedRequestsActivitiesPaneSet">
53+
{filterPaneIsVisible &&
54+
<Pane
55+
data-testid="mediatedRequestsActivitiesPane"
56+
defaultWidth={FILTER_PANE_WIDTH}
57+
paneTitle={<FormattedMessage id="ui-requests-mediated.app.filterPane.selectActivity" />}
58+
lastMenu={
59+
<PaneMenu>
60+
<CollapseFilterPaneButton onClick={toggleFilterPane} />
61+
</PaneMenu>
62+
}
63+
>
64+
<NavigationMenu
65+
value={getMediatedRequestsActivitiesUrl()}
66+
separator
67+
/>
68+
<MediatedRequestsFilters />
69+
</Pane>
70+
}
71+
<Pane
72+
defaultWidth="fill"
73+
appIcon={<AppIcon app={APP_ICON_NAME} />}
74+
paneTitle={<FormattedMessage id="ui-requests-mediated.app.mediatedRequestsActivities.paneTitle" />}
75+
firstMenu={renderResultsFirstMenu()}
76+
/>
77+
</Paneset>
78+
);
79+
}}
80+
</SearchAndSortQuery>
3481
);
3582
};
3683

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import PropTypes from 'prop-types';
2+
3+
import { stripesConnect } from '@folio/stripes/core';
4+
5+
import {
6+
MediatedRequestLevelFilter,
7+
MediatedRequestStatusFilter,
8+
Search,
9+
} from './components';
10+
11+
import {
12+
getIsTitleLevelRequestsFeatureEnabled,
13+
} from '../../../../utils';
14+
15+
const SETTINGS_SCOPES = {
16+
CIRCULATION: 'circulation',
17+
};
18+
const SETTINGS_KEYS = {
19+
GENERAL_TLR: 'generalTlr',
20+
};
21+
22+
const MediatedRequestsFilters = ({
23+
resources,
24+
}) => {
25+
const isTitleLevelRequestsFeatureEnabled = getIsTitleLevelRequestsFeatureEnabled(resources);
26+
27+
return (
28+
<form>
29+
<Search />
30+
<MediatedRequestStatusFilter />
31+
{isTitleLevelRequestsFeatureEnabled && (
32+
<MediatedRequestLevelFilter />
33+
)}
34+
</form>
35+
);
36+
};
37+
38+
MediatedRequestsFilters.manifest = {
39+
configs: {
40+
type: 'okapi',
41+
records: 'items',
42+
path: 'settings/entries',
43+
params: {
44+
query: `(scope==${SETTINGS_SCOPES.CIRCULATION} and key==${SETTINGS_KEYS.GENERAL_TLR})`,
45+
},
46+
},
47+
};
48+
49+
MediatedRequestsFilters.propTypes = {
50+
resources: PropTypes.object.isRequired,
51+
};
52+
53+
export default stripesConnect(MediatedRequestsFilters);
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { useIntl } from 'react-intl';
2+
3+
import {
4+
Accordion,
5+
AccordionSet,
6+
FilterAccordionHeader,
7+
} from '@folio/stripes/components';
8+
import {
9+
CheckboxFilter,
10+
} from '@folio/stripes/smart-components';
11+
12+
import {
13+
transformRequestFilterOptions,
14+
} from '../../../../../../utils';
15+
import {
16+
MEDIATED_REQUEST_FILTER_TYPES,
17+
MEDIATED_REQUEST_LEVEL_TRANSLATIONS,
18+
} from '../../../../../../constants';
19+
20+
const MediatedRequestLevelFilter = () => {
21+
const { formatMessage } = useIntl();
22+
23+
return (
24+
<AccordionSet>
25+
<Accordion
26+
id={MEDIATED_REQUEST_FILTER_TYPES.MEDIATED_REQUEST_LEVELS}
27+
data-testid={MEDIATED_REQUEST_FILTER_TYPES.MEDIATED_REQUEST_LEVELS}
28+
header={FilterAccordionHeader}
29+
label={formatMessage({ id:'ui-requests-mediated.filters.mediatedRequestLevel.accordionTitle' })}
30+
name={MEDIATED_REQUEST_FILTER_TYPES.MEDIATED_REQUEST_LEVELS}
31+
separator={false}
32+
onClearFilter={() => {}}
33+
>
34+
<CheckboxFilter
35+
data-testid={`${MEDIATED_REQUEST_FILTER_TYPES.MEDIATED_REQUEST_LEVELS}Filter`}
36+
dataOptions={transformRequestFilterOptions(MEDIATED_REQUEST_LEVEL_TRANSLATIONS, formatMessage)}
37+
name={MEDIATED_REQUEST_FILTER_TYPES.MEDIATED_REQUEST_LEVELS}
38+
onChange={() => {}}
39+
/>
40+
</Accordion>
41+
</AccordionSet>
42+
);
43+
};
44+
45+
export default MediatedRequestLevelFilter;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './MediatedRequestLevelFilter';
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { useIntl } from 'react-intl';
2+
3+
import {
4+
Accordion,
5+
AccordionSet,
6+
FilterAccordionHeader,
7+
} from '@folio/stripes/components';
8+
import {
9+
CheckboxFilter,
10+
} from '@folio/stripes/smart-components';
11+
12+
import {
13+
transformRequestFilterOptions,
14+
} from '../../../../../../utils';
15+
import {
16+
MEDIATED_REQUEST_FILTER_TYPES,
17+
MEDIATED_REQUEST_STATUS_TRANSLATIONS,
18+
} from '../../../../../../constants';
19+
20+
const MediatedRequestStatusFilter = () => {
21+
const { formatMessage } = useIntl();
22+
23+
return (
24+
<AccordionSet>
25+
<Accordion
26+
id={MEDIATED_REQUEST_FILTER_TYPES.MEDIATED_REQUEST_STATUS}
27+
data-testid={MEDIATED_REQUEST_FILTER_TYPES.MEDIATED_REQUEST_STATUS}
28+
header={FilterAccordionHeader}
29+
label={formatMessage({ id:'ui-requests-mediated.filters.mediatedRequestStatus.accordionTitle' })}
30+
name={MEDIATED_REQUEST_FILTER_TYPES.MEDIATED_REQUEST_STATUS}
31+
separator={false}
32+
onClearFilter={() => {}}
33+
>
34+
<CheckboxFilter
35+
data-testid={`${MEDIATED_REQUEST_FILTER_TYPES.MEDIATED_REQUEST_STATUS}Filter`}
36+
dataOptions={transformRequestFilterOptions(MEDIATED_REQUEST_STATUS_TRANSLATIONS, formatMessage)}
37+
name={MEDIATED_REQUEST_FILTER_TYPES.MEDIATED_REQUEST_STATUS}
38+
onChange={() => {}}
39+
/>
40+
</Accordion>
41+
</AccordionSet>
42+
);
43+
};
44+
45+
export default MediatedRequestStatusFilter;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './MediatedRequestStatusFilter';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
.searchField {
2+
margin-bottom: calc(var(--control-margin-bottom) / 2);
3+
}
4+
5+
.searchForm {
6+
& .resetButton {
7+
padding: 0 6px 0 3px;
8+
margin-left: 0;
9+
}
10+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {
2+
FormattedMessage,
3+
} from 'react-intl';
4+
5+
import {
6+
Button,
7+
SearchField,
8+
Icon,
9+
} from '@folio/stripes/components';
10+
11+
import {
12+
ICONS,
13+
} from '../../../../../../constants';
14+
15+
import styles from './Search.css';
16+
17+
const Search = () => {
18+
return (
19+
<form
20+
onSubmit={() => {}}
21+
className={styles.searchForm}
22+
>
23+
<SearchField
24+
autoFocus
25+
autoComplete="off"
26+
name="query"
27+
className={styles.searchField}
28+
marginBottom0
29+
/>
30+
<Button
31+
type="submit"
32+
buttonStyle="primary"
33+
fullWidth
34+
>
35+
<FormattedMessage id="stripes-smart-components.search" />
36+
</Button>
37+
<Button
38+
buttonStyle="none"
39+
buttonClass={styles.resetButton}
40+
>
41+
<Icon
42+
icon={ICONS.TIMES_CIRCLE_SOLID}
43+
size="small"
44+
>
45+
<FormattedMessage id="stripes-smart-components.resetAll" />
46+
</Icon>
47+
</Button>
48+
</form>
49+
);
50+
};
51+
52+
export default Search;

0 commit comments

Comments
 (0)