blob: 3dd7b3e5fc2e216dea2d209f1767b9fe3c373790 [file] [log] [blame]
Rushabh Mehta865c00a2012-01-24 14:33:21 +05301// ====================================================================
2
3pscript.startup_make_sidebar = function() {
4 $y(page_body.left_sidebar, {width:(100/6)+'%', paddingTop:'8px'});
5
6 var callback = function(r,rt) {
7 // menu
8 var ml = r.message;
9
10 // clear
11 page_body.left_sidebar.innerHTML = '';
12
13 for(var m=0; m<ml.length; m++){
14 if(ml[m]) {
15 new SidebarItem(ml[m]);
16 }
17 }
18 if(in_list(user_roles, 'System Manager')) {
19 var div = $a(page_body.left_sidebar, 'div', 'link_type', {padding:'8px', fontSize:'11px'});
20 $(div).html('[edit]').click(pscript.startup_set_module_order)
21 }
22 nav_obj.observers.push({notify:function(t,dt,dn) { pscript.select_sidebar_menu(t, dt, dn); }});
23
24 // select current
25 var no = nav_obj.ol[nav_obj.ol.length-1];
26 if(no && menu_item_map[decodeURIComponent(no[0])][decodeURIComponent(no[1])])
27 pscript.select_sidebar_menu(decodeURIComponent(no[0]), decodeURIComponent(no[1]));
28 }
29 $c_obj('Home Control', 'get_modules', '', callback);
30}
31
32// ====================================================================
33// Menu observer
34// ====================================================================
35
36cur_menu_pointer = null;
37var menu_item_map = {'Form':{}, 'Page':{}, 'Report':{}, 'List':{}}
38
39pscript.select_sidebar_menu = function(t, dt, dn) {
40 // get menu item
41 if(menu_item_map[t][dt]) {
42 // select
43 menu_item_map[t][dt].select();
44 } else {
45 // none found :-( Unselect
46 if(cur_menu_pointer)
47 cur_menu_pointer.deselect();
48 }
49}
50
51// ====================================================================
52// Menu pointer
53// ====================================================================
54
55var body_background = '#e2e2e2';
56
57MenuPointer = function(parent, label) {
58
59 this.wrapper = $a(parent, 'div', '', {padding:'0px', cursor:'pointer', margin:'2px 0px'});
60 $br(this.wrapper, '3px');
61
62 this.tab = make_table($a(this.wrapper, 'div'), 1, 2, '100%', ['', '11px'], {height:'22px',
63 verticalAlign:'middle', padding:'0px'}, {borderCollapse:'collapse', tableLayout:'fixed'});
64
65 $y($td(this.tab, 0, 0), {padding:'0px 4px', color:'#444', whiteSpace:'nowrap'});
66
67 // triangle border (?)
68 this.tab.triangle_div = $a($td(this.tab, 0, 1), 'div','', {
69 borderColor: body_background + ' ' + body_background + ' ' + body_background + ' ' + 'transparent',
70 borderWidth:'11px', borderStyle:'solid', height:'0px', width:'0px', marginRight:'-11px'});
71
72 this.label_area = $a($td(this.tab, 0, 0), 'span', '', '', label);
73
74 $(this.wrapper)
75 .hover(
76 function() { if(!this.selected)$bg(this, '#eee'); } ,
77 function() { if(!this.selected)$bg(this, body_background); }
78 )
79
80 $y($td(this.tab, 0, 0), {borderBottom:'1px solid #ddd'});
81
82}
83
84// ====================================================================
85
86MenuPointer.prototype.select = function(grey) {
87 $y($td(this.tab, 0, 0), {color:'#fff', borderBottom:'0px solid #000'});
88 //$gr(this.wrapper, '#F84', '#F63');
89 $gr(this.wrapper, '#888', '#666');
90 this.selected = 1;
91
92 if(cur_menu_pointer && cur_menu_pointer != this)
93 cur_menu_pointer.deselect();
94
95 cur_menu_pointer = this;
96}
97
98// ====================================================================
99
100MenuPointer.prototype.deselect = function() {
101 $y($td(this.tab, 0, 0), {color:'#444', borderBottom:'1px solid #ddd'});
102 $gr(this.wrapper, body_background, body_background);
103 this.selected = 0;
104}
105
106
107// ====================================================================
108// Sidebar Item
109// ====================================================================
110
111var cur_sidebar_item = null;
112
113SidebarItem = function(det) {
114 var me = this;
115 this.det = det;
116 this.wrapper = $a(page_body.left_sidebar, 'div', '', {marginRight:'12px'});
117
118 this.body = $a(this.wrapper, 'div');
119 this.tab = make_table(this.body, 1, 2, '100%', ['24px', null], {verticalAlign:'middle'}, {tableLayout:'fixed'});
120
121 // icon
122 var ic = $a($td(this.tab, 0, 0), 'div', 'module-icons module-icons-' + det.module_label.toLowerCase(), {marginLeft:'3px', marginBottom:'-2px'});
123
124 // pointer table
125 this.pointer = new MenuPointer($td(this.tab, 0, 1), det.module_label);
126 $y($td(this.pointer.tab, 0, 0), {fontWeight:'bold'});
127
128 // for page type
129 if(det.module_page) {
130 menu_item_map.Page[det.module_page] = this.pointer;
131 }
132
133 // items area
134 this.items_area = $a(this.wrapper, 'div');
135
136 this.body.onclick = function() { me.onclick(); }
137}
138
139// ====================================================================
140
141SidebarItem.prototype.onclick = function() {
142 var me = this;
143
144 if(this.det.module_page) {
145 // page type
146 this.pointer.select();
147
148 $item_set_working(me.pointer.label_area);
149 loadpage(this.det.module_page, function() { $item_done_working(me.pointer.label_area); });
150
151 } else {
152 // show sub items
153 this.toggle();
154 }
155}
156
157// ====================================================================
158
159SidebarItem.prototype.collapse = function() {
160 $(this.items_area).slideUp();
161 this.is_open = 0;
162 $fg(this.pointer.label_area, '#444')
163}
164
165// ====================================================================
166
167SidebarItem.prototype.toggle = function() {
168 if(this.loading) return;
169
170 if(this.is_open) {
171 this.collapse();
172 } else {
173 if(this.loaded) $(this.items_area).slideDown();
174 else this.show_items();
175 this.is_open = 1;
176 $fg(this.pointer.label_area, '#000')
177 //this.pointer.select(1);
178
179 // close existing open
180 if(cur_sidebar_item && cur_sidebar_item != this) {
181 cur_sidebar_item.collapse();
182 }
183 cur_sidebar_item = this;
184 }
185}
186
187// ====================================================================
188
189SidebarItem.prototype.show_items = function() {
190 this.loading = 1;
191 var me = this;
192
193 $item_set_working(this.pointer.label_area);
194 var callback = function(r,rt){
195 me.loaded = 1;
196 me.loading = 0;
197 var smi = null;
198 var has_reports = 0;
199 var has_tools = 0;
200
201 // widget code
202 $item_done_working(me.pointer.label_area);
203
204 if(r.message.il) {
205 me.il = r.message.il;
206
207 // forms
208 for(var i=0; i<me.il.length;i++){
209 if(me.il[i].doc_type == 'Forms') {
210 if(in_list(profile.can_read, me.il[i].doc_name)) {
211 var smi = new SidebarModuleItem(me, me.il[i]);
212
213 menu_item_map['Form'][me.il[i].doc_name] = smi.pointer;
214 menu_item_map['List'][me.il[i].doc_name] = smi.pointer;
215 }
216 }
217 if(me.il[i].doc_type=='Reports') has_reports = 1;
Rushabh Mehtaa8ad3902012-01-25 10:37:35 +0530218 if(in_list(['Single DocType', 'Pages', 'Setup Forms'], me.il[i].doc_type))
219 has_tools = 1;
Rushabh Mehta865c00a2012-01-24 14:33:21 +0530220 }
221 // reports
222 if(has_reports) {
223 var smi = new SidebarModuleItem(me, {doc_name:'Reports', doc_type:'Reports'});
224
225 // add to menu-item mapper
226 menu_item_map['Page'][me.det.module_label + ' Reports'] = smi.pointer;
227 }
228
229 // tools
230 if(has_tools) {
231 var smi = new SidebarModuleItem(me, {doc_name:'Tools', doc_type:'Tools'});
232
233 // add to menu-item mapper
234 menu_item_map['Page'][me.det.module_label + ' Tools'] = smi.pointer;
235 }
236
237 // custom reports
238 if(r.message.custom_reports.length) {
239 me.il = add_lists(r.message.il, r.message.custom_reports);
240 var smi = new SidebarModuleItem(me, {doc_name:'Custom Reports', doc_type:'Custom Reports'});
241
242 // add to menu-item mapper
243 menu_item_map['Page'][me.det.module_label + ' Custom Reports'] = smi.pointer;
244 }
245 }
246
247
248 $(me.items_area).slideDown();
249
250 // high light
251 var no = nav_obj.ol[nav_obj.ol.length-1];
252 if(no && menu_item_map[decodeURIComponent(no[0])][decodeURIComponent(no[1])])
253 pscript.select_sidebar_menu(decodeURIComponent(no[0]), decodeURIComponent(no[1]));
254
255 }
256
257 $c_obj('Home Control', 'get_module_details', me.det.name, callback);
258}
259
260// ====================================================================
261// Show Reports
262// ====================================================================
263
264SidebarItem.prototype.show_section = function(sec_type) {
265 var me = this;
266 var label = this.det.module_label + ' ' + sec_type;
267 var type_map = {'Reports':'Reports', 'Custom Reports':'Custom Reports', 'Pages':'Tools', 'Single DocType':'Tools', 'Setup Forms':'Tools'}
268
269 if(page_body.pages[label]) {
270 loadpage(label, null, 1);
271 } else {
272 // make the reports page
273 var page = page_body.add_page(label);
274 this.wrapper = $a(page,'div','layout_wrapper');
275
276
277 // head
278 this.head = new PageHeader(this.wrapper, label);
279
280 // body
281 this.body1 = $a(this.wrapper, 'div', '', {marginTop:'16px'});
282
283 // add a report link
284 var add_link = function(det) {
285 var div = $a(me.body1, 'div', '', {marginBottom:'6px'});
286 var span = $a(div, 'span', 'link_type');
287
288 // tag the span
289 span.innerHTML = det.display_name; span.det = det;
290 if(sec_type=='Reports' || sec_type=='Custom Reports') {
291 // Reports
292 // -------
293 span.onclick = function() { loadreport(this.det.doc_name, this.det.display_name); }
294
295 } else {
296 // Tools
297 // -----
298
299 if(det.doc_type=='Pages') {
300 // Page
301 if(det.click_function) {
302 span.onclick = function() { eval(this.det.click_function) }
303 span.click_function = det.click_function;
304 } else {
305 span.onclick = function() { loadpage(this.det.doc_name); }
306 }
307 } else if(det.doc_type=='Setup Forms') {
308 // Doc Browser
309 span.onclick = function() { loaddocbrowser(this.det.doc_name); }
310 } else {
311 // Single
312 span.onclick = function() { loaddoc(this.det.doc_name, this.det.doc_name); }
313 }
314 }
315 }
316
317 // item list
318 for(var i=0; i<me.il.length;i++){
319 if(type_map[me.il[i].doc_type] == sec_type) {
320 add_link(me.il[i]);
321 }
322 }
323 loadpage(label, null, 1);
324 }
325}
326
327
328// ====================================================================
329// Sidebar module item
330// ====================================================================
331
332SidebarModuleItem = function(si, det) {
333 this.det = det;
334 var me= this;
335
336 this.pointer = new MenuPointer(si.items_area, get_doctype_label(det.doc_name));
337 $y(si.items_area, {marginLeft:'32px'})
338 $y($td(this.pointer.tab, 0, 0), {fontSize:'11px'});
339
340 this.pointer.wrapper.onclick = function() {
341 if(me.det.doc_type=='Forms')
342 loaddocbrowser(det.doc_name);
343 else
344 si.show_section(me.det.doc_type);
345 }
346}
347
348
349// ====================================================================
350// Drag & Drop order selection
351// ====================================================================
352
353pscript.startup_set_module_order = function() {
354 var update_order= function(ml) {
355 mdict = {};
356 for(var i=0; i<ml.length; i++) {
357 mdict[ml[i][3][3]] = {'module_seq':ml[i][1], 'is_hidden':(ml[i][2] ? 'No' : 'Yes')}
358 }
359 $c_obj('Home Control', 'set_module_order', JSON.stringify(mdict), function(r,rt) { pscript.startup_make_sidebar(); } )
360 }
361
362 var callback = function(r, rt) {
363 var ml = [];
364 for(var i=0; i<r.message.length; i++) {
365 var det = r.message[i];
366 ml.push([det[1], det[2], (det[3]!='No' ? 0 : 1), det[0]]);
367 }
368 new ListSelector('Set Module Sequence', 'Select items and set the order you want them to appear'+
369 '<br><b>Note:</b> <i>These changes will apply to all users!</i>', ml, update_order, 1);
370 }
371 $c_obj('Home Control', 'get_module_order', '', callback)
372
373}