diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b6de427b..1fe6a1cf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,11 @@ * Add dropdown to specify user type: Patron or Staff. Refs UIU-2936. * *BREAKING* bump `react-intl` to `v6.4.4`. Refs UIU-2946. * Generate "Create request" url for users without barcode. Refs UIU-2869. +* Add auto focus to textarea on staff and patron info modal. Fixes UIU-2932. +* ECS - Filter users by "User Type". Refs UIU-2943. +* Users App: Consume {{FormattedDate}} and {{FormattedTime}} via stripes-component. Refs UIU-1860. +* ECS - Prevent editing of specific shadow user data. Refs UIU-2951. +* Relabel "Users: Can create new user" to "Users: Can create and edit users". Refs UIU-2955. ## [9.0.0](https://github.com/folio-org/ui-users/tree/v9.0.0) (2023-02-20) [Full Changelog](https://github.com/folio-org/ui-users/compare/v8.1.0...v9.0.0) diff --git a/package.json b/package.json index 149075797..0f9501be9 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ }, { "permissionName": "ui-users.create", - "displayName": "Users: Can create new user", + "displayName": "Users: Can create and edit users", "description": "Some subperms can be deleted later when bl does updates and ModulePermissions can be used", "subPermissions": [ "ui-users.edit", diff --git a/src/components/Accounts/ViewFeesFines/ViewFeesFines.js b/src/components/Accounts/ViewFeesFines/ViewFeesFines.js index 798529287..b36874ec8 100644 --- a/src/components/Accounts/ViewFeesFines/ViewFeesFines.js +++ b/src/components/Accounts/ViewFeesFines/ViewFeesFines.js @@ -3,9 +3,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; import { - FormattedDate, FormattedMessage, - FormattedTime, } from 'react-intl'; import { @@ -17,6 +15,8 @@ import { Row, Col, Icon, + FormattedDate, + FormattedTime, } from '@folio/stripes/components'; import { itemStatuses } from '../../../constants'; diff --git a/src/components/Accounts/ViewFeesFines/ViewFeesFines.test.js b/src/components/Accounts/ViewFeesFines/ViewFeesFines.test.js index ab97d2e30..7df38bab1 100644 --- a/src/components/Accounts/ViewFeesFines/ViewFeesFines.test.js +++ b/src/components/Accounts/ViewFeesFines/ViewFeesFines.test.js @@ -17,6 +17,9 @@ jest.mock('../../util', () => ({ jest.mock('react-intl', () => ({ ...jest.requireActual('react-intl'), FormattedMessage: jest.fn(({ id }) => id), +})); +jest.mock('@folio/stripes/components', () => ({ + ...jest.requireActual('@folio/stripes/components'), FormattedTime: jest.fn(({ value }) => value), FormattedDate: jest.fn(({ value }) => value), })); diff --git a/src/components/BulkOverrideDialog/BulkOverrideLoansList.js b/src/components/BulkOverrideDialog/BulkOverrideLoansList.js index 7c44956e6..d1e52f556 100644 --- a/src/components/BulkOverrideDialog/BulkOverrideLoansList.js +++ b/src/components/BulkOverrideDialog/BulkOverrideLoansList.js @@ -2,7 +2,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { get } from 'lodash'; import { - FormattedTime, FormattedMessage, injectIntl, } from 'react-intl'; @@ -10,6 +9,7 @@ import { import { Icon, MultiColumnList, + FormattedTime, } from '@folio/stripes/components'; import { effectiveCallNumber } from '@folio/stripes/util'; diff --git a/src/components/BulkRenewalDialog/BulkRenewedLoansList.js b/src/components/BulkRenewalDialog/BulkRenewedLoansList.js index af8aef01e..4bd0125f5 100644 --- a/src/components/BulkRenewalDialog/BulkRenewedLoansList.js +++ b/src/components/BulkRenewalDialog/BulkRenewedLoansList.js @@ -4,12 +4,12 @@ import get from 'lodash/get'; import { FormattedMessage, - FormattedTime, } from 'react-intl'; import { Icon, MultiColumnList, + FormattedTime, } from '@folio/stripes/components'; import { effectiveCallNumber } from '@folio/stripes/util'; diff --git a/src/components/EditSections/EditContactInfo/EditContactInfo.js b/src/components/EditSections/EditContactInfo/EditContactInfo.js index 4dbcda651..9c793b684 100644 --- a/src/components/EditSections/EditContactInfo/EditContactInfo.js +++ b/src/components/EditSections/EditContactInfo/EditContactInfo.js @@ -25,6 +25,7 @@ const EditContactInfo = ({ addressTypes, preferredContactTypeId, intl, + disabled, }) => { const contactTypeOptions = (contactTypes || []).map(g => { return ( @@ -64,6 +65,7 @@ const EditContactInfo = ({ component={TextField} required fullWidth + disabled={disabled} /> @@ -73,6 +75,7 @@ const EditContactInfo = ({ id="adduser_phone" component={TextField} fullWidth + disabled={disabled} /> @@ -82,6 +85,7 @@ const EditContactInfo = ({ id="adduser_mobilePhone" component={TextField} fullWidth + disabled={disabled} /> @@ -93,6 +97,7 @@ const EditContactInfo = ({ fullWidth aria-required="true" required + disabled={disabled} defaultValue={selectedContactTypeId} > @@ -108,6 +113,7 @@ const EditContactInfo = ({ fieldComponents={addressFields} canDelete formType="final-form" + disabled={disabled} /> ); @@ -120,6 +126,7 @@ EditContactInfo.propTypes = { addressTypes: PropTypes.arrayOf(PropTypes.object), preferredContactTypeId: PropTypes.string, intl: PropTypes.object.isRequired, + disabled: PropTypes.bool, }; export default injectIntl(EditContactInfo); diff --git a/src/components/EditSections/EditContactInfo/EditContactInfo.test.js b/src/components/EditSections/EditContactInfo/EditContactInfo.test.js index 53a58a9a4..fd0c44be7 100644 --- a/src/components/EditSections/EditContactInfo/EditContactInfo.test.js +++ b/src/components/EditSections/EditContactInfo/EditContactInfo.test.js @@ -1,12 +1,13 @@ -import { screen } from '@folio/jest-config-stripes/testing-library/react'; -import userEvent from '@folio/jest-config-stripes/testing-library/user-event'; import { Form } from 'react-final-form'; -import '__mock__/stripesComponents.mock'; +import { screen } from '@folio/jest-config-stripes/testing-library/react'; +import userEvent from '@folio/jest-config-stripes/testing-library/user-event'; import renderWithRouter from 'helpers/renderWithRouter'; import EditContactInfo from './EditContactInfo'; +jest.unmock('@folio/stripes/components'); + const onSubmit = jest.fn(); const arrayMutators = { @@ -28,7 +29,8 @@ const renderEditContactInfo = (props) => { ); - renderWithRouter( + + return renderWithRouter(
{ renderEditContactInfo(props); expect(screen.getByText('AddressEditList')).toBeInTheDocument(); }); + it('Must be rendered', async () => { renderEditContactInfo(props); - await userEvent.type(document.querySelector('[id="adduser_email"]'), 'Test@gmail.com'); - expect(document.querySelector('[id="adduser_email"]').value).toBe('Test@gmail.com'); + + const emailInput = screen.getByRole('textbox', { name: /email/i }); + + await userEvent.type(emailInput, 'Test@gmail.com'); + expect(emailInput.value).toBe('Test@gmail.com'); + }); + + it('should render with disabled fields', () => { + renderEditContactInfo({ ...props, disabled: true }); + + expect(screen.getByRole('textbox', { name: /email/i })).toBeDisabled(); + expect(screen.getByRole('textbox', { name: /mobilePhone/i })).toBeDisabled(); + expect(screen.getByLabelText('ui-users.contact.phone')).toBeDisabled(); }); }); diff --git a/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.css b/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.css index dc0b77654..1295a307c 100644 --- a/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.css +++ b/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.css @@ -10,4 +10,9 @@ &:focus { outline: none; } + + &:disabled { + color: var(--checkable-disabled-fill); + cursor: not-allowed; + } } diff --git a/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.js b/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.js index 1af75ba29..d91750b65 100644 --- a/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.js +++ b/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.js @@ -23,6 +23,7 @@ class CreateResetPasswordControl extends React.Component { POST: PropTypes.func.isRequired, }).isRequired, }).isRequired, + disabled: PropTypes.bool, }; static manifest = Object.freeze({ @@ -111,6 +112,8 @@ class CreateResetPasswordControl extends React.Component { }; render() { + const { disabled } = this.props; + return ( diff --git a/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.test.js b/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.test.js index 180d3560d..97e112ac7 100644 --- a/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.test.js +++ b/src/components/EditSections/EditExtendedInfo/CreateResetPasswordControl/CreateResetPasswordControl.test.js @@ -12,7 +12,7 @@ jest.unmock('@folio/stripes/smart-components'); const renderCreateResetPasswordControl = (props) => renderWithRouter(); -const propData = (postMock) => { +const propData = (postMock, disabled = false) => { return { email: 'testemail@email.com', name: 'sample', @@ -22,6 +22,7 @@ const propData = (postMock) => { POST: postMock, } }, + disabled, }; }; @@ -42,6 +43,13 @@ describe('CreateResetPasswordControl component', () => { await waitFor(() => userEvent.click(screen.getByText('ui-users.extended.sendResetPassword'))); await waitFor(() => expect(screen.getByText('ui-users.extended.copyLink')).toBeInTheDocument()); }); + it('should link be disabled', () => { + const mockFunc = jest.fn(() => new Promise((resolve, _) => { + resolve({ ok: true, link: 'bl-users/password-reset/link' }); + })); + renderCreateResetPasswordControl(propData(mockFunc, true)); + expect(screen.getByText('ui-users.extended.sendResetPassword')).toBeDisabled(); + }); /* Can be uncommented after the createResetpasswordControl modal logic is reworked. Should add an assertion at the end after the results */ // it('If it redirects after POST fails', async () => { // const mockFunc = jest.fn(() => new Promise((_, reject) => { diff --git a/src/components/EditSections/EditExtendedInfo/DepartmentsNameEdit/DepartmentsNameEdit.js b/src/components/EditSections/EditExtendedInfo/DepartmentsNameEdit/DepartmentsNameEdit.js index 750636ee9..e4564ff7a 100644 --- a/src/components/EditSections/EditExtendedInfo/DepartmentsNameEdit/DepartmentsNameEdit.js +++ b/src/components/EditSections/EditExtendedInfo/DepartmentsNameEdit/DepartmentsNameEdit.js @@ -3,6 +3,7 @@ import { FormattedMessage, useIntl, } from 'react-intl'; +import PropTypes from 'prop-types'; import { Field } from 'react-final-form'; import { FieldArray } from 'react-final-form-arrays'; @@ -15,7 +16,7 @@ import { departmentsShape } from '../../../../shapes'; import css from './DepartmentsNameEdit.css'; -const DepartmentsNameEdit = ({ departments }) => { +const DepartmentsNameEdit = ({ departments, disabled }) => { const { formatMessage } = useIntl(); const defaultDepartment = { label: formatMessage({ id: 'ui-users.extended.department.default' }), @@ -35,10 +36,13 @@ const DepartmentsNameEdit = ({ departments }) => { component={RepeatableField} name="departments" onAdd={fields => fields.push()} + canRemove={!disabled} + canAdd={!disabled} renderField={field => ( )} @@ -47,6 +51,9 @@ const DepartmentsNameEdit = ({ departments }) => { ); }; -DepartmentsNameEdit.propTypes = { departments: departmentsShape }; +DepartmentsNameEdit.propTypes = { + departments: departmentsShape, + disabled: PropTypes.bool +}; export default DepartmentsNameEdit; diff --git a/src/components/EditSections/EditExtendedInfo/DepartmentsNameEdit/DepartmentsNameEdit.test.js b/src/components/EditSections/EditExtendedInfo/DepartmentsNameEdit/DepartmentsNameEdit.test.js index 8396de678..b68034c4c 100644 --- a/src/components/EditSections/EditExtendedInfo/DepartmentsNameEdit/DepartmentsNameEdit.test.js +++ b/src/components/EditSections/EditExtendedInfo/DepartmentsNameEdit/DepartmentsNameEdit.test.js @@ -8,9 +8,9 @@ import { import userEvent from '@folio/jest-config-stripes/testing-library/user-event'; import renderWithRouter from 'helpers/renderWithRouter'; import DepartmentsNameEdit from './DepartmentsNameEdit'; -import '__mock__/stripesSmartComponent.mock'; jest.unmock('@folio/stripes/components'); +jest.unmock('@folio/stripes/smart-components'); const onSubmit = jest.fn(); @@ -63,3 +63,10 @@ describe('Given DepartmentsNameEdit', () => { expect(screen.queryByPlaceholderText(/ui-users.extended.department.default/i)); }); }); + +describe('Given DepartmentsNameEdit with disabled: true', () => { + it('should add button to be disabled', async () => { + renderDepartmentsNameEdit({ ...props, disabled: true }); + expect(screen.getByRole('button')).toBeDisabled(); + }); +}); diff --git a/src/components/EditSections/EditExtendedInfo/EditExtendedInfo.js b/src/components/EditSections/EditExtendedInfo/EditExtendedInfo.js index b6d5f4b92..8829ce510 100644 --- a/src/components/EditSections/EditExtendedInfo/EditExtendedInfo.js +++ b/src/components/EditSections/EditExtendedInfo/EditExtendedInfo.js @@ -40,6 +40,7 @@ class EditExtendedInfo extends Component { change: PropTypes.func.isRequired, values: PropTypes.object, uniquenessValidator: PropTypes.object, + disabled: PropTypes.bool, }; buildAccordionHeader = () => { @@ -83,6 +84,7 @@ class EditExtendedInfo extends Component { departments, change, uniquenessValidator, + disabled, } = this.props; const accordionHeader = this.buildAccordionHeader(); @@ -110,6 +112,7 @@ class EditExtendedInfo extends Component { name="enrollmentDate" id="adduser_enrollmentdate" validate={validateMinDate('ui-users.errors.extended.dateEnrolled')} + disabled={disabled} /> @@ -161,6 +166,7 @@ class EditExtendedInfo extends Component { defaultDeliveryAddressTypeId={defaultDeliveryAddressTypeId} deliveryAvailable={deliveryAvailable} setFieldValue={change} + disabled={disabled} /> @@ -170,7 +176,7 @@ class EditExtendedInfo extends Component { xs={12} md={3} > - + ) : null @@ -188,6 +194,7 @@ class EditExtendedInfo extends Component { component={TextField} fullWidth validStylesEnabled + disabled={disabled} validate={asyncValidateField('username', username, uniquenessValidator)} /> @@ -199,6 +206,7 @@ class EditExtendedInfo extends Component { email={userEmail} name={userFirstName} username={username} + disabled={disabled} /> ) } diff --git a/src/components/EditSections/EditExtendedInfo/EditExtendedInfo.test.js b/src/components/EditSections/EditExtendedInfo/EditExtendedInfo.test.js index a1b58c2a4..37cb243c6 100644 --- a/src/components/EditSections/EditExtendedInfo/EditExtendedInfo.test.js +++ b/src/components/EditSections/EditExtendedInfo/EditExtendedInfo.test.js @@ -2,11 +2,11 @@ import { screen } from '@folio/jest-config-stripes/testing-library/react'; import { Form } from 'react-final-form'; import PropTypes from 'prop-types'; -import '__mock__/stripesComponents.mock'; - import renderWithRouter from 'helpers/renderWithRouter'; import EditExtendedInfo from './EditExtendedInfo'; +jest.unmock('@folio/stripes/components'); + const onSubmit = jest.fn(); const arrayMutators = { @@ -28,7 +28,8 @@ const renderEditExtendedInfo = (props) => { ); - renderWithRouter( + + return renderWithRouter( { renderEditExtendedInfo(props); expect(screen.getByText('test@test.ccom')).toBeInTheDocument(); }); + it('should fields to be disabled', () => { + renderEditExtendedInfo({ ...props, disabled: true }); + expect(screen.getAllByRole('textbox')[0]).toBeDisabled(); + }); }); diff --git a/src/components/EditSections/EditExtendedInfo/RequestPreferencesEdit/RequestPreferencesEdit.js b/src/components/EditSections/EditExtendedInfo/RequestPreferencesEdit/RequestPreferencesEdit.js index b37d72573..ae55d9cdf 100644 --- a/src/components/EditSections/EditExtendedInfo/RequestPreferencesEdit/RequestPreferencesEdit.js +++ b/src/components/EditSections/EditExtendedInfo/RequestPreferencesEdit/RequestPreferencesEdit.js @@ -35,6 +35,7 @@ class RequestPreferencesEdit extends Component { setFieldValue: PropTypes.func.isRequired, defaultDeliveryAddressTypeId: nullOrStringIsRequiredTypeValidator, intl: PropTypes.object.isRequired, + disabled: PropTypes.bool, } componentDidUpdate(prevProps) { @@ -76,7 +77,7 @@ class RequestPreferencesEdit extends Component { } renderServicePointSelect() { - const { servicePoints, intl } = this.props; + const { servicePoints, intl, disabled } = this.props; const options = servicePoints.map(servicePoint => ({ value: servicePoint.id, @@ -92,6 +93,7 @@ class RequestPreferencesEdit extends Component { label={} dataOptions={resultOptions} component={Select} + disabled={disabled} parse={this.defaultServicePointFieldParser} /> ); @@ -174,6 +176,7 @@ class RequestPreferencesEdit extends Component { render() { const { deliveryAvailable, + disabled, } = this.props; return ( @@ -209,6 +212,7 @@ class RequestPreferencesEdit extends Component { label={} component={Checkbox} type="checkbox" + disabled={disabled} /> diff --git a/src/components/EditSections/EditUserInfo/EditUserInfo.js b/src/components/EditSections/EditUserInfo/EditUserInfo.js index 81b2e10d2..323669097 100644 --- a/src/components/EditSections/EditUserInfo/EditUserInfo.js +++ b/src/components/EditSections/EditUserInfo/EditUserInfo.js @@ -47,6 +47,7 @@ class EditUserInfo extends React.Component { }), }).isRequired, form: PropTypes.object, + disabled: PropTypes.bool, uniquenessValidator: PropTypes.object, }; @@ -111,6 +112,7 @@ class EditUserInfo extends React.Component { render() { const { + disabled, patronGroups, initialValues, expanded, @@ -182,7 +184,7 @@ class EditUserInfo extends React.Component { const isShadowUser = initialValues.type === USER_TYPES.SHADOW; const isSystemUser = initialValues.type === USER_TYPES.SYSTEM; - const isUserTypeDisabled = isShadowUser || isSystemUser; + const isUserTypeDisabled = isShadowUser || isSystemUser || disabled; const typeOptions = [ { @@ -254,6 +256,7 @@ class EditUserInfo extends React.Component { required fullWidth autoFocus + disabled={disabled} /> @@ -263,6 +266,7 @@ class EditUserInfo extends React.Component { id="adduser_firstname" component={TextField} fullWidth + disabled={disabled} /> @@ -272,6 +276,7 @@ class EditUserInfo extends React.Component { id="adduser_middlename" component={TextField} fullWidth + disabled={disabled} /> @@ -281,6 +286,7 @@ class EditUserInfo extends React.Component { id="adduser_preferredname" component={TextField} fullWidth + disabled={disabled} /> @@ -298,6 +304,7 @@ class EditUserInfo extends React.Component { defaultValue={initialValues.patronGroup} aria-required="true" required + disabled={disabled} /> {(selectedPatronGroup) => { @@ -316,7 +323,7 @@ class EditUserInfo extends React.Component { id="useractive" component={Select} fullWidth - disabled={isStatusFieldDisabled()} + disabled={disabled || isStatusFieldDisabled()} dataOptions={statusOptions} defaultValue={initialValues.active} format={(v) => (v ? v.toString() : 'false')} @@ -343,6 +350,7 @@ class EditUserInfo extends React.Component { name="expirationDate" id="adduser_expirationdate" parse={this.parseExpirationDate} + disabled={disabled} validate={validateMinDate('ui-users.errors.personal.dateOfBirth')} /> {checkShowRecalculateButton() && ( @@ -358,13 +366,13 @@ class EditUserInfo extends React.Component { } name="barcode" id="adduser_barcode" - component={TextField} validate={asyncValidateField('barcode', barcode, uniquenessValidator)} - fullWidth /> {( diff --git a/src/components/EditSections/EditUserInfo/EditUserInfo.test.js b/src/components/EditSections/EditUserInfo/EditUserInfo.test.js index b086f987a..b3b128ad0 100644 --- a/src/components/EditSections/EditUserInfo/EditUserInfo.test.js +++ b/src/components/EditSections/EditUserInfo/EditUserInfo.test.js @@ -179,4 +179,11 @@ describe('Render Edit User Information component', () => { } expect(screen.getByRole('option', { name: `ui-users.information.userType.${type}` })).toHaveValue(type); }); + + it('should have disabled fields with disabled prop is true', () => { + renderEditUserInfo({ ...props, disabled: true }); + + expect(screen.getByRole('textbox', { name: /lastName/ })).toBeDisabled(); + expect(screen.getByRole('textbox', { name: /firstName/ })).toBeDisabled(); + }); }); diff --git a/src/components/Loans/ClosedLoans/ClosedLoans.js b/src/components/Loans/ClosedLoans/ClosedLoans.js index b81e0b183..ae8c47d0d 100644 --- a/src/components/Loans/ClosedLoans/ClosedLoans.js +++ b/src/components/Loans/ClosedLoans/ClosedLoans.js @@ -2,7 +2,6 @@ import _ from 'lodash'; import React from 'react'; import { FormattedMessage, - FormattedTime, injectIntl, } from 'react-intl'; import PropTypes from 'prop-types'; @@ -16,6 +15,7 @@ import { IconButton, ExportCsv, ConfirmationModal, + FormattedTime, } from '@folio/stripes/components'; import { IfPermission, diff --git a/src/components/Loans/OpenLoans/components/BulkClaimReturnedModal/BulkClaimReturnedModal.js b/src/components/Loans/OpenLoans/components/BulkClaimReturnedModal/BulkClaimReturnedModal.js index 6af03bb9e..ecd016e96 100644 --- a/src/components/Loans/OpenLoans/components/BulkClaimReturnedModal/BulkClaimReturnedModal.js +++ b/src/components/Loans/OpenLoans/components/BulkClaimReturnedModal/BulkClaimReturnedModal.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedDate, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; import { isEmpty } from 'lodash'; import moment from 'moment'; @@ -14,6 +14,7 @@ import { MultiColumnList, Spinner, TextArea, + FormattedDate, } from '@folio/stripes/components'; import { getOpenRequestsPath } from '../../../../util'; diff --git a/src/components/Loans/OpenLoans/helpers/getListDataFormatter.js b/src/components/Loans/OpenLoans/helpers/getListDataFormatter.js index e8ea7b1fc..ccd377b80 100644 --- a/src/components/Loans/OpenLoans/helpers/getListDataFormatter.js +++ b/src/components/Loans/OpenLoans/helpers/getListDataFormatter.js @@ -1,9 +1,9 @@ import React from 'react'; import { get } from 'lodash'; import { - FormattedTime, FormattedDate, -} from 'react-intl'; + FormattedTime, +} from '@folio/stripes/components'; import { effectiveCallNumber } from '@folio/stripes/util'; diff --git a/src/components/ModalContent/ModalContent.js b/src/components/ModalContent/ModalContent.js index 237fccdb6..835e5d42d 100644 --- a/src/components/ModalContent/ModalContent.js +++ b/src/components/ModalContent/ModalContent.js @@ -290,6 +290,7 @@ class ModalContent extends React.Component { data-test-additional-info-textarea label={} required + autoFocus onChange={this.handleAdditionalInfoChange} /> diff --git a/src/components/ProxyGroup/ProxyEditItem/ProxyEditItem.js b/src/components/ProxyGroup/ProxyEditItem/ProxyEditItem.js index 650659651..0f61d24b5 100644 --- a/src/components/ProxyGroup/ProxyEditItem/ProxyEditItem.js +++ b/src/components/ProxyGroup/ProxyEditItem/ProxyEditItem.js @@ -1,7 +1,6 @@ import React from 'react'; import { FormattedMessage, - FormattedTime, } from 'react-intl'; import { defer, @@ -18,6 +17,7 @@ import { Datepicker, LayoutHeader, Select, + FormattedTime, } from '@folio/stripes/components'; import { getFullName } from '../../util'; diff --git a/src/components/ProxyGroup/ProxyItem/ProxyItem.js b/src/components/ProxyGroup/ProxyItem/ProxyItem.js index c01cd4d27..2b672b3c8 100644 --- a/src/components/ProxyGroup/ProxyItem/ProxyItem.js +++ b/src/components/ProxyGroup/ProxyItem/ProxyItem.js @@ -1,9 +1,17 @@ import _ from 'lodash'; import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedTime, FormattedDate } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import { Link } from 'react-router-dom'; -import { Row, Col, KeyValue, LayoutHeader, NoValue } from '@folio/stripes/components'; +import { + Row, + Col, + KeyValue, + LayoutHeader, + NoValue, + FormattedTime, + FormattedDate, +} from '@folio/stripes/components'; import { getFullName } from '../../util'; import css from './ProxyItem.css'; diff --git a/src/components/UserDetailSections/UserInfo/UserInfo.js b/src/components/UserDetailSections/UserInfo/UserInfo.js index 638206f7c..ff64e8174 100644 --- a/src/components/UserDetailSections/UserInfo/UserInfo.js +++ b/src/components/UserDetailSections/UserInfo/UserInfo.js @@ -1,7 +1,7 @@ import { get } from 'lodash'; import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedDate } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import { Row, Col, @@ -9,6 +9,7 @@ import { Accordion, Headline, NoValue, + FormattedDate, } from '@folio/stripes/components'; import { ViewMetaData } from '@folio/stripes/smart-components'; diff --git a/src/components/util/util.js b/src/components/util/util.js index 52d58b736..53a4da7ba 100644 --- a/src/components/util/util.js +++ b/src/components/util/util.js @@ -2,6 +2,7 @@ import React from 'react'; import { FormattedMessage } from 'react-intl'; import { every } from 'lodash'; import queryString from 'query-string'; + import { NoValue } from '@folio/stripes/components'; import { @@ -176,11 +177,15 @@ export function checkUserActive(user) { export const getContributors = (account, instance) => { const contributors = account?.contributors || instance?.contributors; - return contributors && contributors.map(({ name }) => name); + return contributors?.map(({ name }) => name); }; export const isConsortiumEnabled = stripes => { - return stripes.hasInterface('consortia'); + return stripes?.hasInterface('consortia'); +}; + +export const getCentralTenantId = stripes => { + return stripes?.user?.user?.consortium?.centralTenantId; }; export const getRequestUrl = (barcode, userId) => { diff --git a/src/components/util/util.test.js b/src/components/util/util.test.js index 1279351ab..8418dd7c5 100644 --- a/src/components/util/util.test.js +++ b/src/components/util/util.test.js @@ -18,9 +18,23 @@ import { retrieveNoteReferredEntityDataFromLocationState, getClosedRequestStatusesFilterString, getOpenRequestStatusesFilterString, + getCentralTenantId, + isConsortiumEnabled, getRequestUrl, } from './util'; +const STRIPES = { + hasPerm: jest.fn().mockReturnValue(true), + hasInterface: jest.fn().mockReturnValue(true), + user: { + user: { + consortium: { + centralTenantId: 'centralTenantId' + } + } + } +}; + describe('accountsMatchStatus', () => { it('returns true if all accounts match', () => { const status = 'monkey'; @@ -366,6 +380,30 @@ describe('getContributors', () => { }); }); +describe('isConsortiumEnabled', () => { + it('should return false', () => { + const data = isConsortiumEnabled(); + expect(data).toBeFalsy(); + }); + + it('should return true', () => { + const data = isConsortiumEnabled(STRIPES); + expect(data).toBe(true); + }); +}); + +describe('getCentralTenantId ', () => { + it('should return undefined if consortium object is absent', () => { + const data = getCentralTenantId({ ...STRIPES, user: { user: { } } }); + expect(data).toBe(undefined); + }); + + it('should return centralTenantId if consortium object and id is present', () => { + const data = getCentralTenantId(STRIPES); + expect(data).toBe(STRIPES.user.user.consortium.centralTenantId); + }); +}); + describe('getRequestUrl', () => { it('should return url with user barcode', () => { const userBarcode = 'userBarcode'; diff --git a/src/routes/UserSearchContainer.js b/src/routes/UserSearchContainer.js index 6752e829a..dd7f5648f 100644 --- a/src/routes/UserSearchContainer.js +++ b/src/routes/UserSearchContainer.js @@ -4,27 +4,22 @@ import { get, template, } from 'lodash'; -import { stripesConnect } from '@folio/stripes/core'; +import { stripesConnect } from '@folio/stripes/core'; import { makeQueryFunction, StripesConnectedSource, buildUrl, } from '@folio/stripes/smart-components'; -import filterConfig from './filterConfig'; import { UserSearch } from '../views'; -import { - MAX_RECORDS, - USER_TYPES, -} from '../constants'; +import { MAX_RECORDS } from '../constants'; +import filterConfig from './filterConfig'; import { buildFilterConfig } from './utils'; const INITIAL_RESULT_COUNT = 30; const RESULT_COUNT_INCREMENT = 30; -export const NOT_SHADOW_USER_CQL = `((cql.allRecords=1 NOT type ="") or type<>"${USER_TYPES.SHADOW}")`; - const searchFields = [ 'username="%{query}*"', 'personal.firstName="%{query}*"', @@ -42,7 +37,7 @@ const compileQuery = template(`(${searchFields.join(' or ')})`, { interpolate: / export function buildQuery(queryParams, pathComponents, resourceData, logger, props) { const customFilterConfig = buildFilterConfig(queryParams.filters); - const mainQuery = makeQueryFunction( + return makeQueryFunction( 'cql.allRecords=1', // TODO: Refactor/remove this after work on FOLIO-2066 and RMB-385 is done (parsedQuery, _, localProps) => localProps.query.query.trim().replace('*', '').split(/\s+/) @@ -59,8 +54,6 @@ export function buildQuery(queryParams, pathComponents, resourceData, logger, pr [...filterConfig, ...customFilterConfig], 2, )(queryParams, pathComponents, resourceData, logger, props); - - return mainQuery && `${NOT_SHADOW_USER_CQL} and ${mainQuery}`; } class UserSearchContainer extends React.Component { diff --git a/src/routes/UserSearchContainer.test.js b/src/routes/UserSearchContainer.test.js index 5dfa0bed1..bfe40c9ee 100644 --- a/src/routes/UserSearchContainer.test.js +++ b/src/routes/UserSearchContainer.test.js @@ -1,7 +1,4 @@ -import { - buildQuery, - NOT_SHADOW_USER_CQL, -} from './UserSearchContainer'; +import { buildQuery } from './UserSearchContainer'; const queryParams = { filters: 'active.active', @@ -15,9 +12,20 @@ const resourceData = { const logger = { log: jest.fn(), }; +const mockHasInterface = jest.fn().mockReturnValue(false); +const props = { + stripes: { + hasInterface: mockHasInterface, + } +}; describe('buildQuery', () => { - it('should exclude shadow users when building CQL query', () => { - expect(buildQuery(queryParams, pathComponents, resourceData, logger)).toEqual(expect.stringContaining(NOT_SHADOW_USER_CQL)); + it('should return empty CQL query', () => { + expect(buildQuery({}, pathComponents, { query: {} }, logger, props)).toBeFalsy(); + }); + + it('should include username when building CQL query', () => { + mockHasInterface.mockReturnValue(true); + expect(buildQuery(queryParams, pathComponents, resourceData, logger, props)).toEqual(expect.stringContaining('username="Joe*"')); }); }); diff --git a/src/routes/filterConfig.js b/src/routes/filterConfig.js index 3b7b23f15..f178cf0d6 100644 --- a/src/routes/filterConfig.js +++ b/src/routes/filterConfig.js @@ -24,6 +24,12 @@ const filterConfig = [ values: [], operator: '=', }, + { + name: 'userType', + cql: 'type', + values: [], + operator: '=', + } ]; export default filterConfig; diff --git a/src/views/LoanDetails/LoanDetails.js b/src/views/LoanDetails/LoanDetails.js index 6174c0f12..8bd4b4a89 100644 --- a/src/views/LoanDetails/LoanDetails.js +++ b/src/views/LoanDetails/LoanDetails.js @@ -1,7 +1,6 @@ import React from 'react'; import { FormattedMessage, - FormattedTime, injectIntl, } from 'react-intl'; import { compose } from 'redux'; @@ -29,6 +28,7 @@ import { LoadingView, Dropdown, DropdownMenu, + FormattedTime, } from '@folio/stripes/components'; import { IfPermission, stripesConnect } from '@folio/stripes/core'; import { effectiveCallNumber } from '@folio/stripes/util'; diff --git a/src/views/LostItems/LostItemsListContainer/components/LostItemsList/LostItemsList.test.js b/src/views/LostItems/LostItemsListContainer/components/LostItemsList/LostItemsList.test.js index 575963814..8ac397d87 100644 --- a/src/views/LostItems/LostItemsListContainer/components/LostItemsList/LostItemsList.test.js +++ b/src/views/LostItems/LostItemsListContainer/components/LostItemsList/LostItemsList.test.js @@ -49,8 +49,6 @@ jest.mock('./util', () => ({ jest.mock('react-intl', () => ({ ...jest.requireActual('react-intl'), FormattedMessage: jest.fn(({ id }) => id), - FormattedTime: jest.fn(({ value }) => value), - FormattedDate: jest.fn(({ value }) => value), })); const initialProps = { diff --git a/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/DateTimeFormatter/DateTimeFormatter.js b/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/DateTimeFormatter/DateTimeFormatter.js index d01075fac..85a571e0c 100644 --- a/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/DateTimeFormatter/DateTimeFormatter.js +++ b/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/DateTimeFormatter/DateTimeFormatter.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import { FormattedDate, FormattedTime, -} from 'react-intl'; +} from '@folio/stripes/components'; const DateTimeFormatter = ({ value }) => { return ( diff --git a/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/DateTimeFormatter/DateTimeFormatter.test.js b/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/DateTimeFormatter/DateTimeFormatter.test.js index 029c7d5c0..9301ac7fd 100644 --- a/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/DateTimeFormatter/DateTimeFormatter.test.js +++ b/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/DateTimeFormatter/DateTimeFormatter.test.js @@ -2,7 +2,7 @@ import { render } from '@folio/jest-config-stripes/testing-library/react'; import { FormattedDate, FormattedTime, -} from 'react-intl'; +} from '@folio/stripes/components'; import '../../../../../../../../test/jest/__mock__'; diff --git a/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/RecordStatus/RecordStatus.test.js b/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/RecordStatus/RecordStatus.test.js index a452052cf..b386776f4 100644 --- a/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/RecordStatus/RecordStatus.test.js +++ b/src/views/LostItems/LostItemsListContainer/components/LostItemsList/components/RecordStatus/RecordStatus.test.js @@ -4,9 +4,12 @@ import { } from '@folio/jest-config-stripes/testing-library/react'; import { FormattedMessage, +} from 'react-intl'; + +import { FormattedDate, FormattedTime, -} from 'react-intl'; +} from '@folio/stripes/components'; import RecordStatus, { getBilledAmount, diff --git a/src/views/UserDetail/UserDetail.js b/src/views/UserDetail/UserDetail.js index d28be72b5..dc521f84b 100644 --- a/src/views/UserDetail/UserDetail.js +++ b/src/views/UserDetail/UserDetail.js @@ -64,6 +64,9 @@ import { } from '../../components/util'; import RequestFeeFineBlockButtons from '../../components/RequestFeeFineBlockButtons'; import { departmentsShape } from '../../shapes'; +import IfConsortiumPermission from '../../components/IfConsortiumPermission'; +import { USER_TYPES } from '../../constants'; +import LostItemsLink from '../../components/LostItemsLink'; import OpenTransactionModal from './components/OpenTransactionModal'; import DeleteUserModal from './components/DeleteUserModal'; @@ -71,8 +74,6 @@ import ExportFeesFinesReportButton from './components'; import ErrorPane from '../../components/ErrorPane'; import ActionMenuEditButton from './components/ActionMenuEditButton'; import ActionMenuDeleteButton from './components/ActionMenuDeleteButton'; -import LostItemsLink from '../../components/LostItemsLink'; -import IfConsortiumPermission from '../../components/IfConsortiumPermission'; class UserDetail extends React.Component { static propTypes = { @@ -622,6 +623,9 @@ class UserDetail extends React.Component { .map(departmentId => departments.find(({ id }) => id === departmentId)?.name); const accounts = resources?.accounts; + const isShadowUser = user?.type === USER_TYPES.SHADOW; + const showPatronBlocksSection = hasPatronBlocksPermissions && !isShadowUser; + if (this.userNotFound()) { return ( - {hasPatronBlocksPermissions && + {showPatronBlocksSection && } noCustomFieldsFoundLabel={} /> - - - - - - - - - - - - { /* Check without version, so can support either of multiple versions. - Replace with specific check when facility for providing - multiple versions is available */ } - - - - - - - - - - - - - + { + !isShadowUser && ( + <> + + + + + + + + + + + + + { /* Check without version, so can support either of multiple versions. + Replace with specific check when facility for providing + multiple versions is available */ } + + + + + + + + + + + + + + + ) + } diff --git a/src/views/UserDetail/UserDetail.test.js b/src/views/UserDetail/UserDetail.test.js index d466beb13..e6b568c34 100644 --- a/src/views/UserDetail/UserDetail.test.js +++ b/src/views/UserDetail/UserDetail.test.js @@ -321,4 +321,15 @@ describe('UserDetail', () => { expect(screen.getByText('LoadingPane')).toBeDefined(); }); }); + + describe('when user type is shadow', () => { + it('should not render Fee-fines Requests Loans Proxy-sponsor Patron blocks', () => { + renderUserDetail(stripes, { resources: { ...resources, selUser: { records: [{ ...resources.selUser.records[0], type: 'shadow' }] } } }); + expect(screen.queryByText('ui-users.loans.title')).toBeNull(); + expect(screen.queryByText('ui-users.requests.title')).toBeNull(); + expect(screen.queryByText('ui-users.accounts.title')).toBeNull(); + expect(screen.queryByText('ui-users.proxySponsor')).toBeNull(); + expect(screen.queryByText('ui-users.patronBlocks')).toBeNull(); + }); + }); }); diff --git a/src/views/UserEdit/UserForm.js b/src/views/UserEdit/UserForm.js index 71212518c..b619733b8 100644 --- a/src/views/UserEdit/UserForm.js +++ b/src/views/UserEdit/UserForm.js @@ -38,6 +38,7 @@ import getProxySponsorWarning from '../../components/util/getProxySponsorWarning import TenantsPermissionsAccordion from './TenantsPermissionsAccordion'; import css from './UserForm.css'; +import { USER_TYPES } from '../../constants'; export function validate(values) { const errors = {}; @@ -296,6 +297,7 @@ class UserForm extends React.Component { const paneTitle = initialValues.id ? : ; + const isShadowUser = initialValues?.type === USER_TYPES.SHADOW; return ( @@ -355,6 +357,7 @@ class UserForm extends React.Component { form={form} selectedPatronGroup={selectedPatronGroup} uniquenessValidator={uniquenessValidator} + disabled={isShadowUser} /> {initialValues.id &&
- + { + !isShadowUser && ( + + ) + } + { + isConsortium && ( + clearGroup('userType')} + > + + + ) + } { useCustomFields: jest.fn(() => [[customField]]), }; }); +jest.mock('../../components/util', () => ({ + isConsortiumEnabled: jest.fn(), +})); const stateMock = jest.fn(); const filterHandlers = { @@ -43,6 +47,9 @@ const initialProps = { resultOffset: { replace: jest.fn(), }, + stripes: { + hasInterface: jest.fn(), + }, }; describe('Filters', () => { @@ -77,4 +84,16 @@ describe('Filters', () => { renderFilters(initialProps); expect(screen.getByText('ui-users.departments')).toBeInTheDocument(); }); + + it('should display user-type filter for consortia tenants', () => { + isConsortiumEnabled.mockReturnValue(true); + renderFilters(initialProps); + expect(screen.getByText('ui-users.userType')).toBeInTheDocument(); + }); + + it('should hide user-types filter for non-consortia tenants', () => { + isConsortiumEnabled.mockReturnValue(false); + renderFilters(initialProps); + expect(screen.queryByText('ui-users.userType')).not.toBeInTheDocument(); + }); }); diff --git a/src/views/UserSearch/UserSearch.js b/src/views/UserSearch/UserSearch.js index 11114789f..b28287d40 100644 --- a/src/views/UserSearch/UserSearch.js +++ b/src/views/UserSearch/UserSearch.js @@ -39,14 +39,13 @@ import { import RefundsReportModal from '../../components/ReportModals/RefundsReportModal'; import CashDrawerReportModal from '../../components/ReportModals/CashDrawerReportModal'; import FinancialTransactionsReportModal from '../../components/ReportModals/FinancialTransactionsReportModal'; - import CsvReport from '../../components/data/reports'; import RefundsReport from '../../components/data/reports/RefundReport'; import CashDrawerReconciliationReportPDF from '../../components/data/reports/cashDrawerReconciliationReportPDF'; import CashDrawerReconciliationReportCSV from '../../components/data/reports/cashDrawerReconciliationReportCSV'; import FinancialTransactionsReport from '../../components/data/reports/FinancialTransactionsReport'; -import Filters from './Filters'; import LostItemsLink from '../../components/LostItemsLink'; +import Filters from './Filters'; import css from './UserSearch.css'; diff --git a/src/views/UserSearch/UserSearch.test.js b/src/views/UserSearch/UserSearch.test.js new file mode 100644 index 000000000..ecedd82ac --- /dev/null +++ b/src/views/UserSearch/UserSearch.test.js @@ -0,0 +1,52 @@ +import React from 'react'; +import { screen } from '@folio/jest-config-stripes/testing-library/react'; + +import renderWithRouter from 'helpers/renderWithRouter'; +import '../../../test/jest/__mock__/matchMedia.mock'; + +import UserSearch from './UserSearch'; + +jest.unmock('@folio/stripes/components'); +jest.unmock('@folio/stripes/smart-components'); + +jest.mock('@folio/stripes/smart-components', () => { + // eslint-disable-next-line global-require + const customField = require('fixtures/multiSelectCustomField'); + return { + // eslint-disable-next-line global-require + ...jest.requireActual('@folio/stripes/smart-components'), + useCustomFields: jest.fn(() => [[customField]]), + }; +}); + +const defaultProps = { + mutator: {}, + resources: { + owners: { + records: [], + }, + }, + stripes: { + hasInterface: jest.fn(), + }, + location: {}, + history: {}, + match: {}, + intl: { + formatMessage: jest.fn(), + }, + okapi: { + currentUser: { + id: 'test', + }, + } +}; + +const renderComponent = (props) => renderWithRouter(); + +describe('UserSearch', () => { + it('should render component', () => { + renderComponent(); + expect(screen.getByText('ui-users.status')).toBeTruthy(); + }); +}); diff --git a/test/jest/__mock__/stripesComponents.mock.js b/test/jest/__mock__/stripesComponents.mock.js index 7f8f56bf0..6f66da45d 100644 --- a/test/jest/__mock__/stripesComponents.mock.js +++ b/test/jest/__mock__/stripesComponents.mock.js @@ -54,6 +54,20 @@ jest.mock('@folio/stripes/components', () => ({ ExpandAllButton: jest.fn(({ children }) => ( {children} )), + FormattedTime: jest.fn(({ value, children }) => { + if (children) { + return children([value]); + } + + return value; + }), + FormattedDate: jest.fn(({ value, children }) => { + if (children) { + return children([value]); + } + + return value; + }), HasCommand: jest.fn(({ children }) => ( {children} )), diff --git a/translations/ui-users/ar.json b/translations/ui-users/ar.json index 5e0df98c5..d92ae78b9 100644 --- a/translations/ui-users/ar.json +++ b/translations/ui-users/ar.json @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/ber.json b/translations/ui-users/ber.json index 48ee727f0..cf2557ec4 100644 --- a/translations/ui-users/ber.json +++ b/translations/ui-users/ber.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/ca.json b/translations/ui-users/ca.json index 4f4d50954..1d04d809e 100644 --- a/translations/ui-users/ca.json +++ b/translations/ui-users/ca.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/cs_CZ.json b/translations/ui-users/cs_CZ.json index 9797dcbdf..1f9578160 100644 --- a/translations/ui-users/cs_CZ.json +++ b/translations/ui-users/cs_CZ.json @@ -1131,9 +1131,11 @@ "permissions.assignUsers.actions.message.error": "Změna přiřazení uživatele sady oprávnění nebyla úspěšná. {error}", "permissions.assignUsers.actions.message.permission.error": "Nemáte požadovaná oprávnění.", "errors.generic": "Něco se pokazilo. Zkuste to prosím znovu později.", - "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.selectUserType": "Vybrat typ uživatele", + "information.userType": "Typ uživatele", + "information.userType.patron": "Čtenář", + "information.userType.staff": "Zaměstnanci", + "information.userType.shadow": "Stín", + "information.userType.system": "Systém", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/da.json b/translations/ui-users/da.json index 44c85736d..89774ff11 100644 --- a/translations/ui-users/da.json +++ b/translations/ui-users/da.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Gebyr-/bødehistorik: Kan oprette, redigere og fjerne konti", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Brugere: Kan redigere brugerprofil", "permission.editperms": "Brugere: Kan tildele og fjerne tildeling af brugerrettigheder til brugere", "permission.editproxies": "Brugere: Kan oprette, redigere og fjerne proxyer", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/de.json b/translations/ui-users/de.json index 85e5b6518..53fa1f737 100644 --- a/translations/ui-users/de.json +++ b/translations/ui-users/de.json @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/en.json b/translations/ui-users/en.json index 808c3ba90..75f98617d 100644 --- a/translations/ui-users/en.json +++ b/translations/ui-users/en.json @@ -408,6 +408,7 @@ "bulkActions.tooltip": "Multiple loans can be processed at the same time. Please select loans first.", "loanNotRenewed": "Loan not renewed", "status": "Status", + "userType": "User type", "selectColumns": "Select Columns", "accounts.title.feeFine": "Fees/fines", "accounts.header": "Fee/fine details - {userName} ({patronGroup})", @@ -991,7 +992,7 @@ "filters.status.active": "Active", "filters.status.inactive": "Inactive", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", diff --git a/translations/ui-users/en_GB.json b/translations/ui-users/en_GB.json index 48ee727f0..cf2557ec4 100644 --- a/translations/ui-users/en_GB.json +++ b/translations/ui-users/en_GB.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/en_SE.json b/translations/ui-users/en_SE.json index 48ee727f0..cf2557ec4 100644 --- a/translations/ui-users/en_SE.json +++ b/translations/ui-users/en_SE.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/en_US.json b/translations/ui-users/en_US.json index 48ee727f0..cf2557ec4 100644 --- a/translations/ui-users/en_US.json +++ b/translations/ui-users/en_US.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/es.json b/translations/ui-users/es.json index 667b796c7..2d69cc8d3 100644 --- a/translations/ui-users/es.json +++ b/translations/ui-users/es.json @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/es_419.json b/translations/ui-users/es_419.json index 383fbb692..ab2569d78 100644 --- a/translations/ui-users/es_419.json +++ b/translations/ui-users/es_419.json @@ -1131,9 +1131,11 @@ "permissions.assignUsers.actions.message.error": "El cambio de asignación de usuario de Permissions Set no se ha realizado correctamente. {error}", "permissions.assignUsers.actions.message.permission.error": "No dispone de los permisos necesarios.", "errors.generic": "Algo salió mal. Por favor, inténtelo de nuevo más tarde.", - "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.selectUserType": "Seleccione tipo de usuario", + "information.userType": "Tipo de usuario", + "information.userType.patron": "Patron", + "information.userType.staff": "Personal", + "information.userType.shadow": "Shadow", + "information.userType.system": "Sistema", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/es_ES.json b/translations/ui-users/es_ES.json index bf0500c49..f821c9233 100644 --- a/translations/ui-users/es_ES.json +++ b/translations/ui-users/es_ES.json @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/fr.json b/translations/ui-users/fr.json index 48ee727f0..cf2557ec4 100644 --- a/translations/ui-users/fr.json +++ b/translations/ui-users/fr.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/fr_FR.json b/translations/ui-users/fr_FR.json index 8ff757bf7..c5802342d 100644 --- a/translations/ui-users/fr_FR.json +++ b/translations/ui-users/fr_FR.json @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/he.json b/translations/ui-users/he.json index 48ee727f0..cf2557ec4 100644 --- a/translations/ui-users/he.json +++ b/translations/ui-users/he.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/hi_IN.json b/translations/ui-users/hi_IN.json index 48ee727f0..cf2557ec4 100644 --- a/translations/ui-users/hi_IN.json +++ b/translations/ui-users/hi_IN.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/hu.json b/translations/ui-users/hu.json index 36e2fa9f9..6b727d18a 100644 --- a/translations/ui-users/hu.json +++ b/translations/ui-users/hu.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/it_IT.json b/translations/ui-users/it_IT.json index fcfcd25b1..73030b2f8 100644 --- a/translations/ui-users/it_IT.json +++ b/translations/ui-users/it_IT.json @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/ja.json b/translations/ui-users/ja.json index 6b0130f0a..edd178bb6 100644 --- a/translations/ui-users/ja.json +++ b/translations/ui-users/ja.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/ko.json b/translations/ui-users/ko.json index 11a38c07f..70208a744 100644 --- a/translations/ui-users/ko.json +++ b/translations/ui-users/ko.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "하나 이상의 차단 된 작업이 선택된 경우 표시 할 메시지는 필수 필드입니다.", "settings.error.noCheckbox": "메시지를 표시하려면 하나 이상의 차단된 작업을 선택해야 합니다.", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/nb.json b/translations/ui-users/nb.json index 48ee727f0..cf2557ec4 100644 --- a/translations/ui-users/nb.json +++ b/translations/ui-users/nb.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/nn.json b/translations/ui-users/nn.json index 48ee727f0..cf2557ec4 100644 --- a/translations/ui-users/nn.json +++ b/translations/ui-users/nn.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/pl.json b/translations/ui-users/pl.json index 49ff20884..eb5ccc9e3 100644 --- a/translations/ui-users/pl.json +++ b/translations/ui-users/pl.json @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/pt_BR.json b/translations/ui-users/pt_BR.json index 51ca90adf..f32f80f0e 100644 --- a/translations/ui-users/pt_BR.json +++ b/translations/ui-users/pt_BR.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "A mensagem a ser exibida é um campo obrigatório se uma ou mais ações bloqueadas selecionadas", "settings.error.noCheckbox": "Uma ou mais ações bloqueadas devem ser selecionadas para que a Mensagem seja exibida para ser usada", "permission.accounts": "Histórico de taxas/multas: Pode criar, editar e remover contas", - "permission.create": "Usuários: Pode criar novos usuários", + "permission.create": "Usuários: Podem criar e editar usuários", "permission.edit": "Usuários: Pode editar o perfil do usuário", "permission.editperms": "Usuários: Pode atribuir e remover permissões de usuários", "permission.editproxies": "Usuários: Pode criar, editar e remover proxies", @@ -1084,8 +1084,8 @@ "loans.addInfo.staff": "Adicionar novas informações da equipe", "permission.loans.add-patron-info": "Usuários: Empréstimos de usuários: adicionar informações do usuário", "permission.loans.add-staff-info": "Usuários: Empréstimos de usuários: adicionar informações da equipe", - "errors.affiliationsLoadFailed": "O carregamento de afiliações para o usuário {user} no inquilino {tenantId} falhou.", - "errors.permissionsLoadFailed": "O carregamento de permissões para o usuário {user} no inquilino {tenantId} falhou.", + "errors.affiliationsLoadFailed": "O carregamento de afiliações para o usuário {user} no locatário {tenantId} falhou.", + "errors.permissionsLoadFailed": "O carregamento de permissões para o usuário {user} no locatário {tenantId} falhou.", "affiliations.select.label": "Afiliação", "permission.settings.view": "Configurações (Usuários): Ver todas as configurações", "permission.settings.addresstypes.view": "Configurações (Usuários): Pode visualizar tipos de endereço", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "Você não tem as permissões necessárias.", "errors.generic": "Algo deu errado. Por favor, tente novamente mais tarde.", "information.selectUserType": "Selecione o tipo de usuário", - "information.type": "Tipo de usuário", - "information.type.patron": "Usuário", - "information.type.staff": "Equipe", - "information.type.shadow": "Sombra" + "information.userType": "Tipo de usuário", + "information.userType.patron": "Usuário", + "information.userType.staff": "Equipe", + "information.userType.shadow": "Sombra", + "information.userType.system": "Sistema", + "userType": "Tipo de usuário" } \ No newline at end of file diff --git a/translations/ui-users/pt_PT.json b/translations/ui-users/pt_PT.json index 35fc3faaa..e36d26afc 100644 --- a/translations/ui-users/pt_PT.json +++ b/translations/ui-users/pt_PT.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/ru.json b/translations/ui-users/ru.json index 61c269c40..2efdf2368 100644 --- a/translations/ui-users/ru.json +++ b/translations/ui-users/ru.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/sv.json b/translations/ui-users/sv.json index 48ee727f0..cf2557ec4 100644 --- a/translations/ui-users/sv.json +++ b/translations/ui-users/sv.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/ur.json b/translations/ui-users/ur.json index 745bb3f13..1b646a245 100644 --- a/translations/ui-users/ur.json +++ b/translations/ui-users/ur.json @@ -592,7 +592,7 @@ "settings.error.noMessage": "Message to be displayed is a required field if one or more Blocked actions selected", "settings.error.noCheckbox": "One or more Blocked actions must be selected for Message to be displayed to be used", "permission.accounts": "Fee/Fine History: Can create, edit and remove accounts", - "permission.create": "Users: Can create new user", + "permission.create": "Users: Can create and edit users", "permission.edit": "Users: Can edit user profile", "permission.editperms": "Users: Can assign and unassign permissions to users", "permission.editproxies": "Users: Can create, edit and remove proxies", @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file diff --git a/translations/ui-users/zh_CN.json b/translations/ui-users/zh_CN.json index 7b4fc58bf..e916b087e 100644 --- a/translations/ui-users/zh_CN.json +++ b/translations/ui-users/zh_CN.json @@ -1131,9 +1131,11 @@ "permissions.assignUsers.actions.message.error": "权限集用户分配更改未成功。 {error}", "permissions.assignUsers.actions.message.permission.error": "您没有所需权限。", "errors.generic": "出了些问题。请稍后再试。", - "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.selectUserType": "选择用户类型", + "information.userType": "用户类型", + "information.userType.patron": "读者", + "information.userType.staff": "员工", + "information.userType.shadow": "影子用户", + "information.userType.system": "系统", + "userType": "用户类型" } \ No newline at end of file diff --git a/translations/ui-users/zh_TW.json b/translations/ui-users/zh_TW.json index e545ef094..6719e936b 100644 --- a/translations/ui-users/zh_TW.json +++ b/translations/ui-users/zh_TW.json @@ -1132,8 +1132,10 @@ "permissions.assignUsers.actions.message.permission.error": "You do not have required permissions.", "errors.generic": "Something went wrong. Please try again later.", "information.selectUserType": "Select user type", - "information.type": "User type", - "information.type.patron": "Patron", - "information.type.staff": "Staff", - "information.type.shadow": "Shadow" + "information.userType": "User type", + "information.userType.patron": "Patron", + "information.userType.staff": "Staff", + "information.userType.shadow": "Shadow", + "information.userType.system": "System", + "userType": "User type" } \ No newline at end of file