@steroidsjs/core 3.0.52 → 3.0.53

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.
@@ -4143,6 +4143,14 @@
4143
4143
  "required": true,
4144
4144
  "type": "Model",
4145
4145
  "example": null
4146
+ },
4147
+ {
4148
+ "name": "sort",
4149
+ "decorators": [],
4150
+ "description": "",
4151
+ "required": false,
4152
+ "type": "string",
4153
+ "example": null
4146
4154
  }
4147
4155
  ],
4148
4156
  "methods": [
@@ -19451,6 +19459,14 @@
19451
19459
  "type": "boolean | IAutoCompleteConfig",
19452
19460
  "example": "{\n enable: true,\n minLength: 2,\n delay: 100\n}"
19453
19461
  },
19462
+ {
19463
+ "name": "autoCompleteInputForwardedRef",
19464
+ "decorators": [],
19465
+ "description": "",
19466
+ "required": true,
19467
+ "type": "MutableRefObject",
19468
+ "example": null
19469
+ },
19454
19470
  {
19455
19471
  "name": "autoCompleteInputRef",
19456
19472
  "decorators": [],
@@ -19523,14 +19539,6 @@
19523
19539
  "type": "string",
19524
19540
  "example": null
19525
19541
  },
19526
- {
19527
- "name": "forwardedInputRef",
19528
- "decorators": [],
19529
- "description": "",
19530
- "required": true,
19531
- "type": "MutableRefObject",
19532
- "example": null
19533
- },
19534
19542
  {
19535
19543
  "name": "forwardedRef",
19536
19544
  "decorators": [],
@@ -19579,6 +19587,14 @@
19579
19587
  "type": "any",
19580
19588
  "example": null
19581
19589
  },
19590
+ {
19591
+ "name": "inputRef",
19592
+ "decorators": [],
19593
+ "description": "",
19594
+ "required": true,
19595
+ "type": "MutableRefObject",
19596
+ "example": null
19597
+ },
19582
19598
  {
19583
19599
  "name": "inputValue",
19584
19600
  "decorators": [],
@@ -36533,6 +36549,14 @@
36533
36549
  "required": true,
36534
36550
  "type": "Model",
36535
36551
  "example": null
36552
+ },
36553
+ {
36554
+ "name": "sort",
36555
+ "decorators": [],
36556
+ "description": "",
36557
+ "required": false,
36558
+ "type": "string",
36559
+ "example": null
36536
36560
  }
36537
36561
  ],
