From dad80a1ed17b505c4b5ed2e4f6ba5c7955a899b0 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Fri, 1 May 2020 11:21:50 +0530 Subject: [PATCH 01/15] feat: Resesign Multiselect Dialog --- .../js/frappe/form/multi_select_dialog.js | 249 ++++++++++-------- 1 file changed, 139 insertions(+), 110 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index cdd385a6ea..40c2a92113 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -1,83 +1,42 @@ -// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -// MIT License. See license.txt - frappe.ui.form.MultiSelectDialog = Class.extend({ - init: function(opts) { - /* Options: doctype, target, setters, get_query, action */ + init: function (opts) { + /* Options: doctype, target, setters, get_query, action, add_filters_group, data_fields, primary_action_label */ $.extend(this, opts); - var me = this; - if(this.doctype!="[Select]") { - frappe.model.with_doctype(this.doctype, function(r) { + if (this.doctype != "[Select]") { + frappe.model.with_doctype(this.doctype, function () { me.make(); }); } else { this.make(); } }, - make: function() { + make: function () { let me = this; this.page_length = 20; this.start = 0; - let fields = [ - { - fieldtype: "Data", - label: __("Search Term"), - fieldname: "search_term" - }, - { - fieldtype: "Column Break" - } - ]; - let count = 0; - if(!this.date_field) { - this.date_field = "transaction_date"; - } + let fields = []; - // setters can be defined as a dict or a list of fields - // setters define the additional filters that get applied - // for selection + let header_fields = this.make_dialog_header(); - // CASE 1: DocType name and fieldname is the same, example "customer" and "customer" - // setters define the filters applied in the modal - // if the fieldnames and doctypes are consistently named, - // pass a dict with the setter key and value, for example - // {customer: [customer_name]} + fields = fields.concat(header_fields); - // CASE 2: if the fieldname of the target is different, - // then pass a list of fields with appropriate fieldname - - if($.isArray(this.setters)) { - for (let df of this.setters) { - fields.push(df, {fieldtype: "Column Break"}); - } - } else { - Object.keys(this.setters).forEach(function(setter) { - fields.push({ - fieldtype: me.target.fields_dict[setter].df.fieldtype, - label: me.target.fields_dict[setter].df.label, - fieldname: setter, - options: me.target.fields_dict[setter].df.options, - default: me.setters[setter] - }); - if (count++ < Object.keys(me.setters).length) { - fields.push({fieldtype: "Column Break"}); - } - }); + if (this.add_filters_group) { + fields = fields.concat([ + { + fieldtype: 'HTML', + fieldname: 'filter_area', + }, + ]); } fields = fields.concat([ - { - "fieldname":"date_range", - "label": __("Date Range"), - "fieldtype": "DateRange", - }, - { fieldtype: "Section Break" }, { fieldtype: "HTML", fieldname: "results_area" }, - { fieldtype: "Button", fieldname: "more_btn", label: __("More"), - click: function(){ + { + fieldtype: "Button", fieldname: "more_btn", label: __("More"), + click: function () { me.start += 20; frappe.flags.auto_scroll = true; me.get_results(); @@ -85,26 +44,33 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ } ]); + if (this.data_fields) { + fields = fields.concat([{ fieldtype: "Section Break" }]); + fields = fields.concat(this.data_fields); + + } + let doctype_plural = !this.doctype.endsWith('y') ? this.doctype + 's' : this.doctype.slice(0, -1) + 'ies'; this.dialog = new frappe.ui.Dialog({ - title: __("Select {0}", [(this.doctype=='[Select]') ? __("value") : __(doctype_plural)]), + title: __("Select {0}", [(this.doctype == '[Select]') ? __("value") : __(doctype_plural)]), fields: fields, - primary_action_label: __("Get Items"), + primary_action_label: this.primary_action_label || __("Get Items"), secondary_action_label: __("Make {0}", [me.doctype]), - primary_action: function() { - me.action(me.get_checked_values(), me.args); + primary_action: function () { + let filters_data = me.get_filters(); + me.action(me.get_checked_values(), cur_dialog.get_values(), me.args, filters_data); }, - secondary_action: function(e) { + secondary_action: function (e) { // If user wants to close the modal if (e) { frappe.route_options = {}; - if($.isArray(me.setters)) { + if ($.isArray(me.setters)) { for (let df of me.setters) { frappe.route_options[df.fieldname] = me.dialog.fields_dict[df.fieldname].get_value() || undefined; } } else { - Object.keys(me.setters).forEach(function(setter) { + Object.keys(me.setters).forEach(function (setter) { frappe.route_options[setter] = me.dialog.fields_dict[setter].get_value() || undefined; }); } @@ -114,6 +80,10 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ } }); + if (this.add_filters_group) { + this.make_filter_area(); + } + this.$parent = $(this.dialog.body); this.$wrapper = this.dialog.fields_dict.results_area.$wrapper.append(`
`); @@ -128,7 +98,80 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ this.dialog.show(); }, - bind_events: function() { + make_dialog_header: function () { + let fields = []; + let me = this; + this.col_0 = [ + { + fieldtype: "Data", + label: __("Search Term"), + fieldname: "search_term" + } + ]; + this.col_1 = []; + this.col_2 = []; + + // setters can be defined as a dict or a list of fields + // setters define the additional filters that get applied + // for selection + + // CASE 1: DocType name and fieldname is the same, example "customer" and "customer" + // setters define the filters applied in the modal + // if the fieldnames and doctypes are consistently named, + // pass a dict with the setter key and value, for example + // {customer: [customer_name]} + + // CASE 2: if the fieldname of the target is different, + // then pass a list of fields with appropriate + + if ($.isArray(this.setters)) { // need to figure out + for (let df of this.setters) { + fields.push(df, { fieldtype: "Column Break" }); + } + } else { + Object.keys(this.setters).forEach(function (setter, index) { + // x['group_' + cstr((index+1)%4)].push(setter); + let df_prop = frappe.meta.docfield_map[me.doctype][setter]; + // this[]push({fieldtype: "Column Break"}); + me['col_' + cstr((index + 1) % 3)].push({ + fieldtype: df_prop.fieldtype, + label: df_prop.label, + fieldname: setter, + options: df_prop.options, + default: me.setters[setter] + }); + }); + } + + fields = fields.concat(this.col_0); + fields = fields.concat({ fieldtype: "Column Break" }); + fields = fields.concat(this.col_1); + fields = fields.concat({ fieldtype: "Column Break" }); + fields = fields.concat(this.col_2); + + fields = fields.concat({ fieldtype: "Section Break" }); + return fields; + }, + + make_filter_area: function () { + this.filter_group = new frappe.ui.FilterGroup({ + parent: this.dialog.get_field('filter_area').$wrapper, + doctype: this.doctype, + on_change: () => { + this.get_results(); + } + }); + }, + + get_filters: function () { + return this.filter_group.get_filters().reduce((acc, filter) => { + return Object.assign(acc, { + [filter[1]]: [filter[2], filter[3]] + }); + }, {}); + }, + + bind_events: function () { let me = this; this.$results.on('click', '.list-item-container', function (e) { @@ -145,16 +188,10 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ frappe.flags.auto_scroll = false; this.get_results(); }); - - this.$parent.find('[data-fieldname="date_range"]').on('blur', (e) => { - frappe.flags.auto_scroll = false; - this.get_results(); - }); - this.$parent.find('[data-fieldname="search_term"]').on('input', (e) => { var $this = $(this); clearTimeout($this.data('timeout')); - $this.data('timeout', setTimeout(function() { + $this.data('timeout', setTimeout(function () { frappe.flags.auto_scroll = false; me.empty_list(); me.get_results(); @@ -162,22 +199,22 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ }); }, - get_checked_values: function() { + get_checked_values: function () { // Return name of checked value. - return this.$results.find('.list-item-container').map(function() { - if ($(this).find('.list-row-check:checkbox:checked').length > 0 ) { + return this.$results.find('.list-item-container').map(function () { + if ($(this).find('.list-row-check:checkbox:checked').length > 0) { return $(this).attr('data-item-name'); } }).get(); }, - get_checked_items: function() { + get_checked_items: function () { // Return checked items with all the column values. let checked_values = this.get_checked_values(); return this.results.filter(res => checked_values.includes(res.name)); }, - make_list_row: function(result={}) { + make_list_row: function (result = {}) { var me = this; // Make a head row by default (if result not passed) let head = Object.keys(result).length === 0; @@ -185,26 +222,24 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ let contents = ``; let columns = ["name"]; - if($.isArray(this.setters)) { + if ($.isArray(this.setters)) { for (let df of this.setters) { columns.push(df.fieldname); } } else { columns = columns.concat(Object.keys(this.setters)); } - columns.push("Date"); - columns.forEach(function(column) { + columns.forEach(function (column) { contents += `
${ - head ? `${__(frappe.model.unscrub(column))}` - + head ? `${__(frappe.model.unscrub(column))}` : (column !== "name" ? `${__(result[column])}` - : ` + : ` ${__(result[column])}`) }
`; - }) + }); let $row = $(`
@@ -215,10 +250,12 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ head ? $row.addClass('list-item--head') : $row = $(`
`).append($row); + + $(".modal-dialog .list-item--head").css("z-index", 0); return $row; }, - render_result_list: function(results, more = 0, empty=true) { + render_result_list: function (results, more = 0, empty = true) { var me = this; var more_btn = me.dialog.fields_dict.more_btn.$wrapper; @@ -240,44 +277,43 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ }); if (frappe.flags.auto_scroll) { - this.$results.animate({scrollTop: me.$results.prop('scrollHeight')}, 500); + this.$results.animate({ scrollTop: me.$results.prop('scrollHeight') }, 500); } }, - empty_list: function() { + empty_list: function () { let checked = this.get_checked_items().map(item => { return { ...item, checked: true - } + }; }); this.$results.find('.list-item-container').remove(); this.render_result_list(checked, 0, false); }, - get_results: function() { + get_results: function () { let me = this; - let filters = this.get_query ? this.get_query().filters : {}; - let filter_fields = [me.date_field]; - if($.isArray(this.setters)) { + let filters = this.get_query ? this.get_query().filters : {} || {}; + // let filter_fields = [me.date_field]; + let filter_fields = []; + if ($.isArray(this.setters)) { for (let df of this.setters) { filters[df.fieldname] = me.dialog.fields_dict[df.fieldname].get_value() || undefined; me.args[df.fieldname] = filters[df.fieldname]; filter_fields.push(df.fieldname); } } else { - Object.keys(this.setters).forEach(function(setter) { + Object.keys(this.setters).forEach(function (setter) { filters[setter] = me.dialog.fields_dict[setter].get_value() || undefined; me.args[setter] = filters[setter]; filter_fields.push(setter); }); } - let date_val = this.dialog.fields_dict["date_range"].get_value(); - if(date_val) { - filters[this.date_field] = ['between', date_val]; - } + let filter_group = this.get_filters(); + $.extend(filters, filter_group); let args = { doctype: me.doctype, @@ -288,13 +324,13 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ page_length: this.page_length + 1, query: this.get_query ? this.get_query().query : '', as_dict: 1 - } + }; frappe.call({ type: "GET", - method:'frappe.desk.search.search_widget', + method: 'frappe.desk.search.search_widget', no_spinner: true, args: args, - callback: function(r) { + callback: function (r) { let more = 0; me.results = []; if (r.values.length) { @@ -302,18 +338,11 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ r.values.pop(); more = 1; } - r.values.forEach(function(result) { - if(me.date_field in result) { - result["Date"] = result[me.date_field] - } + r.values.forEach(function (result) { result.checked = 0; result.parsed_date = Date.parse(result["Date"]); me.results.push(result); }); - me.results.map( (result) => { - result["Date"] = frappe.format(result["Date"], {"fieldtype":"Date"}); - }) - me.results.sort((a, b) => { return a.parsed_date - b.parsed_date; }); From a3659684f511f84064751a2b4c6daf97cb55fd49 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Wed, 6 May 2020 18:53:32 +0530 Subject: [PATCH 02/15] fix:changes requested --- .../js/frappe/form/multi_select_dialog.js | 54 ++++++++----------- frappe/public/js/frappe/utils/utils.js | 4 ++ 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index 40c2a92113..a8e64543e8 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -13,23 +13,16 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ }, make: function () { let me = this; - this.page_length = 20; this.start = 0; - - let fields = []; - - let header_fields = this.make_dialog_header(); - - fields = fields.concat(header_fields); - + let fields = this.get_fields_for_header(); if (this.add_filters_group) { - fields = fields.concat([ + fields.push( { fieldtype: 'HTML', fieldname: 'filter_area', - }, - ]); + } + ); } fields = fields.concat([ @@ -45,13 +38,11 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ ]); if (this.data_fields) { - fields = fields.concat([{ fieldtype: "Section Break" }]); + fields.push({ fieldtype: "Section Break" }); fields = fields.concat(this.data_fields); - } - let doctype_plural = !this.doctype.endsWith('y') ? this.doctype + 's' - : this.doctype.slice(0, -1) + 'ies'; + let doctype_plural =frappe.utils.get_doctype_plural(this.doctype); this.dialog = new frappe.ui.Dialog({ title: __("Select {0}", [(this.doctype == '[Select]') ? __("value") : __(doctype_plural)]), fields: fields, @@ -65,7 +56,7 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ // If user wants to close the modal if (e) { frappe.route_options = {}; - if ($.isArray(me.setters)) { + if (Array.isArray(me.setters)) { for (let df of me.setters) { frappe.route_options[df.fieldname] = me.dialog.fields_dict[df.fieldname].get_value() || undefined; } @@ -98,18 +89,19 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ this.dialog.show(); }, - make_dialog_header: function () { + get_fields_for_header: function () { let fields = []; let me = this; - this.col_0 = [ + let columns = {}; + columns['col_0'] = [ { fieldtype: "Data", label: __("Search Term"), fieldname: "search_term" } ]; - this.col_1 = []; - this.col_2 = []; + columns['col_1'] = []; + columns['col_2'] = []; // setters can be defined as a dict or a list of fields // setters define the additional filters that get applied @@ -124,16 +116,14 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ // CASE 2: if the fieldname of the target is different, // then pass a list of fields with appropriate - if ($.isArray(this.setters)) { // need to figure out + if (Array.isArray(this.setters)) { for (let df of this.setters) { fields.push(df, { fieldtype: "Column Break" }); } } else { Object.keys(this.setters).forEach(function (setter, index) { - // x['group_' + cstr((index+1)%4)].push(setter); let df_prop = frappe.meta.docfield_map[me.doctype][setter]; - // this[]push({fieldtype: "Column Break"}); - me['col_' + cstr((index + 1) % 3)].push({ + columns['col_' + cstr((index + 1) % 3)].push({ fieldtype: df_prop.fieldtype, label: df_prop.label, fieldname: setter, @@ -143,12 +133,12 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ }); } - fields = fields.concat(this.col_0); - fields = fields.concat({ fieldtype: "Column Break" }); - fields = fields.concat(this.col_1); - fields = fields.concat({ fieldtype: "Column Break" }); - fields = fields.concat(this.col_2); - + for (let i = 0; i < 3; i++) { + fields = fields.concat(columns['col_' + cstr(i)]); + if (i != 2) { + fields = fields.concat({ fieldtype: "Column Break" }); + } + } fields = fields.concat({ fieldtype: "Section Break" }); return fields; }, @@ -222,7 +212,7 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ let contents = ``; let columns = ["name"]; - if ($.isArray(this.setters)) { + if (Array.isArray(this.setters)) { for (let df of this.setters) { columns.push(df.fieldname); } @@ -298,7 +288,7 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ let filters = this.get_query ? this.get_query().filters : {} || {}; // let filter_fields = [me.date_field]; let filter_fields = []; - if ($.isArray(this.setters)) { + if (Array.isArray(this.setters)) { for (let df of this.setters) { filters[df.fieldname] = me.dialog.fields_dict[df.fieldname].get_value() || undefined; me.args[df.fieldname] = filters[df.fieldname]; diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 7d2c20c693..ba11374a4f 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -803,7 +803,11 @@ Object.assign(frappe.utils, { name: M[0], version: M[1], }; + }, + get_doctype_plural(doctype) { + return !doctype.endsWith('y') ? doctype + 's': doctype.slice(0, -1) + 'ies'; } + }); // Array de duplicate From 4d741916b0d02c9f37dadb478644b3afe0f4c00d Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Mon, 18 May 2020 12:05:33 +0530 Subject: [PATCH 03/15] fix: requested changes --- .../js/frappe/form/multi_select_dialog.js | 50 ++++++------------- .../website_theme/standard/standard.json | 5 +- 2 files changed, 17 insertions(+), 38 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index a8e64543e8..61375aaedd 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -116,22 +116,16 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ // CASE 2: if the fieldname of the target is different, // then pass a list of fields with appropriate - if (Array.isArray(this.setters)) { - for (let df of this.setters) { - fields.push(df, { fieldtype: "Column Break" }); - } - } else { - Object.keys(this.setters).forEach(function (setter, index) { - let df_prop = frappe.meta.docfield_map[me.doctype][setter]; - columns['col_' + cstr((index + 1) % 3)].push({ - fieldtype: df_prop.fieldtype, - label: df_prop.label, - fieldname: setter, - options: df_prop.options, - default: me.setters[setter] - }); + Object.keys(this.setters).forEach(function (setter, index) { + let df_prop = frappe.meta.docfield_map[me.doctype][setter]; + columns['col_' + cstr((index + 1) % 3)].push({ + fieldtype: df_prop.fieldtype, + label: df_prop.label, + fieldname: setter, + options: df_prop.options, + default: me.setters[setter] }); - } + }); for (let i = 0; i < 3; i++) { fields = fields.concat(columns['col_' + cstr(i)]); @@ -212,13 +206,7 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ let contents = ``; let columns = ["name"]; - if (Array.isArray(this.setters)) { - for (let df of this.setters) { - columns.push(df.fieldname); - } - } else { - columns = columns.concat(Object.keys(this.setters)); - } + columns = columns.concat(Object.keys(this.setters)); columns.forEach(function (column) { contents += `
@@ -288,19 +276,11 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ let filters = this.get_query ? this.get_query().filters : {} || {}; // let filter_fields = [me.date_field]; let filter_fields = []; - if (Array.isArray(this.setters)) { - for (let df of this.setters) { - filters[df.fieldname] = me.dialog.fields_dict[df.fieldname].get_value() || undefined; - me.args[df.fieldname] = filters[df.fieldname]; - filter_fields.push(df.fieldname); - } - } else { - Object.keys(this.setters).forEach(function (setter) { - filters[setter] = me.dialog.fields_dict[setter].get_value() || undefined; - me.args[setter] = filters[setter]; - filter_fields.push(setter); - }); - } + Object.keys(this.setters).forEach(function (setter) { + filters[setter] = me.dialog.fields_dict[setter].get_value() || undefined; + me.args[setter] = filters[setter]; + filter_fields.push(setter); + }); let filter_group = this.get_filters(); $.extend(filters, filter_group); diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 9365d5be27..fc80ba82dc 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -4,13 +4,12 @@ "button_shadows": 0, "creation": "2015-02-19 13:37:33.925909", "custom": 0, - "custom_css": "", "custom_overrides": "", "docstatus": 0, "doctype": "Website Theme", "font_properties": "400,500,600,700,800", "idx": 26, - "modified": "2020-05-09 16:44:18.508471", + "modified": "2020-05-18 11:52:41.949264", "modified_by": "Administrator", "module": "Website", "name": "Standard", @@ -18,4 +17,4 @@ "theme": "Standard", "theme_scss": "$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n// Bootstrap Variable Overrides\n\n\n@import \"frappe/public/scss/website\";\n\n\n\n// Custom Theme\n", "theme_url": "/assets/css/standard_style.css" -} +} \ No newline at end of file From 520342a2d2c41d61be7224ab8a9d42e2ce3ef398 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Mon, 18 May 2020 19:00:55 +0530 Subject: [PATCH 04/15] fix: requested changes --- .../js/frappe/form/multi_select_dialog.js | 51 ++++++++++++------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index 61375aaedd..1e70c74782 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -96,7 +96,7 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ columns['col_0'] = [ { fieldtype: "Data", - label: __("Search Term"), + label: __("Search"), fieldname: "search_term" } ]; @@ -133,7 +133,7 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ fields = fields.concat({ fieldtype: "Column Break" }); } } - fields = fields.concat({ fieldtype: "Section Break" }); + fields = fields.concat({ fieldtype: "Section Break", fieldname: "hello" }); return fields; }, @@ -148,11 +148,15 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ }, get_filters: function () { - return this.filter_group.get_filters().reduce((acc, filter) => { - return Object.assign(acc, { - [filter[1]]: [filter[2], filter[3]] - }); - }, {}); + if (this.add_filters_group) { + return this.filter_group.get_filters().reduce((acc, filter) => { + return Object.assign(acc, { + [filter[1]]: [filter[2], filter[3]] + }); + }, {}); + } else { + return []; + } }, bind_events: function () { @@ -163,16 +167,25 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ $(this).find(':checkbox').trigger('click'); } }); + this.$results.on('click', '.list-item--head :checkbox', (e) => { this.$results.find('.list-item-container .list-row-check') .prop("checked", ($(e.target).is(':checked'))); }); this.$parent.find('.input-with-feedback').on('change', (e) => { + // debugger; frappe.flags.auto_scroll = false; this.get_results(); }); - this.$parent.find('[data-fieldname="search_term"]').on('input', (e) => { + // this.$parent.find('[data-fieldtype="Link"]').on('change', (e) => { + // // debugger; + // frappe.flags.auto_scroll = false; + // console.log("cool"); + // this.get_results(); + // }); + + this.$parent.find('[data-fieldtype="Data"]').on('input', (e) => { var $this = $(this); clearTimeout($this.data('timeout')); $this.data('timeout', setTimeout(function () { @@ -211,10 +224,10 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ columns.forEach(function (column) { contents += `
${ - head ? `${__(frappe.model.unscrub(column))}` - : (column !== "name" ? `${__(result[column])}` - : ` - ${__(result[column])}`) + head ? `${__(frappe.model.unscrub(column))}` + : (column !== "name" ? `${__(result[column] || '')}` + : ` + ${__(result[column] || '')}`) }
`; }); @@ -272,16 +285,18 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ get_results: function () { let me = this; - let filters = this.get_query ? this.get_query().filters : {} || {}; - // let filter_fields = [me.date_field]; let filter_fields = []; Object.keys(this.setters).forEach(function (setter) { - filters[setter] = me.dialog.fields_dict[setter].get_value() || undefined; - me.args[setter] = filters[setter]; - filter_fields.push(setter); + var value = me.dialog.fields_dict[setter].get_value(); + if (me.dialog.fields_dict[setter].df.fieldtype == "Data" && value) { + filters[setter] = ["like", "%"+value+"%"]; + } else { + filters[setter] = value || undefined; + me.args[setter] = filters[setter]; + filter_fields.push(setter); + } }); - let filter_group = this.get_filters(); $.extend(filters, filter_group); From 1f0d1475c5d1c9dedf6fe6a92322f413f9758b23 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 19 May 2020 19:14:50 +0530 Subject: [PATCH 05/15] refactor: use modern JS Class --- .../js/frappe/form/multi_select_dialog.js | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index 1e70c74782..3465a7e6ff 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -1,7 +1,7 @@ -frappe.ui.form.MultiSelectDialog = Class.extend({ - init: function (opts) { +frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { + constructor(opts) { /* Options: doctype, target, setters, get_query, action, add_filters_group, data_fields, primary_action_label */ - $.extend(this, opts); + Object.assign(this, opts); var me = this; if (this.doctype != "[Select]") { frappe.model.with_doctype(this.doctype, function () { @@ -10,8 +10,9 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ } else { this.make(); } - }, - make: function () { + } + + make() { let me = this; this.page_length = 20; this.start = 0; @@ -87,9 +88,9 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ this.bind_events(); this.get_results(); this.dialog.show(); - }, + } - get_fields_for_header: function () { + get_fields_for_header() { let fields = []; let me = this; let columns = {}; @@ -135,9 +136,9 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ } fields = fields.concat({ fieldtype: "Section Break", fieldname: "hello" }); return fields; - }, + } - make_filter_area: function () { + make_filter_area() { this.filter_group = new frappe.ui.FilterGroup({ parent: this.dialog.get_field('filter_area').$wrapper, doctype: this.doctype, @@ -145,9 +146,9 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ this.get_results(); } }); - }, + } - get_filters: function () { + get_filters() { if (this.add_filters_group) { return this.filter_group.get_filters().reduce((acc, filter) => { return Object.assign(acc, { @@ -157,9 +158,9 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ } else { return []; } - }, + } - bind_events: function () { + bind_events() { let me = this; this.$results.on('click', '.list-item-container', function (e) { @@ -194,24 +195,24 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ me.get_results(); }, 300)); }); - }, + } - get_checked_values: function () { + get_checked_values() { // Return name of checked value. return this.$results.find('.list-item-container').map(function () { if ($(this).find('.list-row-check:checkbox:checked').length > 0) { return $(this).attr('data-item-name'); } }).get(); - }, + } - get_checked_items: function () { + get_checked_items() { // Return checked items with all the column values. let checked_values = this.get_checked_values(); return this.results.filter(res => checked_values.includes(res.name)); - }, + } - make_list_row: function (result = {}) { + make_list_row(result = {}) { var me = this; // Make a head row by default (if result not passed) let head = Object.keys(result).length === 0; @@ -244,9 +245,9 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ $(".modal-dialog .list-item--head").css("z-index", 0); return $row; - }, + } - render_result_list: function (results, more = 0, empty = true) { + render_result_list(results, more = 0, empty = true) { var me = this; var more_btn = me.dialog.fields_dict.more_btn.$wrapper; @@ -270,9 +271,9 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ if (frappe.flags.auto_scroll) { this.$results.animate({ scrollTop: me.$results.prop('scrollHeight') }, 500); } - }, + } - empty_list: function () { + empty_list() { let checked = this.get_checked_items().map(item => { return { ...item, @@ -281,9 +282,9 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ }); this.$results.find('.list-item-container').remove(); this.render_result_list(checked, 0, false); - }, + } - get_results: function () { + get_results() { let me = this; let filters = this.get_query ? this.get_query().filters : {} || {}; let filter_fields = []; @@ -298,7 +299,7 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ } }); let filter_group = this.get_filters(); - $.extend(filters, filter_group); + Object.assign(filters, filter_group); let args = { doctype: me.doctype, @@ -340,6 +341,5 @@ frappe.ui.form.MultiSelectDialog = Class.extend({ me.render_result_list(me.results, more); } }); - }, - -}); \ No newline at end of file + } +}; \ No newline at end of file From ea99865f3f9e580cb5986cc5a7720b04d31fe09f Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 19 May 2020 19:25:52 +0530 Subject: [PATCH 06/15] style: clean up fields creation --- .../js/frappe/form/multi_select_dialog.js | 75 ++++++++++--------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index 3465a7e6ff..2f86df3182 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -16,15 +16,7 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { let me = this; this.page_length = 20; this.start = 0; - let fields = this.get_fields_for_header(); - if (this.add_filters_group) { - fields.push( - { - fieldtype: 'HTML', - fieldname: 'filter_area', - } - ); - } + let fields = this.get_primary_filters(); fields = fields.concat([ { fieldtype: "HTML", fieldname: "results_area" }, @@ -90,51 +82,62 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { this.dialog.show(); } - get_fields_for_header() { + get_primary_filters() { let fields = []; let me = this; - let columns = {}; - columns['col_0'] = [ + + let columns = new Array(3); + + // Hack for three column layout + // To add column break + columns[0] = [ { fieldtype: "Data", label: __("Search"), fieldname: "search_term" } ]; - columns['col_1'] = []; - columns['col_2'] = []; + columns[1] = []; + columns[2] = []; - // setters can be defined as a dict or a list of fields - // setters define the additional filters that get applied - // for selection + Object.keys(this.setters).forEach((setter, index) => { + let df_prop = frappe.meta.docfield_map[this.doctype][setter]; - // CASE 1: DocType name and fieldname is the same, example "customer" and "customer" - // setters define the filters applied in the modal - // if the fieldnames and doctypes are consistently named, - // pass a dict with the setter key and value, for example - // {customer: [customer_name]} - - // CASE 2: if the fieldname of the target is different, - // then pass a list of fields with appropriate - - Object.keys(this.setters).forEach(function (setter, index) { - let df_prop = frappe.meta.docfield_map[me.doctype][setter]; - columns['col_' + cstr((index + 1) % 3)].push({ + // Index + 1 to start filling from index 1 + // Since Search is a standrd field already pushed + columns[(index + 1) % 3].push({ fieldtype: df_prop.fieldtype, label: df_prop.label, fieldname: setter, options: df_prop.options, - default: me.setters[setter] + default: this.setters[setter] }); }); - for (let i = 0; i < 3; i++) { - fields = fields.concat(columns['col_' + cstr(i)]); - if (i != 2) { - fields = fields.concat({ fieldtype: "Column Break" }); - } + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal + if(Object.seal) { + Object.seal(columns); + // now a is a fixed-size array with mutable entries } - fields = fields.concat({ fieldtype: "Section Break", fieldname: "hello" }); + + fields = [ + ...columns[0], + { fieldtype: "Column Break" }, + ...columns[1], + { fieldtype: "Column Break" }, + ...columns[2], + { fieldtype: "Section Break", fieldname: "primary_filters_sb" } + ] + + if (this.add_filters_group) { + fields.push( + { + fieldtype: 'HTML', + fieldname: 'filter_area', + } + ); + } + return fields; } From ad744effc930c27f897d434a9cc35d94e46e9aae Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 19 May 2020 19:29:35 +0530 Subject: [PATCH 07/15] style: minor clean for make --- frappe/public/js/frappe/form/multi_select_dialog.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index 2f86df3182..4eec460d65 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -18,24 +18,27 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { this.start = 0; let fields = this.get_primary_filters(); + // Make results area fields = fields.concat([ { fieldtype: "HTML", fieldname: "results_area" }, { fieldtype: "Button", fieldname: "more_btn", label: __("More"), - click: function () { - me.start += 20; + click: () => { + this.start += 20; frappe.flags.auto_scroll = true; - me.get_results(); + this.get_results(); } } ]); + // Custom Data Fields if (this.data_fields) { fields.push({ fieldtype: "Section Break" }); fields = fields.concat(this.data_fields); } - let doctype_plural =frappe.utils.get_doctype_plural(this.doctype); + let doctype_plural = frappe.utils.get_doctype_plural(this.doctype); + this.dialog = new frappe.ui.Dialog({ title: __("Select {0}", [(this.doctype == '[Select]') ? __("value") : __(doctype_plural)]), fields: fields, From 1b559e448c99ba897916145378ca72b7de4c2cfe Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 19 May 2020 19:35:22 +0530 Subject: [PATCH 08/15] refactor: rename get_fitlers to get_custom_filters --- frappe/public/js/frappe/form/multi_select_dialog.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index 4eec460d65..a231c0bac3 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -45,7 +45,7 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { primary_action_label: this.primary_action_label || __("Get Items"), secondary_action_label: __("Make {0}", [me.doctype]), primary_action: function () { - let filters_data = me.get_filters(); + let filters_data = me.get_custom_filters(); me.action(me.get_checked_values(), cur_dialog.get_values(), me.args, filters_data); }, secondary_action: function (e) { @@ -154,8 +154,8 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { }); } - get_filters() { - if (this.add_filters_group) { + get_custom_filters() { + if (this.add_filters_group && this.filter_group) { return this.filter_group.get_filters().reduce((acc, filter) => { return Object.assign(acc, { [filter[1]]: [filter[2], filter[3]] @@ -294,6 +294,7 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { let me = this; let filters = this.get_query ? this.get_query().filters : {} || {}; let filter_fields = []; + Object.keys(this.setters).forEach(function (setter) { var value = me.dialog.fields_dict[setter].get_value(); if (me.dialog.fields_dict[setter].df.fieldtype == "Data" && value) { @@ -304,7 +305,8 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { filter_fields.push(setter); } }); - let filter_group = this.get_filters(); + + let filter_group = this.get_custom_filters(); Object.assign(filters, filter_group); let args = { From a725d1daf1fdc313daf4490e506634af7672a54e Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 19 May 2020 19:35:49 +0530 Subject: [PATCH 09/15] feat: don't auto select last result --- frappe/public/js/frappe/form/multi_select_dialog.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index a231c0bac3..c6e5cef573 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -337,14 +337,11 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { result.parsed_date = Date.parse(result["Date"]); me.results.push(result); }); + me.results.sort((a, b) => { return a.parsed_date - b.parsed_date; }); - // Preselect oldest entry - if (me.start < 1 && r.values.length === 1) { - me.results[0].checked = 1; - } } me.render_result_list(me.results, more); } From e9710278a197caed31b23e29d79e8d3312fa0fc4 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 19 May 2020 19:46:13 +0530 Subject: [PATCH 10/15] style: remove unnecessary comments --- frappe/public/js/frappe/form/multi_select_dialog.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index c6e5cef573..a56e5c6964 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -181,16 +181,9 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { }); this.$parent.find('.input-with-feedback').on('change', (e) => { - // debugger; frappe.flags.auto_scroll = false; this.get_results(); }); - // this.$parent.find('[data-fieldtype="Link"]').on('change', (e) => { - // // debugger; - // frappe.flags.auto_scroll = false; - // console.log("cool"); - // this.get_results(); - // }); this.$parent.find('[data-fieldtype="Data"]').on('input', (e) => { var $this = $(this); From e9e15c1914e5a528b9848bc32d6335402be6f054 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 19 May 2020 19:46:22 +0530 Subject: [PATCH 11/15] style: added comments --- frappe/public/js/frappe/form/multi_select_dialog.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index a56e5c6964..9187b28c97 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -273,13 +273,18 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { } empty_list() { + // Store all checked items let checked = this.get_checked_items().map(item => { return { ...item, checked: true }; }); + + // Remove **all** items this.$results.find('.list-item-container').remove(); + + // Rerender checked items this.render_result_list(checked, 0, false); } From c6b77fb07282796e02d426db908c5ecc2d02eefb Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 19 May 2020 20:03:58 +0530 Subject: [PATCH 12/15] feat: add pluralize util --- .../js/frappe/form/multi_select_dialog.js | 2 +- frappe/public/js/frappe/utils/utils.js | 116 +++++++++++++++++- 2 files changed, 113 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index 9187b28c97..4ad072cbb5 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -37,7 +37,7 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { fields = fields.concat(this.data_fields); } - let doctype_plural = frappe.utils.get_doctype_plural(this.doctype); + let doctype_plural = this.doctype.plural(); this.dialog = new frappe.ui.Dialog({ title: __("Select {0}", [(this.doctype == '[Select]') ? __("value") : __(doctype_plural)]), diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index ba11374a4f..50109f010d 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -803,11 +803,7 @@ Object.assign(frappe.utils, { name: M[0], version: M[1], }; - }, - get_doctype_plural(doctype) { - return !doctype.endsWith('y') ? doctype + 's': doctype.slice(0, -1) + 'ies'; } - }); // Array de duplicate @@ -827,3 +823,115 @@ if (!Array.prototype.uniqBy) { } }); } + +// Pluralize +String.prototype.plural = function(revert) { + const plural = { + "(quiz)$": "$1zes", + "^(ox)$": "$1en", + "([m|l])ouse$": "$1ice", + "(matr|vert|ind)ix|ex$": "$1ices", + "(x|ch|ss|sh)$": "$1es", + "([^aeiouy]|qu)y$": "$1ies", + "(hive)$": "$1s", + "(?:([^f])fe|([lr])f)$": "$1$2ves", + "(shea|lea|loa|thie)f$": "$1ves", + sis$: "ses", + "([ti])um$": "$1a", + "(tomat|potat|ech|her|vet)o$": "$1oes", + "(bu)s$": "$1ses", + "(alias)$": "$1es", + "(octop)us$": "$1i", + "(ax|test)is$": "$1es", + "(us)$": "$1es", + "([^s]+)$": "$1s", + }; + + const singular = { + "(quiz)zes$": "$1", + "(matr)ices$": "$1ix", + "(vert|ind)ices$": "$1ex", + "^(ox)en$": "$1", + "(alias)es$": "$1", + "(octop|vir)i$": "$1us", + "(cris|ax|test)es$": "$1is", + "(shoe)s$": "$1", + "(o)es$": "$1", + "(bus)es$": "$1", + "([m|l])ice$": "$1ouse", + "(x|ch|ss|sh)es$": "$1", + "(m)ovies$": "$1ovie", + "(s)eries$": "$1eries", + "([^aeiouy]|qu)ies$": "$1y", + "([lr])ves$": "$1f", + "(tive)s$": "$1", + "(hive)s$": "$1", + "(li|wi|kni)ves$": "$1fe", + "(shea|loa|lea|thie)ves$": "$1f", + "(^analy)ses$": "$1sis", + "((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$": + "$1$2sis", + "([ti])a$": "$1um", + "(n)ews$": "$1ews", + "(h|bl)ouses$": "$1ouse", + "(corpse)s$": "$1", + "(us)es$": "$1", + s$: "", + }; + + const irregular = { + move: "moves", + foot: "feet", + goose: "geese", + sex: "sexes", + child: "children", + man: "men", + tooth: "teeth", + person: "people", + }; + + const uncountable = [ + "sheep", + "fish", + "deer", + "moose", + "series", + "species", + "money", + "rice", + "information", + "equipment", + ]; + + // save some time in the case that singular and plural are the same + if (uncountable.indexOf(this.toLowerCase()) >= 0) return this; + + // check for irregular forms + let word; + let pattern; + let replace; + for (word in irregular) { + if (revert) { + pattern = new RegExp(irregular[word] + "$", "i"); + replace = word; + } else { + pattern = new RegExp(word + "$", "i"); + replace = irregular[word]; + } + if (pattern.test(this)) return this.replace(pattern, replace); + } + + let array; + if (revert) array = singular; + else array = plural; + + // check for matches using regular expressions + let reg; + for (reg in array) { + pattern = new RegExp(reg, "i"); + + if (pattern.test(this)) return this.replace(pattern, array[reg]); + } + + return this; +}; \ No newline at end of file From 69b1ee5ab917b3a1f3bfce74d72e0be9ae430204 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Wed, 20 May 2020 12:20:49 +0530 Subject: [PATCH 13/15] fix: remove auto scroll from result area --- frappe/public/js/frappe/form/multi_select_dialog.js | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index 4ad072cbb5..de26fd0f8d 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -25,7 +25,6 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { fieldtype: "Button", fieldname: "more_btn", label: __("More"), click: () => { this.start += 20; - frappe.flags.auto_scroll = true; this.get_results(); } } From 6f31827c800aedf04f21e14004da9908ef5c86a5 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Wed, 20 May 2020 12:55:04 +0530 Subject: [PATCH 14/15] chore: removed unwanted code --- frappe/public/js/frappe/form/multi_select_dialog.js | 6 ------ frappe/website/website_theme/standard/standard.json | 5 +++-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index de26fd0f8d..9c496fabd0 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -331,14 +331,8 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { } r.values.forEach(function (result) { result.checked = 0; - result.parsed_date = Date.parse(result["Date"]); me.results.push(result); }); - - me.results.sort((a, b) => { - return a.parsed_date - b.parsed_date; - }); - } me.render_result_list(me.results, more); } diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index fc80ba82dc..9365d5be27 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -4,12 +4,13 @@ "button_shadows": 0, "creation": "2015-02-19 13:37:33.925909", "custom": 0, + "custom_css": "", "custom_overrides": "", "docstatus": 0, "doctype": "Website Theme", "font_properties": "400,500,600,700,800", "idx": 26, - "modified": "2020-05-18 11:52:41.949264", + "modified": "2020-05-09 16:44:18.508471", "modified_by": "Administrator", "module": "Website", "name": "Standard", @@ -17,4 +18,4 @@ "theme": "Standard", "theme_scss": "$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n// Bootstrap Variable Overrides\n\n\n@import \"frappe/public/scss/website\";\n\n\n\n// Custom Theme\n", "theme_url": "/assets/css/standard_style.css" -} \ No newline at end of file +} From c9642949af2f8a79555b014ddc47553aee3a4945 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Wed, 20 May 2020 13:11:02 +0530 Subject: [PATCH 15/15] style: fixed indentation --- .../js/frappe/form/multi_select_dialog.js | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/frappe/public/js/frappe/form/multi_select_dialog.js b/frappe/public/js/frappe/form/multi_select_dialog.js index 9c496fabd0..41b87e0207 100644 --- a/frappe/public/js/frappe/form/multi_select_dialog.js +++ b/frappe/public/js/frappe/form/multi_select_dialog.js @@ -86,7 +86,6 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { get_primary_filters() { let fields = []; - let me = this; let columns = new Array(3); @@ -117,7 +116,7 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { }); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal - if(Object.seal) { + if (Object.seal) { Object.seal(columns); // now a is a fixed-size array with mutable entries } @@ -129,7 +128,7 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { { fieldtype: "Column Break" }, ...columns[2], { fieldtype: "Section Break", fieldname: "primary_filters_sb" } - ] + ]; if (this.add_filters_group) { fields.push( @@ -179,12 +178,12 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { .prop("checked", ($(e.target).is(':checked'))); }); - this.$parent.find('.input-with-feedback').on('change', (e) => { + this.$parent.find('.input-with-feedback').on('change', () => { frappe.flags.auto_scroll = false; this.get_results(); }); - this.$parent.find('[data-fieldtype="Data"]').on('input', (e) => { + this.$parent.find('[data-fieldtype="Data"]').on('input', () => { var $this = $(this); clearTimeout($this.data('timeout')); $this.data('timeout', setTimeout(function () { @@ -223,11 +222,10 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { columns.forEach(function (column) { contents += `
${ - head ? `${__(frappe.model.unscrub(column))}` - : (column !== "name" ? `${__(result[column] || '')}` - : ` - ${__(result[column] || '')}`) - } + head ? `${__(frappe.model.unscrub(column))}` + : (column !== "name" ? `${__(result[column] || '')}` + : ` + ${__(result[column] || '')}`)}
`; }); @@ -295,7 +293,7 @@ frappe.ui.form.MultiSelectDialog = class MultiSelectDialog { Object.keys(this.setters).forEach(function (setter) { var value = me.dialog.fields_dict[setter].get_value(); if (me.dialog.fields_dict[setter].df.fieldtype == "Data" && value) { - filters[setter] = ["like", "%"+value+"%"]; + filters[setter] = ["like", "%" + value + "%"]; } else { filters[setter] = value || undefined; me.args[setter] = filters[setter];