MDL-64506 templates: Move BS2 labels to BS4 badges
[moodle.git] / admin / tool / policy / classes / output / page_managedocs_list.php
CommitLineData
3d9571d5
DM
1<?php
2// This file is part of Moodle - http://moodle.org/
3//
4// Moodle is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// Moodle is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
16
17/**
18 * Provides {@link tool_policy\output\page_managedocs_list} class.
19 *
20 * @package tool_policy
21 * @category output
22 * @copyright 2018 David Mudrák <david@moodle.com>
23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24 */
25
26namespace tool_policy\output;
27
28use html_writer;
29use tool_policy\api;
30
31defined('MOODLE_INTERNAL') || die();
32
33use action_menu;
34use action_menu_link;
35use moodle_url;
36use pix_icon;
37use renderable;
38use renderer_base;
39use single_button;
40use templatable;
41use tool_policy\policy_version;
42
43/**
44 * Represents a management page with the list of policy documents.
45 *
46 * The page displays all policy documents in their sort order, together with draft future versions.
47 *
48 * @copyright 2018 David Mudrak <david@moodle.com>
49 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
50 */
51class page_managedocs_list implements renderable, templatable {
52
53 /** @var int */
54 protected $policyid = null;
55 /** @var moodle_url */
56 protected $returnurl = null;
57
58 /**
59 * page_managedocs_list constructor.
60 * @param int $policyid when specified only archived versions of this policy will be displayed.
61 */
62 public function __construct($policyid = null) {
63 $this->policyid = $policyid;
64 $this->returnurl = new moodle_url('/admin/tool/policy/managedocs.php');
65 if ($this->policyid) {
66 $this->returnurl->param('archived', $this->policyid);
67 }
68 }
69
70 /**
71 * Export the page data for the mustache template.
72 *
73 * @param renderer_base $output renderer to be used to render the page elements.
74 * @return stdClass
75 */
76 public function export_for_template(renderer_base $output) {
77
78 $data = (object) [];
79 $data->pluginbaseurl = (new moodle_url('/admin/tool/policy'))->out(false);
80 $data->canmanage = has_capability('tool/policy:managedocs', \context_system::instance());
81 $data->canaddnew = $data->canmanage && !$this->policyid;
82 $data->canviewacceptances = has_capability('tool/policy:viewacceptances', \context_system::instance());
83 $data->title = get_string('policiesagreements', 'tool_policy');
84 $data->policies = [];
85
86 if ($this->policyid) {
87 // We are only interested in the archived versions of the given policy.
88 $data->backurl = (new moodle_url('/admin/tool/policy/managedocs.php'))->out(false);
89 $policy = api::list_policies([$this->policyid], true)[0];
90 if ($firstversion = $policy->currentversion ?: (reset($policy->draftversions) ?: reset($policy->archivedversions))) {
91 $data->title = get_string('previousversions', 'tool_policy', format_string($firstversion->name));
92 }
93
94 foreach ($policy->archivedversions as $i => $version) {
95 $data->versions[] = $this->export_version_for_template($output, $policy, $version,
cc3790d0 96 false, false, false);
3d9571d5
DM
97 }
98 return $data;
99 }
100
101 // List all policies. Display current and all draft versions of each policy in this list.
102 // If none found, then show only one archived version.
103 $policies = api::list_policies(null, true);
104 foreach ($policies as $i => $policy) {
105
106 if (empty($policy->currentversion) && empty($policy->draftversions)) {
107 // There is no current and no draft versions, display the first archived version.
108 $firstpolicy = array_shift($policy->archivedversions);
109 $data->versions[] = $this->export_version_for_template($output, $policy, $firstpolicy,
cc3790d0 110 false, $i > 0, $i < count($policies) - 1);
3d9571d5
DM
111 }
112
113 if (!empty($policy->currentversion)) {
114
115 // Current version of the policy.
116 $data->versions[] = $this->export_version_for_template($output, $policy, $policy->currentversion,
cc3790d0 117 false, $i > 0, $i < count($policies) - 1);
3d9571d5
DM
118
119 } else if ($policy->draftversions) {
120
121 // There is no current version, display the first draft version as the current.
122 $firstpolicy = array_shift($policy->draftversions);
123 $data->versions[] = $this->export_version_for_template($output, $policy, $firstpolicy,
cc3790d0 124 false, $i > 0, $i < count($policies) - 1);
3d9571d5
DM
125 }
126
127 foreach ($policy->draftversions as $draft) {
128 // Show all [other] draft policies indented.
129 $data->versions[] = $this->export_version_for_template($output, $policy, $draft,
cc3790d0 130 true, false, false);
3d9571d5
DM
131 }
132
133 }
134
135 return $data;
136 }
137
138 /**
139 * Exports one version for the list of policies
140 *
141 * @param \renderer_base $output
142 * @param \stdClass $policy
143 * @param \stdClass $version
3d9571d5
DM
144 * @param bool $isindented display indented (normally drafts of the current version)
145 * @param bool $moveup can move up
146 * @param bool $movedown can move down
147 * @return \stdClass
148 */
cc3790d0 149 protected function export_version_for_template($output, $policy, $version, $isindented, $moveup, $movedown) {
3d9571d5 150
cc3790d0 151 $status = $version->status;
3d9571d5
DM
152 $version->statustext = get_string('status' . $status, 'tool_policy');
153
154 if ($status == policy_version::STATUS_ACTIVE) {
3f2c68f1 155 $version->statustext = html_writer::span($version->statustext, 'badge badge-success');
3d9571d5 156 } else if ($status == policy_version::STATUS_DRAFT) {
3f2c68f1 157 $version->statustext = html_writer::span($version->statustext, 'badge badge-warning');
3d9571d5
DM
158 } else {
159 $version->statustext = html_writer::span($version->statustext, 'label');
160 }
161
9011d394
DM
162 if ($version->optional == policy_version::AGREEMENT_OPTIONAL) {
163 $version->optionaltext = get_string('policydocoptionalyes', 'tool_policy');
164 } else {
165 $version->optionaltext = get_string('policydocoptionalno', 'tool_policy');
166 }
167
3d9571d5
DM
168 $version->indented = $isindented;
169
170 $editbaseurl = new moodle_url('/admin/tool/policy/editpolicydoc.php', [
171 'sesskey' => sesskey(),
172 'policyid' => $policy->id,
173 'returnurl' => $this->returnurl->out_as_local_url(false),
174 ]);
175
176 $viewurl = new moodle_url('/admin/tool/policy/view.php', [
177 'policyid' => $policy->id,
178 'versionid' => $version->id,
179 'manage' => 1,
180 'returnurl' => $this->returnurl->out_as_local_url(false),
181 ]);
182
183 $actionmenu = new action_menu();
184 $actionmenu->set_menu_trigger(get_string('actions', 'tool_policy'));
185 $actionmenu->set_alignment(action_menu::TL, action_menu::BL);
186 $actionmenu->prioritise = true;
187 if ($moveup) {
188 $actionmenu->add(new action_menu_link(
189 new moodle_url($editbaseurl, ['moveup' => $policy->id]),
190 new pix_icon('t/up', get_string('moveup', 'tool_policy')),
191 get_string('moveup', 'tool_policy'),
192 true
193 ));
194 }
195 if ($movedown) {
196 $actionmenu->add(new action_menu_link(
197 new moodle_url($editbaseurl, ['movedown' => $policy->id]),
198 new pix_icon('t/down', get_string('movedown', 'tool_policy')),
199 get_string('movedown', 'tool_policy'),
200 true
201 ));
202 }
203 $actionmenu->add(new action_menu_link(
204 $viewurl,
205 null,
206 get_string('view'),
207 false
208 ));
209 if ($status != policy_version::STATUS_ARCHIVED) {
210 $actionmenu->add(new action_menu_link(
211 new moodle_url($editbaseurl, ['versionid' => $version->id]),
212 null,
213 get_string('edit'),
214 false
215 ));
216 }
217 if ($status == policy_version::STATUS_ACTIVE) {
218 $actionmenu->add(new action_menu_link(
219 new moodle_url($editbaseurl, ['inactivate' => $policy->id]),
220 null,
221 get_string('inactivate', 'tool_policy'),
222 false,
223 ['data-action' => 'inactivate']
224 ));
225 }
226 if ($status == policy_version::STATUS_DRAFT) {
227 $actionmenu->add(new action_menu_link(
228 new moodle_url($editbaseurl, ['makecurrent' => $version->id]),
229 null,
230 get_string('activate', 'tool_policy'),
231 false,
232 ['data-action' => 'makecurrent']
233 ));
234 }
cc3790d0 235 if (api::can_delete_version($version)) {
3d9571d5
DM
236 $actionmenu->add(new action_menu_link(
237 new moodle_url($editbaseurl, ['delete' => $version->id]),
238 null,
239 get_string('delete'),
240 false,
241 ['data-action' => 'delete']
242 ));
243 }
244 if ($status == policy_version::STATUS_ARCHIVED) {
245 $actionmenu->add(new action_menu_link(
246 new moodle_url($editbaseurl, ['versionid' => $version->id]),
247 null,
248 get_string('settodraft', 'tool_policy'),
249 false
250 ));
251 }
252 if (!$this->policyid && !$isindented && $policy->archivedversions &&
253 ($status != policy_version::STATUS_ARCHIVED || count($policy->archivedversions) > 1)) {
254 $actionmenu->add(new action_menu_link(
255 new moodle_url('/admin/tool/policy/managedocs.php', ['archived' => $policy->id]),
256 null,
257 get_string('viewarchived', 'tool_policy'),
258 false
259 ));
260 }
261
262 $version->actionmenu = $actionmenu->export_for_template($output);
263 return $version;
264 }
265}