From 8df658112f58b956c3def7b270ca1b992b3f23ff Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 23 Jan 2018 17:56:40 +0530 Subject: [PATCH] [new control] link --- backends/sqlite.js | 15 ++++++++++--- client/style/index.scss | 37 ++++++++++++++++++++++++++++++++- client/view/controls/index.html | 11 ++++++++++ client/view/controls/index.js | 3 ++- client/view/controls/link.js | 26 +++++++++++++++++++++++ package.json | 1 + server/index.js | 1 - server/rest_api.js | 2 +- utils/index.js | 2 +- yarn.lock | 4 ++++ 10 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 client/view/controls/index.html create mode 100644 client/view/controls/link.js diff --git a/backends/sqlite.js b/backends/sqlite.js index 961bd4a4..2db3a19a 100644 --- a/backends/sqlite.js +++ b/backends/sqlite.js @@ -1,5 +1,6 @@ const frappe = require('frappejs'); const sqlite3 = require('sqlite3').verbose(); +const debug = false; class sqliteDatabase { constructor({db_path}) { @@ -13,8 +14,9 @@ class sqliteDatabase { } return new Promise(resolve => { this.conn = new sqlite3.Database(this.db_path, () => { - // debug - // this.conn.on('trace', (trace) => console.log(trace)); + if (debug) { + this.conn.on('trace', (trace) => console.log(trace)); + } resolve(); }); }); @@ -119,7 +121,10 @@ class sqliteDatabase { return await this.run(`delete from ${frappe.slug(doctype)} where name=?`, name); } - get_all({doctype, fields=['name'], filters, start, limit, order_by='modified', order='desc'} = {}) { + get_all({doctype, fields, filters, start, limit, order_by='modified', order='desc'} = {}) { + if (!fields) { + fields = frappe.get_meta(doctype).get_keyword_fields(); + } return new Promise((resolve, reject) => { let conditions = this.get_filter_conditions(filters); @@ -147,6 +152,10 @@ class sqliteDatabase { for (let key in filters) { const value = filters[key]; if (value instanceof Array) { + // if its like, we should add the wildcard "%" if the user has not added + if (value[0].toLowerCase()==='like' && !value[1].includes('%')) { + value[1] = `%${value[1]}%`; + } conditions.push(`${key} ${value[0]} ?`); values.push(value[1]); } else { diff --git a/client/style/index.scss b/client/style/index.scss index 76c22d0d..0cacd4ae 100644 --- a/client/style/index.scss +++ b/client/style/index.scss @@ -1,4 +1,5 @@ @import "node_modules/bootstrap/scss/bootstrap"; +@import "node_modules/awesomplete/awesomplete"; html { font-size: 14px; @@ -29,4 +30,38 @@ html { .dropdown-menu-right { right: 0; left: auto; -} \ No newline at end of file +} + +.awesomplete { + display: block; +} + +.awesomplete > ul > li { + padding: .75rem .375rem; +} + +.awesomplete > ul > li:hover { + background: $gray-300; + color: $body-color; +} + +.awesomplete > ul > li[aria-selected="true"] { + background: $gray-300; + color: $body-color; +} + +.awesomplete > ul > li[aria-selected="true"]:hover { + background: $gray-300; + color: $body-color; +} + +mark { + padding: none; + background: inherit; +} + +.awesomplete li[aria-selected="true"] mark, .awesomplete li[aria-selected="false"] mark { + background: inherit; + color: inherit; + padding: 0px; +} diff --git a/client/view/controls/index.html b/client/view/controls/index.html new file mode 100644 index 00000000..4c30fd01 --- /dev/null +++ b/client/view/controls/index.html @@ -0,0 +1,11 @@ + + + + + + Document + + + + + \ No newline at end of file diff --git a/client/view/controls/index.js b/client/view/controls/index.js index ee02b35a..fe4b4f97 100644 --- a/client/view/controls/index.js +++ b/client/view/controls/index.js @@ -1,7 +1,8 @@ const control_classes = { Data: require('./data'), Text: require('./text'), - Select: require('./select') + Select: require('./select'), + Link: require('./link') } diff --git a/client/view/controls/link.js b/client/view/controls/link.js new file mode 100644 index 00000000..529fca2d --- /dev/null +++ b/client/view/controls/link.js @@ -0,0 +1,26 @@ +const frappe = require('frappejs'); +const BaseControl = require('./base'); +const Awesomplete = require('awesomplete'); + +class LinkControl extends BaseControl { + make() { + super.make(); + this.input.setAttribute('type', 'text'); + this.awesomplete = new Awesomplete(this.input, { + autoFirst: true, + minChars: 0, + maxItems: 99 + }); + + // rebuild the list on input + this.input.addEventListener('input', async (event) => { + this.awesomplete.list = (await frappe.db.get_all({ + doctype: this.options, + filters: {keywords: ["like", this.input.value]}, + limit: 50 + })).map(d => d.name); + }); + } +}; + +module.exports = LinkControl; \ No newline at end of file diff --git a/package.json b/package.json index 1b96dcbf..1436b0a3 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "start": "nodemon app.js" }, "dependencies": { + "awesomplete": "^1.1.2", "body-parser": "^1.18.2", "bootstrap": "^4.0.0", "express": "^4.16.2", diff --git a/server/index.js b/server/index.js index e7441a98..0428cf32 100644 --- a/server/index.js +++ b/server/index.js @@ -16,7 +16,6 @@ module.exports = { models.init_models(path.resolve('node_modules', 'frappejs', 'models')); models.init_models(models_path); - console.log(frappe.models.controllers); await this.init_db({backend:backend, connection_params:connection_params}); // database diff --git a/server/rest_api.js b/server/rest_api.js index 21215736..50e5a8c3 100644 --- a/server/rest_api.js +++ b/server/rest_api.js @@ -13,7 +13,7 @@ module.exports = { let data = await frappe.db.get_all({ doctype: request.params.doctype, - fields: request.query.fields || ['name', 'subject'], + fields: request.query.fields, filters: request.query.filters, start: request.query.start || 0, limit: request.query.limit || 20, diff --git a/utils/index.js b/utils/index.js index de6e5543..803c4abb 100644 --- a/utils/index.js +++ b/utils/index.js @@ -8,7 +8,7 @@ module.exports = { .catch((err) => { console.log(err); // handle error - res.status(err ? err.status_code : 500).send({ error: err ? err.message : 'Unknown Error'}); + res.status(err.status_code || 500).send({error: err.message}); }); }, diff --git a/yarn.lock b/yarn.lock index a067e1c0..60148838 100644 --- a/yarn.lock +++ b/yarn.lock @@ -216,6 +216,10 @@ autoprefixer@^6.3.1: postcss "^5.2.16" postcss-value-parser "^3.2.3" +awesomplete@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/awesomplete/-/awesomplete-1.1.2.tgz#b6e253f73474e46278bba5ae7f81d4262160fb75" + aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"