adds version check config
[tine20] / tine20 / Tinebase / js / MainScreen.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-2010 Metaways Infosystems GmbH (http://www.metaways.de)
7  *
8  */
9 Ext.ns('Tine.Tinebase');
10
11 /**
12  * Tine 2.0 jsclient MainScreen.
13  * 
14  * @namespace   Tine.Tinebase
15  * @class       Tine.Tinebase.MainScreenPanel
16  * @extends     Ext.Panel
17  * @singleton   
18  * @author      Cornelius Weiss <c.weiss@metaways.de>
19  */
20 Tine.Tinebase.MainScreenPanel = Ext.extend(Ext.Panel, {
21     
22     border: false,
23     layout: {
24         type:'vbox',
25         align:'stretch',
26         padding:'0'
27     },
28     /**
29      * the active app
30      * @type {Tine.Tinebase.Application}
31      */
32     app: null,
33     
34     /**
35      * @cfg {String} appPickerStyle "tabs" or "pile" defaults to "tabs"
36      */
37     appPickerStyle: 'tabs',
38     
39     /**
40      * @private
41      */
42     initComponent: function() {
43         // NOTE: this is a cruid method to create some kind of singleton...
44         Tine.Tinebase.MainScreen = this;
45         
46         this.initLayout();
47         Tine.Tinebase.appMgr.on('activate', this.onAppActivate, this);
48         
49         this.supr().initComponent.call(this);
50     },
51     
52     /**
53      * @private
54      */
55     initLayout: function() {
56         this.items = [{
57             cls: 'tine-mainscreen-topbox',
58             border: false,
59             html: '<div class="tine-mainscreen-topbox-left"></div><div class="tine-mainscreen-topbox-middle"></div><div class="tine-mainscreen-topbox-right"></div>'
60         }, {
61             cls: 'tine-mainscreen-mainmenu',
62             height: 20,
63             layout: 'fit',
64             border: false,
65             items: this.getMainMenu()
66         }, {
67             cls: 'tine-mainscreen-apptabs',
68             hidden: this.appPickerStyle != 'tabs',
69             border: false,
70             height: Ext.isGecko ? 22 : 20,
71             items: new Tine.Tinebase.AppTabsPanel({
72                 plain: true
73             })
74         }, {
75             cls: 'tine-mainscreen-centerpanel',
76             flex: 1,
77             layout: 'border',
78             border: false,
79             items: [{
80                 cls: 'tine-mainscreen-centerpanel-north',
81                 region: 'north',
82                 layout: 'card',
83                 activeItem: 0,
84                 height: 59,
85                 border: false,
86                 id:     'north-panel-2',
87                 items: []
88             }, {
89                 cls: 'tine-mainscreen-centerpanel-center',
90                 region: 'center',
91                 id: 'center-panel',
92                 animate: true,
93                 border: false,
94                 layout: 'card',
95                 activeItem: 0,
96                 defaults: {
97                     hideMode: 'offsets'
98                 },
99                 items: []
100             }, {
101                 cls: 'tine-mainscreen-centerpanel-west',
102                 region: 'west',
103                 id: 'west',
104                 stateful: false,
105                 split: true,
106                 width: 200,
107                 minSize: 100,
108                 maxSize: 300,
109                 border: false,
110                 collapsible:true,
111                 collapseMode: 'mini',
112                 header: false,
113                 layout: 'fit',
114                 listeners: {
115                     afterrender: function() {
116                         // add to scrollmanager
117                         if (arguments[0] && arguments[0].hasOwnProperty('body')) {
118                             Ext.dd.ScrollManager.register(arguments[0].body);
119                         }
120                     }
121                 },
122                 autoScroll: true,
123                 tbar: [{
124                     buttonAlign : 'center'
125                 }],
126                 
127                 items: [{
128                     id: 'moduletree',
129                     cls: 'tine-mainscreen-centerpanel-west-modules',
130                     border: false,
131                     autoScroll: false,
132                     autoHeight: true,
133                     style: {
134                         width: '100%'
135                     },
136                     layout: 'card',
137                     activeItem: 0,
138                     items: []
139                 }, {
140                     id: 'treecards',
141                     cls: 'tine-mainscreen-centerpanel-west-treecards',
142                     border: false,
143                     style: {
144                         width: '100%'
145                     },
146                     autoScroll: false,
147                     layout: 'card',
148                     activeItem: 0,
149                     items: []
150                 }]
151             }]
152         }];
153     },
154     
155     /**
156      * returns main menu
157      * 
158      * @return {Ext.Menu}
159      */
160     getMainMenu: function() {
161         if (! this.mainMenu) {
162             this.mainMenu = new Tine.Tinebase.MainMenu({
163                 showMainMenu: this.appPickerStyle != 'tabs'
164             });
165         }
166         
167         return this.mainMenu;
168     },
169     
170     /**
171      * appMgr app activation listener
172      * 
173      * @param {Tine.Application} app
174      */
175     onAppActivate: function(app) {
176         Tine.log.info('Activating app ' + app.appName);
177         
178         this.app = app;
179         
180         // set document / browser title
181         var postfix = (Tine.Tinebase.registry.get('titlePostfix')) ? Tine.Tinebase.registry.get('titlePostfix') : '',
182             // some apps (Felamimail atm) can add application specific title postfixes
183             // TODO generalize this
184             appPostfix = (document.title.match(/^\([0-9]+\) /)) ? document.title.match(/^\([0-9]+\) /)[0] : '';
185         document.title = Ext.util.Format.stripTags(appPostfix + Tine.title + postfix  + ' - ' + app.getTitle());
186     },
187     
188     /**
189      * executed after rendering process
190      * 
191      * @private
192      */
193     afterRender: function() {
194         this.supr().afterRender.apply(this, arguments);
195         
196         this.activateDefaultApp();
197         
198         // check for new version
199         // TODO add helper function for fetching config ... this condition sucks.
200         if ((      ! Tine.Tinebase.registry.get("config")
201                 || ! Tine.Tinebase.registry.get("config").versionCheck
202                 ||   Tine.Tinebase.registry.get("config").versionCheck.value
203             ) && Tine.Tinebase.common.hasRight('check_version', 'Tinebase')
204         ) {
205             Tine.widgets.VersionCheck();
206         }
207         
208         if (Tine.Tinebase.registry.get('mustchangepw')) {
209             var passwordDialog = new Tine.Tinebase.PasswordChangeDialog({
210                 title: _('Your password expired. Please enter a new user password:')
211             });
212             passwordDialog.show();
213         }
214     },
215     
216     /**
217      * activate default application
218      * 
219      * NOTE: this fn waits for treecard panel to be rendered
220      * 
221      * @private
222      */
223     activateDefaultApp: function() {
224         if (Ext.getCmp('treecards').rendered) {
225             Tine.Tinebase.appMgr.activate();
226         } else {
227             this.activateDefaultApp.defer(10, this);
228         }
229     },
230     
231     /**
232      * sets the active content panel
233      * 
234      * @param {Ext.Panel} item Panel to activate
235      * @param {Bool} keep keep panel
236      */
237     setActiveContentPanel: function(panel, keep) {
238         var cardPanel = Ext.getCmp('center-panel');
239         panel.keep = keep;
240         
241         this.cleanupCardPanelItems(cardPanel);
242         this.setActiveCardPanelItem(cardPanel, panel);
243     },
244     
245     /**
246      * sets the active tree panel
247      * 
248      * @param {Ext.Panel} panel Panel to activate
249      * @param {Bool} keep keep panel
250      */
251     setActiveTreePanel: function(panel, keep) {
252         var cardPanel = Ext.getCmp('treecards');
253         panel.keep = keep;
254         this.cleanupCardPanelItems(cardPanel);
255         this.setActiveCardPanelItem(cardPanel, panel);
256     },
257     
258     /**
259      * sets the active module tree panel
260      * 
261      * @param {Ext.Panel} panel Panel to activate
262      * @param {Bool} keep keep panel
263      */
264     setActiveModulePanel: function(panel, keep) {
265         var modulePanel = Ext.getCmp('moduletree');
266         panel.keep = keep;
267         this.cleanupCardPanelItems(modulePanel);
268         this.setActiveCardPanelItem(modulePanel, panel);
269     },
270     
271     /**
272      * sets item
273      * 
274      * @param {Ext.Toolbar} panel toolbar to activate
275      * @param {Bool} keep keep panel
276      */
277     setActiveToolbar: function(panel, keep) {
278         var cardPanel = Ext.getCmp('north-panel-2');
279         panel.keep = keep;
280         
281         this.cleanupCardPanelItems(cardPanel);
282         this.setActiveCardPanelItem(cardPanel, panel);
283     },
284     
285     /**
286      * gets the currently displayed toolbar
287      * 
288      * @return {Ext.Toolbar}
289      */
290     getActiveToolbar: function() {
291         var northPanel = Ext.getCmp('north-panel-2');
292
293         if (northPanel.layout.activeItem && northPanel.layout.activeItem.el) {
294             return northPanel.layout.activeItem.el;
295         } else {
296             return false;
297         }
298     },
299     
300     /**
301      * remove all items which should not be keeped -> don't have a keep flag
302      * 
303      * @param {Ext.Panel} cardPanel
304      */
305     cleanupCardPanelItems: function(cardPanel) {
306         if (cardPanel.items) {
307             for (var i=0,p; i<cardPanel.items.length; i++){
308                 p =  cardPanel.items.get(i);
309                 if (! p.keep) {
310                     cardPanel.remove(p);
311                 }
312             }  
313         }
314     },
315     
316     /**
317      * add or set given item
318      * 
319      * @param {Ext.Panel} cardPanel
320      * @param {Ext.Panel} item
321      */
322     setActiveCardPanelItem: function(cardPanel, item) {
323         if (cardPanel.items.indexOf(item) !== -1) {
324             cardPanel.layout.setActiveItem(item.id);
325         } else {
326             cardPanel.add(item);
327             cardPanel.layout.setActiveItem(item.id);
328             cardPanel.doLayout();
329         }
330     }
331 });