iguazio.dashboard-react-controls 0.0.8 → 0.0.9

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.
@@ -27,7 +27,7 @@ var _Tooltip = _interopRequireDefault(require("../Tooltip/Tooltip"));
27
27
 
28
28
  var _ValidationTemplate = _interopRequireDefault(require("../../elements/ValidationTemplate/ValidationTemplate"));
29
29
 
30
- var _validationService = require("../../utils/validationService");
30
+ var _validation = require("../../utils/validation.util");
31
31
 
32
32
  var _useDetectOutsideClick = require("../../hooks/useDetectOutsideClick");
33
33
 
@@ -145,6 +145,11 @@ var FormInput = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
145
145
  (0, _react.useEffect)(function () {
146
146
  setIsInvalid(meta.invalid && (meta.validating || meta.modified || meta.submitFailed && meta.touched));
147
147
  }, [meta.invalid, meta.modified, meta.submitFailed, meta.touched, meta.validating]);
148
+ (0, _react.useEffect)(function () {
149
+ if (meta.valid && showValidationRules) {
150
+ setShowValidationRules(false);
151
+ }
152
+ }, [meta.valid, showValidationRules]);
148
153
  (0, _react.useEffect)(function () {
149
154
  if (showValidationRules) {
150
155
  window.addEventListener('scroll', handleScroll, true);
@@ -227,8 +232,8 @@ var FormInput = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
227
232
  var valueToValidate = value !== null && value !== void 0 ? value : '';
228
233
  var validationError = null;
229
234
 
230
- if (!(0, _lodash.isEmpty)(validationRules) && valueToValidate !== typedValue) {
231
- var _checkPatternsValidit = (0, _validationService.checkPatternsValidity)(rules, valueToValidate),
235
+ if (!(0, _lodash.isEmpty)(validationRules)) {
236
+ var _checkPatternsValidit = (0, _validation.checkPatternsValidity)(rules, valueToValidate),
232
237
  _checkPatternsValidit2 = _slicedToArray(_checkPatternsValidit, 2),
233
238
  newRules = _checkPatternsValidit2[0],
234
239
  isValidField = _checkPatternsValidit2[1];
@@ -245,13 +250,9 @@ var FormInput = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
245
250
  };
246
251
  });
247
252
  }
248
-
249
- if (isValidField && showValidationRules || required && valueToValidate === '') {
250
- setShowValidationRules(false);
251
- }
252
253
  }
253
254
 
