MDL-66268 forumreport_summary: Introduce filter scss
[moodle.git] / lib / amd / src / fragment.js
blob0a29f68156c330167b6ce8bf9dcc1f28f4e66b73
1 // This file is part of Moodle - http://moodle.org/
2 //
3 // Moodle is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // Moodle is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16 /**
17  * A way to call HTML fragments to be inserted as required via JavaScript.
18  *
19  * @module     core/fragment
20  * @class      fragment
21  * @package    core
22  * @copyright  2016 Adrian Greeve <adrian@moodle.com>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  * @since      3.1
25  */
26 define(['jquery', 'core/ajax'], function($, ajax) {
28     /**
29      * Loads an HTML fragment through a callback.
30      *
31      * @method loadFragment
32      * @param {string} component Component where callback is located.
33      * @param {string} callback Callback function name.
34      * @param {integer} contextid Context ID of the fragment.
35      * @param {object} params Parameters for the callback.
36      * @return {Promise} JQuery promise object resolved when the fragment has been loaded.
37      */
38     var loadFragment = function(component, callback, contextid, params) {
39         // Change params into required webservice format.
40         var formattedparams = [];
41         for (var index in params) {
42             formattedparams.push({
43                 name: index,
44                 value: params[index]
45             });
46         }
48         return ajax.call([{
49             methodname: 'core_get_fragment',
50             args: {
51                 component: component,
52                 callback: callback,
53                 contextid: contextid,
54                 args: formattedparams
55             }
56         }])[0];
57     };
59     return /** @alias module:core/fragment */{
60         /**
61          * Appends HTML and JavaScript fragments to specified nodes.
62          * Callbacks called by this AMD module are responsible for doing the appropriate security checks
63          * to access the information that is returned. This only does minimal validation on the context.
64          *
65          * @method fragmentAppend
66          * @param {string} component Component where callback is located.
67          * @param {string} callback Callback function name.
68          * @param {integer} contextid Context ID of the fragment.
69          * @param {object} params Parameters for the callback.
70          * @return {Deferred} new promise that is resolved with the html and js.
71          */
72         loadFragment: function(component, callback, contextid, params) {
73             var promise = $.Deferred();
74             loadFragment(component, callback, contextid, params).then(function(data) {
75                 var jsNodes = $(data.javascript);
76                 var allScript = '';
77                 jsNodes.each(function(index, scriptNode) {
78                     scriptNode = $(scriptNode);
79                     var tagName = scriptNode.prop('tagName');
80                     if (tagName && (tagName.toLowerCase() == 'script')) {
81                         if (scriptNode.attr('src')) {
82                             // We only reload the script if it was not loaded already.
83                             var exists = false;
84                             $('script').each(function(index, s) {
85                                 if ($(s).attr('src') == scriptNode.attr('src')) {
86                                     exists = true;
87                                 }
88                                 return !exists;
89                             });
90                             if (!exists) {
91                                 allScript += ' { ';
92                                 allScript += ' node = document.createElement("script"); ';
93                                 allScript += ' node.type = "text/javascript"; ';
94                                 allScript += ' node.src = decodeURI("' + encodeURI(scriptNode.attr('src')) + '"); ';
95                                 allScript += ' document.getElementsByTagName("head")[0].appendChild(node); ';
96                                 allScript += ' } ';
97                             }
98                         } else {
99                             allScript += ' ' + scriptNode.text();
100                         }
101                     }
102                 });
103                 promise.resolve(data.html, allScript);
104                 return;
105             }).fail(function(ex) {
106                 promise.reject(ex);
107             });
108             return promise.promise();
109         }
110     };