. /** * Admin settings tabs with a fixed hero above the tab bar. * * @package mod_meetletacbfree * @copyright 2026 MeetLet * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace mod_meetletacbfree\admin; defined('MOODLE_INTERNAL') || die(); /** * Extends Boost tabbed settings so a hero banner stays above all tabs. */ class settingspage_tabs extends \theme_boost_admin_settingspage_tabs { /** @var string HTML rendered above the tab list. */ protected string $herohtml = ''; /** * Set hero markup shown above tabs on every tab switch. */ public function set_hero(string $html): void { $this->herohtml = $html; } /** * @return string */ public function output_html() { global $PAGE; if ($PAGE) { $PAGE->requires->js_call_amd('mod_meetletacbfree/meetlet_modal_scroll', 'init'); $PAGE->requires->js_call_amd('mod_meetletacbfree/settings_registration', 'init'); $PAGE->requires->js_call_amd('mod_meetletacbfree/settings_conntest', 'init'); $PAGE->requires->js_call_amd('mod_meetletacbfree/settings_toggles', 'init'); $PAGE->requires->js_call_amd('mod_meetletacbfree/featureaccess_matrix', 'init'); $PAGE->requires->js_call_amd('mod_meetletacbfree/settings_access_reset', 'init'); } // Scope MeetLet admin CSS under this root (Marketplace CSS guideline). // dir attribute is not processed by Moodle RTLCSS (unlike styles.css values). $attrs = right_to_left() ? ['dir' => 'rtl'] : []; return \html_writer::div( $this->herohtml . parent::output_html(), 'meetlet-admin-settings', $attrs ); } }