-
Notifications
You must be signed in to change notification settings - Fork 2.8k
/
Copy pathSelectedPeopleList.DragDropBetweenWells.Example.tsx
124 lines (109 loc) · 4.07 KB
/
SelectedPeopleList.DragDropBetweenWells.Example.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import * as React from 'react';
import { PrimaryButton } from '@fluentui/react/lib/compat/Button';
import { IPersona, IPersonaProps } from '@fluentui/react/lib/Persona';
import { people } from '@fluentui/example-data';
import { SelectedPeopleList } from '@fluentui/react-experiments/lib/SelectedItemsList';
import { DragDropHelper } from '@fluentui/react/lib/DragDrop';
import { getTheme } from '@fluentui/react/lib/Styling';
import { mergeStyles } from '@uifabric/merge-styles';
import { IDragDropEvents, Selection } from '@fluentui/react';
const SelectedPeopleListBasicDragDropExample = <T extends {}>(): JSX.Element => {
const [index, setIndex] = React.useState(0);
const [currentSelectedItems, setCurrentSelectedItems] = React.useState<IPersona[]>([people[40]]);
const selection = new Selection();
const dragDropHelper = new DragDropHelper({
selection: selection,
minimumPixelsForDrag: 5,
});
const theme = getTheme();
const dragEnterClass = mergeStyles({
backgroundColor: theme.palette.neutralLight,
});
const _insertBeforeItem = (item: T, itemToInsert: IPersona): void => {
const draggedItems = [itemToInsert];
const insertIndex = currentSelectedItems.indexOf(item);
const items = currentSelectedItems.filter(current => draggedItems.indexOf(current) === -1);
items.splice(insertIndex, 0, ...draggedItems);
setCurrentSelectedItems(items);
};
const _onDragEnter = (item?: any, event?: DragEvent): string => {
// return string is the css classes that will be added to the entering element.
return dragEnterClass;
};
const _onDrop = (item?: any, event?: DragEvent): void => {
if (event?.dataTransfer) {
event.preventDefault();
const data = event.dataTransfer.items;
for (let i = 0; i < data.length; i++) {
if (data[i].kind === 'string' && data[i].type === 'persona') {
data[i].getAsString((dropText: string) => {
people.forEach(suggestionItem => {
if (suggestionItem.text === dropText) {
_insertBeforeItem(item, suggestionItem);
}
});
});
}
}
}
};
const _onDragStart = (item?: any, itemIndex?: number, tempSelectedItems?: any[], event?: DragEvent): void => {
if (event) {
const dataList = event?.dataTransfer?.items;
const personaText = (item as IPersonaProps).text;
dataList?.add(personaText || '', 'persona');
}
};
const _onDragEnd = (item?: any, event?: DragEvent): void => {
if (event) {
const dataList = event?.dataTransfer?.items;
// Clear any remaining drag data
dataList?.clear();
}
};
const dragDropEvents: IDragDropEvents = {
canDrop: () => true,
canDrag: () => true,
onDragEnter: _onDragEnter,
onDragLeave: () => undefined,
onDrop: _onDrop,
onDragStart: _onDragStart,
onDragEnd: _onDragEnd,
};
const _onAddItemButtonClicked = React.useCallback(() => {
setCurrentSelectedItems([...currentSelectedItems, people[index]]);
setIndex(index + 1);
}, [currentSelectedItems, index]);
const _onItemsRemoved = React.useCallback(
(items: IPersona[]) => {
const currentSelectedItemsCopy = [...currentSelectedItems];
items.forEach(item => {
const indexToRemove = currentSelectedItemsCopy.indexOf(item);
currentSelectedItemsCopy.splice(indexToRemove, 1);
setCurrentSelectedItems([...currentSelectedItemsCopy]);
});
},
[currentSelectedItems],
);
return (
<div className={'ms-BasePicker-text'}>
<PrimaryButton text="Add another item" onClick={_onAddItemButtonClicked} />
<SelectedPeopleList
key={'normal'}
removeButtonAriaLabel={'Remove'}
selectedItems={currentSelectedItems}
onItemsRemoved={_onItemsRemoved}
dragDropHelper={dragDropHelper}
dragDropEvents={dragDropEvents}
/>
</div>
);
};
export const SelectedPeopleListDragDropBetweenWellsExample = (): JSX.Element => {
return (
<>
To: <SelectedPeopleListBasicDragDropExample />
CC: <SelectedPeopleListBasicDragDropExample />
</>
);
};