@k-int/stripes-kint-components 5.8.2 → 5.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/es/lib/ActionList/ActionListFieldArray.js +6 -6
  3. package/es/lib/CustomProperties/Config/CustomPropertiesSettings.js +3 -0
  4. package/es/lib/CustomProperties/Edit/CustomPropertyField.js +1 -1
  5. package/es/lib/EditableRefdataList/EditableRefdataList.js +2 -0
  6. package/es/lib/NumberField/NumberField.js +12 -5
  7. package/es/lib/NumberField/NumberField.test.js +192 -0
  8. package/es/lib/hooks/index.js +11 -4
  9. package/es/lib/hooks/useMutateCustomProperties.js +13 -35
  10. package/es/lib/hooks/useMutateGeneric.js +91 -0
  11. package/es/lib/hooks/useMutateRefdataCategory.js +38 -29
  12. package/es/lib/hooks/useMutateRefdataValue.js +54 -37
  13. package/package.json +1 -1
  14. package/src/lib/ActionList/ActionListFieldArray.js +5 -6
  15. package/src/lib/CustomProperties/Config/CustomPropertiesSettings.js +2 -0
  16. package/src/lib/CustomProperties/Edit/CustomPropertyField.js +1 -1
  17. package/src/lib/EditableRefdataList/EditableRefdataList.js +2 -0
  18. package/src/lib/NumberField/NumberField.js +14 -7
  19. package/src/lib/NumberField/NumberField.test.js +248 -0
  20. package/src/lib/QueryTypedown/README.md +72 -0
  21. package/src/lib/Typedown/EXAMPLE.md +115 -0
  22. package/src/lib/Typedown/README.md +43 -113
  23. package/src/lib/hooks/README.md +48 -13
  24. package/src/lib/hooks/index.js +6 -4
  25. package/src/lib/hooks/useMutateCustomProperties.js +12 -58
  26. package/src/lib/hooks/useMutateGeneric.js +103 -0
  27. package/src/lib/hooks/useMutateRefdataCategory.js +38 -49
  28. package/src/lib/hooks/useMutateRefdataValue.js +70 -65
package/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # [5.9.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.8.3...v5.9.0) (2025-01-31)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Ensure first field always gets focus ([144624e](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/144624e290e5f11db558e6345a979979ee84af34))
7
+
8
+
9
+ ### Features
10
+
11
+ * useMutateGeneric ([7e9a1e6](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/7e9a1e6ceaef4157adf5ffe08da03269006d86f9))
12
+
13
+ ## [5.8.3](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.8.2...v5.8.3) (2024-10-23)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * ERM-3391--NumberField doesnt update display value from form state changes ([cb44d06](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/cb44d063aed221cb544204b8b5d9df6dc313e9c2))
19
+
1
20
  ## [5.8.2](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.8.1...v5.8.2) (2024-09-11)
2
21
 
3
22
 
@@ -327,13 +327,14 @@ const ActionListFieldArray = /*#__PURE__*/(0, _react.forwardRef)((_ref2, ref) =>
327
327
  formatter,
328
328
  ...restOfMclProps
329
329
  } = mclProps; // Destructure formatter part of mclProps