254
- if (!validationError) {
255
+ if ((0, _lodash.isEmpty)(validationError)) {
255
256
  if (pattern && !validationPattern.test(valueToValidate)) {
256
257
  validationError = {
257
258
  name: 'pattern',
@@ -3,9 +3,9 @@
3
3
  @import '../../scss/shadows';
4
4
  @import '../../scss/mixins';
5
5
 
6
- @include formField;
7
-
8
6
  .form-field {
7
+ @include formField;
8
+
9
9
  &__label {
10
10
  &-icon {
11
11
  display: inline-flex;
@@ -34,6 +34,7 @@
34
34
  input {
35
35
  border: 0;
36
36
  color: inherit;
37
+ background-color: transparent;
37
38
  padding: 0;
38
39
  width: 100%;
39
40
 
@@ -0,0 +1,353 @@
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _react = _interopRequireWildcard(require("react"));
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _classnames = _interopRequireDefault(require("classnames"));
15
+
16
+ var _reactFinalFormArrays = require("react-final-form-arrays");
17
+
18
+ var _Tooltip = _interopRequireDefault(require("../Tooltip/Tooltip"));
19
+
20
+ var _TextTooltipTemplate = _interopRequireDefault(require("../TooltipTemplate/TextTooltipTemplate"));
21
+
22
+ var _RoundedIcon = _interopRequireDefault(require("../RoundedIcon/RoundedIcon"));
23
+
24
+ var _FormInput = _interopRequireDefault(require("../FormInput/FormInput"));
25
+
26
+ var _FormSelect = _interopRequireDefault(require("../FormSelect/FormSelect"));
27
+
28
+ var _close = require("../../images/close.svg");
29
+
30
+ var _edit = require("../../images/edit.svg");
31
+
32
+ var _plus = require("../../images/plus.svg");
33
+
34
+ var _delete = require("../../images/delete.svg");
35
+
36
+ var _checkmark = require("../../images/checkmark2.svg");
37
+
38
+ require("./formKeyValueTable.scss");
39
+
40
+ var _jsxRuntime = require("react/jsx-runtime");
41
+
42
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
43
+
44
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
45
+
46
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
47
+
48
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
49
+
50
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
51
+
52
+ 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; }
53
+
54
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
55
+
56
+ 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."); }
57
+
58
+ 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); }
59
+
60
+ 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; }
61
+
62
+ 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; }
63
+
64
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
65
+
66
+ var FormKeyValueTable = function FormKeyValueTable(_ref) {
67
+ var addNewItemLabel = _ref.addNewItemLabel,
68
+ className = _ref.className,
69
+ disabled = _ref.disabled,
70
+ formState = _ref.formState,
71
+ isKeyRequired = _ref.isKeyRequired,
72
+ isValueRequired = _ref.isValueRequired,
73
+ keyHeader = _ref.keyHeader,
74
+ keyLabel = _ref.keyLabel,
75
+ keyOptions = _ref.keyOptions,
76
+ name = _ref.name,
77
+ valueHeader = _ref.valueHeader,
78
+ valueLabel = _ref.valueLabel;
79
+
80
+ var _useState = (0, _react.useState)(false),
81
+ _useState2 = _slicedToArray(_useState, 2),
82
+ isEditMode = _useState2[0],
83
+ setEditMode = _useState2[1];
84
+
85
+ var _useState3 = (0, _react.useState)(null),
86
+ _useState4 = _slicedToArray(_useState3, 2),
87
+ selectedItem = _useState4[0],
88
+ setSelectedItem = _useState4[1];
89
+
90
+ var tableClassNames = (0, _classnames.default)('form-key-value-table', className);
91
+ var addBtnClassNames = (0, _classnames.default)('add-new-item-btn', disabled && 'disabled');
92
+
93
+ var exitEditMode = function exitEditMode() {
94
+ setSelectedItem(null);
95
+ setEditMode(false);
96
+ };
97
+
98
+ var enterEditMode = function enterEditMode(event, fields, index) {
99
+ if (!disabled) {
100
+ applyOrDiscardOrDelete(event, fields);
101
+ exitEditMode();
102
+ var editItem = fields.value[index];
103
+ setSelectedItem(_objectSpread(_objectSpread({}, editItem), {}, {
104
+ index: index
105
+ }));
106
+ setEditMode(true);
107
+ }
108
+ };
109
+
110
+ var applyChanges = function applyChanges(event, fields, index) {
111
+ var _formState$errors;
112
+
113
+ if (!(formState !== null && formState !== void 0 && (_formState$errors = formState.errors) !== null && _formState$errors !== void 0 && _formState$errors[name])) {
114
+ exitEditMode();
115
+ } else {
116
+ formState.form.mutators.setFieldState("".concat(name, "[").concat(index, "].key"), {
117
+ modified: true
118
+ });
119
+ formState.form.mutators.setFieldState("".concat(name, "[").concat(index, "].value"), {
120
+ modified: true
121
+ });
122
+ }
123
+ };
124
+
125
+ var discardChanges = function discardChanges(event, fields, index) {
126
+ exitEditMode();
127
+ fields.update(index, {
128
+ key: selectedItem.key,
129
+ value: selectedItem.value
130
+ });
131
+ event && event.stopPropagation();
132
+ };
133
+
134
+ var addNewRow = function addNewRow(event, fields) {
135
+ if (!disabled) {
136
+ var _formState$values$nam, _formState$values$nam2;
137
+
138
+ applyOrDiscardOrDelete(event, fields);
139
+ formState.form.mutators.push(name, {
140
+ key: '',
141
+ value: ''
142
+ });
143
+ setSelectedItem({
144
+ key: '',
145
+ value: '',
146
+ isNew: true,
147
+ index: (_formState$values$nam = (_formState$values$nam2 = formState.values[name]) === null || _formState$values$nam2 === void 0 ? void 0 : _formState$values$nam2.length) !== null && _formState$values$nam !== void 0 ? _formState$values$nam : 0
148
+ });
149
+ setEditMode(true);
150
+ }
151
+ };
152
+
153
+ var deleteRow = function deleteRow(event, fields, index) {
154
+ if (isEditMode && index !== selectedItem.index) {
155
+ applyOrDiscardOrDelete(event, fields);
156
+ }
157
+
158
+ exitEditMode();
159
+ fields.remove(index);
160
+ event && event.stopPropagation();
161
+ };
162
+
163
+ var applyOrDiscardOrDelete = function applyOrDiscardOrDelete(event, fields) {
164
+ if (isEditMode) {
165
+ var _formState$errors2;
166
+
167
+ if (!(formState !== null && formState !== void 0 && (_formState$errors2 = formState.errors) !== null && _formState$errors2 !== void 0 && _formState$errors2[name])) {
168
+ applyChanges(event, fields, selectedItem.index);
169
+ } else {
170
+ discardOrDelete(event, fields, selectedItem.index);
171
+ }
172
+ }
173
+ };
174
+
175
+ var discardOrDelete = function discardOrDelete(event, fields, index) {
176
+ if (selectedItem !== null && selectedItem !== void 0 && selectedItem.isNew || !isEditMode) {
177
+ deleteRow(event, fields, index);
178
+ } else {
179
+ discardChanges(event, fields, index);
180
+ }
181
+ };
182
+
183
+ var uniquenessValidator = function uniquenessValidator(fields, newValue) {
184
+ return !fields.value.some(function (_ref2, index) {
185
+ var key = _ref2.key;
186
+ return newValue.trim() === key && index !== selectedItem.index;
187
+ });
188
+ };
189
+
190
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
191
+ className: tableClassNames,
192
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
193
+ className: "table-row table-row__header no-hover",
194
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
195
+ className: "table-cell__inputs-wrapper",
196
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
197
+ className: "table-cell table-cell__key",
198
+ children: keyHeader
199
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
200
+ className: "table-cell table-cell__value",
201
+ children: valueHeader
202
+ })]
203
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
204
+ className: "table-cell table-cell__actions"
205
+ })]
206
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFinalFormArrays.FieldArray, {
207
+ name: name,
208
+ children: function children(_ref3) {
209
+ var fields = _ref3.fields;
210
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
211
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
212
+ className: "key-value-table__body",
213
+ children: fields.map(function (contentItem, index) {
214
+ return isEditMode && index === selectedItem.index && !disabled ? /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
215
+ className: "table-row table-row_edit",
216
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
217
+ className: "table-cell table-cell__key",
218
+ children: keyOptions ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormSelect.default, {
219
+ name: "".concat(contentItem, ".key"),
220
+ density: "dense",
221
+ options: keyOptions
222
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormInput.default, {
223
+ className: "input_edit",
224
+ placeholder: keyLabel,
225
+ density: "dense",
226
+ name: "".concat(contentItem, ".key"),
227
+ required: isKeyRequired,
228
+ validationRules: [{
229
+ name: 'uniqueness',
230
+ label: 'Name should be unique',
231
+ pattern: function pattern(newValue) {
232
+ return uniquenessValidator(fields, newValue);
233
+ }
234
+ }]
235
+ })
236
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
237
+ className: "table-cell table-cell__value",
238
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormInput.default, {
239
+ className: "input_edit",
240
+ placeholder: valueLabel,
241
+ density: "dense",
242
+ name: "".concat(contentItem, ".value"),
243
+ required: isValueRequired
244
+ })
245
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
246
+ className: "table-cell table-cell__actions",
247
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_RoundedIcon.default, {
248
+ className: "key-value-table__btn",
249
+ onClick: function onClick(event) {
250
+ return applyChanges(event, fields, index);
251
+ },
252
+ tooltipText: "Apply",
253
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_checkmark.ReactComponent, {})
254
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_RoundedIcon.default, {
255
+ className: "key-value-table__btn",
256
+ onClick: function onClick(event) {
257
+ return discardOrDelete(event, fields, index);
258
+ },
259
+ tooltipText: selectedItem.isNew ? 'Delete' : 'Discard changes',
260
+ children: selectedItem.isNew ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_delete.ReactComponent, {}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_close.ReactComponent, {})
261
+ })]
262
+ })]
263
+ }, index) : /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
264
+ className: "table-row",
265
+ onClick: function onClick(event) {
266
+ return enterEditMode(event, fields, index);
267
+ },
268
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
269
+ className: "table-cell__inputs-wrapper",
270
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
271
+ className: "table-cell table-cell__key",
272
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tooltip.default, {
273
+ template: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TextTooltipTemplate.default, {
274
+ text: fields.value[index].key
275
+ }),
276
+ children: fields.value[index].key
277
+ })
278
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
279
+ className: "table-cell table-cell__value",
280
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tooltip.default, {
281
+ template: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TextTooltipTemplate.default, {
282
+ text: fields.value[index].value
283
+ }),
284
+ children: fields.value[index].value
285
+ })
286
+ })]
287
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
288
+ className: "table-cell table-cell__actions",
289
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_RoundedIcon.default, {
290
+ className: "key-value-table__btn",
291
+ onClick: function onClick(event) {
292
+ event.preventDefault();
293
+ },
294
+ tooltipText: "Edit",
295
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_edit.ReactComponent, {})
296
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_RoundedIcon.default, {
297
+ className: "key-value-table__btn",
298
+ onClick: function onClick(event) {
299
+ deleteRow(event, fields, index);
300
+ },
301
+ tooltipText: "Delete",
302
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_delete.ReactComponent, {})
303
+ })]
304
+ })]
305
+ }, index);
306
+ })
307
+ }), !(selectedItem !== null && selectedItem !== void 0 && selectedItem.isNew) && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
308
+ className: "table-row table-row__last no-hover",
309
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("button", {
310
+ className: addBtnClassNames,
311
+ onClick: function onClick(event) {
312
+ addNewRow(event, fields);
313
+ },
314
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_plus.ReactComponent, {}), addNewItemLabel]
315
+ })
316
+ })]
317
+ });
318
+ }
319
+ })]
320
+ });
321
+ };
322
+
323
+ FormKeyValueTable.defaultProps = {
324
+ addNewItemLabel: 'Add new item',
325
+ className: '',
326
+ disabled: false,
327
+ isKeyRequired: true,
328
+ isValueRequired: true,
329
+ keyHeader: 'Key',
330
+ keyLabel: 'Key',
331
+ keyOptions: null,
332
+ valueHeader: 'Value',
333
+ valueLabel: 'Value'
334
+ };
335
+ FormKeyValueTable.propTypes = {
336
+ addNewItemLabel: _propTypes.default.string,
337
+ className: _propTypes.default.string,
338
+ disabled: _propTypes.default.bool,
339
+ formState: _propTypes.default.shape({}).isRequired,
340
+ isKeyRequired: _propTypes.default.bool,
341
+ isValueRequired: _propTypes.default.bool,
342
+ keyHeader: _propTypes.default.string,
343
+ keyLabel: _propTypes.default.string,
344
+ keyOptions: _propTypes.default.arrayOf(_propTypes.default.shape({
345
+ label: _propTypes.default.string.isRequired,
346
+ id: _propTypes.default.string.isRequired
347
+ })),
348
+ name: _propTypes.default.string.isRequired,
349
+ valueHeader: _propTypes.default.string,
350
+ valueLabel: _propTypes.default.string
351
+ };
352
+ var _default = FormKeyValueTable;
353
+ exports.default = _default;
@@ -0,0 +1,117 @@
1
+ @import '../../scss/borders';
2
+ @import '../../scss/colors';
3
+ $actionsBlockWidth: 72px;
4
+
5
+ .form-key-value-table {
6
+ max-height: 280px;
7
+ overflow: hidden;
8
+ overflow-y: auto;
9
+ background-color: $white;
10
+
11
+ &__btn {
12
+ visibility: hidden;
13
+ }
14
+
15
+ &__body {
16
+ background-color: inherit;
17
+ }
18
+
19
+ .table-row {
20
+ display: flex;
21
+ align-items: center;
22
+ min-height: 56px;
23
+ border-bottom: $primaryBorder;
24
+
25
+ &:not(.no-hover):hover {
26
+ background-color: $alabaster;
27
+
28
+ .key-value-table__btn {
29
+ visibility: visible;
30
+ }
31
+ }
32
+
33
+ &__last {
34
+ position: sticky;
35
+ bottom: 0;
36
+ z-index: 3;
37
+ background-color: inherit;
38
+ border: 0;
39
+ }
40
+ }
41
+
42
+ .table-row__header {
43
+ position: sticky;
44
+ top: 0;
45
+ z-index: 3;
46
+ font-weight: bold;
47
+ font-size: 18px;
48
+ background-color: inherit;
49
+ border-top: $primaryBorder;
50
+ }
51
+
52
+ .table-cell {
53
+ display: flex;
54
+ align-items: center;
55
+ padding: 8px 5px 8px 10px;
56
+ color: $primary;
57
+ }
58
+
59
+ .table-cell__inputs-wrapper {
60
+ display: flex;
61
+ width: calc(100% - #{$actionsBlockWidth});
62
+ }
63
+
64
+ .table-cell__key {
65
+ width: 50%;
66
+ }
67
+
68
+ .table-cell__value {
69
+ width: 50%;
70
+ }
71
+
72
+ .table-cell__actions {
73
+ justify-content: flex-end;
74
+ min-width: $actionsBlockWidth;
75
+ padding: 0;
76
+
77
+ & > * {
78
+ margin: 0 5px 0 0;
79
+ }
80
+ }
81
+
82
+ .add-new-item-btn {
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: space-between;
86
+ min-width: 44px;
87
+ padding: 10px;
88
+ color: $cornflowerBlue;
89
+ font-size: 15px;
90
+ line-height: 18px;
91
+
92
+ svg {
93
+ width: 20px;
94
+ height: 20px;
95
+
96
+ rect {
97
+ fill: $cornflowerBlue;
98
+ }
99
+ }
100
+ }
101
+
102
+ .input-wrapper {
103
+ width: 100%;
104
+
105
+ .input {
106
+ width: 100%;
107
+
108
+ &_edit {
109
+ border: $primaryBorder;
110
+ }
111
+
112
+ &_invalid {
113
+ border: $errorBorder;
114
+ }
115
+ }
116
+ }
117
+ }
@@ -261,6 +261,7 @@ var FormSelect = function FormSelect(_ref) {
261
261
  variant: selectedItemAction.confirm.btnConfirmType
262
262
  },
263
263
  header: selectedItemAction.confirm.title,
264
+ isOpen: isConfirmDialogOpen,
264
265
  message: selectedItemAction.confirm.message
265
266
  }), isOpen && /*#__PURE__*/(0, _jsxRuntime.jsx)(_PopUpDialog.default, {
266
267
  className: "form-field__select__options-list",
@@ -2,9 +2,9 @@
2
2
  @import '../../scss/colors';
3
3
  @import '../../scss/shadows';
4
4
 
5
- @include formField;
6
-
7
5
  .form-field {
6
+ @include formField;
7
+
8
8
  &__wrapper {
9
9
  &-active {
10
10
  background: $alabaster;
@@ -59,7 +59,7 @@ var Wizard = function Wizard(_ref) {
59
59
  var children = _ref.children,
60
60
  className = _ref.className,
61
61
  confirmClose = _ref.confirmClose,
62
- FormState = _ref.FormState,
62
+ formState = _ref.formState,
63
63
  isWizardOpen = _ref.isWizardOpen,
64
64
  onWizardResolve = _ref.onWizardResolve,
65
65
  onWizardSubmit = _ref.onWizardSubmit,
@@ -79,11 +79,6 @@ var Wizard = function Wizard(_ref) {
79
79
  var totalSteps = (0, _react.useMemo)(function () {
80
80
  return _react.default.Children.count(children) - 1 || 0;
81
81
  }, [children]);
82
- var hasSteps = (0, _react.useMemo)(function () {
83
- return stepsConfig.some(function (step) {
84
- return step.id;
85
- });
86
- }, [stepsConfig]);
87
82
  var isLastStep = (0, _react.useMemo)(function () {
88
83
  return activeStepNumber === totalSteps;
89
84
  }, [activeStepNumber, totalSteps]);
@@ -95,7 +90,7 @@ var Wizard = function Wizard(_ref) {
95
90
  };
96
91
  })) || [];
97
92
  }, [stepsConfig]);
98
- var wizardClasses = (0, _classnames.default)('wizard-form', className, hasSteps && 'wizard-form__with-steps');
93
+ var wizardClasses = (0, _classnames.default)('wizard-form', className);
99
94
 
100
95
  var goToNextStep = function goToNextStep() {
101
96
  setActiveStepNumber(function (prevStep) {
@@ -114,7 +109,7 @@ var Wizard = function Wizard(_ref) {
114
109
  };
115
110
 
116
111
  var handleOnClose = function handleOnClose() {
117
- if (confirmClose && FormState && FormState.dirty) {
112
+ if (confirmClose && formState && formState.dirty) {
118
113
  (0, _common.openPopUp)(_ConfirmDialog.default, {
119
114
  cancelButton: {
120
115
  label: 'Cancel',
@@ -134,11 +129,11 @@ var Wizard = function Wizard(_ref) {
134
129
  };
135
130
 
136
131
  var handleSubmit = function handleSubmit() {
137
- FormState.handleSubmit();
132
+ formState.handleSubmit();
138
133
 
139
- if (FormState.valid) {
134
+ if (formState.valid) {
140
135
  if (isLastStep) {
141
- onWizardSubmit(FormState.values);
136
+ onWizardSubmit(formState.values);
142
137
  } else {
143
138
  goToNextStep();
144
139
  }
@@ -146,32 +141,18 @@ var Wizard = function Wizard(_ref) {
146
141
  };
147
142
 
148
143
  var getDefaultActions = function getDefaultActions() {
149
- if (hasSteps) {
150
- return [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
151
- onClick: goToPreviousStep,
152
- disabled: activeStepNumber === 0,
153
- label: "Back",
154
- type: "button"
155
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
156
- onClick: handleSubmit,
157
- disabled: FormState.submitting || FormState.invalid && FormState.submitFailed,
158
- label: isLastStep ? submitButtonLabel : 'Next',
159
- type: "button",
160
- variant: _constants.SECONDARY_BUTTON
161
- })];
162
- } else {
163
- return [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
164
- onClick: handleOnClose,
165
- label: "Cancel",
166
- type: "button"
167
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
168
- onClick: handleSubmit,
169
- disabled: FormState.submitting || FormState.invalid && FormState.submitFailed,
170
- label: submitButtonLabel,
171
- type: "button",
172
- variant: _constants.SECONDARY_BUTTON
173
- })];
174
- }
144
+ return [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
145
+ onClick: goToPreviousStep,
146
+ disabled: activeStepNumber === 0,
147
+ label: "Back",
148
+ type: "button"
149
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
150
+ onClick: handleSubmit,
151
+ disabled: formState.submitting || formState.invalid && formState.submitFailed,
152
+ label: isLastStep ? submitButtonLabel : 'Next',
153
+ type: "button",
154
+ variant: _constants.SECONDARY_BUTTON
155
+ })];
175
156
  };
176
157
 
177
158
  var renderModalActions = function renderModalActions() {
@@ -179,7 +160,7 @@ var Wizard = function Wizard(_ref) {
179
160
 
180
161
  if ((_stepsConfig$activeSt = stepsConfig[activeStepNumber]) !== null && _stepsConfig$activeSt !== void 0 && _stepsConfig$activeSt.getActions) {
181
162
  return stepsConfig[activeStepNumber].getActions({
182
- FormState: FormState,
163
+ formState: formState,
183
164
  goToNextStep: goToNextStep,
184
165
  goToPreviousStep: goToPreviousStep,
185
166
  handleOnClose: handleOnClose,
@@ -199,7 +180,7 @@ var Wizard = function Wizard(_ref) {
199
180
  show: isWizardOpen,
200
181
  size: size,
201
182
  title: title,
202
- children: [hasSteps && /*#__PURE__*/(0, _jsxRuntime.jsx)(_WizardSteps.default, {
183
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_WizardSteps.default, {
203
184
  activeStepNumber: activeStepNumber,
204
185
  jumpToStep: jumpToStep,
205
186
  steps: stepsMenu
@@ -220,10 +201,10 @@ Wizard.defaultProps = {
220
201
  Wizard.propsTypes = {
221
202
  className: _propTypes.default.string,
222
203
  confirmClose: _propTypes.default.bool,
223
- FormState: _propTypes.default.object.isRequired,
224
- isOpen: _propTypes.default.bool.isRequired,
225
- onResolve: _propTypes.default.func.isRequired,
226
- onSubmit: _propTypes.default.func.isRequired,
204
+ formState: _propTypes.default.object.isRequired,
205
+ isWizardOpen: _propTypes.default.bool.isRequired,
206
+ onWizardResolve: _propTypes.default.func.isRequired,
207
+ onWizardSubmit: _propTypes.default.func.isRequired,
227
208
  size: _types.MODAL_SIZES,
228
209
  title: _propTypes.default.string.isRequired,
229
210
  stepsConfig: _types.WIZARD_STEPS_CONFIG,
@@ -1,17 +1,15 @@
1
1
  .wizard-form {
2
- &__with-steps {
3
- .modal__body {
4
- display: flex;
5
- flex-flow: row nowrap;
6
- overflow: hidden;
7
- padding-right: 0;
8
- }
2
+ .modal__body {
3
+ display: flex;
4
+ flex-flow: row nowrap;
5
+ overflow: hidden;
6
+ padding-right: 0;
7
+ }
9
8
 
10
- .wizard-form__content {
11
- overflow-y: auto;
12
- height: 100%;
13
- width: 100%;
14
- padding-right: 2rem;
15
- }
9
+ .wizard-form__content {
10
+ overflow-y: auto;
11
+ height: 100%;
12
+ width: 100%;
13
+ padding-right: 2rem;
16
14
  }
17
15
  }
@@ -27,6 +27,12 @@ Object.defineProperty(exports, "FormInput", {
27
27
  return _FormInput.default;
28
28
  }
29
29
  });
30
+ Object.defineProperty(exports, "FormKeyValueTable", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _FormKeyValueTable.default;
34
+ }
35
+ });
30
36
  Object.defineProperty(exports, "FormSelect", {
31
37
  enumerable: true,
32
38
  get: function get() {
@@ -84,6 +90,8 @@ var _FormCheckBox = _interopRequireDefault(require("./FormCheckBox/FormCheckBox"
84
90
 
85
91
  var _FormInput = _interopRequireDefault(require("./FormInput/FormInput"));
86
92
 
93
+ var _FormKeyValueTable = _interopRequireDefault(require("./FormKeyValueTable/FormKeyValueTable"));
94
+
87
95
  var _FormSelect = _interopRequireDefault(require("./FormSelect/FormSelect"));
88
96
 
89
97
  var _Modal = _interopRequireDefault(require("./Modal/Modal"));
@@ -996,91 +996,89 @@
996
996
  }
997
997
 
998
998
  @mixin formField {
999
- .form-field {
1000
- position: relative;
1001
- display: flex;
1002
- flex-flow: column nowrap;
1003
- height: 100%;
1004
- width: 100%;
1005
-
1006
- &__label {
1007
- margin-bottom: 5px;
1008
- color: $topaz;
1009
- font-size: 12px;
1010
- text-align: left;
1011
- text-transform: capitalize;
1012
- background-color: transparent;
1013
-
1014
- &-mandatory {
1015
- color: $amaranth;
1016
- }
999
+ position: relative;
1000
+ display: flex;
1001
+ flex-flow: column nowrap;
1002
+ height: 100%;
1003
+ width: 100%;
1017
1004
 
1018
- &-disabled {
1019
- color: $spunPearl;
1005
+ &__label {
1006
+ margin-bottom: 5px;
1007
+ color: $topaz;
1008
+ font-size: 12px;
1009
+ text-align: left;
1010
+ text-transform: capitalize;
1011
+ background-color: transparent;
1020
1012
 
1021
- .form-field__label-mandatory {
1022
- color: $spunPearl;
1023
- }
1024
- }
1013
+ &-mandatory {
1014
+ color: $amaranth;
1025
1015
  }
1026
1016
 
1027
- &__wrapper {
1028
- @include fieldWrapper;
1017
+ &-disabled {
1018
+ color: $spunPearl;
1029
1019
 
1030
- &-disabled {
1020
+ .form-field__label-mandatory {
1031
1021
  color: $spunPearl;
1032
- cursor: not-allowed;
1033
1022
  }
1023
+ }
1024
+ }
1034
1025
 
1035
- &-invalid {
1036
- border: $errorBorder;
1037
- }
1026
+ &__wrapper {
1027
+ @include fieldWrapper;
1038
1028
 
1039
- &.without-border {
1040
- border-color: transparent;
1041
- }
1029
+ &-disabled {
1030
+ color: $spunPearl;
1031
+ cursor: not-allowed;
1032
+ }
1042
1033
 
1043
- &-dense {
1044
- padding-top: 12px;
1045
- padding-bottom: 12px;
1046
- }
1034
+ &-invalid {
1035
+ border: $errorBorder;
1036
+ }
1047
1037
 
1048
- &-normal {
1049
- padding-top: 14px;
1050
- padding-bottom: 14px;
1051
- }
1038
+ &.without-border {
1039
+ border-color: transparent;
1040
+ }
1052
1041
 
1053
- &-medium {
1054
- padding-top: 16px;
1055
- padding-bottom: 16px;
1056
- }
1042
+ &-dense {
1043
+ padding-top: 12px;
1044
+ padding-bottom: 12px;
1045
+ }
1057
1046
 
1058
- &-chunky {
1059
- padding-top: 18px;
1060
- padding-bottom: 18px;
1061
- }
1047
+ &-normal {
1048
+ padding-top: 14px;
1049
+ padding-bottom: 14px;
1062
1050
  }
1063
1051
 
1064
- &__control {
1065
- position: relative;
1066
- display: flex;
1067
- flex: 1;
1068
- overflow: hidden;
1069
- padding: 0 8px 0 16px;
1052
+ &-medium {
1053
+ padding-top: 16px;
1054
+ padding-bottom: 16px;
1070
1055
  }
1071
1056
 
1072
- &__icons {
1057
+ &-chunky {
1058
+ padding-top: 18px;
1059
+ padding-bottom: 18px;
1060
+ }
1061
+ }
1062
+
1063
+ &__control {
1064
+ position: relative;
1065
+ display: flex;
1066
+ flex: 1;
1067
+ overflow: hidden;
1068
+ padding: 0 8px 0 16px;
1069
+ }
1070
+
1071
+ &__icons {
1072
+ display: flex;
1073
+ flex-shrink: 0;
1074
+ align-items: center;
1075
+ margin-right: 4px;
1076
+ min-height: 25px;
1077
+
1078
+ & > * {
1073
1079
  display: flex;
1074
- flex-shrink: 0;
1075
1080
  align-items: center;
1076
- margin-right: 4px;
1077
- min-height: 25px;
1078
-
1079
- & > * {
1080
- display: flex;
1081
- align-items: center;
1082
- padding: 0 4px;
1083
- }
1081
+ padding: 0 4px;
1084
1082
  }
1085
1083
  }
1086
1084
  }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.setFieldState = void 0;
7
+
8
+ var _lodash = require("lodash");
9
+
10
+ var setFieldState = function setFieldState(args, state) {
11
+ var fieldName = args[0];
12
+ var states = args[1];
13
+ var field = state.fields[fieldName];
14
+
15
+ if (field) {
16
+ for (var stateName in states) {
17
+ (0, _lodash.set)(field, stateName, states[stateName]);
18
+ }
19
+ }
20
+ };
21
+
22
+ exports.setFieldState = setFieldState;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iguazio.dashboard-react-controls",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "description": "Collection of resources (such as CSS styles, fonts and images) and ReactJS 17.x components to share among different Iguazio React repos.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -27,7 +27,9 @@
27
27
  "react-modal-promise": "*",
28
28
  "react-transition-group": "*",
29
29
  "final-form": "*",
30
- "react-final-form": "*"
30
+ "final-form-arrays": "*",
31
+ "react-final-form": "*",
32
+ "react-final-form-arrays": "*"
31
33
  },
32
34
  "devDependencies": {
33
35
  "@babel/cli": "^7.17.6",
@@ -59,13 +61,15 @@
59
61
  "eslint-plugin-storybook": "^0.5.10",
60
62
  "eslint-webpack-plugin": "^3.1.1",
61
63
  "lodash": "^4.17.21",
62
- "node": "14.18.1",
64
+ "node": "14.19.0",
63
65
  "prettier": "^2.5.1",
64
66
  "prop-types": "^15.8.1",
65
67
  "react": "^17.0.2",
66
68
  "react-dom": "^17.0.2",
67
69
  "final-form": "^4.20.7",
70
+ "final-form-arrays": "^3.0.2",
68
71
  "react-final-form": "^6.5.9",
72
+ "react-final-form-arrays": "^3.1.3",
69
73
  "react-modal-promise": "^1.0.2",
70
74
  "react-scripts": "5.0.0",
71
75
  "react-transition-group": "^4.4.2",