36538
36562
  "methods": [
@@ -220,6 +220,7 @@ export interface IListOutput {
220
220
  renderInfiniteScroll: () => any;
221
221
  onFetch: (params?: Record<string, unknown>) => void;
222
222
  onSort: (value: any) => void;
223
+ sort?: string;
223
224
  }
224
225
  export declare const defaultConfig: {
225
226
  actionMethod: string;
package/hooks/useList.js CHANGED
@@ -310,7 +310,8 @@ function useList(config) {
310
310
  renderSearchForm: renderSearchForm,
311
311
  renderInfiniteScroll: renderInfiniteScroll,
312
312
  onFetch: onFetch,
313
- onSort: onSort
313
+ onSort: onSort,
314
+ sort: formValues === null || formValues === void 0 ? void 0 : formValues.sort
314
315
  };
315
316
  }
316
317
  exports["default"] = useList;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steroidsjs/core",
3
- "version": "3.0.52",
3
+ "version": "3.0.53",
4
4
  "description": "",
5
5
  "author": "Vladimir Kozhin <hello@kozhindev.com>",
6
6
  "repository": {
@@ -165,7 +165,8 @@ export interface IDropDownFieldViewProps extends IDropDownFieldProps {
165
165
  hoveredId: PrimaryKey | any;
166
166
  selectedIds: (PrimaryKey | any)[];
167
167
  forwardedRef: any;
168
- forwardedInputRef: MutableRefObject<HTMLInputElement>;
168
+ autoCompleteInputForwardedRef: MutableRefObject<HTMLInputElement>;
169
+ inputRef: MutableRefObject<HTMLInputElement>;
169
170
  searchInputProps: {
170
171
  type: string;
171
172
  name: string;
@@ -87,7 +87,8 @@ function DropDownField(props) {
87
87
  var components = (0, hooks_1.useComponents)();
88
88
  // Query state
89
89
  var _a = (0, react_1.useState)(''), query = _a[0], setQuery = _a[1];
90
- var forwardedInputRef = (0, react_1.useRef)(null);
90
+ var autoCompleteInputForwardedRef = (0, react_1.useRef)(null);
91
+ var inputRef = (0, react_1.useRef)(null);
91
92
  var hasGroup = !!props.groupAttribute;
92
93
  var _b = react_1["default"].useState([]), selectedAccordionItems = _b[0], setSelectedAccordionItems = _b[1];
93
94
  var normalizedItemToSelectAll = react_1["default"].useMemo(function () { return normalizeItemToSelectAll(props.itemToSelectAll); }, [props.itemToSelectAll]);
@@ -125,7 +126,7 @@ function DropDownField(props) {
125
126
  items: items,
126
127
  sourceItems: sourceItems,
127
128
  inputValue: props.input.value,
128
- autoCompleteInputRef: forwardedInputRef
129
+ autoCompleteInputRef: autoCompleteInputForwardedRef
129
130
  }), isOpened = _d.isOpened, setIsOpened = _d.setIsOpened, setIsFocused = _d.setIsFocused, hoveredId = _d.hoveredId, setHoveredId = _d.setHoveredId, selectedIds = _d.selectedIds, setSelectedIds = _d.setSelectedIds, selectedItems = _d.selectedItems, setSelectedAll = _d.setSelectedAll, isSelectedAll = _d.isSelectedAll;
130
131
  var onOpen = (0, react_1.useCallback)(function () {
131
132
  setQuery('');
@@ -199,6 +200,13 @@ function DropDownField(props) {
199
200
  onReset();
200
201
  }
201
202
  }, [onReset, prevInputValue, props.input.value, selectedIds.length]);
203
+ // Add required validation
204
+ (0, react_1.useEffect)(function () {
205
+ var _a;
206
+ var defaultValidity = __('Required Field');
207
+ var errorMessage = props.required && !selectedIds.length ? defaultValidity : '';
208
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.setCustomValidity(errorMessage);
209
+ }, [props.required, selectedIds.length]);
202
210
  var renderItemView = function (item, type, src) { return components.ui.renderView(props.itemView || 'form.DropDownFieldItemView', {
203
211
  item: __assign(__assign({}, item), { contentSrc: src, contentType: type }),
204
212
  selectedIds: selectedIds,
@@ -216,7 +224,7 @@ function DropDownField(props) {
216
224
  isItemToSelectAll: item.id === (normalizedItemToSelectAll === null || normalizedItemToSelectAll === void 0 ? void 0 : normalizedItemToSelectAll.id),
217
225
  isSelectedAll: isSelectedAll
218
226
  }); };
219
- var renderItem = function (item) {
227
+ var renderItem = (0, react_1.useCallback)(function (item) {
220
228
  if (hasGroup && Array.isArray(item[props.groupAttribute])) {
221
229
  return renderItemView(item, 'group', item[props.groupAttribute]);
222
230
  }
@@ -227,14 +235,14 @@ function DropDownField(props) {
227
235
  return renderItemView(item, props.itemsContent.type, props.itemsContent.src);
228
236
  }
229
237
  return renderItemView(item, 'default', null);
230
- };
231
- var viewProps = (0, react_1.useMemo)(function () { return (__assign({ isAutoComplete: isAutoComplete, items: items, hoveredId: hoveredId, selectedIds: selectedIds, forwardedRef: forwardedRef, forwardedInputRef: forwardedInputRef, searchInputProps: searchInputProps, isOpened: isOpened, isLoading: isLoading, onOpen: onOpen, selectedItems: selectedItems,
238
+ }, [hasGroup, props.groupAttribute, props.itemsContent, renderItemView]);
239
+ var viewProps = (0, react_1.useMemo)(function () { return (__assign({ isAutoComplete: isAutoComplete, items: items, hoveredId: hoveredId, selectedIds: selectedIds, forwardedRef: forwardedRef, inputRef: inputRef, autoCompleteInputForwardedRef: autoCompleteInputForwardedRef, searchInputProps: searchInputProps, isOpened: isOpened, isLoading: isLoading, onOpen: onOpen, selectedItems: selectedItems,
232
240
  // TODO onFocus
233
241
  // TODO onBlur
234
242
  onReset: onReset, onClose: onClose, renderItem: renderItem, onItemRemove: onItemRemove, hasGroup: hasGroup, multiple: props.multiple, isSearchAutoFocus: props.isSearchAutoFocus, itemToSelectAll: normalizedItemToSelectAll, className: props.className, viewProps: props.viewProps, style: props.style, size: props.size, color: props.color, outline: props.outline, placeholder: props.placeholder, showReset: props.showReset, showEllipses: props.showEllipses, errors: props.errors, disabled: props.disabled }, dataProvider)); }, [isAutoComplete, items, hoveredId, selectedIds, searchInputProps, isOpened, isLoading, onOpen, selectedItems, onReset, onClose,
235
243
  renderItem, onItemRemove, hasGroup, props.multiple, props.isSearchAutoFocus, props.className, props.viewProps, props.style, props.size,
236
244
  props.color, props.outline, props.placeholder, props.showReset, props.showEllipses, props.errors, props.disabled,
237
- normalizedItemToSelectAll, dataProvider]);
245
+ normalizedItemToSelectAll, dataProvider, inputRef, autoCompleteInputForwardedRef, forwardedRef]);
238
246
  return components.ui.renderView(props.view || 'form.DropDownFieldView', viewProps);
239
247
  }
240
248
  DropDownField.defaultProps = {
@@ -33,6 +33,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
33
33
  __setModuleDefault(result, mod);
34
34
  return result;
35
35
  };
36
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
37
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
38
+ if (ar || !(i in from)) {
39
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
40
+ ar[i] = from[i];
41
+ }
42
+ }
43
+ return to.concat(ar || Array.prototype.slice.call(from));
44
+ };
36
45
  var __importDefault = (this && this.__importDefault) || function (mod) {
37
46
  return (mod && mod.__esModule) ? mod : { "default": mod };
38
47
  };
@@ -40,6 +49,8 @@ exports.__esModule = true;
40
49
  var react_1 = __importStar(require("react"));
41
50
  var isBoolean_1 = __importDefault(require("lodash-es/isBoolean"));
42
51
  var range_1 = __importDefault(require("lodash-es/range"));
52
+ var concat_1 = __importDefault(require("lodash-es/concat"));
53
+ var last_1 = __importDefault(require("lodash-es/last"));
43
54
  var isEmpty_1 = __importDefault(require("lodash-es/isEmpty"));
44
55
  var get_1 = __importDefault(require("lodash-es/get"));
45
56
  var react_use_1 = require("react-use");
@@ -57,15 +68,26 @@ function FieldList(props) {
57
68
  var isWithReduxForm = (0, hooks_1.useSelector)(function (state) { return (0, get_1["default"])(state, ['form', context.formId]) || null; });
58
69
  var dispatch = context.provider.useDispatch();
59
70
  // Mapper for preserving the correct sequence of rows on the UI
60
- var storeToRowIndexMap = (0, react_1.useMemo)(function () { return (0, range_1["default"])(props.input.value || 0); }, [props.input.value]);
71
+ var _b = (0, react_1.useState)((0, range_1["default"])(props.input.value) || []), storeToRowIndexMap = _b[0], setStoreToRowIndexMap = _b[1];
72
+ var addRowIndexes = (0, react_1.useCallback)(function (rowsCount) {
73
+ setStoreToRowIndexMap(function (prevMap) {
74
+ var lastIndex = !(0, isEmpty_1["default"])(prevMap) ? (0, last_1["default"])(prevMap) + 1 : 0;
75
+ return (0, concat_1["default"])(prevMap, (0, range_1["default"])(lastIndex, lastIndex + rowsCount));
76
+ });
77
+ }, []);
78
+ var removeRowIndex = (0, react_1.useCallback)(function (rowIndex) {
79
+ setStoreToRowIndexMap(function (prevMap) { return __spreadArray(__spreadArray([], prevMap.slice(0, rowIndex), true), prevMap.slice(rowIndex + 1), true); });
80
+ }, []);
61
81
  // Add and Remove handlers
62
82
  var onAdd = (0, react_1.useCallback)(function (rowsCount) {
63
83
  if (rowsCount === void 0) { rowsCount = 1; }
84
+ addRowIndexes(rowsCount);
64
85
  dispatch((0, form_1.formArrayAdd)(context.formId, props.input.name, rowsCount, props.initialValues));
65
- }, [context.formId, dispatch, props.initialValues, props.input.name]);
86
+ }, [addRowIndexes, context.formId, dispatch, props.initialValues, props.input.name]);
66
87
  var onRemove = (0, react_1.useCallback)(function (rowIndex) {
88
+ removeRowIndex(rowIndex);
67
89
  dispatch((0, form_1.formArrayRemove)(context.formId, props.input.name, rowIndex));
68
- }, [context.formId, dispatch, props.input.name]);
90
+ }, [context.formId, dispatch, props.input.name, removeRowIndex]);
69
91
  (0, react_use_1.useMount)(function () {
70
92
  // Add initial rows
71
93
  if (!props.input.value) {
@@ -70,7 +70,7 @@ function Grid(props) {
70
70
  initialItems: props.initialItems,
71
71
  initialTotal: props.initialTotal,
72
72
  autoFetchOnFormChanges: props.autoFetchOnFormChanges
73
- }), list = _a.list, model = _a.model, searchModel = _a.searchModel, paginationPosition = _a.paginationPosition, paginationSizePosition = _a.paginationSizePosition, layoutNamesPosition = _a.layoutNamesPosition, renderList = _a.renderList, renderLoading = _a.renderLoading, renderEmpty = _a.renderEmpty, renderPagination = _a.renderPagination, renderPaginationSize = _a.renderPaginationSize, renderLayoutNames = _a.renderLayoutNames, renderSearchForm = _a.renderSearchForm, renderInfiniteScroll = _a.renderInfiniteScroll, onFetch = _a.onFetch, onSort = _a.onSort;
73
+ }), list = _a.list, model = _a.model, searchModel = _a.searchModel, paginationPosition = _a.paginationPosition, paginationSizePosition = _a.paginationSizePosition, layoutNamesPosition = _a.layoutNamesPosition, renderList = _a.renderList, renderLoading = _a.renderLoading, renderEmpty = _a.renderEmpty, renderPagination = _a.renderPagination, renderPaginationSize = _a.renderPaginationSize, renderLayoutNames = _a.renderLayoutNames, renderSearchForm = _a.renderSearchForm, renderInfiniteScroll = _a.renderInfiniteScroll, onFetch = _a.onFetch, onSort = _a.onSort, sort = _a.sort;
74
74
  var renderLabel = (0, react_1.useCallback)(function (column) {
75
75
  if (column.headerView) {
76
76
  var HeaderView = column.headerView;
@@ -136,6 +136,7 @@ function Grid(props) {
136
136
  columns: columns,
137
137
  onFetch: onFetch,
138
138
  onSort: onSort,
139
+ sort: sort,
139
140
  items: (list === null || list === void 0 ? void 0 : list.items) || [],
140
141
  searchForm: props.searchForm,
141
142
  listId: props.listId,
@@ -146,7 +147,8 @@ function Grid(props) {
146
147
  primaryKey: props.primaryKey
147
148
  }); }, [list, paginationPosition, paginationSizePosition, layoutNamesPosition, renderList, renderLoading, renderEmpty,
148
149
  renderPagination, renderPaginationSize, renderLayoutNames, renderSearchForm, renderInfiniteScroll, renderValue, columns,
149
- onFetch, onSort, props.searchForm, props.listId, props.isLoading, props.size, props.hasAlternatingColors, props.className, props.primaryKey]);
150
+ onFetch, onSort, sort, props.searchForm, props.listId, props.isLoading, props.size, props.hasAlternatingColors, props.className,
151
+ props.primaryKey]);
150
152
  return components.ui.renderView(props.view || 'list.GridView', viewProps);
151
153
  }
152
154
  exports["default"] = Grid;
@@ -69,7 +69,9 @@ var renderComponent = function (route, activePath, routeProps, alwaysAppendParen
69
69
  return null;
70
70
  }
71
71
  // Check already redirected
72
- var toPath = (0, router_2.buildUrl)(redirectPath, (_b = routeProps === null || routeProps === void 0 ? void 0 : routeProps.match) === null || _b === void 0 ? void 0 : _b.params);
72
+ var toPath = (alwaysAppendParentRoutePath
73
+ ? redirectPath
74
+ : (0, router_2.buildUrl)(redirectPath, (_b = routeProps === null || routeProps === void 0 ? void 0 : routeProps.match) === null || _b === void 0 ? void 0 : _b.params));
73
75
  if (activePath !== toPath) {
74
76
  return (react_1["default"].createElement(react_router_1.Redirect, __assign({}, routeProps, { to: toPath }, route.componentProps)));
75
77
  }