fix change event on reset
[tine20] / tine20 / Tinebase / js / widgets / form / RecordsPickerCombo.js
1 /*
2  * Tine 2.0
3  *
4  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
5  * @author      Philipp Schüle <p.schuele@metaways.de>
6  * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
7  *
8  */
9 Ext.ns('Tine.Tinebase.widgets.form');
10
11 /**
12  * config grid panel
13  *
14  * @namespace   Tine.Tinebase.widgets.form
15  * @class       Tine.Tinebase.widgets.form.RecordsPickerCombo
16  * @extends     Tine.widgets.grid.LayerCombo
17  */
18 Tine.Tinebase.widgets.form.RecordsPickerCombo = Ext.extend(Ext.ux.form.LayerCombo, {
19
20     hideButtons: false,
21     layerAlign: 'tr-br?',
22     minLayerWidth: 400,
23     layerHeight: 300,
24     allowBlur: true,
25
26     lazyInit: true,
27
28     formConfig: {
29         labelAlign: 'left',
30         labelWidth: 30
31     },
32
33     pickerGrid: null,
34     inEditor: true,
35     recordClass: null,
36
37     initComponent: function () {
38         this.emptyText = this.emptyText || i18n._('Search for records ...');
39         this.currentValue = this.currentValue || [];
40
41         Tine.Tinebase.widgets.form.RecordsPickerCombo.superclass.initComponent.call(this);
42         this.store = new Ext.data.SimpleStore({
43             fields: this.recordClass
44         });
45
46         this.on('beforecollapse', this.onBeforeCollapse, this);
47     },
48
49     getItems: function () {
50         this.pickerGrid = new Tine.widgets.grid.PickerGridPanel({
51             recordClass: this.recordClass,
52             height: this.layerHeight - 40 || 'auto',
53             onStoreChange: Ext.emptyFn,
54             store: this.store
55         });
56
57         return [this.pickerGrid];
58     },
59
60     /**
61      * cancel collapse if ctx menu is shown
62      */
63     onBeforeCollapse: function () {
64         return this.pickerGrid
65             && (!this.pickerGrid.contextMenu || this.pickerGrid.contextMenu.hidden)
66             && !this.pickerGrid.editing;
67     },
68
69     /**
70      * @param {String} value
71      * @return {Ext.form.Field} this
72      */
73     setValue: function (value) {
74         var _ = window.lodash;
75
76         value = value || [];
77         this.setStoreFromArray(value);
78         if (this.rendered) {
79             var text = _.reduce(this.store.data.items, function(result, record) {
80                 return result.concat(record.getTitle());
81             }, []).join(', ');
82             this.setRawValue(text || this.emptyText);
83             this.el[(text ? 'remove' : 'add') + 'Class'](this.emptyClass);
84         }
85
86         var oldValue = this.currentValue;
87         this.currentValue = value;
88         Tine.Tinebase.common.assertComparable(this.currentValue);
89
90         if (JSON.stringify(value) != JSON.stringify(oldValue)){
91             this.fireEvent('change', this, value, oldValue);
92         }
93
94         return this;
95     },
96
97     reset : function() {
98         this.currentValue = this.originalValue;
99
100         Tine.Tinebase.widgets.form.RecordsPickerCombo.superclass.reset.apply(this, arguments);
101     },
102
103     afterRender: function () {
104
105         Tine.Tinebase.widgets.form.RecordsPickerCombo.superclass.afterRender.apply(this, arguments);
106         if (this.currentValue) {
107             this.setValue(this.currentValue);
108         }
109     },
110     /**
111      * sets values to innerForm (grid)
112      */
113     setFormValue: function (value) {
114         if (!value) {
115             value = [];
116         }
117
118         this.setStoreFromArray(value);
119     },
120
121     /**
122      * retrieves values from grid
123      *
124      * @returns {*|Array}
125      */
126     getFormValue: function () {
127         return this.getFromStoreAsArray();
128     },
129
130     /**
131      * get values from store (as array)
132      *
133      * @param {Array}
134      *
135      */
136     setStoreFromArray: function(data) {
137         data = data || [];
138         //this.pickerGrid.getStore().clearData();
139         this.store.removeAll();
140
141         for (var i = data.length-1; i >=0; --i) {
142             var recordData = data[i],
143                 newRecord = new this.recordClass(recordData);
144             this.store.insert(0, newRecord);
145         }
146     },
147
148     /**
149      * get values from store (as array)
150      *
151      * @return {Array}
152      *
153      */
154     getFromStoreAsArray: function() {
155         var result = [];
156         this.store.each(function(record) {
157             result.push(record.data);
158         }, this);
159
160         return result;
161     }
162 });
163
164 Ext.reg('tinerecordspickercombobox', Tine.Tinebase.widgets.form.RecordsPickerCombo);