From ce0311a3bc58434d7cf8bbf4d2021e0defdd7106 Mon Sep 17 00:00:00 2001 From: Dmitriy-Litvinenko Date: Fri, 13 Sep 2024 13:10:20 +0300 Subject: [PATCH 1/9] UIREQ-1150: Update upload-artifact actions from v1 and v2 to v4 --- .github/workflows/build-npm-release.yml | 4 ++-- .github/workflows/build-npm.yml | 4 ++-- CHANGELOG.md | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-npm-release.yml b/.github/workflows/build-npm-release.yml index 016adef2..e8fdd4ac 100644 --- a/.github/workflows/build-npm-release.yml +++ b/.github/workflows/build-npm-release.yml @@ -150,7 +150,7 @@ jobs: comment_title: Jest Unit Test Statistics - name: Publish Jest coverage report - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 if: always() with: name: jest-coverage-report @@ -158,7 +158,7 @@ jobs: retention-days: 30 - name: Publish yarn.lock - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 if: failure() with: name: yarn.lock diff --git a/.github/workflows/build-npm.yml b/.github/workflows/build-npm.yml index 824aee33..b529c196 100644 --- a/.github/workflows/build-npm.yml +++ b/.github/workflows/build-npm.yml @@ -93,7 +93,7 @@ jobs: comment_title: Jest Unit Test Statistics - name: Publish Jest coverage report - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 if: always() with: name: jest-coverage-report @@ -101,7 +101,7 @@ jobs: retention-days: 30 - name: Publish yarn.lock - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 if: failure() with: name: yarn.lock diff --git a/CHANGELOG.md b/CHANGELOG.md index 84de407f..6a17506d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * Fix issue with Proxy's patron group and delivery address that shown instead of Sponsor's when creating request. Refs UIREQ-1132, UIREQ-1133. * Add missing sub-permissions to fetch staff slips records. Refs UIREQ-1129. * Add missing sub-permissions to fetch "pick-slips" and "search-slips" records in "Requests: View, edit, cancel" permission. Refs UIREQ-1137. +* Update upload-artifact actions from v1 and v2 to v4. Refs UIREQ-1150. ## [9.1.1] (https://github.com/folio-org/ui-checkin/tree/v9.1.1) (2024-03-27) [Full Changelog](https://github.com/folio-org/ui-checkin/compare/v9.1.0...v9.1.1) From 91729afd5b4af8fbcc6e1715cc543482b0289b6b Mon Sep 17 00:00:00 2001 From: Manvendra <105021655+manvendra-s-rathore@users.noreply.github.com> Date: Fri, 13 Sep 2024 18:12:57 +0530 Subject: [PATCH 2/9] UIREQ-1130 - Optimize 'print-events-entry' API slowness on initial call (#1198) * test UIREQ-1130 * UIREQ-1130 - optimize print-events-entry api performance * UIREQ-1130 - remove console logs * upgrade upload artifact version in workflow files --- CHANGELOG.md | 1 + src/components/PrintButton/PrintButton.js | 6 ++--- src/routes/RequestsRoute.js | 29 +++++++++++++---------- src/routes/RequestsRoute.test.js | 4 ++-- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a17506d..0602e00c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ * Add missing sub-permissions to fetch staff slips records. Refs UIREQ-1129. * Add missing sub-permissions to fetch "pick-slips" and "search-slips" records in "Requests: View, edit, cancel" permission. Refs UIREQ-1137. * Update upload-artifact actions from v1 and v2 to v4. Refs UIREQ-1150. +* Optimize performance of the "print-events-entry" API to reduce slowness during the initial call. Refs UIREQ-1130. ## [9.1.1] (https://github.com/folio-org/ui-checkin/tree/v9.1.1) (2024-03-27) [Full Changelog](https://github.com/folio-org/ui-checkin/compare/v9.1.0...v9.1.1) diff --git a/src/components/PrintButton/PrintButton.js b/src/components/PrintButton/PrintButton.js index df76284f..0782c06d 100644 --- a/src/components/PrintButton/PrintButton.js +++ b/src/components/PrintButton/PrintButton.js @@ -40,9 +40,9 @@ class PrintButton extends React.Component { this.props.onBeforeGetContent(); } - handleBeforePrint = () => { - this.props.onBeforePrint([this.props.requestId]); - } + handleBeforePrint = async () => { + await this.props.onBeforePrint([this.props.requestId]); + }; renderTriggerButton = () => { const fieldsToSkip = ['contentRef', 'onBeforePrint', 'onAfterPrint', 'onBeforeGetContent']; diff --git a/src/routes/RequestsRoute.js b/src/routes/RequestsRoute.js index fd96fe8a..4813a942 100644 --- a/src/routes/RequestsRoute.js +++ b/src/routes/RequestsRoute.js @@ -1290,18 +1290,23 @@ class RequestsRoute extends React.Component { ); }; - savePrintEventDetails = (requestIds) => { + savePrintEventDetails = async (requestIds) => { const currDateTime = new Date(); const printTimeStamp = currDateTime.toISOString(); const { id: loggedInUserId, username: loggedInUsername } = this.props.stripes.user.user; - this.props.mutator.savePrintDetails.POST({ - 'requestIds' : requestIds, - 'requesterName' : loggedInUsername, - 'requesterId' : loggedInUserId, - 'printEventDate' : printTimeStamp - }); - } + try { + await this.props.mutator.savePrintDetails.POST({ + 'requestIds': requestIds, + 'requesterName': loggedInUsername, + 'requesterId': loggedInUserId, + 'printEventDate': printTimeStamp + }); + } catch (error) { + // eslint-disable-next-line no-console + console.error('Failed to save print event details:', error); + } + }; onBeforeGetContentForPrintButton = (onToggle) => ( new Promise(resolve => { @@ -1519,10 +1524,10 @@ class RequestsRoute extends React.Component { template={pickSlipsPrintTemplate} contentRef={this.pickSlipsPrintContentRef} onBeforeGetContent={() => this.onBeforeGetContentForPrintButton(onToggle)} - onBeforePrint={() => { + onBeforePrint={async () => { if (isViewPrintDetailsEnabled) { const requestIds = extractPickSlipRequestIds(pickSlipsData); - this.savePrintEventDetails(requestIds); + await this.savePrintEventDetails(requestIds); } }} > @@ -1548,11 +1553,11 @@ class RequestsRoute extends React.Component { }) } onBeforePrint={ - () => { + async () => { if (isViewPrintDetailsEnabled) { const selectedPickSlips = getSelectedSlipDataMulti(pickSlipsData, selectedRows); const selectedRequestIds = extractPickSlipRequestIds(selectedPickSlips); - this.savePrintEventDetails(selectedRequestIds); + await this.savePrintEventDetails(selectedRequestIds); } } } diff --git a/src/routes/RequestsRoute.test.js b/src/routes/RequestsRoute.test.js index 51945576..51881c05 100644 --- a/src/routes/RequestsRoute.test.js +++ b/src/routes/RequestsRoute.test.js @@ -136,8 +136,8 @@ jest.mock('../components', () => ({ children, }) => { const handleClick = () => { - onBeforeGetContent(); - onBeforePrint(); + Promise.resolve(onBeforeGetContent()); + Promise.resolve(onBeforePrint()); }; return (
From e4d5226b1622354acd3b5a1299ae819f744f8fb7 Mon Sep 17 00:00:00 2001 From: Artem Blazhko Date: Mon, 16 Sep 2024 15:48:39 +0300 Subject: [PATCH 3/9] Update changelog after release (#1200) --- CHANGELOG.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0602e00c..4dfa4c77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,6 @@ * Use Save & close button label stripes-component translation key. Refs UIREQ-1073. * Include single print and selection print options on results list and actions menu. Refs UIREQ-966. * Set up default pickup service point if it is available. Refs UIREQ-1095. -* Remove bigtests from github actions. Refs UIREQ-1099. * Fix Request detail pane capitalization. Refs UIREQ-1106. * Update the column labels. Refs UIREQ-1104. * Add "Printed" and "# Copies" columns in "Show Columns" list and Request records table. Refs UIREQ-1118. @@ -14,14 +13,19 @@ * Populate the token "staffUsername" in the pick slip. Refs UIREQ-1124. * Implement availability of "Printed" and "# Copies" columns upon "Enable view print details (Pick slips)" configuration. Refs UIREQ-1121. * Implement availability of "Print status" filters upon "Enable view print details (Pick slips)" configuration. Refs UIREQ-1119. -* Fix issue with Proxy's patron group and delivery address that shown instead of Sponsor's when creating request. Refs UIREQ-1132, UIREQ-1133. * Add missing sub-permissions to fetch staff slips records. Refs UIREQ-1129. * Add missing sub-permissions to fetch "pick-slips" and "search-slips" records in "Requests: View, edit, cancel" permission. Refs UIREQ-1137. -* Update upload-artifact actions from v1 and v2 to v4. Refs UIREQ-1150. * Optimize performance of the "print-events-entry" API to reduce slowness during the initial call. Refs UIREQ-1130. -## [9.1.1] (https://github.com/folio-org/ui-checkin/tree/v9.1.1) (2024-03-27) -[Full Changelog](https://github.com/folio-org/ui-checkin/compare/v9.1.0...v9.1.1) +## [9.1.2] (https://github.com/folio-org/ui-requests/tree/v9.1.2) (2024-09-13) +[Full Changelog](https://github.com/folio-org/ui-requests/compare/v9.1.1...v9.1.2) + +* Remove bigtests from github actions. Refs UIREQ-1099. +* Fix issue with Proxy's patron group and delivery address that shown instead of Sponsor's when creating request. Refs UIREQ-1132, UIREQ-1133. +* Update upload-artifact actions from v1 and v2 to v4. Refs UIREQ-1150. + +## [9.1.1] (https://github.com/folio-org/ui-requests/tree/v9.1.1) (2024-03-27) +[Full Changelog](https://github.com/folio-org/ui-requests/compare/v9.1.0...v9.1.1) * Add support for Barcode tag with sanitize. Refs UIREQ-1080, UIREQ-1082. From bd0ec5ea76ada2efbab925e9ff242a4f4921cdef Mon Sep 17 00:00:00 2001 From: Manvendra <105021655+manvendra-s-rathore@users.noreply.github.com> Date: Wed, 18 Sep 2024 23:41:46 +0530 Subject: [PATCH 4/9] UIREQ-1146 - Revert the custom "Print Status" filter code implementation (#1202) * UIREQ-1146 - revert Custom PrintStatus Filter implementation code * UIREQ-1146 - revert Custom PrintStatus Filter implementation code * UIREQ-1146 - revert custom PrintStatus filter code --- CHANGELOG.md | 1 + src/routes/RequestsRoute.js | 69 ++++------------------------- src/routes/RequestsRoute.test.js | 42 ------------------ src/routes/utils.js | 22 ---------- src/routes/utils.test.js | 74 -------------------------------- 5 files changed, 9 insertions(+), 199 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dfa4c77..5743ad20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ * Add missing sub-permissions to fetch staff slips records. Refs UIREQ-1129. * Add missing sub-permissions to fetch "pick-slips" and "search-slips" records in "Requests: View, edit, cancel" permission. Refs UIREQ-1137. * Optimize performance of the "print-events-entry" API to reduce slowness during the initial call. Refs UIREQ-1130. +* Revert Custom "Print Status" filter code implementation. Refs UIREQ-1146. ## [9.1.2] (https://github.com/folio-org/ui-requests/tree/v9.1.2) (2024-09-13) [Full Changelog](https://github.com/folio-org/ui-requests/compare/v9.1.1...v9.1.2) diff --git a/src/routes/RequestsRoute.js b/src/routes/RequestsRoute.js index 4813a942..8587f41d 100644 --- a/src/routes/RequestsRoute.js +++ b/src/routes/RequestsRoute.js @@ -65,7 +65,6 @@ import { DEFAULT_REQUEST_TYPE_VALUE, INPUT_REQUEST_SEARCH_SELECTOR, PRINT_DETAILS_COLUMNS, - requestFilterTypes, } from '../constants'; import { buildUrl, @@ -101,8 +100,6 @@ import { getFormattedYears, getStatusQuery, getFullNameForCsvRecords, - getPrintStatusFilteredData, - filterRecordsByPrintStatus, } from './utils'; import SinglePrintButtonForPickSlip from '../components/SinglePrintButtonForPickSlip'; @@ -291,8 +288,6 @@ export const buildHoldRecords = (records) => { }); }; -export const viewPrintDetailsPath = 'circulationSettings.records[0].value.enablePrintLog'; - class RequestsRoute extends React.Component { static contextType = CalloutContext; @@ -650,7 +645,6 @@ class RequestsRoute extends React.Component { titleLevelRequestsFeatureEnabled, createTitleLevelRequestsByDefault, isViewPrintDetailsEnabled: false, - selectedPrintStatusFilters: [], }; this.pickSlipsPrintContentRef = React.createRef(); @@ -662,7 +656,7 @@ class RequestsRoute extends React.Component { static getDerivedStateFromProps(props, state) { const layer = (props.resources.query || {}).layer; const newState = {}; - const currViewPrintDetailsSettings = get(props.resources, viewPrintDetailsPath) === 'true'; + const currViewPrintDetailsSettings = get(props.resources, 'circulationSettings.records[0].value.enablePrintLog') === 'true'; if (!layer) { newState.dupRequest = null; @@ -683,13 +677,13 @@ class RequestsRoute extends React.Component { componentDidUpdate(prevProps, prevState) { const patronBlocks = get(this.props.resources, ['patronBlocks', 'records'], []); const prevBlocks = get(prevProps.resources, ['patronBlocks', 'records'], []); - const { submitting, isViewPrintDetailsEnabled, selectedPrintStatusFilters } = this.state; + const { submitting, isViewPrintDetailsEnabled } = this.state; const prevExpired = prevBlocks.filter(p => moment(moment(p.expirationDate).format()).isSameOrBefore(moment().format()) && p.expirationDate) || []; const expired = patronBlocks.filter(p => moment(moment(p.expirationDate).format()).isSameOrBefore(moment().format()) && p.expirationDate) || []; const { id: currentServicePointId } = this.getCurrentServicePointInfo(); const prevStateServicePointId = get(prevProps.resources.currentServicePoint, 'id'); const { configs: prevConfigs } = prevProps.resources; - const { configs, query: { filters } } = this.props.resources; + const { configs } = this.props.resources; const instanceId = parse(this.props.location?.search)?.instanceId; if (prevExpired.length > 0 && expired.length === 0) { @@ -734,30 +728,6 @@ class RequestsRoute extends React.Component { if (isViewPrintDetailsEnabled !== prevState.isViewPrintDetailsEnabled && !isViewPrintDetailsEnabled) { this.columnHeadersMap = getFilteredColumnHeadersMap(this.columnHeadersMap); } - - if (filters?.includes(requestFilterTypes.PRINT_STATUS)) { - const printStatusFilterInQuery = this.getActiveFilters()[requestFilterTypes.PRINT_STATUS]; - - this.updateSelectedPrintStatusFilters(isViewPrintDetailsEnabled, selectedPrintStatusFilters, printStatusFilterInQuery); - } - } - - updateSelectedPrintStatusFilters(isViewPrintDetailsEnabled, selectedPrintStatusFilters, printStatusFilterInQuery) { - /** - * Updates the `selectedPrintStatusFilters` state based on pre selected filters when user navigates back to Request App. - * - * The function performs the following actions: - * 1. If `isViewPrintDetailsEnabled` is true and if `Print Status` filters contains exactly one filter: - * - it updates state to set `selectedPrintStatusFilters` to this one `Print Status` filter. - * - * 2. If `isViewPrintDetailsEnabled` is false and `filters` in query includes 'PRINT STATUS' filter: - * - it clears the 'PRINT STATUS' filter from query by invoking `handleFilterChange`. - */ - if (isViewPrintDetailsEnabled && selectedPrintStatusFilters.length === 0 && printStatusFilterInQuery?.length === 1) { - this.setState({ selectedPrintStatusFilters: [printStatusFilterInQuery[0]] }); - } else if (!isViewPrintDetailsEnabled && printStatusFilterInQuery?.length) { - this.handleFilterChange({ name: requestFilterTypes.PRINT_STATUS, values: [] }); - } } toggleAllRows = () => { @@ -834,11 +804,6 @@ class RequestsRoute extends React.Component { // Export function for the CSV search report action async exportData() { this.setState({ csvReportPending: true }); - const { isViewPrintDetailsEnabled, selectedPrintStatusFilters } = this.state; - - const activeFilters = this.getActiveFilters(); - const activeFilterKeys = Object.keys(activeFilters); - const isOnlyPrintStatusFilterSelected = activeFilterKeys.length === 1 && activeFilterKeys[0] === requestFilterTypes.PRINT_STATUS; // Build a custom query for the CSV record export, which has to include // all search and filter parameters @@ -846,21 +811,17 @@ class RequestsRoute extends React.Component { let queryString; const queryTerm = this.props.resources?.query?.query; - const filterQuery = filters2cql(RequestsFiltersConfig, deparseFilters(activeFilters)); + const filterQuery = filters2cql(RequestsFiltersConfig, deparseFilters(this.getActiveFilters())); if (queryTerm) { queryString = `(requesterId=="${queryTerm}" or requester.barcode="${queryTerm}*" or item.title="${queryTerm}*" or item.barcode=="${queryTerm}*" or itemId=="${queryTerm}")`; queryClauses.push(queryString); } if (filterQuery) queryClauses.push(filterQuery); - if (isOnlyPrintStatusFilterSelected) queryClauses.push('cql.allRecords=1'); queryString = queryClauses.join(' and '); const records = await this.fetchReportData(this.props.mutator.reportRecords, queryString); - - const printStatusFilteredRecords = isViewPrintDetailsEnabled && selectedPrintStatusFilters.length === 1 && - filterRecordsByPrintStatus(records, selectedPrintStatusFilters); - const recordsToCSV = this.buildRecords(printStatusFilteredRecords || records); + const recordsToCSV = this.buildRecords(records); exportCsv(recordsToCSV, { onlyFields: this.columnHeadersMap, @@ -1232,10 +1193,6 @@ class RequestsRoute extends React.Component { } handleFilterChange = ({ name, values }) => { - if (name === requestFilterTypes.PRINT_STATUS) { - this.setState({ selectedPrintStatusFilters: values }); - } - const { mutator } = this.props; const newFilters = { ...this.getActiveFilters(), @@ -1381,7 +1338,6 @@ class RequestsRoute extends React.Component { holdsShelfReportPending, createTitleLevelRequestsByDefault, isViewPrintDetailsEnabled, - selectedPrintStatusFilters, } = this.state; const isPrintHoldRequestsEnabled = getPrintHoldRequestsEnabled(resources.printHoldRequests); const { name: servicePointName } = this.getCurrentServicePointInfo(); @@ -1427,7 +1383,6 @@ class RequestsRoute extends React.Component { const isPickSlipsArePending = resources?.pickSlips?.isPending; const isSearchSlipsArePending = resources?.searchSlips?.isPending; - const isRequestsRecordsLoaded = resources.records.hasLoaded; const requestsEmpty = isEmpty(requests); const isPickSlipsEmpty = isEmpty(pickSlips); const isSearchSlipsEmpty = isEmpty(searchSlips); @@ -1436,14 +1391,6 @@ class RequestsRoute extends React.Component { const pickSlipsData = convertToSlipData(pickSlips, intl, timezone, locale, SLIPS_TYPE.PICK_SLIP, user); const searchSlipsData = convertToSlipData(searchSlips, intl, timezone, locale, SLIPS_TYPE.SEARCH_SLIP_HOLD_REQUESTS); let multiSelectPickSlipData = getSelectedSlipDataMulti(pickSlipsData, selectedRows); - /** - * For 'displayPrintStatusFilteredData' to be true the length of 'selectedPrintStatusFilters' must be 1. - * This is because we only filter data when exactly one PrintStatus filter is selected ([Printed] or [Not Printed]). - * If the filter array is empty or contains both filters ([] or [Printed, Not Printed]), - * no filtering is needed as the data should be used directly from the query response. - */ - const displayPrintStatusFilteredData = isViewPrintDetailsEnabled && - isRequestsRecordsLoaded && selectedPrintStatusFilters.length === 1; const resultsFormatter = getListFormatter( { @@ -1665,8 +1612,7 @@ class RequestsRoute extends React.Component { customPaneSub={this.renderPaneSub()} onCreate={this.create} onCloseNewRecord={this.handleCloseNewRecord} - parentResources={displayPrintStatusFilteredData ? - getPrintStatusFilteredData(resources, selectedPrintStatusFilters) : resources} + parentResources={resources} parentMutator={mutator} detailProps={{ onChangePatron: this.onChangePatron, @@ -1693,7 +1639,8 @@ class RequestsRoute extends React.Component { renderFilters={this.renderFilters} resultIsSelected={this.resultIsSelected} onFilterChange={this.handleFilterChange} - sortableColumns={['requestDate', 'title', 'year', 'itemBarcode', 'callNumber', 'type', 'requestStatus', 'position', 'servicePoint', 'requester', 'requesterBarcode', 'proxy']} + sortableColumns={['requestDate', 'title', 'year', 'itemBarcode', 'callNumber', 'type', 'requestStatus', + 'position', 'servicePoint', 'requester', 'requesterBarcode', 'proxy']} pageAmount={100} pagingType={MCLPagingTypes.PREV_NEXT} /> diff --git a/src/routes/RequestsRoute.test.js b/src/routes/RequestsRoute.test.js index 51881c05..d2bfa4fe 100644 --- a/src/routes/RequestsRoute.test.js +++ b/src/routes/RequestsRoute.test.js @@ -115,8 +115,6 @@ jest.mock('./utils', () => ({ ...jest.requireActual('./utils'), getFormattedYears: jest.fn(), getStatusQuery: jest.fn(), - filterRecordsByPrintStatus: jest.fn(), - getPrintStatusFilteredData: jest.fn(), })); jest.mock('../components', () => ({ ErrorModal: jest.fn(({ onClose }) => ( @@ -610,26 +608,6 @@ describe('RequestsRoute', () => { }); }); - it('should trigger "exportCsv" when only "Print Status" filter is selected', async () => { - const props = { - ...defaultProps, - resources: { - ...defaultProps.resources, - query: { - ...defaultProps.resources.query, - filters: 'printStatus.Printed', - }, - } - }; - cleanup(); - renderComponent(props); - await userEvent.click(screen.getByRole('button', { name: 'ui-requests.exportSearchResultsToCsv' })); - - await waitFor(() => { - expect(exportCsv).toHaveBeenCalled(); - }); - }); - it('should render "ErrorModal"', async () => { await userEvent.click(screen.getByTestId('exportExpiredHoldShelfToCsvButton')); @@ -652,26 +630,6 @@ describe('RequestsRoute', () => { await userEvent.click(screen.getByRole('button', { name: 'onFilterChange' })); - expect(defaultProps.mutator.query.update).toBeCalledWith(expectFilterValue); - }); - - it('should trigger "mutator.query.update" when "Print Status" filters are present in query', async () => { - const props = { - ...defaultProps, - resources: { - ...defaultProps.resources, - query: { - ...defaultProps.resources.query, - filters: 'filter1.value1,printStatus.Printed', - }, - } - }; - cleanup(); - renderComponent(props); - const expectFilterValue = { 'filters': 'filter1.value1,printStatus.Printed,filter4.Value4,filter4.Value5' }; - - await userEvent.click(screen.getByRole('button', { name: 'onFilterChange' })); - expect(defaultProps.mutator.query.update).toHaveBeenCalledWith(expectFilterValue); }); diff --git a/src/routes/utils.js b/src/routes/utils.js index 6d5b891f..e0a57d5c 100644 --- a/src/routes/utils.js +++ b/src/routes/utils.js @@ -1,7 +1,4 @@ -import { cloneDeep } from 'lodash'; - import { - requestPrintStatusType, requestStatuses, requestTypesMap, } from '../constants'; @@ -44,22 +41,3 @@ export const getFullNameForCsvRecords = (record) => { const { firstName = '', middleName = '', lastName = '' } = record; return [firstName, middleName, lastName].filter(Boolean).join(' '); }; - -export const filterRecordsByPrintStatus = (records, printStatusFilters) => { - const isPrintedFilterSelected = printStatusFilters[0] === requestPrintStatusType.PRINTED; - return records.filter(record => { - const hasCopiesCount = record?.printDetails?.count !== undefined; - - return isPrintedFilterSelected ? hasCopiesCount : !hasCopiesCount; - }); -}; - -export const getPrintStatusFilteredData = (resources, printStatusFilters) => { - const clonedResources = cloneDeep(resources); - const filteredRecords = filterRecordsByPrintStatus(clonedResources.records.records, printStatusFilters); - - clonedResources.records.records = filteredRecords; - clonedResources.records.other.totalRecords = filteredRecords.length; - - return clonedResources; -}; diff --git a/src/routes/utils.test.js b/src/routes/utils.test.js index 1e829c62..4fd3e619 100644 --- a/src/routes/utils.test.js +++ b/src/routes/utils.test.js @@ -1,6 +1,4 @@ -import { cloneDeep } from 'lodash'; import { - requestPrintStatusType, requestStatuses, requestTypesMap, } from '../constants'; @@ -11,8 +9,6 @@ import { isReorderableRequest, getStatusQuery, getFullNameForCsvRecords, - filterRecordsByPrintStatus, - getPrintStatusFilteredData, } from './utils'; describe('utils', () => { @@ -189,74 +185,4 @@ describe('utils', () => { expect(getFullNameForCsvRecords(record)).toBe(''); }); }); - - describe('filterRecordsByPrintStatus', () => { - const records = [ - { id: 'a', printDetails: { count: 5 } }, - { id: 'b', printDetails: null }, - { id: 'c', printDetails: undefined }, - ]; - - it('should filter and return only printed records when PRINTED filter is selected', () => { - const printStatusFilters = [requestPrintStatusType.PRINTED]; - const result = filterRecordsByPrintStatus(records, printStatusFilters); - expect(result).toEqual([ - { id: 'a', printDetails: { count: 5 } } - ]); - }); - - it('should filter and return only non-printed records when NOT_PRINTED filter is selected', () => { - const printStatusFilters = [requestPrintStatusType.NOT_PRINTED]; - const result = filterRecordsByPrintStatus(records, printStatusFilters); - expect(result).toEqual([ - { id: 'b', printDetails: null }, - { id: 'c', printDetails: undefined } - ]); - }); - }); - - describe('getPrintStatusFilteredData', () => { - const resources = { - records: { - records: [ - { id: 1, printDetails: { count: 5 } }, - { id: 2, printDetails: null }, - { id: 3, printDetails: undefined }, - ], - other: { - totalRecords: 3 - } - } - }; - - it('should return resources with only printed records when PRINTED filter is selected', () => { - const printStatusFilters = [requestPrintStatusType.PRINTED]; - const result = getPrintStatusFilteredData(resources, printStatusFilters); - - expect(result.records.records).toEqual([ - { id: 1, printDetails: { count: 5 } } - ]); - expect(result.records.other.totalRecords).toBe(1); - }); - - it('should return resources with only non-printed records when NOT_PRINTED filter is selected', () => { - const printStatusFilters = [requestPrintStatusType.NOT_PRINTED]; - const result = getPrintStatusFilteredData(resources, printStatusFilters); - - expect(result.records.records).toEqual([ - { id: 2, printDetails: null }, - { id: 3, printDetails: undefined } - ]); - expect(result.records.other.totalRecords).toBe(2); - }); - - it('should not modify the original resources object', () => { - const printStatusFilters = [requestPrintStatusType.PRINTED]; - const clonedResources = cloneDeep(resources); - - getPrintStatusFilteredData(resources, printStatusFilters); - - expect(resources).toEqual(clonedResources); - }); - }); }); From 9f9d451ccc568e251ddc68b5883208fcb6b7c64e Mon Sep 17 00:00:00 2001 From: Manvendra <105021655+manvendra-s-rathore@users.noreply.github.com> Date: Thu, 19 Sep 2024 18:19:41 +0530 Subject: [PATCH 5/9] UIREQ-1140 - Add Sorting to 'Copies' and 'Printed' columns in Requests table (#1205) * UIREQ-1146 - revert Custom PrintStatus Filter implementation code * UIREQ-1146 - revert Custom PrintStatus Filter implementation code * UIREQ-1140 - add sorting to Copies and Printed column * UIREQ-1146 - revert custom PrintStatus filter code * UIREQ-1140 - update printDetails data mapping * UIREQ-1140 - refactor componentDidUpdate * UIREQ-1140 - add test cases for mutator query updation * UIREQ-1140 - refactor * fix index.test.js failing test case * UIREQ-1140 - refactor --- CHANGELOG.md | 1 + src/constants.js | 2 +- src/index.test.js | 2 +- src/routes/RequestsRoute.js | 35 +++++++++++------ src/routes/RequestsRoute.test.js | 66 ++++++++++++++++++++------------ src/routes/utils.js | 7 ++++ src/routes/utils.test.js | 21 ++++++++++ translations/ui-requests/en.json | 2 +- 8 files changed, 97 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5743ad20..1b85ac15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * Add missing sub-permissions to fetch "pick-slips" and "search-slips" records in "Requests: View, edit, cancel" permission. Refs UIREQ-1137. * Optimize performance of the "print-events-entry" API to reduce slowness during the initial call. Refs UIREQ-1130. * Revert Custom "Print Status" filter code implementation. Refs UIREQ-1146. +* Add sorting to 'Printed' and '# Copies' columns in the Request App. Refs UIREQ-1140. ## [9.1.2] (https://github.com/folio-org/ui-requests/tree/v9.1.2) (2024-09-13) [Full Changelog](https://github.com/folio-org/ui-requests/compare/v9.1.1...v9.1.2) diff --git a/src/constants.js b/src/constants.js index 895d81f2..c2ef1644 100644 --- a/src/constants.js +++ b/src/constants.js @@ -170,7 +170,7 @@ export const requestableItemStatuses = [ ]; export const PRINT_DETAILS_COLUMNS = { - COPIES: 'printDetails.count', + COPIES: 'printDetails.printCount', PRINTED: 'printDetails.lastPrintedDetails', }; diff --git a/src/index.test.js b/src/index.test.js index 03399b5d..e082153f 100644 --- a/src/index.test.js +++ b/src/index.test.js @@ -62,7 +62,7 @@ describe('UI Requests', () => { it('should close keyboard shortcuts modal on clicking close button', () => { fireEvent.click(screen.getByText(labelIds.keyboardShortcuts)); - const button = screen.getByRole('button', { name: /stripes-components.dismissModal/i }); + const button = screen.getByLabelText('stripes-components.dismissModal'); fireEvent.click(button); diff --git a/src/routes/RequestsRoute.js b/src/routes/RequestsRoute.js index 8587f41d..0ec87a02 100644 --- a/src/routes/RequestsRoute.js +++ b/src/routes/RequestsRoute.js @@ -100,6 +100,7 @@ import { getFormattedYears, getStatusQuery, getFullNameForCsvRecords, + updateQuerySortString, } from './utils'; import SinglePrintButtonForPickSlip from '../components/SinglePrintButtonForPickSlip'; @@ -127,8 +128,8 @@ export const extractPickSlipRequestIds = (pickSlipsData) => { export const getLastPrintedDetails = (printDetails, intl) => { const fullName = getFullName(printDetails?.lastPrintRequester); - const formattedDate = intl.formatDate(printDetails?.lastPrintedDate); - const formattedTime = intl.formatTime(printDetails?.lastPrintedDate); + const formattedDate = intl.formatDate(printDetails?.printEventDate); + const formattedTime = intl.formatTime(printDetails?.printEventDate); const localizedDateTime = `${formattedDate}${formattedTime ? ', ' : ''}${formattedTime}`; return fullName + ' ' + localizedDateTime; @@ -333,6 +334,8 @@ class RequestsRoute extends React.Component { 'requestDate': 'requestDate', 'position': 'position/number', 'proxy': 'proxy', + 'copies': 'printDetails.printCount/number', + 'printed': 'printDetails.printEventDate', }, RequestsFiltersConfig, 2, // do not fetch unless we have a query or a filter @@ -683,8 +686,9 @@ class RequestsRoute extends React.Component { const { id: currentServicePointId } = this.getCurrentServicePointInfo(); const prevStateServicePointId = get(prevProps.resources.currentServicePoint, 'id'); const { configs: prevConfigs } = prevProps.resources; - const { configs } = this.props.resources; - const instanceId = parse(this.props.location?.search)?.instanceId; + const { resources, location, mutator } = this.props; + const { configs, query } = resources; + const instanceId = parse(location?.search)?.instanceId; if (prevExpired.length > 0 && expired.length === 0) { // eslint-disable-next-line react/no-did-update-set-state @@ -695,8 +699,8 @@ class RequestsRoute extends React.Component { // eslint-disable-next-line react/no-did-update-set-state this.setState({ submitting: true }); expired.forEach(p => { - this.props.mutator.activeRecord.update({ blockId: p.id }); - this.props.mutator.patronBlocks.DELETE({ id: p.id }); + mutator.activeRecord.update({ blockId: p.id }); + mutator.patronBlocks.DELETE({ id: p.id }); }); } @@ -717,17 +721,24 @@ class RequestsRoute extends React.Component { }); } - if (!this.props.resources.query.instanceId && instanceId) { - this.props.mutator.query.update({ instanceId }); + if (!query.instanceId && instanceId) { + mutator.query.update({ instanceId }); } - if (!this.props.resources.records.isPending) { - this.onSearchComplete(this.props.resources.records); + if (!resources.records.isPending) { + this.onSearchComplete(resources.records); } if (isViewPrintDetailsEnabled !== prevState.isViewPrintDetailsEnabled && !isViewPrintDetailsEnabled) { this.columnHeadersMap = getFilteredColumnHeadersMap(this.columnHeadersMap); } + + if (!isViewPrintDetailsEnabled && (query.sort?.includes('printed') || query.sort?.includes('copies'))) { + // Remove 'copies' and 'printed' from query sorting when the user disables + // 'Enable view print details (Pick slips)' in settings and returns to the Requests App. + const sort = updateQuerySortString(query.sort); + mutator.query.update({ sort }); + } } toggleAllRows = () => { @@ -887,7 +898,7 @@ class RequestsRoute extends React.Component { } if (record.printDetails) { const fullName = getFullNameForCsvRecords(record.printDetails.lastPrintRequester); - const lastPrintedDate = record.printDetails.lastPrintedDate || ''; + const lastPrintedDate = record.printDetails.printEventDate || ''; const date = lastPrintedDate ? `, ${lastPrintedDate}` : ''; record.printDetails.lastPrintedDetails = `${fullName}${date}`; @@ -1640,7 +1651,7 @@ class RequestsRoute extends React.Component { resultIsSelected={this.resultIsSelected} onFilterChange={this.handleFilterChange} sortableColumns={['requestDate', 'title', 'year', 'itemBarcode', 'callNumber', 'type', 'requestStatus', - 'position', 'servicePoint', 'requester', 'requesterBarcode', 'proxy']} + 'position', 'servicePoint', 'requester', 'requesterBarcode', 'proxy', 'copies', 'printed']} pageAmount={100} pagingType={MCLPagingTypes.PREV_NEXT} /> diff --git a/src/routes/RequestsRoute.test.js b/src/routes/RequestsRoute.test.js index d2bfa4fe..2a4ae0bd 100644 --- a/src/routes/RequestsRoute.test.js +++ b/src/routes/RequestsRoute.test.js @@ -232,8 +232,8 @@ const mockedRequest = { id: 'requestId', }; const printDetailsMockData = { - count: 11, - lastPrintedDate: '2024-08-03T13:33:31.868Z', + printCount: 11, + printEventDate: '2024-08-03T13:33:31.868Z', lastPrintRequester: { firstName: 'firstName', middleName: 'middleName', lastName: 'lastName' }, }; @@ -771,28 +771,46 @@ describe('RequestsRoute', () => { }); describe('When "isViewPrintDetailsEnabled" is false', () => { - it('should not trigger "mutator.savePrintDetails.POST"', async () => { - const props = { - ...defaultProps, - resources: { - ...defaultProps.resources, - circulationSettings: { - ...defaultProps.resources.circulationSettings, - records: defaultProps.resources.circulationSettings.records.map(record => ({ - ...record, - value: { - ...record.value, - enablePrintLog: 'false' - } - })) - }, + const getPropsWithSortInQuery = (sortString = '') => ({ + ...defaultProps, + resources: { + ...defaultProps.resources, + circulationSettings: { + ...defaultProps.resources.circulationSettings, + records: defaultProps.resources.circulationSettings.records.map(record => ({ + ...record, + value: { + ...record.value, + enablePrintLog: 'false' + } + })) + }, + query: { + ...defaultProps.resources.query, + sort: sortString, } - }; - renderComponent(props); + } + }); + it('should not trigger "mutator.savePrintDetails.POST"', async () => { + renderComponent(getPropsWithSortInQuery()); await userEvent.click(screen.getAllByRole('button', { name: 'PrintButton' })[0]); expect(defaultProps.mutator.savePrintDetails.POST).not.toHaveBeenCalled(); }); + + it('should trigger "mutator.query.update" when "copies" is present in the query sort string', () => { + renderComponent(getPropsWithSortInQuery('copies,requestDate')); + const expectedProps = { 'sort': 'requestDate' }; + + expect(defaultProps.mutator.query.update).toHaveBeenCalledWith(expectedProps); + }); + + it('should trigger "mutator.query.update" when "printed" is present in the query sort string', () => { + renderComponent(getPropsWithSortInQuery('-printed,requestDate')); + const expectedProps = { 'sort': 'requestDate' }; + + expect(defaultProps.mutator.query.update).toHaveBeenCalledWith(expectedProps); + }); }); }); @@ -1301,7 +1319,7 @@ describe('RequestsRoute', () => { describe('when formatting copies column', () => { it('should return copies for copies column', () => { - expect(listFormatter.copies(requestWithData)).toBe(requestWithData.printDetails.count); + expect(listFormatter.copies(requestWithData)).toBe(requestWithData.printDetails.printCount); }); }); @@ -1309,8 +1327,8 @@ describe('RequestsRoute', () => { it('should return last printed details for printed column', () => { getFullName.mockReturnValueOnce('lastName, firstName middleName'); - const expectedFormattedDate = intl.formatDate(requestWithData.printDetails.lastPrintedDate); - const expectedFormattedTime = intl.formatTime(requestWithData.printDetails.lastPrintedDate); + const expectedFormattedDate = intl.formatDate(requestWithData.printDetails.printEventDate); + const expectedFormattedTime = intl.formatTime(requestWithData.printDetails.printEventDate); const expectedOutput = `lastName, firstName middleName ${expectedFormattedDate}${expectedFormattedTime ? ', ' : ''}${expectedFormattedTime}`; @@ -1362,8 +1380,8 @@ describe('RequestsRoute', () => { it('should return the formatted full name and date/time correctly', () => { const printedDetails = getLastPrintedDetails(lastPrintDetails, intl); - const expectedFormattedDate = intl.formatDate(lastPrintDetails.lastPrintedDate); - const expectedFormattedTime = intl.formatTime(lastPrintDetails.lastPrintedDate); + const expectedFormattedDate = intl.formatDate(lastPrintDetails.printEventDate); + const expectedFormattedTime = intl.formatTime(lastPrintDetails.printEventDate); const expectedOutput = `lastName, firstName middleName ${expectedFormattedDate}${expectedFormattedTime ? ', ' : ''}${expectedFormattedTime}`; diff --git a/src/routes/utils.js b/src/routes/utils.js index e0a57d5c..fb27ab5b 100644 --- a/src/routes/utils.js +++ b/src/routes/utils.js @@ -41,3 +41,10 @@ export const getFullNameForCsvRecords = (record) => { const { firstName = '', middleName = '', lastName = '' } = record; return [firstName, middleName, lastName].filter(Boolean).join(' '); }; + +export const updateQuerySortString = (queryString) => { + const substringsToRemove = ['printed', 'copies', '-copies', '-printed']; + const filteredQueryString = queryString.split(',').filter(part => !substringsToRemove.includes(part)); + + return filteredQueryString.join(',') || 'requestDate'; +}; diff --git a/src/routes/utils.test.js b/src/routes/utils.test.js index 4fd3e619..e1bcb329 100644 --- a/src/routes/utils.test.js +++ b/src/routes/utils.test.js @@ -9,6 +9,7 @@ import { isReorderableRequest, getStatusQuery, getFullNameForCsvRecords, + updateQuerySortString, } from './utils'; describe('utils', () => { @@ -185,4 +186,24 @@ describe('utils', () => { expect(getFullNameForCsvRecords(record)).toBe(''); }); }); + + describe('updateQuerySortString', () => { + it('should return the same string if no removable substrings are present', () => { + const prop = 'title,requestDate'; + const expectedOutput = 'title,requestDate'; + expect(updateQuerySortString(prop)).toBe(expectedOutput); + }); + + it('should remove removable substrings and return non-removable substrings', () => { + const prop = 'title,printed'; + const expectedOutput = 'title'; + expect(updateQuerySortString(prop)).toBe(expectedOutput); + }); + + it('should return "requestDate" when only removable substrings are present', () => { + const prop = 'printed,copies'; + const expectedOutput = 'requestDate'; + expect(updateQuerySortString(prop)).toBe(expectedOutput); + }); + }); }); diff --git a/translations/ui-requests/en.json b/translations/ui-requests/en.json index e67db031..d72920b6 100644 --- a/translations/ui-requests/en.json +++ b/translations/ui-requests/en.json @@ -199,7 +199,7 @@ "pickupServicePoint.name": "Pickup service point", "requester.patronGroup.group": "Requester patron group", "tags.tagList": "Tags", - "printDetails.count": "# Copies", + "printDetails.printCount": "# Copies", "printDetails.lastPrintedDetails": "Printed", "notes.staffNotes": "Staff notes", From bd36825463e1c61722b13a3671ecf08434900d65 Mon Sep 17 00:00:00 2001 From: Manvendra <105021655+manvendra-s-rathore@users.noreply.github.com> Date: Mon, 23 Sep 2024 19:52:20 +0530 Subject: [PATCH 6/9] UIREQ-1147 - Implement Print Status Filters as server-side filters (#1206) * UIREQ-1146 - revert Custom PrintStatus Filter implementation code * UIREQ-1146 - revert Custom PrintStatus Filter implementation code * UIREQ-1140 - add sorting to Copies and Printed column * UIREQ-1146 - revert custom PrintStatus filter code * UIREQ-1140 - update printDetails data mapping * UIREQ-1140 - refactor componentDidUpdate * UIREQ-1140 - add test cases for mutator query updation * UIREQ-1140 - refactor * fix index.test.js failing test case * UIREQ-1140 - refactor * UIREQ-1147 - Implement Print Status Filters as server-side filters * UIREQ-11447 - refactor * UIREQ-1147 - refactor --- CHANGELOG.md | 1 + .../RequestsFilters/RequestsFiltersConfig.js | 15 ++++++ .../RequestsFiltersConfig.test.js | 34 ++++++++++++ src/routes/RequestsRoute.js | 33 +++++++++--- src/routes/RequestsRoute.test.js | 37 ++++++++++++- src/utils.js | 11 ++-- src/utils.test.js | 54 +++++++++++++++++++ 7 files changed, 172 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b85ac15..7ef09545 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ * Optimize performance of the "print-events-entry" API to reduce slowness during the initial call. Refs UIREQ-1130. * Revert Custom "Print Status" filter code implementation. Refs UIREQ-1146. * Add sorting to 'Printed' and '# Copies' columns in the Request App. Refs UIREQ-1140. +* Implement "Print Status" filters as server-side filters. Refs UIREQ-1147. ## [9.1.2] (https://github.com/folio-org/ui-requests/tree/v9.1.2) (2024-09-13) [Full Changelog](https://github.com/folio-org/ui-requests/compare/v9.1.1...v9.1.2) diff --git a/src/components/RequestsFilters/RequestsFiltersConfig.js b/src/components/RequestsFilters/RequestsFiltersConfig.js index b48322f4..8268f7d2 100644 --- a/src/components/RequestsFilters/RequestsFiltersConfig.js +++ b/src/components/RequestsFilters/RequestsFiltersConfig.js @@ -43,4 +43,19 @@ export default [ values: [], operator: '==', }, + { + name: requestFilterTypes.PRINT_STATUS, + cql: 'printStatus', + values: [], + operator: '==', + parse: (value) => { + if (value.length === 1 && value.includes('Printed')) { + return 'printDetails.isPrinted==true'; + } else if (value.length === 1 && value.includes('Not printed')) { + return 'cql.allRecords=1 NOT printDetails.isPrinted=""'; + } else { + return '(cql.allRecords=1 NOT printDetails.printed="" or printDetails.printed==true)'; + } + } + }, ]; diff --git a/src/components/RequestsFilters/RequestsFiltersConfig.test.js b/src/components/RequestsFilters/RequestsFiltersConfig.test.js index ff3fb106..b6d13606 100644 --- a/src/components/RequestsFilters/RequestsFiltersConfig.test.js +++ b/src/components/RequestsFilters/RequestsFiltersConfig.test.js @@ -81,6 +81,40 @@ describe('RequestsFiltersConfig', () => { expect(pickupServicePointFilter).toEqual(expectedResult); }); + describe('Print Status Filter configuration', () => { + it('should correctly match the filter configuration for printStatus', () => { + const printStatusFilter = filtersConfig.find(f => f.name === 'printStatus'); + const expectedResult = { + name: 'printStatus', + cql: 'printStatus', + values: [], + operator: '==', + parse: expect.any(Function), + }; + + expect(printStatusFilter).toEqual(expectedResult); + }); + + it('should generate the correct query string for the "Printed" filter', () => { + const printStatusFilter = filtersConfig.find(f => f.name === 'printStatus'); + + expect(printStatusFilter.parse(['Printed'])).toEqual('printDetails.isPrinted==true'); + }); + + it('should generate the correct query string for the "Not printed" filter', () => { + const printStatusFilter = filtersConfig.find(f => f.name === 'printStatus'); + + expect(printStatusFilter.parse(['Not printed'])).toEqual('cql.allRecords=1 NOT printDetails.isPrinted=""'); + }); + + it('should generate the correct query string for a combination of "Printed" and "Not printed" filters', () => { + const printStatusFilter = filtersConfig.find(f => f.name === 'printStatus'); + + expect(printStatusFilter.parse(['Printed', 'Not printed'])) + .toEqual('(cql.allRecords=1 NOT printDetails.printed="" or printDetails.printed==true)'); + }); + }); + describe('escapingForSpecialCharactersWhichCanBreakCQL', () => { it('should return empty string', () => { expect(escapingForSpecialCharactersWhichCanBreakCQL()).toBe(''); diff --git a/src/routes/RequestsRoute.js b/src/routes/RequestsRoute.js index 0ec87a02..44e1db60 100644 --- a/src/routes/RequestsRoute.js +++ b/src/routes/RequestsRoute.js @@ -65,6 +65,7 @@ import { DEFAULT_REQUEST_TYPE_VALUE, INPUT_REQUEST_SEARCH_SELECTOR, PRINT_DETAILS_COLUMNS, + requestFilterTypes, } from '../constants'; import { buildUrl, @@ -677,7 +678,7 @@ class RequestsRoute extends React.Component { this.setCurrentServicePointId(); } - componentDidUpdate(prevProps, prevState) { + componentDidUpdate(prevProps) { const patronBlocks = get(this.props.resources, ['patronBlocks', 'records'], []); const prevBlocks = get(prevProps.resources, ['patronBlocks', 'records'], []); const { submitting, isViewPrintDetailsEnabled } = this.state; @@ -729,13 +730,30 @@ class RequestsRoute extends React.Component { this.onSearchComplete(resources.records); } - if (isViewPrintDetailsEnabled !== prevState.isViewPrintDetailsEnabled && !isViewPrintDetailsEnabled) { - this.columnHeadersMap = getFilteredColumnHeadersMap(this.columnHeadersMap); + if (!isViewPrintDetailsEnabled) { + this.handlePrintDetailsDisabled(); + } + } + + handlePrintDetailsDisabled() { + /** + * The function handles the following actions when `isViewPrintDetailsEnabled` is false: + * + * 1. If `filters` in query includes 'PRINT STATUS' filter: + * - it clears the 'PRINT STATUS' filter from query by invoking `handleFilterChange`. + * + * 2. If `sort` in query includes sort by 'printed' or 'copies' column: + * - it removes sorting by 'printed' or 'copies' from the sort query. If both are being sorted, + * the sorting is updated to 'requestDate' instead. + */ + const { resources: { query }, mutator } = this.props; + const printStatusFilterInQuery = this.getActiveFilters()[requestFilterTypes.PRINT_STATUS]; + + if (printStatusFilterInQuery?.length) { + this.handleFilterChange({ name: requestFilterTypes.PRINT_STATUS, values: [] }); } - if (!isViewPrintDetailsEnabled && (query.sort?.includes('printed') || query.sort?.includes('copies'))) { - // Remove 'copies' and 'printed' from query sorting when the user disables - // 'Enable view print details (Pick slips)' in settings and returns to the Requests App. + if (query.sort?.includes('printed') || query.sort?.includes('copies')) { const sort = updateQuerySortString(query.sort); mutator.query.update({ sort }); } @@ -834,6 +852,9 @@ class RequestsRoute extends React.Component { const records = await this.fetchReportData(this.props.mutator.reportRecords, queryString); const recordsToCSV = this.buildRecords(records); + this.columnHeadersMap = this.state.isViewPrintDetailsEnabled ? this.columnHeadersMap : + getFilteredColumnHeadersMap(this.columnHeadersMap); + exportCsv(recordsToCSV, { onlyFields: this.columnHeadersMap, excludeFields: ['id'], diff --git a/src/routes/RequestsRoute.test.js b/src/routes/RequestsRoute.test.js index 2a4ae0bd..d5f0b9a1 100644 --- a/src/routes/RequestsRoute.test.js +++ b/src/routes/RequestsRoute.test.js @@ -600,7 +600,7 @@ describe('RequestsRoute', () => { expect(printContent).toBeInTheDocument(); }); - it('should trigger "exportCsv', async () => { + it('should trigger "exportCsv"', async () => { await userEvent.click(screen.getByRole('button', { name: 'ui-requests.exportSearchResultsToCsv' })); await waitFor(() => { @@ -791,6 +791,7 @@ describe('RequestsRoute', () => { } } }); + it('should not trigger "mutator.savePrintDetails.POST"', async () => { renderComponent(getPropsWithSortInQuery()); await userEvent.click(screen.getAllByRole('button', { name: 'PrintButton' })[0]); @@ -798,6 +799,15 @@ describe('RequestsRoute', () => { expect(defaultProps.mutator.savePrintDetails.POST).not.toHaveBeenCalled(); }); + it('should trigger "exportCsv"', async () => { + renderComponent(getPropsWithSortInQuery()); + await userEvent.click(screen.getByRole('button', { name: 'ui-requests.exportSearchResultsToCsv' })); + + await waitFor(() => { + expect(exportCsv).toHaveBeenCalled(); + }); + }); + it('should trigger "mutator.query.update" when "copies" is present in the query sort string', () => { renderComponent(getPropsWithSortInQuery('copies,requestDate')); const expectedProps = { 'sort': 'requestDate' }; @@ -811,6 +821,31 @@ describe('RequestsRoute', () => { expect(defaultProps.mutator.query.update).toHaveBeenCalledWith(expectedProps); }); + + it('should trigger "mutator.query.update" when any of "Print Status" is present in the query filter string', () => { + renderComponent({ + ...defaultProps, + resources: { + ...defaultProps.resources, + circulationSettings: { + ...defaultProps.resources.circulationSettings, + records: defaultProps.resources.circulationSettings.records.map(record => ({ + ...record, + value: { + ...record.value, + enablePrintLog: 'false' + } + })) + }, + query: { + ...defaultProps.resources.query, + filters: 'printStatus.Printed', + }, + } + }); + + expect(defaultProps.mutator.query.update).toHaveBeenCalled(); + }); }); }); diff --git a/src/utils.js b/src/utils.js index df5b8285..2b4e961c 100644 --- a/src/utils.js +++ b/src/utils.js @@ -41,16 +41,15 @@ import { import css from './requests.css'; -// eslint-disable-next-line import/prefer-default-export export function getFullName(user) { const userNameObj = user?.personal || user; - const lastName = get(userNameObj, ['lastName'], ''); - const firstName = get(userNameObj, ['firstName'], ''); - const middleName = get(userNameObj, ['middleName'], ''); - const preferredFirstName = get(userNameObj, ['preferredFirstName'], ''); + const lastName = get(userNameObj, ['lastName']); + const firstName = get(userNameObj, ['firstName']) ?? ''; + const middleName = get(userNameObj, ['middleName']) ?? ''; + const preferredFirstName = get(userNameObj, ['preferredFirstName']) ?? ''; const displayedFirstName = preferredFirstName || firstName; - return `${lastName}${displayedFirstName ? ', ' : ' '}${displayedFirstName} ${middleName}`; + return `${lastName}${displayedFirstName ? ', ' : ''}${displayedFirstName}${middleName ? ' ' : ''}${middleName}`; } export const createUserHighlightBoxLink = (linkText, id) => { diff --git a/src/utils.test.js b/src/utils.test.js index a8c3dc7d..f5ff4bb5 100644 --- a/src/utils.test.js +++ b/src/utils.test.js @@ -35,6 +35,7 @@ import { isPrintable, getNextSelectedRowsState, getRequester, + getFullName, } from './utils'; import { @@ -1113,3 +1114,56 @@ describe('getRequester', () => { expect(getRequester(null, selectedUser)).toEqual(selectedUser); }); }); + +describe('getFullName', () => { + it('should return full name with last name, preferred first name, and middle name', () => { + const user = { + personal: { + lastName: 'Doe', + firstName: 'John', + middleName: 'A.', + preferredFirstName: 'Johnny' + } + }; + expect(getFullName(user)).toBe('Doe, Johnny A.'); + }); + + it('should return full name with last name, first name, and middle name when preferred first name is absent', () => { + const user = { + personal: { + lastName: 'Doe', + firstName: 'John', + middleName: 'A.' + } + }; + expect(getFullName(user)).toBe('Doe, John A.'); + }); + + it('should return full name without middle name when middle name is missing', () => { + const user = { + personal: { + lastName: 'Doe', + firstName: 'John' + } + }; + expect(getFullName(user)).toBe('Doe, John'); + }); + + it('should return only last name if first name is missing and middle name is null', () => { + const user = { + personal: { + lastName: 'Doe', + middleName: null + } + }; + expect(getFullName(user)).toBe('Doe'); + }); + + it('should handle case when user has no personal information', () => { + const user = { + lastName: 'Doe', + firstName: 'John' + }; + expect(getFullName(user)).toBe('Doe, John'); + }); +}); From 51f462aacd904f7bf6b37e41019d34a7a5767b13 Mon Sep 17 00:00:00 2001 From: FOLIO Translations Bot <38661258+folio-translations@users.noreply.github.com> Date: Mon, 23 Sep 2024 19:33:55 -0400 Subject: [PATCH 7/9] Lokalise: updates --- translations/ui-requests/ar.json | 4 ++-- translations/ui-requests/ber.json | 4 ++-- translations/ui-requests/ca.json | 4 ++-- translations/ui-requests/cs_CZ.json | 8 ++++---- translations/ui-requests/da.json | 4 ++-- translations/ui-requests/de.json | 16 +++++++-------- translations/ui-requests/en_GB.json | 4 ++-- translations/ui-requests/en_SE.json | 4 ++-- translations/ui-requests/en_US.json | 4 ++-- translations/ui-requests/es.json | 4 ++-- translations/ui-requests/es_419.json | 4 ++-- translations/ui-requests/es_ES.json | 4 ++-- translations/ui-requests/fr.json | 4 ++-- translations/ui-requests/fr_FR.json | 4 ++-- translations/ui-requests/he.json | 4 ++-- translations/ui-requests/hi_IN.json | 4 ++-- translations/ui-requests/hu.json | 4 ++-- translations/ui-requests/it_IT.json | 4 ++-- translations/ui-requests/ja.json | 4 ++-- translations/ui-requests/ko.json | 4 ++-- translations/ui-requests/nb.json | 4 ++-- translations/ui-requests/nl.json | 30 ++++++++++++++-------------- translations/ui-requests/nn.json | 4 ++-- translations/ui-requests/pl.json | 4 ++-- translations/ui-requests/pt_BR.json | 4 ++-- translations/ui-requests/pt_PT.json | 4 ++-- translations/ui-requests/ru.json | 4 ++-- translations/ui-requests/sk.json | 4 ++-- translations/ui-requests/sv.json | 4 ++-- translations/ui-requests/ur.json | 4 ++-- translations/ui-requests/zh_CN.json | 4 ++-- translations/ui-requests/zh_TW.json | 4 ++-- 32 files changed, 85 insertions(+), 85 deletions(-) diff --git a/translations/ui-requests/ar.json b/translations/ui-requests/ar.json index 1dfbbf02..706f3819 100644 --- a/translations/ui-requests/ar.json +++ b/translations/ui-requests/ar.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/ber.json b/translations/ui-requests/ber.json index 0f09e4ec..eedd8c1f 100644 --- a/translations/ui-requests/ber.json +++ b/translations/ui-requests/ber.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/ca.json b/translations/ui-requests/ca.json index c8bdb206..6ba94c36 100644 --- a/translations/ui-requests/ca.json +++ b/translations/ui-requests/ca.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/cs_CZ.json b/translations/ui-requests/cs_CZ.json index 33d9ee7c..12a4345f 100644 --- a/translations/ui-requests/cs_CZ.json +++ b/translations/ui-requests/cs_CZ.json @@ -169,7 +169,7 @@ "requestDate": "Datum žádanky", "holdShelfExpirationTime": "Čas expirace pro vyzvednutí rezervace z regálu", "csvReportPending": "Generuje se výstup CSV. Počkejte prosím.", - "csvReportInProgress": "Generuje se výstup o výsledcích CSV. U větších setů výsledků to může nějakou dobu trvat. Prosím, buďte trpěliví.", + "csvReportInProgress": "Generuje se výstup o výsledcích CSV. U větších sad výsledků to může nějakou dobu trvat. Prosím, buďte trpěliví.", "patronComments": "Komentáře čtenáře", "override": "Přepsat", "actions.label": "Akce", @@ -286,7 +286,7 @@ "errors.movingRequestToTheSameItem": "Není povoleno přesunout požadavek na úroveň názvu stránky na stejnou jednotku", "errors.itemOfThisInstanceAlreadyRequested": "Tento čtenář již má otevřenou žádanku pro jeden exemplář titulu", "documentTitle.search": "Žádanky - {query} - Vyhledat", - "item.displaySummary": "Souhrn zobrazení", + "item.displaySummary": "Zobrazit shrnutí", "requests.singlePrint": "Jeden výtisk", "requests.printButtonLabel": "Tisk", "requests.instances.rows.select": "Vybrat titul", @@ -295,9 +295,9 @@ "request.detail.title": "Detaily žádanky", "requests.copies": "# Kopie", "requests.printed": "Tištěno", - "printDetails.count": "# Kopie", "printDetails.lastPrintedDetails": "Tištěno", "requestMeta.printStatus": "Stav tisku", "filters.printStatus.printed": "Tištěno", - "filters.printStatus.notPrinted": "Nevytištěno" + "filters.printStatus.notPrinted": "Nevytištěno", + "printDetails.printCount": "# Kopie" } \ No newline at end of file diff --git a/translations/ui-requests/da.json b/translations/ui-requests/da.json index d00a74b3..e6722978 100644 --- a/translations/ui-requests/da.json +++ b/translations/ui-requests/da.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/de.json b/translations/ui-requests/de.json index 0d15c586..7a943974 100644 --- a/translations/ui-requests/de.json +++ b/translations/ui-requests/de.json @@ -230,7 +230,7 @@ "item.status.agedToLost": "Automatisch für verloren erklärt", "item.status.available": "Verfügbar", "item.status.awaitingDelivery": "Warten auf Lieferung", - "item.status.awaitingPickup": "Im Abholregal", + "item.status.awaitingPickup": "Abholbereit", "item.status.checkedOut": "Ausgeliehen", "item.status.claimedReturned": "Angeblich zurückgegeben", "item.status.declaredLost": "Für verloren erklärt", @@ -287,17 +287,17 @@ "errors.itemOfThisInstanceAlreadyRequested": "Offene Bestandanfrage für Benutzer/-in auf ein Exemplar dieser Instanz ist bereits vorhanden.", "documentTitle.search": "Bestandsanfragen - {query} - Suche", "item.displaySummary": "Übersicht anzeigen", - "requests.singlePrint": "Druck", + "requests.singlePrint": "Einzeldruck", "requests.printButtonLabel": "Druck", "requests.instances.rows.select": "Instanz auswählen", "rows.recordsSelected": "{count, number} {count, plural, one {Datensatz} other {Datensätze}} ausgewählt", "printPickSlipsSelected": "Ausgewählte Entnahmezettel für {sp} drucken", - "request.detail.title": "Bestandsanfragendetails", + "request.detail.title": "Details Bestandsanfrage", "requests.copies": "# Copies", "requests.printed": "Druck abgeschlossen", - "printDetails.count": "# Copies", - "printDetails.lastPrintedDetails": "Printed", - "requestMeta.printStatus": "Print status", - "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "printDetails.lastPrintedDetails": "Druck abgeschlossen", + "requestMeta.printStatus": "Status Druckausgabe", + "filters.printStatus.printed": "Druck abgeschlossen", + "filters.printStatus.notPrinted": "Nicht gedruckt", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/en_GB.json b/translations/ui-requests/en_GB.json index d865fabd..92436a3d 100644 --- a/translations/ui-requests/en_GB.json +++ b/translations/ui-requests/en_GB.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/en_SE.json b/translations/ui-requests/en_SE.json index d865fabd..92436a3d 100644 --- a/translations/ui-requests/en_SE.json +++ b/translations/ui-requests/en_SE.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/en_US.json b/translations/ui-requests/en_US.json index d865fabd..92436a3d 100644 --- a/translations/ui-requests/en_US.json +++ b/translations/ui-requests/en_US.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/es.json b/translations/ui-requests/es.json index e59224ab..61463d5e 100644 --- a/translations/ui-requests/es.json +++ b/translations/ui-requests/es.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/es_419.json b/translations/ui-requests/es_419.json index 031c67f0..b0c33cb2 100644 --- a/translations/ui-requests/es_419.json +++ b/translations/ui-requests/es_419.json @@ -295,9 +295,9 @@ "request.detail.title": "Detalles de la solicitud", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/es_ES.json b/translations/ui-requests/es_ES.json index c0021734..889faa31 100644 --- a/translations/ui-requests/es_ES.json +++ b/translations/ui-requests/es_ES.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/fr.json b/translations/ui-requests/fr.json index c8bdb206..6ba94c36 100644 --- a/translations/ui-requests/fr.json +++ b/translations/ui-requests/fr.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/fr_FR.json b/translations/ui-requests/fr_FR.json index 1aa63268..b2f00eb8 100644 --- a/translations/ui-requests/fr_FR.json +++ b/translations/ui-requests/fr_FR.json @@ -295,9 +295,9 @@ "request.detail.title": "Détails de la réservation", "requests.copies": "# Exemplaires", "requests.printed": "Imprimé", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/he.json b/translations/ui-requests/he.json index c8bdb206..6ba94c36 100644 --- a/translations/ui-requests/he.json +++ b/translations/ui-requests/he.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/hi_IN.json b/translations/ui-requests/hi_IN.json index c8bdb206..6ba94c36 100644 --- a/translations/ui-requests/hi_IN.json +++ b/translations/ui-requests/hi_IN.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/hu.json b/translations/ui-requests/hu.json index 04e2c28e..28303de2 100644 --- a/translations/ui-requests/hu.json +++ b/translations/ui-requests/hu.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/it_IT.json b/translations/ui-requests/it_IT.json index 738bf9e7..984e17cc 100644 --- a/translations/ui-requests/it_IT.json +++ b/translations/ui-requests/it_IT.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/ja.json b/translations/ui-requests/ja.json index 4835d86d..5012020e 100644 --- a/translations/ui-requests/ja.json +++ b/translations/ui-requests/ja.json @@ -295,9 +295,9 @@ "request.detail.title": "リクエスト詳細", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/ko.json b/translations/ui-requests/ko.json index b6eaf08b..47ce72d7 100644 --- a/translations/ui-requests/ko.json +++ b/translations/ui-requests/ko.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/nb.json b/translations/ui-requests/nb.json index d865fabd..92436a3d 100644 --- a/translations/ui-requests/nb.json +++ b/translations/ui-requests/nb.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/nl.json b/translations/ui-requests/nl.json index c325f99c..46591a86 100644 --- a/translations/ui-requests/nl.json +++ b/translations/ui-requests/nl.json @@ -157,13 +157,13 @@ "permission.create": "Aanvragen: Aanmaken, bekijken", "permission.edit": "Aanvragen: Bekijken, bewerken, annuleren", "notes.newStaffNote": "Nieuwe opmerking medewerkers", - "notes.staffNotes": "Staff notes", + "notes.staffNotes": "Medewerkersopmerking", "notes.entityType.request": "Aanvraag", "notes.entityType.request.pluralized": "{count} {count, plural, one {request} other {requests}}", "errors.selectItemRequired": "Selecteer een item en druk op enter", - "notes.assigned.for": "For: {instanceLink} ({itemLink})", - "notes.assigned.requester": "Requester: {requesterName}", - "notes.assigned.requestDate": "Request date: {requestCreateDate}", + "notes.assigned.for": "Voor: {instanceLink} ({itemLink})", + "notes.assigned.requester": "Aanvrager: {requesterName}", + "notes.assigned.requestDate": "Aanvraagdatum: {requestCreateDate}", "pickSlipsLoading": "Afhaalbonnen worden ingevoerd, even geduld a.u.b.", "printInProgress": "Invoer van printopties is bezig. Dit kan enkele seconden duren, even geduld a.u.b.", "requestDate": "Datum aanvraag", @@ -246,16 +246,16 @@ "item.status.unavailable": "Niet beschikbaar", "item.status.unknown": "Onbekend", "item.status.withdrawn": "Ingetrokken", - "item.status.recentlyReturned": "Recently returned", + "item.status.recentlyReturned": "Onlangs teruggekeerd", "item.status.availableInASR": "Beschikbaar in ASR", - "item.status.retrievingFromASR": "Retrieving from ASR", - "item.status.missingFromASR": "Missing from ASR", + "item.status.retrievingFromASR": "Ophalen uit ASR", + "item.status.missingFromASR": "Ontbrekend in ASR", "item.status.orderClosed": "Bestelling gesloten", "item.status.restricted": "Beperkt", "appMenu.keyboardShortcuts": "Toetsenbordcombinaties", "navigation.app": "Aanvragen app 'Zoeken'", "navigation.keyboardShortcuts": "Toetsenbordcombinaties", - "requests.servicePoint": "Ophaalservicepunt", + "requests.servicePoint": "Servicepunt voor afhaal", "requests.callNumber": "Effectieve etiketnummerreeks", "fulfillmentPreference": "Voorkeur afhandeling aanvraag", "requestMeta.fulfillment.holdShelf": "Reserveringen", @@ -293,11 +293,11 @@ "rows.recordsSelected": "{count, number} {count, plural, one {record} other {records}} geselecteerd", "printPickSlipsSelected": "Geselecteerde afhaalbonnen afdrukken voor {sp}", "request.detail.title": "Aanvraagdetails", - "requests.copies": "# Copies", - "requests.printed": "Printed", - "printDetails.count": "# Copies", - "printDetails.lastPrintedDetails": "Printed", - "requestMeta.printStatus": "Print status", - "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "requests.copies": "# Kopieën", + "requests.printed": "Afgedrukt", + "printDetails.lastPrintedDetails": "Afgedrukt", + "requestMeta.printStatus": "Status afdrukken", + "filters.printStatus.printed": "Afgedrukt", + "filters.printStatus.notPrinted": "Niet afgedrukt", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/nn.json b/translations/ui-requests/nn.json index d865fabd..92436a3d 100644 --- a/translations/ui-requests/nn.json +++ b/translations/ui-requests/nn.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/pl.json b/translations/ui-requests/pl.json index 5f5c2430..955971c8 100644 --- a/translations/ui-requests/pl.json +++ b/translations/ui-requests/pl.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/pt_BR.json b/translations/ui-requests/pt_BR.json index cdb02893..20832f0f 100644 --- a/translations/ui-requests/pt_BR.json +++ b/translations/ui-requests/pt_BR.json @@ -295,9 +295,9 @@ "request.detail.title": "Detalhes da requisição", "requests.copies": "# Cópias", "requests.printed": "Impresso", - "printDetails.count": "# Cópias", "printDetails.lastPrintedDetails": "Impresso", "requestMeta.printStatus": "Status de impressão", "filters.printStatus.printed": "Impresso", - "filters.printStatus.notPrinted": "Não impresso" + "filters.printStatus.notPrinted": "Não impresso", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/pt_PT.json b/translations/ui-requests/pt_PT.json index 8fc1adef..986b0746 100644 --- a/translations/ui-requests/pt_PT.json +++ b/translations/ui-requests/pt_PT.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/ru.json b/translations/ui-requests/ru.json index 33498106..b9b48f5c 100644 --- a/translations/ui-requests/ru.json +++ b/translations/ui-requests/ru.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/sk.json b/translations/ui-requests/sk.json index d865fabd..92436a3d 100644 --- a/translations/ui-requests/sk.json +++ b/translations/ui-requests/sk.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/sv.json b/translations/ui-requests/sv.json index d865fabd..92436a3d 100644 --- a/translations/ui-requests/sv.json +++ b/translations/ui-requests/sv.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/ur.json b/translations/ui-requests/ur.json index b8c6e39f..344e830b 100644 --- a/translations/ui-requests/ur.json +++ b/translations/ui-requests/ur.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/zh_CN.json b/translations/ui-requests/zh_CN.json index 69708899..e751764e 100644 --- a/translations/ui-requests/zh_CN.json +++ b/translations/ui-requests/zh_CN.json @@ -295,9 +295,9 @@ "request.detail.title": "申请详细信息", "requests.copies": "# 份数", "requests.printed": "已打印", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file diff --git a/translations/ui-requests/zh_TW.json b/translations/ui-requests/zh_TW.json index 03b6bbd8..1ff43664 100644 --- a/translations/ui-requests/zh_TW.json +++ b/translations/ui-requests/zh_TW.json @@ -295,9 +295,9 @@ "request.detail.title": "Request details", "requests.copies": "# Copies", "requests.printed": "Printed", - "printDetails.count": "# Copies", "printDetails.lastPrintedDetails": "Printed", "requestMeta.printStatus": "Print status", "filters.printStatus.printed": "Printed", - "filters.printStatus.notPrinted": "Not printed" + "filters.printStatus.notPrinted": "Not printed", + "printDetails.printCount": "# Copies" } \ No newline at end of file From 1510a77ace958c8fa8c6d95073ad9b96e47de058 Mon Sep 17 00:00:00 2001 From: Manvendra <105021655+manvendra-s-rathore@users.noreply.github.com> Date: Fri, 27 Sep 2024 17:37:20 +0530 Subject: [PATCH 8/9] =?UTF-8?q?UIREQ-1145=20-=20Navigate=20to=20first=20pa?= =?UTF-8?q?ge=20on=20save=20print=20details=20beyond=20the=20=E2=80=A6=20(?= =?UTF-8?q?#1208)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * UIREQ-1145 - Navigate to first page on save print details beyond the first page * UIREQ-1145 - navigate to first page on printPick slip on savePrintLog enabled * UIREQ-1145 - refactor * UIREQ-1145 - refactor * UIREQ-1145 - refactor * UIREQ-1145 - refactor * UIREQ-1145 - address review comments --- CHANGELOG.md | 1 + .../SinglePrintButtonForPickSlip.js | 3 +++ .../SinglePrintButtonForPickSlip.test.js | 1 + src/routes/RequestsRoute.js | 16 +++++++++++++++- src/routes/RequestsRoute.test.js | 16 ++++++++++++++++ 5 files changed, 36 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ef09545..25383d40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ * Revert Custom "Print Status" filter code implementation. Refs UIREQ-1146. * Add sorting to 'Printed' and '# Copies' columns in the Request App. Refs UIREQ-1140. * Implement "Print Status" filters as server-side filters. Refs UIREQ-1147. +* Navigate to first page when saving the pick slip print log from beyond the first page. Refs UIREQ-1145. ## [9.1.2] (https://github.com/folio-org/ui-requests/tree/v9.1.2) (2024-09-13) [Full Changelog](https://github.com/folio-org/ui-requests/compare/v9.1.1...v9.1.2) diff --git a/src/components/SinglePrintButtonForPickSlip/SinglePrintButtonForPickSlip.js b/src/components/SinglePrintButtonForPickSlip/SinglePrintButtonForPickSlip.js index d66047ec..db7651e6 100644 --- a/src/components/SinglePrintButtonForPickSlip/SinglePrintButtonForPickSlip.js +++ b/src/components/SinglePrintButtonForPickSlip/SinglePrintButtonForPickSlip.js @@ -15,6 +15,7 @@ const SinglePrintButtonForPickSlip = ({ pickSlipsData, onBeforeGetContentForSinglePrintButton, onBeforePrintForSinglePrintButton, + onAfterPrintForSinglePrintButton, getPrintContentRef, }) => { const disabled = !isPrintable(request.id, pickSlipsToCheck); @@ -28,6 +29,7 @@ const SinglePrintButtonForPickSlip = ({ requestId={request.id} onBeforeGetContent={onBeforeGetContentForSinglePrintButton} onBeforePrint={onBeforePrintForSinglePrintButton} + onAfterPrint={onAfterPrintForSinglePrintButton} > { ], onBeforeGetContentForSinglePrintButton: jest.fn(), onBeforePrintForSinglePrintButton: jest.fn(), + onAfterPrintForSinglePrintButton: jest.fn(), getPrintContentRef: mockAccordionStatusRef, }; diff --git a/src/routes/RequestsRoute.js b/src/routes/RequestsRoute.js index 44e1db60..de5f3028 100644 --- a/src/routes/RequestsRoute.js +++ b/src/routes/RequestsRoute.js @@ -230,6 +230,7 @@ export const getListFormatter = ( toggleRowSelection, onBeforeGetContentForSinglePrintButton, onBeforePrintForSinglePrintButton, + onAfterPrintForSinglePrintButton, } ) => ({ 'select': rq => ( @@ -256,7 +257,8 @@ export const getListFormatter = ( pickSlipsData, getPrintContentRef, ...(isViewPrintDetailsEnabled && { - onBeforePrintForSinglePrintButton + onBeforePrintForSinglePrintButton, + onAfterPrintForSinglePrintButton, }), }; return ( @@ -512,6 +514,9 @@ class RequestsRoute extends React.Component { requestCount: PropTypes.shape({ replace: PropTypes.func, }), + resultOffset: PropTypes.shape({ + replace: PropTypes.func, + }), resultCount: PropTypes.shape({ replace: PropTypes.func, }), @@ -1314,6 +1319,12 @@ class RequestsRoute extends React.Component { }) ); + onAfterPrintForPrintButton = () => { + if (this.state.isViewPrintDetailsEnabled) { + this.props.mutator.resultOffset.replace(0); + } + } + printContentRefs = {}; getPrintContentRef = (rqId) => { @@ -1440,6 +1451,7 @@ class RequestsRoute extends React.Component { toggleRowSelection: this.toggleRowSelection, onBeforeGetContentForSinglePrintButton: this.onBeforeGetContentForSinglePrintButton, onBeforePrintForSinglePrintButton: this.savePrintEventDetails, + onAfterPrintForSinglePrintButton: this.onAfterPrintForPrintButton, } ); @@ -1509,6 +1521,7 @@ class RequestsRoute extends React.Component { await this.savePrintEventDetails(requestIds); } }} + onAfterPrint={this.onAfterPrintForPrintButton} > ({ PrintButton: jest.fn(({ onBeforeGetContent, onBeforePrint, + onAfterPrint, children, }) => { const handleClick = () => { Promise.resolve(onBeforeGetContent()); Promise.resolve(onBeforePrint()); + Promise.resolve(onAfterPrint()); }; return (
@@ -168,10 +170,12 @@ jest.mock('../RequestForm', () => jest.fn()); jest.mock('../components/SinglePrintButtonForPickSlip', () => jest.fn(({ onBeforeGetContentForSinglePrintButton, onBeforePrintForSinglePrintButton, + onAfterPrintForSinglePrintButton, }) => { const handleClick = () => { onBeforeGetContentForSinglePrintButton(); onBeforePrintForSinglePrintButton(['reqId']); + onAfterPrintForSinglePrintButton(); }; return (