Skip to content

Commit

Permalink
CONTRIB-9626 refactor creation of action menus
Browse files Browse the repository at this point in the history
  • Loading branch information
bostelm committed Aug 1, 2024
1 parent 1688fea commit 37c1095
Show file tree
Hide file tree
Showing 7 changed files with 326 additions and 9 deletions.
25 changes: 24 additions & 1 deletion renderable.php
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,30 @@ public function action_link(moodle_url $url, $titlekey, $iconkey, $confirmkey =
$confirmaction = new confirm_action(get_string($confirmkey, 'scheduler'));
}
$act = new action_link($url, $title, $confirmaction, $attributes, $pix);
$act->primary = false;
return $act;
}

/**
* Creates an action menu link with an optional confirmation dialogue attached.
*
* @param moodle_url $url URL of the action
* @param string $titlekey key of the link title
* @param string $iconkey key of the icon to display
* @param string|null $confirmkey key for the confirmation text
* @param string|null $id id attribute of the new link
* @return action_menu_link the new action link
*/
public function action_menu_link(moodle_url $url, $titlekey, $iconkey, $confirmkey = null, $id = null) {
$title = get_string($titlekey, 'scheduler');
$pix = new pix_icon($iconkey, $title, 'moodle', array('class' => 'iconsmall', 'title' => ''));
$attributes = array();
if ($id) {
$attributes['id'] = $id;
}
$act = new action_menu_link($url, $pix, $title, false, $attributes);
if ($confirmkey) {
$act->add_action(new confirm_action(get_string($confirmkey, 'scheduler')));
}
return $act;
}

Expand Down
23 changes: 23 additions & 0 deletions renderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -678,6 +678,29 @@ public function render_scheduler_slot_booker(scheduler_slot_booker $booker) {
return html_writer::table($table);
}

/**
* Renders an action menu component. Enhanced to allow confirmation dialogues in action menu items.
*
* @param action_menu $menu
* @return string HTML
*/
public function render_action_menu(action_menu $menu) {

// We don't want the class icon there!
foreach ($menu->get_secondary_actions() as $action) {
if ($action instanceof \action_menu_link && $action->has_class('icon')) {
$action->attributes['class'] = preg_replace('/(^|\s+)icon(\s+|$)/i', '', $action->attributes['class']);
}
}

if ($menu->is_empty()) {
return '';
}
$context = $menu->export_for_template($this);

return $this->render_from_template('mod_scheduler/action_menu', $context);
}

