@steroidsjs/core 3.0.0-beta.111 → 3.0.0-beta.113

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 (35) hide show
  1. package/actions/router.js +19 -2
  2. package/docs-autogen-result.json +1489 -336
  3. package/en.json +13 -1
  4. package/hooks/index.d.ts +3 -3
  5. package/hooks/index.js +5 -5
  6. package/hooks/useTree.d.ts +5 -0
  7. package/hooks/useTree.js +3 -2
  8. package/package.json +1 -1
  9. package/ui/content/CalendarSystem/CalendarSystem.d.ts +27 -16
  10. package/ui/content/CalendarSystem/CalendarSystem.js +65 -76
  11. package/ui/content/CalendarSystem/hooks/useCalendarControls.d.ts +1 -2
  12. package/ui/content/CalendarSystem/hooks/useCalendarControls.js +14 -17
  13. package/ui/content/CalendarSystem/hooks/useCalendarSystemEventGroupModals.js +3 -3
  14. package/ui/content/CalendarSystem/hooks/useCalendarSystemModals.js +2 -2
  15. package/ui/content/CalendarSystem/hooks/useCalendarType.d.ts +5 -0
  16. package/ui/content/CalendarSystem/hooks/useCalendarType.js +22 -0
  17. package/ui/content/CalendarSystem/hooks/useEventsFromDate.d.ts +5 -0
  18. package/ui/content/CalendarSystem/hooks/useEventsFromDate.js +49 -0
  19. package/ui/content/CalendarSystem/hooks/{useMonthCalendar.d.ts → useMonthGrid.d.ts} +4 -5
  20. package/ui/content/CalendarSystem/hooks/{useMonthCalendar.js → useMonthGrid.js} +20 -14
  21. package/ui/content/CalendarSystem/hooks/{useWeekCalendar.d.ts → useWeekGrid.d.ts} +6 -5
  22. package/ui/content/CalendarSystem/hooks/useWeekGrid.js +72 -0
  23. package/ui/content/CalendarSystem/utils/utils.d.ts +8 -0
  24. package/ui/content/CalendarSystem/utils/utils.js +27 -1
  25. package/ui/form/CheckboxTreeField/CheckboxTreeField.d.ts +2 -3
  26. package/ui/form/CheckboxTreeField/CheckboxTreeField.js +1 -1
  27. package/ui/list/TreeTable/TreeTable.d.ts +5 -4
  28. package/ui/list/TreeTable/TreeTable.js +3 -3
  29. package/ui/nav/Router/Router.d.ts +6 -0
  30. package/ui/nav/Router/Router.js +4 -3
  31. package/ui/nav/Router/helpers.d.ts +2 -2
  32. package/ui/nav/Router/helpers.js +41 -7
  33. package/ui/nav/Tree/Tree.d.ts +13 -2
  34. package/ui/nav/Tree/Tree.js +5 -2
  35. package/ui/content/CalendarSystem/hooks/useWeekCalendar.js +0 -86
@@ -1,15 +1,16 @@
1
1
  import DateControlEnum from '../enums/DateControlType';
