# Table All tables in the application are using the [BoostrapVue table component](https://bootstrap-vue.org/docs/components/table). To use the component, include the `` tag in the template. The component is registered globally so does not need to be imported in each SFC. ## Basic table There are a few required properties to maintain consistency across the application. The full list of options can be viewed on the [Bootstrap-vue table component's documentation page](https://bootstrap-vue.org/docs/components/table#comp-ref-b-table-props). ### Required properties - `items` - renders table items - `fields` - renders table header - `hover` - enables table row hover state - `responsive` or `stacked` - makes the table responsive (enables horizontal scrolling or stacked view) at the defined breakpoint - `show-empty` *(required if table data is generated dynamically)* - shows an empty message if there are no items in the table - `empty-text` *(required if table data is generated dynamically)* - the translated empty message ![Basic table example](./table.png) ![Basic empty table example](./table-empty.png) ```vue ``` ## Sort To enable table sort, include `sortable: true` in the fields array for sortable columns and add the following props to the `` component: - `sort-by` - `no-sort-reset` - `sort-icon-left` ![Table sort example](./table-sort.png) ```vue ``` ## Expandable rows To add an expandable row in the table, add a column for the expand button in the fields array. Include the tdClass `table-row-expand` to ensure icon rotation is handled. Use the built in [cell slot](https://bootstrap-vue.org/docs/components/table#comp-ref-b-table-slots) to target the expand button column and add a button with the chevron icon. Include the [TableRowExpandMixin](https://github.com/openbmc/webui-vue/blob/master/src/components/Mixins/TableRowExpandMixin.js). The mixin contains the dynamic `aria-label` and `title` attribute values that need to be included with the expand button. The `toggleRowDetails` method should be the button's click event callback. Be sure to pass the `row` object to the function. Use the [row-details slot](https://bootstrap-vue.org/docs/components/table#comp-ref-b-table-slots) to format the expanded row content. The slot has access to the row `item` property. ### Summary 1. Add a column for the expansion row button with the tdClass, `table-row-expand` 2. Include the `TableRowExpandMixin` to handle the dynamic aria label, title, and row expansion toggling 3. Use the `#cell` slot to target the expandable row column and add the button with accessible markup and click handler 4. Use the `#row-details` slot to format expanded row content ![Table row expand example](./table-expand-row.png) ```vue ``` ## Search The table is leveraging [BootstrapVue table filtering](https://bootstrap-vue.org/docs/components/table#filtering) for search. Add the [@filtered](https://bootstrap-vue.org/docs/components/table#filter-events) event listener onto the `` component. The event callback should track the total filtered items count. Import the `` and `` components and include them in the template above the `` component. Include the [SearchFilterMixin](https://github.com/openbmc/webui-vue/blob/master/src/components/Mixins/SearchFilterMixin.js). Add the `@change-search` and `@clear-search` event listeners on the `` component and use the corresponding `onChangeSearchInput` and `onClearSearchInput` methods as the event callbacks. The table should also include the dynamic `:filter` prop with `searchFilter` set as the value. The `` component requires two properties, total table item count and total filtered items count. Add the `:empty-filtered-text` prop to the table to show the translated message if there are no search matches. ![Table search example](./table-search.png) ![Table search active example](./table-search-active.png) ![Table search empty example](./table-search-empty.png) ```vue ``` ## Row actions To add table row actions, add a column for the action buttons in the table. Then in the array of table items, add a corresponding array of actions for each item. The array should have each desired row action with a `value` and `title` property. Import the `` component. Provide the `value` and `title` props to the component and use the named `#icons` slot to include an icon. The component will emit a `@click-table-action` with the event value. ![Table row actions example](./table-row-actions.png) ```vue ```