| 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 templatable;
 | 
        
           |  |  | 20 | use renderable;
 | 
        
           |  |  | 21 | use core_tag_tag;
 | 
        
           |  |  | 22 | use mod_data\manager;
 | 
        
           |  |  | 23 |   | 
        
           |  |  | 24 | /**
 | 
        
           |  |  | 25 |  * Renderable class for template editor tools.
 | 
        
           |  |  | 26 |  *
 | 
        
           |  |  | 27 |  * @package    mod_data
 | 
        
           |  |  | 28 |  * @copyright  2022 Ferran Recio <ferran@moodle.com>
 | 
        
           |  |  | 29 |  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 | 
        
           |  |  | 30 |  */
 | 
        
           |  |  | 31 | class template_editor_tools implements templatable, renderable {
 | 
        
           |  |  | 32 |   | 
        
           |  |  | 33 |     /** @var manager manager instance. */
 | 
        
           |  |  | 34 |     private $manager;
 | 
        
           |  |  | 35 |   | 
        
           |  |  | 36 |     /** @var string the template name. */
 | 
        
           |  |  | 37 |     private $templatename;
 | 
        
           |  |  | 38 |   | 
        
           |  |  | 39 |     /**
 | 
        
           |  |  | 40 |      * The class constructor.
 | 
        
           |  |  | 41 |      *
 | 
        
           |  |  | 42 |      * @param manager $manager the activity instance manager
 | 
        
           |  |  | 43 |      * @param string $templatename the template to edit
 | 
        
           |  |  | 44 |      */
 | 
        
           |  |  | 45 |     public function __construct(manager $manager, string $templatename) {
 | 
        
           |  |  | 46 |         $this->manager = $manager;
 | 
        
           |  |  | 47 |         $this->templatename = $templatename;
 | 
        
           |  |  | 48 |     }
 | 
        
           |  |  | 49 |   | 
        
           |  |  | 50 |     /**
 | 
        
           |  |  | 51 |      * Export the data for the mustache template.
 | 
        
           |  |  | 52 |      *
 | 
        
           |  |  | 53 |      * @param \renderer_base $output renderer to be used to render the action bar elements.
 | 
        
           |  |  | 54 |      * @return array
 | 
        
           |  |  | 55 |      */
 | 
        
           |  |  | 56 |     public function export_for_template(\renderer_base $output): array {
 | 
        
           |  |  | 57 |         $tools = [
 | 
        
           |  |  | 58 |             $this->get_field_tags($this->templatename),
 | 
        
           |  |  | 59 |             $this->get_field_info_tags($this->templatename),
 | 
        
           |  |  | 60 |             $this->get_action_tags($this->templatename),
 | 
        
           |  |  | 61 |             $this->get_other_tags($this->templatename),
 | 
        
           |  |  | 62 |         ];
 | 
        
           |  |  | 63 |         $tools = array_filter($tools, static function ($value) {
 | 
        
           |  |  | 64 |             return !empty($value['tags']);
 | 
        
           |  |  | 65 |         });
 | 
        
           |  |  | 66 |         return [
 | 
        
           |  |  | 67 |             'toolshelp' => $output->help_icon('availabletags', 'data'),
 | 
        
           |  |  | 68 |             'hastools' => !empty($tools),
 | 
        
           |  |  | 69 |             'tools' => array_values($tools),
 | 
        
           |  |  | 70 |         ];
 | 
        
           |  |  | 71 |     }
 | 
        
           |  |  | 72 |   | 
        
           |  |  | 73 |     /**
 | 
        
           |  |  | 74 |      * Return the field template tags.
 | 
        
           |  |  | 75 |      *
 | 
        
           |  |  | 76 |      * @param string $templatename the template name
 | 
        
           |  |  | 77 |      * @return array|null array of tags.
 | 
        
           |  |  | 78 |      */
 | 
        
           |  |  | 79 |     protected function get_field_tags(string $templatename): array {
 | 
        
           |  |  | 80 |         $name = get_string('fields', 'data');
 | 
        
           |  |  | 81 |         if ($templatename == 'csstemplate' || $templatename == 'jstemplate') {
 | 
        
           |  |  | 82 |             return $this->get_optgroup_data($name, []);
 | 
        
           |  |  | 83 |         }
 | 
        
           |  |  | 84 |         $taglist = [];
 | 
        
           |  |  | 85 |         $fields = $this->manager->get_fields();
 | 
        
           |  |  | 86 |         foreach ($fields as $field) {
 | 
        
           |  |  | 87 |             if ($field->type === 'unknown') {
 | 
        
           |  |  | 88 |                 continue;
 | 
        
           |  |  | 89 |             }
 | 
        
           |  |  | 90 |             $fieldname = $field->get_name();
 | 
        
           |  |  | 91 |             $taglist["[[$fieldname]]"] = $fieldname;
 | 
        
           |  |  | 92 |         }
 | 
        
           |  |  | 93 |         $taglist['##otherfields##'] = get_string('otherfields', 'data');
 | 
        
           |  |  | 94 |         return $this->get_optgroup_data($name, $taglist);
 | 
        
           |  |  | 95 |     }
 | 
        
           |  |  | 96 |   | 
        
           |  |  | 97 |     /**
 | 
        
           |  |  | 98 |      * Return the field information template tags.
 | 
        
           |  |  | 99 |      *
 | 
        
           |  |  | 100 |      * @param string $templatename the template name
 | 
        
           |  |  | 101 |      * @return array|null array of tags.
 | 
        
           |  |  | 102 |      */
 | 
        
           |  |  | 103 |     protected function get_field_info_tags(string $templatename): array {
 | 
        
           |  |  | 104 |         $name = get_string('fieldsinformationtags', 'data');
 | 
        
           |  |  | 105 |         $taglist = [];
 | 
        
           |  |  | 106 |         $fields = $this->manager->get_fields();
 | 
        
           |  |  | 107 |         foreach ($fields as $field) {
 | 
        
           |  |  | 108 |             if ($field->type === 'unknown') {
 | 
        
           |  |  | 109 |                 continue;
 | 
        
           |  |  | 110 |             }
 | 
        
           |  |  | 111 |             $fieldname = $field->get_name();
 | 
        
           |  |  | 112 |             if ($templatename == 'addtemplate') {
 | 
        
           |  |  | 113 |                 $taglist["[[$fieldname#id]]"] = get_string('fieldtagid', 'mod_data', $fieldname);
 | 
        
           |  |  | 114 |             }
 | 
        
           |  |  | 115 |             $taglist["[[$fieldname#name]]"] = get_string('fieldtagname', 'mod_data', $fieldname);
 | 
        
           |  |  | 116 |             $taglist["[[$fieldname#description]]"] = get_string('fieldtagdescription', 'mod_data', $fieldname);
 | 
        
           |  |  | 117 |         }
 | 
        
           |  |  | 118 |         return $this->get_optgroup_data($name, $taglist);
 | 
        
           |  |  | 119 |     }
 | 
        
           |  |  | 120 |   | 
        
           |  |  | 121 |     /**
 | 
        
           |  |  | 122 |      * Return the field action tags.
 | 
        
           |  |  | 123 |      *
 | 
        
           |  |  | 124 |      * @param string $templatename the template name
 | 
        
           |  |  | 125 |      * @return array|null array of tags.
 | 
        
           |  |  | 126 |      */
 | 
        
           |  |  | 127 |     protected function get_action_tags(string $templatename): array {
 | 
        
           |  |  | 128 |         $name = get_string('actions');
 | 
        
           |  |  | 129 |         if ($templatename == 'addtemplate' || $templatename == 'asearchtemplate') {
 | 
        
           |  |  | 130 |             return $this->get_optgroup_data($name, []);
 | 
        
           |  |  | 131 |         }
 | 
        
           |  |  | 132 |         $taglist = [
 | 
        
           |  |  | 133 |             '##actionsmenu##' => get_string('actionsmenu', 'data'),
 | 
        
           |  |  | 134 |             '##edit##' => get_string('edit', 'data'),
 | 
        
           |  |  | 135 |             '##delete##' => get_string('delete', 'data'),
 | 
        
           |  |  | 136 |             '##approve##' => get_string('approve', 'data'),
 | 
        
           |  |  | 137 |             '##disapprove##' => get_string('disapprove', 'data'),
 | 
        
           |  |  | 138 |         ];
 | 
        
           |  |  | 139 |         if ($templatename != 'rsstemplate') {
 | 
        
           |  |  | 140 |             $taglist['##export##'] = get_string('export', 'data');
 | 
        
           |  |  | 141 |         }
 | 
        
           |  |  | 142 |         if ($templatename != 'singletemplate') {
 | 
        
           |  |  | 143 |             $taglist['##more##'] = get_string('more', 'data');
 | 
        
           |  |  | 144 |             $taglist['##moreurl##'] = get_string('moreurl', 'data');
 | 
        
           |  |  | 145 |             $taglist['##delcheck##'] = get_string('delcheck', 'data');
 | 
        
           |  |  | 146 |         }
 | 
        
           |  |  | 147 |         return $this->get_optgroup_data($name, $taglist);
 | 
        
           |  |  | 148 |     }
 | 
        
           |  |  | 149 |   | 
        
           |  |  | 150 |     /**
 | 
        
           |  |  | 151 |      * Return the available other tags
 | 
        
           |  |  | 152 |      *
 | 
        
           |  |  | 153 |      * @param string $templatename the template name
 | 
        
           |  |  | 154 |      * @return array associative array of tags => tag name
 | 
        
           |  |  | 155 |      */
 | 
        
           |  |  | 156 |     protected function get_other_tags(string $templatename): array {
 | 
        
           |  |  | 157 |         $name = get_string('other', 'data');
 | 
        
           |  |  | 158 |         $taglist = [];
 | 
        
           |  |  | 159 |         if ($templatename == 'asearchtemplate') {
 | 
        
           |  |  | 160 |             $taglist['##firstname##'] = get_string('firstname');
 | 
        
           |  |  | 161 |             $taglist['##lastname##'] = get_string('lastname');
 | 
        
           |  |  | 162 |             return $this->get_optgroup_data($name, $taglist);
 | 
        
           |  |  | 163 |         }
 | 
        
           |  |  | 164 |         if (core_tag_tag::is_enabled('mod_data', 'data_records')) {
 | 
        
           |  |  | 165 |             $taglist['##tags##'] = get_string('tags');
 | 
        
           |  |  | 166 |         }
 | 
        
           |  |  | 167 |         if ($templatename == 'addtemplate') {
 | 
        
           |  |  | 168 |             return $this->get_optgroup_data($name, $taglist);
 | 
        
           |  |  | 169 |         }
 | 
        
           |  |  | 170 |         $taglist['##timeadded##'] = get_string('timeadded', 'data');
 | 
        
           |  |  | 171 |         $taglist['##timemodified##'] = get_string('timemodified', 'data');
 | 
        
           |  |  | 172 |         $taglist['##user##'] = get_string('user');
 | 
        
           |  |  | 173 |         $taglist['##userpicture##'] = get_string('userpic');
 | 
        
           |  |  | 174 |         $taglist['##approvalstatus##'] = get_string('approvalstatus', 'data');
 | 
        
           |  |  | 175 |         $taglist['##id##'] = get_string('id', 'data');
 | 
        
           |  |  | 176 |   | 
        
           |  |  | 177 |         if ($templatename == 'singletemplate') {
 | 
        
           |  |  | 178 |             return $this->get_optgroup_data($name, $taglist);
 | 
        
           |  |  | 179 |         }
 | 
        
           |  |  | 180 |   | 
        
           |  |  | 181 |         $taglist['##comments##'] = get_string('comments', 'data');
 | 
        
           |  |  | 182 |   | 
        
           |  |  | 183 |         return $this->get_optgroup_data($name, $taglist);
 | 
        
           |  |  | 184 |     }
 | 
        
           |  |  | 185 |   | 
        
           |  |  | 186 |     /**
 | 
        
           |  |  | 187 |      * Generate a valid optgroup data.
 | 
        
           |  |  | 188 |      *
 | 
        
           |  |  | 189 |      * @param string $name the optgroup name
 | 
        
           |  |  | 190 |      * @param array $taglist the indexed array of taglists ($tag => $tagname)
 | 
        
           |  |  | 191 |      * @return array of optgroup data
 | 
        
           |  |  | 192 |      */
 | 
        
           |  |  | 193 |     protected function get_optgroup_data(string $name, array $taglist): array {
 | 
        
           |  |  | 194 |         $tags = [];
 | 
        
           |  |  | 195 |         foreach ($taglist as $tag => $tagname) {
 | 
        
           |  |  | 196 |             $tags[] = [
 | 
        
           |  |  | 197 |                 'tag' => "$tag",
 | 
        
           |  |  | 198 |                 'tagname' => $tagname . ' - ' . $tag,
 | 
        
           |  |  | 199 |             ];
 | 
        
           |  |  | 200 |         }
 | 
        
           |  |  | 201 |         return [
 | 
        
           |  |  | 202 |             'name' => $name,
 | 
        
           |  |  | 203 |             'tags' => $tags,
 | 
        
           |  |  | 204 |         ];
 | 
        
           |  |  | 205 |     }
 | 
        
           |  |  | 206 | }
 |