MDL-61889 tool_dataprivacy: Fix CI errors
authorJun Pataleta <jun@moodle.com>
Thu, 17 May 2018 09:00:03 +0000 (17:00 +0800)
committerJun Pataleta <jun@moodle.com>
Tue, 26 Jun 2018 05:20:31 +0000 (13:20 +0800)
23 files changed:
admin/tool/dataprivacy/amd/src/data_registry.js
admin/tool/dataprivacy/amd/src/expand_contract.js
admin/tool/dataprivacy/categories.php
admin/tool/dataprivacy/classes/api.php
admin/tool/dataprivacy/classes/data_registry.php
admin/tool/dataprivacy/classes/expired_contexts_manager.php
admin/tool/dataprivacy/classes/expired_user_contexts.php
admin/tool/dataprivacy/classes/form/context_instance.php
admin/tool/dataprivacy/classes/local/helper.php
admin/tool/dataprivacy/classes/purpose.php
admin/tool/dataprivacy/datadeletion.php
admin/tool/dataprivacy/dataregistry.php
admin/tool/dataprivacy/datarequests.php
admin/tool/dataprivacy/defaults.php
admin/tool/dataprivacy/editcategory.php
admin/tool/dataprivacy/editpurpose.php
admin/tool/dataprivacy/pluginregistry.php
admin/tool/dataprivacy/purposes.php
admin/tool/dataprivacy/templates/component_status.mustache
admin/tool/dataprivacy/templates/data_deletion.mustache
admin/tool/dataprivacy/templates/data_registry_compliance.mustache
admin/tool/dataprivacy/templates/data_request_email.mustache
admin/tool/dataprivacy/templates/data_request_modal.mustache

index 76f00ee..07eb18d 100644 (file)
@@ -234,6 +234,7 @@ define(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/templates'
                     },
                     fail: Notification.exception
                 }]);
+                return;
             }).catch(Notification.exception);
 
         };
