diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index 1510ff8936..42480dafdf 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -621,8 +621,8 @@ export default {
plantRealmButton: 'vn-order-catalog > vn-side-menu vn-icon[icon="icon-plant"]',
type: 'vn-autocomplete[data="$ctrl.itemTypes"]',
itemId: 'vn-order-catalog > vn-side-menu vn-textfield[ng-model="$ctrl.itemId"]',
- itemTagValue: 'vn-order-catalog > vn-side-menu vn-textfield[ng-model="$ctrl.value"]',
- openTagSearch: 'vn-order-catalog > vn-side-menu > div > vn-vertical > vn-textfield[ng-model="$ctrl.value"] .append i',
+ itemTagValue: 'vn-order-catalog > vn-side-menu vn-datalist[ng-model="$ctrl.value"]',
+ openTagSearch: 'vn-order-catalog > vn-side-menu > div > vn-vertical > vn-datalist[ng-model="$ctrl.value"] .append i',
tag: 'vn-order-catalog-search-panel vn-autocomplete[ng-model="filter.tagFk"]',
tagValue: 'vn-order-catalog-search-panel vn-textfield[ng-model="filter.value"]',
searchTagButton: 'vn-order-catalog-search-panel button[type=submit]',
diff --git a/front/core/components/datalist/index.js b/front/core/components/datalist/index.js
index d5feb18932..bf3cab9a18 100644
--- a/front/core/components/datalist/index.js
+++ b/front/core/components/datalist/index.js
@@ -3,6 +3,7 @@ import ArrayModel from '../array-model/array-model';
import CrudModel from '../crud-model/crud-model';
import {mergeWhere} from 'vn-loopback/util/filter';
import Textfield from '../textfield/textfield';
+import './style.scss';
export default class Datalist extends Textfield {
constructor($element, $scope, $compile, $transclude) {
@@ -12,7 +13,6 @@ export default class Datalist extends Textfield {
this._selection = null;
this.buildInput('text');
-
this.input.setAttribute('autocomplete', 'off');
}
@@ -157,8 +157,6 @@ export default class Datalist extends Textfield {
this.destroyList();
} else
this.buildList();
-
- this.emit('select', {selection});
});
}
diff --git a/front/core/components/datalist/style.scss b/front/core/components/datalist/style.scss
new file mode 100755
index 0000000000..db4ed2bb09
--- /dev/null
+++ b/front/core/components/datalist/style.scss
@@ -0,0 +1,7 @@
+@import "effects";
+
+vn-datalist {
+ input::-webkit-calendar-picker-indicator {
+ display: none
+ }
+}
\ No newline at end of file
diff --git a/modules/order/back/methods/order/catalogFilter.js b/modules/order/back/methods/order/catalogFilter.js
index 3814aa12d1..114cd27864 100644
--- a/modules/order/back/methods/order/catalogFilter.js
+++ b/modules/order/back/methods/order/catalogFilter.js
@@ -162,6 +162,7 @@ module.exports = Self => {
`SELECT
it.tagFk,
it.itemFk,
+ it.value,
t.name
FROM tmp.ticketCalculateItem tci
JOIN vn.itemTag it ON it.itemFk = tci.itemFk
diff --git a/modules/order/front/catalog/index.html b/modules/order/front/catalog/index.html
index 5cc72e3c8f..37767e81bb 100644
--- a/modules/order/front/catalog/index.html
+++ b/modules/order/front/catalog/index.html
@@ -85,12 +85,15 @@
-
+ show-field="value"
+ value-field="value"
+ label="Search tag">
@@ -101,7 +104,7 @@
style="cursor: pointer;">
-
+
{
- // Add new tag filters
- item.tags.forEach(itemTag => {
- const alreadyAdded = newFilterList.findIndex(filter => {
- return filter.field == itemTag.tagFk;
- });
-
- if (alreadyAdded == -1) {
- newFilterList.push({
- name: itemTag.name,
- field: itemTag.tagFk,
- isTag: true
- });
- }
- });
- });
-
- // Add default filters - Replaces tags with same name
- this.defaultOrderFields.forEach(orderField => {
- const index = newFilterList.findIndex(newfield => {
- return newfield.name == orderField.name;
- });
-
- if (index > -1)
- newFilterList[index] = orderField;
- else
- newFilterList.push(orderField);
- });
-
- this.orderFields = newFilterList;
+ this.buildTagsFilter(value);
+ this.buildOrderFilter(value);
}
get categoryId() {
@@ -273,6 +244,43 @@ class Controller {
this.$state.go(this.$state.current.name, params);
}
+
+ buildTagsFilter(items) {
+ const tagValues = [];
+ items.forEach(item => {
+ item.tags.forEach(itemTag => {
+ const alreadyAdded = tagValues.findIndex(tag => {
+ return tag.value == itemTag.value;
+ });
+
+ if (alreadyAdded == -1)
+ tagValues.push(itemTag);
+ });
+ });
+ this.tagValues = tagValues;
+ }
+
+ buildOrderFilter(items) {
+ const tags = [];
+ items.forEach(item => {
+ item.tags.forEach(itemTag => {
+ const alreadyAdded = tags.findIndex(tag => {
+ return tag.field == itemTag.tagFk;
+ });
+
+ if (alreadyAdded == -1) {
+ tags.push({
+ name: itemTag.name,
+ field: itemTag.tagFk,
+ isTag: true
+ });
+ }
+ });
+ });
+ let newFilterList = [].concat(this.defaultOrderFields);
+ newFilterList = newFilterList.concat(tags);
+ this.orderFields = newFilterList;
+ }
}
Controller.$inject = ['$http', '$scope', '$state', '$compile', '$transitions'];
diff --git a/modules/order/front/catalog/index.spec.js b/modules/order/front/catalog/index.spec.js
index dd9e132577..01da618009 100644
--- a/modules/order/front/catalog/index.spec.js
+++ b/modules/order/front/catalog/index.spec.js
@@ -37,16 +37,19 @@ describe('Order', () => {
describe('items() setter', () => {
it(`should return an object with order params`, () => {
- let expectedResult = [{field: 'showOrder, price', name: 'Color'}];
- let unexpectedResult = [{tagFk: 5, name: 'Color'}];
- controller.items = [{id: 1, name: 'My Item', tags: [
+ spyOn(controller, 'buildTagsFilter');
+ spyOn(controller, 'buildOrderFilter').and.callThrough();
+ const expectedResult = [{field: 'showOrder, price', name: 'Color and price'}];
+ const items = [{id: 1, name: 'My Item', tags: [
{tagFk: 4, name: 'Length'},
{tagFk: 5, name: 'Color'}
]}];
+ controller.items = items;
- expect(controller.orderFields.length).toEqual(5);
+ expect(controller.orderFields.length).toEqual(6);
expect(controller.orderFields).toEqual(jasmine.arrayContaining(expectedResult));
- expect(controller.orderFields).not.toEqual(jasmine.arrayContaining(unexpectedResult));
+ expect(controller.buildTagsFilter).toHaveBeenCalledWith(items);
+ expect(controller.buildOrderFilter).toHaveBeenCalledWith(items);
});
});
@@ -222,6 +225,48 @@ describe('Order', () => {
expect(controller.$.model.addFilter).toHaveBeenCalledWith(null, expectedOrder);
});
});
+
+ describe('buildTagsFilter()', () => {
+ it(`should create an array of non repeated tag values and then set the tagValues property`, () => {
+ const items = [
+ {
+ id: 1, name: 'My Item 1', tags: [
+ {tagFk: 4, name: 'Length', value: 1},
+ {tagFk: 5, name: 'Color', value: 'red'}
+ ]
+ },
+ {
+ id: 2, name: 'My Item 2', tags: [
+ {tagFk: 4, name: 'Length', value: 1},
+ {tagFk: 5, name: 'Color', value: 'blue'}
+ ]
+ }];
+ controller.buildTagsFilter(items);
+
+ expect(controller.tagValues.length).toEqual(3);
+ });
+ });
+
+ describe('buildOrderFilter()', () => {
+ it(`should create an array of non repeated tags plus default filters and then set the orderFields property`, () => {
+ const items = [
+ {
+ id: 1, name: 'My Item 1', tags: [
+ {tagFk: 4, name: 'Length'},
+ {tagFk: 5, name: 'Color'}
+ ]
+ },
+ {
+ id: 2, name: 'My Item 2', tags: [
+ {tagFk: 5, name: 'Color'},
+ {tagFk: 6, name: 'Relevancy'}
+ ]
+ }];
+ controller.buildOrderFilter(items);
+
+ expect(controller.orderFields.length).toEqual(7);
+ });
+ });
});
});
diff --git a/modules/order/front/locale/es.yml b/modules/order/front/locale/es.yml
index 0ada37bfd0..565d4f2518 100644
--- a/modules/order/front/locale/es.yml
+++ b/modules/order/front/locale/es.yml
@@ -16,6 +16,7 @@ Item id: Id de artÃculo
Order by: Ordenar por
Order: Orden
Price: Precio
+Color and price: Color y precio
Ascendant: Ascendente
Descendant: Descendente
Created from: Creado desde