const frappe = require('frappejs'); module.exports = class BaseList { constructor({doctype, parent, fields, page}) { Object.assign(this, arguments[0]); this.meta = frappe.getMeta(this.doctype); this.start = 0; this.pageLength = 20; this.body = null; this.rows = []; this.data = []; frappe.db.on(`change:${this.doctype}`, (params) => { this.dirty = true; }); setInterval(() => { if (this.dirty) this.refresh(); }, 500); } async refresh() { return await this.run(); } async run() { this.makeBody(); this.dirty = false; let data = await this.getData(); for (let i=0; i< Math.min(this.pageLength, data.length); i++) { this.renderRow(this.start + i, data[i]); } if (this.start > 0) { this.data = this.data.concat(data); } else { this.data = data; } this.clearEmptyRows(); this.updateMore(data.length > this.pageLength); } async getData() { return await frappe.db.getAll({ doctype: this.doctype, fields: this.getFields(), filters: this.getFilters(), start: this.start, limit: this.pageLength + 1 }); } getFields() { return ['name']; } async append() { this.start += this.pageLength; await this.run(); } getFilters() { let filters = {}; if (this.searchInput.value) { filters.keywords = ['like', '%' + this.searchInput.value + '%']; } return filters; } makeBody() { if (!this.body) { this.makeToolbar(); this.parent.classList.add('list-page'); this.body = frappe.ui.add('div', 'list-body', this.parent); this.body.setAttribute('data-doctype', this.doctype); this.makeMoreBtn(); } } makeToolbar() { this.makeSearch(); this.btnNew = this.page.addButton(frappe._('New'), 'btn-primary', async () => { await frappe.router.setRoute('new', this.doctype); }) this.btnDelete = this.page.addButton(frappe._('Delete'), 'btn-secondary hide', async () => { await frappe.db.deleteMany(this.doctype, this.getCheckedRowNames()); await this.refresh(); }); this.page.body.addEventListener('click', (event) => { if(event.target.classList.contains('checkbox')) { this.btnDelete.classList.toggle('hide', this.getCheckedRowNames().length===0); } }) } makeSearch() { this.toolbar = frappe.ui.add('div', 'list-toolbar', this.parent); this.toolbar.innerHTML = `