MDL-71788 calendar: Make it easier to copy the calendar URL

Converted the Calendar URL string to a read-only text input containing
the calendar URL. Pressing the "Copy URL" button will copy the calendar
URL to the clipboard.
Fixed Behat tests as well for the export feature. With the calendar URL
in a text input that clips the whole URL, the `preset_what` URL
parameter cannot be seen by the "I should see" step. Worked around
this by checking that the actual value attribute of the calendar URL
text input contains the preset_what parameter.

Plus: Deprecate the calendarurl string. It will be replaced by a new
lang string that does not contain the actual calendar URL.
This commit is contained in:
Jun Pataleta 2021-06-22 14:09:38 +08:00
parent 3610f1ee3b
commit 5c70150450
8 changed files with 121 additions and 9 deletions

2
calendar/amd/build/export.min.js vendored Normal file
View File

@ -0,0 +1,2 @@
define ("core_calendar/export",["exports","core/copy_to_clipboard"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;var b={copyUrlId:"copyexporturl"};a.init=function init(){document.onreadystatechange=function(){if("complete"===document.readyState){var a=document.getElementById(b.copyUrlId);a.removeAttribute("disabled");a.focus()}}}});
//# sourceMappingURL=export.min.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["../src/export.js"],"names":["selectors","copyUrlId","init","document","onreadystatechange","readyState","copyUrl","getElementById","removeAttribute","focus"],"mappings":"+JA8BMA,CAAAA,CAAS,CAAG,CACdC,SAAS,CAAE,eADG,C,QASE,QAAPC,CAAAA,IAAO,EAAM,CAEtBC,QAAQ,CAACC,kBAAT,CAA8B,UAAM,CAChC,GAA4B,UAAxB,GAAAD,QAAQ,CAACE,UAAb,CAAwC,CACpC,GAAMC,CAAAA,CAAO,CAAGH,QAAQ,CAACI,cAAT,CAAwBP,CAAS,CAACC,SAAlC,CAAhB,CACAK,CAAO,CAACE,eAAR,CAAwB,UAAxB,EACAF,CAAO,CAACG,KAAR,EACH,CACJ,CACJ,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * A javascript module to enhance the calendar export form.\n *\n * @module core_calendar/export\n * @copyright 2021 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport 'core/copy_to_clipboard';\n\n/**\n * Selectors for the calendar export page.\n *\n * @property {string} copyUrlId The element ID of the Copy URL button.\n */\nconst selectors = {\n copyUrlId: 'copyexporturl',\n};\n\n/**\n * Initialises the calendar export JS module.\n *\n * @method init\n */\nexport const init = () => {\n // Enable the copy URL button and focus on it after the page has loaded.\n document.onreadystatechange = () => {\n if (document.readyState === 'complete') {\n const copyUrl = document.getElementById(selectors.copyUrlId);\n copyUrl.removeAttribute('disabled');\n copyUrl.focus();\n }\n };\n};\n"],"file":"export.min.js"}

View File

@ -0,0 +1,49 @@
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* A javascript module to enhance the calendar export form.
*
* @module core_calendar/export
* @copyright 2021 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
import 'core/copy_to_clipboard';
/**
* Selectors for the calendar export page.
*
* @property {string} copyUrlId The element ID of the Copy URL button.
*/
const selectors = {
copyUrlId: 'copyexporturl',
};
/**
* Initialises the calendar export JS module.
*
* @method init
*/
export const init = () => {
// Enable the copy URL button and focus on it after the page has loaded.
document.onreadystatechange = () => {
if (document.readyState === 'complete') {
const copyUrl = document.getElementById(selectors.copyUrlId);
copyUrl.removeAttribute('disabled');
copyUrl.focus();
}
};
};

View File

