diff --git a/packages/react-table/src/demos/table-demos/ExpandCollapseAll.jsx b/packages/react-table/src/demos/table-demos/ExpandCollapseAll.jsx deleted file mode 100644 index 7582eeb493f..00000000000 --- a/packages/react-table/src/demos/table-demos/ExpandCollapseAll.jsx +++ /dev/null @@ -1,152 +0,0 @@ -import React from 'react'; -import { Card, PageSection, Table, TableHeader, TableBody, expandable } from '@patternfly/react-table'; -import DashboardWrapper from '@patternfly/react-core/src/demos/examples/DashboardWrapper'; - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -class ExpandCollapseAllTableDemo extends React.Component { - constructor(props) { - super(props); - this.state = { - isChecked: false, - selectedRows: 0, - expandedRows: 0, - expandCollapseToggle: 'expand', - collapseAllAriaLabel: 'Expand all', - columns: [ - { - title: 'Repositories', - cellFormatters: [expandable] - }, - 'Branches', - 'Pull requests', - 'Workspaces', - 'Last Commit' - ], - rows: [ - { - cells: ['one', 'two', 'three', 'four', 'five'] - }, - { - isOpen: false, - cells: ['parent - 1', 'two', 'three', 'four', 'five'] - }, - { - parent: 1, - cells: ['child - 1'] - }, - { - isOpen: false, - cells: ['parent - 2', 'two', 'three', 'four', 'five'] - }, - { - parent: 3, - cells: ['child - 2'] - }, - { - isOpen: false, - cells: ['parent - 3', 'two', 'three', 'four', 'five'] - }, - { - parent: 5, - cells: ['child - 3'] - } - ] - }; - this.onCollapse = this.onCollapse.bind(this); - this.onSelect = this.onSelect.bind(this); - } - - onCollapse(event, rowIndex, isOpen) { - const { rows, expandedRows, expandCollapseToggle } = this.state; - const expandableRowLength = this.state.rows.filter(row => row.isOpen !== undefined).length; - /** - * Please do not use rowKey as row index for more complex tables. - * Rather use some kind of identifier like ID passed with each row. - */ - const collapseAll = rowIndex === undefined; - let newRows = Array.from(rows); - let newExpandedRows = expandedRows; - if (collapseAll) { - newRows = newRows.map(r => (r.isOpen === undefined ? r : { ...r, isOpen })); - newExpandedRows = isOpen ? expandableRowLength : 0; - } else { - newRows[rowIndex] = { ...newRows[rowIndex], isOpen }; - newExpandedRows = isOpen ? newExpandedRows + 1 : newExpandedRows - 1; - } - let toggle = expandCollapseToggle; - if (newExpandedRows === expandableRowLength) { - toggle = 'collapse'; - } else if (newExpandedRows === 0) { - toggle = 'expand'; - } - this.setState({ - rows: newRows, - expandedRows: newExpandedRows, - expandCollapseToggle: toggle, - collapseAllAriaLabel: toggle === 'expand' ? 'Expand All' : 'Collapse All' - }); - } - - onSelect(event, isSelected, rowId) { - let isChecked = null; - let selectedRows = this.state.selectedRows; - const selectableRowLength = this.state.rows.filter(row => row.parent === undefined).length; - let rows; - if (rowId === -1) { - rows = this.state.rows.map(row => { - row.selected = isSelected; - return row; - }); - isChecked = isSelected; - selectedRows = isSelected ? selectableRowLength : 0; - } else { - rows = [...this.state.rows]; - rows[rowId] = { ...rows[rowId], selected: isSelected }; - selectedRows = isSelected ? selectedRows + 1 : selectedRows - 1; - if (selectedRows === 0) { - isChecked = false; - } else if (selectedRows === selectableRowLength) { - isChecked = true; - } - } - this.setState({ - rows, - isChecked, - selectedRows - }); - } - - render() { - const { columns, rows, collapseAllAriaLabel } = this.state; - - return ( - - - - - - - -
-
-
-
-
- ); - } -} diff --git a/packages/react-table/src/demos/Table.md b/packages/react-table/src/docs/demos/Table.md similarity index 99% rename from packages/react-table/src/demos/Table.md rename to packages/react-table/src/docs/demos/Table.md index 6667959281a..1c4e2906f2d 100644 --- a/packages/react-table/src/demos/Table.md +++ b/packages/react-table/src/docs/demos/Table.md @@ -3026,7 +3026,7 @@ class PageLayoutDefaultNav extends React.Component { A toolbar may be added above a sticky table either inside or outside the `OuterScrollContainer`. -```ts isFullscreen file="examples/ComposableTableStickyToolbar.tsx" +```ts isFullscreen file="../examples/ComposableTableStickyToolbar.tsx" ``` ## Empty states diff --git a/packages/react-table/src/demos/table-demos/Compact.jsx b/packages/react-table/src/docs/demos/table-demos/Compact.jsx similarity index 100% rename from packages/react-table/src/demos/table-demos/Compact.jsx rename to packages/react-table/src/docs/demos/table-demos/Compact.jsx diff --git a/packages/react-table/src/demos/table-demos/CompoundExpansion.jsx b/packages/react-table/src/docs/demos/table-demos/CompoundExpansion.jsx similarity index 100% rename from packages/react-table/src/demos/table-demos/CompoundExpansion.jsx rename to packages/react-table/src/docs/demos/table-demos/CompoundExpansion.jsx diff --git a/packages/react-table/src/docs/demos/table-demos/ExpandCollapseAll.jsx b/packages/react-table/src/docs/demos/table-demos/ExpandCollapseAll.jsx new file mode 100644 index 00000000000..4abd5a0fb48 --- /dev/null +++ b/packages/react-table/src/docs/demos/table-demos/ExpandCollapseAll.jsx @@ -0,0 +1,219 @@ +import React from 'react'; +import { Card, Label, PageSection, Table, TableHeader, TableBody, expandable } from '@patternfly/react-table'; +import DashboardWrapper from '@patternfly/react-core/src/demos/examples/DashboardWrapper'; +import { TextVariants } from '@patternfly/react-core'; + +const columns = [ + { + title: 'Servers', + cellFormatters: [expandable] + }, + 'Threads', + 'Applications', + 'Workspaces', + 'Status' +]; + +const serverData = [ + { + name: 'US-Node 1', + threads: 18, + applications: 42, + workspaces: 7, + status: { title: }, + details: ( + + + LocationBoston + + + Last Modified2 hours ago + + + URLhttp://www.redhat.com/en/office-locations/US-node1 + + + ) + }, + { + name: 'US-Node 2', + threads: 9, + applications: 24, + workspaces: 17, + status: { title: }, + details: ( + + + LocationAtlanta + + + Last Modified5 hours ago + + + URLhttp://www.redhat.com/en/office-locations/US-node2 + + + ) + }, + { + name: 'US-Node 3', + threads: 8, + applications: 47, + workspaces: 3, + status: { title: }, + details: ( + + + LocationSan Francisco + + + Last Modified20 minutes ago + + + URLhttp://www.redhat.com/en/office-locations/US-node3 + + + ) + }, + { + name: 'US-Node 4', + threads: 6, + applications: 4, + workspaces: 15, + status: { title: }, + details: ( + + + LocationRaleigh + + + Last Modified10 minutes ago + + + URLhttp://www.redhat.com/en/office-locations/US-node4 + + + ) + }, + { + name: 'US-Node 5', + threads: 9, + applications: 24, + workspaces: 17, + status: { title: }, + details: ( + + + LocationAtlanta + + + Last Modified15 minutes ago + + + URLhttp://www.redhat.com/en/office-locations/US-node5 + + + ) + } +]; + +const initialExpandedServerNames = ['US-Node 2']; // Default to expanded + +class ExpandCollapseAllTableDemo extends React.Component { + constructor(props) { + super(props); + this.state = { + isChecked: false, + selectedRows: 0, + expandedRows: 0, + expandCollapseToggle: 'expand', + collapseAllAriaLabel: 'Expand all', + expandedServerNames: initialExpandedServerNames + }; + } + + setServerExpanded = (server, isExpanding) => { + this.setState(() => { + const otherExpandedServerNames = this.state.expandedServerNames.filter(r => r !== server.name); + return { + expandedServerNames: isExpanding ? [...otherExpandedServerNames, server.name] : otherExpandedServerNames + }; + }); + }; + + render() { + const { collapseAllAriaLabel } = this.state; + + const isServerExpanded = server => this.state.expandedServerNames.includes(server.name); + // We want to be able to reference the original data object based on row index. But because an expanded + // row takes up two row indexes, servers[rowIndex] will not be accurate like it would in a normal table. + // One solution to this is to create an array of data objects indexed by the displayed row index. + const serversByRowIndex = []; + + const rows = []; + serverData.forEach(server => { + rows.push({ + ...{ isOpen: isServerExpanded(server) }, + cells: [server.name, server.threads, server.applications, server.workspaces, server.status] + }); + serversByRowIndex.push(server); + if (server.details) { + const cells = []; + + cells.push({ + title: server.details + }); + + rows.push({ + parent: rows.length - 1, + cells + }); + serversByRowIndex.push(null); + } + }); + + const onCollapse = (_e, rowIndex, isOpen) => { + const collapseAll = rowIndex === undefined; + + if (collapseAll) { + this.setState(() => { + return { + expandedServerNames: isOpen ? [...serverData.map((server) => server.name)] : [] + }; + }); + + } + else if (serversByRowIndex[rowIndex]) { + this.setServerExpanded(serversByRowIndex[rowIndex], isOpen); + } + } + + return ( + + + + + + + +
+
+
+
+
+ ); + } +} diff --git a/packages/react-table/src/demos/table-demos/StickyFirstColumn.jsx b/packages/react-table/src/docs/demos/table-demos/StickyFirstColumn.jsx similarity index 100% rename from packages/react-table/src/demos/table-demos/StickyFirstColumn.jsx rename to packages/react-table/src/docs/demos/table-demos/StickyFirstColumn.jsx diff --git a/packages/react-table/src/demos/examples/ComposableTableStickyToolbar.tsx b/packages/react-table/src/docs/examples/ComposableTableStickyToolbar.tsx similarity index 100% rename from packages/react-table/src/demos/examples/ComposableTableStickyToolbar.tsx rename to packages/react-table/src/docs/examples/ComposableTableStickyToolbar.tsx diff --git a/packages/react-table/src/docs/examples/Data.jsx b/packages/react-table/src/docs/examples/Data.jsx new file mode 100644 index 00000000000..a999a49ab4c --- /dev/null +++ b/packages/react-table/src/docs/examples/Data.jsx @@ -0,0 +1,768 @@ +/* eslint-disable no-console */ +import * as React from 'react'; + +const getRandomInteger = (min, max) => ( + Math.floor(Math.random() * (max - min + 1)) + min +); + +export const columns = [ + 'Servers', + 'Threads', + 'Applications', + 'Workspaces', + 'Status', + 'Location', + 'Last Modified', + 'URL' +]; + +export const rows = [ + { + name: 'US-Node 1', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node1' + }, + { + name: 'US-Node 2', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '5 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node2' + }, + { + name: 'US-Node 3', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '20 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node3' + }, + { + name: 'US-Node 4', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '10 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node4' + }, + { + name: 'US-Node 5', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '15 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node5' + }, + { + name: 'US-Node 6', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '4 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node6' + }, + { + name: 'US-Node 7', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '10 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node7' + }, + { + name: 'US-Node 8', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '8 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node8' + }, + { + name: 'US-Node 9', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '1 hour ago', + url: 'http://www.redhat.com/en/office-locations/US-node9' + }, + { + name: 'US-Node 10', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node10' + }, + { + name: 'US-Node 11', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '55 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node11' + }, + { + name: 'US-Node 12', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '1 hour ago', + url: 'http://www.redhat.com/en/office-locations/US-node12' + }, + { + name: 'US-Node 13', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '20 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node13' + }, + { + name: 'US-Node 14', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '4 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node14' + }, + { + name: 'US-Node 15', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '10 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node15' + }, + { + name: 'US-Node 16', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + lastModified: '5 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node16' + }, + { + name: 'US-Node 17', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '5 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node17' + }, + { + name: 'US-Node 18', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '10 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node18' + }, + { + name: 'US-Node 19', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '30 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node19' + }, + { + name: 'US-Node 20', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '3 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node20' + }, + { + name: 'US-Node 21', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '15 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node21' + }, + { + name: 'US-Node 22', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node22' + }, + { + name: 'US-Node 23', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node23' + }, + { + name: 'US-Node 24', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '40 minutes ago', + url: 'http://www.redhat.com/en/office-locations/US-node24' + }, + { + name: 'US-Node 25', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '1 hour ago', + url: 'http://www.redhat.com/en/office-locations/US-node25' + }, + { + name: 'US-Node 26', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Raleigh', 'Boston', 'Atlanta', 'San Francisco'][getRandomInteger(0, 3)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/US-node26' + }, + { + name: 'CZ-Node 1', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '7 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node1' + }, + { + name: 'CZ-Node 2', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '50 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node2' + }, + { + name: 'CZ-Node 3', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '10 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node3' + }, + { + name: 'CZ-Node 4', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '3 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node4' + }, + { + name: 'CZ-Node 5', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node5' + }, + { + name: 'CZ-Node 6', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node6' + }, + { + name: 'CZ-Node 7', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '25 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node7' + }, + { + name: 'CZ-Node 8', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '1 hour ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node8' + }, + { + name: 'CZ-Node 9', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '15 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node9' + }, + { + name: 'CZ-Node 10', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '3 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node10' + }, + { + name: 'CZ-Node 11', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '30 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node11' + }, + { + name: 'CZ-Node 12', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '5 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node12' + }, + { + name: 'CZ-Node 13', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '45 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node13' + }, + { + name: 'CZ-Node 14', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node14' + }, + { + name: 'CZ-Node 15', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '10 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-node15' + }, + { + name: 'CZ-Remote-Node 1', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '20 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-Remote-node1' + }, + { + name: 'CZ--Remote-Node 2', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '15 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-Remote-node2' + }, + { + name: 'CZ-Remote-Node 3', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-Remote-node3' + }, + { + name: 'CZ-Remote-Node 4', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '1 hour ago', + url: 'http://www.redhat.com/en/office-locations/CZ-Remote-node4' + }, + { + name: 'CZ-Remote-Node 5', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '30 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-Remote-node5' + }, + { + name: 'CZ-Remote-Node 6', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-Remote-node6' + }, + { + name: 'CZ-Remote-Node 7', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '45 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node7' + }, + { + name: 'CZ-Remote-Node 8', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '6 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node8' + }, + { + name: 'CZ-Remote-Node 9', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '50 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node9' + }, + { + name: 'CZ-Remote-Node 10', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '3 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node10' + }, + { + name: 'CZ-Remote-Node 11', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node11' + }, + { + name: 'CZ-Remote-Node 12', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '20 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node12' + }, + { + name: 'CZ-Remote-Node 13', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '5 hours ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node13' + }, + { + name: 'CZ-Remote-Node 14', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '30 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node14' + }, + { + name: 'CZ-Remote-Node 15', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '1 hour ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node15' + }, + { + name: 'CZ-Remote-Node 16', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '1 hour ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node16' + }, + { + name: 'CZ-Remote-Node 17', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '25 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node17' + }, + { + name: 'CZ-Remote-Node 18', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: ['Brno', 'Prague'][getRandomInteger(0, 1)], + lastModified: '20 minutes ago', + url: 'http://www.redhat.com/en/office-locations/CZ-remote-node18' + }, + { + name: 'Bangalore-Node 1', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '25 minutes ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node1' + }, + { + name: 'Bangalore-Node 2', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node2' + }, + { + name: 'Bangalore-Node 3', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '10 minutes ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node3' + }, + { + name: 'Bangalore-Node 4', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '50 minutes ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node4' + }, + { + name: 'Bangalore-Node 5', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '3 hours ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node5' + }, + { + name: 'Bangalore-Node 6', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node6' + }, + { + name: 'Bangalore-Node 7', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '5 hours ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node7' + }, + { + name: 'Bangalore-Node 8', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '30 minutes ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node8' + }, + { + name: 'Bangalore-Node 9', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '20 minutes ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node9' + }, + { + name: 'Bangalore-Node 10', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '1 hour ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node10' + }, + { + name: 'Bangalore-Node 11', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '40 minutes ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node11' + }, + { + name: 'Bangalore-Node 12', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '1 hour ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node12' + }, + { + name: 'Bangalore-Node 13', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '20 minutes ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node13' + }, + { name: 'Bangalore-Node 14', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '4 hours ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node14' + }, + { name: 'Bangalore-Node 15', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '2 hours ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node15' + }, + { + name: 'Bangalore-Node 16', + threads: getRandomInteger(1, 20), + applications: getRandomInteger(1, 50), + workspaces: getRandomInteger(1, 30), + status: ['Stopped', 'Running', 'Down', 'Needs Maintenance'][getRandomInteger(0, 3)], + location: 'Bangalore', + lastModified: '3 hours ago', + url: 'http://www.redhat.com/en/office-locations/Bangalore-node16' + } +];