source: contrib/resources/inc/class.ui_resources.inc.php @ 3524

Revision 3524, 17.8 KB checked in by afernandes, 13 years ago (diff)

Ticket #1416 - Disponibilizado módulo de recursos para a comunidade

  • Property svn:executable set to *
Line 
1<?php
2/**
3 * eGroupWare - resources
4 *
5 * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
6 * @package resources
7 * @link http://www.egroupware.org
8 * @author Cornelius Weiss <phpgw@von-und-zu-weiss.de>
9 * @author Lukas Weiss <wnz_gh05t@users.sourceforge.net>
10 * @version $Id: class.ui_resources.inc.php 23852 2007-05-09 16:29:32Z lkneschke $
11 */
12
13/**
14 * General userinterface object for resources
15 *
16 * @package resources
17 */
18class ui_resources
19{
20        var $public_functions = array(
21                'index'         => True,
22                'edit'          => True,
23                'show'          => True,
24                'select'        => True,
25                'admin'         => True,
26                'writeLangFile' => True
27                );
28
29        /**
30         * constructor of class ui_resources
31         *
32         */
33        function ui_resources()
34        {
35//              print_r($GLOBALS['phpgw_info']); die();
36                $this->tmpl     =& CreateObject('etemplate.etemplate','resources.show');
37                $this->bo       =& CreateObject('resources.bo_resources');
38                $this->html     =& $GLOBALS['phpgw']->html;
39//              $this->calui    = CreateObject('resources.ui_calviews');
40               
41                if(!@is_object($GLOBALS['phpgw']->js))
42                {
43                        $GLOBALS['phpgw']->js =& CreateObject('phpgwapi.javascript');
44                }
45        }
46
47        /**
48         * main resources list.
49         *
50         * Cornelius Weiss <phpgw@von-und-zu-weiss.de>
51         * @param array $content content from eTemplate callback
52         *
53         * FIXME don't translate cats in nextmach
54         */
55        function index($content='')
56        {
57                if (is_array($content))
58                {
59                        $sessiondata = $content['nm'];
60                        unset($sessiondata['rows']);
61                        $GLOBALS['phpgw']->session->appsession('session_data','resources_index_nm',$sessiondata);
62                       
63                        if (isset($content['back']))
64                        {
65                                unset($sessiondata['view_accs_of']);
66                                $GLOBALS['phpgw']->session->appsession('session_data','resources_index_nm',$sessiondata);
67                                return $this->index();
68                        }
69                        if (isset($content['btn_delete_selected']))
70                        {
71                                foreach($content['nm']['rows'] as $row)
72                                {
73                                        if($res_id = $row['checkbox'][0])
74                                        {
75                                                $msg .= '<p>'. $this->bo->delete($res_id). '</p><br>';
76                                        }
77                                }
78                                return $this->index($msg);
79                        }
80                       
81                        foreach($content['nm']['rows'] as $row)
82                        {
83                                if(isset($row['delete']))
84                                {
85                                        $res_id = array_search('pressed',$row['delete']);
86                                        return $this->index($this->bo->delete($res_id));
87                                }
88                                if(isset($row['view_acc']))
89                                {
90                                        $sessiondata['view_accs_of'] = array_search('pressed',$row['view_acc']);
91                                        $GLOBALS['phpgw']->session->appsession('session_data','resources_index_nm',$sessiondata);
92                                        return $this->index();
93                                }
94                        }
95                }
96                $msg = $content;
97                $content = array();
98                $content['msg'] = $msg;
99               
100                $content['nm']['header_left']   = 'resources.resource_select.header';
101                $content['nm']['get_rows']      = 'resources.bo_resources.get_rows';
102                $content['nm']['no_filter']     = False;
103                $content['nm']['filter_label']  = lang('Category');
104                $content['nm']['filter_help']   = lang('Select a category'); // is this used???
105                $content['nm']['no_filter2']    = true;
106                $content['nm']['filter_no_lang'] = true;
107                $content['nm']['no_cat']        = true;
108                $content['nm']['bottom_too']    = true;
109                $content['nm']['order']         = 'name';
110                $content['nm']['sort']          = 'ASC';
111               
112                $nm_session_data = $GLOBALS['phpgw']->session->appsession('session_data','resources_index_nm');
113                if($nm_session_data)
114                {
115                        $content['nm'] = $nm_session_data;
116                }
117                $content['nm']['options-filter']= array(''=>lang('all categories'))+(array)$this->bo->acl->get_cats(phpgw_ACL_READ);
118               
119                // check if user is permitted to add resources
120                if(!$this->bo->acl->get_cats(phpgw_ACL_ADD))
121                {
122                        $no_button['add'] = true;
123                }
124                $no_button['back'] = true;
125                $no_button['add_sub'] = true;
126                $GLOBALS['phpgw_info']['flags']['app_header'] = lang('resources');
127               
128                $GLOBALS['phpgw_info']['flags']['java_script'] .= "<script LANGUAGE=\"JavaScript\">
129                        function js_btn_book_selected(form)
130                        {
131                                resources = '';
132                               
133                                el = form.getElementsByTagName(\"input\");
134                                for (var i = 0; i < el.length; i++)
135                                {
136                                        if(el[i].name.substr(el[i].name.length-12,el[i].name.length) == '[checkbox][]' && el[i].checked)
137                                        {
138                                                if(resources.length > 0)
139                                                {
140                                                        resources += ',';
141                                                }
142                                                resources += 'r' + el[i].value;
143                                        }
144                                }
145                                if(resources.length == 0)
146                                {
147                                        alert('". lang('No resources selected'). "');
148                                        return false;
149                                }
150                                return resources;
151                        }
152                </script>";
153
154                if($content['nm']['view_accs_of'])
155                {
156                        $master = $this->bo->so->read(array('res_id' => $content['nm']['view_accs_of']));
157                        $content['view_accs_of'] = $content['nm']['view_accs_of'];
158                        $content['nm']['get_rows']      = 'resources.bo_resources.get_rows';
159                        $content['nm']['no_filter']     = true;
160                        $content['nm']['no_filter2']    = true;
161                        $no_button['back'] = false;
162                        $no_button['add'] = true;
163                        $no_button['add_sub'] = false;
164                        $GLOBALS['phpgw_info']['flags']['app_header'] = lang('resources') . ' - ' . lang('accessories of '). ' '. $master['name'] .
165                                ($master['short_description'] ? ' [' . $master['short_description'] . ']' : '');
166                }
167                $preserv = $content;
168                $GLOBALS['phpgw']->session->appsession('session_data','resources_index_nm',$content['nm']);
169                $this->tmpl->read('resources.show');
170                return $this->tmpl->exec('resources.ui_resources.index',$content,$sel_options,$no_button,$preserv);
171        }
172
173        /**
174         * @author Cornelius Weiss <phpgw@von-und-zu-weiss.de>
175         * invokes add or edit dialog for resources
176         *
177         * @param $content   Content from the eTemplate Exec call or id on inital call
178         */
179        function edit($content=0,$accessory_of = -1)
180        {       
181                if (is_array($content))
182                {
183                        if(isset($content['save']) || isset($content['delete']))
184                        {
185                                if(isset($content['save']))
186                                {
187                                        unset($content['save']);
188//                                      if($content['id'] != 0)
189//                                      {
190//                                              // links are already saved by eTemplate
191//                                              unset($resource['link_to']['to_id']);
192//                                      }
193                                        $content['msg'] = $this->bo->save($content);
194                                }
195                                if(isset($content['delete']))
196                                {
197                                        unset($content['delete']);
198                                        $content['msg'] = $this->bo->delete($content['res_id']);
199                                }
200                               
201                                if($content['msg'])
202                                {
203                                        return $this->edit($content);
204                                }
205                                $js = "opener.location.href='".$GLOBALS['phpgw']->link('/index.php',
206                                        array('menuaction' => 'resources.ui_resources.index'))."';";
207                                $js .= 'window.close();';
208                                echo "<html><body><script>$js</script></body></html>\n";
209                                $GLOBALS['phpgw']->common->phpgw_exit();
210                        }
211                }
212                else
213                {
214                        $res_id = $content;
215                        if (isset($_GET['res_id'])) $res_id = $_GET['res_id'];
216                        if (isset($_GET['accessory_of'])) $accessory_of = $_GET['accessory_of'];
217                        $content = array('res_id' => $res_id);
218                       
219                        if ($res_id > 0)
220                        {
221                                $content = $this->bo->read($res_id);
222                                $content['gen_src_list'] = strpos($content['picture_src'],'.') !== false ? $content['picture_src'] : false;
223                                $content['picture_src'] = strpos($content['picture_src'],'.') !== false ? 'gen_src' : $content['picture_src'];
224                                $content['link_to'] = array(
225                                        'to_id' => $res_id,
226                                        'to_app' => 'resources'
227                                );
228                        }
229                       
230                }
231                // some presetes
232                $content['resource_picture'] = $this->bo->get_picture($content['res_id'],$content['picture_src'],$size=true);
233                $content['quantity'] = $content['quantity'] ? $content['quantity'] : 1;
234                $content['useable'] = $content['useable'] ? $content['useable'] : 1;
235                $content['accessory_of'] = $content['accessory_of'] ? $content['accessory_of'] : $accessory_of;
236               
237                $sel_options['gen_src_list'] = $this->bo->get_genpicturelist();
238                $sel_options['cat_id'] =  $this->bo->acl->get_cats(phpgw_ACL_ADD);
239                $sel_options['cat_id'] = count($sel_options['cat_id']) == 1 ? $sel_options['cat_id'] :
240                        $content['cat_id'] ? $sel_options['cat_id'] : array('' => lang('select one')) + $sel_options['cat_id'];
241                if($accessory_of > 0 || $content['accessory_of'] > 0)
242                {
243                        $content['accessory_of'] = $content['accessory_of'] ? $content['accessory_of'] : $accessory_of;
244                        $catofmaster = $this->bo->so->get_value('cat_id',$content['accessory_of']);
245                        $sel_options['cat_id'] = array($catofmaster => $sel_options['cat_id'][$catofmaster]);
246                }
247               
248//              $content['general|page|pictures|links'] = 'resources.edit_tabs.page';  //debug
249                $no_button = array(); // TODO: show delete button only if allowed to delete resource
250                $preserv = $content;
251                $this->tmpl->read('resources.edit');
252                return $this->tmpl->exec('resources.ui_resources.edit',$content,$sel_options,$no_button,$preserv,2);
253               
254        }
255       
256        /**
257         * adminsection of resources
258         *
259         * @author Cornelius Weiss <phpgw@von-und-zu-weiss.de>
260         */
261        function admin($content='')
262        {
263                if(is_array($content))
264                {
265                        if(isset($content['save']))
266                        {
267                                $this->bo->conf->read_repository();
268                                $this->bo->conf->save_value('dont_use_vfs',$content['dont_use_vfs']);
269                        }
270                        else
271                        {
272                                return $GLOBALS['phpgw']->redirect_link('/admin/index.php');
273                        }
274                }
275                $content = $this->bo->conf->read_repository();
276                $this->tmpl->read('resources.admin');
277                $this->tmpl->exec('resources.ui_resources.admin',$content,$sel_options,$no_button,$preserv);
278        }
279
280        /**
281         * showes a single resource
282         *
283         * @param int $res_id resource id
284         * @author Lukas Weiss <wnz.gh05t@users.sourceforge.net>
285         */
286        function show($res_id=0)
287        {
288                if (is_array($content = $res_id))
289                {
290                        if(isset($content['btn_delete']))
291                        {
292                                $content['msg'] = $this->bo->delete($content['res_id']);
293                                if($content['msg'])
294                                {
295                                        return $this->show($content);
296                                }
297                                $js = "opener.location.href='".$GLOBALS['phpgw']->link('/index.php',
298                                        array('menuaction' => 'resources.ui_resources.index'))."';";
299                                $js .= 'window.close();';
300                                echo "<html><body><script>$js</script></body></html>\n";
301                                $GLOBALS['phpgw']->common->phpgw_exit();
302                        }
303                        if(isset($content['btn_edit']))
304                        {
305                                return $this->edit($content['res_id']);
306                        }
307                       
308                }
309                if (isset($_GET['res_id'])) $res_id = $_GET['res_id'];
310
311                $content = array('res_id' => $res_id);
312                $content = $this->bo->read($res_id);
313                $content['gen_src_list'] = strpos($content['picture_src'],'.') !== false ? $content['picture_src'] : false;
314                $content['picture_src'] = strpos($content['picture_src'],'.') !== false ? 'gen_src' : $content['picture_src'];
315                $content['link_to'] = array(
316                                'to_id' => $res_id,
317                                'to_app' => 'resources'
318                );
319       
320                $content['resource_picture'] = $this->bo->get_picture($content['res_id'],$content['picture_src'],$size=true);
321                $content['quantity'] = $content['quantity'] ? $content['quantity'] : 1;
322                $content['useable'] = $content['useable'] ? $content['useable'] : 1;
323               
324                $content['quantity'] = ($content['useable'] == $content['quantity']) ? $content['quantity'] : $content['quantity'].' ('.lang('useable').' '.$content['useable'].')';
325               
326                //$sel_options['gen_src_list'] = $this->bo->get_genpicturelist();
327                               
328                $content['cat_name'] =  $this->bo->acl->get_cat_name($content['cat_id']);
329                $content['cat_admin'] = $this->bo->acl->get_cat_admin($content['cat_id']);
330               
331/*              if($content['accessory_of'] > 0)
332                {
333                        $catofmaster = $this->bo->so->get_value('cat_id',$content['accessory_of']);
334                        $sel_options['cat_id'] = array($catofmaster => $sel_options['cat_id'][$catofmaster]);
335                }
336*/
337                $content['description'] = chop($content['long_description']) ? $content['long_description'] : (chop($content['short_description']) ? $content['short_description'] : lang("no description available"));
338                $content['description'] = $content['description'] ? $content['description'] : lang('no description available');
339                $content['link_to'] = array(
340                                        'to_id' => $res_id,
341                                        'to_app' => 'resources'
342                                );
343                $sel_options = array();
344                $no_button = array(
345                        'btn_buy' => !$content['buyable'],
346                        'btn_book' => !$content['bookable'],
347                        'btn_calendar' => !$content['bookable'],
348                        'btn_edit' => !$this->bo->acl->is_permitted($content['cat_id'],phpgw_ACL_EDIT),
349                        'btn_delete' => !$this->bo->acl->is_permitted($content['cat_id'],phpgw_ACL_DELETE)
350                        );
351                $preserv = $content;
352                $this->tmpl->read('resources.showdetails');
353                return $this->tmpl->exec('resources.ui_resources.show',$content,$sel_options,$no_button,$preserv,2);
354               
355        }
356       
357        /**
358         * select resources
359         *
360         * @author Lukas Weiss <wnz.gh05t@users.sourceforge.net>
361         */
362        function select($content='')
363        {
364                if (!is_object($GLOBALS['phpgw']->js))
365                {
366                        $GLOBALS['phpgw']->js = CreateObject('phpgwapi.javascript');
367                }
368                $GLOBALS['phpgw']->js->set_onload("copyOptions('exec[resources][selectbox]');");
369               
370                $GLOBALS['phpgw_info']['flags']['java_script'] .= "<script LANGUAGE=\"JavaScript\">
371                        window.focus();
372                       
373                        openerid='resources_selectbox';
374                        id='exec[nm][rows][selectbox]';
375               
376                        function addOption(label,value,button_id,useable)
377                        {
378                                quantity = document.getElementById(button_id+'[default_qty]').value;
379                                value = value+':'+quantity;
380                                if(quantity>useable) {
381                                        alert('".lang('You chose more resources than available')."');
382                                        return false;
383                                }
384                                label = label+'['+quantity+'/'+useable+']';
385                                openerSelectBox = opener.document.getElementById(openerid);
386                                if (openerSelectBox) {
387                                        select = '';
388                                        for(i=0; i < openerSelectBox.length; i++) {
389                                                with (openerSelectBox.options[i]) {
390                                                        if (selected || openerSelectBox.selectedIndex == i) {
391                                                                select += (value.slice(0,1)==',' ? '' : ',')+value;
392                                                        }
393                                                }
394                                        }
395                                        select += (select ? ',' : '')+value;
396                                        opener.selectbox_add_option(openerid,label,value,0);
397                                }
398                                selectBox = document.getElementById(id);
399                                if (selectBox) {
400                                        var resource_value = value.split(':');
401                                        for (i=0; i < selectBox.length; i++) {
402                                                var selectvalue = selectBox.options[i].value.split(':');
403                                                if (selectvalue[0] == resource_value[0]) {
404                                                        selectBox.options[i] = null;
405                                                        selectBox.options[selectBox.length] = new Option(label,value,false,true);       
406                                                        break;
407                                                }
408                                        }
409                                        if (i >= selectBox.length) {
410                                                selectBox.options[selectBox.length] = new Option(label,value,false,true);
411                                        }
412                                }
413                        }
414               
415                        function removeSelectedOptions()
416                        {
417                                openerSelectBox = opener.document.getElementById(openerid);
418                                if (openerSelectBox == null) window.close();
419                                selectBox = document.getElementById(id);
420                                for (i=0; i < selectBox.length; i++) {
421                                        if (selectBox.options[i].selected) {
422                                                for (j=0; j < openerSelectBox.length; j++) {
423                                                        if (openerSelectBox[j].value == selectBox.options[i].value) {
424                                                                openerSelectBox.removeChild(openerSelectBox[j]);
425                                                        }
426                                                }
427                                                selectBox.options[i--] = null;
428                                        }
429                                }
430                        }
431               
432                        function copyOptions()
433                        {
434                                openerSelectBox = opener.document.getElementById(openerid);
435                                selectBox = document.getElementById(id);
436                                for (i=0; i < openerSelectBox.length; i++) {
437                                        with (openerSelectBox.options[i]) {
438                                                if (selected && value.slice(0,1) != ',') {
439                                                        selectBox.options[selectBox.length] =  new Option(text,value);
440                                                }
441                                        }
442                                }
443                        }
444                       
445                        function oneLineSubmit()
446                        {
447                        /*
448                                openerSelectBox = opener.document.getElementById(openerid);
449               
450                                if (openerSelectBox) {
451                                        if (openerSelectBox.selectedIndex >= 0) {
452                                                selected = openerSelectBox.options[openerSelectBox.selectedIndex].value;
453                                                if (selected.slice(0,1) == ',') selected = selected.slice(1);
454                                                opener.selectbox_add_option(openerid,'multiple*',selected,1);
455                                        }
456                                        else {
457                                                for (i=0; i < openerSelectBox.length; i++) {
458                                                        with (openerSelectBox.options[i]) {
459                                                                if (selected) {
460                                                                        opener.selectbox_add_option(openerid,text,value,1);
461                                                                        break;
462                                                                }
463                                                        }
464                                                }       
465                                        }
466                                }
467                        */
468                                window.close();
469                        }</script>";
470               
471                $content['nm']['header_left'] = 'resources.resource_select.header';
472                $content['nm']['show_bookable'] = true;
473                $content['nm']['get_rows']      = 'resources.bo_resources.get_rows';
474                $content['nm']['no_filter']     = False;
475                $content['nm']['filter_label']  = 'Category';
476                $content['nm']['filter_help']   = lang('Select a category'); // is this used???
477                $content['nm']['options-filter']= array(''=>lang('all categories'))+(array)$this->bo->acl->get_cats(phpgw_ACL_READ);
478                $content['nm']['no_filter2']    = true;
479                $content['nm']['filter_no_lang'] = true;
480                $content['nm']['no_cat']        = true;
481                $content['nm']['rows']['js_id'] = 1;
482
483                $sel_options = array();
484                $no_button = array();
485                $this->tmpl->read('resources.resource_select');
486                return $this->tmpl->exec('resources.ui_resources.select',$content,$sel_options,$no_button,$preserv,2);
487        }
488       
489        /**
490         * get_calendar_sidebox
491         * get data fÃŒr calendar sidebox
492         *
493         * @author Lukas Weiss <wnz_gh05t@users.sourceforge.net>
494         * @param array $param with keys menuaction, owner and optional date
495         * @return array with: label=>link or array with text
496         */
497        function get_calendar_sidebox($param)
498        {
499                $cats = $this->bo->acl->get_cats(phpgw_ACL_READ);
500                if (!$cats) return array();
501               
502                $owners = explode(',',$param['owner']);
503                unset($param['owner']);
504                $res_cats = $selected = array();
505
506                // this gets the resource-ids of the cats and implodes them to the array-key of the selectbox,
507                // so it is possible to select all resources of a category
508                foreach($cats as $cat_id => $cat_name)
509                {
510                        if ($resources = $this->bo->so->search(array('cat_id' => $cat_id, 'bookable' => '1'),'res_id'))
511                        {
512                                $keys = array();
513                                foreach($resources as $res)
514                                {
515                                        $keys[] = 'r'.$res['res_id'];
516                                }
517                                $res_cats[implode(',',$keys)] = $cat_name;
518                               
519                                if (count(array_intersect($keys,$owners)) == count($keys))
520                                {
521                                        $selected[] = implode(',',$keys);
522                                        $owners = array_diff($owners,$keys);
523                                }
524                        }
525                }
526                // add already selected single resources to the selectbox, eg. call of the resource-calendar from the resources app
527                $resources = array('r0' => lang('none'));
528                $res_ids = array();
529                foreach($owners as $key => $owner)
530                {
531                        if ($owner{0} == 'r')
532                        {
533                                $res_ids[] = (int) substr($owner,1);
534                                $selected[] = $owner;
535                        }
536                }
537                if (count($res_ids))
538                {
539                        foreach($this->bo->so->search(array('res_id' => $res_ids),'res_id,name') as $data)
540                        {
541                                $resources['r'.$data['res_id']] = $data['name'];
542                        }
543                }               
544                $selectbox = $this->html->select(
545                        'owner',
546                        $selected,
547                        array_merge($resources,$res_cats),
548                        $no_lang=true,
549                        $options='style="width: 165px;" onchange="load_cal(\''.
550                                $GLOBALS['phpgw']->link('/index.php',$param).'\',\'uical_select_resource\');" id="uical_select_resource"',
551                        $multiple=count($selected) ? 4 : 0
552                );
553                return array(
554                        array(
555                                'text' => $selectbox,
556                                'no_lang' => True,
557                                'link' => False
558                        )
559                );
560        }
561}
562
Note: See TracBrowser for help on using the repository browser.