blob: 29adfcb1822f7c0a6f0fa6f878d38b2f948da382 [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;
218 if(in_list(['Single DocType', 'Pages', 'Setup Forms'], me.il[i].doc_type)) has_tools = 1;
219 }
220 // reports
221 if(has_reports) {
222 var smi = new SidebarModuleItem(me, {doc_name:'Reports', doc_type:'Reports'});
223
224 // add to menu-item mapper
225 menu_item_map['Page'][me.det.module_label + ' Reports'] = smi.pointer;
226 }
227
228 // tools
229 if(has_tools) {
230 var smi = new SidebarModuleItem(me, {doc_name:'Tools', doc_type:'Tools'});
231
232 // add to menu-item mapper
233 menu_item_map['Page'][me.det.module_label + ' Tools'] = smi.pointer;
234 }
235
236 // custom reports
237 if(r.message.custom_reports.length) {
238 me.il = add_lists(r.message.il, r.message.custom_reports);
239 var smi = new SidebarModuleItem(me, {doc_name:'Custom Reports', doc_type:'Custom Reports'});
240
241 // add to menu-item mapper
242 menu_item_map['Page'][me.det.module_label + ' Custom Reports'] = smi.pointer;
243 }
244 }
245
246
247 $(me.items_area).slideDown();
248
249 // high light
250 var no = nav_obj.ol[nav_obj.ol.length-1];
251 if(no && menu_item_map[decodeURIComponent(no[0])][decodeURIComponent(no[1])])
252 pscript.select_sidebar_menu(decodeURIComponent(no[0]), decodeURIComponent(no[1]));
253
254 }
255
256 $c_obj('Home Control', 'get_module_details', me.det.name, callback);
257}
258
259// ====================================================================
260// Show Reports
261// ====================================================================
262
263SidebarItem.prototype.show_section = function(sec_type) {
264 var me = this;
265 var label = this.det.module_label + ' ' + sec_type;
266 var type_map = {'Reports':'Reports', 'Custom Reports':'Custom Reports', 'Pages':'Tools', 'Single DocType':'Tools', 'Setup Forms':'Tools'}
267
268 if(page_body.pages[label]) {
269 loadpage(label, null, 1);
270 } else {
271 // make the reports page
272 var page = page_body.add_page(label);
273 this.wrapper = $a(page,'div','layout_wrapper');
274
275
276 // head
277 this.head = new PageHeader(this.wrapper, label);
278
279 // body
280 this.body1 = $a(this.wrapper, 'div', '', {marginTop:'16px'});
281
282 // add a report link
283 var add_link = function(det) {
284 var div = $a(me.body1, 'div', '', {marginBottom:'6px'});
285 var span = $a(div, 'span', 'link_type');
286
287 // tag the span
288 span.innerHTML = det.display_name; span.det = det;
289 if(sec_type=='Reports' || sec_type=='Custom Reports') {
290 // Reports
291 // -------
292 span.onclick = function() { loadreport(this.det.doc_name, this.det.display_name); }
293
294 } else {
295 // Tools
296 // -----
297
298 if(det.doc_type=='Pages') {
299 // Page
300 if(det.click_function) {
301 span.onclick = function() { eval(this.det.click_function) }
302 span.click_function = det.click_function;
303 } else {
304 span.onclick = function() { loadpage(this.det.doc_name); }
305 }
306 } else if(det.doc_type=='Setup Forms') {
307 // Doc Browser
308 span.onclick = function() { loaddocbrowser(this.det.doc_name); }
309 } else {
310 // Single
311 span.onclick = function() { loaddoc(this.det.doc_name, this.det.doc_name); }
312 }
313 }
314 }
315
316 // item list
317 for(var i=0; i<me.il.length;i++){
318 if(type_map[me.il[i].doc_type] == sec_type) {
319 add_link(me.il[i]);
320 }
321 }
322 loadpage(label, null, 1);
323 }
324}
325
326
327// ====================================================================
328// Sidebar module item
329// ====================================================================
330
331SidebarModuleItem = function(si, det) {
332 this.det = det;
333 var me= this;
334
335 this.pointer = new MenuPointer(si.items_area, get_doctype_label(det.doc_name));
336 $y(si.items_area, {marginLeft:'32px'})
337 $y($td(this.pointer.tab, 0, 0), {fontSize:'11px'});
338
339 this.pointer.wrapper.onclick = function() {
340 if(me.det.doc_type=='Forms')
341 loaddocbrowser(det.doc_name);
342 else
343 si.show_section(me.det.doc_type);
344 }
345}
346
347
348// ====================================================================
349// Drag & Drop order selection
350// ====================================================================
351
352pscript.startup_set_module_order = function() {
353 var update_order= function(ml) {
354 mdict = {};
355 for(var i=0; i<ml.length; i++) {
356 mdict[ml[i][3][3]] = {'module_seq':ml[i][1], 'is_hidden':(ml[i][2] ? 'No' : 'Yes')}
357 }
358 $c_obj('Home Control', 'set_module_order', JSON.stringify(mdict), function(r,rt) { pscript.startup_make_sidebar(); } )
359 }
360
361 var callback = function(r, rt) {
362 var ml = [];
363 for(var i=0; i<r.message.length; i++) {
364 var det = r.message[i];
365 ml.push([det[1], det[2], (det[3]!='No' ? 0 : 1), det[0]]);
366 }
367 new ListSelector('Set Module Sequence', 'Select items and set the order you want them to appear'+
368 '<br><b>Note:</b> <i>These changes will apply to all users!</i>', ml, update_order, 1);
369 }
370 $c_obj('Home Control', 'get_module_order', '', callback)
371
372}