<link rel="import" href="../../bower_components/polymer/polymer.html" /> <link rel="import" href="../../bower_components/paper-material/paper-material.html" /> <link rel="import" href="../../bower_components/paper-dropdown-menu/paper-dropdown-menu.html"> <link rel="import" href="../../bower_components/paper-menu/paper-menu.html"> <link rel="import" href="../../bower_components/paper-item/paper-item.html"> <link rel="import" href="../../bower_components/paper-icon-button/paper-icon-button.html"> <link rel="import" href="../../bower_components/iron-icons/iron-icons.html"> <link rel="import" href="../../bower_components/iron-icon/iron-icon.html"> <link rel="import" href="../../bower_components/paper-button/paper-button.html"> <dom-module id="filters-controllet"> <template> <style is="custom-style"> #filters_container { height: 48px; width: 100%; } #filters_container * { font-family: 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; } #filters_container #header { height: 32px; padding-top: 16px; text-align: center; font-weight: 700; background: #FFFFFF; color: #00BCD4; cursor: pointer; } #filters_container #header.hide{ color: #00BCD4; background: #FFFFFF; } /*#filters_container #header.hide:hover{*/ /*}*/ #filters_container #header.show{ color: #000000; background: #B6B6B6; } #filters_container #panel { display: none; position: relative; height: calc(100% - 48px); background: #FFFFFF; } paper-dropdown-menu { width: 100%; --paper-input-container-focus-color: #2196F3; } :host { --paper-dropdown-menu-icon: { color: #2196F3; }; } paper-item { min-width: 128px; } paper-item.iron-selected { background-color: #2196F3; color: #FFFFFF; } paper-input { width: 100%; --paper-input-container-focus-color: #2196F3; } paper-button { margin: 0px; height: 44px; color: #FFFFFF; background: #2196F3; font-weight: 700; } paper-button:hover { box-shadow: 0px 8px 12px #888; -webkit-box-shadow: 0px 8px 12px #888; -moz-box-shadow: 0px 8px 12px #888; } paper-icon-button { padding: 4px; } paper-icon-button.add { color: #2196F3; --paper-icon-button-ink-color: #2196F3; } paper-icon-button.cancel { color: #F44336; --paper-icon-button-ink-color: #F44336; } #filters_container .row { display: flex; height: 60px; width: 100%; } #filters_container .ddl_container { display: flex; height: 60px; width: 25%; padding: 0px 8px; } #filters_container .add_container { height: 40px; width: 40px; padding: 10px 0px; } #filters_container .andOr_container { display: inline-block; height: 44px; width: calc(100% - 40px); padding: 8px 0px; text-align: right; } #filters_container .row2 { display: flex; height: 48px; width: 100%; } #filters_container .row2 .highlighted { color: #2196F3; font-weight: 700; } #filters_container .filter { height: 24px; width: calc(75% - 16px); padding: 12px 8px; } #filters_container .remove_container { height: 40px; width: 40px; padding: 4px 8px; } </style> <paper-material id="filters_container" elevation="5"> <div id="header" class="hide" on-click="_showFiltersPanel"><span id="filters"><span id="addFilters"></span></span></div> <div id="panel"> <div class="row"> <div class="ddl_container"> <paper-dropdown-menu id="filter_field" label="Field"> <paper-menu id="filter_field_menu" class="dropdown-content"> <template is="dom-repeat" items={{fields}}> <paper-item id={{index}}>{{_fieldName(item)}}</paper-item> </template> </paper-menu> </paper-dropdown-menu> </div> <div class="ddl_container"> <paper-dropdown-menu id="filter_operation" label="Operation"> <paper-menu id="filter_operation_menu" class="dropdown-content"> <template is="dom-repeat" items={{operations}}> <paper-item id={{index}}>{{_getOperationlName(item)}}</paper-item> </template> </paper-menu> </paper-dropdown-menu> </div> <div class="ddl_container"> <paper-input id="filter_value" label="Value" class="base_input" maxlength="32" auto-validate pattern="^[.:,;+-_ a-zA-Z0-9]*" error-message="Invalid value!"></paper-input> </div> <div class="ddl_container"> <div class="add_container"> <paper-icon-button on-click="_addFilter" icon="add-circle" class="add"></paper-icon-button> </div> <div class="andOr_container"> <paper-button raised on-click="_changeLogicalOperator"><span id="andOr">{{logicalOperator}}</span></paper-button> </div> </div> </div> <template is="dom-repeat" items={{filters}}> <template is="dom-if" if="{{index}}"><!--excludes logicalOperator--> <div class="row2"> <div class="filter"> {{item.field}} <span class="highlighted">{{item.operation}}</span> "{{item.value}}" <span class="highlighted">{{_getLogicalOperator(index)}}</span> </div> <div class="remove_container"> <paper-icon-button on-click="_deleteFilter" icon="cancel" class="cancel"></paper-icon-button> </div> </div> </template> </template> </div> </paper-material> </template> <script> Polymer({ is : 'filters-controllet', properties : { fields : { type : Array, value : [] }, operations : { type : Array, value : ["=", "!=", ">", ">=", "<", "<=", "contains", "not contains", "start", "ends"] }, filters : { type : Array, value : [{logicalOperator: "AND"}] }, show : { type : Boolean, value : false } }, ready : function() { $(this.$.panel).perfectScrollbar(); // this._showFiltersPanel(); }, attached : function() { this.logicalOperator = this.filters[0].logicalOperator; this._translate(); }, setFields : function(fields) { // this.fields = this._copy(fields); this.fields = fields.slice(); this.fields = fields; }, setFilters : function(filters) { this.filters = filters.slice(); this.logicalOperator = this.filters[0].logicalOperator; this._fire(); }, getFilters : function() { return this.filters; }, reset : function() { this.fields = []; this.filters = [{logicalOperator: "AND"}]; }, _translate : function() { this.$.addFilters.innerHTML = ln["expertAddFilters_" + ln["localization"]]; this.$.filter_field.setAttribute("label", ln["filterField_" + ln["localization"]]); this.$.filter_operation.setAttribute("label", ln["filterOperation_" + ln["localization"]]); this.$.filter_value.setAttribute("label", ln["filterValue_" + ln["localization"]]); }, _fieldName : function(field) { return field.substring(field.lastIndexOf(",")+1, field.length); }, _showFiltersPanel : function() { // ? filter class hiddend & hover: if(!this.show) { this.$.filters_container.style.height = "100%"; $(this.$.header).removeClass("hide"); $(this.$.header).addClass("show"); this.$.panel.style.display = "block"; } else { this.$.filters_container.style.height = "48px"; $(this.$.header).removeClass("show"); $(this.$.header).addClass("hide"); this.$.panel.style.display = "none"; } this.fire('filters-controllet_show', {show: this.show}); this.show = !this.show; }, _fire : function() { if (this.filters.length > 1) this.fire('filters-controllet_filters', {filters: this.filters}); else this.fire('filters-controllet_filters', {filters: []}); }, _addFilter : function() { if (this.$.filter_field.selectedItem && this.$.filter_operation_menu.selectedItem && this.$.filter_value.value != "" && !this.$.filter_value.invalid) { var field = this.$.filter_field.value; var id = this.$.filter_operation.selectedItem.id; var operation = this.operations[id]; // var operation = this.$.filter_operation.value; var value = this.$.filter_value.value; // var filters = this.filters; // filters.push({"field": field, "operation": operation, "value": value}); // this.filters = filters; this.filters.push({"field": field, "operation": operation, "value": value}); this.$.filter_field_menu.select(-1); this.$.filter_operation_menu.select(-1); this.$.filter_value.value = ""; this._fire(); this._renderFilters(); } }, _deleteFilter : function(e) { var index = e.model.index; // var filters = this.filters; // filters.splice(index, 1); // this.filters = this._copy(filters); this.filters.splice(index, 1); this._fire(); this._renderFilters(); }, _getOperationlName: function(operation) { if(operation.indexOf("not") > -1) return ln["notContains_" + ln["localization"]]; if(operation.indexOf("contains") > -1) return ln["contains_" + ln["localization"]]; if(operation.indexOf("start") > -1) return ln["start_" + ln["localization"]]; if(operation.indexOf("ends") > -1) return ln["ends_" + ln["localization"]]; return operation; }, // _changeLogicalOperator : function() { // if(this.logicalOperator == "AND") // this.logicalOperator = "OR"; // else // this.logicalOperator = "AND"; // // this._fire(); // // this._renderFilters(); // }, _changeLogicalOperator : function() { if(this.logicalOperator == "AND") this.logicalOperator = "OR"; else this.logicalOperator = "AND"; this.filters[0] = {logicalOperator: this.logicalOperator} this._fire(); this._renderFilters(); }, _renderFilters : function() { var filters = this.filters.slice(); this.filters = []; this.async(function() { this.filters = filters; }, 0); }, _getLogicalOperator : function(index) { if(index == this.filters.length -1) return ""; else return this.filters[0].logicalOperator; }, // _copy : function(o) { // var out, v, key; // out = Array.isArray(o) ? [] : {}; // for (key in o) { // v = o[key]; // out[key] = (typeof v === "object") ? this._copy(v) : v; // } // return out; // } }); </script> </dom-module>