Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | 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
/**
18
 * Test page for dropdown dialog output component.
19
 *
20
 * @copyright 2023 Ferran Recio <ferran@moodle.com>
21
 * @package   core
22
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23
 */
24
 
25
require_once(__DIR__ . '/../../../../config.php');
26
 
27
defined('BEHAT_SITE_RUNNING') || die();
28
 
29
global $CFG, $PAGE, $OUTPUT;
30
$PAGE->set_url('/lib/tests/behat/fixtures/dropdown_dialog_testpage.php');
31
$PAGE->add_body_class('limitedwidth');
32
require_login();
33
$PAGE->set_context(core\context\system::instance());
34
 
35
echo $OUTPUT->header();
36
 
37
echo "<h2>Dropdown dialog test page</h2>";
38
 
39
echo '<div id="regularscenario" class="mb-4">';
40
echo "<h3>Basic example</h3>";
41
$dialog = new core\output\local\dropdown\dialog('Open dialog', 'Dialog content');
42
echo $OUTPUT->render($dialog);
43
echo '</div>';
44
 
45
echo '<div id="richcontent" class="mb-4">';
46
echo "<h3>Rich content example</h3>";
47
$content = '
48
    <p>Some rich content <b>element</b>.</p>
49
    <ul>
50
        <li>Item 1 <a href="#">Link 1</a></li>
51
        <li>Item 2 <a href="#">Link 2</a></li>
52
    </ul>
53
';
54
$dialog = new core\output\local\dropdown\dialog('Open dialog', $content);
55
echo $OUTPUT->render($dialog);
56
echo '</div>';
57
 
58
echo '<div id="richbutton" class="mb-4">';
59
echo "<h3>Rich button example</h3>";
60
$button = $OUTPUT->pix_icon('t/hide', 'Eye icon') . ' Click to <b>open</b></a>';
61
$dialog = new core\output\local\dropdown\dialog($button, 'Dialog content');
62
echo $OUTPUT->render($dialog);
63
echo '</div>';
64
 
65
echo '<div id="cssoverride" class="mb-4">';
66
echo "<h3>CSS override example</h3>";
67
$dialog = new core\output\local\dropdown\dialog(
68
    'Open dialog',
69
    'Dialog content',
70
    [
71
        'buttonclasses' => 'btn btn-primary extraclass',
72
    ]
73
);
74
echo $OUTPUT->render($dialog);
75
echo '</div>';
76
 
77
echo '<div id="extraattributes" class="mb-4">';
78
echo "<h3>Extra data attributes example</h3>";
79
$dialog = new core\output\local\dropdown\dialog('Open dialog', 'Dialog content', [
80
    'extras' => ['data-foo' => 'bar'],
81
]);
82
echo $OUTPUT->render($dialog);
83
echo '</div>';
84
 
85
echo '<div id="customid" class="mb-4">';
86
echo "<h3>Custom element id</h3>";
87
$dialog = new core\output\local\dropdown\dialog('Open dialog', 'Dialog content', [
88
    'extras' => ['id' => 'CustomDropdownButtonId'],
89
]);
90
echo $OUTPUT->render($dialog);
91
echo '</div>';
92
 
93
$inlinejs = "document.querySelector('#CustomDropdownButtonId button').innerHTML = 'Custom ID button found';";
94
$PAGE->requires->js_amd_inline($inlinejs);
95
 
96
echo '<div id="position" class="mb-4">';
97
echo "<h3>Dropdown position example</h3>";
98
$dialog = new core\output\local\dropdown\dialog('Open dialog', 'Dialog content');
99
$dialog->set_position(core\output\local\dropdown\dialog::POSITION['end']);
100
echo $OUTPUT->render($dialog);
101
echo '</div>';
102
 
103
echo '<div id="widths" class="mb-4">';
104
echo "<h3>Dropdown max width values example</h3>";
105
$content = '
106
    Some long long content. Some long long content. Some long long content. Some long long content.
