Revert "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 keyFieldConfig in registry so we can use the standard widgets
24             stores[app.appName].each(function(cfConfig) {
25                 var definition = cfConfig.get('definition'),
26                     options = definition.options ? definition.options : {},
27                     keyFieldConfig = definition.keyFieldConfig ? definition.keyFieldConfig : null;
28                     
29                 if (keyFieldConfig) {
30                     app.getRegistry().get('config')[cfConfig.get('name')] = keyFieldConfig;
31                 }
32             });
33         }
34         
35         return stores[app.appName];
36     };
37     
38     /**
39      * convert config record to record field
40      * 
41      * @param  {Record} cfConfig
42      * @return {Ext.data.Field} field definition
43      */
44     var config2Field = function(cfConfig) {
45         var def = cfConfig.get('definition');
46         
47         return new Ext.data.Field(Ext.apply({
48             name: '#' + cfConfig.get('name')
49         }, def));
50     };
51     
52     return {
53         /**
54          * returns a single field config
55          * 
56          * @param {String/Application}  app
57          * @param {String}              model
58          * @param {String}              name
59          * @param {Boolean}             asField
60          * @return {Record}
61          */
62         getConfig: function (app, model, name, asField) {
63             var cfStore = getStore(app),
64                 cfConfig = null;
65             
66             cfStore.clearFilter(true);
67             cfStore.filter('model', model);
68             cfConfig = cfStore.findExact('name', name);
69             cfConfig = cfConfig > -1 ? cfStore.getAt(cfConfig): null;
70             cfStore.clearFilter(true);
71             
72             return asField ? config2Field(cfConfig) : cfConfig;
73             
74         },
75         
76         /**
77          * returns a single field config
78          * 
79          * @param {String/Application}  app
80          * @param {String}              model
81          * @param {Boolean}             asFields
82          * @return {Array}
83          */
84         getConfigs: function(app, model, asFields) {
85             if (Ext.isFunction(model.getMeta)) {
86                 model = model.getMeta('appName') + '_Model_' + model.getMeta('modelName');
87             }
88             
89             var cfStore = getStore(app),
90                 cfConfigs = [];
91             
92             cfStore.clearFilter(true);
93             cfStore.filter('model', model);
94             cfStore.each(function(r) {cfConfigs.push(r);});
95             cfStore.clearFilter(true);
96             
97             if (asFields) {
98                 Ext.each(cfConfigs, function(cfConfig, idx) {
99                     cfConfigs[idx] = config2Field(cfConfig);
100                 }, this);
101             }
102             
103             return cfConfigs;
104         }
105     }
106 }();