@steroidsjs/core 2.1.0-beta.2 → 2.1.0-beta.20

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.
Files changed (136) hide show
  1. package/actions/form.d.ts +9 -0
  2. package/actions/form.js +11 -1
  3. package/actions/list.d.ts +1 -0
  4. package/actions/list.js +1 -0
  5. package/components/ClientStorageComponent.d.ts +3 -3
  6. package/components/ClientStorageComponent.js +28 -22
  7. package/components/HttpComponent.js +32 -15
  8. package/components/LocaleComponent.js +9 -9
  9. package/components/MetricsComponent.js +3 -1
  10. package/components/StoreComponent.d.ts +6 -0
  11. package/components/StoreComponent.js +6 -7
  12. package/components/UiComponent.d.ts +1 -1
  13. package/components/WebSocketComponent.d.ts +1 -1
  14. package/hoc/components.d.ts +1 -1
  15. package/hoc/components.js +1 -1
  16. package/hoc/file.d.ts +1 -0
  17. package/hooks/index.d.ts +2 -1
  18. package/hooks/index.js +3 -1
  19. package/hooks/useAbsolutePositioning.d.ts +5 -0
  20. package/hooks/useAbsolutePositioning.js +6 -6
  21. package/hooks/useApplication.d.ts +29 -26
  22. package/hooks/useApplication.js +17 -82
  23. package/hooks/useComponents.d.ts +1 -14
  24. package/hooks/useComponents.js +5 -5
  25. package/hooks/useDataProvider.js +4 -2
  26. package/hooks/useDataSelect.d.ts +12 -6
  27. package/hooks/useDataSelect.js +5 -3
  28. package/hooks/useFetch.d.ts +11 -3
  29. package/hooks/useFetch.js +34 -31
  30. package/hooks/useFile.js +14 -2
  31. package/hooks/useLayout.d.ts +9 -0
  32. package/hooks/useLayout.js +64 -44
  33. package/hooks/useList.d.ts +45 -0
  34. package/hooks/useList.js +83 -53
  35. package/hooks/useModel.js +1 -1
  36. package/hooks/useScreen.d.ts +1 -1
  37. package/hooks/useScreen.js +2 -2
  38. package/hooks/useSsr.d.ts +2 -0
  39. package/hooks/useSsr.js +8 -0
  40. package/index.d.ts +8 -2
  41. package/package.json +6 -3
  42. package/providers/ComponentsProvider.d.ts +26 -0
  43. package/providers/ComponentsProvider.js +28 -0
  44. package/providers/ScreenProvider.d.ts +20 -0
  45. package/providers/ScreenProvider.js +87 -0
  46. package/providers/SsrProvider.d.ts +17 -0
  47. package/providers/SsrProvider.js +32 -0
  48. package/providers/index.d.ts +4 -0
  49. package/providers/index.js +12 -0
  50. package/reducers/form.d.ts +1 -1
  51. package/reducers/form.js +3 -1
  52. package/reducers/index.js +1 -1
  53. package/reducers/list.js +1 -3
  54. package/reducers/router.js +1 -1
  55. package/ui/content/Alert/Alert.d.ts +50 -0
  56. package/ui/content/Alert/Alert.js +39 -0
  57. package/ui/content/Alert/index.d.ts +2 -0
  58. package/ui/content/Alert/index.js +7 -0
  59. package/ui/content/Avatar/Avatar.d.ts +53 -12
  60. package/ui/content/Avatar/Avatar.js +25 -4
  61. package/ui/content/Avatar/index.d.ts +6 -1
  62. package/ui/content/Avatar/index.js +4 -0
  63. package/ui/content/Card/Card.d.ts +61 -13
  64. package/ui/content/Card/Card.js +3 -2
  65. package/ui/content/Collapse/Collapse.d.ts +63 -0
  66. package/ui/content/Collapse/Collapse.js +75 -0
  67. package/ui/content/Collapse/CollapseItem.d.ts +67 -0
  68. package/ui/content/Collapse/CollapseItem.js +22 -0
  69. package/ui/content/Collapse/index.d.ts +7 -0
  70. package/ui/content/Collapse/index.js +8 -0
  71. package/ui/content/Detail/Detail.d.ts +102 -0
  72. package/ui/content/Detail/Detail.js +155 -0
  73. package/ui/content/Detail/DetailItem.d.ts +43 -0
  74. package/ui/content/Detail/DetailItem.js +10 -0
  75. package/ui/content/Detail/demo/basic.d.ts +8 -0
  76. package/ui/content/Detail/demo/basic.js +56 -0
  77. package/ui/content/Detail/demo/controls.d.ts +8 -0
  78. package/ui/content/Detail/demo/controls.js +56 -0
  79. package/ui/content/Detail/demo/layout.d.ts +8 -0
  80. package/ui/content/Detail/demo/layout.js +56 -0
  81. package/ui/content/Detail/demo/responsive.d.ts +8 -0
  82. package/ui/content/Detail/demo/responsive.js +71 -0
  83. package/ui/content/Detail/demo/sizes.d.ts +8 -0
  84. package/ui/content/Detail/demo/sizes.js +61 -0
  85. package/ui/content/Detail/index.d.ts +3 -0
  86. package/ui/content/Detail/index.js +10 -0
  87. package/ui/content/DropDown/DropDown.d.ts +1 -0
  88. package/ui/content/DropDown/DropDown.js +1 -0
  89. package/ui/content/index.d.ts +13 -0
  90. package/ui/content/index.js +22 -0
  91. package/ui/crud/Crud/Crud.d.ts +1 -1
  92. package/ui/crud/Crud/Crud.js +1 -1
  93. package/ui/crud/index.d.ts +1 -0
  94. package/ui/form/Button/Button.d.ts +1 -0
  95. package/ui/form/Button/Button.js +1 -0
  96. package/ui/form/DateField/useDateInputState.d.ts +4 -0
  97. package/ui/form/DateField/useDateInputState.js +3 -3
  98. package/ui/form/DateField/useDateTime.js +9 -7
  99. package/ui/form/DateTimeField/DateTimeField.js +2 -1
  100. package/ui/form/DropDownField/DropDownField.js +10 -3
  101. package/ui/form/Form/Form.js +118 -106
  102. package/ui/form/ImageField/ImageField.d.ts +87 -0
  103. package/ui/form/ImageField/ImageField.js +145 -0
  104. package/ui/form/ImageField/index.d.ts +2 -0
  105. package/ui/form/ImageField/index.js +7 -0
  106. package/ui/form/InputField/InputField.d.ts +7 -0
  107. package/ui/form/InputField/InputField.js +26 -22
  108. package/ui/form/TextField/TextField.d.ts +2 -1
  109. package/ui/form/TextField/TextField.js +1 -1
  110. package/ui/icon/Icon/Icon.js +3 -0
  111. package/ui/layout/Meta/Meta.d.ts +56 -0
  112. package/ui/layout/Meta/Meta.js +38 -0
  113. package/ui/layout/Meta/index.d.ts +2 -0
  114. package/ui/layout/Meta/index.js +7 -0
  115. package/ui/layout/Notifications/Notifications.js +1 -1
  116. package/ui/layout/Portal.js +3 -0
  117. package/ui/layout/ProgressBar/ProgressBar.d.ts +55 -0
  118. package/ui/layout/ProgressBar/ProgressBar.js +52 -0
  119. package/ui/layout/ProgressBar/index.d.ts +2 -0
  120. package/ui/layout/ProgressBar/index.js +7 -0
  121. package/ui/layout/Skeleton/Skeleton.d.ts +25 -0
  122. package/ui/layout/Skeleton/Skeleton.js +11 -0
  123. package/ui/layout/Skeleton/index.d.ts +2 -0
  124. package/ui/layout/Skeleton/index.js +7 -0
  125. package/ui/list/Steps/Steps.d.ts +32 -0
  126. package/ui/list/Steps/Steps.js +23 -0
  127. package/ui/list/Steps/index.d.ts +2 -0
  128. package/ui/list/Steps/index.js +7 -0
  129. package/ui/nav/Router/Router.d.ts +13 -0
  130. package/ui/nav/Router/Router.js +1 -1
  131. package/utils/calendar.d.ts +1 -1
  132. package/utils/calendar.js +8 -1
  133. package/ui/content/Avatar/SizeContext.d.ts +0 -1
  134. package/ui/content/Avatar/SizeContext.js +0 -14
  135. package/ui/nav/Router/SsrProvider.d.ts +0 -15
  136. package/ui/nav/Router/SsrProvider.js +0 -55