107
    Some long long content. Some long long content. Some long long content. Some long long content.
108
    Some long long content. Some long long content. Some long long content. Some long long content.
109
';
110
 
111
$dialog = new core\output\local\dropdown\dialog('Default dialog (adaptative)', $content);
112
$dialog->set_classes('mb-3');
113
echo $OUTPUT->render($dialog);
114
 
115
$dialog = new core\output\local\dropdown\dialog('Big dialog', $content);
116
$dialog->set_dialog_width(core\output\local\dropdown\dialog::WIDTH['big']);
117
$dialog->set_classes('mb-3');
118
echo $OUTPUT->render($dialog);
119
 
120
$dialog = new core\output\local\dropdown\dialog('Small dialog', $content);
121
$dialog->set_dialog_width(core\output\local\dropdown\dialog::WIDTH['small']);
122
$dialog->set_classes('mb-3');
123
echo $OUTPUT->render($dialog);
124
echo '</div>';
125
 
126
echo '<div id="dialogjscontrolssection" class="mb-4">';
127
echo "<h3>Dropdown JS module controls</h3>";
128
echo '<div class="mb-2">
129
    <button class="btn btn-secondary" id="buttontext">Change button text</button>
130
    <button class="btn btn-secondary" id="opendropdown">Open</button>
131
    <button class="btn btn-secondary" id="closedropdown">Close</button>
132
    <span id="dialogvisibility"></span>
133
</div>';
134
$dialog = new core\output\local\dropdown\dialog('Open dialog', 'Dialog content', [
135
    'extras' => ['id' => 'dialogjscontrols'],
136
]);
137
echo $OUTPUT->render($dialog);
138
echo '</div>';
139
 
140
$inlinejs = <<<EOF
141
require(
1441 ariadna 142
    ['core/local/dropdown/dialog'],
143
    (Module) => {
1 efrain 144
        const dialog = Module.getDropdownDialog('#dialogjscontrols');
145
 
146
        document.querySelector('#buttontext').addEventListener('click', () => {
147
            dialog.setButtonContent('New button text');
148
        });
149
 
150
        document.querySelector('#opendropdown').addEventListener('click', (e) => {
151
            e.stopPropagation();
152
            dialog.setVisible(true);
153
        });
154
 
155
        document.querySelector('#closedropdown').addEventListener('click', (e) => {
156
            e.stopPropagation();
157
            dialog.setVisible(false);
158
        });
159
 
160
        const visibility = () => {
161
            const text = 'The dropdown is ' + (dialog.isVisible() ? 'visible' : 'hidden') + '.';
162
            document.querySelector('#dialogvisibility').innerHTML = text;
163
        }
164
        visibility();
165
 
1441 ariadna 166
        dialog.getElement().addEventListener('shown.bs.dropdown', (e) => {
1 efrain 167
            visibility();
168
        });
1441 ariadna 169
        dialog.getElement().addEventListener('hidden.bs.dropdown', (e) => {
1 efrain 170
            visibility();
171
        });
172
    }
173
);
174
EOF;
175
$PAGE->requires->js_amd_inline($inlinejs);
176
 
177
echo "<h2>Dropdown status test page</h2>";
178
 
179
echo '<div id="statusregularscenario" class="mb-4">';
180
echo "<h3>Basic example</h3>";
181
$choice = new core\output\choicelist('Dialog content');
182
$choice->add_option('option1', 'Option 1', [
183
    'description' => 'Option 1 description'
184
]);
185
$choice->add_option('option2', 'Option 2', [
186
    'description' => 'Option 2 description',
187
    'icon' => new pix_icon('t/hide', 'Eye icon 1')
188
]);
189
$choice->add_option('option3', 'Option 3', [
190
    'icon' => new pix_icon('t/show', 'Eye icon 2')
191
]);
192
$dialog = new core\output\local\dropdown\status('Open dialog', $choice);
193
echo $OUTPUT->render($dialog);
194
echo '</div>';
195
 
