Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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
namespace mod_data\output;
18
 
19
use mod_data\manager;
20
use mod_data\preset;
21
use moodle_url;
22
use url_select;
23
 
24
/**
25
 * Class responsible for generating the action bar elements in the database module pages.
26
 *
27
 * @package    mod_data
28
 * @copyright  2021 Mihail Geshoski <mihail@moodle.com>
29
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
30
 */
31
class action_bar {
32
 
33
    /** @var int $id The database module id. */
34
    private $id;
35
 
36
    /** @var int $cmid The database course module id. */
37
    private $cmid;
38
 
39
    /** @var moodle_url $currenturl The URL of the current page. */
40
    private $currenturl;
41
 
42
    /**
43
     * The class constructor.
44
     *
45
     * @param int $id The database module id.
46
     * @param moodle_url $pageurl The URL of the current page.
47
     */
48
    public function __construct(int $id, moodle_url $pageurl) {
49
        $this->id = $id;
50
        [$course, $cm] = get_course_and_cm_from_instance($this->id, 'data');
51
        $this->cmid = $cm->id;
52
        $this->currenturl = $pageurl;
53
    }
54
 
55
    /**
56
     * Generate the output for the action bar in the field page.
57
     *
58
     * @param bool $hasfieldselect Whether the field selector element should be rendered.
59
     * @param null $unused1 This parameter has been deprecated since 4.1 and should not be used anymore.
60
     * @param null $unused2 This parameter has been deprecated since 4.1 and should not be used anymore.
61
     * @return string The HTML code for the action bar.
62
     */
63
    public function get_fields_action_bar(
64
        bool $hasfieldselect = false,
65
        ?bool $unused1 = null,
66
        ?bool $unused2 = null
67
    ): string {
68
        global $PAGE;
69
 
70
        if ($unused1 !== null || $unused2 !== null) {
71
            debugging('Deprecated argument passed to get_fields_action_bar method', DEBUG_DEVELOPER);
72
        }
73
 
74
        $renderer = $PAGE->get_renderer('mod_data');
75
        $fieldsactionbar = new fields_action_bar($this->id);
76
 
77
        return $renderer->render_fields_action_bar($fieldsactionbar);
78
    }
79
 
80
    /**
81
     * Generate the output for the action bar in the field mappings page.
82
     *
83
     * @return string The HTML code for the action bar.
84
     */
85
    public function get_fields_mapping_action_bar(): string {
86
        global $PAGE;
87
 
88
        $renderer = $PAGE->get_renderer('mod_data');
89
        $fieldsactionbar = new fields_mappings_action_bar($this->id);
90
 
91
        $data = $fieldsactionbar->export_for_template($renderer);
92
        return $renderer->render_from_template('mod_data/fields_action_bar', $data);
93
    }
94
 
95
    /**
96
     * Generate the output for the create a new field action menu.
97
     *
98
     * @param bool $isprimarybutton is the action trigger a primary or secondary button?
99
     * @return \action_menu Action menu to create a new field
100
     */
101
    public function get_create_fields(bool $isprimarybutton = false): \action_menu {
102
        // Get the list of possible fields (plugins).
103
        $plugins = \core_component::get_plugin_list('datafield');
104
        $menufield = [];
105
        foreach ($plugins as $plugin => $fulldir) {
106
            $menufield[$plugin] = get_string('pluginname', "datafield_{$plugin}");
107
        }
108
        asort($menufield);
109
 
110
        $fieldselect = new \action_menu();
111
        $triggerclasses = ['btn'];
112
        $triggerclasses[] = $isprimarybutton ? 'btn-primary' : 'btn-secondary';
113
        $fieldselect->set_menu_trigger(get_string('newfield', 'mod_data'), join(' ', $triggerclasses));
114
        $fieldselectparams = ['id' => $this->cmid, 'mode' => 'new'];
115
        foreach ($menufield as $fieldtype => $fieldname) {
116
            $fieldselectparams['newtype'] = $fieldtype;
117
            $fieldselect->add(new \action_menu_link(
118
                new moodle_url('/mod/data/field.php', $fieldselectparams),
119
                new \pix_icon('field/' . $fieldtype, $fieldname, 'data'),
120
                $fieldname,
121
                false
122
            ));
123
        }
124
        $fieldselect->set_additional_classes('singlebutton');
125
 
126
        return $fieldselect;
127
    }
128
 
129
    /**
130
     * Generate the output for the action selector in the view page.
131
     *
132
     * @param bool $hasentries Whether entries exist.
133
     * @param string $mode The current view mode (list, view...).
134
     * @return string The HTML code for the action selector.
135
     */
136
    public function get_view_action_bar(bool $hasentries, string $mode): string {
137
        global $PAGE;
138
 
139
        $viewlistlink = new moodle_url('/mod/data/view.php', ['d' => $this->id]);
140
        $viewsinglelink = new moodle_url('/mod/data/view.php', ['d' => $this->id, 'mode' => 'single']);
141
 
142
        $menu = [
143
            $viewlistlink->out(false) => get_string('listview', 'mod_data'),
144
            $viewsinglelink->out(false) => get_string('singleview', 'mod_data'),
145
        ];
146
 
147
        $activeurl = $this->currenturl;
148
 
149
        if ($this->currenturl->get_param('rid') || $this->currenturl->get_param('mode') == 'single') {
150
            $activeurl = $viewsinglelink;
151
        }
152
 
153
        $urlselect = new url_select($menu, $activeurl->out(false), null, 'viewactionselect');
154
        $urlselect->set_label(get_string('viewnavigation', 'mod_data'), ['class' => 'sr-only']);
155
        $renderer = $PAGE->get_renderer('mod_data');
156
        $viewactionbar = new view_action_bar($this->id, $urlselect, $hasentries, $mode);
157
 
158
        return $renderer->render_view_action_bar($viewactionbar);
159
    }
160
 
161
    /**
162
     * Generate the output for the action selector in the templates page.
163
     *
164
     * @return string The HTML code for the action selector.
165
     */
166
    public function get_templates_action_bar(): string {
167
        global $PAGE;
168
 
169
        $listtemplatelink = new moodle_url('/mod/data/templates.php', ['d' => $this->id,
170
            'mode' => 'listtemplate']);
171
        $singletemplatelink = new moodle_url('/mod/data/templates.php', ['d' => $this->id,
172
            'mode' => 'singletemplate']);
173
        $advancedsearchtemplatelink = new moodle_url('/mod/data/templates.php', ['d' => $this->id,
174
            'mode' => 'asearchtemplate']);
175
        $addtemplatelink = new moodle_url('/mod/data/templates.php', ['d' => $this->id, 'mode' => 'addtemplate']);
176
        $rsstemplatelink = new moodle_url('/mod/data/templates.php', ['d' => $this->id, 'mode' => 'rsstemplate']);
177
        $csstemplatelink = new moodle_url('/mod/data/templates.php', ['d' => $this->id, 'mode' => 'csstemplate']);
178
        $jstemplatelink = new moodle_url('/mod/data/templates.php', ['d' => $this->id, 'mode' => 'jstemplate']);
179
 
180
        $menu = [
181
            $addtemplatelink->out(false) => get_string('addtemplate', 'mod_data'),
182
            $singletemplatelink->out(false) => get_string('singletemplate', 'mod_data'),
183
            $listtemplatelink->out(false) => get_string('listtemplate', 'mod_data'),
184
            $advancedsearchtemplatelink->out(false) => get_string('asearchtemplate', 'mod_data'),
185
            $csstemplatelink->out(false) => get_string('csstemplate', 'mod_data'),
186
            $jstemplatelink->out(false) => get_string('jstemplate', 'mod_data'),
187
            $rsstemplatelink->out(false) => get_string('rsstemplate', 'mod_data'),
188
        ];
189
 
190
        $selectmenu = new \core\output\select_menu('presetsactions', $menu, $this->currenturl->out(false));
191
        $selectmenu->set_label(get_string('templatesnavigation', 'mod_data'), ['class' => 'sr-only']);
192
 
193
        $renderer = $PAGE->get_renderer('mod_data');
194
 
195
        $presetsactions = $this->get_presets_actions_select(false);
196
 
197
        // Reset single template action.
198
        $resetcurrrent = new moodle_url($this->currenturl);
199
        $resetcurrrent->param('action', 'resettemplate');
200
        $presetsactions->add(new \action_menu_link(
201
            $resetcurrrent,
202
            null,
203
            get_string('resettemplate', 'mod_data'),
204
            false,
205
            ['data-action' => 'resettemplate', 'data-dataid' => $this->id]
206
        ));
207
 
208
        // Reset all templates action.
209
        $resetallurl = new moodle_url($this->currenturl);
210
        $resetallurl->params([
211
            'action' => 'resetalltemplates',
212
            'sesskey' => sesskey(),
213
        ]);
214
        $presetsactions->add(new \action_menu_link(
215
            $resetallurl,
216
            null,
217
            get_string('resetalltemplates', 'mod_data'),
218
            false,
219
            ['data-action' => 'resetalltemplates', 'data-dataid' => $this->id]
220
        ));
221
 
222
        $templatesactionbar = new templates_action_bar($this->id, $selectmenu, null, null, $presetsactions);
223
 
224
        return $renderer->render_templates_action_bar($templatesactionbar);
225
    }
226
 
227
    /**
228
     * Generate the output for the action selector in the presets page.
229
     *
230
     * @return string The HTML code for the action selector.
231
     */
232
    public function get_presets_action_bar(): string {
233
        global $PAGE;
234
 
235
        $renderer = $PAGE->get_renderer('mod_data');
236
        $presetsactionbar = new presets_action_bar($this->cmid, $this->get_presets_actions_select(true));
237
 
238
        return $renderer->render_presets_action_bar($presetsactionbar);
239
    }
240
 
241
    /**
242
     * Generate the output for the action selector in the presets preview page.
243
     *
244
     * @param manager $manager the manager instance
245
     * @param string $fullname the preset fullname
246
     * @param string $current the current template name
247
     * @return string The HTML code for the action selector
248
     */
249
    public function get_presets_preview_action_bar(manager $manager, string $fullname, string $current): string {
250
        global $PAGE;
251
 
252
        $renderer = $PAGE->get_renderer(manager::PLUGINNAME);
253
 
254
        $cm = $manager->get_coursemodule();
255
 
256
        $menu = [];
257
        $selected = null;
258
        foreach (['listtemplate', 'singletemplate'] as $templatename) {
259
            $link = new moodle_url('/mod/data/preset.php', [
260
                'd' => $this->id,
261
                'template' => $templatename,
262
                'fullname' => $fullname,
263
                'action' => 'preview',
264
            ]);
265
            $menu[$link->out(false)] = get_string($templatename, manager::PLUGINNAME);
266
            if (!$selected || $templatename == $current) {
267
                $selected = $link->out(false);
268
            }
269
        }
270
        $urlselect = new url_select($menu, $selected, null);
271
        $urlselect->set_label(get_string('templatesnavigation', manager::PLUGINNAME), ['class' => 'sr-only']);
272
 
273
        $data = [
274
            'title' => get_string('preview', manager::PLUGINNAME, preset::get_name_from_plugin($fullname)),
275
            'hasback' => true,
276
            'backtitle' => get_string('back'),
277
            'backurl' => new moodle_url('/mod/data/preset.php', ['id' => $cm->id]),
278
            'extraurlselect' => $urlselect->export_for_template($renderer),
279
        ];
280
        return $renderer->render_from_template('mod_data/action_bar', $data);
281
    }
282
 
283
    /**
284
     * Helper method to get the selector for the presets action.
285
     *
286
     * @param bool $hasimport Whether the Import buttons must be included or not.
287
     * @return \action_menu|null The selector object used to display the presets actions. Null when the import button is not
288
     * displayed and the database hasn't any fields.
289
     */
290
    protected function get_presets_actions_select(bool $hasimport = false): ?\action_menu {
291
        global $DB;
292
 
293
        $hasfields = $DB->record_exists('data_fields', ['dataid' => $this->id]);
294
 
295
        // Early return if the database has no fields and the import action won't be displayed.
296
        if (!$hasfields && !$hasimport) {
297
            return null;
298
        }
299
 
300
        $actionsselect = new \action_menu();
301
        $actionsselect->set_menu_trigger(get_string('actions'), 'btn btn-secondary');
302
 
303
        if ($hasimport) {
304
            // Import.
305
            $actionsselectparams = ['id' => $this->cmid];
306
            $actionsselect->add(new \action_menu_link(
307
                new moodle_url('/mod/data/preset.php', $actionsselectparams),
308
                null,
309
                get_string('importpreset', 'mod_data'),
310
                false,
311
                ['data-action' => 'importpresets', 'data-dataid' => $this->cmid]
312
            ));
313
        }
314
 
315
        // If the database has no fields, export and save as preset options shouldn't be displayed.
316
        if ($hasfields) {
317
            // Export.
318
            $actionsselectparams = ['id' => $this->cmid, 'action' => 'export'];
319
            $actionsselect->add(new \action_menu_link(
320
                new moodle_url('/mod/data/preset.php', $actionsselectparams),
321
                null,
322
                get_string('exportpreset', 'mod_data'),
323
                false
324
            ));
325
            // Save as preset.
326
            $actionsselect->add(new \action_menu_link(
327
                new moodle_url('/mod/data/preset.php', $actionsselectparams),
328
                null,
329
                get_string('saveaspreset', 'mod_data'),
330
                false,
331
                ['data-action' => 'saveaspreset', 'data-dataid' => $this->id]
332
            ));
333
        }
334
 
335
        return $actionsselect;
336
    }
337
}