diff --git a/frappe/public/build.json b/frappe/public/build.json index 2f16a927d3..13bc48b8b5 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -216,7 +216,6 @@ "public/css/list.css", "public/css/calendar.css", "public/css/role_editor.css", - "public/css/filter_dashboard.css", "public/css/gantt.css" ], "js/list.min.js": [ @@ -227,9 +226,6 @@ "public/js/frappe/model/indicator.js", "public/js/frappe/ui/filters/filters.js", "public/js/frappe/ui/filters/edit_filter.html", - "public/js/frappe/ui/filters/filter_dashboard.html", - "public/js/frappe/ui/filters/filter_dashboard_value.html", - "public/js/frappe/ui/filters/filter_dashboard_head.html", "public/js/frappe/ui/tags.js", "public/js/frappe/ui/like.js", "public/js/frappe/ui/liked_by.html", diff --git a/frappe/public/css/filter_dashboard.css b/frappe/public/css/filter_dashboard.css deleted file mode 100644 index 07f7c96561..0000000000 --- a/frappe/public/css/filter_dashboard.css +++ /dev/null @@ -1,106 +0,0 @@ -/* the element that this class is applied to, should have a max width for this to work*/ -.date-range-picker { - font-size: 85%; -} -.filter_area { - margin: 0 -15px; -} -.filter-dashboard-wrapper { - display: none; - padding-bottom: 0px; -} -.list-filter-dashboard { - border-top: 1px solid #d1d8dd; - overflow-x: scroll; - overflow-y: hidden; -} -.filter-header { - border-bottom: 1px solid #d1d8dd; - background-color: #F7FAFC; - padding: 8px 15px; -} -.filter-header .search-dropdown { - margin-top: -20px; - margin-right: 20px; -} -.filter-header .search-dropdown .octicon { - font-size: 14px; -} -.filter-header .sort-dropdown { - margin-top: -16px; -} -.filter-header .dropdown-menu { - min-width: 120px !important; -} -.filter-label { - margin: 0px; - color: #8D99A6; -} -.filter-dashboard-items { - height: 187px; - margin-right: -2px; - display: flex; -} -.filter-dash-item { - flex-grow: 1; - min-width: 180px; - float: left; - height: 187px; - border-right: 1px solid #d1d8dd; -} -.filter-input { - padding: 10px 15px; -} -.filter-input input { - height: 25px; -} -.filter-item-value, -.stat-no-records { - padding: 0px 15px; -} -.filter-dash-item:after { - /*top:-10px;*/ -} -.filter-sort { - font-size: 1.5em; -} -.filter-sort-item a { - padding: 8px !important; -} -.filter-sort-item:hover { - color: #212a33; - text-decoration: none; - background-color: #F0F4F7; -} -.filter-stat { - overflow-y: auto; - overflow-x: hidden; - height: 158px; - margin: 0px; -} -.selected { - vertical-align: 10%; - font-size: 1.2em; -} -.filter-sort-item > label { - float: right; -} -.filter-stat-link > .badge { - position: absolute; - float: right; - margin-right: 10px; - margin-top: 2px; - font-size: 11px; -} -.filter-stat-link > .stat { - width: 130px; - display: inline-block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 100%; - vertical-align: middle; -} -.filter-dash-controls > .filter-label { - padding-bottom: 5px; -} diff --git a/frappe/public/css/form.css b/frappe/public/css/form.css index 1272485515..d49fd540ef 100644 --- a/frappe/public/css/form.css +++ b/frappe/public/css/form.css @@ -194,7 +194,7 @@ h6.uppercase, } .form-section:not(:last-child), .form-inner-toolbar { - border-bottom: 1px solid #EBEFF2; + border-bottom: 1px solid #d1d8dd; } .empty-section { display: none !important; diff --git a/frappe/public/css/list.css b/frappe/public/css/list.css index 20739070de..a13ece1c23 100644 --- a/frappe/public/css/list.css +++ b/frappe/public/css/list.css @@ -41,7 +41,7 @@ color: #8D99A6; } .filter-box { - border-top: 1px solid #d1d8dd; + border-bottom: 1px solid #d1d8dd; padding: 10px 15px 3px; } .filter-box .remove-filter { @@ -253,6 +253,9 @@ color: #36414C; font-size: 11px; } +.page-form .awesomplete > ul { + min-width: 300px; +} .taggle_input { padding: 0; margin-top: 3px; diff --git a/frappe/public/css/page.css b/frappe/public/css/page.css index 61dc93635e..a7e89d00cd 100644 --- a/frappe/public/css/page.css +++ b/frappe/public/css/page.css @@ -97,14 +97,21 @@ } .page-form { margin: 0px; - padding-top: 15px; + padding-right: 15px; + padding-top: 10px; border-bottom: 1px solid #d1d8dd; + background-color: #F7FAFC; } .page-form .form-group { - margin-bottom: 15px; + padding-right: 0px; + margin-bottom: 10px; } .page-form .checkbox { - margin-top: 2px; + margin-top: 4px; + margin-bottom: 4px; +} +.page-form .checkbox .help-box { + display: none; } select.input-sm { line-height: 1.2em !important; diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index ac0edf2e49..f768f42372 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -290,6 +290,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ }, init_filters: function () { + this.make_standard_filters(); this.filter_list = new frappe.ui.FilterList({ base_list: this, parent: this.wrapper.find('.list-filters').show(), @@ -412,9 +413,6 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ execute_run: function () { if (this.dirty) { this.run(); - if (this.clean_dash != true) { - this.filter_list.reload_stats(); - } } else { if (new Date() - (this.last_updated_on || 0) > 30000) { // older than 5 mins, refresh @@ -504,7 +502,6 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ this.last_updated_on = new Date(); this.dirty = false; - this.clean_dash = false; // set a fresh so that multiple refreshes do not happen // at the same time. This is true when deleting. // AJAX response will try to refresh and list_update notification @@ -555,7 +552,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ var order_by = ''; if(this.sort_selector) { // get order_by from sort_selector - order_by = $.format('`tab{0}`.`{1}` {2}', + order_by = $.format('`tab{0}`.`{1}` {2}', [this.doctype, this.sort_selector.sort_by, this.sort_selector.sort_order]); } else { order_by = this.list_renderer.order_by; diff --git a/frappe/public/js/frappe/ui/base_list.js b/frappe/public/js/frappe/ui/base_list.js index 6547c4baa7..8b41548660 100644 --- a/frappe/public/js/frappe/ui/base_list.js +++ b/frappe/public/js/frappe/ui/base_list.js @@ -163,6 +163,8 @@ frappe.ui.BaseList = Class.extend({ }, make_filters: function () { + this.make_standard_filters(); + this.filter_list = new frappe.ui.FilterList({ base_list: this, parent: this.wrapper.find('.list-filters').show(), @@ -176,6 +178,57 @@ frappe.ui.BaseList = Class.extend({ } }, + make_standard_filters: function() { + var me = this; + if (this.standard_filters_added) { + return; + } + + this.page.add_field({ + fieldtype:'Link', + options:this.doctype, + label:'ID', + fieldname:'name', + }); + + var has_standard_filters = false; + this.meta.fields.forEach(function(df) { + if(df.in_standard_filter) { + me.page.add_field({ + fieldtype: df.fieldtype, + label: __(df.label), + options: df.options, + fieldname: df.fieldname + }); + } + }); + + this.page.page_form.on('change', ':input', function() { + me.refresh(true); + }); + + this.standard_filters_added = true; + }, + + update_standard_filters: function(filters) { + let values = {}; + 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) { + filters.push([ + me.doctype, + field.df.fieldname, + (['Data', 'Text', 'Small Text', 'Text Editor'] + .includes(field.df.fieldtype) ? 'like' : '='), + value + ]) + } + } + }, + + clear: function () { this.data = []; this.wrapper.find('.result-list').empty(); diff --git a/frappe/public/js/frappe/ui/filters/filter_dashboard.html b/frappe/public/js/frappe/ui/filters/filter_dashboard.html deleted file mode 100644 index 284d30520c..0000000000 --- a/frappe/public/js/frappe/ui/filters/filter_dashboard.html +++ /dev/null @@ -1,9 +0,0 @@ -
-
-
-
- -
-
-
-
\ No newline at end of file diff --git a/frappe/public/js/frappe/ui/filters/filter_dashboard_head.html b/frappe/public/js/frappe/ui/filters/filter_dashboard_head.html deleted file mode 100644 index b2008394be..0000000000 --- a/frappe/public/js/frappe/ui/filters/filter_dashboard_head.html +++ /dev/null @@ -1,41 +0,0 @@ -
-
-
{{ label }}
- {% if (type!=="Date" && type!=="Datetime" && type!=="DateRange") { %} - - - {% } %} -
- - {% if(type==="Date" || type==="Datetime" || type==="DateRange") { %} -
-
- {% } else { %} - - {% } %} -
\ No newline at end of file diff --git a/frappe/public/js/frappe/ui/filters/filter_dashboard_value.html b/frappe/public/js/frappe/ui/filters/filter_dashboard_value.html deleted file mode 100644 index a6741bc590..0000000000 --- a/frappe/public/js/frappe/ui/filters/filter_dashboard_value.html +++ /dev/null @@ -1,19 +0,0 @@ -
  • - {% if(!stat.length) { %} -
  • {%= __("No records.") %}
  • - {% } else { - for (var i=0, l=stat.length; i < l; i++) { - var stat_label = stat[i][0]; - var stat_count = stat[i][1]; - %} -
  • - - {%= __(labels.length>0? labels[i] : stat_label) %} - {%= stat_count %} - - - -
  • - {% } - } %} - diff --git a/frappe/public/js/frappe/ui/filters/filters.js b/frappe/public/js/frappe/ui/filters/filters.js index ea812a751a..f1c8c44a86 100644 --- a/frappe/public/js/frappe/ui/filters/filters.js +++ b/frappe/public/js/frappe/ui/filters/filters.js @@ -18,214 +18,12 @@ frappe.ui.FilterList = Class.extend({
    - + ${__("Add Filter")}
    -
    `); - $(frappe.render_template("filter_dashboard", {})).appendTo(this.wrapper.find('.show_filters')); - - //show filter dashboard - this.filters_visible = false; - this.wrapper.find('.show-filters').click(function() { - var wrapper = $(me.wrapper).find('.filter-dashboard-wrapper'); - if(!me.filters_visible) { - wrapper.toggle(true); - $(this).text(__("Hide Filters")); - me.filters_visible = true; - } else { - wrapper.toggle(false); - $(this).text(__("Show Filters")); - me.filters_visible = false; - } - }); - - //add stats - $.each(frappe.meta.docfield_map[this.doctype], function(i,d) { - if (d.in_standard_filter && frappe.perm.has_perm(me.doctype, d.permlevel, "read")) { - if (d.fieldtype != 'Table') { - me.stats.push({name:d.fieldname,label:d.label,type:d.fieldtype}); - } - } - }); - - me.stats = me.stats.concat([ - {name:'creation', label:'Created On', type:'Datetime'}, - {name:'modified', label:'Last Modified On', type:'Datetime'}, - {name:'owner', label:'Created By', type:'Data'}, - {name:'modified_by', label:'Last Modified By', type:'Data'}, - ]); - - if(frappe.model.is_submittable(me.doctype)) { - me.stats.push({name:'docstatus', label:'Document Status', type:'Data'}); - } - - $.each(me.stats, function (i, v) { - me.render_dashboard_headers(v); - }); - - me.reload_stats() - }, - render_dashboard_headers: function(field){ - var me = this; - var context = { - field: field.name, - label: __(field.label), - type:field.type - }; - var sidebar_stat = $(frappe.render_template("filter_dashboard_head", context)) - .appendTo(this.wrapper.find(".filter-dashboard-items")); - }, - reload_stats: function(){ - if(this.fresh) { - return; - } - // set a fresh so that multiple refreshes do not happen - // at the same time. - this.fresh = true; - setTimeout(function() { - me.fresh = false; - }, 1000); - - //get stats - var me = this - return frappe.call({ - type: "GET", - method: 'frappe.desk.reportview.get_filter_dashboard_data', - args: { - stats: me.stats, - doctype: me.doctype, - filters: me.default_filters - }, - callback: function(r) { - // This gives a predictable stats order - me.wrapper.find(".filter-stat").empty(); - $.each(me.stats, function (i, v) { - me.render_filters(v, (r.message|| {})[v.name]); - }); - } - }); - }, - render_filters: function(field, stat){ - var me = this; - var sum = 0; - if (['Date', 'Datetime'].indexOf(field.type)!=-1) { - return - } - - var active = this.wrapper.find(".filter-sort-active[data-name='"+__(field.name)+"']"); - - // sort filters - if(active.attr('data-sort-by')==='alphabet') { - stat = (stat || []).sort(function(a, b) {return a[0].toString().toLowerCase().localeCompare(b[0].toString().toLowerCase());}); - } else { - stat = (stat || []).sort(function(a, b) { return a[1] - b[1] }); - } - - if(active.attr('data-order')==='desc') { - stat = stat.reverse(); - } - - //check formatting - var options = [] - var df = frappe.meta.has_field(me.doctype,field.name) - var labels =[] - if(df && df.fieldtype=='Check') { - options = [ - {value: 0, label: 'No'}, - {value: 1, label: 'Yes'} - ]; - } else if(field.name=="docstatus") { - labels.length = stat.length; - options = [ - {value: 0, label: "Draft"}, - {value: 1, label: "Submitted"}, - {value: 2, label: "Cancelled"} - ]; - } - - if(options.length>0) { - for (var i in stat) { - for (var o in options) { - if (stat[i][0] == options[o].value) { - if (field.name=="docstatus") { - labels[i] = options[o].label - }else{ - stat[i][0] = options[o].label - } - } - } - } - } - var context = { - field: field.name, - stat: stat, - sum: sum, - label: __(field.label), - labels:labels - }; - var dashboard_filter = this.wrapper.find(".filter-stat[data-name='" + __(field.name) + "']") - dashboard_filter.html(frappe.render_template("filter_dashboard_value", context)) - .on("click", ".filter-stat-link", function() { - var fieldname = $(this).attr('data-field'); - var label = $(this).attr('data-label'); - if ((df && df.fieldtype=='Check' )|| field.name=="docstatus") { - var noduplicate = true - } - if (label=="No Data"){ - me.base_list.set_filter(fieldname, '', false, noduplicate); - }else{ - me.base_list.set_filter(fieldname, label, false, noduplicate); - } - return false; - }) - if (stat.length>5) { - //list for autocomplete - var autolist = [] - for (var i = 0; i < stat.length; i++) { - autolist.push({label: stat[i][0], value: field.name}); - } - - var search_input = dashboard_filter.parent().find(".search-dashboard"); - - dashboard_filter.parent().find(".search-dropdown") - .removeClass("hide") - .on("shown.bs.dropdown", function (event) { - search_input.focus(); - search_input.val("") - }); - - new Awesomplete(search_input.get(0), { - minChars: 0, - maxItems: 99, - autoFirst: true, - list: autolist, - item: function(item, input) { - return $("
  • ").text(item.label).get(0); - }, - replace: function(text) { - this.input.value = ''; - } - }); - - search_input.on("awesomplete-select", function(e) { - var item = e.originalEvent.text; - if (item) { - if (df && df.fieldtype == 'Check') { - var noduplicate = true - } - if (item.label == "No Data") { - me.base_list.set_filter(item.value, '', false, noduplicate); - } else { - me.base_list.set_filter(item.value, item.label, false, noduplicate); - } - } - }); - } + +
    `); }, set_events: function() { var me = this; @@ -240,57 +38,6 @@ frappe.ui.FilterList = Class.extend({ me.base_list.run(); $(this).addClass("hide"); }); - - //set sort filters - this.wrapper.on("click", ".filter-sort-item", function() { - var active = $(this).closest(".filter-dash-item").find(".filter-sort-active"); - active.attr('data-sort-by', $(this).attr('data-sort-by')); - active.attr('data-order', $(this).attr('data-order')); - me.reload_stats(); - }); - - //setup date-time range pickers - this.wrapper.find(".filter-input-date").each(function(i,v) { - var self = this; - var date; - var date_wrapper = $('
    ').appendTo($(this)); - make_date("range"); - - function make_date(mode) { - var fieldtype = mode==="range" ? "DateRange" : "Date"; - var name = $(v).data("name"); - if(date) { - //cleanup old datepicker - date.datepicker.destroy(); - } - date = frappe.ui.form.make_control({ - df: { - fieldtype: fieldtype, - fieldname: name, - }, - parent: date_wrapper, - only_input: true - }); - date.refresh(); - - date.datepicker.update("onSelect", function(fd, dateObj) { - var filt = me.get_filter(name); - filt && filt.remove(true); - if(!dateObj.length && dateObj && date.datepicker.opts.range===false) { - me.add_filter(me.doctype, name, '=', moment(dateObj).format('YYYY-MM-DD')); - me.base_list.run(); - } else if(dateObj.length===2 && date.datepicker.opts.range===true) { - var [date1, date2] = [moment(dateObj[0]).format('YYYY-MM-DD'), moment(dateObj[1]).format('YYYY-MM-DD')]; - if(date1==date2) { - me.add_filter(me.doctype, name, '=', date1); - } else { - me.add_filter(me.doctype, name, 'Between', [date1, date2]); - } - me.base_list.run(); - } - }); - } - }) }, show_filters: function() { @@ -307,6 +54,13 @@ frappe.ui.FilterList = Class.extend({ }, add_filter: function(doctype, fieldname, condition, value, hidden) { + if (this.base_list.page.fields_dict[fieldname] + && ['=', 'like'].includes(condition)) { + // if filter exists in base_list, then exit + this.base_list.page.fields_dict[fieldname].set_input(value); + return; + } + if(doctype && fieldname && !frappe.meta.has_field(doctype, fieldname) && !in_list(frappe.model.std_fields_list, fieldname)) { @@ -318,7 +72,6 @@ frappe.ui.FilterList = Class.extend({ return; } - this.wrapper.find('.show_filters').toggle(true); var is_new_filter = arguments.length===0; @@ -384,6 +137,8 @@ frappe.ui.FilterList = Class.extend({ values.push(filter.get_value()); } }); + this.base_list.update_standard_filters(values); + return values; }, @@ -480,7 +235,6 @@ frappe.ui.Filter = Class.extend({ this.flist.update_filters(); if(!dont_run) { - this.flist.base_list.clean_dash = true; this.flist.base_list.refresh(true); } }, @@ -673,7 +427,7 @@ frappe.ui.Filter = Class.extend({ title="'+__("Remove Filter")+'">\ \
    ') - .insertAfter(this.flist.wrapper.find(".set-filters .show-filters")); + .insertAfter(this.flist.wrapper.find(".set-filters .new-filter")); this.set_filter_button_text(); diff --git a/frappe/public/js/frappe/ui/page.js b/frappe/public/js/frappe/ui/page.js index 5a08f2ad34..7171fd3b9e 100644 --- a/frappe/public/js/frappe/ui/page.js +++ b/frappe/public/js/frappe/ui/page.js @@ -403,6 +403,13 @@ frappe.ui.Page = Class.extend({ show_form: function() { this.page_form.removeClass("hide"); }, + get_form_values: function() { + var values = {}; + this.page_form.fields_dict.forEach(function(field, key) { + values[key] = field.get_value(); + }); + return values; + }, add_view: function(name, html) { this.views[name] = $(html).appendTo($(this.wrapper).find(".page-content")); if(!this.current_view) { diff --git a/frappe/public/js/frappe/views/reports/reportview.js b/frappe/public/js/frappe/views/reports/reportview.js index 39dbdc002d..0f75aae67d 100644 --- a/frappe/public/js/frappe/views/reports/reportview.js +++ b/frappe/public/js/frappe/views/reports/reportview.js @@ -76,6 +76,7 @@ frappe.views.ReportView = frappe.ui.BaseList.extend({ this.add_totals_row = 0; this.page = this.parent.page; + this.meta = frappe.get_meta(this.doctype); this._body = $('
    ').appendTo(this.page.main); this.page_title = __('Report')+ ': ' + (this.docname ? __(this.doctype) + ' - ' + __(this.docname) : __(this.doctype)); @@ -258,13 +259,15 @@ frappe.views.ReportView = frappe.ui.BaseList.extend({ // build args for query get_args: function() { - var me = this; + let me = this; + let filters = this.filter_list.get_filters(); + return { doctype: this.doctype, fields: $.map(this.columns, function(v) { return me.get_full_column_name(v) }), order_by: this.get_order_by(), add_total_row: this.add_total_row, - filters: this.filter_list.get_filters(), + filters: filters, save_user_settings_fields: 1, with_childnames: 1, file_format_type: this.file_format_type diff --git a/frappe/public/less/filter_dashboard.less b/frappe/public/less/filter_dashboard.less deleted file mode 100644 index 22529448e0..0000000000 --- a/frappe/public/less/filter_dashboard.less +++ /dev/null @@ -1,129 +0,0 @@ -@import "variables.less"; -@import "mixins.less"; - -.date-range-picker { - font-size:85%; -} - -.filter_area { - margin: 0 -15px; -} - -.filter-dashboard-wrapper { - display: none; - padding-bottom: 0px; -} - -.list-filter-dashboard { - border-top: 1px solid @border-color; - overflow-x: scroll; - overflow-y: hidden; -} - -.filter-header { - border-bottom: 1px solid @border-color; - background-color: @panel-bg; - padding: 8px 15px; - - .search-dropdown { - margin-top: -20px; - margin-right: 20px; - - .octicon { - font-size: 14px; - } - } - - .sort-dropdown { - margin-top: -16px; - } - - .dropdown-menu { - min-width: 120px !important; - } -} - -.filter-label { - margin: 0px; - color: @text-muted; -} - -.filter-dashboard-items { - height: 187px; - margin-right: -2px; - display: flex; -} - -.filter-dash-item { - flex-grow: 1; - min-width: 180px; - float: left; - height: 187px; - border-right:1px solid @border-color; -} - -.filter-input { - padding: 10px 15px; - - input { - height: 25px; - } -} - -.filter-item-value, .stat-no-records { - padding: 0px 15px; -} - -.filter-dash-item:after { - /*top:-10px;*/ -} - -.filter-sort { - font-size:1.5em; -} - -.filter-sort-item { - a { - padding: 8px !important; - } -} - -.filter-sort-item:hover { - color: @grey-link-color; - text-decoration: none; - background-color: @btn-bg; -} - -.filter-stat { - overflow-y: auto; - overflow-x: hidden; - height: 158px; - margin: 0px; -} - -.selected { - vertical-align: 10%; - font-size: 1.2em; -} - -.filter-sort-item > label { - float:right; -} - -.filter-stat-link > .badge { - position: absolute; - float: right; - margin-right: 10px; - margin-top: 2px; - font-size: 11px; -} - -.filter-stat-link > .stat { - width: 130px; - display: inline-block; - .text-ellipsis(); -} - -.filter-dash-controls >.filter-label { - padding-bottom: 5px; -} \ No newline at end of file diff --git a/frappe/public/less/form.less b/frappe/public/less/form.less index 036790d9a2..49c7d1b723 100644 --- a/frappe/public/less/form.less +++ b/frappe/public/less/form.less @@ -249,7 +249,7 @@ h6.uppercase, .h6.uppercase { .form-section:not(:last-child), .form-inner-toolbar { - border-bottom: 1px solid @light-border-color; + border-bottom: 1px solid @border-color; } .empty-section { diff --git a/frappe/public/less/list.less b/frappe/public/less/list.less index 0f2eda8494..848267fb73 100644 --- a/frappe/public/less/list.less +++ b/frappe/public/less/list.less @@ -54,7 +54,7 @@ } .filter-box { - border-top: 1px solid @border-color; + border-bottom: 1px solid @border-color; // margin: 0px -15px; padding: 10px 15px 3px; @@ -319,6 +319,12 @@ } } +.page-form { + .awesomplete > ul { + min-width: 300px; + } +} + .taggle_input { padding: 0; margin-top: 3px; diff --git a/frappe/public/less/page.less b/frappe/public/less/page.less index 9c3d40179a..11aef785a5 100644 --- a/frappe/public/less/page.less +++ b/frappe/public/less/page.less @@ -118,16 +118,23 @@ .page-form { margin: 0px; - padding-top: 15px; + padding-right: 15px; + padding-top: 10px; border-bottom: 1px solid @border-color; -} + background-color: @panel-bg; -.page-form .form-group { - margin-bottom: 15px; -} + .form-group { + padding-right: 0px; + margin-bottom: 10px; + } + .checkbox { + margin-top: 4px; + margin-bottom: 4px; -.page-form .checkbox { - margin-top: 2px; + .help-box { + display: none; + } + } } select.input-sm {