@we/dt
Install
bash
# add package, check the last version!
yarn add https://git.weconstudio.it/vue/dt.git#^0.2.34
Create and add this nuxt plugin
js
// ~/plugins/dt.js
import Vue from "vue";
import WeDatatable from "@we/dt";
Vue.use(WeDatatable, {
formatters: {},
});
Use it in your components like this
vue
<template>
<we-datatable resource="ski_resorts"/>
</template>
Icons
add/change values to vuetify.options.js
js
export default {
icons: {
iconfont: "mdi",
values: {
search: "mdi-magnify",
plus: "mdi-plus",
save: "mdi-content-save",
filter: "mdi-filter",
options: "mdi-dots-horizontal",
refresh: "mdi-refresh",
},
},
};
Props
Name | Type | Default | Description |
---|---|---|---|
resource | String | required | Name of the resource on the server |
search | String | Search value | |
page | Number | 1 | Default current page |
itemsPerPage | Number | 10 | Default items per page |
sortOptions | Object | undefined | Default sort options example `{ sortBy: ["name"], sortDesc: [true] }` |
actionsHeader | [Boolean, Object] | true | show actions header (Note: you must define `` ... `` ) |
requestParams | Object | {} | Extra params sent to the server for each request |
filters | Object | {} | Default filters values |
mapItem | Function(item, fields) | null | Function called for each item before render |
addButton | [Boolean, String | true | Show the add item action |
extraActions | Array | [] | Extra actions to show |
extraHeaders | Array | [] | Array of extra headers show in the datatable |
openFilters | Boolean | false | Open filters by default |
Slots
Name | Description |
---|---|
header | Add button, bulk actions and search components |
filters | filters slot |
action-buttons | Add button desktop |
action-buttons-mobile | Add button mobile |
bulk-actions | Bulk actions slots |
item.[headerName] | override cell slot es: item.actions |
Methods
Name | Description |
---|---|
reloadData() | Reload data of current page |
refresh() | Refresh datatable *Coming soon* |
executeExtraAction(actionId, params) | Execute an extra action |
clearSelection() | Clear selection |
Events
Name | Type | Description |
---|---|---|
action | { id: 'action-id', selection: [], ...dtParams } | Extra action triggered |
new | -- | Add action triggered |
error | Error | An error occurred |
update:search | (search) => {} | search changed |
update:page | (page) => {} | page changed |
update:itemsPerPage | (itemsPerPage) => {} | itemsPerPage changed |
update:sortOptions | (sortOptions) => {} | sortOptions changed |
update:filters | (filters) => {} | filters changed |
Example
Addional headers
vue
<template>
<we-datatable resource="orders" :extra-headers="headers">
<!-- Extra header -->
<template #[`item.extra`]="{ item }">
<span>extra</span>
</template>
<!-- The actions header is added by default if you define this template -->
<template #[`item.actions`]="{ item }">
<v-btn> Edit </v-btn>
</template>
</we-datatable>
</template>
<script>
export default {
data: () => ({
headers: [{ id: "extra", text: 'Extra' width: 90 }],
}),
};
</script>
Add button
vue
<template>
<we-datatable resource="orders" @new="create" />
</template>
<script>
export default {
methods: {
createNew() {
// TODO
},
},
};
</script>
Custom formatter
~/plugins/dt.js
js
import Vue from "vue";
import WeDatatable from "@we/dt";
import EmailFormatter from "~/components/EmailFormatter";
import BooleanFormatter from "~/components/BooleanFormatter";
Vue.use(WeDatatable, {
formatters: {
// Note: the key has to match formatter or type value on server header
email: EmailFormatter,
boolean: BooleanFormatter,
},
});
~/components/EmailFormatter.vue
vue
<template>
<a :href="`mailto:${value}`">{{ value }}</a>
</template>
<script>
export default {
props: {
value: Object | String | Number,
item: Object,
field: Object,
},
};
</script>
Extra actions
vue
<template>
<we-datatable
ref="dt"
@action="handleAction"
:extraActions="extraActions"
resource="users"
></we-datatable>
</template>
<script>
export default {
data: () => ({
extraActions: [
{
id: "welcome-sms",
label: "Invia SMS benvenuto",
icon: "mdi-comment",
bulk: false,
multiple: true,
// confirm: true,
// confirm_message: "Vuoi inviare un SMS a tutti gli utenti selezionati?"
},
],
}),
methods: {
handleAction({ id, selection }) {
switch (id) {
case "welcome-sms":
// custom logic here
const extraParams = {
// extra params
// from: '2022-01-01',
}
// NOTE: this will make a POST in resource/datatable
// with all the filters, the selection and the extraParams
await this.$refs.dt.executeExtraAction("welcome-sms", extraParams);
break;
// same as @new event
case "new":
alert("New user");
break;
}
},
},
};
</script>
Pre filtered dt
vue
<template>
<we-datatable resource="orders" :filters.sync="filters" />
</template>
<script>
export default {
data: () => ({
filters: {
email: {
operator: "%like",
value: "@gmail.com",
},
},
}),
};
</script>
Extra params
vue
<template>
<we-datatable resource="orders" :request-params="requestParams" />
</template>
<script>
export default {
data: () => ({
requestParams: {
// what ever
},
}),
};
</script>