@uifabric/experiments
Version:
Experimental React components for building experiences for Microsoft 365.
98 lines • 6.01 kB
JavaScript
var _this = this;
import { __assign } from "tslib";
import * as React from 'react';
import { styled, classNamesFunction, css, EventGroup, } from 'office-ui-fabric-react/lib/Utilities';
import { Persona, PersonaSize } from 'office-ui-fabric-react/lib/Persona';
import { getStyles } from './SelectedPersona.styles';
import { IconButton } from 'office-ui-fabric-react/lib/Button';
import { useId } from '@uifabric/react-hooks';
var getClassNames = classNamesFunction();
var DEFAULT_DROPPING_CSS_CLASS = 'is-dropping';
/**
* A selected persona with support for item removal and expansion.
*
* To use the removal / expansion, bind isValid / canExpand / getExpandedItems
* when passing the onRenderItem to your SelectedItemsList
*/
var SelectedPersonaInner = React.memo(function (props) {
var item = props.item, onRemoveItem = props.onRemoveItem, onItemChange = props.onItemChange, removeButtonAriaLabel = props.removeButtonAriaLabel, index = props.index, selected = props.selected, isValid = props.isValid, canExpand = props.canExpand, getExpandedItems = props.getExpandedItems, styles = props.styles, theme = props.theme, dragDropHelper = props.dragDropHelper, dragDropEvents = props.dragDropEvents, eventsToRegister = props.eventsToRegister;
var itemId = useId();
var _a = React.useState(false), isDropping = _a[0], setIsDropping = _a[1];
var _b = React.useState(''), droppingClassNames = _b[0], setDroppingClassNames = _b[1];
var rootRef = React.useRef(null);
React.useEffect(function () {
var _a;
var _updateDroppingState = function (newValue, event) {
if (!newValue) {
if (dragDropEvents.onDragLeave) {
dragDropEvents.onDragLeave(item, event);
}
}
else if (dragDropEvents.onDragEnter) {
setDroppingClassNames(dragDropEvents.onDragEnter(item, event));
}
if (isDropping !== newValue) {
setIsDropping(newValue);
}
};
var dragDropOptions = __assign(__assign({ eventMap: eventsToRegister, selectionIndex: index, context: { data: item, index: index } }, dragDropEvents), { updateDropState: _updateDroppingState });
var events = new EventGroup(_this);
var subscription = (_a = dragDropHelper) === null || _a === void 0 ? void 0 : _a.subscribe(rootRef.current, events, dragDropOptions);
return function () {
var _a;
(_a = subscription) === null || _a === void 0 ? void 0 : _a.dispose();
events.dispose();
};
},
// eslint-disable-next-line react-hooks/exhaustive-deps -- this is the only dependency which matters
[dragDropHelper]);
var isDraggable = React.useMemo(function () { return (dragDropEvents && dragDropEvents.canDrag ? !!dragDropEvents.canDrag() : undefined); }, [dragDropEvents]);
var droppingClassName = React.useMemo(function () { return (isDropping ? droppingClassNames || DEFAULT_DROPPING_CSS_CLASS : ''); }, [isDropping, droppingClassNames]);
var onExpandClicked = React.useCallback(function (ev) {
ev.stopPropagation();
ev.preventDefault();
if (onItemChange && getExpandedItems) {
getExpandedItems(item)
.then(function (value) {
onItemChange(value, index);
})
.catch(function (error) {
// No op
});
}
}, [onItemChange, getExpandedItems, item, index]);
var onRemoveClicked = React.useCallback(function (ev) {
ev.stopPropagation();
ev.preventDefault();
onRemoveItem && onRemoveItem();
}, [onRemoveItem]);
var classNames = React.useMemo(function () {
return getClassNames(styles, {
isSelected: selected || false,
isValid: isValid ? isValid(item) : true,
theme: theme,
droppingClassName: droppingClassName,
});
},
// TODO: evaluate whether to add deps on `item` and `styles`
// eslint-disable-next-line react-hooks/exhaustive-deps
[selected, isValid, theme]);
var coinProps = {};
return (React.createElement("div", __assign({ ref: rootRef }, (typeof isDraggable === 'boolean'
? {
'data-is-draggable': isDraggable,
draggable: isDraggable,
}
: {}), { onContextMenu: props.onContextMenu, onClick: props.onClick, className: css('ms-PickerPersona-container', classNames.personaContainer), "data-is-focusable": true, "data-is-sub-focuszone": true, "data-selection-index": index, role: 'listitem', "aria-labelledby": 'selectedItemPersona-' + itemId }),
React.createElement("div", { hidden: !canExpand || !canExpand(item) || !getExpandedItems },
React.createElement(IconButton, { onClick: onExpandClicked, iconProps: { iconName: 'Add', style: { fontSize: '14px' } }, className: css('ms-PickerItem-removeButton', classNames.expandButton), styles: classNames.subComponentStyles.actionButtonStyles(), ariaLabel: removeButtonAriaLabel })),
React.createElement("div", { className: css(classNames.personaWrapper) },
React.createElement("div", { className: css('ms-PickerItem-content', classNames.itemContentWrapper), id: 'selectedItemPersona-' + itemId },
React.createElement(Persona, __assign({}, item, { size: PersonaSize.size32, styles: classNames.subComponentStyles.personaStyles, coinProps: coinProps }))),
React.createElement(IconButton, { onClick: onRemoveClicked, iconProps: { iconName: 'Cancel', style: { fontSize: '14px' } }, className: css('ms-PickerItem-removeButton', classNames.removeButton), styles: classNames.subComponentStyles.actionButtonStyles(), ariaLabel: removeButtonAriaLabel }))));
});
// export casting back to typeof inner to preserve generics.
export var SelectedPersona = styled(SelectedPersonaInner, getStyles, undefined, {
scope: 'SelectedPersona',
});
//# sourceMappingURL=SelectedPersona.js.map