/**
* Render a command bar.
*
Expand Down
16 changes: 8 additions & 8 deletions teacherview.php
Original file line number Diff line number Diff line change
Expand Up @@ -459,8 +459,8 @@ function scheduler_print_schedulebox(scheduler $scheduler, $studentid, $groupid
$commandbar->title = get_string('actions', 'scheduler');

$addbuttons = array();
$addbuttons[] = $commandbar->action_link(new moodle_url($actionurl, array('what' => 'addsession')), 'addsession', 't/add');
$addbuttons[] = $commandbar->action_link(new moodle_url($actionurl, array('what' => 'addslot')), 'addsingleslot', 't/add');
$addbuttons[] = $commandbar->action_menu_link(new moodle_url($actionurl, array('what' => 'addsession')), 'addsession', 't/add');
$addbuttons[] = $commandbar->action_menu_link(new moodle_url($actionurl, array('what' => 'addslot')), 'addsingleslot', 't/add');
$commandbar->add_group(get_string('addcommands', 'scheduler'), $addbuttons);

// If slots already exist, also show delete buttons.
Expand All @@ -469,23 +469,23 @@ function scheduler_print_schedulebox(scheduler $scheduler, $studentid, $groupid

$delselectedurl = new moodle_url($actionurl, array('what' => 'deleteslots'));
$PAGE->requires->js_call_amd('mod_scheduler/delselected', 'init', [$delselectedurl->out(false)]);
$delselected = $commandbar->action_link($delselectedurl, 'deleteselection', 't/delete',
'confirmdelete-selected', 'delselected');
$delselected = $commandbar->action_menu_link($delselectedurl, 'deleteselection', 't/delete',
'confirmdelete-selected', 'delselected');
$delselected->formid = 'delselected';
$delbuttons[] = $delselected;

if ($permissions->can_edit_all_slots() && $subpage == 'allappointments') {
$delbuttons[] = $commandbar->action_link(
$delbuttons[] = $commandbar->action_menu_link(
new moodle_url($actionurl, array('what' => 'deleteall')),
'deleteallslots', 't/delete', 'confirmdelete-all');
$delbuttons[] = $commandbar->action_link(
$delbuttons[] = $commandbar->action_menu_link(
new moodle_url($actionurl, array('what' => 'deleteallunused')),
'deleteallunusedslots', 't/delete', 'confirmdelete-unused');
}
$delbuttons[] = $commandbar->action_link(
$delbuttons[] = $commandbar->action_menu_link(
new moodle_url($actionurl, array('what' => 'deleteunused')),
'deleteunusedslots', 't/delete', 'confirmdelete-myunused');
$delbuttons[] = $commandbar->action_link(
$delbuttons[] = $commandbar->action_menu_link(
new moodle_url($actionurl, array('what' => 'deleteonlymine')),
'deletemyslots', 't/delete', 'confirmdelete-mine');

Expand Down
63 changes: 63 additions & 0 deletions templates/action_menu.mustache
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
{{!
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 mod_scheduler/action_menu
Action menu. Enhanced to allow confirmation dialogues in action menu items.
Example context (json):
{
"classes": "",
"instance": "1",
"primary": {
"items": [{"rawhtml": "<p>Item in primary menu</p>"}]
},
"secondary": {
"attributes": [
{"name": "id", "value": "action-menu-1-menu"}
],
"items": [
{
"rawhtml": "<p>Item in secondary menu</p>"
}
]
}
}
}}
<div class="action-menu {{classes}}"{{#attributes}} {{name}}="{{value}}"{{/attributes}}>
{{#primary}}

<div class="{{classes}} d-flex "{{#attributes}} {{name}}="{{value}}"{{/attributes}}>

{{#prioritise}}{{> mod_scheduler/action_menu_trigger }}{{/prioritise}}

{{#items}}
<div class="action-menu-item">
{{> mod_scheduler/action_menu_item }}
</div>
{{/items}}

{{^prioritise}}
<div class="action-menu-trigger">
{{> mod_scheduler/action_menu_trigger }}
</div>
{{/prioritise}}

</div>

{{/primary}}
</div>
31 changes: 31 additions & 0 deletions templates/action_menu_item.mustache
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{{!
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 mod_scheduler/action_menu_item
Action menu item. Enhanced to allow confirmation dialogues in action menu items.
Example context (json):
{
"rawhtml": "<p>[rawhtml]</p>"
}
}}
{{#actionmenulink}}{{> mod_scheduler/action_menu_link }}{{/actionmenulink}}
{{#actionmenufiller}}<span class="filler">&nbsp;</span>{{/actionmenufiller}}
{{#actionlink}}{{> core/action_link }}{{/actionlink}}
{{#pixicon}}{{#pix}}{{key}}, {{component}}, {{title}}{{/pix}}{{/pixicon}}
{{#rawhtml}}{{{.}}}{{/rawhtml}}
44 changes: 44 additions & 0 deletions templates/action_menu_link.mustache
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{{!
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 mod_scheduler/action_menu_link
Action menu link. Enhanced to allow confirmation dialogues in action menu items.
Example context (json):
{
"text": "Example link text",
"showtext": true,
"url": "http://example.com/link"
}
}}
{{^disabled}}
<a href="{{url}}" id="{{id}}" class="{{$actionmenulinkclasses}}aabtn {{classes}}{{/actionmenulinkclasses}}" {{#attributes}}{{name}}="{{value}}" {{/attributes}}>
{{#icon}}
{{#pix}}{{key}}, {{component}}, {{title}}{{/pix}}
{{/icon}}
{{#showtext}}
<span class="menu-action-text">{{{text}}}</span>
{{/showtext}}
</a>
{{#hasactions}}
{{> core/actions }}
{{/hasactions}}
{{/disabled}}
{{#disabled}}
<span class="currentlink" role="menuitem">{{#icon}}{{#pix}}{{key}},{{component}},{{title}}{{/pix}}{{/icon}}{{{text}}}</span>
{{/disabled}}
133 changes: 133 additions & 0 deletions templates/action_menu_trigger.mustache
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
{{!
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/action_menu_trigger
Action menu trigger.
Example context (json):
{
"actiontext": "Example link text",
"title": "Example link title",
"triggerrole": "button",
"triggerattributes": [
{"name": "data-boundary", "value": "window" }
],
"url": "http://example.com/link",
"classes": "icon menu-action",
"instance": "1",
"triggerextraclasses": "",
"attributes": [
{"name": "role", "value": "menuitem" },
{"name": "data-title", "value": "mymoodle,admin" }
],
"secondary": {
"classes": "menu align-tr-br",
"dropdownalignment": "dropdown-menu-right",
"attributes": [
{"name": "id", "value": "action-menu-0-menu"},
{"name": "data-rel", "value": "menu-content"},
{"name": "role", "value": "menu"},
{"name": "data-align", "value": "tr-br"}
],
"items": [
{"actionmenulink":
{
"id": "action_link59ecf8394a68078",
"disabled": false,
"text": "Dashboard",
"url": "http://example.com/link",
"icon": {
"key": "i/dashboard",
"component": null,
"title": "Dashboard"
},
"classes": "menu-action",
"attributes": [
{"name": "role", "value": "menuitem"},
{"name": "data-title", "value": "mymoodle,admin"}
],
"instance": 1,
"showtext": true
}
},
{"actionmenufiller":
{
"id": "action_link59ecf8394a68079",
"disabled": false,
"text": "",
"url": "",
"icon": null,
"classes": "",
"attributes": [
{"name": "role", "value": "menuitem"}
]
}
}
]
}
}
}}
<div class="dropdown{{^secondary.items}} hidden{{/secondary.items}}">
<a
href="#"
tabindex="0"
class="{{triggerextraclasses}} dropdown-toggle icon-no-margin"
id="action-menu-toggle-{{instance}}"
aria-label="{{title}}"
data-toggle="dropdown"
role="{{triggerrole}}"
aria-haspopup="true"
aria-expanded="false"
aria-controls="action-menu-{{instance}}-menu"
{{#triggerattributes}}
{{name}}="{{value}}"
{{/triggerattributes}}
>
{{{actiontext}}}
{{{menutrigger}}}
{{#icon}}
{{#pix}}
{{key}},{{component}},{{title}}
{{/pix}}
{{/icon}}
{{#rawicon}}{{{.}}}{{/rawicon}}
{{#menutrigger}}
<b class="caret"></b>
{{/menutrigger}}
</a>
{{#secondary}}
<div class="dropdown-menu {{classes}} {{dropdownalignment}}"{{#attributes}} {{name}}="{{value}}"{{/attributes}}>
{{#items}}
{{#actionmenulink}}
{{< mod_scheduler/action_menu_link}}
{{$actionmenulinkclasses}}dropdown-item {{classes}}{{/actionmenulinkclasses}}
{{/ mod_scheduler/action_menu_link}}
{{/actionmenulink}}
{{#actionmenufiller}}
<div class="dropdown-divider" role="presentation"><span class="filler">&nbsp;</span></div>
{{/actionmenufiller}}
{{#subpanel}}
{{> core/local/action_menu/subpanel}}
{{/subpanel}}
{{#simpleitem}}
<div class="dropdown-item">{{> mod_scheduler/action_menu_item }}</div>
{{/simpleitem}}
{{/items}}
</div>
{{/secondary}}
</div>

0 comments on commit 37c1095

Please sign in to comment.