diff --git a/package.json b/package.json
index 8cce3209..c0db48c3 100644
--- a/package.json
+++ b/package.json
@@ -32,12 +32,14 @@
"organizations-storage.interfaces": "2.1",
"organizations-storage.phone-numbers": "2.0",
"organizations-storage.privileged-contacts": "1.0",
- "organizations-storage.settings": "1.0",
+ "organizations-storage.settings": "1.1",
"organizations-storage.urls": "1.1",
- "settings": "1.1",
"tags": "1.0",
"users": "15.1 16.0"
},
+ "optionalOkapiInterfaces": {
+ "servint": "4.0"
+ },
"queryResource": "query",
"icons": [
{
@@ -66,7 +68,9 @@
{
"permissionName": "ui-organizations.third-party-services.execute",
"displayName": "Organizations: Permissions required to call services apart from mod-organizations-storage",
- "replaces": ["ui-organizations.third-party-services"],
+ "replaces": [
+ "ui-organizations.third-party-services"
+ ],
"visible": false,
"subPermissions": [
"acquisition.organization.events.get",
@@ -87,8 +91,6 @@
"data-export.config.collection.get",
"data-export.config.item.get",
"erm.agreements.collection.get",
- "mod-settings.entries.collection.get",
- "mod-settings.global.read.ui-organizations.vendor-generator-setting",
"orders.acquisition-methods.collection.get",
"orders.acquisition-method.item.get",
"organizations.organizations.collection.get",
@@ -307,11 +309,9 @@
"displayName": "Settings (Organizations): Manage number generator options",
"subPermissions": [
"settings.organizations.enabled",
- "mod-settings.entries.collection.get",
- "mod-settings.entries.item.post",
- "mod-settings.entries.item.put",
- "mod-settings.global.read.ui-organizations.vendor-generator-setting",
- "mod-settings.global.write.ui-organizations.vendor-generator-setting"
+ "organizations-storage.settings.collection.get",
+ "organizations-storage.settings.item.post",
+ "organizations-storage.settings.item.put"
],
"visible": true
}
@@ -399,8 +399,5 @@
"optionalDependencies": {
"@folio/plugin-find-contact": "^5.0.0",
"@folio/plugin-find-interface": "^5.0.0"
- },
- "optionalOkapiInterfaces": {
- "servint": "4.0"
}
}
diff --git a/src/Settings/NumberGeneratorSettings/NumberGeneratorSettings.js b/src/Settings/NumberGeneratorSettings/NumberGeneratorSettings.js
new file mode 100644
index 00000000..442278b8
--- /dev/null
+++ b/src/Settings/NumberGeneratorSettings/NumberGeneratorSettings.js
@@ -0,0 +1,52 @@
+import { FormattedMessage } from 'react-intl';
+
+import { Loading } from '@folio/stripes/components';
+import { useOkapiKy } from '@folio/stripes/core';
+import { useShowCallout } from '@folio/stripes-acq-components';
+
+import NumberGeneratorSettingsForm from './NumberGeneratorSettingsForm';
+import { SETTINGS_API } from '../../common/constants/api';
+import { VENDOR_CODE_GENERATOR_SETTINGS_KEY } from '../../common/constants/numberGenerator';
+import { useVendorCodeGeneratorSettings } from '../../common/hooks/useVendorCodeGeneratorSettings';
+
+const NumberGeneratorSettings = () => {
+ const { vendorCodeSetting, isLoading } = useVendorCodeGeneratorSettings();
+ const ky = useOkapiKy();
+ const sendCallout = useShowCallout();
+
+ const onSubmit = async ({ [VENDOR_CODE_GENERATOR_SETTINGS_KEY]: value }) => {
+ try {
+ if (vendorCodeSetting) {
+ await ky.put(`${SETTINGS_API}/${vendorCodeSetting.id}`, {
+ json: { ...vendorCodeSetting, value },
+ });
+ } else {
+ await ky.post(SETTINGS_API, {
+ json: { key: VENDOR_CODE_GENERATOR_SETTINGS_KEY, value },
+ });
+ }
+
+ sendCallout({
+ message: ,
+ });
+ } catch (error) {
+ sendCallout({
+ type: 'error',
+ message: ,
+ });
+ }
+ };
+
+ if (isLoading) {
+ return ;
+ }
+
+ return (
+
+ );
+};
+
+export default NumberGeneratorSettings;
diff --git a/src/Settings/NumberGeneratorSettings/NumberGeneratorSettings.test.js b/src/Settings/NumberGeneratorSettings/NumberGeneratorSettings.test.js
new file mode 100644
index 00000000..1f5bc26f
--- /dev/null
+++ b/src/Settings/NumberGeneratorSettings/NumberGeneratorSettings.test.js
@@ -0,0 +1,117 @@
+import { FormattedMessage } from 'react-intl';
+
+import {
+ render,
+ screen,
+} from '@folio/jest-config-stripes/testing-library/react';
+import userEvent from '@folio/jest-config-stripes/testing-library/user-event';
+import { useOkapiKy } from '@folio/stripes/core';
+import { useShowCallout } from '@folio/stripes-acq-components';
+
+import NumberGeneratorSettings from './NumberGeneratorSettings';
+import { SETTINGS_API } from '../../common/constants/api';
+import { useVendorCodeGeneratorSettings } from '../../common/hooks/useVendorCodeGeneratorSettings';
+
+jest.mock('@folio/stripes/core', () => ({
+ useOkapiKy: jest.fn(),
+}));
+
+jest.mock('@folio/stripes-acq-components', () => ({
+ useShowCallout: jest.fn(),
+}));
+
+jest.mock('../../common/hooks/useVendorCodeGeneratorSettings');
+
+jest.mock('@folio/stripes/components', () => ({
+ Loading: () =>
Loading
,
+}));
+
+jest.mock('../../common/constants/numberGenerator', () => ({
+ ...jest.requireActual('../../common/constants/numberGenerator'),
+ VENDOR_CODE_GENERATOR_SETTINGS_KEY: 'testKey',
+}));
+
+jest.mock('./NumberGeneratorSettingsForm', () => jest.fn(({ onSubmit }) => (
+
+)));
+
+const renderComponent = () => render();
+
+describe('NumberGeneratorSettings', () => {
+ const mockKyPut = jest.fn();
+ const mockKyPost = jest.fn();
+ const mockSendCallout = jest.fn();
+
+ beforeEach(() => {
+ useOkapiKy.mockReturnValue({
+ put: mockKyPut,
+ post: mockKyPost,
+ });
+ useShowCallout.mockReturnValue(mockSendCallout);
+ });
+
+ it('should render Loading', () => {
+ useVendorCodeGeneratorSettings.mockReturnValue({ isLoading: true });
+ renderComponent();
+ expect(screen.getByText('Loading')).toBeInTheDocument();
+ });
+
+ it('should render NumberGeneratorSettingsForm', () => {
+ useVendorCodeGeneratorSettings.mockReturnValue({ isLoading: false });
+ renderComponent();
+ expect(screen.getByText('Submit')).toBeInTheDocument();
+ });
+
+ it('should call ky.post when no setting is present', async () => {
+ useVendorCodeGeneratorSettings.mockReturnValue({ isLoading: false });
+ renderComponent();
+
+ await userEvent.click(screen.getByText('Submit'));
+
+ expect(mockKyPost).toHaveBeenCalledWith(SETTINGS_API, {
+ json: { key: 'testKey', value: 'testValue' },
+ });
+ expect(mockSendCallout).toHaveBeenCalledWith({
+ message: ,
+ });
+ });
+
+ it('should call ky.put when setting exists', async () => {
+ const vendorCodeSetting = { id: '123', key: 'testKey', value: 'someValue', _version: 1 };
+
+ useVendorCodeGeneratorSettings.mockReturnValue({
+ isLoading: false,
+ vendorCodeSetting,
+ });
+ renderComponent();
+
+ await userEvent.click(screen.getByText('Submit'));
+
+ expect(mockKyPut).toHaveBeenCalledWith(`${SETTINGS_API}/${vendorCodeSetting.id}`, {
+ json: { ...vendorCodeSetting, value: 'testValue' },
+ });
+ expect(mockSendCallout).toHaveBeenCalledWith({
+ message: ,
+ });
+ });
+
+ it('should show error callout when submission fails', async () => {
+ useVendorCodeGeneratorSettings.mockReturnValue({ isLoading: false });
+ mockKyPost.mockRejectedValue(new Error());
+ renderComponent();
+
+ await userEvent.click(screen.getByText('Submit'));
+
+ expect(mockSendCallout).toHaveBeenCalledWith({
+ type: 'error',
+ message: ,
+ });
+ });
+});
diff --git a/src/Settings/NumberGeneratorSettings/NumberGeneratorSettingsForm.js b/src/Settings/NumberGeneratorSettings/NumberGeneratorSettingsForm.js
index 5edd4835..3f43e906 100644
--- a/src/Settings/NumberGeneratorSettings/NumberGeneratorSettingsForm.js
+++ b/src/Settings/NumberGeneratorSettings/NumberGeneratorSettingsForm.js
@@ -1,40 +1,51 @@
-import { useMemo } from 'react';
+import PropTypes from 'prop-types';
import { Field } from 'react-final-form';
import { FormattedMessage } from 'react-intl';
import {
+ Button,
Col,
MessageBanner,
+ Pane,
+ PaneFooter,
+ PaneHeader,
RadioButton,
Row,
} from '@folio/stripes/components';
-import { useStripes } from '@folio/stripes/core';
-import { ConfigManager } from '@folio/stripes/smart-components';
+import stripesFinalForm from '@folio/stripes/final-form';
import css from './NumberGeneratorSettingsForm.css';
import {
VENDOR_CODE_GENERATOR_OPTIONS,
VENDOR_CODE_GENERATOR_SETTINGS_KEY,
- VENDOR_CODE_GENERATOR_SETTINGS_SCOPE,
} from '../../common/constants/numberGenerator';
-export const NumberGeneratorSettingsForm = () => {
- const stripes = useStripes();
- const ConnectedConfigManager = useMemo(() => stripes.connect(ConfigManager), [stripes]);
+const NumberGeneratorSettingsForm = ({ handleSubmit, pristine, submitting }) => {
+ const paneHeader = (renderProps) => (
+ }
+ />
+ );
- const beforeSave = (data) => data[VENDOR_CODE_GENERATOR_SETTINGS_KEY] || '';
- const getInitialValues = (items) => ({ [VENDOR_CODE_GENERATOR_SETTINGS_KEY]: items?.[0]?.value || '' });
+ const paneFooter = (
+
+
+
+ }
+ />
+ );
return (
- }
- onBeforeSave={beforeSave}
- scope={VENDOR_CODE_GENERATOR_SETTINGS_SCOPE}
- stripes={stripes}
- >
+
@@ -72,6 +83,19 @@ export const NumberGeneratorSettingsForm = () => {
/>
-
+
);
};
+
+NumberGeneratorSettingsForm.propTypes = {
+ handleSubmit: PropTypes.func.isRequired,
+ pristine: PropTypes.bool.isRequired,
+ submitting: PropTypes.bool.isRequired,
+};
+
+export default stripesFinalForm({
+ enableReinitialize: true,
+ keepDirtyOnReinitialize: true,
+ navigationCheck: true,
+ subscription: { values: true },
+})(NumberGeneratorSettingsForm);
diff --git a/src/Settings/NumberGeneratorSettings/NumberGeneratorSettingsForm.test.js b/src/Settings/NumberGeneratorSettings/NumberGeneratorSettingsForm.test.js
index b863f63a..81845d9d 100644
--- a/src/Settings/NumberGeneratorSettings/NumberGeneratorSettingsForm.test.js
+++ b/src/Settings/NumberGeneratorSettings/NumberGeneratorSettingsForm.test.js
@@ -1,49 +1,63 @@
-import { Form } from 'react-final-form';
+import { MemoryRouter } from 'react-router-dom';
import {
render,
screen,
} from '@folio/jest-config-stripes/testing-library/react';
-import { useStripes } from '@folio/stripes/core';
+import userEvent from '@folio/jest-config-stripes/testing-library/user-event';
-import { NumberGeneratorSettingsForm } from './NumberGeneratorSettingsForm';
+import NumberGeneratorSettingsForm from './NumberGeneratorSettingsForm';
+import {
+ VENDOR_CODE_GENERATOR_OPTIONS,
+ VENDOR_CODE_GENERATOR_SETTINGS_KEY,
+} from '../../common/constants/numberGenerator';
jest.mock('@folio/stripes/core', () => ({
useStripes: jest.fn(),
}));
-jest.mock('@folio/stripes/smart-components', () => ({
- ConfigManager: jest.fn(({ children }) =>
{children}
),
-}));
-
-const stripesMock = {
- connect: jest.fn((component) => component),
-};
+const onSubmitMock = jest.fn();
const renderComponent = () => render(
-