@k-int/stripes-kint-components 1.4.0 → 1.5.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 1.5.0 Released 9th December 2021
2
+ * useKiwtFieldArray hook
3
+
1
4
  ## 1.4.0 Released 26th Nov 2021
2
5
  * useHelperApp now exposes an `isOpen` function to check if current helper is open or not.
3
6
  * useQIndex hook exposed to allow setting and parsing of qindex from url. QIndex now used in useKiwtSASQuery.
package/es/index.js CHANGED
@@ -111,6 +111,12 @@ Object.defineProperty(exports, "useHelperApp", {
111
111
  return _hooks.useHelperApp;
112
112
  }
113
113
  });
114
+ Object.defineProperty(exports, "useKiwtFieldArray", {
115
+ enumerable: true,
116
+ get: function get() {
117
+ return _hooks.useKiwtFieldArray;
118
+ }
119
+ });
114
120
  Object.defineProperty(exports, "useKiwtSASQuery", {
115
121
  enumerable: true,
116
122
  get: function get() {
@@ -15,6 +15,12 @@ Object.defineProperty(exports, "useHelperApp", {
15
15
  return _useHelperApp["default"];
16
16
  }
17
17
  });
18
+ Object.defineProperty(exports, "useKiwtFieldArray", {
19
+ enumerable: true,
20
+ get: function get() {
21
+ return _useKiwtFieldArray["default"];
22
+ }
23
+ });
18
24
  Object.defineProperty(exports, "useKiwtSASQuery", {
19
25
  enumerable: true,
20
26
  get: function get() {
@@ -68,4 +74,6 @@ var _useLocalStorageState = _interopRequireDefault(require("./useLocalStorageSta
68
74
 
69
75
  var _useQIndex = _interopRequireDefault(require("./useQIndex"));
70
76
 
77
+ var _useKiwtFieldArray = _interopRequireDefault(require("./useKiwtFieldArray"));
78
+
71
79
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _reactFinalFormArrays = require("react-final-form-arrays");
11
+
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
13
+
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
15
+
16
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
+
18
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
19
+
20
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
21
+
22
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
23
+
24
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
+
26
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
27
+
28
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
29
+
30
+ var useKiwtFieldArray = function useKiwtFieldArray(name) {
31
+ var submitWholeDeletedObject = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
32
+
33
+ var _useFieldArray = (0, _reactFinalFormArrays.useFieldArray)(name),
34
+ fields = _useFieldArray.fields;
35
+
36
+ var _fields$value = fields.value,
37
+ values = _fields$value === void 0 ? [] : _fields$value;
38
+
39
+ var _useState = (0, _react.useState)(0),
40
+ _useState2 = _slicedToArray(_useState, 2),
41
+ endOfList = _useState2[0],
42
+ setEndOfList = _useState2[1];
43
+
44
+ (0, _react.useEffect)(function () {
45
+ var i = values.filter(function (line) {
46
+ return !line._delete;
47
+ });
48
+ setEndOfList(i.length);
49
+ }, [values]);
50
+
51
+ var onAddField = function onAddField() {
52
+ var field = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
53
+ _delete: false
54
+ };
55
+ fields.insert(endOfList, field);
56
+ };
57
+
58
+ var onMarkForDeletion = function onMarkForDeletion(field) {
59
+ if (field && field.id) {
60
+ if (submitWholeDeletedObject) {
61
+ fields.push(_objectSpread(_objectSpread({}, field), {}, {
62
+ _delete: true
63
+ }));
64
+ } else {
65
+ fields.push({
66
+ id: field.id,
67
+ _delete: true
68
+ });
69
+ }
70
+ }
71
+ };
72
+
73
+ var onDeleteField = function onDeleteField(index, field) {
74
+ fields.remove(index);
75
+ onMarkForDeletion(field);
76
+ };
77
+
78
+ var onPrependField = function onPrependField() {
79
+ var field = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
80
+ _delete: false
81
+ };
82
+ fields.unshift(field);
83
+ };
84
+
85
+ var onReplaceField = function onReplaceField(index, field) {
86
+ if (fields.update) {
87
+ // react-final-form-arrays
88
+ fields.update(index, field);
89
+ }
90
+ };
91
+
92
+ var onUpdateField = function onUpdateField(index, field) {
93
+ fields.update(index, _objectSpread(_objectSpread({}, fields.value[index]), field));
94
+ };
95
+
96
+ var items = values.slice(0, endOfList);
97
+ return {
98
+ items: items,
99
+ onAddField: onAddField,
100
+ onDeleteField: onDeleteField,
101
+ onMarkForDeletion: onMarkForDeletion,
102
+ onPrependField: onPrependField,
103
+ onReplaceField: onReplaceField,
104
+ onUpdateField: onUpdateField
105
+ };
106
+ };
107
+
108
+ var _default = useKiwtFieldArray;
109
+ exports["default"] = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k-int/stripes-kint-components",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "Stripes Component library for K-Int specific applications",
5
5
  "sideEffects": [
6
6
  "*.css"
package/src/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  export {
3
3
  useActiveElement,
4
4
  useHelperApp,
5
+ useKiwtFieldArray,
5
6
  useKiwtSASQuery,
6
7
  useLocalStorageState,
7
8
  useMutateRefdataValue,
@@ -214,4 +214,77 @@ const Test() {
214
214
  }
215
215
 
216
216
  export default Test;
217
- ```
217
+ ```
218
+
219
+ ## useKiwtFieldArray
220
+ A hook to replace `withKiwtFieldArray` [from stripes-erm-components](https://github.com/folio-org/stripes-erm-components/tree/master/lib/withKiwtFieldArray). Provides functions for adding and deleting items in a way which the backend endpoints will understand, as well as an "items" array to track the current set of valid items in the form.
221
+
222
+
223
+ ### BasicUsage
224
+ ```
225
+ ...
226
+ import useKiwtFieldArray from '../../../util/useKiwtFieldArray';
227
+ ...
228
+
229
+ const TestFieldArray = () => {
230
+ const {
231
+ items,
232
+ onAddField,
233
+ onDeleteField
234
+ } = useKiwtFieldArray(name, true);
235
+
236
+ return (
237
+ <>
238
+ {items.map((item, index) => {
239
+ return (
240
+ <Row>
241
+ <Col xs={3}>
242
+ <Field
243
+ name={`${name}[${index}].name`}
244
+ component={TextField}
245
+ required
246
+ validate={requiredValidator}
247
+ />
248
+ </Col>
249
+ <Col xs={1}>
250
+ <IconButton
251
+ icon="trash"
252
+ id="remove-volume-button"
253
+ onClick={() => onDeleteField(index, volume)}
254
+ />
255
+ </Col>
256
+ </Row>
257
+ );
258
+ })}
259
+ <Button
260
+ onClick={() => onAddField({}})}
261
+ >
262
+ ADD NEW
263
+ </Button>
264
+ </>
265
+ );
266
+ };
267
+
268
+ const Test = ({}) => {
269
+ return (
270
+ <Form
271
+ ...
272
+ render={({ handleSubmit, submitting, form }) => (
273
+ <form onSubmit={handleSubmit}>
274
+ <FieldArray
275
+ name="test"
276
+ component={TestFieldArray}
277
+ />
278
+ </form>
279
+ )}
280
+ />
281
+ );
282
+ };
283
+ export default Test
284
+ ```
285
+
286
+ ### Props
287
+ Name | Type | Description | default | required
288
+ --- | --- | --- | --- | ---
289
+ name | String | The name of the fieldArray, used to hook into the final form state for that field. | | ✓ |
290
+ submitWholeDeletedObject | bool | a boolean flag to ensure that a deleted object is sent whole to the backend, rather than just as an id. | false | ✕ |
@@ -6,4 +6,4 @@ export { default as useKiwtSASQuery } from './useKiwtSASQuery';
6
6
  export { default as useHelperApp } from './useHelperApp';
7
7
  export { default as useLocalStorageState } from './useLocalStorageState';
8
8
  export { default as useQIndex } from './useQIndex';
9
-
9
+ export { default as useKiwtFieldArray } from './useKiwtFieldArray';
@@ -0,0 +1,63 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { useFieldArray } from 'react-final-form-arrays';
3
+
4
+ const useKiwtFieldArray = (name, submitWholeDeletedObject = false) => {
5
+ const { fields } = useFieldArray(name);
6
+ const { value: values = [] } = fields;
7
+ const [endOfList, setEndOfList] = useState(0);
8
+
9
+ useEffect(() => {
10
+ const i = values.filter(line => !line._delete);
11
+ setEndOfList(i.length);
12
+ }, [values]);
13
+
14
+ const onAddField = (field = { _delete: false }) => {
15
+ fields.insert(endOfList, field);
16
+ };
17
+
18
+ const onMarkForDeletion = (field) => {
19
+ if (field && field.id) {
20
+ if (submitWholeDeletedObject) {
21
+ fields.push({ ...field, _delete: true });
22
+ } else {
23
+ fields.push({ id: field.id, _delete: true });
24
+ }
25
+ }
26
+ };
27
+
28
+ const onDeleteField = (index, field) => {
29
+ fields.remove(index);
30
+ onMarkForDeletion(field);
31
+ };
32
+
33
+ const onPrependField = (field = { _delete: false }) => {
34
+ fields.unshift(field);
35
+ };
36
+
37
+ const onReplaceField = (index, field) => {
38
+ if (fields.update) { // react-final-form-arrays
39
+ fields.update(index, field);
40
+ }
41
+ };
42
+
43
+ const onUpdateField = (index, field) => {
44
+ fields.update(index, {
45
+ ...fields.value[index],
46
+ ...field,
47
+ });
48
+ };
49
+
50
+ const items = values.slice(0, endOfList);
51
+
52
+ return {
53
+ items,
54
+ onAddField,
55
+ onDeleteField,
56
+ onMarkForDeletion,
57
+ onPrependField,
58
+ onReplaceField,
59
+ onUpdateField,
60
+ };
61
+ };
62
+
63
+ export default useKiwtFieldArray;