blob: b5356d9713a2a74bfdbc2bf88ef6039813970ee7 [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
Rushabh Mehta949496c2012-01-25 18:48:46 +0530148 $(me.pointer.label_area).set_working();
149 loadpage(this.det.module_page, function() {
150 $(me.pointer.label_area).done_working();
151 });
Rushabh Mehta865c00a2012-01-24 14:33:21 +0530152
153 } else {
154 // show sub items
155 this.toggle();
156 }
157}
158
159// ====================================================================
160
161SidebarItem.prototype.collapse = function() {
162 $(this.items_area).slideUp();
163 this.is_open = 0;
164 $fg(this.pointer.label_area, '#444')
165}
166
167// ====================================================================
168
169SidebarItem.prototype.toggle = function() {
170 if(this.loading) return;
171
172 if(this.is_open) {
173 this.collapse();
174 } else {
175 if(this.loaded) $(this.items_area).slideDown();
176 else this.show_items();
177 this.is_open = 1;
178 $fg(this.pointer.label_area, '#000')
179 //this.pointer.select(1);
180
181 // close existing open
182 if(cur_sidebar_item && cur_sidebar_item != this) {
183 cur_sidebar_item.collapse();
184 }
185 cur_sidebar_item = this;
186 }
187}
188
189// ====================================================================
190
191SidebarItem.prototype.show_items = function() {
192 this.loading = 1;
193 var me = this;
194
Rushabh Mehta949496c2012-01-25 18:48:46 +0530195 $(this.pointer.label_area).set_working();
Rushabh Mehta865c00a2012-01-24 14:33:21 +0530196 var callback = function(r,rt){
197 me.loaded = 1;
198 me.loading = 0;
199 var smi = null;
200 var has_reports = 0;
201 var has_tools = 0;
202
203 // widget code
Rushabh Mehta949496c2012-01-25 18:48:46 +0530204 $(me.pointer.label_area).done_working();
Rushabh Mehta865c00a2012-01-24 14:33:21 +0530205
206 if(r.message.il) {
207 me.il = r.message.il;
208
209 // forms
210 for(var i=0; i<me.il.length;i++){
211 if(me.il[i].doc_type == 'Forms') {
212 if(in_list(profile.can_read, me.il[i].doc_name)) {
213 var smi = new SidebarModuleItem(me, me.il[i]);
214
215 menu_item_map['Form'][me.il[i].doc_name] = smi.pointer;
216 menu_item_map['List'][me.il[i].doc_name] = smi.pointer;
217 }
218 }
219 if(me.il[i].doc_type=='Reports') has_reports = 1;
Rushabh Mehtaa8ad3902012-01-25 10:37:35 +0530220 if(in_list(['Single DocType', 'Pages', 'Setup Forms'], me.il[i].doc_type))
221 has_tools = 1;
Rushabh Mehta865c00a2012-01-24 14:33:21 +0530222 }
223 // reports
224 if(has_reports) {
225 var smi = new SidebarModuleItem(me, {doc_name:'Reports', doc_type:'Reports'});
226
227 // add to menu-item mapper
228 menu_item_map['Page'][me.det.module_label + ' Reports'] = smi.pointer;
229 }
230
231 // tools
232 if(has_tools) {
233 var smi = new SidebarModuleItem(me, {doc_name:'Tools', doc_type:'Tools'});
234
235 // add to menu-item mapper
236 menu_item_map['Page'][me.det.module_label + ' Tools'] = smi.pointer;
237 }
238
239 // custom reports
240 if(r.message.custom_reports.length) {
241 me.il = add_lists(r.message.il, r.message.custom_reports);
242 var smi = new SidebarModuleItem(me, {doc_name:'Custom Reports', doc_type:'Custom Reports'});
243
244 // add to menu-item mapper
245 menu_item_map['Page'][me.det.module_label + ' Custom Reports'] = smi.pointer;
246 }
247 }
248
249
250 $(me.items_area).slideDown();
251
252 // high light
253 var no = nav_obj.ol[nav_obj.ol.length-1];
254 if(no && menu_item_map[decodeURIComponent(no[0])][decodeURIComponent(no[1])])
255 pscript.select_sidebar_menu(decodeURIComponent(no[0]), decodeURIComponent(no[1]));
256
257 }
258
259 $c_obj('Home Control', 'get_module_details', me.det.name, callback);
260}
261
262// ====================================================================
263// Show Reports
264// ====================================================================
265
266SidebarItem.prototype.show_section = function(sec_type) {
267 var me = this;
268 var label = this.det.module_label + ' ' + sec_type;
269 var type_map = {'Reports':'Reports', 'Custom Reports':'Custom Reports', 'Pages':'Tools', 'Single DocType':'Tools', 'Setup Forms':'Tools'}
270
271 if(page_body.pages[label]) {
272 loadpage(label, null, 1);
273 } else {
274 // make the reports page
275 var page = page_body.add_page(label);
276 this.wrapper = $a(page,'div','layout_wrapper');
277
278
279 // head
280 this.head = new PageHeader(this.wrapper, label);
281
282 // body
283 this.body1 = $a(this.wrapper, 'div', '', {marginTop:'16px'});
284
285 // add a report link
286 var add_link = function(det) {
287 var div = $a(me.body1, 'div', '', {marginBottom:'6px'});
288 var span = $a(div, 'span', 'link_type');
289
290 // tag the span
291 span.innerHTML = det.display_name; span.det = det;
292 if(sec_type=='Reports' || sec_type=='Custom Reports') {
293 // Reports
294 // -------
295 span.onclick = function() { loadreport(this.det.doc_name, this.det.display_name); }
296
297 } else {
298 // Tools
299 // -----
300
301 if(det.doc_type=='Pages') {
302 // Page
303 if(det.click_function) {
304 span.onclick = function() { eval(this.det.click_function) }
305 span.click_function = det.click_function;
306 } else {
307 span.onclick = function() { loadpage(this.det.doc_name); }
308 }
309 } else if(det.doc_type=='Setup Forms') {
310 // Doc Browser
311 span.onclick = function() { loaddocbrowser(this.det.doc_name); }
312 } else {
313 // Single
314 span.onclick = function() { loaddoc(this.det.doc_name, this.det.doc_name); }
315 }
316 }
317 }
318
319 // item list
320 for(var i=0; i<me.il.length;i++){
321 if(type_map[me.il[i].doc_type] == sec_type) {
322 add_link(me.il[i]);
323 }
324 }
325 loadpage(label, null, 1);
326 }
327}
328
329
330// ====================================================================
331// Sidebar module item
332// ====================================================================
333
334SidebarModuleItem = function(si, det) {
335 this.det = det;
336 var me= this;
337
338 this.pointer = new MenuPointer(si.items_area, get_doctype_label(det.doc_name));
339 $y(si.items_area, {marginLeft:'32px'})
340 $y($td(this.pointer.tab, 0, 0), {fontSize:'11px'});
341
342 this.pointer.wrapper.onclick = function() {
343 if(me.det.doc_type=='Forms')
344 loaddocbrowser(det.doc_name);
345 else
346 si.show_section(me.det.doc_type);
347 }
348}
349
350
351// ====================================================================
352// Drag & Drop order selection
353// ====================================================================
354
355pscript.startup_set_module_order = function() {
356 var update_order= function(ml) {
357 mdict = {};
358 for(var i=0; i<ml.length; i++) {
359 mdict[ml[i][3][3]] = {'module_seq':ml[i][1], 'is_hidden':(ml[i][2] ? 'No' : 'Yes')}
360 }
361 $c_obj('Home Control', 'set_module_order', JSON.stringify(mdict), function(r,rt) { pscript.startup_make_sidebar(); } )
362 }
363
364 var callback = function(r, rt) {
365 var ml = [];
366 for(var i=0; i<r.message.length; i++) {
367 var det = r.message[i];
368 ml.push([det[1], det[2], (det[3]!='No' ? 0 : 1), det[0]]);
369 }
370 new ListSelector('Set Module Sequence', 'Select items and set the order you want them to appear'+
371 '<br><b>Note:</b> <i>These changes will apply to all users!</i>', ml, update_order, 1);
372 }
373 $c_obj('Home Control', 'get_module_order', '', callback)
374
375}