2
0
mirror of https://github.com/frappe/books.git synced 2024-09-20 19:29:02 +00:00
books/client/view/controls/link.js

73 lines
2.1 KiB
JavaScript
Raw Normal View History

2018-01-23 12:26:40 +00:00
const frappe = require('frappejs');
const BaseControl = require('./base');
const Awesomplete = require('awesomplete');
class LinkControl extends BaseControl {
make() {
super.make();
2018-01-23 12:31:09 +00:00
this.input.setAttribute('type', 'text');
2018-02-15 09:53:28 +00:00
this.setupAwesomplete();
}
setupAwesomplete() {
2018-01-23 12:31:09 +00:00
this.awesomplete = new Awesomplete(this.input, {
minChars: 0,
maxItems: 99,
2018-02-13 11:54:57 +00:00
filter: () => true,
2018-04-19 10:13:55 +00:00
sort: (a, b) => {
if (a.value === '__newitem' || b.value === '__newitem') {
return -1;
}
return a.value > b.value;
}
2018-01-23 12:31:09 +00:00
});
2018-01-23 12:26:40 +00:00
2018-01-23 12:31:09 +00:00
// rebuild the list on input
this.input.addEventListener('input', async (event) => {
let list = await this.getList(this.input.value);
// action to add new item
list.push({
label: frappe._('+ New {0}', this.label),
value: '__newItem',
});
this.awesomplete.list = list;
});
// new item action
this.input.addEventListener('awesomplete-select', async (e) => {
if (e.text && e.text.value === '__newItem') {
e.preventDefault();
2018-03-27 13:55:26 +00:00
const newDoc = await frappe.getNewDoc(this.getTarget());
const formModal = await frappe.desk.showFormModal(this.getTarget(), newDoc.name);
2018-02-19 06:31:07 +00:00
if (formModal.form.doc.meta.hasField('name')) {
formModal.form.doc.set('name', this.input.value);
}
formModal.once('save', async () => {
2018-02-13 11:54:57 +00:00
await this.updateDocValue(formModal.form.doc.name);
2018-02-19 06:31:07 +00:00
});
}
2018-01-23 12:31:09 +00:00
});
2018-02-15 09:53:28 +00:00
2018-01-23 12:26:40 +00:00
}
2018-01-23 12:48:27 +00:00
2018-02-08 09:38:47 +00:00
async getList(query) {
return (await frappe.db.getAll({
2018-03-27 13:55:26 +00:00
doctype: this.getTarget(),
2018-03-08 13:31:22 +00:00
filters: this.getFilters(query, this),
2018-01-23 12:48:27 +00:00
limit: 50
})).map(d => d.name);
}
2018-02-08 09:38:47 +00:00
getFilters(query) {
2018-01-23 12:48:27 +00:00
return { keywords: ["like", query] }
}
2018-03-27 13:55:26 +00:00
getTarget() {
return this.target;
}
2018-01-23 12:26:40 +00:00
};
module.exports = LinkControl;