196
echo '<div id="statusselectedscenario" class="mb-4">';
197
echo "<h3>Selected element example</h3>";
198
$choice = new core\output\choicelist('Dialog content');
199
$choice->add_option('option1', 'Option 1', [
200
    'description' => 'Option 1 description',
201
    'icon' => new pix_icon('t/show', 'Eye icon 1')
202
]);
203
$choice->add_option('option2', 'Option 2', [
204
    'description' => 'Option 2 description',
205
    'icon' => new pix_icon('t/hide', 'Eye icon 2')
206
]);
207
$choice->add_option('option3', 'Option 3', [
208
    'description' => 'Option 3 description',
209
    'icon' => new pix_icon('t/stealth', 'Eye icon 3')
210
]);
211
$choice->set_selected_value('option2');
212
$dialog = new core\output\local\dropdown\status('Open dialog', $choice);
213
echo $OUTPUT->render($dialog);
214
echo '</div>';
215
 
216
echo '<div id="statusdisablescenario" class="mb-4">';
217
echo "<h3>Disable option example</h3>";
218
$choice = new core\output\choicelist('Dialog content');
219
$choice->add_option('option1', 'Option 1');
220
$choice->add_option('option2', 'Option 2', [
221
    'description' => 'Option 2 description',
222
    'icon' => new pix_icon('t/hide', 'Eye icon')
223
]);
224
$choice->add_option('option3', 'Option 3');
225
$choice->set_option_disabled('option2', true);
226
$dialog = new core\output\local\dropdown\status('Open dialog', $choice);
227
echo $OUTPUT->render($dialog);
228
echo '</div>';
229
 
230
echo '<div id="statusoptionextrasscenario" class="mb-4">';
231
echo "<h3>Set option extra attributes example</h3>";
232
$choice = new core\output\choicelist('Dialog content');
233
$choice->add_option('option1', 'Option 1');
234
$choice->add_option('option2', 'Option 2', [
235
    'description' => 'Option 2 description',
236
    'icon' => new pix_icon('t/hide', 'Eye icon')
237
]);
238
$choice->add_option('option3', 'Option 3');
239
$choice->set_option_extras('option2', ['data-foo' => 'bar']);
240
$dialog = new core\output\local\dropdown\status('Open dialog', $choice);
241
echo $OUTPUT->render($dialog);
242
echo '</div>';
243
 
244
echo '<div id="statusoptionurl" class="mb-4">';
245
echo "<h3>Set option url example</h3>";
246
$choice = new core\output\choicelist('Dialog content');
247
$choice->add_option('option1', 'Option 1');
248
$choice->add_option('option2', 'Option 2', [
249
    'url' => new moodle_url('/lib/tests/behat/fixtures/dropdown_output_testpage.php', ['foo' => 'bar']),
250
]);
251
$choice->add_option('option3', 'Option 3');
252
$choice->set_option_extras('option2', ['data-foo' => 'bar']);
253
$dialog = new core\output\local\dropdown\status('Open dialog', $choice);
254
echo $OUTPUT->render($dialog);
255
$foo = optional_param('foo', 'none', PARAM_TEXT);
256
echo "<p>Foo param value: $foo</p>";
257
echo '</div>';
258
 
259
echo '<div id="statussyncbutton" class="mb-4">';
260
echo "<h3>Sync button text</h3>";
261
$choice = new core\output\choicelist('Dialog content');
262
$choice->add_option('option1', 'Option 1', [
263
    'description' => 'Option 1 description',
264
    'icon' => new pix_icon('t/show', 'Eye icon 1')
265
]);
266
$choice->add_option('option2', 'Option 2', [
267
    'description' => 'Option 2 description',
268
    'icon' => new pix_icon('t/hide', 'Eye icon 2')
269
]);
270
$choice->add_option('option3', 'Option 3', [
271
    'description' => 'Option 3 description',
272
    'icon' => new pix_icon('t/stealth', 'Eye icon 3')
273
]);
274
$choice->set_selected_value('option2');
275
$dialog = new core\output\local\dropdown\status(
276
    'Open dialog',
277
    $choice,
278
    ['buttonsync' => true, 'updatestatus' => true]
279
);
280
echo '<button class="btn">Focus helper</button>';
281
echo $OUTPUT->render($dialog);
282
echo '</div>';
283
 