330
+
330
331
  const fieldAwareFormatter = () => {
331
332
  const returnObj = {};
332
333
  // For each visible field, if it's being edited then ignore passed formatters, else use them
333
334
 
334
- // Track whether we've autoFocused on a field yet
335
- let autoFocus = true;
336
- visibleFields.forEach(key => {
335
+ visibleFields.forEach((key, index) => {
336
+ // Work out now whether or not to autofocus, so that gets cemented into the returnObj function
337
+ const shouldAutoFocus = index === 0;
337
338
  returnObj[key] = cd => {
338
339
  // Row is being edited if it has no id, or its id is in the editing string
339
340
  const editingRow = cd.id === editing || !cd.id;
@@ -368,15 +369,14 @@ const ActionListFieldArray = /*#__PURE__*/(0, _react.forwardRef)((_ref2, ref) =>
368
369
  returnValue = fieldComponents[key] ? fieldComponents[key](passedObject) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFinalForm.Field, {
369
370
  ariaLabel: key // TODO at the moment the only way to override this is passing in an entire fieldComponent.
370
371
  ,
371
- autoFocus: autoFocus,
372
+ autoFocus: shouldAutoFocus // TODO at the moment this will always be the first field, even if it's not editable
373
+ ,
372
374
  component: _components.TextField,
373
375
  marginBottom0: true,
374
376
  name: `${cd.fieldName}.${key}`,
375
377
  parse: v => v,
376
378
  validate: validateFunction
377
379
  });
378
- // After first field, every other field should not autofocus
379
- autoFocus = false;
380
380
  }
381
381
  }
382
382
  return returnValue;
@@ -72,6 +72,9 @@ const CustomPropertiesSettings = _ref => {
72
72
  })
73
73
  }];
74
74
  }
