@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 +3 -0
- package/es/index.js +6 -0
- package/es/lib/hooks/index.js +8 -0
- package/es/lib/hooks/useKiwtFieldArray.js +109 -0
- package/package.json +1 -1
- package/src/index.js +1 -0
- package/src/lib/hooks/README.md +74 -1
- package/src/lib/hooks/index.js +1 -1
- package/src/lib/hooks/useKiwtFieldArray.js +63 -0
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() {
|
package/es/lib/hooks/index.js
CHANGED
|
@@ -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
package/src/index.js
CHANGED
package/src/lib/hooks/README.md
CHANGED
|
@@ -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 | ✕ |
|
package/src/lib/hooks/index.js
CHANGED
|
@@ -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;
|