我们正在使用vue js开发站点。我们希望整个表应该有一个通用表。因此,我们只需要将数据传递到该表组件,它将根据该数据显示数据。
这是我们要通用的组件
我们正在考虑是否只能传递需要从中获取数据的表标题和路由,以便它将从该路由获取数据并将其呈现在表中。
<template>
<!-- AgGrid Table -->
<ag-grid-vue
ref="agGridTable"
:components="components"
:gridOptions="gridOptions"
class="ag-theme-material w-100 my-4 ag-grid-table"
:columnDefs="columnDefs"
:defaultColDef="defaultColDef"
:rowData="usersData"
rowSelection="multiple"
colResizeDefault="shift"
:animateRows="true"
:floatingFilter="true"
:pagination="true"
:paginationPageSize="paginationPageSize"
:suppressPaginationPanel="true"
:enableRtl="$vs.rtl">
</ag-grid-vue>
<vs-pagination
:total="totalPages"
:max="7"
v-model="currentPage" />
</template>
<script>
import { AgGridVue } from 'ag-grid-vue'
import '@sass/vuexy/extraComponents/agGridStyleOverride.scss'
import vSelect from 'vue-select'
// Store Module
import moduleUserManagement from '@/store/user-management/moduleUserManagement.js'
// Cell Renderer
import CellRendererLink from './cell-renderer/CellRendererLink.vue'
import CellRendererStatus from './cell-renderer/CellRendererStatus.vue'
import CellRendererVerified from './cell-renderer/CellRendererVerified.vue'
import CellRendererActions from './cell-renderer/CellRendererActions.vue'
export default {
components: {
AgGridVue,
vSelect,
// Cell Renderer
CellRendererLink,
CellRendererStatus,
CellRendererVerified,
CellRendererActions
},
data () {
return {
// Filter Options
roleFilter: { label: 'All', value: 'all' },
roleOptions: [
{ label: 'All', value: 'all' },
{ label: 'Admin', value: 'admin' },
{ label: 'User', value: 'user' },
{ label: 'Staff', value: 'staff' }
],
statusFilter: { label: 'All', value: 'all' },
statusOptions: [
{ label: 'All', value: 'all' },
{ label: 'Active', value: 'active' },
{ label: 'Deactivated', value: 'deactivated' },
{ label: 'Blocked', value: 'blocked' }
],
isVerifiedFilter: { label: 'All', value: 'all' },
isVerifiedOptions: [
{ label: 'All', value: 'all' },
{ label: 'Yes', value: 'yes' },
{ label: 'No', value: 'no' }
],
departmentFilter: { label: 'All', value: 'all' },
departmentOptions: [
{ label: 'All', value: 'all' },
{ label: 'Sales', value: 'sales' },
{ label: 'Development', value: 'development' },
{ label: 'Management', value: 'management' }
],
searchQuery: '',
// AgGrid
gridApi: null,
gridOptions: {},
defaultColDef: {
sortable: true,
resizable: true,
suppressMenu: true
},
columnDefs: [
{
headerName: 'ID',
field: 'id',
width: 400,
filter: true,
checkboxSelection: true,
headerCheckboxSelectionFilteredOnly: true,
headerCheckboxSelection: true
},
{
headerName: 'Name',
field: 'name',
filter: true,
width: 400,
cellRendererFramework: 'CellRendererLink'
},
{
headerName: 'Email',
field: 'email',
filter: true,
width: 400
},
// {
// headerName: 'Role',
// field: 'role',
// filter: true,
// width: 150
// },
// {
// headerName: 'Status',
// field: 'status',
// filter: true,
// width: 150,
// cellRendererFramework: 'CellRendererStatus'
// },
{
headerName: 'Actions',
field: 'transactions',
width: 150,
cellRendererFramework: 'CellRendererActions'
}
],
// Cell Renderer Components
components: {
CellRendererLink,
CellRendererStatus,
CellRendererVerified,
CellRendererActions
}
}
},
watch: {
roleFilter (obj) {
this.setColumnFilter('role', obj.value)
},
statusFilter (obj) {
this.setColumnFilter('status', obj.value)
},
isVerifiedFilter (obj) {
const val = obj.value === 'all' ? 'all' : obj.value === 'yes' ? 'true' : 'false'
this.setColumnFilter('is_verified', val)
},
departmentFilter (obj) {
this.setColumnFilter('department', obj.value)
}
},
computed: {
usersData () {
console.log(this.$store.state.userManagement.users);
return this.$store.state.userManagement.users
},
paginationPageSize () {
if (this.gridApi) return this.gridApi.paginationGetPageSize()
else return 10
},
totalPages () {
if (this.gridApi) return this.gridApi.paginationGetTotalPages()
else return 0
},
currentPage: {
get () {
if (this.gridApi) return this.gridApi.paginationGetCurrentPage() + 1
else return 1
},
set (val) {
this.gridApi.paginationGoToPage(val - 1)
}
}
},
methods: {
setColumnFilter (column, val) {
const filter = this.gridApi.getFilterInstance(column)
let modelObj = null
if (val !== 'all') {
modelObj = { type: 'equals', filter: val }
}
filter.setModel(modelObj)
this.gridApi.onFilterChanged()
},
resetColFilters () {
// Reset Grid Filter
this.gridApi.setFilterModel(null)
this.gridApi.onFilterChanged()
// Reset Filter Options
this.roleFilter = this.statusFilter = this.isVerifiedFilter = this.departmentFilter = { label: 'All', value: 'all' }
this.$refs.filterCard.removeRefreshAnimation()
},
updateSearchQuery (val) {
this.gridApi.setQuickFilter(val)
}
},
mounted () {
this.gridApi = this.gridOptions.api
/* =================================================================
NOTE:
Header is not aligned properly in RTL version of agGrid table.
However, we given fix to this issue. If you want more robust solution please contact them at gitHub
================================================================= */
if (this.$vs.rtl) {
const header = this.$refs.agGridTable.$el.querySelector('.ag-header-container')
header.style.left = `-${ String(Number(header.style.transform.slice(11, -3)) + 9) }px`
}
},
created () {
if (!moduleUserManagement.isRegistered) {
this.$store.registerModule('userManagement', moduleUserManagement)
moduleUserManagement.isRegistered = true
}
this.$store.dispatch('userManagement/fetchUsers').catch(err => { console.error(err) })
}
}
</script>
<style lang="scss">
#page-user-list {
.user-list-filters {
.vs__actions {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-58%);
}
}
}
</style>