0010834: defining a key-value costumfield breaks addressbook
[tine20] / tine20 / Tinebase / js / widgets / customfields / ConfigManager.js
1 /*
2  * Tine 2.0
3  * 
4  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
5  * @author      Cornelius Weiss <c.weiss@metaways.de>
6  * @copyright   Copyright (c) 2007-2012 Metaways Infosystems GmbH (http://www.metaways.de)
7  */
8
9 Ext.ns('Tine.widgets', 'Tine.widgets.customfields');
10
11 Tine.widgets.customfields.ConfigManager = function() {
12     var stores = {};
13     
14     var getStore = function(app) {
15         app = Tine.Tinebase.appMgr.get(app);
16         if (! stores[app.appName]) {
17             var allCfs = (Ext.isFunction(app.getRegistry)) ? app.getRegistry().get('customfields') : null;
18             stores[app.appName] = new Ext.data.JsonStore({
19                 fields: Tine.Tinebase.Model.Customfield,
20                 data: allCfs ? allCfs : []
21             });
22             
23             // place customefield keyFieldConfig in registry so we can use the standard widgets
24             // keyfields are used for key/value customfields with a defined store 
25             stores[app.appName].each(function(cfConfig) {
26                 var definition = cfConfig.get('definition'),
27                     options = definition.options ? definition.options : {},
28                     keyFieldConfig = definition.keyFieldConfig ? definition.keyFieldConfig : null;
29                     
30                 if (keyFieldConfig) {
31                     var config = app.getRegistry().get('config');
32                     config[cfConfig.get('name')] = keyFieldConfig;
33                     app.getRegistry().set('config', config);
34                 }
35             });
36         }
37         
38         return stores[app.appName];
39     };
40     
41     /**
42      * convert config record to record field
43      * 
44      * @param  {Record} cfConfig
45      * @return {Ext.data.Field} field definition
46      */
47     var config2Field = function(cfConfig) {
48         var def = cfConfig.get('definition');
49         
50         return new Ext.data.Field(Ext.apply({
51             name: '#' + cfConfig.get('name')
52         }, def));
53     };
54     
55     return {
56         /**
57          * returns a single field config
58          * 
59          * @param {String/Application}  app
60          * @param {String}              model
61          * @param {String}              name
62          * @param {Boolean}             asField
63          * @return {Record}
64          */
65         getConfig: function (app, model, name, asField) {
66             var cfStore = getStore(app),
67                 cfConfig = null;
68             
69             cfStore.clearFilter(true);
70             cfStore.filter('model', model);
71             cfConfig = cfStore.findExact('name', name);
72             cfConfig = cfConfig > -1 ? cfStore.getAt(cfConfig): null;
73             cfStore.clearFilter(true);
74             
75             return asField ? config2Field(cfConfig) : cfConfig;
76             
77         },
78         
79         /**
80          * returns a single field config
81          * 
82          * @param {String/Application}  app
83          * @param {String}              model
84          * @param {Boolean}             asFields
85          * @return {Array}
86          */
87         getConfigs: function(app, model, asFields) {
88             if (Ext.isFunction(model.getMeta)) {
89                 model = model.getMeta('appName') + '_Model_' + model.getMeta('modelName');
90             }
91             
92             var cfStore = getStore(app),
93                 cfConfigs = [];
94             
95             cfStore.clearFilter(true);
96             cfStore.filter('model', model);
97             cfStore.each(function(r) {cfConfigs.push(r);});
98             cfStore.clearFilter(true);
99             
100             if (asFields) {
101                 Ext.each(cfConfigs, function(cfConfig, idx) {
102                     cfConfigs[idx] = config2Field(cfConfig);
103                 }, this);
104             }
105             
106             return cfConfigs;
107         }
108     }
109 }();