@ -151,8 +151,9 @@ if ($data = $exportform->get_data()) {
$link = new moodle_url('/calendar/export_execute.php', $params);
if (!empty($data->generateurl)) {
$urlclasses = array('class' => 'generalbox calendarurl');
$calendarurl = html_writer::tag( 'div', get_string('calendarurl', 'calendar', $link->out()), $urlclasses);
$exporturlcontext = ['calendarexporturl' => $link->out(false)];
$exporturl = $OUTPUT->render_from_template('core_calendar/export_calendar_url', $exporturlcontext);
$calendarurl = html_writer::div($exporturl, 'generalbox calendarurl mt-3');
}
if (!empty($data->export)) {

View File

@ -0,0 +1,52 @@
{{!
This file is part of Moodle - http://moodle.org/
Moodle is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Moodle is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Moodle. If not, see <http://www.gnu.org/licenses/>.
}}
{{!
@template core_calendar/export_calendar_url
Template for the URL for the exported calendar.
Example context (json):
{
"calendarexporturl": "https://www.moodle.org"
}
}}
<div class="card">
<div class="card-body alert-info">
<div class="form-group">
<label for="calendarexporturl">{{#str}}calendarexporturl, calendar{{/str}}</label>
<div class="input-group">
<input type="text" id="calendarexporturl" class="form-control" value="{{calendarexporturl}}" readonly />
<div class="input-group-append">
<button id="copyexporturl" {{!
}} data-action="copytoclipboard"{{!
}} data-clipboard-target="#calendarexporturl"{{!
}} data-clipboard-success-message="{{#str}}calendarurlcopiedtoclipboard, core_calendar{{/str}}"{{!
}} class="btn btn-secondary"{{!
}} aria-label="{{#str}}copycalendarurl, calendar{{/str}}"{{!
}} disabled>
{{#str}}copyurl, calendar{{/str}}
</button>
</div>
</div>
</div>
</div>
</div>
{{#js}}
require(['core_calendar/export'], function(calendarExport) {
calendarExport.init();
});
{{/js}}

View File

@ -1,4 +1,4 @@
@core @core_calendar @core_calendar_export
@core @core_calendar
Feature: Export calendar events
In order to be able to use my calendar events outside of Moodle
As a user
@ -30,7 +30,7 @@ Feature: Export calendar events
And I set the field "All events" to "1"
And I set the field "Recent and next 60 days" to "1"
When I click on "Get calendar URL" "button"
Then I should see "&preset_what=all&"
Then the "value" attribute of "Calendar URL" "field" should contain "&preset_what=all&"
Scenario: Generating calendar URL for course events
Given I follow "This month"
@ -38,7 +38,7 @@ Feature: Export calendar events
And I set the field "Events related to courses" to "1"
And I set the field "Recent and next 60 days" to "1"
When I click on "Get calendar URL" "button"
Then I should see "&preset_what=courses&"
Then the "value" attribute of "Calendar URL" "field" should contain "&preset_what=courses&"
Scenario: Generating calendar URL for group events
Given I follow "This month"
@ -46,7 +46,7 @@ Feature: Export calendar events
And I set the field "Events related to groups" to "1"
And I set the field "Recent and next 60 days" to "1"
When I click on "Get calendar URL" "button"
Then I should see "&preset_what=groups&"
Then the "value" attribute of "Calendar URL" "field" should contain "&preset_what=groups&"
Scenario: Generating calendar URL for category events
Given I follow "This month"
@ -54,7 +54,7 @@ Feature: Export calendar events
And I set the field "Events related to categories" to "1"
And I set the field "Recent and next 60 days" to "1"
When I click on "Get calendar URL" "button"
Then I should see "&preset_what=categories&"
Then the "value" attribute of "Calendar URL" "field" should contain "&preset_what=categories&"
Scenario: Generating calendar URL for user events
Given I follow "This month"
@ -62,4 +62,4 @@ Feature: Export calendar events
And I set the field "My personal events" to "1"
And I set the field "Recent and next 60 days" to "1"
When I click on "Get calendar URL" "button"
Then I should see "&preset_what=user&"
Then the "value" attribute of "Calendar URL" "field" should contain "&preset_what=user&"

View File

@ -28,10 +28,11 @@ $string['addevent'] = 'Add events';
$string['annually'] = 'Annually';
$string['activityevent'] = 'Activity event';
$string['calendar'] = 'Calendar';
$string['calendarexporturl'] = 'Calendar URL';
$string['calendarheading'] = '{$a} Calendar';
$string['calendarpreferences'] = 'Calendar preferences';
$string['calendartypes'] = 'Calendar types';
$string['calendarurl'] = 'Calendar URL: {$a}';
$string['calendarurlcopiedtoclipboard'] = 'Calendar URL copied to clipboard';
$string['category'] = 'Category';
$string['categoryevent'] = 'Category event';
$string['clickhide'] = 'click to hide';
@ -43,6 +44,8 @@ $string['colactions'] = 'Actions';
$string['commontasks'] = 'Options';
$string['confirmeventdelete'] = 'Are you sure you want to delete the "{$a}" event?';
$string['confirmeventseriesdelete'] = 'The "{$a->name}" event is part of a series. Do you want to delete just this event, or all {$a->count} events in the series?';
$string['copycalendarurl'] = 'Copy calendar URL';
$string['copyurl'] = 'Copy URL';
$string['course'] = 'Course';
$string['courseevent'] = 'Course event';
$string['courseevents'] = 'Course events';
@ -275,6 +278,9 @@ $string['whendate'] = 'When: {$a}';
$string['yesterday'] = 'Yesterday';
$string['youcandeleteallrepeats'] = 'This event is part of a repeating event series. You can delete this event only, or all {$a} events in the series at once.';
// Deprecated since Moodle 4.0.
$string['calendarurl'] = 'Calendar URL: {$a}';
// Deprecated since Moodle 3.8.
$string['global'] = 'Global';
$string['globalevent'] = 'Global event';

View File

@ -94,6 +94,7 @@ updatesite,core_hub
unregisterexplained,core_hub
configrequestcategoryselection,core_admin
requestcategoryselection,core_admin
calendarurl,core_calendar
global,core_calendar
globalevent,core_calendar
globalevents,core_calendar