office-ui-fabric-react
Version:
Reusable React components for building experiences for Office 365.
204 lines • 8.78 kB
JavaScript
import * as tslib_1 from "tslib";
import { BaseComponent } from '../../Utilities';
import { Selection } from '../../Selection';
var BaseSelectedItemsList = /** @class */ (function (_super) {
tslib_1.__extends(BaseSelectedItemsList, _super);
function BaseSelectedItemsList(basePickerProps) {
var _this = _super.call(this, basePickerProps) || this;
_this.addItems = function (items) {
// tslint:disable-next-line:no-any
var processedItems = _this.props.onItemSelected ? _this.props.onItemSelected(items) : items;
var processedItemObjects = processedItems;
var processedItemPromiseLikes = processedItems;
if (processedItemPromiseLikes && processedItemPromiseLikes.then) {
processedItemPromiseLikes.then(function (resolvedProcessedItems) {
var newItems = _this.state.items.concat(resolvedProcessedItems);
_this.updateItems(newItems);
});
}
else {
var newItems = _this.state.items.concat(processedItemObjects);
_this.updateItems(newItems);
}
_this.setState({ suggestedDisplayValue: '' });
};
_this.removeItemAt = function (index) {
var items = _this.state.items;
// tslint:disable-next-line:no-any
if (index > -1) {
if (_this.props.onItemDeleted) {
_this.props.onItemDeleted(items[index]);
}
var newItems = items.slice(0, index).concat(items.slice(index + 1));
_this.updateItems(newItems);
}
};
_this.removeItem = function (item) {
var items = _this.state.items;
var index = items.indexOf(item);
_this.removeItemAt(index);
};
// tslint:disable-next-line:no-any
_this.removeItems = function (itemsToRemove) {
var items = _this.state.items;
// tslint:disable-next-line:no-any
var newItems = items.filter(function (item) { return itemsToRemove.indexOf(item) === -1; });
var firstItemToRemove = itemsToRemove[0];
var index = items.indexOf(firstItemToRemove);
if (_this.props.onItemDeleted) {
itemsToRemove.forEach(function (item) {
_this.props.onItemDeleted(item);
});
}
_this.updateItems(newItems, index);
};
_this.onCopy = function (ev) {
if (_this.props.onCopyItems && _this.selection.getSelectedCount() > 0) {
var selectedItems = _this.selection.getSelection();
_this.copyItems(selectedItems);
}
};
_this.renderItems = function () {
var removeButtonAriaLabel = _this.props.removeButtonAriaLabel;
var onRenderItem = _this.props.onRenderItem;
var items = _this.state.items;
// tslint:disable-next-line:no-any
return items.map(function (item, index) { return onRenderItem({
item: item,
index: index,
key: item.key ? item.key : index,
selected: _this.selection.isIndexSelected(index),
onRemoveItem: function () { return _this.removeItem(item); },
onItemChange: _this.onItemChange,
removeButtonAriaLabel: removeButtonAriaLabel,
onCopyItem: function (itemToCopy) { return _this.copyItems([itemToCopy]); },
}); });
};
_this.onSelectionChanged = function () {
_this.forceUpdate();
};
_this.onKeyDown = function (ev) {
switch (ev.which) {
case 8 /* backspace */:
ev.stopPropagation();
_this.onBackspace(ev);
break;
case 46 /* del */:
_this.onBackspace(ev);
}
};
_this.onItemChange = function (changedItem, index) {
var items = _this.state.items;
if (index >= 0) {
var newItems = items;
newItems[index] = changedItem;
_this.updateItems(newItems);
}
};
var items = basePickerProps.selectedItems || basePickerProps.defaultSelectedItems || [];
_this.state = {
items: items,
};
// Create a new selection if one is not specified
_this.selection = _this.props.selection
? _this.props.selection
: new Selection({ onSelectionChanged: _this.onSelectionChanged });
return _this;
}
Object.defineProperty(BaseSelectedItemsList.prototype, "items", {
get: function () {
return this.state.items;
},
enumerable: true,
configurable: true
});
/**
* Controls what happens whenever there is an action that impacts the selected items.
* If selectedItems is provided as a property then this will act as a controlled component and it will not update it's own state.
*/
BaseSelectedItemsList.prototype.updateItems = function (items, focusIndex) {
var _this = this;
if (this.props.selectedItems) {
// If the component is a controlled component then the controlling component will need
this.onChange(items);
}
else {
this.setState({ items: items }, function () {
_this._onSelectedItemsUpdated(items, focusIndex);
});
}
};
BaseSelectedItemsList.prototype.unselectAll = function () {
this.selection.setAllSelected(false);
};
BaseSelectedItemsList.prototype.componentWillUpdate = function (newProps, newState) {
if (newState.items && newState.items !== this.state.items) {
this.selection.setItems(newState.items);
}
};
BaseSelectedItemsList.prototype.componentDidMount = function () {
this.selection.setItems(this.state.items);
};
BaseSelectedItemsList.prototype.componentWillReceiveProps = function (newProps) {
var newItems = newProps.selectedItems;
if (newItems) {
this.setState({ items: newProps.selectedItems });
}
if (newProps.selection) {
this.selection = newProps.selection;
}
};
// tslint:disable-next-line:no-any
BaseSelectedItemsList.prototype.render = function () {
return this.renderItems();
};
BaseSelectedItemsList.prototype.onChange = function (items) {
if (this.props.onChange) {
this.props.onChange(items);
}
};
// This is protected because we may expect the backspace key to work differently in a different kind of picker.
// This lets the subclass override it and provide it's own onBackspace. For an example see the BasePickerListBelow
BaseSelectedItemsList.prototype.onBackspace = function (ev) {
if (this.state.items.length) {
if (this.selection.getSelectedCount() > 0) {
this.removeItems(this.selection.getSelection());
}
else {
this.removeItem(this.state.items[this.state.items.length - 1]);
}
}
};
BaseSelectedItemsList.prototype.copyItems = function (items) {
if (this.props.onCopyItems) {
// tslint:disable-next-line:no-any
var copyText = this.props.onCopyItems(items);
var copyInput = document.createElement('input');
document.body.appendChild(copyInput);
try {
// Try to copy the text directly to the clipboard
copyInput.value = copyText;
copyInput.select();
if (!document.execCommand('copy')) {
// The command failed. Fallback to the method below.
throw new Error();
}
}
catch (err) {
// no op
}
finally {
document.body.removeChild(copyInput);
}
}
};
BaseSelectedItemsList.prototype._isFocusZoneInnerKeystroke = function (ev) {
return false;
};
BaseSelectedItemsList.prototype._onSelectedItemsUpdated = function (items, focusIndex) {
this.onChange(items);
};
return BaseSelectedItemsList;
}(BaseComponent));
export { BaseSelectedItemsList };
//# sourceMappingURL=BaseSelectedItemsList.js.map