1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4include_once("./Services/Tracking/classes/class.ilLPTableBaseGUI.php");
5require_once("./Services/Tracking/classes/class.ilLearningProgressGUI.php");
6
7/**
8* TableGUI class for learning progress
9*
10* @author Alex Killing <alex.killing@gmx.de>
11* @version $Id$
12*
13* @ilCtrl_Calls ilLPProgressTableGUI: ilFormPropertyDispatchGUI
14* @ingroup ServicesTracking
15*/
16class ilLPProgressTableGUI extends ilLPTableBaseGUI
17{
18    /**
19    * Constructor
20    */
21    public function __construct($a_parent_obj, $a_parent_cmd, $a_user = "", $obj_ids = null, $details = false, $mode = null, $personal_only = false, $a_parent_id = null, $a_parent_ref_id = null, $lp_context = null)
22    {
23        global $DIC;
24
25        $ilCtrl = $DIC['ilCtrl'];
26        $lng = $DIC['lng'];
27        $ilUser = $DIC['ilUser'];
28
29        $this->tracked_user = $a_user;
30        $this->obj_ids = $obj_ids;
31        $this->details = $details;
32        $this->mode = $mode;
33        $this->parent_obj_id = $a_parent_id;
34        $this->lp_context = $lp_context;
35
36        if ($a_parent_id) {
37            // #15042 - needed for export meta
38            $this->obj_id = $this->parent_obj_id;
39            $this->ref_id = $a_parent_ref_id;
40        }
41
42        $this->setId("lpprgtbl");
43
44        parent::__construct($a_parent_obj, $a_parent_cmd);
45
46        $this->setLimit(9999);
47
48        if (!$this->details) {
49            $this->has_object_subitems = true;
50
51            $user = $this->tracked_user;
52            if (!$user) {
53                $user = $ilUser;
54            }
55
56            $this->addColumn("", "", "1", true);
57            $this->addColumn($this->lng->txt("trac_title"), "title", "26%");
58            $this->addColumn($this->lng->txt("status"), "status", "7%");
59            $this->addColumn($this->lng->txt('trac_status_changed'), 'status_changed', '10%');
60            $this->addColumn($this->lng->txt("trac_percentage"), "percentage", "7%");
61            $this->addColumn($this->lng->txt("trac_mark"), "", "5%");
62            $this->addColumn($this->lng->txt("comment"), "", "10%");
63            $this->addColumn($this->lng->txt("trac_mode"), "", "20%");
64            $this->addColumn($this->lng->txt("path"), "", "20%");
65            $this->addColumn($this->lng->txt("actions"), "", "5%");
66
67            $this->setTitle(sprintf($this->lng->txt("trac_learning_progress_of"), $user->getFullName()));
68            $this->initBaseFilter();
69
70            $this->setSelectAllCheckbox("item_id");
71            $this->addMultiCommand("hideSelected", $lng->txt("trac_hide_selected"));
72
73            $this->setShowTemplates(true);
74        } else {
75            include_once './Services/Object/classes/class.ilObjectLP.php';
76            $olp = ilObjectLP::getInstance($this->parent_obj_id);
77            $collection = $olp->getCollectionInstance();
78            $this->has_object_subitems = ($collection instanceof ilLPCollectionOfRepositoryObjects);
79
80            /*
81            if(!$personal_only)
82            {
83                $this->parseTitle($a_parent_obj->details_obj_id, "trac_subitems");
84            }
85            else
86            {
87                $this->parseTitle($a_parent_obj->details_obj_id, "trac_progress");
88            }
89            */
90            $this->setTitle($this->lng->txt("details")); // #15247
91
92            $this->addColumn($this->lng->txt("trac_title"), "title", "31%");
93            $this->addColumn($this->lng->txt("status"), "status", "7%");
94
95            if ($this->mode == ilLPObjSettings::LP_MODE_SCORM) {
96                $this->lng->loadLanguageModule('content');
97                $this->addColumn($this->lng->txt('cont_score'), 'score', '10%');
98            } elseif ($this->has_object_subitems) {
99                $this->addColumn($this->lng->txt('trac_status_changed'), 'status_changed', '10%');
100                $this->addColumn($this->lng->txt("trac_percentage"), "percentage", "7%");
101                $this->addColumn($this->lng->txt("trac_mark"), "", "5%");
102                $this->addColumn($this->lng->txt("comment"), "", "10%");
103                $this->addColumn($this->lng->txt("trac_mode"), "", "20%");
104                $this->addColumn($this->lng->txt("path"), "", "20%");
105            }
106        }
107
108        $this->setEnableHeader(true);
109        $this->setFormAction($ilCtrl->getFormActionByClass(get_class($this)));
110        $this->setRowTemplate("tpl.lp_progress_list_row.html", "Services/Tracking");
111        $this->setEnableHeader(true);
112        $this->setEnableNumInfo(false);
113        $this->setEnableTitle(true);
114        $this->setDefaultOrderField("title");
115        $this->setDefaultOrderDirection("asc");
116
117        if ($this->has_object_subitems) {
118            $this->setExportFormats(array(self::EXPORT_CSV, self::EXPORT_EXCEL));
119        }
120
121        // area selector gets in the way
122        if ($this->tracked_user) {
123            $this->getItems();
124        }
125    }
126
127    public function numericOrdering($a_field)
128    {
129        return ($a_field == "percentage"); // #15041
130    }
131
132    public function getItems()
133    {
134        $obj_ids = $this->obj_ids;
135        if (!$obj_ids && !$this->details) {
136            switch ($this->lp_context) {
137                case ilLearningProgressGUI::LP_CONTEXT_ORG_UNIT:
138                    $obj_ids = $this->searchObjects($this->getCurrentFilter(true), null);
139                    break;
140
141                default:
142                    $obj_ids = $this->searchObjects($this->getCurrentFilter(true), "read");
143
144                    // check for LP relevance
145                    include_once "Services/Object/classes/class.ilObjectLP.php";
146                    foreach (ilObjectLP::getLPMemberships($this->tracked_user->getId(), $obj_ids, null, true) as $obj_id => $status) {
147                        if (!$status) {
148                            unset($obj_ids[$obj_id]);
149                        }
150                    }
151                    break;
152            }
153        }
154        if ($obj_ids) {
155            include_once("./Services/Tracking/classes/class.ilTrQuery.php");
156            switch ($this->mode) {
157                case ilLPObjSettings::LP_MODE_SCORM:
158                    $data = ilTrQuery::getSCOsStatusForUser($this->tracked_user->getId(), $this->parent_obj_id, $obj_ids);
159                    break;
160
161                case ilLPObjSettings::LP_MODE_OBJECTIVES:
162                    $data = ilTrQuery::getObjectivesStatusForUser($this->tracked_user->getId(), $this->parent_obj_id, $obj_ids);
163                    break;
164
165                case ilLPObjSettings::LP_MODE_COLLECTION_MANUAL:
166                case ilLPObjSettings::LP_MODE_COLLECTION_TLT:
167                case ilLPObjSettings::LP_MODE_COLLECTION_MOBS:
168                    $data = ilTrQuery::getSubItemsStatusForUser($this->tracked_user->getId(), $this->parent_obj_id, $obj_ids);
169                    break;
170
171                default:
172                    $data = ilTrQuery::getObjectsStatusForUser($this->tracked_user->getId(), $obj_ids);
173                    foreach ($data as $idx => $item) {
174                        if (!$item["status"] && !$this->filter["status"] && !$this->details) {
175                            unset($data[$idx]);
176                        } else {
177                            $data[$idx]["offline"] = ilLearningProgressBaseGUI::isObjectOffline($item["obj_id"], $item["type"]);
178                        }
179                    }
180                    break;
181            }
182
183            // #15334
184            foreach ($data as $idx => $row) {
185                if (!$this->isPercentageAvailable($row["obj_id"])) {
186                    // #17000 - enable proper (numeric) sorting
187                    $data[$idx]["percentage"] = -1;
188                }
189            }
190
191            $this->setData($data);
192        }
193    }
194
195    /**
196    * Fill table row
197    */
198    protected function fillRow($a_set)
199    {
200        global $DIC;
201
202        $ilCtrl = $DIC['ilCtrl'];
203
204        if (!$this->details) {
205            $this->tpl->setCurrentBlock("column_checkbox");
206            $this->tpl->setVariable("OBJ_ID", $a_set["obj_id"]);
207            $this->tpl->parseCurrentBlock();
208        }
209
210        $this->tpl->setVariable("ICON_SRC", ilObject::_getIcon("", "tiny", $a_set["type"]));
211        $this->tpl->setVariable("ICON_ALT", $this->lng->txt($a_set["type"]));
212        $this->tpl->setVariable("TITLE_TEXT", $a_set["title"]);
213
214        if ($a_set["offline"]) {
215            $this->tpl->setCurrentBlock("offline");
216            $this->tpl->setVariable("TEXT_STATUS", $this->lng->txt("status"));
217            $this->tpl->setVariable("TEXT_OFFLINE", $this->lng->txt("offline"));
218            $this->tpl->parseCurrentBlock();
219        }
220
221        $this->tpl->setVariable("STATUS_ALT", ilLearningProgressBaseGUI::_getStatusText($a_set["status"]));
222        $this->tpl->setVariable("STATUS_IMG", ilLearningProgressBaseGUI::_getImagePathForStatus($a_set["status"]));
223
224        if ($this->mode == ilLPObjSettings::LP_MODE_SCORM) {
225            $this->tpl->setVariable('SCORE_VAL', $a_set["score"]);
226        } elseif ($this->has_object_subitems) {
227            $this->tpl->setCurrentBlock("status_details");
228
229            $this->tpl->setVariable('STATUS_CHANGED_VAL', ilDatePresentation::formatDate(new ilDateTime($a_set['status_changed'], IL_CAL_DATETIME)));
230
231            $olp = ilObjectLP::getInstance($a_set["obj_id"]);
232            $this->tpl->setVariable("MODE_TEXT", $olp->getModeText($a_set["u_mode"]));
233            $this->tpl->setVariable("MARK_VALUE", $a_set["mark"]);
234            $this->tpl->setVariable("COMMENT_TEXT", $a_set["comment"]);
235
236            if ($a_set["percentage"] < 0) {
237                $this->tpl->setVariable("PERCENTAGE_VALUE", "");
238            } else {
239                $this->tpl->setVariable("PERCENTAGE_VALUE", sprintf("%d%%", $a_set["percentage"]));
240            }
241
242            // path
243            $path = $this->buildPath($a_set["ref_ids"]);
244            if ($path) {
245                $this->tpl->setCurrentBlock("item_path");
246                foreach ($path as $path_item) {
247                    $this->tpl->setVariable("PATH_ITEM", $path_item);
248                    $this->tpl->parseCurrentBlock();
249                }
250            }
251
252            $this->tpl->parseCurrentBlock();
253        }
254
255        // not for objectives/scos
256        if (!$this->mode) {
257            // tlt warning
258            if ($a_set["status"] != ilLPStatus::LP_STATUS_COMPLETED_NUM && $a_set["ref_ids"]) {
259                $ref_id = $a_set["ref_ids"];
260                $ref_id = array_shift($ref_id);
261                $timing = $this->showTimingsWarning($ref_id, $this->tracked_user->getId());
262                if ($timing) {
263                    if ($timing !== true) {
264                        $timing = ": " . ilDatePresentation::formatDate(new ilDate($timing, IL_CAL_UNIX));
265                    } else {
266                        $timing = "";
267                    }
268                    $this->tpl->setCurrentBlock('warning_img');
269                    $this->tpl->setVariable('WARNING_IMG', ilUtil::getImagePath('time_warn.svg'));
270                    $this->tpl->setVariable('WARNING_ALT', $this->lng->txt('trac_time_passed') . $timing);
271                    $this->tpl->parseCurrentBlock();
272                }
273            }
274
275            // hide / unhide?!
276            if (!$this->details) {
277                $this->tpl->setCurrentBlock("item_command");
278                $ilCtrl->setParameterByClass(get_class($this), 'hide', $a_set["obj_id"]);
279                $this->tpl->setVariable("HREF_COMMAND", $ilCtrl->getLinkTargetByClass(get_class($this), 'hide'));
280                $this->tpl->setVariable("TXT_COMMAND", $this->lng->txt('trac_hide'));
281                $this->tpl->parseCurrentBlock();
282
283                $olp = ilObjectLP::getInstance($a_set["obj_id"]);
284                if ($olp->getCollectionInstance() && $a_set["ref_ids"]) {
285                    $ref_id = $a_set["ref_ids"];
286                    $ref_id = array_shift($ref_id);
287                    $ilCtrl->setParameterByClass($ilCtrl->getCmdClass(), 'details_id', $ref_id);
288                    $this->tpl->setVariable("HREF_COMMAND", $ilCtrl->getLinkTargetByClass($ilCtrl->getCmdClass(), 'details'));
289                    $ilCtrl->setParameterByClass($ilCtrl->getCmdClass(), 'details_id', '');
290                    $this->tpl->setVariable("TXT_COMMAND", $this->lng->txt('trac_subitems'));
291                    $this->tpl->parseCurrentBlock();
292                }
293
294                $this->tpl->setCurrentBlock("column_action");
295                $this->tpl->parseCurrentBlock();
296            }
297        }
298    }
299
300    protected function fillHeaderExcel(ilExcel $a_excel, &$a_row)
301    {
302        $a_excel->setCell($a_row, 0, $this->lng->txt("type"));
303        $a_excel->setCell($a_row, 1, $this->lng->txt("trac_title"));
304        $a_excel->setCell($a_row, 2, $this->lng->txt("status"));
305        $a_excel->setCell($a_row, 3, $this->lng->txt("trac_status_changed"));
306        $a_excel->setCell($a_row, 4, $this->lng->txt("trac_percentage"));
307        $a_excel->setCell($a_row, 5, $this->lng->txt("trac_mark"));
308        $a_excel->setCell($a_row, 6, $this->lng->txt("comment"));
309        $a_excel->setCell($a_row, 7, $this->lng->txt("trac_mode"));
310        // $a_excel->setCell($a_row, 7, $this->lng->txt("path"));
311
312        $a_excel->setBold("A" . $a_row . ":H" . $a_row);
313    }
314
315    protected function fillRowExcel(ilExcel $a_excel, &$a_row, $a_set)
316    {
317        $a_excel->setCell($a_row, 0, $this->lng->txt($a_set["type"]));
318        $a_excel->setCell($a_row, 1, $a_set["title"]);
319        $a_excel->setCell($a_row, 2, ilLearningProgressBaseGUI::_getStatusText($a_set["status"]));
320
321        $a_excel->setCell($a_row, 3, new ilDateTime($a_set['status_changed'], IL_CAL_DATETIME));
322
323        if (!$this->isPercentageAvailable($a_row['obj_id'])) {
324            $a_excel->setCell($a_row, 4, '-');
325        } else {
326            $a_excel->setCell($a_row, 4, $a_set["percentage"] . "%");
327        }
328        $a_excel->setCell($a_row, 5, $a_set["mark"]);
329        $a_excel->setCell($a_row, 6, $a_set["comment"]);
330        $a_excel->setCell($a_row, 7, ilLPObjSettings::_mode2Text($a_set["u_mode"]));
331    }
332
333    protected function fillHeaderCSV($a_csv)
334    {
335        $a_csv->addColumn($this->lng->txt("type"));
336        $a_csv->addColumn($this->lng->txt("trac_title"));
337        $a_csv->addColumn($this->lng->txt("status"));
338        $a_csv->addColumn($this->lng->txt("trac_status_changed"));
339        $a_csv->addColumn($this->lng->txt("trac_percentage"));
340        $a_csv->addColumn($this->lng->txt("trac_mark"));
341        $a_csv->addColumn($this->lng->txt("comment"));
342        $a_csv->addColumn($this->lng->txt("trac_mode"));
343        // $a_csv->addColumn($this->lng->txt("path"));
344        $a_csv->addRow();
345    }
346
347    protected function fillRowCSV($a_csv, $a_set)
348    {
349        $a_csv->addColumn($this->lng->txt($a_set["type"]));
350        $a_csv->addColumn($a_set["title"]);
351        $a_csv->addColumn(ilLearningProgressBaseGUI::_getStatusText($a_set["status"]));
352
353        ilDatePresentation::setUseRelativeDates(false);
354        $a_csv->addColumn(ilDatePresentation::formatDate(new ilDateTime($a_set['status_changed'], IL_CAL_DATETIME)));
355        ilDatePresentation::resetToDefaults();
356
357        if (!$this->isPercentageAvailable($a_set['obj_id'])) {
358            $a_csv->addColumn('-');
359        } else {
360            $a_csv->addColumn(sprintf("%d%%", $a_set["percentage"]));
361        }
362        $a_csv->addColumn($a_set["mark"]);
363        $a_csv->addColumn($a_set["comment"]);
364        $a_csv->addColumn(ilLPObjSettings::_mode2Text($a_set["u_mode"]));
365
366        $a_csv->addRow();
367    }
368}
369