package/actions/form.d.ts CHANGED
@@ -2,6 +2,7 @@ export declare const FORM_INITIALIZE = "@form/initialize";
2
2
  export declare const FORM_CHANGE = "@form/change";
3
3
  export declare const FORM_RESET = "@form/reset";
4
4
  export declare const FORM_SET_ERRORS = "@form/set_errors";
5
+ export declare const FORM_SUBMIT = "@form/submit";
5
6
  export declare const FORM_ARRAY_ADD = "@form/array_add";
6
7
  export declare const FORM_ARRAY_REMOVE = "@form/array_remove";
7
8
  /**
@@ -36,6 +37,14 @@ export declare const formSetErrors: (formId: any, errors: any) => {
36
37
  formId: any;
37
38
  errors: any;
38
39
  };
40
+ /**
41
+ * Сабмит формы
42
+ * @param formId
43
+ */
44
+ export declare const formSubmit: (formId: any) => {
45
+ type: string;
46
+ formId: any;
47
+ };
39
48
  /**
40
49
  * Сброс данных формы к первоначальному состоянию (к initialValues)
41
50
  * @param formId
package/actions/form.js CHANGED
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  exports.__esModule = true;
3
- exports.formArrayRemove = exports.formArrayAdd = exports.formReset = exports.formSetErrors = exports.formChange = exports.formInitialize = exports.FORM_ARRAY_REMOVE = exports.FORM_ARRAY_ADD = exports.FORM_SET_ERRORS = exports.FORM_RESET = exports.FORM_CHANGE = exports.FORM_INITIALIZE = void 0;
3
+ exports.formArrayRemove = exports.formArrayAdd = exports.formReset = exports.formSubmit = exports.formSetErrors = exports.formChange = exports.formInitialize = exports.FORM_ARRAY_REMOVE = exports.FORM_ARRAY_ADD = exports.FORM_SUBMIT = exports.FORM_SET_ERRORS = exports.FORM_RESET = exports.FORM_CHANGE = exports.FORM_INITIALIZE = void 0;
4
4
  exports.FORM_INITIALIZE = '@form/initialize';
5
5
  exports.FORM_CHANGE = '@form/change';
6
6
  exports.FORM_RESET = '@form/reset';
7
7
  exports.FORM_SET_ERRORS = '@form/set_errors';
8
+ exports.FORM_SUBMIT = '@form/submit';
8
9
  exports.FORM_ARRAY_ADD = '@form/array_add';
9
10
  exports.FORM_ARRAY_REMOVE = '@form/array_remove';
10
11
  /**
@@ -42,6 +43,15 @@ var formSetErrors = function (formId, errors) { return ({
42
43
  errors: errors
43
44
  }); };
44
45
  exports.formSetErrors = formSetErrors;
46
+ /**
47
+ * Сабмит формы
48
+ * @param formId
49
+ */
50
+ var formSubmit = function (formId) { return ({
51
+ type: exports.FORM_SUBMIT,
52
+ formId: formId
53
+ }); };
54
+ exports.formSubmit = formSubmit;
45
55
  /**
46
56
  * Сброс данных формы к первоначальному состоянию (к initialValues)
47
57
  * @param formId
package/actions/list.d.ts CHANGED
@@ -51,6 +51,7 @@ export declare const listInit: (listId: any, payload: any) => {
51
51
  };
52
52
  export declare const listSetItems: (listId: any, items: any) => {
53
53
  type: string;
54
+ listId: any;
54
55
  items: any;
55
56
  };
56
57
  export declare const listSetLayout: (listId: any, layoutName: any) => {
package/actions/list.js CHANGED
@@ -133,6 +133,7 @@ var listInit = function (listId, payload) { return ({
133
133
  exports.listInit = listInit;
134
134
  var listSetItems = function (listId, items) { return ({
135
135
  type: exports.LIST_SET_ITEMS,
136
+ listId: listId,
136
137
  items: items
137
138
  }); };
138
139
  exports.listSetItems = listSetItems;
@@ -6,16 +6,16 @@ export default class ClientStorageComponent {
6
6
  STORAGE_COOKIE: string;
7
7
  STORAGE_LOCAL: any;
8
8
  STORAGE_SESSION: any;
9
- cookieAvailable: any;
10
9
  localStorageAvailable: boolean;
11
10
  sessionStorageAvailable: boolean;
12
- constructor(components: any);
11
+ private _ssrCookie;
12
+ constructor(components: any, config: any);
13
13
  /**
14
14
  * @param {string} name
15
15
  * @param {string} [storageName]
16
16
  * @returns {*}
17
17
  */