75
+
76
+ // TODO consider moving some of the invalidations etc into the useMutateCustomProperties hook?
77
+ // Also all around patterns for defaulting afterQueryCalls etc are not ideal
75
78
  const {
76
79
  post: createCustprop,
77
80
  put: editCustProp,
@@ -162,7 +162,7 @@ const CustomPropertyField = _ref => {
162
162
  component: _components.MultiSelection,
163
163
  // The "not set" value is not relevant for a multi select
164
164
  dataOptions: (0, _orderBy.default)(customProperty.options?.filter(opt => !!opt?.value), 'label'),
165
- renderToOverlay: true
165
+ renderToOverlay: true // FIXME Switch to usePortal for stripes v10
166
166
  };
167
167
  // MultiSelection passes the changed array as a value not an event
168
168
  handleChange = refdataArray => {
@@ -92,6 +92,7 @@ const EditableRefdataList = _ref => {
92
92
  }, [isRefdataLoading, refdata]);
93
93
 
94
94
  // Edit and Create will use the same PUT mutation
95
+ // TODO I believe after the changes to refactor to useMutateGeneric, we can now use POST separately to get differing callouts etc
95
96
  const {
96
97
  delete: deleteRefdataValue,
97
98
  put: editRefdataValue
@@ -115,6 +116,7 @@ const EditableRefdataList = _ref => {
115
116
  // or one provided in labelOverrides, which is passed the error message and refdata in question
116
117
  delete: async err => {
117
118
  const errorResp = await (0, _utils.parseErrorResponse)(err.response);
119
+ console.log("ERRORRESP: %o", errorResp);
118
120
  callout.sendCallout({
119
121
  message: kintIntl.formatKintMessage({
120
122
  id: 'refdata.deleteRefdataValue.errorMessage',
@@ -31,13 +31,18 @@ const NumberField = props => {
31
31
 
32
32
  // Allow direct control of field
33
33
  (0, _react.useEffect)(() => {
34
- if (value && numValue !== value) {
35
- setNumValue(value);
34
+ const valueToUse = value ?? input.value;
35
+ if (!valueToUse && numValue) {
36
+ // Make sure to empty out if it's cleared. Treating '' as empty instead of undefined
37
+ setNumValue('');
38
+ }
39
+ if (valueToUse && numValue !== valueToUse) {
40
+ setNumValue(valueToUse);
36
41
  }
37
- if (numValue && forceControl !== numValue) {
42
+ if (forceControl !== numValue) {
38
43
  setForceControl(numValue);
39
44
  }
40
- }, [forceControl, numValue, value]);
45
+ }, [forceControl, numValue, value, input]);
41
46
  const handleChange = e => {
42
47
  // Actually set the value in the form
43
48
  if (input?.onChange) {
@@ -55,7 +60,7 @@ const NumberField = props => {
55
60
  const handleUserChange = e => {
56
61
  const parsedValue = parseFloat(e.target.value);
57
62
 
58
- // ReturnValue needed for contorlled components
63
+ // ReturnValue needed for controlled components
59
64
  if (parsedValue || parsedValue === 0) {
60
65
  setNumValue(parsedValue);
61
66
  changeField(parsedValue);
@@ -83,6 +88,7 @@ const NumberField = props => {
83
88
  ref: inputRef,
84
89
  ...input,
85
90
  hidden: true,
91
+ id: input?.name,
86
92
  onChange: handleChange,
87
93
  type: "number",
88
94
  value: numValue
@@ -93,6 +99,7 @@ NumberField.propTypes = {
93
99
  onBlur: _propTypes.default.func,
94
100
  onChange: _propTypes.default.func,
95
101
  input: _propTypes.default.shape({
102
+ name: _propTypes.default.string.isRequired,
96
103
  onChange: _propTypes.default.func.isRequired,
97
104
  onBlur: _propTypes.default.func,
98
105
  value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string])
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+
3
+ var _react = require("react");
4
+ var _reactFinalForm = require("react-final-form");
5
+ var _userEvent = _interopRequireDefault(require("@folio/jest-config-stripes/testing-library/user-event"));
6
+ var _react2 = require("@folio/jest-config-stripes/testing-library/react");
7
+ var _stripesErmTesting = require("@folio/stripes-erm-testing");
8
+ var _components = require("@folio/stripes/components");
9
+ var _NumberField = _interopRequireDefault(require("./NumberField"));
10
+ var _helpers = require("../../../test/jest/helpers");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ const onSubmit = jest.fn();
14
+ const NUMBER_FIELD_LABEL = 'TEST NUMBER FIELD';
15
+ const NUMBER_FIELD_ID = 'number-field-test';
16
+ const NUMBER_FIELD_INPUT_ID = 'input-id-test';
17
+ const RESET_BUTTON_LABEL = 'RESET NUMBER FIELD';
18
+
19
+ // We need to use jest selectors instead of interactors as the TextField interactor
20
+ // can't handle the double-text-field nature of NumberField
21
+ const getTextField = () => {
22
+ // Spinbutton because it's a "number" type textField...
23
+ return _react2.screen.getByRole('spinbutton', {
24
+ name: NUMBER_FIELD_LABEL
25
+ });
26
+ };
27
+ const testSubmitValues = expectedValues => {
28
+ describe('submitting the form', () => {
29
+ beforeEach(async () => {
30
+ await (0, _react2.waitFor)(async () => {
31
+ await (0, _stripesErmTesting.Button)('Submit').click();
32
+ });
33
+ });
34
+ it('submits with expected values', async () => {
35
+ await (0, _react2.waitFor)(() => {
36
+ expect(onSubmit.mock.calls?.[0]?.[0]).toEqual(expectedValues);
37
+ });
38
+ });
39
+ });
40
+ };
41
+ const SpecialResetButton = () => {
42
+ const {
43
+ change
44
+ } = (0, _reactFinalForm.useForm)();
45
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Button, {
46
+ onClick: () => change(NUMBER_FIELD_INPUT_ID, undefined),
47
+ children: RESET_BUTTON_LABEL
48
+ });
49
+ };
50
+ const NonControlledComponent = () => {
51
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
52
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SpecialResetButton, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFinalForm.Field, {
53
+ component: _NumberField.default,
54
+ id: NUMBER_FIELD_ID,
55
+ label: NUMBER_FIELD_LABEL,
56
+ name: NUMBER_FIELD_INPUT_ID
57
+ })]
58
+ });
59
+ };
60
+ const ControlledComponent = () => {
61
+ const [value, setValue] = (0, _react.useState)();
62
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
63
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SpecialResetButton, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFinalForm.Field, {
64
+ component: _NumberField.default,
65
+ id: NUMBER_FIELD_ID,
66
+ label: NUMBER_FIELD_LABEL,
67
+ name: NUMBER_FIELD_INPUT_ID,
68
+ onChange: e => setValue(e.target.value),
69
+ value: value
70
+ })]
71
+ });
72
+ };
73
+
74
+ // EXAMPLE nesting repeated tests with describe.each or test.each might speed up some of our test writing
75
+ describe.each([['Non-Controlled', /*#__PURE__*/(0, _jsxRuntime.jsx)(NonControlledComponent, {})], ['Controlled', /*#__PURE__*/(0, _jsxRuntime.jsx)(ControlledComponent, {})]])('NumberField', (controlType, component) => {
76
+ let _renderComponent;
77
+ let textField;
78
+ describe(`Regular usage (${controlType})`, () => {
79
+ beforeEach(async () => {
80
+ onSubmit.mockClear();
81
+ _renderComponent = (0, _helpers.renderWithKintHarness)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_stripesErmTesting.TestForm, {
82
+ initialValues: {},
83
+ onSubmit: onSubmit,
84
+ children: component
85
+ }));
86
+ textField = getTextField();
87
+ });
88
+ it('renders text field as expected', () => {
89
+ expect(textField).toBeInTheDocument();
90
+ });
91
+ describe.each([['non-numeric characters', 'sdhukjasklfs', '', {}], ['numeric characters', '12345', '12345', {
92
+ [NUMBER_FIELD_INPUT_ID]: '12345'
93
+ }], ['scientific notation', '1e5', '100000', {
94
+ [NUMBER_FIELD_INPUT_ID]: '100000'
95
+ }], ['negative numbers', '-100', '-100', {
96
+ [NUMBER_FIELD_INPUT_ID]: '-100'
97
+ }]])('Typing', (characterType, typedChars, expectedDisplay, expectedSubmit) => {
98
+ describe(`typing ${characterType}`, () => {
99
+ beforeEach(async () => {
100
+ await (0, _react2.waitFor)(async () => {
101
+ await _userEvent.default.type(textField, typedChars);
102
+ });
103
+ });
104
+ it('does not render typed characters', async () => {
105
+ expect(textField).toHaveDisplayValue(expectedDisplay);
106
+ });
107
+ testSubmitValues(expectedSubmit);
108
+ });
109
+ });
110
+ });
111
+ describe.each([['numeric initialvalues', {
112
+ [NUMBER_FIELD_INPUT_ID]: '7654321'
113
+ }, '7654321', {
114
+ [NUMBER_FIELD_INPUT_ID]: '7654321'
115
+ }], ['regular scientific initialvalue NOTE: scientific value parsing does NOT work from initialValues', {
116
+ [NUMBER_FIELD_INPUT_ID]: '3e7'
117
+ }, '3e7', {
118
+ [NUMBER_FIELD_INPUT_ID]: '3e7'
119
+ }], ['negative initialvalue', {
120
+ [NUMBER_FIELD_INPUT_ID]: '-100'
121
+ }, '-100', {
122
+ [NUMBER_FIELD_INPUT_ID]: '-100'
123
+ }]])(`Initial values (${controlType})`, (describeTitle, initialValues, displayValue, expectedSubmit) => {
124
+ describe(describeTitle, () => {
125
+ beforeEach(async () => {
126
+ onSubmit.mockClear();
127
+ _renderComponent = (0, _helpers.renderWithKintHarness)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_stripesErmTesting.TestForm, {
128
+ initialValues: initialValues,
129
+ onSubmit: onSubmit,
130
+ children: component
131
+ }));
132
+ textField = getTextField();
133
+ });
134
+ it('renders initial value', async () => {
135
+ expect(textField).toHaveDisplayValue(displayValue);
136
+ });
137
+ testSubmitValues(expectedSubmit);
138
+ });
139
+ });
140
+ describe.each([['Clear after typing', async () => {
141
+ onSubmit.mockClear();
142
+ _renderComponent = (0, _helpers.renderWithKintHarness)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_stripesErmTesting.TestForm, {
143
+ initialValues: {},
144
+ onSubmit: onSubmit,
145
+ children: component
146
+ }));
147
+ textField = getTextField();
148
+ await (0, _react2.waitFor)(async () => {
149
+ await _userEvent.default.type(textField, '32786843');
150
+ });
151
+ }], ['Clear from initialValues', async () => {
152
+ onSubmit.mockClear();
153
+ _renderComponent = (0, _helpers.renderWithKintHarness)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_stripesErmTesting.TestForm, {
154
+ initialValues: {
155
+ [NUMBER_FIELD_INPUT_ID]: '32786843'
156
+ },
157
+ onSubmit: onSubmit,
158
+ children: component
159
+ }));
160
+ textField = getTextField();
161
+ }]])(`ERM-3391: state change underneath component (${controlType})`, (clearType, beforeEachFunc) => {
162
+ describe(clearType, () => {
163
+ beforeEach(beforeEachFunc);
164
+ it('renders text field', () => {
165
+ expect(textField).toBeInTheDocument();
166
+ });
167
+ it('renders special reset button', async () => {
168
+ await (0, _stripesErmTesting.Button)(RESET_BUTTON_LABEL).exists();
169
+ });
170
+ describe.each([['Control', false, '32786843', {
171
+ [NUMBER_FIELD_INPUT_ID]: '32786843'
172
+ }], ['After reset', true, '', {}]])('Test reset', (describeTitle, clearField, expectedValue, expectedSubmit) => {
173
+ describe(describeTitle, () => {
174
+ beforeEach(async () => {
175
+ onSubmit.mockClear();
176
+ if (clearField) {
177
+ await (0, _react2.waitFor)(async () => {
178
+ await (0, _stripesErmTesting.Button)(RESET_BUTTON_LABEL).click();
179
+ });
180
+ }
181
+ });
182
+ it(`renders text field with display value: ${expectedValue}`, async () => {
183
+ await (0, _react2.waitFor)(() => {
184
+ expect(textField).toHaveDisplayValue(expectedValue);
185
+ });
186
+ });
187
+ testSubmitValues(expectedSubmit);
188
+ });
189
+ });
190
+ });
191
+ });
192
+ });
@@ -81,6 +81,12 @@ Object.defineProperty(exports, "useMutateCustomProperties", {
81
81
  return _useMutateCustomProperties.default;
82
82
  }
83
83
  });
