office-ui-fabric-react
Version:
Reusable React components for building experiences for Office 365.
524 lines • 28.8 kB
JavaScript
define(["require", "exports", "tslib", "react", "office-ui-fabric-react/lib/Link", "office-ui-fabric-react/lib/TextField", "office-ui-fabric-react/lib/CommandBar", "office-ui-fabric-react/lib/ContextualMenu", "office-ui-fabric-react/lib/Utilities", "office-ui-fabric-react/lib/DetailsList", "@uifabric/example-app-base", "./DetailsList.Advanced.Example.scss"], function (require, exports, tslib_1, React, Link_1, TextField_1, CommandBar_1, ContextualMenu_1, Utilities_1, DetailsList_1, example_app_base_1) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var DEFAULT_ITEM_LIMIT = 5;
var PAGING_SIZE = 10;
var PAGING_DELAY = 5000;
var ITEMS_COUNT = 5000;
var _items;
var DetailsListAdvancedExample = /** @class */ (function (_super) {
tslib_1.__extends(DetailsListAdvancedExample, _super);
function DetailsListAdvancedExample(props) {
var _this = _super.call(this, props) || this;
if (!_items) {
_items = example_app_base_1.createListItems(ITEMS_COUNT);
}
_this._selection = new DetailsList_1.Selection();
_this._selection.setItems(_items, false);
_this.state = {
items: _items,
groups: undefined,
groupItemLimit: DEFAULT_ITEM_LIMIT,
layoutMode: DetailsList_1.DetailsListLayoutMode.justified,
constrainMode: DetailsList_1.ConstrainMode.horizontalConstrained,
selectionMode: DetailsList_1.SelectionMode.multiple,
canResizeColumns: true,
checkboxVisibility: DetailsList_1.CheckboxVisibility.onHover,
columns: _this._buildColumns(_items, true, _this._onColumnClick, '', undefined, undefined, _this._onColumnContextMenu),
contextualMenuProps: undefined,
sortedColumnKey: 'name',
isSortedDescending: false,
isLazyLoaded: false,
isHeaderVisible: true
};
return _this;
}
DetailsListAdvancedExample.prototype.render = function () {
var _a = this.state, checkboxVisibility = _a.checkboxVisibility, columns = _a.columns, constrainMode = _a.constrainMode, contextualMenuProps = _a.contextualMenuProps, groupItemLimit = _a.groupItemLimit, groups = _a.groups, isHeaderVisible = _a.isHeaderVisible, items = _a.items, layoutMode = _a.layoutMode, selectionMode = _a.selectionMode;
var isGrouped = groups && groups.length > 0;
var groupProps = {
getGroupItemLimit: function (group) {
if (group) {
return group.isShowingAll ? group.count : Math.min(group.count, groupItemLimit);
}
else {
return items.length;
}
},
footerProps: {
showAllLinkText: 'Show all'
}
};
return (React.createElement("div", { className: 'ms-DetailsListAdvancedExample' },
React.createElement(CommandBar_1.CommandBar, { items: this._getCommandItems() }),
(isGrouped) ?
React.createElement(TextField_1.TextField, { label: 'Group Item Limit', onChanged: this._onItemLimitChanged }) :
(null),
React.createElement(DetailsList_1.DetailsList, { setKey: 'items', items: items, groups: groups, columns: columns, checkboxVisibility: checkboxVisibility, layoutMode: layoutMode, isHeaderVisible: isHeaderVisible, selectionMode: selectionMode, constrainMode: constrainMode, groupProps: groupProps, onItemInvoked: this._onItemInvoked, onItemContextMenu: this._onItemContextMenu, ariaLabelForListHeader: 'Column headers. Use menus to perform column operations like sort and filter', ariaLabelForSelectAllCheckbox: 'Toggle selection for all items', ariaLabelForSelectionColumn: 'Toggle selection', onRenderMissingItem: this._onRenderMissingItem }),
contextualMenuProps && (React.createElement(ContextualMenu_1.ContextualMenu, tslib_1.__assign({}, contextualMenuProps)))));
};
DetailsListAdvancedExample.prototype._onDataMiss = function (index) {
var _this = this;
index = Math.floor(index / PAGING_SIZE) * PAGING_SIZE;
if (!this._isFetchingItems) {
this._isFetchingItems = true;
setTimeout(function () {
_this._isFetchingItems = false;
var itemsCopy = [].concat(_this.state.items);
itemsCopy.splice.apply(itemsCopy, [index, PAGING_SIZE].concat(_items.slice(index, index + PAGING_SIZE)));
_this.setState({
items: itemsCopy
});
}, PAGING_DELAY);
}
};
DetailsListAdvancedExample.prototype._onRenderMissingItem = function (index) {
this._onDataMiss(index);
return null;
};
DetailsListAdvancedExample.prototype._onToggleLazyLoad = function () {
var isLazyLoaded = this.state.isLazyLoaded;
isLazyLoaded = !isLazyLoaded;
this.setState({
isLazyLoaded: isLazyLoaded,
items: isLazyLoaded ? _items.slice(0, PAGING_SIZE).concat(new Array(ITEMS_COUNT - PAGING_SIZE)) : _items
});
};
DetailsListAdvancedExample.prototype._onToggleResizing = function () {
var _a = this.state, items = _a.items, sortedColumnKey = _a.sortedColumnKey, isSortedDescending = _a.isSortedDescending;
var canResizeColumns = this.state.canResizeColumns;
canResizeColumns = !canResizeColumns;
this.setState({
canResizeColumns: canResizeColumns,
columns: this._buildColumns(items, canResizeColumns, this._onColumnClick, sortedColumnKey, isSortedDescending)
});
};
DetailsListAdvancedExample.prototype._onLayoutChanged = function (ev, menuItem) {
this.setState({
layoutMode: menuItem.data
});
};
DetailsListAdvancedExample.prototype._onConstrainModeChanged = function (ev, menuItem) {
this.setState({
constrainMode: menuItem.data
});
};
DetailsListAdvancedExample.prototype._onSelectionChanged = function (ev, menuItem) {
this.setState({
selectionMode: menuItem.data
});
};
DetailsListAdvancedExample.prototype._onItemLimitChanged = function (value) {
var newValue = parseInt(value, 10);
if (isNaN(newValue)) {
newValue = DEFAULT_ITEM_LIMIT;
}
this.setState({
groupItemLimit: newValue
});
};
DetailsListAdvancedExample.prototype._getCommandItems = function () {
var _this = this;
var _a = this.state, canResizeColumns = _a.canResizeColumns, checkboxVisibility = _a.checkboxVisibility, constrainMode = _a.constrainMode, isHeaderVisible = _a.isHeaderVisible, isLazyLoaded = _a.isLazyLoaded, layoutMode = _a.layoutMode, selectionMode = _a.selectionMode;
return [
{
key: 'addRow',
name: 'Insert row',
icon: 'Add',
onClick: this._onAddRow
},
{
key: 'deleteRow',
name: 'Delete row',
icon: 'Delete',
onClick: this._onDeleteRow
},
{
key: 'configure',
name: 'Configure',
icon: 'Settings',
subMenuProps: {
items: [
{
key: 'resizing',
name: 'Allow column resizing',
canCheck: true,
checked: canResizeColumns,
onClick: this._onToggleResizing
},
{
key: 'headerVisible',
name: 'Is header visible',
canCheck: true,
checked: isHeaderVisible,
onClick: function () { return _this.setState({ isHeaderVisible: !isHeaderVisible }); }
},
{
key: 'lazyload',
name: 'Simulate async loading',
canCheck: true,
checked: isLazyLoaded,
onClick: this._onToggleLazyLoad
},
{
key: 'dash',
name: '-'
},
{
key: 'checkboxVisibility',
name: 'Checkbox visibility',
subMenuProps: {
items: [
{
key: 'checkboxVisibility.always',
name: 'Always',
canCheck: true,
isChecked: checkboxVisibility === DetailsList_1.CheckboxVisibility.always,
onClick: function () { return _this.setState({ checkboxVisibility: DetailsList_1.CheckboxVisibility.always }); }
},
{
key: 'checkboxVisibility.onHover',
name: 'On hover',
canCheck: true,
isChecked: checkboxVisibility === DetailsList_1.CheckboxVisibility.onHover,
onClick: function () { return _this.setState({ checkboxVisibility: DetailsList_1.CheckboxVisibility.onHover }); }
},
{
key: 'checkboxVisibility.hidden',
name: 'Hidden',
canCheck: true,
isChecked: checkboxVisibility === DetailsList_1.CheckboxVisibility.hidden,
onClick: function () { return _this.setState({ checkboxVisibility: DetailsList_1.CheckboxVisibility.hidden }); }
},
]
}
},
{
key: 'layoutMode',
name: 'Layout mode',
subMenuProps: {
items: [
{
key: DetailsList_1.DetailsListLayoutMode[DetailsList_1.DetailsListLayoutMode.fixedColumns],
name: 'Fixed columns',
canCheck: true,
checked: layoutMode === DetailsList_1.DetailsListLayoutMode.fixedColumns,
onClick: this._onLayoutChanged,
data: DetailsList_1.DetailsListLayoutMode.fixedColumns
},
{
key: DetailsList_1.DetailsListLayoutMode[DetailsList_1.DetailsListLayoutMode.justified],
name: 'Justified columns',
canCheck: true,
checked: layoutMode === DetailsList_1.DetailsListLayoutMode.justified,
onClick: this._onLayoutChanged,
data: DetailsList_1.DetailsListLayoutMode.justified
}
]
}
},
{
key: 'selectionMode',
name: 'Selection mode',
subMenuProps: {
items: [
{
key: DetailsList_1.SelectionMode[DetailsList_1.SelectionMode.none],
name: 'None',
canCheck: true,
checked: selectionMode === DetailsList_1.SelectionMode.none,
onClick: this._onSelectionChanged,
data: DetailsList_1.SelectionMode.none
},
{
key: DetailsList_1.SelectionMode[DetailsList_1.SelectionMode.single],
name: 'Single select',
canCheck: true,
checked: selectionMode === DetailsList_1.SelectionMode.single,
onClick: this._onSelectionChanged,
data: DetailsList_1.SelectionMode.single
},
{
key: DetailsList_1.SelectionMode[DetailsList_1.SelectionMode.multiple],
name: 'Multi select',
canCheck: true,
checked: selectionMode === DetailsList_1.SelectionMode.multiple,
onClick: this._onSelectionChanged,
data: DetailsList_1.SelectionMode.multiple
},
]
}
},
{
key: 'constrainMode',
name: 'Constrain mode',
subMenuProps: {
items: [
{
key: DetailsList_1.ConstrainMode[DetailsList_1.ConstrainMode.unconstrained],
name: 'Unconstrained',
canCheck: true,
checked: constrainMode === DetailsList_1.ConstrainMode.unconstrained,
onClick: this._onConstrainModeChanged,
data: DetailsList_1.ConstrainMode.unconstrained
},
{
key: DetailsList_1.ConstrainMode[DetailsList_1.ConstrainMode.horizontalConstrained],
name: 'Horizontal constrained',
canCheck: true,
checked: constrainMode === DetailsList_1.ConstrainMode.horizontalConstrained,
onClick: this._onConstrainModeChanged,
data: DetailsList_1.ConstrainMode.horizontalConstrained
}
]
}
}
]
}
}
];
};
DetailsListAdvancedExample.prototype._getContextualMenuProps = function (ev, column) {
var _this = this;
var items = [
{
key: 'aToZ',
name: 'A to Z',
icon: 'SortUp',
canCheck: true,
checked: column.isSorted && !column.isSortedDescending,
onClick: function () { return _this._onSortColumn(column.key, false); }
},
{
key: 'zToA',
name: 'Z to A',
icon: 'SortDown',
canCheck: true,
checked: column.isSorted && column.isSortedDescending,
onClick: function () { return _this._onSortColumn(column.key, true); }
}
];
if (example_app_base_1.isGroupable(column.key)) {
items.push({
key: 'groupBy',
name: 'Group By ' + column.name,
icon: 'GroupedDescending',
canCheck: true,
checked: column.isGrouped,
onClick: function () { return _this._onGroupByColumn(column); }
});
}
return {
items: items,
target: ev.currentTarget,
directionalHint: 4 /* bottomLeftEdge */,
gapSpace: 10,
isBeakVisible: true,
onDismiss: this._onContextualMenuDismissed
};
};
DetailsListAdvancedExample.prototype._onItemInvoked = function (item, index) {
console.log('Item invoked', item, index);
};
DetailsListAdvancedExample.prototype._onItemContextMenu = function (item, index, ev) {
if (ev.target.nodeName === 'A') {
return true;
}
console.log('Item context menu invoked', item, index);
};
DetailsListAdvancedExample.prototype._onColumnClick = function (ev, column) {
if (column.columnActionsMode !== DetailsList_1.ColumnActionsMode.disabled) {
this.setState({
contextualMenuProps: this._getContextualMenuProps(ev, column)
});
}
};
DetailsListAdvancedExample.prototype._onColumnContextMenu = function (column, ev) {
if (column.columnActionsMode !== DetailsList_1.ColumnActionsMode.disabled) {
this.setState({
contextualMenuProps: this._getContextualMenuProps(ev, column)
});
}
};
DetailsListAdvancedExample.prototype._onContextualMenuDismissed = function () {
this.setState({
contextualMenuProps: undefined
});
};
DetailsListAdvancedExample.prototype._onSortColumn = function (key, isSortedDescending) {
var sortedItems = _items.slice(0).sort(function (a, b) { return (isSortedDescending ? a[key] < b[key] : a[key] > b[key]) ? 1 : -1; });
this.setState({
items: sortedItems,
groups: undefined,
columns: this._buildColumns(sortedItems, true, this._onColumnClick, key, isSortedDescending, undefined, this._onColumnContextMenu),
isSortedDescending: isSortedDescending,
sortedColumnKey: key
});
};
DetailsListAdvancedExample.prototype._onGroupByColumn = function (column) {
var key = column.key, isGrouped = column.isGrouped;
var _a = this.state, sortedColumnKey = _a.sortedColumnKey, isSortedDescending = _a.isSortedDescending, groups = _a.groups, items = _a.items, columns = _a.columns;
if (isGrouped) {
this._onSortColumn(sortedColumnKey, !!isSortedDescending);
}
else {
var groupedItems = [];
var newGroups = null;
if (groups) {
newGroups = groups.concat([]);
groupedItems = this._groupByKey(newGroups, items, key);
}
else {
groupedItems = this._groupItems(items, key);
newGroups = this._getGroups(groupedItems, key);
}
var newColumns = columns;
newColumns.filter(function (matchColumn) { return matchColumn.key === key; }).forEach(function (groupedColumn) {
groupedColumn.isGrouped = true;
});
this.setState({
items: groupedItems,
columns: newColumns,
groups: newGroups
});
}
};
DetailsListAdvancedExample.prototype._groupByKey = function (groups, items, key) {
var _this = this;
var groupedItems = [];
if (groups) {
groups.forEach(function (group) {
if (group.children && group.children.length > 0) {
var childGroupedItems = _this._groupByKey(group.children, items, key);
groupedItems = groupedItems.concat(childGroupedItems);
}
else {
var itemsInGroup = items.slice(group.startIndex, group.startIndex + group.count);
var nextLevelGroupedItems = _this._groupItems(itemsInGroup, key);
groupedItems = groupedItems.concat(nextLevelGroupedItems);
group.children = _this._getGroups(nextLevelGroupedItems, key, group);
}
});
}
return groupedItems;
};
DetailsListAdvancedExample.prototype._groupItems = function (items, columnKey) {
return items.slice(0).sort(function (a, b) { return ((a[columnKey] < b[columnKey]) ? -1 : 1); });
};
DetailsListAdvancedExample.prototype._getGroups = function (groupedItems, key, parentGroup) {
var _this = this;
var separator = '-';
var groups = groupedItems.reduce(function (current, item, index) {
var currentGroup = current[current.length - 1];
if (!currentGroup || (_this._getLeafGroupKey(currentGroup.key, separator) !== item[key])) {
current.push({
key: (parentGroup ? parentGroup.key + separator : '') + item[key],
name: key + ': ' + item[key],
startIndex: parentGroup ? parentGroup.startIndex + index : index,
count: 1,
level: parentGroup ? parentGroup.level + 1 : 0
});
}
else {
currentGroup.count++;
}
return current;
}, []);
return groups;
};
DetailsListAdvancedExample.prototype._getLeafGroupKey = function (key, separator) {
var leafKey = key;
if (key.indexOf(separator) !== -1) {
var arrKeys = key.split(separator);
leafKey = arrKeys[arrKeys.length - 1];
}
return leafKey;
};
DetailsListAdvancedExample.prototype._onAddRow = function () {
this.setState({
items: example_app_base_1.createListItems(1).concat(this.state.items)
});
};
DetailsListAdvancedExample.prototype._onDeleteRow = function () {
this.setState({
items: this.state.items.slice(1)
});
};
DetailsListAdvancedExample.prototype._buildColumns = function (items, canResizeColumns, onColumnClick, sortedColumnKey, isSortedDescending, groupedColumnKey, onColumnContextMenu) {
var columns = DetailsList_1.buildColumns(items, canResizeColumns, onColumnClick, sortedColumnKey, isSortedDescending, groupedColumnKey);
columns.forEach(function (column) {
column.onColumnContextMenu = onColumnContextMenu;
column.ariaLabel = "Operations for " + column.name;
if (column.key === 'thumbnail') {
column.iconName = 'Picture';
column.isIconOnly = true;
}
else if (column.key === 'description') {
column.isMultiline = true;
column.minWidth = 200;
}
else if (column.key === 'name') {
column.onRender = function (item) { return (React.createElement(Link_1.Link, { "data-selection-invoke": true }, item.name)); };
}
else if (column.key === 'key') {
column.columnActionsMode = DetailsList_1.ColumnActionsMode.disabled;
column.onRender = function (item) { return (React.createElement(Link_1.Link, { href: '#' }, item.key)); };
column.minWidth = 90;
column.maxWidth = 90;
}
});
return columns;
};
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onRenderMissingItem", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onToggleLazyLoad", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onToggleResizing", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onLayoutChanged", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onConstrainModeChanged", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onSelectionChanged", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onItemLimitChanged", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onItemInvoked", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onItemContextMenu", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onColumnClick", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onColumnContextMenu", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onContextualMenuDismissed", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onSortColumn", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onGroupByColumn", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onAddRow", null);
tslib_1.__decorate([
Utilities_1.autobind
], DetailsListAdvancedExample.prototype, "_onDeleteRow", null);
return DetailsListAdvancedExample;
}(React.Component));
exports.DetailsListAdvancedExample = DetailsListAdvancedExample;
});
//# sourceMappingURL=DetailsList.Advanced.Example.js.map