@mozaic-ds/vue
Version:
Mozaic-Vue is the Vue.js implementation of ADEO Design system
195 lines (177 loc) • 5.39 kB
text/typescript
import { ref } from 'vue';
import * as utils from './utils';
// Components
import '@mozaic-ds/datatable-vue/style.css';
import { MDataTable, MDataTableColumn } from '@mozaic-ds/datatable-vue';
// Styles
import './assets/styles.scss';
// Scripts
const api = {
fetchItems: ({ sort, size, page }) =>
new Promise((resolve) => {
setTimeout(() => {
let items = [...utils.addlDeals];
if (sort)
items = items.sort((itemA, itemB) => {
const { column, direction } = sort;
if (direction === 'ASC') {
return itemA[column] > itemB[column] ? 1 : -1;
} else {
return itemA[column] < itemB[column] ? 1 : -1;
}
});
const paginated = items.slice((page - 1) * size, page * size);
resolve(paginated);
}, 1000);
}),
};
export default {
title: 'DataTable/MDataTable Pageable',
component: MDataTable,
args: utils.args,
argTypes: utils.argtypes,
parameters: {
componentName: 'MDataTable',
docs: { autodocs: false },
backgrounds: utils.backgrounds,
},
render: (args) => ({
components: { MDataTable, MDataTableColumn },
setup() {
return { args };
},
template: `
<MDataTable v-bind="args">
<!--
Default content
-->
<MDataTableColumn label="Name" value="name" />
<MDataTableColumn label="Stock" value="stock" />
<!-- Start Date -->
<MDataTableColumn label="Start date" value="startDate" />
<template v-slot:cell.startDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- End Date -->
<MDataTableColumn label="End date" value="endDate" />
<template v-slot:cell.endDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- Status -->
<MDataTableColumn label="Statut" value="status" />
<template v-slot:cell.status="{ item }"> {{ item.status.code }} </template>
</MDataTable>
`,
methods: {
formatDate(date) {
return new Date(date).toLocaleString();
},
},
}),
};
export const Default = {
args: {
pageable: true,
totalItems: utils.deals10.length,
accessibilityLabels: { paginationAriaLabel: 'Select a DataTable page' },
},
};
export const CustomPaginationText = {
args: { ...Default.args },
render: (args) => ({
components: { MDataTable, MDataTableColumn },
setup() {
return { args };
},
template: `
<MDataTable v-bind="args">
<!--
Default content
-->
<MDataTableColumn label="Name" value="name" />
<MDataTableColumn label="Stock" value="stock" />
<!-- Start Date -->
<MDataTableColumn label="Start date" value="startDate" />
<template v-slot:cell.startDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- End Date -->
<MDataTableColumn label="End date" value="endDate" />
<template v-slot:cell.endDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- Status -->
<MDataTableColumn label="Statut" value="status" />
<template v-slot:cell.status="{ item }"> {{ item.status.code }} </template>
<!-- Custom Pagination Text -->
<template v-slot:paging.text="{ option }">
Custom pagination - {{ option.value }} / {{ option.length }}
</template>
</MDataTable>
`,
methods: {
formatDate(date) {
return new Date(date).toLocaleString();
},
},
}),
};
export const FullPaginatedExample = {
args: {
pageable: true,
itemsPerPage: 10,
},
render: (args) => ({
components: { MDataTable, MDataTableColumn },
setup() {
const items = ref(utils.deals10);
const totalItems = ref(utils.addlDeals.length);
const loading = ref(false);
const currentPage = ref(1);
return { args, items, totalItems, loading, currentPage };
},
template: `
<MDataTable
v-bind="args"
:items="items"
:totalItems="totalItems"
:loading="loading"
@change="updatePage"
>
<!--
Default content
-->
<MDataTableColumn label="Name" value="name" />
<MDataTableColumn label="Stock" value="stock" />
<!-- Start Date -->
<MDataTableColumn label="Start date" value="startDate" />
<template v-slot:cell.startDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- End Date -->
<MDataTableColumn label="End date" value="endDate" />
<template v-slot:cell.endDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- Status -->
<MDataTableColumn label="Statut" value="status" />
<template v-slot:cell.status="{ item }"> {{ item.status.code }} </template>
</MDataTable>
`,
methods: {
formatDate(date) {
return new Date(date).toLocaleString();
},
async updatePage({
sort = undefined,
size = undefined,
page = undefined,
}) {
console.log('Poulou');
this.loading = true;
this.items = await api.fetchItems({ sort, size, page });
this.loading = false;
},
},
}),
};