@steroidsjs/core 3.0.91 → 3.0.92

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/actions/list.js CHANGED
@@ -42,26 +42,6 @@ exports.LIST_CHANGE_ACTION = '@list/change_action';
42
42
  exports.LIST_SELECT_ITEM = '@list/select_item';
43
43
  //const STORAGE_LAYOUT_KEY_PREFIX = 'listLayout_';
44
44
  var lazyTimers = {};
45
- var createList = function (listId, props) { return ({
46
- action: props.action || props.action === '' ? props.action : null,
47
- actionMethod: props.actionMethod || 'get',
48
- onFetch: props.onFetch,
49
- onError: props.onError,
50
- condition: props.condition,
51
- scope: props.scope,
52
- total: props.total || null,
53
- items: null,
54
- sourceItems: props.items || null,
55
- isRemote: !props.items,
56
- loadMore: props._pagination.loadMore,
57
- primaryKey: props.primaryKey,
58
- listId: listId,
59
- formId: (0, get_1["default"])(props, 'searchForm.formId') || listId,
60
- pageAttribute: (0, get_1["default"])(props, '_pagination.attribute') || null,
61
- pageSizeAttribute: (0, get_1["default"])(props, '_paginationSize.attribute') || null,
62
- sortAttribute: (0, get_1["default"])(props, '_sort.attribute') || null,
63
- layoutAttribute: (0, get_1["default"])(props, '_layout.attribute') || null
64
- }); };
65
45
  var httpFetchHandler = function (list, query, _a, options) {
66
46
  var http = _a.http;
67
47
  if (options === void 0) { options = {}; }
@@ -9,5 +9,8 @@ export declare const closeNotification: (id?: string | null) => {
9
9
  type: string;
10
10
  id: string;
11
11
  };
12
- export declare const showNotification: (message: string, level?: ColorName, params?: IShowNotificationParameters) => (dispatch: any) => void;
12
+ export declare const showNotification: (message: string | {
13
+ message: string;
14
+ description?: string;
15
+ }, level?: ColorName, params?: IShowNotificationParameters) => (dispatch: any) => void;
13
16
  export declare const setFlashes: (flashes: any) => ((dispatch: any) => void)[][];
@@ -1,11 +1,6 @@
1
1
  export interface IClientStorageComponentConfig {
2
2
  /**
3
- * Кастомный домен для куки
4
- */
5
- domain?: string;
6
- /**
7
- * Автоматически устанавливает куку для всех поддоменов текущего домена,
8
- * но только если параметр domain не указан явно
3
+ * Позволяет использовать cookie на всех поддоменах (по умолчанию, false)
9
4
  */
10
5
  shareBetweenSubdomains?: boolean;
11
6
  /**
@@ -49,7 +44,6 @@ export default class ClientStorageComponent implements IClientStorageComponent {
49
44
  STORAGE_SESSION: any;
50
45
  localStorageAvailable: boolean;
51
46
  sessionStorageAvailable: boolean;
52
- domain?: string;
53
47
  shareBetweenSubdomains?: boolean;
54
48
  private _ssrCookie;
55
49
  constructor(components: any, config: any);
@@ -62,7 +62,6 @@ var ClientStorageComponent = /** @class */ (function () {
62
62
  this.sessionStorageAvailable = false;
63
63
  }
64
64
  }
65
- this.domain = (config === null || config === void 0 ? void 0 : config.domain) || null;
66
65
  this.shareBetweenSubdomains = (_a = config === null || config === void 0 ? void 0 : config.shareBetweenSubdomains) !== null && _a !== void 0 ? _a : false;
67
66
  this._ssrCookie = config === null || config === void 0 ? void 0 : config.ssrCookie;
68
67
  }
@@ -88,10 +87,13 @@ var ClientStorageComponent = /** @class */ (function () {
88
87
  window.sessionStorage.setItem(name, value);
89
88
  }
90
89
  else {
90
+ var domain = this._getDomain();
91
91
  var options = {
92
- expires: expires,
93
- domain: this._getDomain()
92
+ expires: expires
94
93
  };
94
+ if (domain) {
95
+ options.domain = domain;
96
+ }
95
97
  if (expires && process.env.IS_SSR) {
96
98
  options.expires = (0, dayjs_1["default"])().add(options.expires, 'days').utc().toDate();
97
99
  }
@@ -108,27 +110,27 @@ var ClientStorageComponent = /** @class */ (function () {
108
110
  window.sessionStorage.removeItem(name);
109
111
  }
110
112
  else {
111
- var options = {
112
- domain: this._getDomain()
113
- };
113
+ var domain = this._getDomain();
114
+ var options = {};
115
+ if (domain) {
116
+ options.domain = domain;
117
+ }
114
118
  process.env.IS_SSR ? this._ssrCookie.remove(name, options) : cookie.remove(name, options);
115
119
  }
116
120
  };
117
121
  ClientStorageComponent.prototype._getDomain = function () {
118
- if (this.domain) {
119
- return this.domain;
120
- }
121
- var host = typeof window !== 'undefined' ? window.location.hostname : '';
122
122
  if (this.shareBetweenSubdomains) {
123
+ var host = typeof window !== 'undefined' ? window.location.hostname : '';
123
124
  var isIp = /^\d{1,3}(\.\d{1,3}){3}$/.test(host);
124
- if (!isIp) {
125
+ var isLocalhost = host === 'localhost';
126
+ if (!isIp && !isLocalhost) {
125
127
  return host
126
128
  .split('.')
127
129
  .slice(-2)
128
130
  .join('.');
129
131
  }
130
132
  }
131
- return host;
133
+ return null;
132
134
  };
133
135
  return ClientStorageComponent;
134
136
  }());
@@ -298,18 +298,10 @@
298
298
  "IClientStorageComponentConfig"
299
299
  ],
300
300
  "properties": [
301
- {
302
- "name": "domain",
303
- "decorators": [],
304
- "description": "Кастомный домен для куки",
305
- "required": false,
306
- "type": "string",
307
- "example": null
308
- },
309
301
  {
310
302
  "name": "shareBetweenSubdomains",
311
303
  "decorators": [],
312
- "description": " Автоматически устанавливает куку для всех поддоменов текущего домена,\n но только если параметр domain не указан явно",
304
+ "description": "Позволяет использовать cookie на всех поддоменах (по умолчанию, false)",
313
305
  "required": false,
314
306
  "type": "boolean",
315
307
  "example": null
@@ -429,18 +421,10 @@
429
421
  "defaultProps": null,
430
422
  "extends": [],
431
423
  "properties": [
432
- {
433
- "name": "domain",
434
- "decorators": [],
435
- "description": "Кастомный домен для куки",
436
- "required": false,
437
- "type": "string",
438
- "example": null
439
- },
440
424
  {
441
425
  "name": "shareBetweenSubdomains",
442
426
  "decorators": [],
443
- "description": " Автоматически устанавливает куку для всех поддоменов текущего домена,\n но только если параметр domain не указан явно",
427
+ "description": "Позволяет использовать cookie на всех поддоменах (по умолчанию, false)",
444
428
  "required": false,
445
429
  "type": "boolean",
446
430
  "example": null
@@ -6241,7 +6225,7 @@
6241
6225
  {
6242
6226
  "name": "description",
6243
6227
  "decorators": [],
6244
- "description": "Дополнительное содрежание сообщения.",
6228
+ "description": "Дополнительное содержание сообщения.",
6245
6229
  "required": false,
6246
6230
  "type": "string",
6247
6231
  "example": "'Please, check your email.'",
@@ -6360,7 +6344,7 @@
6360
6344
  {
6361
6345
  "name": "description",
6362
6346
  "decorators": [],
6363
- "description": "Дополнительное содрежание сообщения.",
6347
+ "description": "Дополнительное содержание сообщения.",
6364
6348
  "required": false,
6365
6349
  "type": "string",
6366
6350
  "example": "'Please, check your email.'"
@@ -32382,6 +32366,14 @@
32382
32366
  "INotificationItem"
32383
32367
  ],
32384
32368
  "properties": [
32369
+ {
32370
+ "name": "description",
32371
+ "decorators": [],
32372
+ "description": "Дополнительное содержание сообщения.",
32373
+ "required": false,
32374
+ "type": "string",
32375
+ "example": "'Успешно сохранено'"
32376
+ },
32385
32377
  {
32386
32378
  "name": "id",
32387
32379
  "decorators": [],
@@ -37935,12 +37927,14 @@
37935
37927
  "defaultProps": {
37936
37928
  "alwaysOpened": "false",
37937
37929
  "collapseChildItems": "false",
37930
+ "hasAlternatingColors": "false",
37938
37931
  "levelPadding": "32",
37939
- "saveInClientStorage": "false"
37932
+ "saveInClientStorage": "false",
37933
+ "size": "'md'"
37940
37934
  },
37941
37935
  "extends": [
37942
37936
  "Omit<IGridProps",
37943
- "'items'>",
37937
+ "'items' | 'itemsIndexing'>",
37944
37938
  "Pick<ITreeProps",
37945
37939
  "'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage' | 'collapseChildItems'>"
37946
37940
  ],
@@ -37990,6 +37984,24 @@
37990
37984
  "example": "[\n {\n id: 1,\n name: 'Jane'\n },\n {\n id: 2,\n name: 'John',\n items: [...]\n }\n]",
37991
37985
  "defaultValue": null
37992
37986
  },
37987
+ {
37988
+ "name": "itemsIndexing",
37989
+ "decorators": [],
37990
+ "description": "",
37991
+ "required": false,
37992
+ "type": "never",
37993
+ "example": null,
37994
+ "defaultValue": null
37995
+ },
37996
+ {
37997
+ "name": "itemsKey",
37998
+ "decorators": [],
37999
+ "description": "Ключ для доступа к вложенным элементам узла",
38000
+ "required": false,
38001
+ "type": "string",
38002
+ "example": "'items'",
38003
+ "defaultValue": null
38004
+ },
37993
38005
  {
37994
38006
  "name": "levelPadding",
37995
38007
  "decorators": [],
@@ -41382,18 +41394,10 @@
41382
41394
  "description": "Слой хранения данных в браузере (cookie, local/session storage) или ReactNative",
41383
41395
  "tags": {},
41384
41396
  "properties": [
41385
- {
41386
- "name": "domain",
41387
- "decorators": [],
41388
- "description": "Кастомный домен для куки",
41389
- "required": false,
41390
- "type": "string",
41391
- "example": null
41392
- },
41393
41397
  {
41394
41398
  "name": "shareBetweenSubdomains",
41395
41399
  "decorators": [],
41396
- "description": " Автоматически устанавливает куку для всех поддоменов текущего домена,\n но только если параметр domain не указан явно",
41400
+ "description": "Позволяет использовать cookie на всех поддоменах (по умолчанию, false)",
41397
41401
  "required": false,
41398
41402
  "type": "boolean",
41399
41403
  "example": null
package/en.json CHANGED
@@ -1045,9 +1045,9 @@
1045
1045
  "\nКомпонент поля ввода текста с маской.\n": "A text input field component with a mask.",
1046
1046
  "\nКомпонент Tooltip предоставляет всплывающую подсказку для дочерних элементов.\nВнутри компонента, то есть между тегами Tooltip можно использовать только html теги, например div, span и тд\n": "The Tooltip component provides a popup hint for child elements.\nInside the component, that is, between the Tooltip tags, you can only use HTML tags, e.g., div, span, etc.",
1047
1047
  "Логическое значение, указывающее, есть ли еще элементы в списке с бесконечным скроллом": "",
1048
- "Кастомный домен для куки": "",
1049
- " Автоматически устанавливает куку для всех поддоменов текущего домена,\n но только если параметр domain не указан явно": "",
1048
+ "Позволяет использовать cookie на всех поддоменах (по умолчанию, false)": "",
1050
1049
  "Задержка в мс": "",
1050
+ "Дополнительное содержание сообщения.": "",
1051
1051
  "Задержка применения введённого значения": "",
1052
1052
  "Флаг, который указывает, что высота поля должна быть равна высоте контента": ""
1053
1053
  }
package/hooks/useList.js CHANGED
@@ -280,7 +280,7 @@ function useList(config) {
280
280
  dispatch([
281
281
  (0, list_2.listSetItems)(config.listId, config.items),
282
282
  ]);
283
- }, [dispatch, config.items, config.listId]);
283
+ }, [dispatch, config.items, config.listId, list === null || list === void 0 ? void 0 : list.isFetched]);
284
284
  // Check change action
285
285
  var prevAction = (0, react_use_1.usePrevious)(config.action);
286
286
  (0, react_use_1.useUpdateEffect)(function () {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steroidsjs/core",
3
- "version": "3.0.91",
3
+ "version": "3.0.92",
4
4
  "description": "",
5
5
  "author": "Vladimir Kozhin <hello@kozhindev.com>",
6
6
  "repository": {
@@ -30,7 +30,7 @@ export interface IAlertProps extends IUiComponent {
30
30
  * @example 'Sending is confirmed!'
31
31
  */
32
32
  message?: string;
33
- /** Дополнительное содрежание сообщения.
33
+ /** Дополнительное содержание сообщения.
34
34
  * @example 'Please, check your email.'
35
35
  */
36
36
  description?: string;
@@ -28,6 +28,10 @@ interface INotificationItem {
28
28
  * @example Сохранено!
29
29
  */
30
30
  message?: string;
31
+ /** Дополнительное содержание сообщения.
32
+ * @example 'Успешно сохранено'
33
+ */
34
+ description?: string;
31
35
  isClosing?: boolean;
32
36
  }
33
37
  /**
@@ -10,7 +10,7 @@ export interface ITreeColumnViewProps extends IColumnViewProps, Pick<ITreeTableP
10
10
  *
11
11
  * Компонент для представления данных коллекции в виде иерархической структуры.
12
12
  */
13
- export interface ITreeTableProps extends Omit<IGridProps, 'items'>, Pick<ITreeProps, 'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage' | 'collapseChildItems'> {
13
+ export interface ITreeTableProps extends Omit<IGridProps, 'items' | 'itemsIndexing'>, Pick<ITreeProps, 'alwaysOpened' | 'levelPadding' | 'customIcon' | 'saveInClientStorage' | 'collapseChildItems'> {
14
14
  /**
15
15
  * Элементы коллекции
16
16
  * @example
@@ -37,6 +37,12 @@ export interface ITreeTableProps extends Omit<IGridProps, 'items'>, Pick<ITreePr
37
37
  * @example 'arrow'
38
38
  */
39
39
  customIcon?: string | React.ReactElement;
40
+ /**
41
+ * Ключ для доступа к вложенным элементам узла
42
+ * @example 'items'
43
+ */
44
+ itemsKey?: string;
45
+ itemsIndexing?: never;
40
46
  }
41
47
  export declare const addTreeColumnFieldsToFirstColumn: (columns: IGridColumn[], levelPadding: string | number, customIcon?: string | React.ReactElement) => IGridColumn[];
42
48
  declare function TreeTable(props: ITreeTableProps): JSX.Element;
@@ -46,6 +52,8 @@ declare namespace TreeTable {
46
52
  alwaysOpened: boolean;
47
53
  saveInClientStorage: boolean;
48
54
  collapseChildItems: boolean;
55
+ size: string;
56
+ hasAlternatingColors: boolean;
49
57
  };
50
58
  }
51
59
  export default TreeTable;
@@ -50,10 +50,13 @@ exports.addTreeColumnFieldsToFirstColumn = void 0;
50
50
  var React = __importStar(require("react"));
51
51
  var react_1 = require("react");
52
52
  var merge_1 = __importDefault(require("lodash-es/merge"));
53
- var list_1 = require("@steroidsjs/core/reducers/list");
53
+ var Format_1 = __importDefault(require("@steroidsjs/core/ui/format/Format"));
54
+ var ControlsColumn_1 = __importDefault(require("@steroidsjs/core/ui/list/ControlsColumn"));
55
+ var upperFirst_1 = __importDefault(require("lodash-es/upperFirst"));
56
+ var isString_1 = __importDefault(require("lodash-es/isString"));
57
+ var hooks_1 = require("@steroidsjs/core/hooks");
54
58
  var useTree_1 = __importDefault(require("../../../hooks/useTree"));
55
- var Grid_1 = __importDefault(require("../Grid"));
56
- var useSelector_1 = __importDefault(require("../../../hooks/useSelector"));
59
+ var useList_1 = __importDefault(require("../../../hooks/useList"));
57
60
  var TREE_COLUMN_VIEW_FIELDS = {
58
61
  valueView: 'TreeColumnView',
59
62
  headerClassName: 'TreeColumnHeader'
@@ -66,25 +69,104 @@ var addTreeColumnFieldsToFirstColumn = function (columns, levelPadding, customIc
66
69
  };
67
70
  exports.addTreeColumnFieldsToFirstColumn = addTreeColumnFieldsToFirstColumn;
68
71
  function TreeTable(props) {
69
- var columns = (0, react_1.useMemo)(function () { return (0, exports.addTreeColumnFieldsToFirstColumn)(props.columns, props.levelPadding, props.customIcon); }, [props.columns, props.customIcon, props.levelPadding]);
70
- var list = (0, useSelector_1["default"])(function (state) { return (0, list_1.getList)(state, props.listId); });
71
- var treeItems = (0, useTree_1["default"])({
72
+ var components = (0, hooks_1.useComponents)();
73
+ var mergedColumns = (0, react_1.useMemo)(function () { return (0, exports.addTreeColumnFieldsToFirstColumn)(props.columns, props.levelPadding, props.customIcon); }, [props.columns, props.customIcon, props.levelPadding]);
74
+ var _a = (0, useList_1["default"])({
75
+ listId: props.listId,
76
+ primaryKey: props.primaryKey,
77
+ action: props.action,
78
+ actionMethod: props.actionMethod,
79
+ pagination: props.pagination,
80
+ paginationSize: props.paginationSize,
81
+ infiniteScroll: props.infiniteScroll,
82
+ sort: props.sort,
83
+ layout: props.layout,
84
+ empty: props.empty,
85
+ searchForm: props.searchForm,
86
+ autoDestroy: props.autoDestroy,
87
+ onFetch: props.onFetch,
88
+ condition: props.condition,
89
+ addressBar: props.addressBar,
90
+ scope: props.scope,
91
+ query: props.query,
92
+ model: props.model,
93
+ searchModel: props.searchModel,
72
94
  items: props.items,
95
+ initialItems: props.initialItems,
96
+ initialTotal: props.initialTotal,
97
+ autoFetchOnFormChanges: props.autoFetchOnFormChanges
98
+ }), 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;
99
+ var items = (0, react_1.useMemo)(function () { return (list === null || list === void 0 ? void 0 : list.items) || []; }, [list === null || list === void 0 ? void 0 : list.items]);
100
+ var treeItems = (0, useTree_1["default"])({
101
+ items: items,
73
102
  autoOpenLevels: 0,
74
103
  alwaysOpened: props.alwaysOpened,
75
- currentPage: list === null || list === void 0 ? void 0 : list.page,
76
- itemsOnPage: list === null || list === void 0 ? void 0 : list.pageSize,
77
104
  collapseChildItems: props.collapseChildItems,
78
105
  saveInClientStorage: props.saveInClientStorage,
79
106
  clientStorageId: props.listId,
80
- isSinglePageItems: props.isSinglePageItems
107
+ isSinglePageItems: props.isSinglePageItems,
108
+ itemsKey: props.itemsKey
81
109
  }).treeItems;
82
- return (React.createElement(Grid_1["default"], __assign({}, props, { columns: columns, items: treeItems, itemsIndexing: false })));
110
+ var renderLabel = (0, react_1.useCallback)(function (column) {
111
+ if (column.headerView) {
112
+ var HeaderView = column.headerView;
113
+ return (React.createElement(HeaderView, __assign({}, column, column.headerProps, { listId: props.listId })));
114
+ }
115
+ if (column.label || column.label === '') {
116
+ return column.label;
117
+ }
118
+ var attributeMeta = []
119
+ .concat((model === null || model === void 0 ? void 0 : model.attributes) || [])
120
+ .concat((searchModel === null || searchModel === void 0 ? void 0 : searchModel.attributes) || [])
121
+ .find(function (item) { return column.attribute && item.attribute === column.attribute; });
122
+ return attributeMeta ? attributeMeta.label : (0, upperFirst_1["default"])(column.attribute);
123
+ }, [model, props.listId, searchModel]);
124
+ var renderValue = (0, react_1.useCallback)(function (item, column) {
125
+ // Custom component
126
+ if (column.valueView) {
127
+ var isValueViewString = typeof column.valueView === 'string';
128
+ var ValueView = isValueViewString ? components.ui.getView("list.".concat(column.valueView)) : column.valueView;
129
+ var viewProps_1 = __assign(__assign(__assign({}, column), column.valueProps), { listId: props.listId, primaryKey: props.primaryKey, item: item, size: props.size });
130
+ if (isValueViewString) {
131
+ return components.ui.renderView(ValueView, viewProps_1);
132
+ }
133
+ return (React.createElement(ValueView, __assign({}, viewProps_1)));
134
+ }
135
+ return (React.createElement(Format_1["default"], __assign({ item: item, model: props.model }, column, (column.formatter || {}))));
136
+ }, [props.listId, props.model, props.primaryKey]);
137
+ // Columns
138
+ var columns = (0, react_1.useMemo)(function () { return []
139
+ .concat({
140
+ label: __('№'),
141
+ valueView: function (_a) {
142
+ var item = _a.item;
143
+ return item.index + 1;
144
+ },
145
+ visible: false
146
+ })
147
+ .concat(mergedColumns)
148
+ .concat({
149
+ valueView: ControlsColumn_1["default"],
150
+ valueProps: {
151
+ controls: props.controls
152
+ },
153
+ visible: !!props.controls
154
+ })
155
+ .map(function (column) { return ((0, isString_1["default"])(column) ? { attribute: column } : column); })
156
+ .filter(function (column) { return column.visible !== false; })
157
+ .map(function (column) { return (__assign(__assign({}, column), { label: renderLabel(column) })); }); }, [mergedColumns, props.controls, renderLabel]);
158
+ var viewProps = (0, react_1.useMemo)(function () { return (__assign(__assign({}, props.viewProps), { list: list, paginationPosition: paginationPosition, paginationSizePosition: paginationSizePosition, layoutNamesPosition: layoutNamesPosition, renderList: renderList, renderLoading: renderLoading, renderEmpty: renderEmpty, renderPagination: renderPagination, renderPaginationSize: renderPaginationSize, renderLayoutNames: renderLayoutNames, renderSearchForm: renderSearchForm, renderInfiniteScroll: renderInfiniteScroll, renderValue: renderValue, columns: columns, onFetch: onFetch, onSort: onSort, sort: sort, items: treeItems, searchForm: props.searchForm, listId: props.listId, isLoading: props.isLoading, size: props.size, hasAlternatingColors: props.hasAlternatingColors, className: props.className, primaryKey: props.primaryKey })); }, [treeItems, list, paginationPosition, paginationSizePosition, layoutNamesPosition, renderList, renderLoading, renderEmpty,
159
+ renderPagination, renderPaginationSize, renderLayoutNames, renderSearchForm, renderInfiniteScroll, renderValue,
160
+ columns, onFetch, onSort, sort, props.searchForm, props.listId, props.isLoading, props.size, props.hasAlternatingColors,
161
+ props.className, props.primaryKey, props.viewProps]);
162
+ return components.ui.renderView(props.view || 'list.GridView', viewProps);
83
163
  }
84
164
  exports["default"] = TreeTable;
85
165
  TreeTable.defaultProps = {
86
166
  levelPadding: 32,
87
167
  alwaysOpened: false,
88
168
  saveInClientStorage: false,
89
- collapseChildItems: false
169
+ collapseChildItems: false,
170
+ size: 'md',
171
+ hasAlternatingColors: false
90
172
  };