@mozaic-ds/vue
Version:
Mozaic-Vue is the Vue.js implementation of ADEO Design system
166 lines (146 loc) • 4.75 kB
text/typescript
import type { Meta, StoryObj } from '@storybook/vue3-vite';
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';
const meta: Meta<typeof MDataTable> = {
title: 'DataTable/MDataTable Sortable',
component: MDataTable,
args: utils.args,
argTypes: utils.argtypes,
parameters: {
componentName: 'MDataTable',
docs: {
canvas: { sourceState: 'none' },
},
},
render: (args) => ({
components: { MDataTable, MDataTableColumn },
setup() {
return { args };
},
template: `
<MDataTable v-bind="args">
<!-- Name-->
<MDataTableColumn label="Name" value="name" sortable />
<!-- Stock-->
<MDataTableColumn label="Stock" value="stock" sortable />
<!-- Start Date -->
<MDataTableColumn label="Start date" value="startDate" sortable />
<template v-slot:cell.startDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- End Date -->
<MDataTableColumn label="End date" value="endDate" sortable />
<template v-slot:cell.endDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- Status -->
<MDataTableColumn label="Statut" value="status" sortable />
<template v-slot:cell.status="{ item }"> {{ item.status.code }} </template>
</MDataTable>
`,
methods: {
formatDate(date) {
return new Date(date).toLocaleString();
},
},
}),
};
export default meta;
type Story = StoryObj<typeof MDataTable>;
export const SingleSort: Story = {};
export const SingleSortVModel: Story = {
name: 'Single Sort (with v-model)',
args: {
sort: { column: 'stock', direction: 'DESC' },
},
render: (args) => ({
components: { MDataTable, MDataTableColumn },
setup() {
const propSort = ref(args.sort);
return { args, propSort };
},
template: `
<code class="code">
<pre>v-model with prop sort: {{ propSort }}</pre>
</code>
<MDataTable v-bind="args" v-model:sort="propSort">
<!-- Name-->
<MDataTableColumn label="Name" value="name" sortable />
<!-- Stock-->
<MDataTableColumn label="Stock" value="stock" sortable />
<!-- Start Date -->
<MDataTableColumn label="Start date" value="startDate" sortable />
<template v-slot:cell.startDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- End Date -->
<MDataTableColumn label="End date" value="endDate" sortable />
<template v-slot:cell.endDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- Status -->
<MDataTableColumn label="Statut" value="status" sortable />
<template v-slot:cell.status="{ item }"> {{ item.status.code }} </template>
</MDataTable>
`,
methods: {
formatDate(date) {
return new Date(date).toLocaleString();
},
},
}),
};
export const MultipleSort: Story = {
args: {
sortMode: 'multiple',
},
};
export const MultipleSortVModel: Story = {
name: 'Multiple Sort (with v-model)',
args: {
sortMode: 'multiple',
sortMultiple: [
{ column: 'stock', direction: 'DESC' },
{ column: 'status', direction: 'ASC' },
],
},
render: (args) => ({
components: { MDataTable, MDataTableColumn },
setup() {
const propSortMultiple = ref(args.sortMultiple);
return { args, propSortMultiple };
},
template: `
<code class="code">
<pre>v-model with prop sortMultiple: {{ propSortMultiple }}</pre>
</code>
<MDataTable v-bind="args" v-model:sortMultiple="propSortMultiple">
<!-- Name-->
<MDataTableColumn label="Name" value="name" sortable />
<!-- Stock-->
<MDataTableColumn label="Stock" value="stock" sortable />
<!-- Start Date -->
<MDataTableColumn label="Start date" value="startDate" sortable />
<template v-slot:cell.startDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- End Date -->
<MDataTableColumn label="End date" value="endDate" sortable />
<template v-slot:cell.endDate="{ item }">
{{ formatDate(item.startDate) }}
</template>
<!-- Status -->
<MDataTableColumn label="Statut" value="status" sortable />
<template v-slot:cell.status="{ item }"> {{ item.status.code }} </template>
</MDataTable>
`,
methods: {
formatDate(date) {
return new Date(date).toLocaleString();
},
},
}),
};