diff --git a/.eslintrc b/.eslintrc index fb129c477f..500346a0c3 100644 --- a/.eslintrc +++ b/.eslintrc @@ -120,6 +120,7 @@ "QUnit": true, "JsBarcode": true, "L": true, - "Chart": true + "Chart": true, + "DataTable": true } } diff --git a/frappe/core/doctype/file/file.json b/frappe/core/doctype/file/file.json index d3275e6968..f297bf0836 100644 --- a/frappe/core/doctype/file/file.json +++ b/frappe/core/doctype/file/file.json @@ -355,7 +355,7 @@ "in_filter": 0, "in_global_search": 0, "in_list_view": 0, - "in_standard_filter": 1, + "in_standard_filter": 0, "label": "Folder", "length": 0, "no_copy": 0, @@ -653,7 +653,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-10-27 13:27:43.882914", + "modified": "2017-12-07 17:01:54.860204", "modified_by": "Administrator", "module": "Core", "name": "File", diff --git a/frappe/core/doctype/file/file_list.js b/frappe/core/doctype/file/file_list.js index 61b4a58a0c..e69de29bb2 100644 --- a/frappe/core/doctype/file/file_list.js +++ b/frappe/core/doctype/file/file_list.js @@ -1,239 +0,0 @@ -frappe.provide("frappe.ui"); - -frappe.listview_settings['File'] = { - hide_name_column: true, - use_route: true, - add_fields: ["is_folder", "file_name", "file_url", "folder", "is_private"], - formatters: { - file_size: function(value) { - // formatter for file size - if(value > 1048576) { - value = flt(flt(value) / 1048576, 1) + "M"; - } else if (value > 1024) { - value = flt(flt(value) / 1024, 1) + "K"; - } - return value; - } - }, - prepare_data: function(data) { - // set image icons - var icon = ""; - - if(data.is_folder) { - icon += ' '; - } else if(frappe.utils.is_image_file(data.file_name)) { - icon += ' '; - } else { - icon += ' '; - } - - data._title = icon + (data.file_name ? data.file_name : data.file_url); - - if (data.is_private) { - data._title += ' '; - } - }, - onload: function(doclist) { - doclist.filter_area = doclist.wrapper.find(".show_filters"); - - doclist.breadcrumb = $('
') - .insertBefore(doclist.filter_area); - doclist.list_renderer.settings.setup_menu(doclist); - doclist.list_renderer.settings.setup_dragdrop(doclist); - - doclist.$page.on("click", ".list-row-checkbox", function(event) { - doclist.list_renderer.settings.add_menu_item_copy(doclist); - }); - }, - list_view_doc:function(doclist){ - $(doclist.wrapper).on("click", 'button[list_view_doc="'+doclist.doctype+'"]', function() { - frappe.ui.get_upload_dialog({ - "args": { - "folder": doclist.current_folder, - "from_form": 1 - }, - callback: function() { - doclist.refresh(); - } - }); - }); - }, - setup_menu: function(doclist) { - doclist.page.add_menu_item(__("New Folder"), function() { - var d = frappe.prompt(__("Name"), function(values) { - if((values.value.indexOf("/") > -1)){ - frappe.throw(__("Folder name should not include '/' (slash)")); - return; - } - var data = { - "file_name": values.value, - "folder": doclist.current_folder - }; - frappe.call({ - method: "frappe.core.doctype.file.file.create_new_folder", - args: data, - callback: function(r) { } - }); - }, __('Enter folder name'), __("Create")); - }); - - doclist.page.add_menu_item(__("Edit Folder"), function() { - frappe.set_route("Form", "File", doclist.current_folder); - }); - - doclist.page.add_menu_item(__("Import .zip"), function() { - // make upload dialog - frappe.ui.get_upload_dialog({ - args: { - folder: doclist.current_folder, - from_form: 1 - }, - callback: function(attachment, r) { - frappe.call({ - method: "frappe.core.doctype.file.file.unzip_file", - args: { - name: r.message["name"], - }, - callback: function(r) { - if(!r.exc) { - //doclist.refresh(); - } else { - frappe.msgprint(__("Error in uploading files" + r.exc)); - } - } - }); - }, - }); - }); - }, - setup_dragdrop: function(doclist) { - $(doclist.$page).on('dragenter dragover', false) - .on('drop', function (e) { - var dataTransfer = e.originalEvent.dataTransfer; - if (!(dataTransfer && dataTransfer.files && dataTransfer.files.length > 0)) { - return; - } - e.stopPropagation(); - e.preventDefault(); - frappe.upload.multifile_upload(dataTransfer.files, { - "folder": doclist.current_folder, - "from_form": 1 - }, { - confirm_is_private: 1 - }); - }); - }, - add_menu_item_copy: function(doclist){ - if (!doclist.copy) { - var copy_menu = doclist.page.add_menu_item(__("Copy"), function() { - if(doclist.$page.find(".list-row-checkbox:checked").length){ - doclist.selected_files = doclist.get_checked_items(); - doclist.old_parent = doclist.current_folder; - doclist.list_renderer.settings.add_menu_item_paste(doclist); - } - else{ - frappe.throw(__("Please select file to copy")); - } - }); - doclist.copy = true; - } - }, - add_menu_item_paste:function(doclist){ - var paste_menu = doclist.page.add_menu_item(__("Paste"), function(){ - frappe.call({ - method:"frappe.core.doctype.file.file.move_file", - args: { - "file_list": doclist.selected_files, - "new_parent": doclist.current_folder, - "old_parent": doclist.old_parent - }, - callback:function(r){ - doclist.paste = false; - frappe.msgprint(__(r.message)); - doclist.selected_files = []; - $(paste_menu).remove(); - } - }); - }); - }, - before_run: function(doclist) { - var name_filter = doclist.filter_list.get_filter("file_name"); - if(name_filter) { - doclist.filter_area.removeClass("hide"); - doclist.breadcrumb.addClass("hide"); - } else { - doclist.filter_area.addClass("hide"); - doclist.breadcrumb.removeClass("hide"); - } - }, - refresh: function(doclist) { - var name_filter = doclist.filter_list.get_filter("file_name"); - - var folder_filter = doclist.filter_list.get_filter("folder"); - if(folder_filter) { - folder_filter.remove(true); - } - - if(name_filter) return; - - var route = frappe.get_route(); - if(route[2]) { - doclist.current_folder = route.slice(2).join("/"); - doclist.current_folder_name = route.slice(-1)[0]; - } - - if(!doclist.current_folder || doclist.current_folder=="List") { - doclist.current_folder = frappe.boot.home_folder; - doclist.current_folder_name = __("Home"); - } - - doclist.filter_list.add_filter("File", "folder", "=", doclist.current_folder, true); - doclist.dirty = true; - doclist.fresh = false; - - doclist.page.set_title(doclist.current_folder_name); - frappe.utils.set_title(doclist.current_folder_name); - }, - set_primary_action:function(doclist){ - doclist.page.clear_primary_action(); - doclist.page.set_primary_action(__("New"), function() { - frappe.ui.get_upload_dialog({ - "args": { - "folder": doclist.current_folder, - "from_form": 1 - }, - callback: function() { - doclist.refresh(); - } - }); - }, "octicon octicon-plus"); - }, - post_render_item: function(list, row, data) { - if(data.is_folder) { - $(row).find(".list-id").attr("href", "#List/File/" + data.name); - } - }, - set_file_route: function(name) { - frappe.set_route(["List", "File"].concat(decodeURIComponent(name).split("/"))); - }, - post_render: function(doclist) { - frappe.call({ - method: "frappe.core.doctype.file.file.get_breadcrumbs", - args: { - folder: doclist.current_folder - }, - callback: function(r) { - doclist.breadcrumb.empty(); - if(r.message && r.message.length) { - $.each(r.message, function(i, folder) { - $('${__('No {0} found', [__(this.doctype)])}
+ ${new_button} +')) - txt = '
' + txt + '
'; footnote_area.html(txt); } else { footnote_area.remove(); @@ -591,7 +589,47 @@ frappe.utils = { catch (err) { return false; } - }() + }(), + throttle: function (func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + + let later = function () { + previous = options.leading === false ? 0 : Date.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + return function () { + var now = Date.now(); + if (!previous && options.leading === false) previous = now; + let remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + get_form_link: function(doctype, name, html = false) { + const route = ['#Form', doctype, name].join('/'); + if (html) { + return `${name}`; + } + return route; + } }; // String.prototype.includes polyfill diff --git a/frappe/public/js/frappe/model/model.js b/frappe/public/js/frappe/model/model.js index f902216764..c6267b206a 100644 --- a/frappe/public/js/frappe/model/model.js +++ b/frappe/public/js/frappe/model/model.js @@ -27,6 +27,8 @@ $.extend(frappe.model, { {fieldname:'docstatus', fieldtype:'Int', label:__('Document Status')}, ], + numeric_fieldtypes: ["Int", "Float", "Currency", "Percent"], + std_fields_table: [ {fieldname:'parent', fieldtype:'Data', label:__('Parent')}, ], @@ -39,8 +41,9 @@ $.extend(frappe.model, { // setup refresh if the document is updated somewhere else frappe.realtime.on("doc_update", function(data) { // set list dirty - frappe.views.set_list_as_dirty(data.doctype); + frappe.views.ListView.trigger_list_update(data); var doc = locals[data.doctype] && locals[data.doctype][data.name]; + if(doc) { // current document is dirty, show message if its not me if(frappe.get_route()[0]==="Form" && cur_frm.doc.doctype===doc.doctype && cur_frm.doc.name===doc.name) { @@ -61,7 +64,7 @@ $.extend(frappe.model, { }); frappe.realtime.on("list_update", function(data) { - frappe.views.set_list_as_dirty(data.doctype); + frappe.views.ListView.trigger_list_update(data); }); }, @@ -74,6 +77,10 @@ $.extend(frappe.model, { return frappe.model.no_value_type.indexOf(fieldtype)===-1; }, + is_non_std_field: function(fieldname) { + return !frappe.model.std_fields_list.includes(fieldname); + }, + get_std_field: function(fieldname) { var docfield = $.map([].concat(frappe.model.std_fields).concat(frappe.model.std_fields_table), function(d) { @@ -576,6 +583,19 @@ $.extend(frappe.model, { } return all; }, + + get_full_column_name: function(fieldname, doctype) { + if (fieldname.includes('`tab')) return fieldname; + return '`tab' + doctype + '`.`' + fieldname + '`'; + }, + + is_numeric_field: function(fieldtype) { + if (!fieldtype) return; + if (typeof fieldtype === 'object') { + fieldtype = fieldtype.fieldtype; + } + return frappe.model.numeric_fieldtypes.includes(fieldtype); + } }); // legacy diff --git a/frappe/public/js/frappe/model/user_settings.js b/frappe/public/js/frappe/model/user_settings.js index 66b50375c3..52c160ea77 100644 --- a/frappe/public/js/frappe/model/user_settings.js +++ b/frappe/public/js/frappe/model/user_settings.js @@ -5,6 +5,7 @@ $.extend(frappe.model.user_settings, { var user_settings = frappe.model.user_settings[doctype] || {}; if ($.isPlainObject(value)) { + user_settings[key] = user_settings[key] || {}; $.extend(user_settings[key], value); } else { user_settings[key] = value; diff --git a/frappe/public/js/frappe/ui/base_list.js b/frappe/public/js/frappe/ui/base_list.js deleted file mode 100644 index 0d3b1957e8..0000000000 --- a/frappe/public/js/frappe/ui/base_list.js +++ /dev/null @@ -1,532 +0,0 @@ -// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -// MIT License. See license.txt - -// new re-re-factored Listing object -// now called BaseList -// -// opts: -// parent - -// method (method to call on server) -// args (additional args to method) -// get_args (method to return args as dict) - -// show_filters [false] -// doctype -// filter_fields (if given, this list is rendered, else built from doctype) - -// query or get_query (will be deprecated) -// query_max -// buttons_in_frame - -// no_result_message ("No result") - -// page_length (20) -// hide_refresh (False) -// no_toolbar -// new_doctype -// [function] render_row(parent, data) -// [function] onrun -// no_loading (no ajax indicator) - -frappe.provide('frappe.ui'); - -frappe.ui.BaseList = Class.extend({ - init: function (opts) { - this.opts = opts || {}; - this.set_defaults(); - if (opts) { - this.make(); - } - }, - set_defaults: function () { - this.page_length = 20; - this.start = 0; - this.data = []; - }, - make: function (opts) { - if (opts) { - this.opts = opts; - } - this.prepare_opts(); - - $.extend(this, this.opts); - - // make dom - this.wrapper = $(frappe.render_template('listing', this.opts)); - this.parent.append(this.wrapper); - - this.set_events(); - - if (this.page) { - this.wrapper.find('.list-toolbar-wrapper').hide(); - } - - if (this.show_filters) { - this.make_filters(); - } - }, - prepare_opts: function () { - if (this.opts.new_doctype) { - if (!frappe.boot.user.can_create.includes(this.opts.new_doctype)) { - this.opts.new_doctype = null; - } - } - if (!this.opts.no_result_message) { - this.opts.no_result_message = __('Nothing to show'); - } - if (!this.opts.page_length) { - this.opts.page_length = this.user_settings && this.user_settings.limit || 20; - } - this.opts._more = __('More'); - }, - add_button: function (label, click, icon) { - if (this.page) { - return this.page.add_menu_item(label, click, icon) - } else { - this.wrapper.find('.list-toolbar-wrapper').removeClass('hide'); - return $('') - .appendTo(this.wrapper.find('.list-toolbar')) - .html((icon ? (' ') : '') + label) - .click(click); - } - }, - set_events: function () { - var me = this; - - // next page - this.wrapper.find('.btn-more').click(function () { - me.run(true); - }); - - this.wrapper.find(".btn-group-paging").on('click', '.btn', function () { - me.page_length = cint($(this).attr("data-value")); - - me.wrapper.find(".btn-group-paging .btn-info").removeClass("btn-info"); - $(this).addClass("btn-info"); - - // always reset when changing list page length - me.run(); - }); - - // select the correct page length - if (this.opts.page_length !== 20) { - this.wrapper.find(".btn-group-paging .btn-info").removeClass("btn-info"); - this.wrapper - .find(".btn-group-paging .btn[data-value='" + this.opts.page_length + "']") - .addClass('btn-info'); - } - - // title - if (this.title) { - this.wrapper.find('h3').html(this.title).show(); - } - - // new - this.set_primary_action(); - - if (me.no_toolbar || me.hide_toolbar) { - me.wrapper.find('.list-toolbar-wrapper').hide(); - } - }, - - set_primary_action: function () { - var me = this; - if (this.new_doctype) { - this.page.set_primary_action( - __("New"), - me.make_new_doc.bind(me, me.new_doctype), - "octicon octicon-plus" - ); - } else { - this.page.clear_primary_action(); - } - }, - - make_new_doc: function (doctype) { - var me = this; - frappe.model.with_doctype(doctype, function () { - if (me.custom_new_doc) { - me.custom_new_doc(doctype); - } else { - if (me.filter_list) { - frappe.route_options = {}; - me.filter_list.get_filters().forEach(function (f, i) { - if (f[2] === "=" && !frappe.model.std_fields_list.includes(f[1])) { - frappe.route_options[f[1]] = f[3]; - } - }); - } - frappe.new_doc(doctype, true); - } - }); - }, - - make_filters: function () { - this.make_standard_filters(); - - this.filter_list = new frappe.ui.FilterList({ - base_list: this, - parent: this.wrapper.find('.list-filters').show(), - doctype: this.doctype, - filter_fields: this.filter_fields, - default_filters: this.default_filters || [] - }); - // default filter for submittable doctype - if (frappe.model.is_submittable(this.doctype)) { - this.filter_list.add_filter(this.doctype, "docstatus", "!=", 2); - } - }, - - make_standard_filters: function() { - var me = this; - if (this.standard_filters_added) { - return; - } - - if (this.meta) { - var filter_count = 1; - if(this.is_list_view) { - $(``) - .prependTo(this.page.page_form); - } - this.page.add_field({ - fieldtype: 'Data', - label: 'ID', - condition: 'like', - fieldname: 'name', - onchange: () => { me.refresh(true); } - }); - - this.meta.fields.forEach(function(df, i) { - if(df.in_standard_filter && !frappe.model.no_value_type.includes(df.fieldtype)) { - let options = df.options; - let condition = '='; - let fieldtype = df.fieldtype; - if (['Text', 'Small Text', 'Text Editor', 'Data'].includes(fieldtype)) { - fieldtype = 'Data'; - condition = 'like'; - } - if(df.fieldtype == "Select" && df.options) { - options = df.options.split("\n"); - if(options.length > 0 && options[0] != "") { - options.unshift(""); - options = options.join("\n"); - } - } - let f = me.page.add_field({ - fieldtype: fieldtype, - label: __(df.label), - options: options, - fieldname: df.fieldname, - condition: condition, - onchange: () => {me.refresh(true);} - }); - filter_count ++; - if (filter_count > 3) { - $(f.wrapper).addClass('hidden-sm').addClass('hidden-xs'); - } - if (filter_count > 5) { - return false; - } - } - }); - } - - this.standard_filters_added = true; - }, - - update_standard_filters: function(filters) { - let me = this; - for(let key in this.page.fields_dict) { - let field = this.page.fields_dict[key]; - let value = field.get_value(); - if (value) { - if (field.df.condition==='like' && !value.includes('%')) { - value = '%' + value + '%'; - } - filters.push([ - me.doctype, - field.df.fieldname, - field.df.condition || '=', - value - ]); - } - } - }, - - - clear: function () { - this.data = []; - this.wrapper.find('.result-list').empty(); - this.wrapper.find('.result').show(); - this.wrapper.find('.no-result').hide(); - this.start = 0; - this.onreset && this.onreset(); - }, - - set_filters_from_route_options: function ({clear_filters=true} = {}) { - var me = this; - if(this.filter_list && clear_filters) { - this.filter_list.clear_filters(); - } - - for(var field in frappe.route_options) { - var value = frappe.route_options[field]; - var doctype = null; - - // if `Child DocType.fieldname` - if (field.includes(".")) { - doctype = field.split(".")[0]; - field = field.split(".")[1]; - } - - // find the table in which the key exists - // for example the filter could be {"item_code": "X"} - // where item_code is in the child table. - - // we can search all tables for mapping the doctype - if (!doctype) { - doctype = frappe.meta.get_doctype_for_field(me.doctype, field); - } - - if (doctype && me.filter_list) { - if ($.isArray(value)) { - me.filter_list.add_filter(doctype, field, value[0], value[1]); - } else { - me.filter_list.add_filter(doctype, field, "=", value); - } - } - } - frappe.route_options = null; - }, - - run: function(more) { - setTimeout(() => this._run(more), 100); - }, - - _run: function (more) { - var me = this; - if (!more) { - this.start = 0; - this.onreset && this.onreset(); - } - - var args = this.get_call_args(); - this.save_user_settings_locally(args); - - // user_settings are saved by db_query.py when dirty - $.extend(args, { - user_settings: frappe.model.user_settings[this.doctype] - }); - - return frappe.call({ - method: this.opts.method || 'frappe.desk.query_builder.runquery', - type: "GET", - freeze: this.opts.freeze !== undefined ? this.opts.freeze : true, - args: args, - callback: function (r) { - me.dirty = false; - me.render_results(r); - }, - no_spinner: this.opts.no_loading - }); - }, - save_user_settings_locally: function (args) { - if (this.opts.save_user_settings && this.doctype && !this.docname) { - // save list settings locally - var user_settings = frappe.model.user_settings[this.doctype]; - var different = false; - - if (!user_settings) { - return; - } - - if (!frappe.utils.arrays_equal(args.filters, user_settings.filters)) { - // settings are dirty if filters change - user_settings.filters = args.filters; - different = true; - } - - if (user_settings.order_by !== args.order_by) { - user_settings.order_by = args.order_by; - different = true; - } - - if (user_settings.limit !== args.limit_page_length) { - user_settings.limit = args.limit_page_length || 20 - different = true; - } - - // save fields in list settings - if (args.save_user_settings_fields) { - user_settings.fields = args.fields; - } - - if (different) { - user_settings.updated_on = moment().toString(); - } - } - }, - get_call_args: function () { - // load query - if (!this.method) { - var query = this.get_query && this.get_query() || this.query; - query = this.add_limits(query); - var args = { - query_max: this.query_max, - as_dict: 1 - } - args.simple_query = query; - } else { - var args = { - start: this.start, - page_length: this.page_length - } - } - - // append user-defined arguments - if (this.args) - $.extend(args, this.args) - - if (this.get_args) { - $.extend(args, this.get_args()); - } - return args; - }, - render_results: function (r) { - if (this.start === 0) - this.clear(); - - this.wrapper.find('.btn-more, .list-loading').hide(); - - var values = []; - - if (r.message) { - values = this.get_values_from_response(r.message); - } - - var show_results = true; - if(this.show_no_result) { - if($.isFunction(this.show_no_result)) { - show_results = !this.show_no_result() - } else { - show_results = !this.show_no_result; - } - } - - // render result view when - // length > 0 OR - // explicitly set by flag - if (values.length || show_results) { - this.data = this.data.concat(values); - this.render_view(values); - this.update_paging(values); - } else if (this.start === 0) { - // show no result message - this.wrapper.find('.result').hide(); - - var msg = ''; - var no_result_message = this.no_result_message; - if(no_result_message && $.isFunction(no_result_message)) { - msg = no_result_message(); - } else if(typeof no_result_message === 'string') { - msg = no_result_message; - } else { - msg = __('No Results') - } - - this.wrapper.find('.no-result').html(msg).show(); - } - - this.wrapper.find('.list-paging-area') - .toggle(values.length > 0|| this.start > 0); - - // callbacks - if (this.onrun) this.onrun(); - if (this.callback) this.callback(r); - this.wrapper.trigger("render-complete"); - }, - - get_values_from_response: function (data) { - // make dictionaries from keys and values - if (data.keys && $.isArray(data.keys)) { - return frappe.utils.dict(data.keys, data.values); - } else { - return data; - } - }, - - render_view: function (values) { - // override this method in derived class - }, - - update_paging: function (values) { - if (values.length >= this.page_length) { - this.wrapper.find('.btn-more').show(); - this.start += this.page_length; - } - }, - - refresh: function () { - this.run(); - }, - add_limits: function (query) { - return query + ' LIMIT ' + this.start + ',' + (this.page_length + 1); - }, - set_filter: function (fieldname, label, no_run, no_duplicate) { - var filter = this.filter_list.get_filter(fieldname); - if (filter) { - var value = cstr(filter.field.get_value()); - if (value.includes(label)) { - // already set - return false - - } else if (no_duplicate) { - filter.set_values(this.doctype, fieldname, "=", label); - } else { - // second filter set for this field - if (fieldname == '_user_tags' || fieldname == "_liked_by") { - // and for tags - this.filter_list.add_filter(this.doctype, fieldname, 'like', '%' + label + '%'); - } else { - // or for rest using "in" - filter.set_values(this.doctype, fieldname, 'in', value + ', ' + label); - } - } - } else { - // no filter for this item, - // setup one - if (['_user_tags', '_comments', '_assign', '_liked_by'].includes(fieldname)) { - this.filter_list.add_filter(this.doctype, fieldname, 'like', '%' + label + '%'); - } else { - this.filter_list.add_filter(this.doctype, fieldname, '=', label); - } - } - if (!no_run) - this.run(); - }, - init_user_settings: function () { - this.user_settings = frappe.model.user_settings[this.doctype] || {}; - }, - call_for_selected_items: function (method, args) { - var me = this; - args.names = this.get_checked_items().map(function (item) { - return item.name; - }); - - frappe.call({ - method: method, - args: args, - freeze: true, - callback: function (r) { - if (!r.exc) { - if (me.list_header) { - me.list_header.find(".list-select-all").prop("checked", false); - } - me.refresh(true); - } - } - }); - } -}); diff --git a/frappe/public/js/frappe/ui/filters/edit_filter.html b/frappe/public/js/frappe/ui/filters/edit_filter.html index 49944a459e..984bd00aab 100644 --- a/frappe/public/js/frappe/ui/filters/edit_filter.html +++ b/frappe/public/js/frappe/ui/filters/edit_filter.html @@ -1,6 +1,6 @@{{ __("No Email Accounts Assigned") }}
- {% } else { %} -{{ msg }}
-- -
- {% } %} -${args.msg}
++ +
+ ` : + `${ __("No Email Accounts Assigned") }
`; + + return ` +
'+__('Sort By')+'
\ - \ -'+__('Then By (optional)')+'
\ - \ -\ - '); - - // first - this.sort_by_select = new frappe.ui.FieldSelect({ - parent: $(this.sort_dialog.body).find('.sort-column'), - doctype: this.doctype - }); - this.sort_by_select.$select.css('width', '60%'); - this.sort_order_select = $(this.sort_dialog.body).find('.sort-order'); - - // second - this.sort_by_next_select = new frappe.ui.FieldSelect({ - parent: $(this.sort_dialog.body).find('.sort-column-1'), - doctype: this.doctype, - with_blank: true - }); - this.sort_by_next_select.$select.css('width', '60%'); - this.sort_order_next_select = $(this.sort_dialog.body).find('.sort-order-1'); - - // initial values - this.sort_by_select.set_value(this.doctype, 'modified'); - this.sort_order_select.val('desc'); - - this.sort_by_next_select.clear(); - this.sort_order_next_select.val('desc'); - - // button actions - this.page.add_inner_button(__('Sort Order'), function() { - me.sort_dialog.show(); - }); - - $(this.sort_dialog.body).find('.btn-primary').click(function() { - me.sort_dialog.hide(); - me.run(); - }); - }, - - // setup export - make_export: function() { - var me = this; - if(!frappe.model.can_export(this.doctype)) { - return; - } - var export_btn = this.page.add_menu_item(__('Export'), function() { - var args = me.get_args(); - var selected_items = me.get_checked_items() - frappe.prompt({fieldtype:"Select", label: __("Select File Type"), fieldname:"file_format_type", - options:"Excel\nCSV", default:"Excel", reqd: 1}, - function(data) { - args.cmd = 'frappe.desk.reportview.export_query'; - args.file_format_type = data.file_format_type; - - if(me.add_totals_row) { - args.add_totals_row = 1; - } - - if(selected_items.length >= 1) { - args.selected_items = $.map(selected_items, function(d) { return d.name; }); - } - open_url_post(frappe.request.url, args); - - }, __("Export Report: {0}",[__(me.doctype)]), __("Download")); - - }, true); - }, - - - // save - make_save: function() { - var me = this; - if(frappe.user.is_report_manager()) { - this.page.add_menu_item(__('Save'), function() { me.save_report('save') }, true); - this.page.add_menu_item(__('Save As'), function() { me.save_report('save_as') }, true); - } - }, - - save_report: function(save_type) { - var me = this; - - var _save_report = function(name) { - // callback - return frappe.call({ - method: 'frappe.desk.reportview.save_report', - args: { - name: name, - doctype: me.doctype, - json: JSON.stringify({ - filters: me.filter_list.get_filters(), - columns: me.columns, - sort_by: me.sort_by_select.val(), - sort_order: me.sort_order_select.val(), - sort_by_next: me.sort_by_next_select.val(), - sort_order_next: me.sort_order_next_select.val(), - add_totals_row: me.add_totals_row - }) - }, - callback: function(r) { - if(r.exc) { - frappe.msgprint(__("Report was not saved (there were errors)")); - return; - } - if(r.message != me.docname) - frappe.set_route('Report', me.doctype, r.message); - } - }); - - } - - if(me.docname && save_type == "save") { - _save_report(me.docname); - } else { - frappe.prompt({fieldname: 'name', label: __('New Report name'), reqd: 1, fieldtype: 'Data'}, function(data) { - _save_report(data.name); - }, __('Save As')); - } - - }, - - make_delete: function() { - var me = this; - if(this.can_delete) { - $(this.parent).on("click", "input[type='checkbox'][data-row]", function() { - me.data[$(this).attr("data-row")].selected - = this.checked ? true : false; - }); - - this.page.add_menu_item(__("Delete"), function() { - var delete_list = $.map(me.get_checked_items(), function(d) { return d.name; }); - if(!delete_list.length) - return; - if(frappe.confirm(__("This is PERMANENT action and you cannot undo. Continue?"), - function() { - return frappe.call({ - method: 'frappe.desk.reportview.delete_items', - args: { - items: delete_list, - doctype: me.doctype - }, - callback: function() { - me.refresh(); - } - }); - })); - - }, true); - } - }, - - make_user_permissions: function() { - var me = this; - if(this.docname && frappe.model.can_set_user_permissions("Report")) { - this.page.add_menu_item(__("User Permissions"), function() { - frappe.route_options = { - doctype: "Report", - name: me.docname - }; - frappe.set_route('List', 'User Permission'); - }, true); - } - }, - - setup_listview_settings: function() { - if(frappe.listview_settings[this.doctype] && frappe.listview_settings[this.doctype].onload) { - frappe.listview_settings[this.doctype].onload(this); - } - }, - - get_checked_items: function() { - var me = this; - var selected_records = [] - - $.each(me.data, function(i, d) { - if(d.selected && d.name) { - selected_records.push(d); - } - }); - - return selected_records - } -}); - -frappe.ui.ColumnPicker = Class.extend({ - init: function(list) { - this.list = list; - this.doctype = list.doctype; - }, - clear: function() { - this.columns = []; - $(this.dialog.body).html('