284
echo '<div id="statusjscontrolsection" class="mb-4">';
285
echo "<h3>Status JS controls</h3>";
1441 ariadna 286
echo '<div class="mb-2 d-flex gap-2">
1 efrain 287
    <button class="btn btn-secondary" id="setselected">Change selected value</button>
288
    <button class="btn btn-secondary" id="syncbutton">Enable sync</button>
289
    <button class="btn btn-secondary" id="updatestatus">Disable update</button>
1441 ariadna 290
    <span id="statusvalue"></span>';
1 efrain 291
$choice = new core\output\choicelist('Dialog content');
292
$choice->add_option('option1', 'Option 1', [
293
    'description' => 'Option 1 description',
294
    'icon' => new pix_icon('t/show', 'Eye icon 1')
295
]);
296
$choice->add_option('option2', 'Option 2', [
297
    'description' => 'Option 2 description',
298
    'icon' => new pix_icon('t/hide', 'Eye icon 2')
299
]);
300
$choice->add_option('option3', 'Option 3', [
301
    'description' => 'Option 3 description',
302
    'icon' => new pix_icon('t/stealth', 'Eye icon 3')
303
]);
304
$choice->set_selected_value('option2');
305
$dialog = new core\output\local\dropdown\status(
306
    'Open dialog',
307
    $choice,
308
    [
309
        'extras' => ['id' => 'statusjscontrols'],
310
        'updatestatus' => true
311
    ],
312
);
313
echo $OUTPUT->render($dialog);
1441 ariadna 314
echo '</div></div>';
1 efrain 315
 
316
$inlinejs = <<<EOF
317
require(
318
    ['core/local/dropdown/status', 'jquery'],
319
    (Module, jQuery) => {
320
        const status = Module.getDropdownStatus('#statusjscontrols');
321
 
322
        const printValue = () => {
323
            const text = 'The status value is ' + status.getSelectedValue() + '.';
324
            document.querySelector('#statusvalue').innerHTML = text;
325
        }
326
        printValue();
327
 
328
        document.querySelector('#setselected').addEventListener('click', () => {
329
            if (status.getSelectedValue() == 'option2') {
330
                status.setSelectedValue('option3');
331
            } else {
332
                status.setSelectedValue('option2');
333
            }
334
        });
335
 
336
        document.querySelector('#syncbutton').addEventListener('click', (e) => {
337
            if (status.isButtonSyncEnabled()) {
338
                status.setButtonSyncEnabled(false);
339
            } else {
340
                status.setButtonSyncEnabled(true);
341
            }
342
            e.target.innerHTML = (status.isButtonSyncEnabled()) ? 'Disable sync': 'Enable sync';
343
        });
344
 
345
        document.querySelector('#updatestatus').addEventListener('click', (e) => {
346
            if (status.isUpdateStatusEnabled()) {
347
                status.setUpdateStatusEnabled(false);
348
            } else {
349
                status.setUpdateStatusEnabled(true);
350
            }
351
            e.target.innerHTML = (status.isUpdateStatusEnabled()) ? 'Disable update': 'Enable update';
352
        });
353
 
354
        status.getElement().addEventListener('change', () => {
355
            printValue();
356
        });
357
 
358
    }
359
);
360
EOF;
361
$PAGE->requires->js_amd_inline($inlinejs);
362
 
363
echo $OUTPUT->footer();