diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ccdd98..19984ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Change history for ui-tenant-settings ## 9.1.0 (IN PROGRESS) +* [UITEN-281](https://folio-org.atlassian.net/browse/UITEN-281) Add Routing service point option to Service point page(ECS only). +* [UITEN-285](https://folio-org.atlassian.net/browse/UITEN-285) Disable edit of Routing service point field (ECS only). +* [UITEN-294](https://folio-org.atlassian.net/browse/UITEN-294) Show routing service points on settings -> tenant -> servicePoints. +* [UITEN-292](https://folio-org.atlassian.net/browse/UITEN-292) Change visibility rules for routing service points. ## [9.0.0](https://github.com/folio-org/ui-tenant-settings/tree/v9.0.0)(2024-10-30) @@ -19,6 +23,7 @@ * [UITEN-212](https://folio-org.atlassian.net/browse/UITEN-212) Permission changes for service point management. * [UITEN-299](https://folio-org.atlassian.net/browse/UITEN-299) Rewrite class components to functional ones (ui-tenant-settings module). * [UITEN-304](https://folio-org.atlassian.net/browse/UITEN-304) Provide case insensitive sorted data to edit record, field components. +* [UITEN-306](https://folio-org.atlassian.net/browse/UITEN-306) Fix saving problem for routing service point(ECS only). * [UITEN-302](https://folio-org.atlassian.net/browse/UITEN-302) Address existing UI issues on Settings > Tenant > Locations * [UITEN-305](https://folio-org.atlassian.net/browse/UITEN-305) Permission changes for service point management (ECS environment) diff --git a/package.json b/package.json index d98776c..4374c9e 100644 --- a/package.json +++ b/package.json @@ -194,7 +194,8 @@ "inventory-storage.location-units.libraries.collection.get", "inventory-storage.service-points.collection.get", "inventory-storage.service-points.item.get", - "circulation-storage.staff-slips.collection.get" + "circulation-storage.staff-slips.collection.get", + "circulation.settings.collection.get" ], "visible": false }, @@ -260,6 +261,7 @@ "@testing-library/dom": "^7.26.3", "@testing-library/jest-dom": "^5.11.1", "@testing-library/react": "^11.0.2", + "@testing-library/react-hooks": "^7.0.1", "@testing-library/user-event": "^12.1.10", "babel-eslint": "^9.0.0", "babel-jest": "^26.3.0", @@ -284,6 +286,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-intl": "^6.4.4", + "react-query": "^3.6.0", "react-redux": "^7.2.0", "react-router-dom": "^5.2.0", "redux": "^4.0.0", diff --git a/src/hooks/index.js b/src/hooks/index.js new file mode 100644 index 0000000..86ec60a --- /dev/null +++ b/src/hooks/index.js @@ -0,0 +1 @@ +export { default as useCirculationSettingsEcsTlrFeature } from './useCirculationSettingsEcsTlrFeature'; diff --git a/src/hooks/useCirculationSettingsEcsTlrFeature/index.js b/src/hooks/useCirculationSettingsEcsTlrFeature/index.js new file mode 100644 index 0000000..e02e3cc --- /dev/null +++ b/src/hooks/useCirculationSettingsEcsTlrFeature/index.js @@ -0,0 +1 @@ +export { default } from './useCirculationSettingsEcsTlrFeature'; diff --git a/src/hooks/useCirculationSettingsEcsTlrFeature/useCirculationSettingsEcsTlrFeature.js b/src/hooks/useCirculationSettingsEcsTlrFeature/useCirculationSettingsEcsTlrFeature.js new file mode 100644 index 0000000..0266cbe --- /dev/null +++ b/src/hooks/useCirculationSettingsEcsTlrFeature/useCirculationSettingsEcsTlrFeature.js @@ -0,0 +1,27 @@ +import { useQuery } from 'react-query'; + +import { useNamespace, useOkapiKy } from '@folio/stripes/core'; + +import { getEcsTlrFeature } from '../../settings/ServicePoints/utils'; + +const useCirculationSettingsEcsTlrFeature = (enabled) => { + const ky = useOkapiKy(); + const [namespace] = useNamespace({ key: 'circulationSettingsEcsTlrFeature' }); + const searchParams = { + query: 'name==ecsTlrFeature', + }; + const { isLoading, data, refetch, isFetching } = useQuery( + [namespace], + () => ky.get('circulation/settings', { searchParams }).json(), + { enabled }, + ); + + return ({ + titleLevelRequestsFeatureEnabled: getEcsTlrFeature(data?.circulationSettings), + isLoading, + isFetching, + refetch, + }); +}; + +export default useCirculationSettingsEcsTlrFeature; diff --git a/src/hooks/useCirculationSettingsEcsTlrFeature/useCirculationSettingsEcsTlrFeature.test.js b/src/hooks/useCirculationSettingsEcsTlrFeature/useCirculationSettingsEcsTlrFeature.test.js new file mode 100644 index 0000000..3068bf8 --- /dev/null +++ b/src/hooks/useCirculationSettingsEcsTlrFeature/useCirculationSettingsEcsTlrFeature.test.js @@ -0,0 +1,43 @@ +import { + QueryClient, + QueryClientProvider, +} from 'react-query'; +import { + renderHook, + act, +} from '@testing-library/react-hooks'; + +import { useOkapiKy } from '@folio/stripes/core'; + +import useCirculationSettingsEcsTlrFeature from './useCirculationSettingsEcsTlrFeature'; + +const queryClient = new QueryClient(); + +// eslint-disable-next-line react/prop-types +const wrapper = ({ children }) => ( + + {children} + +); + +const data = 'data'; + +describe('useCirculationSettingsEcsTlrFeature', () => { + it('should fetch data', async () => { + useOkapiKy.mockClear().mockReturnValue({ + get: () => ({ + json: () => ({ + data, + }), + }), + }); + + const { result } = renderHook(() => useCirculationSettingsEcsTlrFeature(true), { wrapper }); + + await act(() => { + return !result.current.isLoading; + }); + + expect(result.current.titleLevelRequestsFeatureEnabled).toBeFalsy(); + }); +}); diff --git a/src/settings/ServicePoints/ConfirmPickupLocationChangeModal.js b/src/settings/ServicePoints/ConfirmPickupLocationChangeModal.js index 258e869..6c32e96 100644 --- a/src/settings/ServicePoints/ConfirmPickupLocationChangeModal.js +++ b/src/settings/ServicePoints/ConfirmPickupLocationChangeModal.js @@ -20,13 +20,13 @@ const ConfirmPickupLocationChangeModal = ({ autoFocus onClick={onConfirm} > - + ); diff --git a/src/settings/ServicePoints/ConfirmPickupLocationChangeModal.test.js b/src/settings/ServicePoints/ConfirmPickupLocationChangeModal.test.js index 9386515..5e696d3 100644 --- a/src/settings/ServicePoints/ConfirmPickupLocationChangeModal.test.js +++ b/src/settings/ServicePoints/ConfirmPickupLocationChangeModal.test.js @@ -22,8 +22,8 @@ const testIds = { const messageIds = { title: 'ui-tenant-settings.settings.confirmPickupLocationChangeModal.title', message: 'ui-tenant-settings.settings.confirmPickupLocationChangeModal.message', - buttonConfirm: 'ui-tenant-settings.settings.confirmPickupLocationChangeModal.button.confirm', - buttonCancel: 'ui-tenant-settings.settings.confirmPickupLocationChangeModal.button.cancel', + buttonConfirm: 'ui-tenant-settings.settings.modal.button.confirm', + buttonCancel: 'ui-tenant-settings.settings.modal.button.cancel', }; describe('ConfirmPickupLocationChangeModal', () => { diff --git a/src/settings/ServicePoints/ServicePointDetail.js b/src/settings/ServicePoints/ServicePointDetail.js index 0443d6d..fa21919 100644 --- a/src/settings/ServicePoints/ServicePointDetail.js +++ b/src/settings/ServicePoints/ServicePointDetail.js @@ -1,16 +1,18 @@ -import { cloneDeep, keyBy, orderBy } from 'lodash'; import React from 'react'; import PropTypes from 'prop-types'; import { injectIntl, FormattedMessage, } from 'react-intl'; +import { cloneDeep, keyBy, orderBy } from 'lodash'; + import { Accordion, Col, ExpandAllButton, KeyValue, Row } from '@folio/stripes/components'; import { ViewMetaData } from '@folio/stripes/smart-components'; - import { TitleManager } from '@folio/stripes/core'; + import LocationList from './LocationList'; import StaffSlipList from './StaffSlipList'; +import { isEcsRequestRoutingVisible, isEcsRequestRoutingAssociatedFieldsVisible } from './utils'; import { intervalPeriods } from '../../constants'; import { closedLibraryDateManagementMapping } from './constants'; @@ -22,7 +24,8 @@ class ServicePointDetail extends React.Component { }).isRequired, initialValues: PropTypes.object, parentResources: PropTypes.object, - parentMutator: PropTypes.object + parentMutator: PropTypes.object, + titleLevelRequestsFeatureEnabled: PropTypes.bool, }; constructor(props) { @@ -80,7 +83,7 @@ class ServicePointDetail extends React.Component { } render() { - const { initialValues, parentResources } = this.props; + const { initialValues, parentResources, titleLevelRequestsFeatureEnabled } = this.props; const locations = (parentResources.locations || {}).records || []; const staffSlips = orderBy((parentResources.staffSlips || {}).records || [], 'name'); const servicePoint = initialValues; @@ -133,56 +136,74 @@ class ServicePointDetail extends React.Component { /> - - - } - value={servicePoint.shelvingLagTime} - /> - - - - - }> - { servicePoint.pickupLocation - ? - : - } - - - - { servicePoint.pickupLocation && ( + {isEcsRequestRoutingVisible(titleLevelRequestsFeatureEnabled) && ( + + + }> + { servicePoint.ecsRequestRouting + ? + : + } + + + + )} + {isEcsRequestRoutingAssociatedFieldsVisible(titleLevelRequestsFeatureEnabled, servicePoint.ecsRequestRouting) && ( <> - + } - value={`${duration} ${this.intervalPeriodMap[intervalId].label}`} + label={} + value={servicePoint.shelvingLagTime} /> - - }> - + + }> + { servicePoint.pickupLocation + ? + : + } + { servicePoint.pickupLocation && ( + <> + + + } + value={`${duration} ${this.intervalPeriodMap[intervalId].label}`} + /> + + + + + }> + + + + + + ) + } + - ) - } - + )} - + {isEcsRequestRoutingAssociatedFieldsVisible(titleLevelRequestsFeatureEnabled, servicePoint.ecsRequestRouting) && ( + + )} ); diff --git a/src/settings/ServicePoints/ServicePointForm.js b/src/settings/ServicePoints/ServicePointForm.js index 1e0c0e3..7e32fcc 100644 --- a/src/settings/ServicePoints/ServicePointForm.js +++ b/src/settings/ServicePoints/ServicePointForm.js @@ -39,8 +39,14 @@ import { intervalPeriods } from '../../constants'; import { validateServicePointForm, getUniquenessValidation, + isEcsRequestRoutingVisible, + isEcsRequestRoutingAssociatedFieldsVisible, } from './utils'; +import { + useCirculationSettingsEcsTlrFeature, +} from '../../hooks'; + import { shortTermExpiryPeriod, shortTermClosedDateManagementMenu, @@ -49,11 +55,15 @@ import { import styles from './ServicePoints.css'; +export const SELECTED_ROUTING_SERVICE_POINT_VALUE = 'true'; export const SELECTED_PICKUP_LOCATION_VALUE = 'true'; export const UNSELECTED_PICKUP_LOCATION_VALUE = 'false'; export const LAYER_EDIT = 'layer=edit'; +export const isLayerEdit = (search) => ( + search.includes(LAYER_EDIT) +); export const isConfirmPickupLocationChangeModalShouldBeVisible = (search, value) => ( - search.includes(LAYER_EDIT) && value === UNSELECTED_PICKUP_LOCATION_VALUE + isLayerEdit(search) && value === UNSELECTED_PICKUP_LOCATION_VALUE ); const ServicePointForm = ({ @@ -69,6 +79,7 @@ const ServicePointForm = ({ handleSubmit, onCancel, }) => { + const { titleLevelRequestsFeatureEnabled } = useCirculationSettingsEcsTlrFeature(true); const [sections, setSections] = useState({ generalSection: true, locationSection: true @@ -88,11 +99,11 @@ const ServicePointForm = ({ const selectOptions = [ { - label: intl.formatMessage({ id: 'ui-tenant-settings.settings.servicePoints.pickupLocation.no' }), + label: intl.formatMessage({ id: 'ui-tenant-settings.settings.servicePoints.value.no' }), value: false }, { - label: intl.formatMessage({ id: 'ui-tenant-settings.settings.servicePoints.pickupLocation.yes' }), + label: intl.formatMessage({ id: 'ui-tenant-settings.settings.servicePoints.value.yes' }), value: true } ]; @@ -200,6 +211,12 @@ const ServicePointForm = ({ ))); }; + const handleEcsRequestRoutingChange = (e) => { + const value = e.target.value; + + form.change('ecsRequestRouting', value === SELECTED_ROUTING_SERVICE_POINT_VALUE); + }; + const handleChange = (e) => { const value = e.target.value; @@ -290,67 +307,88 @@ const ServicePointForm = ({ /> - - - } - name="shelvingLagTime" - id="input-service-shelvingLagTime" - component={TextField} - fullWidth - disabled={disabled} - /> - - - - - } - name="pickupLocation" - id="input-service-pickupLocation" - component={Select} - dataOptions={selectOptions} - onChange={handleChange} - disabled={disabled} - /> - - - { - formValues.pickupLocation && ( - <> -
- + + } + name="ecsRequestRouting" + id="input-service-ecsRequestRouting" + component={Select} + dataOptions={selectOptions} + onChange={handleEcsRequestRoutingChange} + disabled={disabled || isLayerEdit(search)} + /> + + + )} + {isEcsRequestRoutingAssociatedFieldsVisible(titleLevelRequestsFeatureEnabled, formValues.ecsRequestRouting) && ( + <> + + + } + name="shelvingLagTime" + id="input-service-shelvingLagTime" + component={TextField} + fullWidth + disabled={disabled} /> -
-
+ + + + } - name="holdShelfClosedLibraryDateManagement" + data-test-pickup-location + label={} + name="pickupLocation" + id="input-service-pickupLocation" component={Select} - dataOptions={getClosedLibraryDateManagementOptions()} + dataOptions={selectOptions} + onChange={handleChange} + disabled={disabled} /> -
- - ) - } - + + + { + formValues.pickupLocation && ( + <> +
+ +
+
+ } + name="holdShelfClosedLibraryDateManagement" + component={Select} + dataOptions={getClosedLibraryDateManagementOptions()} + /> +
+ + ) + } + + + )} - + {isEcsRequestRoutingAssociatedFieldsVisible(titleLevelRequestsFeatureEnabled, formValues.ecsRequestRouting) && ( + + )} { - describe('isConfirmPickupLocationChangeModalShouldBeVisible', () => { - const OTHER_LAYER = 'other'; + const OTHER_LAYER = 'other'; + + describe('isLayerEdit', () => { + it(`should return true for layer equal "${LAYER_EDIT}"`, () => { + expect(isLayerEdit(LAYER_EDIT)).toBe(true); + }); + it(`should return false for layer not equal "${LAYER_EDIT}"(${OTHER_LAYER})`, () => { + expect(isLayerEdit(OTHER_LAYER)).toBe(false); + }); + }); + + describe('isConfirmPickupLocationChangeModalShouldBeVisible', () => { it(`should return true for layer equal "${LAYER_EDIT}" and value "${UNSELECTED_PICKUP_LOCATION_VALUE}"`, () => { expect(isConfirmPickupLocationChangeModalShouldBeVisible(LAYER_EDIT, UNSELECTED_PICKUP_LOCATION_VALUE)).toBe(true); }); diff --git a/src/settings/ServicePoints/ServicePointFormContainer.js b/src/settings/ServicePoints/ServicePointFormContainer.js index 7b4d61b..ec66497 100644 --- a/src/settings/ServicePoints/ServicePointFormContainer.js +++ b/src/settings/ServicePoints/ServicePointFormContainer.js @@ -62,12 +62,19 @@ const ServicePointFormContainer = ({ unset(data, 'holdShelfClosedLibraryDateManagement'); } + if (data.ecsRequestRouting) { + unset(data, 'shelvingLagTime'); + unset(data, 'pickupLocation'); + unset(data, 'holdShelfExpiryPeriod'); + unset(data, 'holdShelfClosedLibraryDateManagement'); + unset(data, 'staffSlips'); + } else { + data.staffSlips = transformStaffSlipsData(staffSlips); + } + unset(data, 'location'); - onSave({ - ...data, - staffSlips: transformStaffSlipsData(staffSlips) - }); + onSave(data); }, [onSave, transformStaffSlipsData]); const titleManagerLabel = initialValues.name ? intl.formatMessage({ id:'ui-tenant-settings.settings.items.edit.title' }, { item: initialValues?.name }) @@ -76,7 +83,6 @@ const ServicePointFormContainer = ({ return ( - ({ + useCirculationSettingsEcsTlrFeature: jest.fn().mockReturnValue({ titleLevelRequestsFeatureEnabled: true }), +})); + const onSave = jest.fn(); const staffSlips = [true, true, true, true]; @@ -86,7 +90,25 @@ describe('ServicePointFormContainer', () => { userEvent.selectOptions(screen.getByRole('combobox', { name: /settings.servicePoints.pickupLocation/ }), 'true'); - expect(screen.getByRole('option', { name: /settings.servicePoints.pickupLocation.yes/ }).selected).toBe(true); + expect(screen.getAllByRole('option', { name: /settings.servicePoints.value.yes/ })[1].selected).toBe(true); + }); + + describe('ecs request routing', () => { + beforeEach(() => { + renderServicePointFormContainer(); + }); + + it('should not render pick location', () => { + userEvent.selectOptions(screen.getByRole('combobox', { name: /settings.servicePoints.ecsRequestRouting/ }), 'true'); + + expect(screen.queryByText(/settings.servicePoints.pickupLocation/)).not.toBeInTheDocument(); + }); + + it('should not render pick location', () => { + userEvent.selectOptions(screen.getByRole('combobox', { name: /settings.servicePoints.ecsRequestRouting/ }), 'false'); + + expect(screen.queryByText(/settings.servicePoints.pickupLocation/)).toBeInTheDocument(); + }); }); describe('when pick location is yes', () => { @@ -97,7 +119,7 @@ describe('ServicePointFormContainer', () => { describe('when hold shelf expiry interval id is short term period Days', () => { beforeEach(() => { - userEvent.selectOptions(screen.getAllByRole('combobox')[1], 'Days'); + userEvent.selectOptions(screen.getAllByRole('combobox')[2], 'Days'); }); it('should render ServicePointFormContainer closed library date management select with changed options ', () => { diff --git a/src/settings/ServicePoints/ServicePointManager.js b/src/settings/ServicePoints/ServicePointManager.js index 8d50b1d..090b7b6 100644 --- a/src/settings/ServicePoints/ServicePointManager.js +++ b/src/settings/ServicePoints/ServicePointManager.js @@ -7,13 +7,14 @@ import { TitleManager } from '@folio/stripes/core'; import { injectIntl } from 'react-intl'; import ServicePointDetail from './ServicePointDetail'; import ServicePointFormContainer from './ServicePointFormContainer'; +import { getEcsTlrFeature } from './utils'; class ServicePointManager extends React.Component { static manifest = Object.freeze({ entries: { type: 'okapi', records: 'servicepoints', - path: 'service-points?query=cql.allRecords=1 sortby name&limit=1000', + path: 'service-points?query=cql.allRecords=1 sortby name&limit=1000&includeRoutingServicePoints=true', resourceShouldRefresh: true, throwErrors: false, POST: { @@ -49,6 +50,11 @@ class ServicePointManager extends React.Component { limit: '1000', }, }, + settings: { + type: 'okapi', + path: 'circulation/settings?query=(name==ecsTlrFeature)', + records: 'circulationSettings', + }, }); static propTypes = { @@ -57,6 +63,9 @@ class ServicePointManager extends React.Component { entries: PropTypes.shape({ records: PropTypes.arrayOf(PropTypes.object), }), + settings: PropTypes.shape({ + records: PropTypes.arrayOf(PropTypes.object), + }), staffSlips: PropTypes.object, }).isRequired, mutator: PropTypes.shape({ @@ -87,6 +96,8 @@ class ServicePointManager extends React.Component { } render() { + const { resources } = this.props; + const titleLevelRequestsFeatureEnabled = getEcsTlrFeature(resources?.settings?.records); let entryList = sortBy((this.props.resources.entries || {}).records || [], ['name']); entryList = entryList.map(item => { item.pickupLocation = item.pickupLocation || false; @@ -117,6 +128,7 @@ class ServicePointManager extends React.Component { nameKey="name" editable={isEditable} permissions={permissions} + titleLevelRequestsFeatureEnabled={titleLevelRequestsFeatureEnabled} /> ); diff --git a/src/settings/ServicePoints/utils.js b/src/settings/ServicePoints/utils.js index 9df8108..0ac4b4c 100644 --- a/src/settings/ServicePoints/utils.js +++ b/src/settings/ServicePoints/utils.js @@ -1,5 +1,6 @@ import React from 'react'; import { FormattedMessage } from 'react-intl'; +import { get } from 'lodash'; export const validateServicePointForm = (values) => { const errors = {}; @@ -53,3 +54,15 @@ export const getUniquenessValidation = (field, mutator) => { }); }; }; + +export const isEcsRequestRoutingVisible = (titleLevelRequestsFeatureEnabled) => ( + !!titleLevelRequestsFeatureEnabled +); + +export const isEcsRequestRoutingAssociatedFieldsVisible = (titleLevelRequestsFeatureEnabled, ecsRequestRouting) => ( + (isEcsRequestRoutingVisible(titleLevelRequestsFeatureEnabled) && !ecsRequestRouting) || !isEcsRequestRoutingVisible(titleLevelRequestsFeatureEnabled) +); + +export const getEcsTlrFeature = (data = []) => ( + get(data, '[0].value.enabled', false) +); diff --git a/src/settings/ServicePoints/utils.test.js b/src/settings/ServicePoints/utils.test.js new file mode 100644 index 0000000..0bdd987 --- /dev/null +++ b/src/settings/ServicePoints/utils.test.js @@ -0,0 +1,63 @@ +import { + isEcsRequestRoutingVisible, + isEcsRequestRoutingAssociatedFieldsVisible, + getEcsTlrFeature, +} from './utils'; + +describe('isEcsRequestRoutingVisible', () => { + it('should return true when titleLevelRequestsFeatureEnabled true', () => { + expect(isEcsRequestRoutingVisible(true)).toBe(true); + }); + + it('should return false when titleLevelRequestsFeatureEnabled false', () => { + expect(isEcsRequestRoutingVisible(false)).toBe(false); + }); + + it('should return false when titleLevelRequestsFeatureEnabled absent', () => { + expect(isEcsRequestRoutingVisible(undefined)).toBe(false); + }); +}); + +describe('isEcsRequestRoutingAssociatedFieldsVisible', () => { + it('should return false when both condition true', () => { + expect(isEcsRequestRoutingAssociatedFieldsVisible(true, true)).toBe(false); + }); + + it('should return true when first condition false', () => { + expect(isEcsRequestRoutingAssociatedFieldsVisible(false, true)).toBe(true); + }); + + it('should return true when second condition false', () => { + expect(isEcsRequestRoutingAssociatedFieldsVisible(true, false)).toBe(true); + }); + + it('should return true when both condition false', () => { + expect(isEcsRequestRoutingAssociatedFieldsVisible(false, false)).toBe(true); + }); +}); + +describe('getEcsTlrFeature', () => { + it('should return true when ecsTlrFeature true', () => { + const data = [{ + value: { + enabled: true, + }, + }]; + + expect(getEcsTlrFeature(data)).toBe(true); + }); + + it('should return false when ecsTlrFeature false', () => { + const data = [{ + value: { + enabled: false, + }, + }]; + + expect(getEcsTlrFeature(data)).toBe(false); + }); + + it('should return false when ecsTlrFeature absent', () => { + expect(getEcsTlrFeature(undefined)).toBe(false); + }); +}); diff --git a/translations/ui-tenant-settings/en.json b/translations/ui-tenant-settings/en.json index 3e45643..98e7aa9 100644 --- a/translations/ui-tenant-settings/en.json +++ b/translations/ui-tenant-settings/en.json @@ -139,6 +139,7 @@ "settings.servicePoints.code": "Code", "settings.servicePoints.discoveryDisplayName": "Discovery display name", "settings.servicePoints.description": "Description", + "settings.servicePoints.ecsRequestRouting": "Routing service point", "settings.servicePoints.shelvingLagTime": "Shelving lag time (minutes)", "settings.servicePoints.pickupLocation": "Pickup location", "settings.servicePoints.feeFineOwner": "Fee fine owner", @@ -165,8 +166,8 @@ "settings.servicePoints.validation.numeric": "Please enter a number to continue", "settings.servicePoints.validation.name.unique": "Service point name must be unique", "settings.servicePoints.validation.code.unique": "Code must be unique", - "settings.servicePoints.pickupLocation.yes": "Yes", - "settings.servicePoints.pickupLocation.no": "No", + "settings.servicePoints.value.yes": "Yes", + "settings.servicePoints.value.no": "No", "settings.intervalPeriod.minutes": "Minutes", "settings.intervalPeriod.hours": "Hours", "settings.intervalPeriod.days": "Days", @@ -232,6 +233,6 @@ "settings.confirmPickupLocationChangeModal.title": "Confirm Pickup location change", "settings.confirmPickupLocationChangeModal.message": "Changing this Pickup location from \"Yes\" to \"No\" will remove it from existing Request policies and affect all Circulation rules using the policies.", - "settings.confirmPickupLocationChangeModal.button.confirm": "Confirm", - "settings.confirmPickupLocationChangeModal.button.cancel": "Back" + "settings.modal.button.confirm": "Confirm", + "settings.modal.button.cancel": "Back" }