index 41b7e50..cf509b5 100644 (file)
@@ -34,7 +34,6 @@ define(['jquery', 'core/url', 'core/str'], function($, url, str) {
          *
          * @param  {object} targetnode The node that we want to expand / collapse
          * @param  {object} thisnode The node that was clicked.
-         * @return {null}
          */
         expandCollapse: function(targetnode, thisnode) {
             if (targetnode.hasClass('hide')) {
@@ -58,7 +57,6 @@ define(['jquery', 'core/url', 'core/str'], function($, url, str) {
          * Expand or collapse all nodes on this page.
          *
          * @param  {string} nextstate The next state to change to.
-         * @return {null}
          */
         expandCollapseAll: function(nextstate) {
             var currentstate = (nextstate == 'visible') ? 'hide' : 'visible';
@@ -75,6 +73,7 @@ define(['jquery', 'core/url', 'core/str'], function($, url, str) {
 
             str.get_string(currentstate, 'tool_dataprivacy').then(function(langString) {
                 $('.tool_dataprivacy-expand-all').html(langString);
+                return;
             }).catch(Notification.exception);
 
             $(':header i.fa').each(function() {
index b160ff3..f323278 100644 (file)
@@ -24,6 +24,8 @@
 
 require_once(__DIR__ . '/../../../config.php');
 
+require_login(null, false);
+
 $url = new moodle_url("/admin/tool/dataprivacy/categories.php");
 $title = get_string('editcategories', 'tool_dataprivacy');
 
index 05efe9c..275044a 100644 (file)
@@ -197,7 +197,7 @@ class api {
             } else {
                 // If not a DPO, only users with the capability to make data requests for the user should be allowed.
                 // (e.g. users with the Parent role, etc).
-                if (!api::can_create_data_request_for_user($foruser)) {
+                if (!self::can_create_data_request_for_user($foruser)) {
                     $forusercontext = \context_user::instance($foruser);
                     throw new required_capability_exception($forusercontext,
                             'tool/dataprivacy:makedatarequestsforchildren', 'nopermissions', '');
index 39e3e53..1435fcd 100644 (file)
@@ -289,7 +289,8 @@ class data_registry {
      * @param int $forcedcategoryvalue Use this value as if this was this context level category.
      * @return int[]
      */
-    public static function get_effective_default_contextlevel_purpose_and_category($contextlevel, $forcedpurposevalue = false, $forcedcategoryvalue = false) {
+    public static function get_effective_default_contextlevel_purpose_and_category($contextlevel, $forcedpurposevalue = false,
+                                                                                   $forcedcategoryvalue = false) {
 
         list($purposeid, $categoryid) = self::get_defaults($contextlevel);
 
index 3d20e5d..539fc28 100644 (file)
  */
 namespace tool_dataprivacy;
 
-use tool_dataprivacy\api;
-use tool_dataprivacy\purpose;
-use tool_dataprivacy\context_instance;
-use tool_dataprivacy\data_registry;
+use core_privacy\manager;
 use tool_dataprivacy\expired_context;
 
 defined('MOODLE_INTERNAL') || die();
@@ -90,7 +87,7 @@ abstract class expired_contexts_manager {
             return $numprocessed;
         }
 
-        $privacymanager = new \core_privacy\manager();
+        $privacymanager = new manager();
         $privacymanager->set_observer(new \tool_dataprivacy\manager_observer());
 
         foreach ($this->get_context_levels() as $level) {
@@ -118,11 +115,11 @@ abstract class expired_contexts_manager {
     /**
      * Deletes user data from the provided context.
      *
-     * @param \core_privacy\manager $privacymanager
-     * @param \tool_dataprivacy\expired_context $expiredctx
+     * @param manager $privacymanager
+     * @param expired_context $expiredctx
      * @return \context|false
      */
-    protected function delete_expired_context(\core_privacy\manager $privacymanager, \tool_dataprivacy\expired_context $expiredctx) {
+    protected function delete_expired_context(manager $privacymanager, expired_context $expiredctx) {
 
         $context = \context::instance_by_id($expiredctx->get('contextid'), IGNORE_MISSING);
         if (!$context) {
index e4b40e8..924d565 100644 (file)
@@ -23,8 +23,7 @@
  */
 namespace tool_dataprivacy;
 
-use tool_dataprivacy\purpose;
-use tool_dataprivacy\context_instance;
+use core_privacy\manager;
 
 defined('MOODLE_INTERNAL') || die();
 
@@ -110,11 +109,11 @@ class expired_user_contexts extends \tool_dataprivacy\expired_contexts_manager {
      *
      * Overwritten to delete the user.
      *
-     * @param \core_privacy\manager $privacymanager
-     * @param \tool_dataprivacy\expired_context $expiredctx
+     * @param manager $privacymanager
+     * @param expired_context $expiredctx
      * @return \context|false
      */
-    protected function delete_expired_context(\core_privacy\manager $privacymanager, \tool_dataprivacy\expired_context $expiredctx) {
+    protected function delete_expired_context(manager $privacymanager, expired_context $expiredctx) {
         $context = \context::instance_by_id($expiredctx->get('contextid'), IGNORE_MISSING);
         if (!$context) {
             api::delete_expired_context($expiredctx->get('contextid'));
index 14790b5..bd1204f 100644 (file)
@@ -27,6 +27,7 @@ defined('MOODLE_INTERNAL') || die();
 
 use tool_dataprivacy\api;
 use tool_dataprivacy\data_registry;
+use tool_dataprivacy\purpose;
 
 /**
  * Context instance data form.
@@ -186,12 +187,12 @@ class context_instance extends \core\form\persistent {
     /**
      * Returns the purpose display text.
      *
-     * @param \tool_dataprivacy\purpose $effectivepurpose
+     * @param purpose $effectivepurpose
      * @param int $retentioncontextlevel
      * @param \context $context The context, just for displaying (filters) purposes.
      * @return string
      */
-    protected static function get_retention_display_text(\tool_dataprivacy\purpose $effectivepurpose, $retentioncontextlevel, \context $context) {
+    protected static function get_retention_display_text(purpose $effectivepurpose, $retentioncontextlevel, \context $context) {
         global $PAGE;
 
         $renderer = $PAGE->get_renderer('tool_dataprivacy');
index d7c3436..c68c994 100644 (file)
@@ -132,7 +132,7 @@ class helper {
             'contextlevel' => CONTEXT_USER
         ];
 
-        // The final list of users that we will return;
+        // The final list of users that we will return.
         $finalresults = [];
 
         // Our prospective list of users.
index c1631e4..ca4fb17 100644 (file)
@@ -64,7 +64,7 @@ class purpose extends \core\persistent {
                 // Replicate self::read.
                 $this->from_record($data);
 
-                // Using validate() as self::$validated is private.
+                // Validate the purpose record.
                 $this->validate();
 
                 // Now replicate the parent constructor.
index eaa5056..f622e5b 100644 (file)
@@ -25,6 +25,8 @@
 require_once(__DIR__ . '/../../../config.php');
 require_once($CFG->dirroot . '/' . $CFG->admin . '/tool/dataprivacy/lib.php');
 
+require_login(null, false);
+
 $filter = optional_param('filter', CONTEXT_COURSE, PARAM_INT);
 
 $url = new moodle_url('/admin/tool/dataprivacy/datadeletion.php');
index 58da785..52eff0a 100644 (file)
@@ -25,6 +25,8 @@
 require_once(__DIR__ . '/../../../config.php');
 require_once($CFG->dirroot . '/' . $CFG->admin . '/tool/dataprivacy/lib.php');
 
+require_login(null, false);
+
 $contextlevel = optional_param('contextlevel', CONTEXT_SYSTEM, PARAM_INT);
 $contextid = optional_param('contextid', 0, PARAM_INT);
 
index d2d9123..a3e613a 100644 (file)
@@ -25,6 +25,8 @@
 require_once("../../../config.php");
 require_once('lib.php');
 
+require_login(null, false);
+
 $url = new moodle_url('/admin/tool/dataprivacy/datarequests.php');
 
 $title = get_string('datarequests', 'tool_dataprivacy');
index 0611908..d936ba2 100644 (file)
@@ -25,6 +25,8 @@
 require_once(__DIR__ . '/../../../config.php');
 require_once($CFG->dirroot . '/' . $CFG->admin . '/tool/dataprivacy/lib.php');
 
+require_login(null, false);
+
 $url = new \moodle_url('/admin/tool/dataprivacy/defaults.php');
 $title = get_string('setdefaults', 'tool_dataprivacy');
 
index a2f59fb..0ee630f 100644 (file)
@@ -24,6 +24,8 @@
 
 require_once(__DIR__ . '/../../../config.php');
 
+require_login(null, false);
+
 $id = optional_param('id', 0, PARAM_INT);
 
 $url = new \moodle_url('/admin/tool/dataprivacy/editcategory.php', array('id' => $id));
index d7013db..20ee631 100644 (file)
@@ -24,6 +24,8 @@
 
 require_once(__DIR__ . '/../../../config.php');
 
+require_login(null, false);
+
 $id = optional_param('id', 0, PARAM_INT);
 
 $url = new \moodle_url('/admin/tool/dataprivacy/editpurpose.php', array('id' => $id));
index 060bd81..3b3f1c4 100644 (file)
@@ -25,6 +25,8 @@
 require_once(__DIR__ . '/../../../config.php');
 require_once($CFG->dirroot . '/' . $CFG->admin . '/tool/dataprivacy/lib.php');
 
+require_login(null, false);
+
 $contextlevel = optional_param('contextlevel', CONTEXT_SYSTEM, PARAM_INT);
 $contextid = optional_param('contextid', 0, PARAM_INT);
 
index 81d1517..5fad922 100644 (file)
@@ -24,6 +24,8 @@
 
 require_once(__DIR__ . '/../../../config.php');
 
+require_login(null, false);
+
 $url = new moodle_url("/admin/tool/dataprivacy/purposes.php");
 $title = get_string('editpurposes', 'tool_dataprivacy');
 
index 79c9063..c62dc0b 100644 (file)
@@ -46,7 +46,7 @@
     }
 }}
 
-<div classs="container-fluid">
+<div class="container-fluid">
     <hr />
     <div class="row">
         {{#compliant}}
     </div>
 
     {{#compliant}}
-        <div class="hide" data-section="{{raw_component}}" aria-expanded="false">
+        <div class="hide" data-section="{{raw_component}}" aria-expanded="false" role="contentinfo">
             {{#metadata}}
                 <hr />
                 <div class="p-l-3">
                     <dl class="row">
                         <dt class="span3 col-xs-3">
                             {{#link}}
-                                <a href="#{{name}}"><h5 style="word-wrap:break-word">{{name}}</h5></a>
+                                <a href="#{{name}}"><strong style="word-wrap:break-word">{{name}}</strong></a>
                             {{/link}}
                             {{^link}}
-                                <h5 style="word-wrap:break-word">{{name}}</h5>
+                                <strong style="word-wrap:break-word">{{name}}</strong>
                             {{/link}}
                             <div class="small text-muted" style="word-wrap:break-word">{{type}}</div>
                         </dt>
index d87f231..cbf5ed3 100644 (file)
@@ -50,7 +50,7 @@
             "labelattributes": [],
             "helpicon": false
         },
-        "expiredcontexts": "<table class='table'><thead><tr><th class='header c0' scope='col'>Name<div class='commands'><a title='Hide Name' aria-expanded='true' aria-controls='expired-contexts-table_r0_c0 expired-contexts-table_r1_c0 expired-contexts-table_r2_c0 expired-contexts-table_r3_c0 expired-contexts-table_r4_c0 expired-contexts-table_r5_c0 expired-contexts-table_r6_c0 expired-contexts-table_r7_c0 expired-contexts-table_r8_c0 expired-contexts-table_r9_c0 expired-contexts-table_r10_c0 expired-contexts-table_r11_c0 expired-contexts-table_r12_c0 expired-contexts-table_r13_c0 expired-contexts-table_r14_c0 expired-contexts-table_r15_c0 expired-contexts-table_r16_c0 expired-contexts-table_r17_c0 expired-contexts-table_r18_c0 expired-contexts-table_r19_c0' href='#?thide=name'><i class='icon fa fa-minus fa-fw ' aria-hidden='true' title='Hide' aria-label='Hide'></i></a></div>                    </th>                    <th class='header c1' scope='col'>Information<div class='commands'><a title='Hide Information' aria-expanded='true' aria-controls='expired-contexts-table_r0_c1 expired-contexts-table_r1_c1 expired-contexts-table_r2_c1 expired-contexts-table_r3_c1 expired-contexts-table_r4_c1 expired-contexts-table_r5_c1 expired-contexts-table_r6_c1 expired-contexts-table_r7_c1 expired-contexts-table_r8_c1 expired-contexts-table_r9_c1 expired-contexts-table_r10_c1 expired-contexts-table_r11_c1 expired-contexts-table_r12_c1 expired-contexts-table_r13_c1 expired-contexts-table_r14_c1 expired-contexts-table_r15_c1 expired-contexts-table_r16_c1 expired-contexts-table_r17_c1 expired-contexts-table_r18_c1 expired-contexts-table_r19_c1'    href='#?thide=info'><i class='icon fa fa-minus fa-fw ' aria-hidden='true' title='Hide' aria-label='Hide'></i></a></div>                    </th>                    <th class='header c2' scope='col'>Purpose<div class='commands'><a title='Hide Purpose' aria-expanded='true' aria-controls='expired-contexts-table_r0_c2 expired-contexts-table_r1_c2 expired-contexts-table_r2_c2 expired-contexts-table_r3_c2 expired-contexts-table_r4_c2 expired-contexts-table_r5_c2 expired-contexts-table_r6_c2 expired-contexts-table_r7_c2 expired-contexts-table_r8_c2 expired-contexts-table_r9_c2 expired-contexts-table_r10_c2 expired-contexts-table_r11_c2 expired-contexts-table_r12_c2 expired-contexts-table_r13_c2 expired-contexts-table_r14_c2 expired-contexts-table_r15_c2 expired-contexts-table_r16_c2 expired-contexts-table_r17_c2 expired-contexts-table_r18_c2 expired-contexts-table_r19_c2'    href='#?thide=purpose'><i class='icon fa fa-minus fa-fw ' aria-hidden='true' title='Hide' aria-label='Hide'></i></a></div>                    </th>                    <th class='header c3' scope='col'>Category<div class='commands'><a title='Hide Category' aria-expanded='true' aria-controls='expired-contexts-table_r0_c3 expired-contexts-table_r1_c3 expired-contexts-table_r2_c3 expired-contexts-table_r3_c3 expired-contexts-table_r4_c3 expired-contexts-table_r5_c3 expired-contexts-table_r6_c3 expired-contexts-table_r7_c3 expired-contexts-table_r8_c3 expired-contexts-table_r9_c3 expired-contexts-table_r10_c3 expired-contexts-table_r11_c3 expired-contexts-table_r12_c3 expired-contexts-table_r13_c3 expired-contexts-table_r14_c3 expired-contexts-table_r15_c3 expired-contexts-table_r16_c3 expired-contexts-table_r17_c3 expired-contexts-table_r18_c3 expired-contexts-table_r19_c3'    href='#?thide=category'><i class='icon fa fa-minus fa-fw ' aria-hidden='true' title='Hide' aria-label='Hide'></i></a></div>                    </th>                    <th class='header c4' scope='col'>Retention period<div class='commands'><a title='Hide Retention period' aria-expanded='true' aria-controls='expired-contexts-table_r0_c4 expired-contexts-table_r1_c4 expired-contexts-table_r2_c4 expired-contexts-table_r3_c4 expired-contexts-table_r4_c4 expired-contexts-table_r5_c4 expired-contexts-table_r6_c4 expired-contexts-table_r7_c4 expired-contexts-table_r8_c4 expired-contexts-table_r9_c4 expired-contexts-table_r10_c4 expired-contexts-table_r11_c4 expired-contexts-table_r12_c4 expired-contexts-table_r13_c4 expired-contexts-table_r14_c4 expired-contexts-table_r15_c4 expired-contexts-table_r16_c4 expired-contexts-table_r17_c4 expired-contexts-table_r18_c4 expired-contexts-table_r19_c4'    href='#?thide=retentionperiod'><i class='icon fa fa-minus fa-fw ' aria-hidden='true' title='Hide' aria-label='Hide'></i></a></div>                    </th>                    <th class='header c5' scope='col'><a href='#?tsort=timecreated'>Expiry<span class='accesshide '>Sort by Expiry Ascending</span></a>  <i class='icon fa fa-sort-asc fa-fw ' aria-hidden='true' title='Ascending'aria-label='Ascending'></i><div class='commands'><a title='Hide Expiry' aria-expanded='true' aria-controls='expired-contexts-table_r0_c5 expired-contexts-table_r1_c5 expired-contexts-table_r2_c5 expired-contexts-table_r3_c5 expired-contexts-table_r4_c5 expired-contexts-table_r5_c5 expired-contexts-table_r6_c5 expired-contexts-table_r7_c5 expired-contexts-table_r8_c5 expired-contexts-table_r9_c5 expired-contexts-table_r10_c5 expired-contexts-table_r11_c5 expired-contexts-table_r12_c5 expired-contexts-table_r13_c5 expired-contexts-table_r14_c5 expired-contexts-table_r15_c5 expired-contexts-table_r16_c5 expired-contexts-table_r17_c5 expired-contexts-table_r18_c5 expired-contexts-table_r19_c5'    href='#?thide=timecreated'><i class='icon fa fa-minus fa-fw ' aria-hidden='true' title='Hide' aria-label='Hide'></i></a></div>                    </th>                    <th class='header c6' scope='col'><input title='Select all' type='checkbox' value='1' name='selectall' checked='checked'><div class='commands'></div>                    </th>                </tr>            </thead>            <tbody>                <tr class='' id='expired-contexts-table_r0'>                    <td class='cell c0' id='expired-contexts-table_r0_c0'><span class='m-r-1'>Miscellaneous / TC 1</span><i class='icon fa fa-info fa-fw ' aria-hidden='true' title='Miscellaneous / System' aria-label='Miscellaneous / System'></i></td>                    <td class='cell c1' id='expired-contexts-table_r0_c1'><span class='m-r-1'>7 children</span><i class='icon fa fa-info fa-fw ' aria-hidden='true' title='Test book, Glossary 1, Assignment 1, Page 1, Small files, Big file 0, Forum' aria-label='Test book, Glossary 1, Assignment 1, Page 1, Small files, Big file 0, Forum'></i></td>                    <td class='cell c2' id='expired-contexts-table_r0_c2'>Default purpose</td>                    <td class='cell c3' id='expired-contexts-table_r0_c3'>Default category</td>                    <td class='cell c4' id='expired-contexts-table_r0_c4'>1 days</td>                    <td class='cell c5' id='expired-contexts-table_r0_c5'>Thursday, 5 April 2018, 10:29 AM</td>                    <td class='cell c6' id='expired-contexts-table_r0_c6'><input type='checkbox' class='usercheckbox' name='expiredcontext_3' checked='true'></td></tr></tbody></table>"
+        "expiredcontexts": "<table class='table'><tbody><tr><td>This is the table that will contain the list of expired contexts</td></tr></tbody></table>"
     }
 }}
 <div class="container-fluid" data-region="data-deletion">
index 259c59c..caadac1 100644 (file)
@@ -55,7 +55,7 @@
             <h3 id="{{plugin_type_raw}}">{{#pix}}t/collapsed, moodle, {{#str}}expandplugintype, tool_dataprivacy{{/str}}{{/pix}}{{plugin_type}}</h3>
             </a>
         </div>
-        <div class="hide p-b-1" data-plugintarget="{{plugin_type_raw}}" aria-expanded="false">
+        <div class="hide p-b-1" data-plugintarget="{{plugin_type_raw}}" aria-expanded="false" role="contentinfo">
             {{#plugins}}
                 {{> tool_dataprivacy/component_status}}
             {{/plugins}}
index 8875b6c..1c993b2 100644 (file)
         "datarequestsurl": "#"
     }
 }}
-<style>
-    table, th, td {
-        border: 1px solid black;
-        padding: 0.5em;
-    }
-</style>
-<div>
-    <p>{{#str}}emailsalutation, tool_dataprivacy, {{dponame}}{{/str}}</p>
-    <p>{{#str}}requestemailintro, tool_dataprivacy{{/str}}</p>
-    <table>
-        <tr>
-            <th scope="row">
-                {{#str}}requesttype, tool_dataprivacy{{/str}}
-            </th>
-            <td>
-                {{requesttype}}
-            </td>
-        </tr>
-        <tr>
-            <th scope="row">
-                {{#str}}requestfor, tool_dataprivacy{{/str}}
-            </th>
-            <td>
-                {{requestfor}}
-            </td>
-        </tr>
-        {{^forself}}
-        <tr>
-            <th scope="row">
-                {{#str}}requestby, tool_dataprivacy{{/str}}
-            </th>
-            <td>
-                {{requestedby}}
-            </td>
-        </tr>
-        {{/forself}}
-        <tr>
-            <th scope="row">
-                {{#str}}requestcomments, tool_dataprivacy{{/str}}
-            </th>
-            <td>
-                {{{requestcomments}}}
-            </td>
-        </tr>
-        <tr>
-            <th scope="row">
-                {{#str}}daterequested, tool_dataprivacy{{/str}}
-            </th>
-            <td>
-                {{requestdate}}
-            </td>
-        </tr>
-    </table>
-    <hr>
-    <a href="{{datarequestsurl}}">{{#str}}viewrequest, tool_dataprivacy{{/str}}</a>
-</div>
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <style>
+        table, th, td {
+            border: 1px solid black;
+            padding: 0.5em;
+        }
+    </style>
+    <title>{{#str}}datarequestemailsubject, tool_dataprivacy, {{requesttype}}{{/str}}</title>
+</head>
+<body>
+    <div>
+        <p>{{#str}}emailsalutation, tool_dataprivacy, {{dponame}}{{/str}}</p>
+        <p>{{#str}}requestemailintro, tool_dataprivacy{{/str}}</p>
+        <table>
+            <tr>
+                <th scope="row">
+                    {{#str}}requesttype, tool_dataprivacy{{/str}}
+                </th>
+                <td>
+                    {{requesttype}}
+                </td>
+            </tr>
+            <tr>
+                <th scope="row">
+                    {{#str}}requestfor, tool_dataprivacy{{/str}}
+                </th>
+                <td>
+                    {{requestfor}}
+                </td>
+            </tr>
+            {{^forself}}
+                <tr>
+                    <th scope="row">
+                        {{#str}}requestby, tool_dataprivacy{{/str}}
+                    </th>
+                    <td>
+                        {{requestedby}}
+                    </td>
+                </tr>
+            {{/forself}}
+            <tr>
+                <th scope="row">
+                    {{#str}}requestcomments, tool_dataprivacy{{/str}}
+                </th>
+                <td>
+                    {{{requestcomments}}}
+                </td>
+            </tr>
+            <tr>
+                <th scope="row">
+                    {{#str}}daterequested, tool_dataprivacy{{/str}}
+                </th>
+                <td>
+                    {{requestdate}}
+                </td>
+            </tr>
+        </table>
+        <hr>
+        <a href="{{datarequestsurl}}">{{#str}}viewrequest, tool_dataprivacy{{/str}}</a>
+    </div>
+</body>
+</html>
index b61bce1..cae5022 100644 (file)
@@ -30,6 +30,7 @@
 
     Example context (json):
     {
+        "title": "Data request modal title"
     }
 }}
 {{< core/modal }}