18
- get(name: any, storageName: any): string;
18
+ get(name: any, storageName: any): any;
19
19
  /**
20
20
  * @param {string} name
21
21
  * @param {*} value
@@ -18,17 +18,20 @@ var __importStar = (this && this.__importStar) || function (mod) {
18
18
  __setModuleDefault(result, mod);
19
19
  return result;
20
20
  };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
21
24
  exports.__esModule = true;
22
25
  var cookie = __importStar(require("js-cookie"));
26
+ var moment_1 = __importDefault(require("moment"));
23
27
  /**
24
28
  * Client Storage Component
25
29
  * Слой хранения данных в браузере (cookie, local/session storage) или ReactNative
26
30
  */
27
31
  var ClientStorageComponent = /** @class */ (function () {
28
- function ClientStorageComponent(components) {
32
+ function ClientStorageComponent(components, config) {
29
33
  this.localStorageAvailable = !process.env.IS_SSR;
30
34
  this.sessionStorageAvailable = !process.env.IS_SSR;
31
- this.cookieAvailable = !process.env.IS_SSR;
32
35
  this.STORAGE_SESSION = 'session';
33
36
  this.STORAGE_LOCAL = 'local';
34
37
  this.STORAGE_COOKIE = 'cookie';
@@ -52,6 +55,7 @@ var ClientStorageComponent = /** @class */ (function () {
52
55
  this.sessionStorageAvailable = false;
53
56
  }
54
57
  }
58
+ this._ssrCookie = config === null || config === void 0 ? void 0 : config.ssrCookie;
55
59
  }
56
60
  /**
57
61
  * @param {string} name
@@ -63,14 +67,11 @@ var ClientStorageComponent = /** @class */ (function () {
63
67
  if (this.localStorageAvailable && storageName === this.STORAGE_LOCAL) {
64
68
  return window.localStorage.getItem(name);
65
69
  }
66
- else if (this.sessionStorageAvailable &&
67
- storageName === this.STORAGE_SESSION) {
70
+ if (this.sessionStorageAvailable
71
+ && storageName === this.STORAGE_SESSION) {
68
72
  return window.sessionStorage.getItem(name);
69
73
  }
70
- else if (this.cookieAvailable) {
71
- return cookie.get(name);
72
- }
73
- return null;
74
+ return process.env.IS_SSR ? this._ssrCookie.get(name) : cookie.get(name);
74
75
  };
75
76
  /**
76
77
  * @param {string} name
@@ -84,15 +85,19 @@ var ClientStorageComponent = /** @class */ (function () {
84
85
  if (this.localStorageAvailable && storageName === this.STORAGE_LOCAL) {
85
86
  window.localStorage.setItem(name, value);
86
87
  }
87
- else if (this.sessionStorageAvailable &&
88
- storageName === this.STORAGE_SESSION) {
88
+ else if (this.sessionStorageAvailable
89
+ && storageName === this.STORAGE_SESSION) {
89
90
  window.sessionStorage.setItem(name, value);
90
91
  }
91
- else if (this.cookieAvailable) {
92
- cookie.set(name, value, {
92
+ else {
93
+ var options = {
93
94
  expires: expires,
94
95
  domain: this._getDomain()
95
- });
96
+ };
97
+ if (expires && process.env.IS_SSR) {
98
+ options.expires = moment_1["default"]().add(options.expires).utc().toDate();
99
+ }
100
+ process.env.IS_SSR ? this._ssrCookie.set(name, value, options) : cookie.set(name, value, options);
96
101
  }
97
102
  };
98
103
  /**
@@ -105,24 +110,25 @@ var ClientStorageComponent = /** @class */ (function () {
105
110
  if (this.localStorageAvailable && storageName === this.STORAGE_LOCAL) {
106
111
  window.localStorage.removeItem(name);
107
112
  }
108
- else if (this.sessionStorageAvailable &&
109
- storageName === this.STORAGE_SESSION) {
113
+ else if (this.sessionStorageAvailable
114
+ && storageName === this.STORAGE_SESSION) {
110
115
  window.sessionStorage.removeItem(name);
111
116
  }
112
- else if (this.cookieAvailable) {
113
- cookie.remove(name, {
117
+ else {
118
+ var options = {
114
119
  domain: this._getDomain()
115
- });
120
+ };
121
+ process.env.IS_SSR ? this._ssrCookie.remove(name, options) : cookie.remove(name, options);
116
122
  }
117
123
  };
118
124
  ClientStorageComponent.prototype._getDomain = function () {
119
125
  var host = (typeof location !== 'undefined' && location.hostname) || '';
120
- return ((!/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/.test(host) &&
121
- host
126
+ return ((!/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/.test(host)
127
+ && host
122
128
  .split('.')
123
129
  .slice(-2)
124
- .join('.')) ||
125
- host);
130
+ .join('.'))
131
+ || host);
126
132
  };
127
133
  return ClientStorageComponent;
128
134
  }());
@@ -52,6 +52,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
52
52
  exports.__esModule = true;
53
53
  var trimStart_1 = __importDefault(require("lodash-es/trimStart"));
54
54
  var trimEnd_1 = __importDefault(require("lodash-es/trimEnd"));
55
+ var isEmpty_1 = __importDefault(require("lodash-es/isEmpty"));
56
+ var set_cookie_parser_1 = __importDefault(require("set-cookie-parser"));
55
57
  var axios_1 = __importDefault(require("axios"));
56
58
  var notifications_1 = require("../actions/notifications");
57
59
  /**
@@ -65,13 +67,12 @@ var HttpComponent = /** @class */ (function () {
65
67
  this._components = components;
66
68
  this.apiUrl = config.apiUrl
67
69
  //|| process.env.APP_BACKEND_URL
68
- || (typeof window !== 'undefined' ? window.location.protocol + '//' + window.location.host : '');
70
+ || (!process.env.IS_SSR ? window.location.protocol + '//' + window.location.host : '');
69
71
  this.accessTokenKey = config.accessTokenKey || 'accessToken';
70
72
  this._lazyRequests = {};
71
73
  this._axios = null;
72
74
  this._csrfToken = null;
73
75
  this._accessToken = false;
74
- this._promises = [];
75
76
  }
76
77
  HttpComponent.prototype.getAxiosConfig = function () {
77
78
  return __awaiter(this, void 0, void 0, function () {
@@ -191,7 +192,7 @@ var HttpComponent = /** @class */ (function () {
191
192
  });
192
193
  };
193
194
  HttpComponent.prototype.getUrl = function (method) {
194
- if (method === null && typeof window !== 'undefined') {
195
+ if (method === null && !process.env.IS_SSR) {
195
196
  method = window.location.pathname;
196
197
  }
197
198
  if (method.indexOf('://') === -1) {
@@ -236,7 +237,21 @@ var HttpComponent = /** @class */ (function () {
236
237
  };
237
238
  HttpComponent.prototype._send = function (method, config, options) {
238
239
  var _this = this;
240
+ var _a;
239
241
  var axiosConfig = __assign(__assign({}, config), { url: this.getUrl(method) });
242
+ // Manual send cookies for preload data in ssr
243
+ if (process.env.IS_SSR && axiosConfig.url.indexOf(this.apiUrl) !== -1) {
244
+ var clientStorage = this._components.clientStorage;
245
+ axiosConfig.headers = __assign(__assign({}, axiosConfig.headers), { Cookie: Object
246
+ .entries(clientStorage.get(null, clientStorage.STORAGE_COOKIE) || {})
247
+ .map(function (_a) {
248
+ var key = _a[0], value = _a[1];
249
+ return key + "=" + value;
250
+ })
251
+ .concat([(_a = axiosConfig.headers) === null || _a === void 0 ? void 0 : _a.Cookie])
252
+ .filter(Boolean)
253
+ .join(';') });
254
+ }
240
255
  if (options.cancelToken) {
241
256
  axiosConfig.cancelToken = options.cancelToken;
242
257
  }
@@ -258,25 +273,27 @@ var HttpComponent = /** @class */ (function () {
258
273
  };
259
274
  HttpComponent.prototype._sendAxios = function (config, options) {
260
275
  var _this = this;
261
- var promise = this.getAxiosInstance()
276
+ return this.getAxiosInstance()
262
277
  .then(function (instance) { return instance(config); })
263
278
  .then(function (response) { return _this.afterRequest(response, config, options).then(function (newResponse) { return newResponse || response; }); })["catch"](function (error) {
264
279
  console.error('Error, request/response: ', config, String(error)); // eslint-disable-line no-console
265
280
  throw error;
266
281
  });
267
- // Store promises for SSR
268
- if (process.env.IS_SSR) {
269
- this._promises.push(promise);
270
- }
271
- return promise;
272
282
  };
273
283
  HttpComponent.prototype.afterRequest = function (response, config, options) {
274
284
  return __awaiter(this, void 0, void 0, function () {
275
- var store, match, providerName;
276
- return __generator(this, function (_a) {
277
- switch (_a.label) {
285
+ var _a, store, clientStorage, cookie, match, providerName;
286
+ return __generator(this, function (_b) {
287
+ switch (_b.label) {
278
288
  case 0:
279
- store = this._components.store;
289
+ _a = this._components, store = _a.store, clientStorage = _a.clientStorage;
290
+ cookie = response.headers['set-cookie'];
291
+ if (process.env.IS_SSR && config.url.indexOf(this.apiUrl) !== -1 && !isEmpty_1["default"](cookie)) {
292
+ set_cookie_parser_1["default"].parse(cookie).forEach(function (_a) {
293
+ var name = _a.name, value = _a.value, expires = _a.expires;
294
+ return (clientStorage.set(name, value, clientStorage.STORAGE_COOKIE, expires));
295
+ });
296
+ }
280
297
  // Flash
281
298
  if (response.data.flashes) {
282
299
  store.dispatch(notifications_1.setFlashes(response.data.flashes));
@@ -301,14 +318,14 @@ var HttpComponent = /** @class */ (function () {
301
318
  if (!options.onTwoFactor) return [3 /*break*/, 2];
302
319
  return [4 /*yield*/, options.onTwoFactor(providerName)];
303
320
  case 1:
304
- _a.sent();
321
+ _b.sent();
305
322
  return [3 /*break*/, 4];
306
323
  case 2:
307
324
  // Require verification code
308
325
  return [4 /*yield*/, this._onTwoFactor(providerName)];
309
326
  case 3:
310
327
  // Require verification code
311
- _a.sent();
328
+ _b.sent();
312
329
  // Retry request
313
330
  return [2 /*return*/, this._sendAxios(config, options)];
314
331
  case 4: return [2 /*return*/, response];
@@ -73,11 +73,11 @@ var LocaleComponent = /** @class */ (function () {
73
73
  LocaleComponent.prototype.moment = function (date, format) {
74
74
  if (date === void 0) { date = undefined; }
75
75
  if (format === void 0) { format = undefined; }
76
- if (this.backendTimeZone &&
77
- date &&
78
- date.length === 19 &&
79
- moment_1["default"](date, 'YYYY-MM-DD HH:mm:ss').isValid()) {
80
- date = date + this.backendTimeZone;
76
+ if (this.backendTimeZone
77
+ && date
78
+ && date.length === 19
79
+ && moment_1["default"](date, 'YYYY-MM-DD HH:mm:ss').isValid()) {
80
+ date += this.backendTimeZone;
81
81
  }
82
82
  return moment_1["default"](date, format).locale(this.language);
83
83
  };
@@ -126,7 +126,7 @@ var LocaleComponent = /** @class */ (function () {
126
126
  if (a.index < b.index) {
127
127
  return -1;
128
128
  }
129
- else if (a.index > b.index) {
129
+ if (a.index > b.index) {
130
130
  return 1;
131
131
  }
132
132
  return 0;
@@ -136,9 +136,9 @@ var LocaleComponent = /** @class */ (function () {
136
136
  var textParts = message.split('!!component!!');
137
137
  for (var i = 0, j = 0; i < textParts.length; i++) {
138
138
  var isComponentAdded = false;
139
- if (j === 0 &&
140
- j < indexedComponents.length &&
141
- indexedComponents[j].index === 0) {
139
+ if (j === 0
140
+ && j < indexedComponents.length
141
+ && indexedComponents[j].index === 0) {
142
142
  result.push(React.createElement("span", { key: "element-" + j }, indexedComponents[j].component));
143
143
  isComponentAdded = true;
144
144
  j++;
@@ -15,7 +15,9 @@ var MetricsComponent = /** @class */ (function () {
15
15
  this._enable = config.enable === undefined
16
16
  ? process.env.APP_ENV === 'prod'
17
17
  : !!config.enable;
18
- this._init();
18
+ if (!process.env.IS_SSR) {
19
+ this._init();
20
+ }
19
21
  }
20
22
  MetricsComponent.prototype._init = function () {
21
23
  var _this = this;
@@ -1,3 +1,9 @@
1
+ declare global {
2
+ interface Window {
3
+ APP_REDUX_PRELOAD_STATES?: any;
4
+ __REDUX_DEVTOOLS_EXTENSION__?: any;
5
+ }
6
+ }
1
7
  interface IStoreComponentConfig {
2
8
  initialState: any;
3
9
  history: any;
@@ -37,7 +37,7 @@ var StoreComponent = /** @class */ (function () {
37
37
  this.dispatch = this.dispatch.bind(this);
38
38
  this.subscribe = this.subscribe.bind(this);
39
39
  if (!lazyInit) {
40
- this.initStore();
40
+ this.initStore(config);
41
41
  }
42
42
  }
43
43
  StoreComponent.prototype.init = function (config) {
@@ -49,8 +49,10 @@ var StoreComponent = /** @class */ (function () {
49
49
  var _this = this;
50
50
  if (config === void 0) { config = {}; }
51
51
  var initialState = __assign(__assign({}, (process.env.IS_WEB
52
- // @ts-ignore
53
52
  ? merge_1["default"].apply(void 0, (window.APP_REDUX_PRELOAD_STATES || [{}])) : {})), config.initialState);
53
+ if (window === null || window === void 0 ? void 0 : window.APP_REDUX_PRELOAD_STATES) {
54
+ delete window.APP_REDUX_PRELOAD_STATES;
55
+ }
54
56
  if (process.env.PLATFORM !== 'mobile') {
55
57
  var createHistory = process.env.IS_SSR || typeof location === 'undefined'
56
58
  ? history_1.createMemoryHistory
@@ -59,7 +61,7 @@ var StoreComponent = /** @class */ (function () {
59
61
  : history_1.createBrowserHistory;
60
62
  this.history = createHistory(__assign(__assign({}, get_1["default"](initialState, 'config.store.history', {})), config.history));
61
63
  // Add '?' for fix connected-react-router
62
- if (process.env.IS_SSR && !this.history.location.search && process.env.PLATFORM !== 'mobile') {
64
+ if (process.env.IS_SSR && !this.history.location.search) {
63
65
  this.history.location.search = '?';
64
66
  }
65
67
  this._routerReducer = connected_react_router_1.connectRouter(this.history);
@@ -70,10 +72,7 @@ var StoreComponent = /** @class */ (function () {
70
72
  } : {}), initialState, redux_1.compose(redux_1.applyMiddleware(function (_a) {
71
73
  var getState = _a.getState;
72
74
  return function (next) { return function (action) { return _this._prepare(action, next, getState); }; };
73
- }), redux_1.applyMiddleware(connected_react_router_1.routerMiddleware(this.history)),
74
- // @ts-ignore
75
- !process.env.IS_SSR && window.__REDUX_DEVTOOLS_EXTENSION__ && process.env.PLATFORM !== 'mobile'
76
- // @ts-ignore
75
+ }), redux_1.applyMiddleware(connected_react_router_1.routerMiddleware(this.history)), !process.env.IS_SSR && window.__REDUX_DEVTOOLS_EXTENSION__ && process.env.PLATFORM !== 'mobile'
77
76
  ? window.__REDUX_DEVTOOLS_EXTENSION__()
78
77
  : function (f) { return f; }));
79
78
  }
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { IComponents } from '../hooks/useComponents';
2
+ import { IComponents } from '../providers/ComponentsProvider';
3
3
  /**
4
4
  * Ui Component
5
5
  * Компонент для подгрузки и конфигурации UI компонентов приложения
@@ -3,7 +3,7 @@
3
3
  * Компонент, обеспечивающий постоянное web-socket соединение с сервером. Поддерживает подписку на каналы, обработку
4
4
  * ответов и токен авторизации
5
5
  */
6
- import { IComponents } from '../hooks/useComponents';
6
+ import { IComponents } from '../providers/ComponentsProvider';
7
7
  export default class WebSocketComponent {
8
8
  wsUrl: string;
9
9
  streams: string[] | [string, string | number[]][];
@@ -1,4 +1,4 @@
1
- import { IComponents } from '../hooks/useComponents';
1
+ import { IComponents } from '../providers/ComponentsProvider';
2
2
  export interface IComponentsHocOutput extends IComponents {
3
3
  components?: IComponents;
4
4
  }
package/hoc/components.js CHANGED
@@ -36,7 +36,7 @@ var exportComponents = function (components, names) {
36
36
  var props = {};
37
37
  names.forEach(function (items) {
38
38
  [].concat(items).forEach(function (name) {
39
- props[name] = window.SteroidsComponents[name];
39
+ props[name] = components[name];
40
40
  });
41
41
  });
42
42
  return props;
package/hoc/file.d.ts CHANGED
@@ -18,6 +18,7 @@ export interface IFileHocOutput {
18
18
  files?: any[];
19
19
  onBrowse?: any;
20
20
  onRemove?: any;
21
+ onAdd?: any;
21
22
  }
22
23
  declare const _default: () => any;
23
24
  export default _default;
package/hooks/index.d.ts CHANGED
@@ -4,4 +4,5 @@ import useDataProvider from './useDataProvider';
4
4
  import useDataSelect from './useDataSelect';
5
5
  import useSelector from './useSelector';
6
6
  import useForm from './useForm';
7
- export { useBem, useComponents, useDataProvider, useDataSelect, useSelector, useForm, };
7
+ import useSsr from './useSsr';
8
+ export { useBem, useComponents, useDataProvider, useDataSelect, useSelector, useForm, useSsr, };
package/hooks/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  exports.__esModule = true;
6
- exports.useForm = exports.useSelector = exports.useDataSelect = exports.useDataProvider = exports.useComponents = exports.useBem = void 0;
6
+ exports.useSsr = exports.useForm = exports.useSelector = exports.useDataSelect = exports.useDataProvider = exports.useComponents = exports.useBem = void 0;
7
7
  var useBem_1 = __importDefault(require("./useBem"));
8
8
  exports.useBem = useBem_1["default"];
9
9
  var useComponents_1 = __importDefault(require("./useComponents"));
@@ -16,3 +16,5 @@ var useSelector_1 = __importDefault(require("./useSelector"));
16
16
  exports.useSelector = useSelector_1["default"];
17
17
  var useForm_1 = __importDefault(require("./useForm"));
18
18
  exports.useForm = useForm_1["default"];
19
+ var useSsr_1 = __importDefault(require("./useSsr"));
20
+ exports.useSsr = useSsr_1["default"];
@@ -10,6 +10,11 @@ interface IStyleObj {
10
10
  */
11
11
  declare type Position = 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'left' | 'leftTop' | 'leftBottom' | 'right' | 'rightTop' | 'rightBottom' | string;
12
12
  export interface IAbsolutePositioningInputProps {
13
+ /**
14
+ * Включает "умное" позиционирование - если компонент не может быть помещен в промежуток между целевым компонентом
15
+ * и краем viewport, тогда он будет показан в противоположном направлении от заданного в свойстве position.
16
+ */
17
+ autoPositioning?: boolean;
13
18
  /**
14
19
  * Дочерние элементы
15
20
  */
@@ -12,11 +12,11 @@ function useAbsolutePositioning(props) {
12
12
  }), style = _d[0], setStyle = _d[1];
13
13
  var timerRef = react_1.useRef(null);
14
14
  var calculateAbsolutePosition = react_1.useCallback(function (newPosition, childRef, componentSize) {
15
- if (newPosition === void 0) { newPosition = 'pos'; }
16
15
  var newStyle = { left: null, right: null, top: null };
17
16
  var _a = childRef.getBoundingClientRect(), top = _a.top, right = _a.right, left = _a.left, width = _a.width, height = _a.height;
18
17
  var parentDimensions = { top: top, right: right, left: left, width: width, height: height };
19
18
  parentDimensions.top += window.scrollY;
19
+ var useAutoPositioning = props.autoPositioning;
20
20
  // eslint-disable-next-line default-case
21
21
  switch (newPosition) {
22
22
  case 'top':
@@ -24,7 +24,7 @@ function useAbsolutePositioning(props) {
24
24
  case 'topRight':
25
25
  // Проверка - выходит ли tooltip за верхний край страницы?
26
26
  // Если да - меняем позицию на bottom
27
- if ((parentDimensions.top - window.scrollY) <= Math.round(componentSize.height + props.gap)) {
27
+ if (useAutoPositioning && ((parentDimensions.top - window.scrollY) <= Math.round(componentSize.height + props.gap))) {
28
28
  newStyle.top = parentDimensions.top + parentDimensions.height;
29
29
  newPosition = newPosition.replace('top', 'bottom');
30
30
  }
@@ -35,9 +35,9 @@ function useAbsolutePositioning(props) {
35
35
  case 'bottom':
36
36
  case 'bottomLeft':
37
37
  case 'bottomRight':
38
- /// Проверка - выходит ли tooltip за нижний край страницы?
38
+ // Проверка - выходит ли tooltip за нижний край страницы?
39
39
  // Если да - меняем позицию на top
40
- if ((window.innerHeight - (parentDimensions.top + parentDimensions.height - window.scrollY))
40
+ if (useAutoPositioning && ((window.innerHeight - (parentDimensions.top + parentDimensions.height - window.scrollY)))
41
41
  <= Math.round(componentSize.height + props.gap)) {
42
42
  newStyle.top = parentDimensions.top - componentSize.height;
43
43
  newPosition = newPosition.replace('bottom', 'top');
@@ -51,7 +51,7 @@ function useAbsolutePositioning(props) {
51
51
  case 'leftBottom':
52
52
  // Проверка - выходит ли tooltip за левый край страницы?
53
53
  // Если да - меняем позицию на right
54
- if (parentDimensions.left <= Math.round(componentSize.width + props.gap)) {
54
+ if (useAutoPositioning && (parentDimensions.left <= Math.round(componentSize.width + props.gap))) {
55
55
  newStyle.left = parentDimensions.right;
56
56
  newPosition = newPosition.replace('left', 'right');
57
57
  }
@@ -64,7 +64,7 @@ function useAbsolutePositioning(props) {
64
64
  case 'rightBottom':
65
65
  // Проверка - выходит ли tooltip за правый край страницы?
66
66
  // Если да - меняем позицию на left
67
- if (document.body.clientWidth - parentDimensions.right <= Math.round(componentSize.width + props.gap)) {
67
+ if (useAutoPositioning && (document.body.clientWidth - parentDimensions.right <= Math.round(componentSize.width + props.gap))) {
68
68
  newStyle.left = parentDimensions.left - componentSize.width;
69
69
  newPosition = newPosition.replace('right', 'left');
70
70
  }
@@ -1,29 +1,13 @@
1
- import * as React from 'react';
2
- import { PropsWithChildren } from 'react';
3
- import { IComponents } from './useComponents';
1
+ /// <reference types="react" />
2
+ import ClientStorageComponent from '../components/ClientStorageComponent';
3
+ import HtmlComponent from '../components/HtmlComponent';
4
+ import StoreComponent from '../components/StoreComponent';
5
+ import UiComponent from '../components/UiComponent';
6
+ import MetaComponent from '../components/MetaComponent';
7
+ import { IComponents } from '../providers/ComponentsProvider';
4
8
  import { IRouteItem } from '../ui/nav/Router/Router';
5
- export interface IScreen {
6
- width: number;
7
- media: Record<string, any>;
8
- setMedia: any;
9
- isPhone: () => boolean;
10
- isTablet: () => boolean;
11
- isDesktop: () => boolean;
12
- getDeviceType: () => string;
13
- }
14
- export declare const ScreenContext: React.Context<IScreen>;
15
- export interface IScreenProviderProps extends PropsWithChildren<any> {
16
- media?: Record<string, any>;
17
- skipTimeout?: boolean;
18
- }
19
- export declare const SCREEN_PHONE = "phone";
20
- export declare const SCREEN_TABLET = "tablet";
21
- export declare const SCREEN_DESKTOP = "desktop";
22
- declare global {
23
- interface Window {
24
- SteroidsComponents: IComponents;
25
- }
26
- }
9
+ import MetricsComponent from '../components/MetricsComponent';
10
+ import { IScreenProviderProps } from '../providers/ScreenProvider';
27
11
  /**
28
12
  * Application HOC
29
13
  * Обертка над корневым компонентом приложения, используется только в `Application.tsx`. Добавляет через React Context
@@ -48,5 +32,24 @@ export interface IApplicationHookResult {
48
32
  renderApplication: (children?: any) => JSX.Element;
49
33
  components: IComponents;
50
34
  }
51
- export declare const ComponentsContext: React.Context<IComponents>;
35
+ export declare const defaultComponents: {
36
+ clientStorage: {
37
+ className: typeof ClientStorageComponent;
38
+ };
39
+ html: {
40
+ className: typeof HtmlComponent;
41
+ };
42
+ meta: {
43
+ className: typeof MetaComponent;
44
+ };
45
+ store: {
46
+ className: typeof StoreComponent;
47
+ };
48
+ ui: {
49
+ className: typeof UiComponent;
50
+ };
51
+ metrics: {
52
+ className: typeof MetricsComponent;
53
+ };
54
+ };
52
55
  export default function useApplication(config?: IApplicationHookConfig): IApplicationHookResult;