84
+ Object.defineProperty(exports, "useMutateGeneric", {
85
+ enumerable: true,
86
+ get: function () {
87
+ return _useMutateGeneric.default;
88
+ }
89
+ });
84
90
  Object.defineProperty(exports, "useMutateModConfigEntry", {
85
91
  enumerable: true,
86
92
  get: function () {
@@ -125,7 +131,6 @@ Object.defineProperty(exports, "useTemplates", {
125
131
  });
126
132
  var _useRefdata = _interopRequireDefault(require("./useRefdata"));
127
133
  var _useTemplates = _interopRequireDefault(require("./useTemplates"));
128
- var _useMutateRefdataValue = _interopRequireDefault(require("./useMutateRefdataValue"));
129
134
  var _useActiveElement = _interopRequireDefault(require("./useActiveElement"));
130
135
  var _useKiwtSASQuery = _interopRequireDefault(require("./useKiwtSASQuery"));
131
136
  var _useHelperApp = _interopRequireDefault(require("./useHelperApp"));
@@ -133,14 +138,16 @@ var _useLocalStorageState = _interopRequireDefault(require("./useLocalStorageSta
133
138
  var _useQIndex = _interopRequireDefault(require("./useQIndex"));
134
139
  var _useKiwtFieldArray = _interopRequireDefault(require("./useKiwtFieldArray"));
135
140
  var _useCustomProperties = _interopRequireDefault(require("./useCustomProperties"));
136
- var _useMutateCustomProperties = _interopRequireDefault(require("./useMutateCustomProperties"));
137
141
  var _useInvalidateRefdata = _interopRequireDefault(require("./useInvalidateRefdata"));
138
- var _useMutateRefdataCategory = _interopRequireDefault(require("./useMutateRefdataCategory"));
139
142
  var _useKintIntl = _interopRequireDefault(require("./useKintIntl"));
140
143
  var _useIntlKeyStore = _interopRequireDefault(require("./useIntlKeyStore"));
141
144
  var _useIntlKey = _interopRequireDefault(require("./useIntlKey"));
142
145
  var _useSASQQueryMeta = _interopRequireDefault(require("./useSASQQueryMeta"));
143
146
  var _useModConfigEntries = _interopRequireDefault(require("./useModConfigEntries"));
144
- var _useMutateModConfigEntry = _interopRequireDefault(require("./useMutateModConfigEntry"));
145
147
  var _useActionListRef = _interopRequireDefault(require("./useActionListRef"));
148
+ var _useMutateGeneric = _interopRequireDefault(require("./useMutateGeneric"));
149
+ var _useMutateRefdataValue = _interopRequireDefault(require("./useMutateRefdataValue"));
150
+ var _useMutateRefdataCategory = _interopRequireDefault(require("./useMutateRefdataCategory"));
151
+ var _useMutateCustomProperties = _interopRequireDefault(require("./useMutateCustomProperties"));
152
+ var _useMutateModConfigEntry = _interopRequireDefault(require("./useMutateModConfigEntry"));
146
153
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -4,45 +4,23 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _reactQuery = require("react-query");
8
- var _core = require("@folio/stripes/core");
7
+ var _useMutateGeneric = _interopRequireDefault(require("./useMutateGeneric"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
9
  const useMutateCustomProperties = _ref => {
10
10
  let {
11
- afterQueryCalls,
12
- catchQueryCalls,
13
11
  endpoint,
14
12
  id,
15
- queryParams,
16
- returnQueryObject = {
17
- post: false,
18
- put: false,
19
- delete: false
20
- }
13
+ ...mutateGenericProps
21
14
  } = _ref;
22
- const returnObj = {};
23
- const ky = (0, _core.useOkapiKy)();
24
- const deleteQueryObject = (0, _reactQuery.useMutation)(['stripes-kint-components', 'useMutateCustomProperties', 'delete', id], async () => ky.delete(`${endpoint}/${id}`).json().then(afterQueryCalls?.delete).catch(catchQueryCalls?.delete), queryParams?.delete);
25
- const putQueryObject = (0, _reactQuery.useMutation)(['stripes-kint-components', 'useMutateCustomProperties', 'put', id], async data => ky.put(`${endpoint}/${id}`, {
26
- json: data
27
- }).json().then(afterQueryCalls?.put).catch(catchQueryCalls?.put), queryParams?.put);
28
- const postQueryObject = (0, _reactQuery.useMutation)(['stripes-kint-components', 'useMutateCustomProperties', 'post'], async data => ky.post(`${endpoint}`, {
29
- json: data
30
- }).json().then(afterQueryCalls?.post).catch(catchQueryCalls?.post), queryParams?.post);
31
- if (returnQueryObject?.delete) {
32
- returnObj.delete = deleteQueryObject;
33
- } else {
34
- returnObj.delete = deleteQueryObject.mutateAsync;
35
- }
36
- if (returnQueryObject?.put) {
37
- returnObj.put = putQueryObject;
38
- } else {
39
- returnObj.put = putQueryObject.mutateAsync;
40
- }
41
- if (returnQueryObject?.post) {
42
- returnObj.post = postQueryObject;
43
- } else {
44
- returnObj.post = postQueryObject.mutateAsync;
45
- }
46
- return returnObj;
15
+ return (0, _useMutateGeneric.default)({
16
+ endpoint,
17
+ endpointMutators: {
18
+ delete: () => `${endpoint}/${id}`,
19
+ put: () => `${endpoint}/${id}`
20
+ },
21
+ id,
22
+ queryKey: ['stripes-kint-components', 'useMutateCustomProperties', id],
23
+ ...mutateGenericProps
24
+ });
47
25
  };
48
26
  var _default = exports.default = useMutateCustomProperties;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _reactQuery = require("react-query");
8
+ var _noop = _interopRequireDefault(require("lodash/noop"));
9
+ var _core = require("@folio/stripes/core");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ // DEFAULT ASSUMES PUT/POST goes to ENDPOINT/id and that POST goes to ENDPOINT
12
+ // A utility function to provide this all-in-one functionality used in various places
13
+
14
+ const useMutateGeneric = function () {
15
+ let {
16
+ afterQueryCalls: {
17
+ delete: afterQueryDelete = _noop.default,
18
+ post: afterQueryPost = _noop.default,
19
+ put: afterQueryPut = _noop.default
20
+ } = {},
21
+ catchQueryCalls: {
22
+ delete: catchQueryDelete = _noop.default,
23
+ post: catchQueryPost = _noop.default,
24
+ put: catchQueryPut = _noop.default
25
+ } = {},
26
+ endpoint,
27
+ endpointMutators: {
28
+ delete: endpointMutatorDelete = id => `${endpoint}/${id}`,
29
+ post: endpointMutatorPost = () => endpoint,
30
+ put: endpointMutatorPut = data => `${endpoint}/${data.id}`
31
+ } = {},
32
+ payloadMutators: {
33
+ post: payloadMutatorPost = data => ({
34
+ json: data
35
+ }),
36
+ put: payloadMutatorPut = data => ({
37
+ json: data
38
+ })
39
+ } = {},
40
+ promiseReturns: {
41
+ delete: promiseReturnDelete = (id, ky) => ky.delete(endpointMutatorDelete(id)).json(),
42
+ post: promiseReturnPost = (data, ky) => ky.post(endpointMutatorPost(data), payloadMutatorPost(data)).json(),
43
+ put: promiseReturnPut = (data, ky) => ky.put(endpointMutatorPut(data), payloadMutatorPut(data)).json()
44
+ } = {},
45
+ queryKey = [],
46
+ // Must be type: array
47
+ queryKeyMutators: {
48
+ delete: queryKeyMutatorDelete = () => [...queryKey, 'delete'],
49
+ post: queryKeyMutatorPost = () => [...queryKey, 'create'],
50
+ put: queryKeyMutatorPut = () => [...queryKey, 'edit']
51
+ } = {},
52
+ queryParams: {
53
+ delete: queryParamsDelete = {},
54
+ post: queryParamsPost = {},
55
+ put: queryParamsPut = {}
56
+ } = {},
57
+ returnQueryObject: {
58
+ delete: returnQueryObjectDelete = false,
59
+ post: returnQueryObjectPost = false,
60
+ put: returnQueryObjectPut = false
61
+ } = {}
62
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
63
+ const ky = (0, _core.useOkapiKy)();
64
+
65
+ // DELETE Object
66
+ const deleteQueryObject = (0, _reactQuery.useMutation)(queryKeyMutatorDelete(), async id => promiseReturnDelete(id, ky).then(res => afterQueryDelete(res)).catch(catchQueryDelete), queryParamsDelete);
67
+
68
+ // Edit Object
69
+ const putQueryObject = (0, _reactQuery.useMutation)(queryKeyMutatorPut(), async data => promiseReturnPut(data, ky).then(afterQueryPut).catch(catchQueryPut), queryParamsPut);
70
+
71
+ // Create Object
72
+ const postQueryObject = (0, _reactQuery.useMutation)(queryKeyMutatorPost(), async data => promiseReturnPost(data, ky).then(afterQueryPost).catch(catchQueryPost), queryParamsPost);
73
+ const returnObj = {};
74
+ if (returnQueryObjectDelete) {
75
+ returnObj.delete = deleteQueryObject;
76
+ } else {
77
+ returnObj.delete = deleteQueryObject.mutateAsync;
78
+ }
79
+ if (returnQueryObjectPut) {
80
+ returnObj.put = putQueryObject;
81
+ } else {
82
+ returnObj.put = putQueryObject.mutateAsync;
83
+ }
84
+ if (returnQueryObjectPost) {
85
+ returnObj.post = postQueryObject;
86
+ } else {
87
+ returnObj.post = postQueryObject.mutateAsync;
88
+ }
89
+ return returnObj;
90
+ };
91
+ var _default = exports.default = useMutateGeneric;
@@ -4,41 +4,50 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _reactQuery = require("react-query");
8
- var _core = require("@folio/stripes/core");
7
+ var _noop = _interopRequireDefault(require("lodash/noop"));
9
8
  var _useInvalidateRefdata = _interopRequireDefault(require("./useInvalidateRefdata"));
9
+ var _useMutateGeneric = _interopRequireDefault(require("./useMutateGeneric"));
10
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
11
  const useMutateRefdataCategory = _ref => {
12
12
  let {
13
- afterQueryCalls,
14
- catchQueryCalls,
13
+ afterQueryCalls: {
14
+ delete: afterQueryDelete = _noop.default,
15
+ post: afterQueryPost = _noop.default,
16
+ put: afterQueryPut = _noop.default
17
+ } = {},
15
18
  endpoint,
16
- queryParams,
17
- returnQueryObject = {
18
- post: false,
19
- delete: false
20
- }
19
+ ...mutateGenericProps
21
20
  } = _ref;
22
- const returnObj = {};
23
- const ky = (0, _core.useOkapiKy)();
24
21
  const invalidateRefdata = (0, _useInvalidateRefdata.default)();
25
- const deleteQueryObject = (0, _reactQuery.useMutation)(['stripes-kint-components', 'useMutateRefdataCategory', 'delete'], async id => ky.delete(`${endpoint}/${id}`).json().then(afterQueryCalls?.delete).then(() => invalidateRefdata()).catch(catchQueryCalls?.delete), queryParams?.delete);
26
- const postQueryObject = (0, _reactQuery.useMutation)(['stripes-kint-components', 'useMutateRefdataCategory', 'post'], async payload => ky.post(endpoint, {
27
- json: {
28
- ...payload,
29
- values: []
30
- }
31
- }).json().then(afterQueryCalls?.post).then(() => invalidateRefdata()).catch(catchQueryCalls?.post), queryParams?.post);
32
- if (returnQueryObject?.delete) {
33
- returnObj.delete = deleteQueryObject;
34
- } else {
35
- returnObj.delete = deleteQueryObject.mutateAsync;
36
- }
37
- if (returnQueryObject?.post) {
38
- returnObj.post = postQueryObject;
39
- } else {
40
- returnObj.post = postQueryObject.mutateAsync;
41
- }
42
- return returnObj;
22
+ return (0, _useMutateGeneric.default)({
23
+ afterQueryCalls: {
24
+ delete: res => {
25
+ invalidateRefdata().then(() => {
26
+ afterQueryDelete(res);
27
+ });
28
+ },
29
+ post: res => {
30
+ invalidateRefdata().then(() => {
31
+ afterQueryPost(res);
32
+ });
33
+ },
34
+ put: res => {
35
+ invalidateRefdata().then(() => {
36
+ afterQueryPut(res);
37
+ });
38
+ }
39
+ },
40
+ endpoint,
41
+ payloadMutators: {
42
+ post: data => ({
43
+ json: {
44
+ ...data,
45
+ values: []
46
+ }
47
+ })
48
+ },
49
+ queryKey: ['stripes-kint-components', 'useMutateRefdataCategory'],
50
+ ...mutateGenericProps
51
+ });
43
52
  };
44
53
  var _default = exports.default = useMutateRefdataCategory;