@progress/kendo-react-taskboard 5.3.0-dev.202205041411
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/LICENSE.md +11 -0
- package/NOTICE.txt +111 -0
- package/README.md +41 -0
- package/about.md +3 -0
- package/dist/cdn/js/kendo-react-taskboard.js +1 -0
- package/dist/es/TaskBoard.d.ts +145 -0
- package/dist/es/TaskBoard.js +267 -0
- package/dist/es/TaskBoardAddCard.d.ts +32 -0
- package/dist/es/TaskBoardAddCard.js +16 -0
- package/dist/es/TaskBoardCardBase.d.ts +56 -0
- package/dist/es/TaskBoardCardBase.js +87 -0
- package/dist/es/TaskBoardColumnBase.d.ts +72 -0
- package/dist/es/TaskBoardColumnBase.js +90 -0
- package/dist/es/TaskBoardConfirmDialog.d.ts +37 -0
- package/dist/es/TaskBoardConfirmDialog.js +24 -0
- package/dist/es/TaskBoardEditCard.d.ts +20 -0
- package/dist/es/TaskBoardEditCard.js +16 -0
- package/dist/es/TaskBoardTaskEditPane.d.ts +93 -0
- package/dist/es/TaskBoardTaskEditPane.js +36 -0
- package/dist/es/TaskBoardToolbar.d.ts +26 -0
- package/dist/es/TaskBoardToolbar.js +17 -0
- package/dist/es/card/Card.d.ts +140 -0
- package/dist/es/card/Card.js +33 -0
- package/dist/es/card/CardBody.d.ts +22 -0
- package/dist/es/card/CardBody.js +9 -0
- package/dist/es/card/CardHeader.d.ts +56 -0
- package/dist/es/card/CardHeader.js +18 -0
- package/dist/es/card/PreviewDialog.d.ts +50 -0
- package/dist/es/card/PreviewDialog.js +25 -0
- package/dist/es/column/Column.d.ts +168 -0
- package/dist/es/column/Column.js +34 -0
- package/dist/es/column/ColumnBody.d.ts +46 -0
- package/dist/es/column/ColumnBody.js +9 -0
- package/dist/es/column/ColumnHeader.d.ts +55 -0
- package/dist/es/column/ColumnHeader.js +18 -0
- package/dist/es/constants.d.ts +20 -0
- package/dist/es/constants.js +20 -0
- package/dist/es/hooks/taskEditing.d.ts +18 -0
- package/dist/es/hooks/taskEditing.js +32 -0
- package/dist/es/main.d.ts +14 -0
- package/dist/es/main.js +14 -0
- package/dist/es/messages/index.d.ts +150 -0
- package/dist/es/messages/index.js +151 -0
- package/dist/es/package-metadata.d.ts +5 -0
- package/dist/es/package-metadata.js +11 -0
- package/dist/es/utils.d.ts +25 -0
- package/dist/es/utils.js +80 -0
- package/dist/npm/TaskBoard.d.ts +145 -0
- package/dist/npm/TaskBoard.js +269 -0
- package/dist/npm/TaskBoardAddCard.d.ts +32 -0
- package/dist/npm/TaskBoardAddCard.js +18 -0
- package/dist/npm/TaskBoardCardBase.d.ts +56 -0
- package/dist/npm/TaskBoardCardBase.js +89 -0
- package/dist/npm/TaskBoardColumnBase.d.ts +72 -0
- package/dist/npm/TaskBoardColumnBase.js +92 -0
- package/dist/npm/TaskBoardConfirmDialog.d.ts +37 -0
- package/dist/npm/TaskBoardConfirmDialog.js +26 -0
- package/dist/npm/TaskBoardEditCard.d.ts +20 -0
- package/dist/npm/TaskBoardEditCard.js +18 -0
- package/dist/npm/TaskBoardTaskEditPane.d.ts +93 -0
- package/dist/npm/TaskBoardTaskEditPane.js +38 -0
- package/dist/npm/TaskBoardToolbar.d.ts +26 -0
- package/dist/npm/TaskBoardToolbar.js +19 -0
- package/dist/npm/card/Card.d.ts +140 -0
- package/dist/npm/card/Card.js +35 -0
- package/dist/npm/card/CardBody.d.ts +22 -0
- package/dist/npm/card/CardBody.js +11 -0
- package/dist/npm/card/CardHeader.d.ts +56 -0
- package/dist/npm/card/CardHeader.js +20 -0
- package/dist/npm/card/PreviewDialog.d.ts +50 -0
- package/dist/npm/card/PreviewDialog.js +27 -0
- package/dist/npm/column/Column.d.ts +168 -0
- package/dist/npm/column/Column.js +36 -0
- package/dist/npm/column/ColumnBody.d.ts +46 -0
- package/dist/npm/column/ColumnBody.js +11 -0
- package/dist/npm/column/ColumnHeader.d.ts +55 -0
- package/dist/npm/column/ColumnHeader.js +20 -0
- package/dist/npm/constants.d.ts +20 -0
- package/dist/npm/constants.js +22 -0
- package/dist/npm/hooks/taskEditing.d.ts +18 -0
- package/dist/npm/hooks/taskEditing.js +34 -0
- package/dist/npm/main.d.ts +14 -0
- package/dist/npm/main.js +30 -0
- package/dist/npm/messages/index.d.ts +150 -0
- package/dist/npm/messages/index.js +153 -0
- package/dist/npm/package-metadata.d.ts +5 -0
- package/dist/npm/package-metadata.js +13 -0
- package/dist/npm/utils.d.ts +25 -0
- package/dist/npm/utils.js +82 -0
- package/dist/systemjs/kendo-react-taskboard.js +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { TaskBoardCardProps } from './card/Card';
|
|
3
|
+
import { TaskBoardColumnProps } from './column/Column';
|
|
4
|
+
/**
|
|
5
|
+
* Represent the target(props) of the TaskBoardHandle.
|
|
6
|
+
*/
|
|
7
|
+
export interface TaskBoardHandle {
|
|
8
|
+
/**
|
|
9
|
+
* The props values of the TackBoard.
|
|
10
|
+
*/
|
|
11
|
+
props: TaskBoardProps;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Represents the target of the TaskBoardPriority.
|
|
15
|
+
*/
|
|
16
|
+
export interface TaskBoardPriority {
|
|
17
|
+
/**
|
|
18
|
+
* Represents the priority of a TaskBoard.
|
|
19
|
+
*/
|
|
20
|
+
priority: string;
|
|
21
|
+
/**
|
|
22
|
+
* Represents the color of a TaskBoard.
|
|
23
|
+
*/
|
|
24
|
+
color: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Represent the item model.
|
|
28
|
+
*/
|
|
29
|
+
interface ItemModel {
|
|
30
|
+
/**
|
|
31
|
+
* Sets the `id` of an ItemModel.
|
|
32
|
+
*/
|
|
33
|
+
id: string | number | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Determines the title of an ItemModel.
|
|
36
|
+
*/
|
|
37
|
+
title: string;
|
|
38
|
+
/**
|
|
39
|
+
* Determines the status of an ItemModel.
|
|
40
|
+
*/
|
|
41
|
+
status: string;
|
|
42
|
+
/**
|
|
43
|
+
* Determines of an ItemModel is going to edited.
|
|
44
|
+
*/
|
|
45
|
+
edit?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* @hidden
|
|
48
|
+
*/
|
|
49
|
+
isPlaceholder?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Represents the task board column model.
|
|
53
|
+
*/
|
|
54
|
+
export interface TaskBoardColumnModel extends ItemModel {
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Represents the task board task model.
|
|
58
|
+
*/
|
|
59
|
+
export interface TaskBoardTaskModel extends ItemModel {
|
|
60
|
+
/**
|
|
61
|
+
* Determined the description of the TaskBoardTaskModel.
|
|
62
|
+
*/
|
|
63
|
+
description: string;
|
|
64
|
+
/**
|
|
65
|
+
* Determined the priority of the TaskBoardTaskModel.
|
|
66
|
+
*/
|
|
67
|
+
priority: TaskBoardPriority;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Represents the return type of TaskBoardChangeEvent.
|
|
71
|
+
*/
|
|
72
|
+
export interface TaskBoardChangeEvent {
|
|
73
|
+
/**
|
|
74
|
+
* Determines the returned data.
|
|
75
|
+
*/
|
|
76
|
+
data: {}[] | TaskBoardTaskModel[];
|
|
77
|
+
/**
|
|
78
|
+
* Determines the returned type.
|
|
79
|
+
*/
|
|
80
|
+
type: string;
|
|
81
|
+
/**
|
|
82
|
+
* Represents the previous item.
|
|
83
|
+
*/
|
|
84
|
+
previousItem: TaskBoardColumnModel | TaskBoardTaskModel | null;
|
|
85
|
+
/**
|
|
86
|
+
* Represents the current item.
|
|
87
|
+
*/
|
|
88
|
+
item: TaskBoardColumnModel | TaskBoardTaskModel | null;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Represents the props of the TaskBoard component
|
|
92
|
+
*/
|
|
93
|
+
export interface TaskBoardProps {
|
|
94
|
+
/**
|
|
95
|
+
* Specifies the column data from type TaskBoardColumnModel.
|
|
96
|
+
*/
|
|
97
|
+
columnData: TaskBoardColumnModel[];
|
|
98
|
+
/**
|
|
99
|
+
* Represents the task data from type TaskBoardTaskModel.
|
|
100
|
+
*/
|
|
101
|
+
taskData: TaskBoardTaskModel[];
|
|
102
|
+
/**
|
|
103
|
+
* Specifies the priorities of the task board.
|
|
104
|
+
*/
|
|
105
|
+
priorities: TaskBoardPriority[];
|
|
106
|
+
/**
|
|
107
|
+
* Specifies a list of CSS classes that will be added to the TaskBoard element.
|
|
108
|
+
*/
|
|
109
|
+
className?: string | Array<string>;
|
|
110
|
+
/**
|
|
111
|
+
* Specifies the id that will be added to the TaskBoard element.
|
|
112
|
+
*/
|
|
113
|
+
id?: string;
|
|
114
|
+
/**
|
|
115
|
+
* Specifies the `tabIndex` that will be added to the TaskBoard Column and Card elements.
|
|
116
|
+
*/
|
|
117
|
+
tabIndex?: number;
|
|
118
|
+
/**
|
|
119
|
+
* Represents the styles that are applied to the TaskBoard.
|
|
120
|
+
*/
|
|
121
|
+
style?: React.CSSProperties;
|
|
122
|
+
/**
|
|
123
|
+
* The React elements that will be rendered inside the toolbar of the TaskBoard.
|
|
124
|
+
*/
|
|
125
|
+
children?: React.ReactNode;
|
|
126
|
+
/**
|
|
127
|
+
* Represents the `onChange` event. Triggered after tasks changes.
|
|
128
|
+
*/
|
|
129
|
+
onChange: (event: TaskBoardChangeEvent) => void;
|
|
130
|
+
/**
|
|
131
|
+
* Represents the TaskBoardCard component.
|
|
132
|
+
*/
|
|
133
|
+
card?: React.ComponentType<TaskBoardCardProps>;
|
|
134
|
+
/**
|
|
135
|
+
* Represents the TaskBoardColumn component.
|
|
136
|
+
*/
|
|
137
|
+
column?: React.ComponentType<TaskBoardColumnProps>;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Represents the [KendoReact TaskBoard component]({% slug overview_taskboard %}).
|
|
141
|
+
*
|
|
142
|
+
* Accepts properties of type [TaskBoardProps]({% slug api_taskboard_taskboardprops %}).
|
|
143
|
+
*/
|
|
144
|
+
export declare const TaskBoard: React.ForwardRefExoticComponent<TaskBoardProps & React.RefAttributes<TaskBoardHandle>>;
|
|
145
|
+
export {};
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
import * as React from 'react';
|
|
13
|
+
import * as PropTypes from 'prop-types';
|
|
14
|
+
import { validatePackage } from '@progress/kendo-licensing';
|
|
15
|
+
import { packageMetadata } from './package-metadata';
|
|
16
|
+
import { classNames, useDraggable, clone, noop } from '@progress/kendo-react-common';
|
|
17
|
+
import { TaskBoardColumnBase } from './TaskBoardColumnBase';
|
|
18
|
+
import { TaskBoardCardBase } from './TaskBoardCardBase';
|
|
19
|
+
import { TASKBOARD_COLUMN, TASKBOARD_PLACEHOLDER, TASKBOARD_TASK } from './constants';
|
|
20
|
+
import { closestTaskBoardElement, findIndexes } from './utils';
|
|
21
|
+
import { TaskBoardCard } from './card/Card';
|
|
22
|
+
import { TaskBoardColumn } from './column/Column';
|
|
23
|
+
/**
|
|
24
|
+
* Represents the [KendoReact TaskBoard component]({% slug overview_taskboard %}).
|
|
25
|
+
*
|
|
26
|
+
* Accepts properties of type [TaskBoardProps]({% slug api_taskboard_taskboardprops %}).
|
|
27
|
+
*/
|
|
28
|
+
export var TaskBoard = React.forwardRef(function (props, ref) {
|
|
29
|
+
validatePackage(packageMetadata);
|
|
30
|
+
var columnData = props.columnData, className = props.className, style = props.style, id = props.id, taskData = props.taskData, onChange = props.onChange;
|
|
31
|
+
var taskboardRef = React.useRef(null);
|
|
32
|
+
var taskboardElementRef = React.useRef(null);
|
|
33
|
+
React.useImperativeHandle(taskboardRef, function () {
|
|
34
|
+
return { props: props };
|
|
35
|
+
});
|
|
36
|
+
React.useImperativeHandle(ref, function () { return taskboardRef.current; });
|
|
37
|
+
var children = React.Children.toArray(props.children);
|
|
38
|
+
var toolbar = children.filter(function (child) { return child &&
|
|
39
|
+
child.type.displayName === 'KendoReactTaskBoardToolbar'; });
|
|
40
|
+
var elementRef = React.useRef(null);
|
|
41
|
+
var dragTargetRef = React.useRef(null);
|
|
42
|
+
var pressOffsetRef = React.useRef(null);
|
|
43
|
+
var _a = React.useState(null), taskDataState = _a[0], setTaskDataState = _a[1];
|
|
44
|
+
var _b = React.useState(null), columnDataState = _b[0], setColumnDataState = _b[1];
|
|
45
|
+
var _c = React.useState({ top: 0, left: 0 }), position = _c[0], setPosition = _c[1];
|
|
46
|
+
var dragCardCueRef = React.useRef(null);
|
|
47
|
+
var dragColumnCueRef = React.useRef(null);
|
|
48
|
+
var tasksMap = React.useMemo(function () {
|
|
49
|
+
var map = {};
|
|
50
|
+
(taskDataState || taskData).forEach(function (task) {
|
|
51
|
+
var currentStatus = task.status;
|
|
52
|
+
if (!map[currentStatus]) {
|
|
53
|
+
map[currentStatus] = [];
|
|
54
|
+
}
|
|
55
|
+
map[currentStatus].push(task);
|
|
56
|
+
});
|
|
57
|
+
return map;
|
|
58
|
+
}, [taskData, taskDataState]);
|
|
59
|
+
var handlePress = React.useCallback(function (event) {
|
|
60
|
+
var target = event.originalEvent.target;
|
|
61
|
+
if (target.closest('button,input,.k-link,.k-taskboard-preview-pane')) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
var currentDragTarget = closestTaskBoardElement(target);
|
|
65
|
+
var taskboardEl = taskboardElementRef.current;
|
|
66
|
+
if (currentDragTarget && taskboardEl) {
|
|
67
|
+
var isColumn = currentDragTarget.type === TASKBOARD_COLUMN;
|
|
68
|
+
if (isColumn && !target.closest('.k-taskboard-column-header')) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
var dragElement = currentDragTarget.element;
|
|
72
|
+
var rect = dragElement.getBoundingClientRect();
|
|
73
|
+
var parentRect = taskboardEl.getBoundingClientRect();
|
|
74
|
+
pressOffsetRef.current = {
|
|
75
|
+
x: event.clientX - rect.left + parentRect.left,
|
|
76
|
+
y: event.clientY - rect.top + parentRect.top
|
|
77
|
+
};
|
|
78
|
+
var data = isColumn ? columnData : taskData;
|
|
79
|
+
var stateSetter = isColumn ? setColumnDataState : setTaskDataState;
|
|
80
|
+
var index = data.findIndex(function (dataItem) { return String(dataItem.id) === currentDragTarget.id; });
|
|
81
|
+
var item = data[index];
|
|
82
|
+
if (index === -1 || item.edit) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
var newItem = clone(item);
|
|
86
|
+
newItem.isPlaceholder = true;
|
|
87
|
+
var newData = data.slice();
|
|
88
|
+
newData[index] = newItem;
|
|
89
|
+
dragTargetRef.current = __assign({}, currentDragTarget, { index: index,
|
|
90
|
+
item: item, width: rect.width, height: rect.height });
|
|
91
|
+
setPosition({
|
|
92
|
+
top: event.clientY - pressOffsetRef.current.y,
|
|
93
|
+
left: event.clientX - pressOffsetRef.current.x
|
|
94
|
+
});
|
|
95
|
+
stateSetter(newData);
|
|
96
|
+
}
|
|
97
|
+
}, [columnData, taskData]);
|
|
98
|
+
var handleDrag = React.useCallback(function (event) {
|
|
99
|
+
var currentDragTarget = dragTargetRef.current;
|
|
100
|
+
var dragCueElement = (dragCardCueRef.current && dragCardCueRef.current.element) || dragColumnCueRef.current;
|
|
101
|
+
if (currentDragTarget && dragCueElement) {
|
|
102
|
+
setPosition({
|
|
103
|
+
top: event.clientY - pressOffsetRef.current.y,
|
|
104
|
+
left: event.clientX - pressOffsetRef.current.x
|
|
105
|
+
});
|
|
106
|
+
dragCueElement.style.visibility = 'hidden';
|
|
107
|
+
var targetElement = document.elementFromPoint(event.clientX, event.clientY);
|
|
108
|
+
dragCueElement.style.visibility = '';
|
|
109
|
+
if (targetElement && targetElement.getAttribute(TASKBOARD_PLACEHOLDER)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
var dropTarget_1 = targetElement && closestTaskBoardElement(targetElement);
|
|
113
|
+
if (dropTarget_1) {
|
|
114
|
+
var indexes = void 0;
|
|
115
|
+
var isSameType = dropTarget_1.type === currentDragTarget.type;
|
|
116
|
+
var isDragTargetColumn = currentDragTarget.type === TASKBOARD_COLUMN;
|
|
117
|
+
var data = (isDragTargetColumn ? columnDataState : taskDataState) || [];
|
|
118
|
+
var stateSetter = isDragTargetColumn ? setColumnDataState : setTaskDataState;
|
|
119
|
+
if (isDragTargetColumn || isSameType) {
|
|
120
|
+
indexes = findIndexes(currentDragTarget.id, dropTarget_1.id, data);
|
|
121
|
+
if (indexes) {
|
|
122
|
+
var dragItem = data[indexes.dragIndex];
|
|
123
|
+
var dropItem = data[indexes.dropIndex];
|
|
124
|
+
var newDragItem = clone(dragItem);
|
|
125
|
+
if (!isDragTargetColumn) {
|
|
126
|
+
newDragItem.status = dropItem.status;
|
|
127
|
+
}
|
|
128
|
+
var newData = data.slice();
|
|
129
|
+
newData.splice(indexes.dragIndex, 1);
|
|
130
|
+
newData.splice(indexes.dropIndex, 0, newDragItem);
|
|
131
|
+
currentDragTarget.index = indexes.dropIndex;
|
|
132
|
+
stateSetter(newData);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
var taskIndex = data.findIndex(function (item) { return String(item.id) === currentDragTarget.id; });
|
|
137
|
+
var columnIndex = columnData.findIndex(function (item) { return String(item.id) === dropTarget_1.id; });
|
|
138
|
+
if (taskIndex !== -1 && columnIndex !== -1) {
|
|
139
|
+
var task = data[taskIndex];
|
|
140
|
+
var column = columnData[columnIndex];
|
|
141
|
+
var columnStatus = column.status;
|
|
142
|
+
if (tasksMap[columnStatus]) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
task.status = columnStatus;
|
|
146
|
+
var newData = data.slice();
|
|
147
|
+
newData.splice(taskIndex, 1);
|
|
148
|
+
newData.push(task);
|
|
149
|
+
currentDragTarget.index = newData.length - 1;
|
|
150
|
+
stateSetter(newData);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}, [columnDataState, taskDataState, columnData, tasksMap]);
|
|
156
|
+
var handleRelease = React.useCallback(function () {
|
|
157
|
+
var currentDragTarget = dragTargetRef.current;
|
|
158
|
+
if (onChange && currentDragTarget) {
|
|
159
|
+
var isDragTargetColumn = currentDragTarget.type === TASKBOARD_COLUMN;
|
|
160
|
+
var data = (isDragTargetColumn ? columnDataState : taskDataState) || [];
|
|
161
|
+
var item = data[currentDragTarget.index];
|
|
162
|
+
delete item.isPlaceholder;
|
|
163
|
+
var event_1 = {
|
|
164
|
+
data: data,
|
|
165
|
+
type: currentDragTarget.type,
|
|
166
|
+
previousItem: currentDragTarget.item,
|
|
167
|
+
item: item
|
|
168
|
+
};
|
|
169
|
+
onChange.call(undefined, event_1);
|
|
170
|
+
}
|
|
171
|
+
dragTargetRef.current = null;
|
|
172
|
+
pressOffsetRef.current = null;
|
|
173
|
+
setTaskDataState(null);
|
|
174
|
+
setColumnDataState(null);
|
|
175
|
+
setPosition({ top: 0, left: 0 });
|
|
176
|
+
}, [columnDataState, taskDataState, onChange]);
|
|
177
|
+
useDraggable(elementRef, {
|
|
178
|
+
onDragStart: handlePress,
|
|
179
|
+
onDrag: handleDrag,
|
|
180
|
+
onDragEnd: handleRelease
|
|
181
|
+
});
|
|
182
|
+
var dragTarget = dragTargetRef.current;
|
|
183
|
+
var onTaskCreate = React.useCallback(function (newTask) {
|
|
184
|
+
var tasks = taskData.concat([newTask]);
|
|
185
|
+
var event = {
|
|
186
|
+
data: tasks,
|
|
187
|
+
type: TASKBOARD_TASK,
|
|
188
|
+
previousItem: null,
|
|
189
|
+
item: newTask
|
|
190
|
+
};
|
|
191
|
+
onChange.call(undefined, event);
|
|
192
|
+
}, [onChange, taskData]);
|
|
193
|
+
var onTaskEdit = React.useCallback(function (task, prevTask) {
|
|
194
|
+
var tasks = taskData.slice();
|
|
195
|
+
var index = taskData.indexOf(prevTask);
|
|
196
|
+
if (index !== -1) {
|
|
197
|
+
tasks.splice(index, 1, task);
|
|
198
|
+
}
|
|
199
|
+
var event = {
|
|
200
|
+
data: tasks,
|
|
201
|
+
type: TASKBOARD_TASK,
|
|
202
|
+
previousItem: prevTask,
|
|
203
|
+
item: task
|
|
204
|
+
};
|
|
205
|
+
onChange.call(undefined, event);
|
|
206
|
+
}, [onChange, taskData]);
|
|
207
|
+
var onTaskDelete = React.useCallback(function (task) {
|
|
208
|
+
var tasks = taskData.filter(function (t) { return t !== task; });
|
|
209
|
+
var event = {
|
|
210
|
+
data: tasks,
|
|
211
|
+
type: TASKBOARD_TASK,
|
|
212
|
+
previousItem: task,
|
|
213
|
+
item: null
|
|
214
|
+
};
|
|
215
|
+
onChange.call(undefined, event);
|
|
216
|
+
}, [onChange, taskData]);
|
|
217
|
+
var onColumnChange = React.useCallback(function (newColumn, prevColumn) {
|
|
218
|
+
var data = columnData.slice();
|
|
219
|
+
var index = data.indexOf(prevColumn);
|
|
220
|
+
if (index !== -1) {
|
|
221
|
+
if (newColumn) {
|
|
222
|
+
data.splice(index, 1, newColumn);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
data.splice(index, 1);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
var event = {
|
|
229
|
+
data: data,
|
|
230
|
+
type: TASKBOARD_COLUMN,
|
|
231
|
+
previousItem: prevColumn,
|
|
232
|
+
item: newColumn
|
|
233
|
+
};
|
|
234
|
+
onChange.call(undefined, event);
|
|
235
|
+
}, [onChange, columnData]);
|
|
236
|
+
return (React.createElement("div", { id: id, style: style, ref: taskboardElementRef, className: classNames('k-widget k-taskboard', className) },
|
|
237
|
+
toolbar,
|
|
238
|
+
React.createElement("div", { className: 'k-taskboard-content', style: dragTarget ? { userSelect: 'none' } : undefined },
|
|
239
|
+
React.createElement("div", { className: 'k-taskboard-columns-container', ref: elementRef }, (columnDataState || columnData).map(function (column) { return (React.createElement(TaskBoardColumnBase, { key: column.id, tabIndex: props.tabIndex, column: column, tasks: tasksMap[column.status] || [], dragTargetRef: dragTargetRef, onTaskCreate: onTaskCreate, onTaskEdit: onTaskEdit, onTaskDelete: onTaskDelete, onColumnChange: onColumnChange, columnComponent: props.column || TaskBoardColumn, cardComponent: props.card || TaskBoardCard, priorities: props.priorities })); }))),
|
|
240
|
+
dragTarget && dragTarget.type === TASKBOARD_TASK && (React.createElement(TaskBoardCardBase, { elementRef: dragCardCueRef, style: {
|
|
241
|
+
position: 'absolute',
|
|
242
|
+
width: dragTarget.width,
|
|
243
|
+
height: dragTarget.height,
|
|
244
|
+
top: position.top,
|
|
245
|
+
left: position.left,
|
|
246
|
+
zIndex: 10,
|
|
247
|
+
borderLeftColor: dragTarget.item.priority ? dragTarget.item.priority.color : dragTarget.item.color
|
|
248
|
+
}, task: dragTarget.item, dragTargetRef: dragTargetRef, cardComponent: props.card || TaskBoardCard, onDeleteTask: noop, showEditPane: noop })),
|
|
249
|
+
dragTarget && dragTarget.type === TASKBOARD_COLUMN && (React.createElement(TaskBoardColumnBase, { elementRef: dragColumnCueRef, style: {
|
|
250
|
+
position: 'absolute',
|
|
251
|
+
width: dragTarget.width,
|
|
252
|
+
height: dragTarget.height,
|
|
253
|
+
top: position.top,
|
|
254
|
+
left: position.left,
|
|
255
|
+
zIndex: 10
|
|
256
|
+
}, cardComponent: props.card || TaskBoardCard, columnComponent: props.column || TaskBoardColumn, column: dragTarget.item, tasks: tasksMap[dragTarget.item.status], priorities: props.priorities, dragTargetRef: dragTargetRef, onTaskDelete: onTaskDelete, onColumnChange: onColumnChange, onTaskEdit: onTaskEdit, onTaskCreate: onTaskCreate }))));
|
|
257
|
+
});
|
|
258
|
+
var defaultProps = {
|
|
259
|
+
columnData: [],
|
|
260
|
+
taskData: []
|
|
261
|
+
};
|
|
262
|
+
TaskBoard.propTypes = {
|
|
263
|
+
columnData: PropTypes.array.isRequired,
|
|
264
|
+
taskData: PropTypes.array.isRequired
|
|
265
|
+
};
|
|
266
|
+
TaskBoard.defaultProps = defaultProps;
|
|
267
|
+
TaskBoard.displayName = 'KendoReactTaskBoard';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { TaskBoardTaskEditPaneProps } from './TaskBoardTaskEditPane';
|
|
3
|
+
import { TaskBoardPriority, TaskBoardTaskModel } from './TaskBoard';
|
|
4
|
+
/**
|
|
5
|
+
* Represents the props of the TaskBoardAddCard component
|
|
6
|
+
*/
|
|
7
|
+
export interface TaskBoardAddCardProps {
|
|
8
|
+
/**
|
|
9
|
+
* Represent the priorities of the task board card.
|
|
10
|
+
*/
|
|
11
|
+
priorities: TaskBoardPriority[];
|
|
12
|
+
/**
|
|
13
|
+
* Triggered on `onClose` event of the TaskBoardAddCard.
|
|
14
|
+
*/
|
|
15
|
+
onClose: () => void;
|
|
16
|
+
/**
|
|
17
|
+
* Triggered on `onSave` event of the TaskBoardAddCard.
|
|
18
|
+
*/
|
|
19
|
+
onSave: (task: TaskBoardTaskModel, prevTask: TaskBoardTaskModel | undefined) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Specifies the TaskBoardTaskEditPane component.
|
|
22
|
+
*/
|
|
23
|
+
editPane: React.ComponentType<TaskBoardTaskEditPaneProps>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Represents the TaskBoardAddCard component.
|
|
27
|
+
*/
|
|
28
|
+
export declare const TaskBoardAddCard: {
|
|
29
|
+
(props: TaskBoardAddCardProps): JSX.Element;
|
|
30
|
+
defaultProps: {};
|
|
31
|
+
displayName: string;
|
|
32
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useLocalization } from '@progress/kendo-react-intl';
|
|
3
|
+
import { messages, taskBoardAddCardPaneTitle, taskBoardAddCardTitleLabel, taskBoardAddCardDescriptionLabel, taskBoardAddCardCreateButton, taskBoardEditPaneCancelBtn, taskBoardEditPaneTitleLabel, taskBoardEditPaneDescriptionLabel, taskBoardEditPanePriorityLabel, taskBoardAddCardPriorityLabel } from './messages';
|
|
4
|
+
import { useTaskEditing } from './hooks/taskEditing';
|
|
5
|
+
/**
|
|
6
|
+
* Represents the TaskBoardAddCard component.
|
|
7
|
+
*/
|
|
8
|
+
export var TaskBoardAddCard = function (props) {
|
|
9
|
+
var _a = useTaskEditing(props), onTitleChange = _a.onTitleChange, title = _a.title, onDescriptionChange = _a.onDescriptionChange, description = _a.description, onPriorityChange = _a.onPriorityChange, priority = _a.priority, onSave = _a.onSave;
|
|
10
|
+
var localization = useLocalization();
|
|
11
|
+
return (React.createElement(props.editPane, { header: localization.toLanguageString(taskBoardAddCardPaneTitle, messages[taskBoardAddCardPaneTitle]), titleInputTitle: localization.toLanguageString(taskBoardAddCardTitleLabel, messages[taskBoardAddCardTitleLabel]), descriptionInputTitle: localization.toLanguageString(taskBoardAddCardDescriptionLabel, messages[taskBoardAddCardDescriptionLabel]), priorityDropDownTitle: localization.toLanguageString(taskBoardAddCardPriorityLabel, messages[taskBoardAddCardPriorityLabel]), titleLabel: localization.toLanguageString(taskBoardEditPaneTitleLabel, messages[taskBoardEditPaneTitleLabel]), descriptionLabel: localization.toLanguageString(taskBoardEditPaneDescriptionLabel, messages[taskBoardEditPaneDescriptionLabel]), priorityLabel: localization.toLanguageString(taskBoardEditPanePriorityLabel, messages[taskBoardEditPanePriorityLabel]), saveButton: localization.toLanguageString(taskBoardAddCardCreateButton, messages[taskBoardAddCardCreateButton]), cancelButton: localization.toLanguageString(taskBoardEditPaneCancelBtn, messages[taskBoardEditPaneCancelBtn]), priorities: props.priorities, onSave: onSave, onClose: props.onClose, onTitleChange: onTitleChange, title: title, onDescriptionChange: onDescriptionChange, description: description, onPriorityChange: onPriorityChange, priority: priority }));
|
|
12
|
+
};
|
|
13
|
+
var defaultProps = {};
|
|
14
|
+
TaskBoardAddCard.propTypes = {};
|
|
15
|
+
TaskBoardAddCard.defaultProps = defaultProps;
|
|
16
|
+
TaskBoardAddCard.displayName = 'KendoReactTaskBoardAddCard';
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { CardHandle } from '@progress/kendo-react-layout';
|
|
3
|
+
import { TaskBoardCardProps } from './card/Card';
|
|
4
|
+
import { TaskBoardTaskModel } from './TaskBoard';
|
|
5
|
+
/**
|
|
6
|
+
* Represents the props of the TaskBoardCardBase component
|
|
7
|
+
*/
|
|
8
|
+
export interface TaskBoardCardBaseProps {
|
|
9
|
+
/**
|
|
10
|
+
* The task of the TaskBoardCardBase.
|
|
11
|
+
*/
|
|
12
|
+
task: TaskBoardTaskModel;
|
|
13
|
+
/**
|
|
14
|
+
* The styles for the TaskBoardCardBase.
|
|
15
|
+
*/
|
|
16
|
+
style?: React.CSSProperties;
|
|
17
|
+
/**
|
|
18
|
+
* Determines the disabled mode.
|
|
19
|
+
*/
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Specifies the `tabIndex` that will be added to the TaskBoard Column and Card elements.
|
|
23
|
+
*/
|
|
24
|
+
tabIndex?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Specifies the CardHandle reference.
|
|
27
|
+
*/
|
|
28
|
+
elementRef?: React.RefObject<CardHandle>;
|
|
29
|
+
/**
|
|
30
|
+
* Specifies the width and height of the drag target reference.
|
|
31
|
+
*/
|
|
32
|
+
dragTargetRef?: React.RefObject<{
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Fires when a task is deleted.
|
|
38
|
+
*/
|
|
39
|
+
onDeleteTask: () => void;
|
|
40
|
+
/**
|
|
41
|
+
* Represents the `showEditPane` event.
|
|
42
|
+
*/
|
|
43
|
+
showEditPane: (task: TaskBoardTaskModel) => void;
|
|
44
|
+
/**
|
|
45
|
+
* Represents the TaskBoardCard component.
|
|
46
|
+
*/
|
|
47
|
+
cardComponent: React.ComponentType<TaskBoardCardProps>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Represents the TaskBoardCardBase component.
|
|
51
|
+
*/
|
|
52
|
+
export declare const TaskBoardCardBase: {
|
|
53
|
+
(props: TaskBoardCardBaseProps): JSX.Element;
|
|
54
|
+
defaultProps: {};
|
|
55
|
+
displayName: string;
|
|
56
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
import * as React from 'react';
|
|
13
|
+
import * as PropTypes from 'prop-types';
|
|
14
|
+
import { Card } from '@progress/kendo-react-layout';
|
|
15
|
+
import { TASKBOARD_PLACEHOLDER } from './constants';
|
|
16
|
+
import { useLocalization } from '@progress/kendo-react-intl';
|
|
17
|
+
import { messages, taskBoardDeleteTaskDialogMessage, taskBoardDeleteTaskDialogTitle, taskBoardDeleteTaskConfirmButton, taskBoardDeleteTaskCancelButton, taskBoardEditCardButton, taskBoardDeleteCardButton, taskBoardPreviewPanePriorityLabel, taskBoardPreviewPaneDeleteBtn, taskBoardPreviewPaneEditBtn } from './messages';
|
|
18
|
+
import { TaskBoardCardHeader } from './card/CardHeader';
|
|
19
|
+
import { TaskBoardCardBody } from './card/CardBody';
|
|
20
|
+
import { TaskBoardConfirmDialog } from './TaskBoardConfirmDialog';
|
|
21
|
+
import { TaskBoardPreviewDialog } from './card/PreviewDialog';
|
|
22
|
+
/**
|
|
23
|
+
* Represents the TaskBoardCardBase component.
|
|
24
|
+
*/
|
|
25
|
+
export var TaskBoardCardBase = function (props) {
|
|
26
|
+
var _a;
|
|
27
|
+
var onDeleteTask = props.onDeleteTask, showEditPane = props.showEditPane, task = props.task, style = props.style, dragTargetRef = props.dragTargetRef, elementRef = props.elementRef;
|
|
28
|
+
var _b = React.useState(false), optionMenuVisible = _b[0], setOptionMenuVisible = _b[1];
|
|
29
|
+
var _c = React.useState(false), confirmTaskDeleteVisible = _c[0], setConfirmTaskDeleteVisible = _c[1];
|
|
30
|
+
var _d = React.useState(false), showTaskPreviewPane = _d[0], setShowTaskPreviewPane = _d[1];
|
|
31
|
+
var popupRef = React.useRef(null);
|
|
32
|
+
var localization = useLocalization();
|
|
33
|
+
var optionButtons = [
|
|
34
|
+
{
|
|
35
|
+
text: localization.toLanguageString(taskBoardEditCardButton, messages[taskBoardEditCardButton]),
|
|
36
|
+
icon: 'edit',
|
|
37
|
+
data: function () {
|
|
38
|
+
showEditPane(task);
|
|
39
|
+
setOptionMenuVisible(!optionMenuVisible);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
text: localization.toLanguageString(taskBoardDeleteCardButton, messages[taskBoardDeleteCardButton]),
|
|
44
|
+
icon: 'delete',
|
|
45
|
+
data: function () {
|
|
46
|
+
setConfirmTaskDeleteVisible(!confirmTaskDeleteVisible);
|
|
47
|
+
setOptionMenuVisible(!optionMenuVisible);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
];
|
|
51
|
+
var handleSelect = function (e) {
|
|
52
|
+
e.item.data();
|
|
53
|
+
};
|
|
54
|
+
var onShowMenu = function () {
|
|
55
|
+
setOptionMenuVisible(true);
|
|
56
|
+
};
|
|
57
|
+
var onHideMenu = function () {
|
|
58
|
+
setOptionMenuVisible(false);
|
|
59
|
+
};
|
|
60
|
+
var onMenuButtonBlur = function (event) {
|
|
61
|
+
var popup = popupRef.current && popupRef.current.element;
|
|
62
|
+
if (popup && popup.contains(event.relatedTarget)) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
setOptionMenuVisible(false);
|
|
66
|
+
};
|
|
67
|
+
var closeConfirmDialog = function () {
|
|
68
|
+
setConfirmTaskDeleteVisible(!confirmTaskDeleteVisible);
|
|
69
|
+
};
|
|
70
|
+
var onShowTaskPreviewPane = function () {
|
|
71
|
+
setShowTaskPreviewPane(!showTaskPreviewPane);
|
|
72
|
+
};
|
|
73
|
+
var onTaskEdit = function () {
|
|
74
|
+
showEditPane(task);
|
|
75
|
+
onShowTaskPreviewPane();
|
|
76
|
+
};
|
|
77
|
+
if (task.isPlaceholder && dragTargetRef && dragTargetRef.current) {
|
|
78
|
+
return (React.createElement("div", __assign({ style: { width: dragTargetRef.current.width, height: dragTargetRef.current.height }, className: 'k-taskboard-drag-placeholder' }, (_a = {}, _a[TASKBOARD_PLACEHOLDER] = true, _a))));
|
|
79
|
+
}
|
|
80
|
+
return (React.createElement(props.cardComponent, { task: task, style: style, tabIndex: props.tabIndex, disabled: props.disabled, elementRef: elementRef, showMenu: optionMenuVisible, showDeleteConfirm: confirmTaskDeleteVisible, showTaskPreviewPane: showTaskPreviewPane, menuItems: optionButtons, popupRef: popupRef, confirmDialogMessage: localization.toLanguageString(taskBoardDeleteTaskDialogMessage, messages[taskBoardDeleteTaskDialogMessage]), confirmDialogTitle: localization.toLanguageString(taskBoardDeleteTaskDialogTitle, messages[taskBoardDeleteTaskDialogTitle]), confirmDialogConfirmButton: localization.toLanguageString(taskBoardDeleteTaskConfirmButton, messages[taskBoardDeleteTaskConfirmButton]), confirmDialogCancelButton: localization.toLanguageString(taskBoardDeleteTaskCancelButton, messages[taskBoardDeleteTaskCancelButton]), previewDialogPriorityLabel: localization.toLanguageString(taskBoardPreviewPanePriorityLabel, messages[taskBoardPreviewPanePriorityLabel]), previewDialogDelete: localization.toLanguageString(taskBoardPreviewPaneDeleteBtn, messages[taskBoardPreviewPaneDeleteBtn]), previewDialogEdit: localization.toLanguageString(taskBoardPreviewPaneEditBtn, messages[taskBoardPreviewPaneEditBtn]), onShowPreviewPane: onShowTaskPreviewPane, onMenuItemSelect: handleSelect, onShowMenu: onShowMenu, onHideMenu: onHideMenu, onMenuButtonBlur: onMenuButtonBlur, onTaskDelete: onDeleteTask, onTaskEdit: onTaskEdit, onCloseConfirmDialog: closeConfirmDialog, card: Card, cardHeader: TaskBoardCardHeader, cardBody: TaskBoardCardBody, confirmDialog: TaskBoardConfirmDialog, previewDialog: TaskBoardPreviewDialog }));
|
|
81
|
+
};
|
|
82
|
+
var defaultProps = {};
|
|
83
|
+
TaskBoardCardBase.propTypes = {
|
|
84
|
+
task: PropTypes.object.isRequired
|
|
85
|
+
};
|
|
86
|
+
TaskBoardCardBase.defaultProps = defaultProps;
|
|
87
|
+
TaskBoardCardBase.displayName = 'KendoReactTaskBoardCardBase';
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { TaskBoardCardProps } from './card/Card';
|
|
3
|
+
import { TaskBoardColumnProps } from './column/Column';
|
|
4
|
+
import { TaskBoardColumnModel, TaskBoardPriority, TaskBoardTaskModel } from './TaskBoard';
|
|
5
|
+
/**
|
|
6
|
+
* Represents the props of the TaskBoardColumnBase component
|
|
7
|
+
*/
|
|
8
|
+
export interface TaskBoardColumnBaseProps {
|
|
9
|
+
/**
|
|
10
|
+
* The rendered column.
|
|
11
|
+
*/
|
|
12
|
+
column: TaskBoardColumnModel;
|
|
13
|
+
/**
|
|
14
|
+
* The rendered tasks.
|
|
15
|
+
*/
|
|
16
|
+
tasks: TaskBoardTaskModel[];
|
|
17
|
+
/**
|
|
18
|
+
* The rendered priorities.
|
|
19
|
+
*/
|
|
20
|
+
priorities: TaskBoardPriority[];
|
|
21
|
+
/**
|
|
22
|
+
* The applied styles.
|
|
23
|
+
*/
|
|
24
|
+
style?: React.CSSProperties;
|
|
25
|
+
/**
|
|
26
|
+
* Specifies the `tabIndex` that will be added to the TaskBoard Column and Card elements.
|
|
27
|
+
*/
|
|
28
|
+
tabIndex?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Specifies the element reference.
|
|
31
|
+
*/
|
|
32
|
+
elementRef?: React.RefObject<HTMLDivElement>;
|
|
33
|
+
/**
|
|
34
|
+
* Specifies the width and height of the drag target reference.
|
|
35
|
+
*/
|
|
36
|
+
dragTargetRef?: React.RefObject<{
|
|
37
|
+
width: number;
|
|
38
|
+
height: number;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Fires when a task is created.
|
|
42
|
+
*/
|
|
43
|
+
onTaskCreate: (task: TaskBoardTaskModel) => void;
|
|
44
|
+
/**
|
|
45
|
+
* Fires when a task is edited.
|
|
46
|
+
*/
|
|
47
|
+
onTaskEdit: (task: TaskBoardTaskModel, prevTask: TaskBoardTaskModel) => void;
|
|
48
|
+
/**
|
|
49
|
+
* Fires when a task is deleted.
|
|
50
|
+
*/
|
|
51
|
+
onTaskDelete: (task: TaskBoardTaskModel) => void;
|
|
52
|
+
/**
|
|
53
|
+
* Fires when a column is changed.
|
|
54
|
+
*/
|
|
55
|
+
onColumnChange: (column: TaskBoardColumnModel, prevColumn: TaskBoardColumnModel) => void;
|
|
56
|
+
/**
|
|
57
|
+
* Determines the TaskBoardCard component.
|
|
58
|
+
*/
|
|
59
|
+
cardComponent: React.ComponentType<TaskBoardCardProps>;
|
|
60
|
+
/**
|
|
61
|
+
* Determines the TaskBoardColumn component.
|
|
62
|
+
*/
|
|
63
|
+
columnComponent: React.ComponentType<TaskBoardColumnProps>;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Represents the TaskBoardColumnBase component.
|
|
67
|
+
*/
|
|
68
|
+
export declare const TaskBoardColumnBase: {
|
|
69
|
+
(props: TaskBoardColumnBaseProps): JSX.Element;
|
|
70
|
+
defaultProps: {};
|
|
71
|
+
displayName: string;
|
|
72
|
+
};
|