parent
a4187fea4c
commit
40ca3cbc94
@ -0,0 +1,12 @@ |
|||||||
|
.p-toolbar { |
||||||
|
@apply border-b border-solid border-gray-30 pb-4 mb-4; |
||||||
|
|
||||||
|
&-group-left, |
||||||
|
&-group-right { |
||||||
|
@apply flex flex-row gap-2; |
||||||
|
} |
||||||
|
|
||||||
|
&-separator { |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,383 @@ |
|||||||
|
.p-datatable { |
||||||
|
|
||||||
|
&-header, |
||||||
|
&-footer { |
||||||
|
@apply bg-gray-10 text-gray-90 border-solid border-gray-30 p-3 text-caption-bold; |
||||||
|
} |
||||||
|
|
||||||
|
&-header { |
||||||
|
@apply border-b; |
||||||
|
} |
||||||
|
|
||||||
|
&-footer { |
||||||
|
@apply border-t; |
||||||
|
} |
||||||
|
|
||||||
|
.p-paginator { |
||||||
|
@apply p-3 gap-3; |
||||||
|
|
||||||
|
&-top, |
||||||
|
&-bottom { |
||||||
|
@apply border-0; |
||||||
|
} |
||||||
|
|
||||||
|
&-current { |
||||||
|
@apply mr-auto; |
||||||
|
} |
||||||
|
|
||||||
|
&-pages { |
||||||
|
@apply space-x-3; |
||||||
|
} |
||||||
|
|
||||||
|
&-rpp-options { |
||||||
|
@apply ml-auto; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&-thead { |
||||||
|
> tr { |
||||||
|
> th { |
||||||
|
@apply p-3 border-b border-solid border-gray-30 text-body-1-bold bg-gray-15 text-gray-90; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&-tbody { |
||||||
|
> tr { |
||||||
|
@apply focus:outline focus:outline-1 focus:outline-primary focus:-outline-offset-1; |
||||||
|
|
||||||
|
> td { |
||||||
|
@apply p-3 border-b border-solid border-gray-30 text-body-2 text-gray-90; |
||||||
|
} |
||||||
|
|
||||||
|
&.p-highlight { |
||||||
|
@apply bg-support-1; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&-tfoot { |
||||||
|
> tr { |
||||||
|
> td { |
||||||
|
@apply p-3 border-b border-solid border-gray-30 text-body-1-bold text-gray-90; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-sortable-column { |
||||||
|
@apply outline-none |
||||||
|
hover:text-primary; |
||||||
|
|
||||||
|
&-icon { |
||||||
|
@apply ml-2; |
||||||
|
} |
||||||
|
|
||||||
|
&.p-highlight { |
||||||
|
@apply text-primary bg-support-1; |
||||||
|
} |
||||||
|
|
||||||
|
.p-sortable-column-badge { |
||||||
|
@apply rounded-full ml-2 text-tiny-bold px-1.5 bg-white; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&.p-datatable-striped { |
||||||
|
.p-datatable-tbody { |
||||||
|
> tr { |
||||||
|
@apply even:bg-gray-5; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&.p-datatable-sm { |
||||||
|
.p-datatable-header, |
||||||
|
.p-datatable-footer { |
||||||
|
@apply p-2; |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-thead > tr > th, |
||||||
|
.p-datatable-tbody > tr > td, |
||||||
|
.p-datatable-tfoot > tr > td { |
||||||
|
@apply p-2; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&.p-datatable-lg { |
||||||
|
.p-datatable-header, |
||||||
|
.p-datatable-footer { |
||||||
|
@apply p-4; |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-thead > tr > th, |
||||||
|
.p-datatable-tbody > tr > td, |
||||||
|
.p-datatable-tfoot > tr > td { |
||||||
|
@apply py-4; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$color_1: #71717A; |
||||||
|
$color_2: #18181B; |
||||||
|
$color_3: #3f3f46; |
||||||
|
$background-color_1: #fafafa; |
||||||
|
$border-color_1: transparent; |
||||||
|
|
||||||
|
.p-datatable { |
||||||
|
.p-datatable-tbody { |
||||||
|
>tr { |
||||||
|
>td { |
||||||
|
.p-row-toggler { |
||||||
|
width: 2rem; |
||||||
|
height: 2rem; |
||||||
|
color: $color_1; |
||||||
|
border: 0 none; |
||||||
|
background: transparent; |
||||||
|
border-radius: 50%; |
||||||
|
transition: none; |
||||||
|
|
||||||
|
&:enabled { |
||||||
|
&:hover { |
||||||
|
color: $color_2; |
||||||
|
border-color: $border-color_1; |
||||||
|
background: #f4f4f5; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&:focus { |
||||||
|
outline: 0 none; |
||||||
|
outline-offset: 0; |
||||||
|
box-shadow: 0 0 0 1px #6366F1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-row-editor-init { |
||||||
|
width: 2rem; |
||||||
|
height: 2rem; |
||||||
|
color: $color_1; |
||||||
|
border: 0 none; |
||||||
|
background: transparent; |
||||||
|
border-radius: 50%; |
||||||
|
transition: none; |
||||||
|
|
||||||
|
&:enabled { |
||||||
|
&:hover { |
||||||
|
color: $color_2; |
||||||
|
border-color: $border-color_1; |
||||||
|
background: #f4f4f5; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&:focus { |
||||||
|
outline: 0 none; |
||||||
|
outline-offset: 0; |
||||||
|
box-shadow: 0 0 0 1px #6366F1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-row-editor-save { |
||||||
|
width: 2rem; |
||||||
|
height: 2rem; |
||||||
|
color: $color_1; |
||||||
|
border: 0 none; |
||||||
|
background: transparent; |
||||||
|
border-radius: 50%; |
||||||
|
transition: none; |
||||||
|
margin-right: 0.5rem; |
||||||
|
|
||||||
|
&:enabled { |
||||||
|
&:hover { |
||||||
|
color: $color_2; |
||||||
|
border-color: $border-color_1; |
||||||
|
background: #f4f4f5; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&:focus { |
||||||
|
outline: 0 none; |
||||||
|
outline-offset: 0; |
||||||
|
box-shadow: 0 0 0 1px #6366F1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-row-editor-cancel { |
||||||
|
width: 2rem; |
||||||
|
height: 2rem; |
||||||
|
color: $color_1; |
||||||
|
border: 0 none; |
||||||
|
background: transparent; |
||||||
|
border-radius: 50%; |
||||||
|
transition: none; |
||||||
|
|
||||||
|
&:enabled { |
||||||
|
&:hover { |
||||||
|
color: $color_2; |
||||||
|
border-color: $border-color_1; |
||||||
|
background: #f4f4f5; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&:focus { |
||||||
|
outline: 0 none; |
||||||
|
outline-offset: 0; |
||||||
|
box-shadow: 0 0 0 1px #6366F1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
>.p-column-title { |
||||||
|
font-weight: 500; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
>tr.p-datatable-dragpoint-top { |
||||||
|
>td { |
||||||
|
box-shadow: inset 0 2px 0 0 #EEF2FF; |
||||||
|
box-shadow: inset 0 2px 0 0 #4F46E5; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
>tr.p-datatable-dragpoint-bottom { |
||||||
|
>td { |
||||||
|
box-shadow: inset 0 -2px 0 0 #EEF2FF; |
||||||
|
box-shadow: inset 0 -2px 0 0 #4F46E5; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-column-resizer-helper { |
||||||
|
background: #4F46E5; |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-scrollable-header { |
||||||
|
background: #fafafa; |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-scrollable-footer { |
||||||
|
background: #fafafa; |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-loading-icon { |
||||||
|
font-size: 2rem; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable.p-datatable-hoverable-rows { |
||||||
|
.p-datatable-tbody { |
||||||
|
>tr { |
||||||
|
&:not(.p-highlight) { |
||||||
|
&:hover { |
||||||
|
background: #f4f4f5; |
||||||
|
color: $color_3; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable.p-datatable-scrollable { |
||||||
|
>.p-datatable-wrapper { |
||||||
|
>.p-datatable-table { |
||||||
|
>.p-datatable-thead { |
||||||
|
background-color: $background-color_1; |
||||||
|
} |
||||||
|
|
||||||
|
>.p-datatable-tfoot { |
||||||
|
background-color: $background-color_1; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable.p-datatable-gridlines { |
||||||
|
.p-datatable-header { |
||||||
|
border-width: 1px 1px 0 1px; |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-footer { |
||||||
|
border-width: 0 1px 1px 1px; |
||||||
|
} |
||||||
|
|
||||||
|
.p-paginator-top { |
||||||
|
border-width: 0 1px 0 1px; |
||||||
|
} |
||||||
|
|
||||||
|
.p-paginator-bottom { |
||||||
|
border-width: 0 1px 1px 1px; |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-thead { |
||||||
|
>tr { |
||||||
|
>th { |
||||||
|
border-width: 1px 1px 1px 1px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-tbody { |
||||||
|
>tr { |
||||||
|
>td { |
||||||
|
border-width: 1px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-tfoot { |
||||||
|
>tr { |
||||||
|
>td { |
||||||
|
border-width: 1px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable.p-datatable-gridlines.p-datatable-scrollable { |
||||||
|
.p-datatable-thead { |
||||||
|
>tr { |
||||||
|
>th { |
||||||
|
+ { |
||||||
|
th { |
||||||
|
border-left-width: 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-tbody { |
||||||
|
>tr { |
||||||
|
>td { |
||||||
|
+ { |
||||||
|
td { |
||||||
|
border-left-width: 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
+ { |
||||||
|
tr { |
||||||
|
>td { |
||||||
|
border-top-width: 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&:first-child { |
||||||
|
>td { |
||||||
|
border-top-width: 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.p-datatable-tfoot { |
||||||
|
>tr { |
||||||
|
>td { |
||||||
|
+ { |
||||||
|
td { |
||||||
|
border-left-width: 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,59 @@ |
|||||||
|
import { useStore } from 'vuex' |
||||||
|
import { ref } from 'vue' |
||||||
|
import { useRoute } from 'vue-router' |
||||||
|
import { isEmpty } from 'lodash' |
||||||
|
|
||||||
|
import { useCidReq } from './cidReq' |
||||||
|
|
||||||
|
export function useDatatableList (servicePrefix) { |
||||||
|
const moduleName = servicePrefix.toLowerCase() |
||||||
|
|
||||||
|
const store = useStore() |
||||||
|
const route = useRoute() |
||||||
|
|
||||||
|
const { cid, sid, gid } = useCidReq() |
||||||
|
|
||||||
|
const filters = ref({}) |
||||||
|
|
||||||
|
const expandedFilter = ref(false) |
||||||
|
|
||||||
|
const options = ref({ |
||||||
|
sortBy: [], |
||||||
|
sortDesc: false, |
||||||
|
page: 1, |
||||||
|
itemsPerPage: 5, |
||||||
|
}) |
||||||
|
|
||||||
|
function onUpdateOptions ({ page, itemsPerPage, sortBy, sortDesc }) { |
||||||
|
page = page || options.value.page |
||||||
|
|
||||||
|
let params = { ...filters.value } |
||||||
|
|
||||||
|
if (1 === filters.value.loadNode) { |
||||||
|
console.log('params', route.params) |
||||||
|
params['resourceNode.parent'] = route.params.node |
||||||
|
} |
||||||
|
|
||||||
|
if (itemsPerPage > 0) { |
||||||
|
params = { ...params, itemsPerPage, page } |
||||||
|
} |
||||||
|
|
||||||
|
if (!isEmpty(sortBy)) { |
||||||
|
params[`order[${sortBy}]`] = sortDesc ? 'desc' : 'asc' |
||||||
|
} |
||||||
|
|
||||||
|
let type = route.query.type |
||||||
|
|
||||||
|
params = { ...params, cid, sid, gid, type, page } |
||||||
|
|
||||||
|
store.dispatch(`${moduleName}/fetchAll`, params) |
||||||
|
.then(() => options.value = { sortBy, sortDesc, itemsPerPage, page }) |
||||||
|
} |
||||||
|
|
||||||
|
return { |
||||||
|
filters, |
||||||
|
expandedFilter, |
||||||
|
options, |
||||||
|
onUpdateOptions, |
||||||
|
} |
||||||
|
} |
@ -1,112 +0,0 @@ |
|||||||
import { useStore } from 'vuex'; |
|
||||||
import { computed, ref } from 'vue'; |
|
||||||
import { useRoute } from 'vue-router'; |
|
||||||
import { isEmpty } from 'lodash'; |
|
||||||
import { useCidReq } from '../../composables/cidReq'; |
|
||||||
|
|
||||||
export function useList (moduleName) { |
|
||||||
const store = useStore(); |
|
||||||
const route = useRoute(); |
|
||||||
const { cid, sid, gid } = useCidReq(); |
|
||||||
|
|
||||||
const pagination = ref({ |
|
||||||
sortBy: 'resourceNode.title', |
|
||||||
descending: false, |
|
||||||
page: 1, // page to be displayed
|
|
||||||
rowsPerPage: 10, // maximum displayed rows
|
|
||||||
rowsNumber: 10, // max number of rows
|
|
||||||
}); |
|
||||||
|
|
||||||
const nextPage = ref(null); |
|
||||||
|
|
||||||
const filters = ref({}); |
|
||||||
|
|
||||||
const filtration = ref({}); |
|
||||||
|
|
||||||
const expandedFilter = ref(false); |
|
||||||
|
|
||||||
const options = ref({ |
|
||||||
sortBy: [], |
|
||||||
sortDesc: [], |
|
||||||
page: 1, |
|
||||||
itemsPerPage: 10 |
|
||||||
}); |
|
||||||
|
|
||||||
const resetList = computed(() => store.state[`${moduleName}/resetList`]); |
|
||||||
|
|
||||||
function onRequest (props) { |
|
||||||
console.log('onRequest'); |
|
||||||
console.log(props); |
|
||||||
|
|
||||||
const { page, rowsPerPage: itemsPerPage, sortBy, descending } = props.pagination; |
|
||||||
|
|
||||||
nextPage.value = page; |
|
||||||
|
|
||||||
if (isEmpty(nextPage)) { |
|
||||||
nextPage.value = 1; |
|
||||||
} |
|
||||||
|
|
||||||
let params = {}; |
|
||||||
|
|
||||||
if (itemsPerPage > 0) { |
|
||||||
params = { ...params, itemsPerPage, page }; |
|
||||||
} |
|
||||||
|
|
||||||
if (sortBy) { |
|
||||||
params[`order[${sortBy}]`] = descending ? 'desc' : 'asc'; |
|
||||||
} |
|
||||||
|
|
||||||
if (route.params.node) { |
|
||||||
params[`resourceNode.parent`] = route.params.node; |
|
||||||
} |
|
||||||
|
|
||||||
resetList.value = true; |
|
||||||
|
|
||||||
store.dispatch(`${moduleName}/fetchAll`, params) |
|
||||||
.then(() => { |
|
||||||
pagination.value.sortBy = sortBy; |
|
||||||
pagination.value.descending = descending; |
|
||||||
pagination.value.rowsPerPage = itemsPerPage; |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
function onUpdateOptions ({ page, itemsPerPage, sortBy, sortDesc, totalItems }) { |
|
||||||
console.log('ListMixin.js: onUpdateOptions'); |
|
||||||
|
|
||||||
resetList.value = true; |
|
||||||
|
|
||||||
let params = { ...filters.value }; |
|
||||||
|
|
||||||
console.log(params); |
|
||||||
|
|
||||||
if (1 === filters.value['loadNode']) { |
|
||||||
params['resourceNode.parent'] = route.params.node; |
|
||||||
} |
|
||||||
|
|
||||||
if (itemsPerPage > 0) { |
|
||||||
params = { ...params, itemsPerPage, page }; |
|
||||||
} |
|
||||||
|
|
||||||
if (!isEmpty(sortBy)) { |
|
||||||
params[`order[${sortBy}]`] = sortDesc ? 'desc' : 'asc'; |
|
||||||
} |
|
||||||
|
|
||||||
let type = route.query.type; |
|
||||||
|
|
||||||
params = { ...params, cid, sid, gid, type }; |
|
||||||
|
|
||||||
store.dispatch(`${moduleName}/fetchAll`, params) |
|
||||||
.then(() => options.value = { sortBy, sortDesc, itemsPerPage, totalItems }); |
|
||||||
} |
|
||||||
|
|
||||||
return { |
|
||||||
pagination, |
|
||||||
nextPage, |
|
||||||
filters, |
|
||||||
filtration, |
|
||||||
expandedFilter, |
|
||||||
options, |
|
||||||
onRequest, |
|
||||||
onUpdateOptions, |
|
||||||
}; |
|
||||||
} |
|
Loading…
Reference in new issue