2
- declare const useWeekCalendar: (currentMonthDate: Date) => {
3
- currentWeek: {
2
+ declare const useWeekGrid: (currentMonthFirstDayDate: Date) => {
3
+ weekGridTwentyFourHoursArray: any[];
4
+ weekGridCurrentWeekDays: {
4
5
  dayNumber: number;
5
6
  date: Date;
6
7
  outOfRange?: boolean;
7
8
  isToday?: boolean;
8
9
  formattedDisplay?: string;
9
10
  }[];
10
- weekControls: {
11
+ weekGridControls: {
11
12
  [key: string]: () => void | DateControlEnum;
12
13
  };
13
- forceUpdateWeekOnMonthChange: (newMonthDate: Date) => void;
14
+ updateWeekOnMonthChange: (newMonthDate: Date) => void;
14
15
  };
15
- export default useWeekCalendar;
16
+ export default useWeekGrid;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ exports.__esModule = true;
6
+ /* eslint-disable no-plusplus */
7
+ var react_1 = __importDefault(require("react"));
8
+ var dayjs_1 = __importDefault(require("dayjs"));
9
+ var DateControlType_1 = __importDefault(require("../enums/DateControlType"));
10
+ var utils_1 = require("../utils/utils");
11
+ var ONE_DAY = 1;
12
+ var getTwentyFourHoursArray = function () {
13
+ var hoursArray = [];
14
+ for (var i = 0; i < 24; i++) {
15
+ var formattedHour = (0, dayjs_1["default"])().startOf('day').add(i, 'hour').format('HH:00');
16
+ hoursArray.push(formattedHour);
17
+ }
18
+ return hoursArray;
19
+ };
20
+ var useWeekGrid = function (currentMonthFirstDayDate) {
21
+ var _a;
22
+ var _b = react_1["default"].useState((0, utils_1.getFormattedWeekFromDate)()), currentWeek = _b[0], setCurrentWeek = _b[1];
23
+ var updateWeekOnMonthChange = react_1["default"].useCallback(function (newMonthDate) {
24
+ setCurrentWeek((0, utils_1.getFormattedWeekFromDate)(newMonthDate));
25
+ }, []);
26
+ var changeMonthAfterWeekChanged = react_1["default"].useCallback(function (formattedWeek) {
27
+ var firstDayOfWeek = formattedWeek[0].date;
28
+ var currentMonthNumber = currentMonthFirstDayDate.getMonth();
29
+ var isWeekOutOfMonth = formattedWeek.every(function (dayOfWeek) { return dayOfWeek.date.getMonth() !== currentMonthNumber; });
30
+ if (!isWeekOutOfMonth) {
31
+ return;
32
+ }
33
+ if (currentMonthNumber - firstDayOfWeek.getMonth() === 1) {
34
+ var lastDayOfWeekInNewMonth = formattedWeek[formattedWeek.length - 1].date;
35
+ var prevMonthControl = (0, utils_1.getSourceCalendarControl)(DateControlType_1["default"].PREV_ONE);
36
+ prevMonthControl.click();
37
+ updateWeekOnMonthChange(lastDayOfWeekInNewMonth);
38
+ }
39
+ else {
40
+ var firstDayOfWeekInNewMonth = formattedWeek[0].date;
41
+ var nextMonthControl = (0, utils_1.getSourceCalendarControl)(DateControlType_1["default"].NEXT_ONE);
42
+ nextMonthControl.click();
43
+ updateWeekOnMonthChange(firstDayOfWeekInNewMonth);
44
+ }
45
+ }, [currentMonthFirstDayDate, updateWeekOnMonthChange]);
46
+ var setNextWeek = react_1["default"].useCallback(function () {
47
+ var lastDayOfWeek = currentWeek[currentWeek.length - 1].date;
48
+ lastDayOfWeek.setDate(lastDayOfWeek.getDate() + ONE_DAY);
49
+ var formattedNextWeek = (0, utils_1.getFormattedWeekFromDate)(lastDayOfWeek);
50
+ setCurrentWeek(formattedNextWeek);
51
+ changeMonthAfterWeekChanged(formattedNextWeek);
52
+ }, [currentWeek, changeMonthAfterWeekChanged]);
53
+ var setPrevWeek = react_1["default"].useCallback(function () {
54
+ var firstDayOfWeek = currentWeek[0].date;
55
+ firstDayOfWeek.setDate(firstDayOfWeek.getDate() - ONE_DAY);
56
+ var formattedPrevWeek = (0, utils_1.getFormattedWeekFromDate)(firstDayOfWeek);
57
+ setCurrentWeek(formattedPrevWeek);
58
+ changeMonthAfterWeekChanged(formattedPrevWeek);
59
+ }, [currentWeek, changeMonthAfterWeekChanged]);
60
+ return {
61
+ weekGridTwentyFourHoursArray: getTwentyFourHoursArray(),
62
+ weekGridCurrentWeekDays: currentWeek,
63
+ weekGridControls: (_a = {},
64
+ _a[DateControlType_1["default"].NEXT_DOUBLE] = DateControlType_1["default"].NEXT_ONE,
65
+ _a[DateControlType_1["default"].NEXT_ONE] = setNextWeek,
66
+ _a[DateControlType_1["default"].PREV_ONE] = setPrevWeek,
67
+ _a[DateControlType_1["default"].PREV_DOUBLE] = DateControlType_1["default"].PREV_ONE,
68
+ _a),
69
+ updateWeekOnMonthChange: updateWeekOnMonthChange
70
+ };
71
+ };
72
+ exports["default"] = useWeekGrid;
@@ -3,3 +3,11 @@ export declare const getWeekDaysFromDate: (date: Date) => IDay[];
3
3
  export declare const isDateIsToday: (date: Date) => boolean;
4
4
  export declare const getOmittedEvent: (event: IEvent | Omit<IEvent, 'color'>) => any;
5
5
  export declare const sortEventsInGroup: (group: IEventGroup) => Omit<IEvent, "color">[];
6
+ export declare const getSourceCalendarControl: (control: string) => HTMLElement;
7
+ export declare const getFormattedWeekFromDate: (fromDate?: Date) => {
8
+ dayNumber: number;
9
+ date: Date;
10
+ outOfRange?: boolean;
11
+ isToday?: boolean;
12
+ formattedDisplay?: string;
13
+ }[];
@@ -1,14 +1,27 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
15
  };
5
16
  exports.__esModule = true;
6
- exports.sortEventsInGroup = exports.getOmittedEvent = exports.isDateIsToday = exports.getWeekDaysFromDate = void 0;
17
+ exports.getFormattedWeekFromDate = exports.getSourceCalendarControl = exports.sortEventsInGroup = exports.getOmittedEvent = exports.isDateIsToday = exports.getWeekDaysFromDate = void 0;
7
18
  /* eslint-disable no-plusplus */
8
19
  var dayjs_1 = __importDefault(require("dayjs"));
9
20
  var omit_1 = __importDefault(require("lodash-es/omit"));
21
+ var calendar_1 = require("../../../../utils/calendar");
10
22
  var SIX_DAYS_DIFF = 6;
11
23
  var MAX_DAYS_DIFF_IN_WEEK = 7;
24
+ var WEEK_DAY_FORMAT = 'dd, D MMM';
12
25
  var getWeekDaysFromDate = function (date) {
13
26
  var weekDays = [];
14
27
  var firstDayOfWeek = new Date(date);
@@ -32,3 +45,16 @@ var getOmittedEvent = function (event) { return (0, omit_1["default"])(event, ['
32
45
  exports.getOmittedEvent = getOmittedEvent;
33
46
  var sortEventsInGroup = function (group) { return group.events.sort(function (eventA, eventB) { return eventA.date.getTime() - eventB.date.getTime(); }); };
34
47
  exports.sortEventsInGroup = sortEventsInGroup;
48
+ var getSourceCalendarControl = function (control) { return document.querySelector("[data-sourcecontrol=\"".concat(control, "\"]")); };
49
+ exports.getSourceCalendarControl = getSourceCalendarControl;
50
+ var getFormattedWeekFromDate = function (fromDate) {
51
+ if (fromDate === void 0) { fromDate = null; }
52
+ var currentWeek = (0, exports.getWeekDaysFromDate)(fromDate || new Date());
53
+ return currentWeek.map(function (dayOfWeek) {
54
+ var copyOfDayWeek = __assign({}, dayOfWeek);
55
+ copyOfDayWeek.formattedDisplay = (0, calendar_1.convertDate)(dayOfWeek.date, null, WEEK_DAY_FORMAT);
56
+ copyOfDayWeek.isToday = (0, exports.isDateIsToday)(copyOfDayWeek.date);
57
+ return copyOfDayWeek;
58
+ });
59
+ };
60
+ exports.getFormattedWeekFromDate = getFormattedWeekFromDate;
@@ -19,7 +19,7 @@ type CheckboxTreeItems = string | ({
19
19
  *
20
20
  * Список с вложенными чекбоксами. Используется в формах для создания иерархической структуры и выбора нескольких значений.
21
21
  */
22
- export interface ICheckboxTreeFieldProps extends IFieldWrapperInputProps, Omit<IDataProviderConfig, 'items'>, Omit<IDataSelectConfig, 'items'>, IUiComponent, Pick<ITreeProps, 'levelPadding' | 'alwaysOpened'> {
22
+ export interface ICheckboxTreeFieldProps extends IFieldWrapperInputProps, Omit<IDataProviderConfig, 'items'>, Omit<IDataSelectConfig, 'items'>, IUiComponent, Pick<ITreeProps, 'levelPadding' | 'alwaysOpened' | 'hasIcon' | 'customIcon'> {
23
23
  /**
24
24
  * Свойства для элемента input
25
25
  * @example { onKeyDown: ... }
@@ -48,7 +48,7 @@ export interface ICheckboxTreeFieldProps extends IFieldWrapperInputProps, Omit<I
48
48
  primaryKey?: string;
49
49
  [key: string]: any;
50
50
  }
51
- export interface ICheckboxTreeFieldViewProps extends IFieldWrapperOutputProps {
51
+ export interface ICheckboxTreeFieldViewProps extends IFieldWrapperOutputProps, Pick<ITreeProps, 'levelPadding' | 'customIcon'> {
52
52
  items: {
53
53
  id: number | string | boolean;
54
54
  label?: string;
@@ -61,7 +61,6 @@ export interface ICheckboxTreeFieldViewProps extends IFieldWrapperOutputProps {
61
61
  onItemSelect: (checkbox: IPreparedTreeItem) => void;
62
62
  renderCheckbox: (checkboxProps: ICheckboxFieldViewProps) => JSX.Element;
63
63
  size?: Size;
64
- levelPadding: number;
65
64
  }
66
65
  export declare const getNestedItemsIds: (item: any, groupAttribute: any) => any[];
67
66
  declare const _default: import("../../../ui/form/Field/fieldWrapper").FieldWrapperComponent<ICheckboxTreeFieldProps>;
@@ -114,7 +114,7 @@ function CheckboxTreeField(props) {
114
114
  }, [onReset, prevInputValue, props.input.value, selectedIds.length]);
115
115
  var CheckboxFieldView = components.ui.getView('form.CheckboxFieldView');
116
116
  var renderCheckbox = function (checkboxProps) { return (React.createElement(CheckboxFieldView, __assign({}, checkboxProps))); };
117
- return components.ui.renderView(props.view || 'form.CheckboxTreeFieldView', __assign(__assign({}, props), { items: treeItems, onItemSelect: onItemSelect, selectedIds: selectedIds, levelPadding: props.levelPadding, renderCheckbox: renderCheckbox }));
117
+ return components.ui.renderView(props.view || 'form.CheckboxTreeFieldView', __assign(__assign({}, props), { items: treeItems, onItemSelect: onItemSelect, selectedIds: selectedIds, renderCheckbox: renderCheckbox }));
118
118
  }
119
119
  CheckboxTreeField.defaultProps = {
120
120
  disabled: false,
@@ -1,8 +1,8 @@
1
- /// <reference types="react" />
1
+ import * as React from 'react';
2
2
  import { ITreeProps } from '@steroidsjs/core/ui/nav/Tree/Tree';
3
3
  import { IPreparedTreeItem, ITreeItem } from '../../../hooks/useTree';
4
4
  import { IColumnViewProps, IGridColumn, IGridProps } from '../Grid/Grid';
5
- export interface ITreeColumnViewProps extends IColumnViewProps, Pick<ITreeTableProps, 'levelPadding'> {
5
+ export interface ITreeColumnViewProps extends IColumnViewProps, Pick<ITreeTableProps, 'levelPadding' | 'customIcon'> {
6
6
  item: IPreparedTreeItem;
7
7
  }
8
8
  /**
@@ -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'> {
13
+ export interface ITreeTableProps extends Omit<IGridProps, 'items'>, Pick<ITreeProps, 'alwaysOpened' | 'levelPadding' | 'customIcon'> {
14
14
  /**
15
15
  * Элементы коллекции
16
16
  * @example
@@ -27,8 +27,9 @@ export interface ITreeTableProps extends Omit<IGridProps, 'items'>, Pick<ITreePr
27
27
  * ]
28
28
  */
29
29
  items?: ITreeItem[];
30
+ customIcon?: string | React.ReactElement;
30
31
  }
31
- export declare const addTreeColumnFieldsToFirstColumn: (columns: IGridColumn[], levelPadding: string | number) => IGridColumn[];
32
+ export declare const addTreeColumnFieldsToFirstColumn: (columns: IGridColumn[], levelPadding: string | number, customIcon?: string | React.ReactElement) => IGridColumn[];
32
33
  declare function TreeTable(props: ITreeTableProps): JSX.Element;
33
34
  declare namespace TreeTable {
34
35
  var defaultProps: {
@@ -58,15 +58,15 @@ var TREE_COLUMN_VIEW_FIELDS = {
58
58
  valueView: 'TreeColumnView',
59
59
  headerClassName: 'TreeColumnHeader'
60
60
  };
61
- var addTreeColumnFieldsToFirstColumn = function (columns, levelPadding) {
61
+ var addTreeColumnFieldsToFirstColumn = function (columns, levelPadding, customIcon) {
62
62
  var newColumns = __spreadArray([], columns, true);
63
63
  // Add tree view to the first column
64
- (0, merge_1["default"])(newColumns[0], __assign(__assign({}, TREE_COLUMN_VIEW_FIELDS), { levelPadding: levelPadding }));
64
+ (0, merge_1["default"])(newColumns[0], __assign(__assign({}, TREE_COLUMN_VIEW_FIELDS), { levelPadding: levelPadding, customIcon: customIcon }));
65
65
  return newColumns;
66
66
  };
67
67
  exports.addTreeColumnFieldsToFirstColumn = addTreeColumnFieldsToFirstColumn;
68
68
  function TreeTable(props) {
69
- var columns = (0, react_1.useMemo)(function () { return (0, exports.addTreeColumnFieldsToFirstColumn)(props.columns, props.levelPadding); }, [props.columns, props.levelPadding]);
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
70
  var list = (0, useSelector_1["default"])(function (state) { return (0, list_1.getList)(state, props.listId); });
71
71
  var treeItems = (0, useTree_1["default"])({
72
72
  items: props.items,
@@ -137,11 +137,17 @@ export interface IRouterProps {
137
137
  * @example SomeComponent
138
138
  */
139
139
  children?: React.ReactNode;
140
+ /**
141
+ * Флаг, который позволяет использовать вложенные роуты c указанием вложенного пути
142
+ * @example true
143
+ */
144
+ alwaysAppendParentRoutePath?: boolean;
140
145
  }
141
146
  declare function Router(props: IRouterProps): JSX.Element;
142
147
  declare namespace Router {
143
148
  var defaultProps: {
144
149
  autoScrollTop: boolean;
150
+ alwaysAppendParentRoutePath: boolean;
145
151
  };
146
152
  }
147
153
  export default Router;
@@ -97,7 +97,7 @@ function Router(props) {
97
97
  var dispatch = (0, useDispatch_1["default"])();
98
98
  (0, react_use_1.useEffectOnce)(function () {
99
99
  if (props.routes) {
100
- dispatch((0, router_1.initRoutes)((0, helpers_1.walkRoutesRecursive)(__assign({ id: 'root' }, props.routes), props.defaultRoles ? { roles: props.defaultRoles } : undefined)));
100
+ dispatch((0, router_1.initRoutes)((0, helpers_1.walkRoutesRecursive)(__assign({ id: 'root' }, props.routes), props.defaultRoles ? { roles: props.defaultRoles } : undefined, {}, props.alwaysAppendParentRoutePath)));
101
101
  }
102
102
  });
103
103
  // Sync route params with redux
@@ -108,7 +108,7 @@ function Router(props) {
108
108
  }
109
109
  }, [dispatch, prevRouteParams, routeParams]);
110
110
  // Routes state
111
- var _b = (0, react_1.useState)((0, helpers_1.treeToList)(props.routes)), routes = _b[0], setRoutes = _b[1];
111
+ var _b = (0, react_1.useState)((0, helpers_1.treeToList)(props.routes, true, null, props.alwaysAppendParentRoutePath)), routes = _b[0], setRoutes = _b[1];
112
112
  (0, react_use_1.useUpdateEffect)(function () {
113
113
  setRoutes(props.routes);
114
114
  }, [props.routes]);
@@ -205,6 +205,7 @@ function Router(props) {
205
205
  return (React.createElement(connected_react_router_1.ConnectedRouter, { history: components.store.history }, renderContent()));
206
206
  }
207
207
  Router.defaultProps = {
208
- autoScrollTop: true
208
+ autoScrollTop: true,
209
+ alwaysAppendParentRoutePath: true
209
210
  };
210
211
  exports["default"] = Router;
@@ -1,4 +1,4 @@
1
1
  import { IRouteItem } from './Router';
2
2
  export declare const findRedirectPathRecursive: (route: IRouteItem) => any;
3
- export declare const walkRoutesRecursive: (item: IRouteItem | Record<string, any>, defaultItem?: any, parentItem?: any) => any;
4
- export declare const treeToList: (item: IRouteItem | Record<string, any>, isRoot?: boolean) => Record<string, any>;
3
+ export declare const walkRoutesRecursive: (item: IRouteItem | Record<string, any>, defaultItem?: any, parentItem?: any, alwaysAppendParentRoutePath?: boolean) => any;
4
+ export declare const treeToList: (item: IRouteItem | Record<string, any>, isRoot?: boolean, parentItem?: any, alwaysAppendParentRoutePath?: boolean) => Record<string, any>;
@@ -18,6 +18,7 @@ exports.treeToList = exports.walkRoutesRecursive = exports.findRedirectPathRecur
18
18
  var get_1 = __importDefault(require("lodash-es/get"));
19
19
  var isArray_1 = __importDefault(require("lodash-es/isArray"));
20
20
  var isObject_1 = __importDefault(require("lodash-es/isObject"));
21
+ var SLASH = '/';
21
22
  var findRedirectPathRecursive = function (route) {
22
23
  if (!route) {
23
24
  return null;
@@ -34,10 +35,36 @@ var findRedirectPathRecursive = function (route) {
34
35
  : null;
35
36
  };
36
37
  exports.findRedirectPathRecursive = findRedirectPathRecursive;
37
- var walkRoutesRecursive = function (item, defaultItem, parentItem) {
38
+ var addSlashIfNotPresent = function (path) {
39
+ if (path === void 0) { path = ''; }
40
+ return path.startsWith(SLASH) ? path : (SLASH + path);
41
+ };
42
+ var joinChildAndParentPaths = function (path, parentPath) {
43
+ if (path === void 0) { path = ''; }
44
+ if (parentPath === void 0) { parentPath = null; }
45
+ if (!parentPath || parentPath === SLASH) {
46
+ return addSlashIfNotPresent(path);
47
+ }
48
+ return addSlashIfNotPresent(parentPath) + addSlashIfNotPresent(path);
49
+ };
50
+ var appendChildIfNoSlash = function (path, parentPath) {
51
+ if (path === void 0) { path = ''; }
52
+ if (parentPath === void 0) { parentPath = null; }
53
+ if (parentPath === SLASH) {
54
+ return addSlashIfNotPresent(path);
55
+ }
56
+ if (!path.startsWith(SLASH)) {
57
+ return addSlashIfNotPresent(parentPath) + addSlashIfNotPresent(path);
58
+ }
59
+ return path;
60
+ };
61
+ var walkRoutesRecursive = function (item, defaultItem, parentItem, alwaysAppendParentRoutePath) {
38
62
  if (defaultItem === void 0) { defaultItem = {}; }
39
63
  if (parentItem === void 0) { parentItem = {}; }
40
- var normalizedItem = __assign(__assign(__assign({}, defaultItem), item), { id: item.id, exact: item.exact, path: item.path && (item.path.indexOf('/') !== 0 && parentItem.path ? parentItem.path + '/' : '') + item.path, label: item.label, title: item.title, isVisible: typeof item.isVisible !== 'undefined'
64
+ if (alwaysAppendParentRoutePath === void 0) { alwaysAppendParentRoutePath = true; }
65
+ var normalizedItem = __assign(__assign(__assign({}, defaultItem), item), { id: item.id, exact: item.exact, path: item.path && (alwaysAppendParentRoutePath
66
+ ? joinChildAndParentPaths(item.path, parentItem.path)
67
+ : appendChildIfNoSlash(item.path, parentItem.path)), label: item.label, title: item.title, isVisible: typeof item.isVisible !== 'undefined'
41
68
  ? item.isVisible
42
69
  : (typeof parentItem.isVisible !== 'undefined'
43
70
  ? parentItem.isVisible
@@ -48,32 +75,39 @@ var walkRoutesRecursive = function (item, defaultItem, parentItem) {
48
75
  : defaultItem.isNavVisible), layout: item.layout || parentItem.layout || defaultItem.layout || null, roles: item.roles || parentItem.roles || defaultItem.roles || null, component: null, componentProps: null });
49
76
  var items = null;
50
77
  if ((0, isArray_1["default"])(item.items)) {
51
- items = item.items.map(function (subItem) { return (0, exports.walkRoutesRecursive)(subItem, defaultItem, normalizedItem); });
78
+ items = item.items.map(function (subItem) { return (0, exports.walkRoutesRecursive)(subItem, defaultItem, normalizedItem, alwaysAppendParentRoutePath); });
52
79
  }
53
80
  else if ((0, isObject_1["default"])(item.items)) {
54
81
  items = Object.keys(item.items)
55
- .map(function (id) { return (0, exports.walkRoutesRecursive)(__assign(__assign({}, item.items[id]), { id: id }), defaultItem, normalizedItem); });
82
+ .map(function (id) { return (0, exports.walkRoutesRecursive)(__assign(__assign({}, item.items[id]), { id: id }), defaultItem, normalizedItem, alwaysAppendParentRoutePath); });
56
83
  }
57
84
  return __assign(__assign({}, normalizedItem), { items: items });
58
85
  };
59
86
  exports.walkRoutesRecursive = walkRoutesRecursive;
60
- var treeToList = function (item, isRoot) {
87
+ var treeToList = function (item, isRoot, parentItem, alwaysAppendParentRoutePath) {
61
88
  if (isRoot === void 0) { isRoot = true; }
89
+ if (parentItem === void 0) { parentItem = {}; }
90
+ if (alwaysAppendParentRoutePath === void 0) { alwaysAppendParentRoutePath = true; }
62
91
  if ((0, isArray_1["default"])(item)) {
63
92
  return item;
64
93
  }
94
+ if (item.path) {
95
+ item.path = alwaysAppendParentRoutePath
96
+ ? joinChildAndParentPaths(item.path, parentItem === null || parentItem === void 0 ? void 0 : parentItem.path)
97
+ : appendChildIfNoSlash(item.path, parentItem === null || parentItem === void 0 ? void 0 : parentItem.path);
98
+ }
65
99
  if (isRoot && !item.id) {
66
100
  item.id = 'root';
67
101
  }
68
102
  var items = item.path ? [item] : [];
69
103
  if ((0, isArray_1["default"])(item.items)) {
70
104
  item.items.forEach(function (subItem) {
71
- items = items.concat((0, exports.treeToList)(subItem, false));
105
+ items = items.concat((0, exports.treeToList)(subItem, false, item, alwaysAppendParentRoutePath));
72
106
  });
73
107
  }
74
108
  else if ((0, isObject_1["default"])(item.items)) {
75
109
  Object.keys(item.items).forEach(function (id) {
76
- items = items.concat((0, exports.treeToList)(__assign(__assign({}, item.items[id]), { id: id }), false));
110
+ items = items.concat((0, exports.treeToList)(__assign(__assign({}, item.items[id]), { id: id }), false, item, alwaysAppendParentRoutePath));
77
111
  });
78
112
  }
79
113
  return items;
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { IPreparedTreeItem, ITreeConfig } from '../../../hooks/useTree';
2
+ import { IPreparedTreeItem, ITreeConfig, ITreeItem } from '../../../hooks/useTree';
3
3
  export interface ITreeViewProps extends ITreeProps {
4
4
  items: IPreparedTreeItem[];
5
5
  }
@@ -30,7 +30,7 @@ export interface ITreeProps extends Omit<ITreeConfig, 'currentPage' | 'itemsOnPa
30
30
  * Обработчик на клик по узлу
31
31
  * @param args
32
32
  */
33
- onItemClick?: (...args: any[]) => any;
33
+ onItemClick?: (event: React.MouseEvent, item: ITreeItem) => any;
34
34
  /**
35
35
  * Отображать раскрытыми узлы из LocalStorage
36
36
  * @example true
@@ -41,6 +41,15 @@ export interface ITreeProps extends Omit<ITreeConfig, 'currentPage' | 'itemsOnPa
41
41
  * @example 32
42
42
  */
43
43
  levelPadding?: number;
44
+ /**
45
+ * Показать иконку c лева от элемента
46
+ * @example true
47
+ */
48
+ showIcon?: boolean;
49
+ /**
50
+ * Кастомная иконка, заменяющая иконку раскрытия по умолчанию
51
+ */
52
+ customIcon?: string | React.ReactElement;
44
53
  /**
45
54
  * Флаг, определяющий раскрывать вложенные элементы по клику на весь элемент или только на иконку
46
55
  * @example false
@@ -57,6 +66,8 @@ declare namespace Tree {
57
66
  level: number;
58
67
  levelPadding: number;
59
68
  hasIconExpandOnly: boolean;
69
+ useSameSelectedItemId: boolean;
70
+ showIcon: boolean;
60
71
  };
61
72
  }
62
73
  export default Tree;
@@ -22,7 +22,8 @@ function Tree(props) {
22
22
  autoOpenLevels: props.autoOpenLevels,
23
23
  onExpand: props.onItemClick,
24
24
  level: props.level,
25
- alwaysOpened: props.alwaysOpened
25
+ alwaysOpened: props.alwaysOpened,
26
+ useSameSelectedItemId: props.useSameSelectedItemId
26
27
  }).treeItems;
27
28
  return components.ui.renderView(props.view || 'nav.TreeView', __assign(__assign({}, props), { items: treeItems }));
28
29
  }
@@ -33,5 +34,7 @@ Tree.defaultProps = {
33
34
  autoSave: false,
34
35
  level: 0,
35
36
  levelPadding: 32,
36
- hasIconExpandOnly: false
37
+ hasIconExpandOnly: false,
38
+ useSameSelectedItemId: true,
39
+ showIcon: true
37
40
  };
@@ -1,86 +0,0 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __importDefault = (this && this.__importDefault) || function (mod) {
14
- return (mod && mod.__esModule) ? mod : { "default": mod };
15
- };
16
- exports.__esModule = true;
17
- var react_1 = __importDefault(require("react"));
18
- var calendar_1 = require("../../../../utils/calendar");
19
- var DateControlType_1 = __importDefault(require("../enums/DateControlType"));
20
- var useCalendarControls_1 = require("./useCalendarControls");
21
- var utils_1 = require("../utils/utils");
22
- var WEEK_DAY_FORMAT = 'dd, D MMM';
23
- var ONE_DAY = 1;
24
- var getFormattedWeekFromDate = function (fromDate) {
25
- if (fromDate === void 0) { fromDate = null; }
26
- var currentWeek = (0, utils_1.getWeekDaysFromDate)(fromDate || new Date());
27
- return currentWeek.map(function (dayOfWeek) {
28
- var copyOfDayWeek = __assign({}, dayOfWeek);
29
- copyOfDayWeek.formattedDisplay = (0, calendar_1.convertDate)(dayOfWeek.date, null, WEEK_DAY_FORMAT);
30
- // eslint-disable-next-line no-unused-expressions
31
- (0, utils_1.isDateIsToday)(copyOfDayWeek.date) ? copyOfDayWeek.isToday = true : copyOfDayWeek.isToday = false;
32
- return copyOfDayWeek;
33
- });
34
- };
35
- var useWeekCalendar = function (currentMonthDate) {
36
- var _a;
37
- var _b = react_1["default"].useState(getFormattedWeekFromDate()), currentWeek = _b[0], setCurrentWeek = _b[1];
38
- var forceUpdateWeekOnMonthChange = react_1["default"].useCallback(function (newMonthDate) {
39
- setCurrentWeek(getFormattedWeekFromDate(newMonthDate));
40
- }, []);
41
- var changeMonthAfterWeekChanged = react_1["default"].useCallback(function (formattedWeek) {
42
- var firstDayOfWeek = formattedWeek[0].date;
43
- var currentMonthNumber = currentMonthDate.getMonth();
44
- var isWeekOutOfMonth = formattedWeek.every(function (dayOfWeek) { return dayOfWeek.date.getMonth() !== currentMonthNumber; });
45
- if (!isWeekOutOfMonth) {
46
- return;
47
- }
48
- if (currentMonthNumber - firstDayOfWeek.getMonth() === 1) {
49
- var lastDayOfWeekInNewMonth = formattedWeek[formattedWeek.length - 1].date;
50
- var prevMonthControl = (0, useCalendarControls_1.getSourceCalendarControl)(DateControlType_1["default"].PREV_ONE);
51
- prevMonthControl.click();
52
- forceUpdateWeekOnMonthChange(lastDayOfWeekInNewMonth);
53
- }
54
- else {
55
- var firstDayOfWeekInNewMonth = formattedWeek[0].date;
56
- var nextMonthControl = (0, useCalendarControls_1.getSourceCalendarControl)(DateControlType_1["default"].NEXT_ONE);
57
- nextMonthControl.click();
58
- forceUpdateWeekOnMonthChange(firstDayOfWeekInNewMonth);
59
- }
60
- }, [currentMonthDate, forceUpdateWeekOnMonthChange]);
61
- var setNextWeek = react_1["default"].useCallback(function () {
62
- var lastDayOfWeek = currentWeek[currentWeek.length - 1].date;
63
- lastDayOfWeek.setDate(lastDayOfWeek.getDate() + ONE_DAY);
64
- var formattedNextWeek = getFormattedWeekFromDate(lastDayOfWeek);
65
- setCurrentWeek(formattedNextWeek);
66
- changeMonthAfterWeekChanged(formattedNextWeek);
67
- }, [currentWeek, changeMonthAfterWeekChanged]);
68
- var setPrevWeek = react_1["default"].useCallback(function () {
69
- var firstDayOfWeek = currentWeek[0].date;
70
- firstDayOfWeek.setDate(firstDayOfWeek.getDate() - ONE_DAY);
71
- var formattedPrevWeek = getFormattedWeekFromDate(firstDayOfWeek);
72
- setCurrentWeek(formattedPrevWeek);
73
- changeMonthAfterWeekChanged(formattedPrevWeek);
74
- }, [currentWeek, changeMonthAfterWeekChanged]);
75
- return {
76
- currentWeek: currentWeek,
77
- weekControls: (_a = {},
78
- _a[DateControlType_1["default"].NEXT_DOUBLE] = DateControlType_1["default"].NEXT_ONE,
79
- _a[DateControlType_1["default"].NEXT_ONE] = setNextWeek,
80
- _a[DateControlType_1["default"].PREV_ONE] = setPrevWeek,
81
- _a[DateControlType_1["default"].PREV_DOUBLE] = DateControlType_1["default"].PREV_ONE,
82
- _a),
83
- forceUpdateWeekOnMonthChange: forceUpdateWeekOnMonthChange
84
- };
85
- };
86
- exports["default"] = useWeekCalendar;