2
0
mirror of https://github.com/frappe/books.git synced 2024-12-27 04:32:41 +00:00
books/ui/components/List/List.vue

132 lines
3.1 KiB
Vue
Raw Normal View History

2018-06-27 14:38:27 +00:00
<template>
<div class="frappe-list">
<list-actions
:doctype="doctype"
:showDelete="checkList.length"
@new="$emit('newDoc')"
2018-06-27 14:38:27 +00:00
@delete="deleteCheckedItems"
/>
<ul class="list-group">
<list-item v-for="doc of data" :key="doc.name"
:id="doc.name"
:isActive="doc.name === $route.params.name"
:isChecked="isChecked(doc.name)"
@clickItem="openForm(doc.name)"
@checkItem="toggleCheck(doc.name)"
>
<indicator v-if="hasIndicator" :color="getIndicatorColor(doc)" />
<span class="d-inline-block ml-2">
{{ doc[meta.titleField || 'name'] }}
</span>
2018-06-27 14:38:27 +00:00
</list-item>
</ul>
</div>
</template>
<script>
import frappe from 'frappejs';
import ListActions from './ListActions';
import ListItem from './ListItem';
export default {
name: 'List',
2018-07-12 15:17:46 +00:00
props: ['doctype'],
2018-06-27 14:38:27 +00:00
components: {
ListActions,
ListItem
2018-06-27 14:38:27 +00:00
},
data() {
return {
data: [],
checkList: [],
activeItem: ''
};
2018-06-27 14:38:27 +00:00
},
computed: {
meta() {
return frappe.getMeta(this.doctype);
},
hasIndicator() {
return Boolean(this.meta.indicators);
}
2018-06-27 14:38:27 +00:00
},
created() {
frappe.db.on(`change:${this.doctype}`, () => {
this.updateList();
});
2018-07-12 16:27:23 +00:00
this.$root.$on('navbarSearch', this.updateList);
this.$root.$emit('newList');
2018-06-27 14:38:27 +00:00
},
mounted() {
this.updateList();
},
methods: {
async updateList(query = null) {
let filters = null;
2018-07-12 15:17:46 +00:00
if (query) {
filters = {
keywords: ['like', query]
};
2018-07-12 15:17:46 +00:00
}
const indicatorField = this.hasIndicator
? this.meta.indicators.key
: null;
const fields = [
'name',
indicatorField,
this.meta.titleField,
...this.meta.keywordFields
].filter(Boolean);
2018-06-27 14:38:27 +00:00
const data = await frappe.db.getAll({
doctype: this.doctype,
fields,
2018-07-12 15:17:46 +00:00
filters: filters || null
2018-06-27 14:38:27 +00:00
});
this.data = data;
},
openForm(name) {
this.activeItem = name;
this.$emit('openForm', name);
2018-06-27 14:38:27 +00:00
},
async deleteCheckedItems() {
await frappe.db.deleteMany(this.doctype, this.checkList);
this.$router.push(`/list/${this.doctype}`);
2018-06-27 14:38:27 +00:00
this.checkList = [];
},
toggleCheck(name) {
if (this.checkList.includes(name)) {
this.checkList = this.checkList.filter(docname => docname !== name);
2018-06-27 14:38:27 +00:00
} else {
this.checkList = this.checkList.concat(name);
2018-06-27 14:38:27 +00:00
}
},
isChecked(name) {
return this.checkList.includes(name);
},
getIndicatorColor(doc) {
return this.meta.getIndicatorColor(doc);
2018-06-27 14:38:27 +00:00
}
}
};
2018-06-27 14:38:27 +00:00
</script>
<style lang="scss" scoped>
@import '../../styles/variables';
2018-06-27 14:38:27 +00:00
.list-group-item {
border-left: none;
border-right: none;
border-radius: 0;
2018-06-27 14:38:27 +00:00
}
.list-group-item:first-child {
border-top: none;
2018-06-27 14:38:27 +00:00
}
.list-group-item:not(.active):hover {
background-color: $light;
2018-06-27 14:38:27 +00:00
}
</style>