question/bank/managecategories/amd/src/datafilter/filtertypes/categories.js

// 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/>.

/**
 * Filter managing display of subcategories questions.
 *
 * @module     qbank_managecategories/datafilter/filtertypes/categories
 * @author     Mark Johnson <mark.johnson@catalyst-eu.net>
 * @copyright  2023 Catalyst IT Europe Ltd.
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

import GenericFilter from 'core/datafilter/filtertype';
import Templates from 'core/templates';

export default class extends GenericFilter {

    SELECTORS = {
        includeSubcategories: 'input[name=category-subcategories]',
    };

    constructor(filterType, rootNode, initialValues, filterOptions = {includeSubcategories: false}) {
        super(filterType, rootNode, initialValues);
        this.addSubcategoryCheckbox(filterOptions.includeSubcategories);
    }

    async addSubcategoryCheckbox(checked = false) {
        const filterValueNode = this.getFilterValueNode();
        const {html} = await Templates.renderForPromise('qbank_managecategories/include_subcategories_checkbox', {
            checked: checked,
        });
        filterValueNode.insertAdjacentHTML('afterend', html);
    }

    get filterOptions() {
        return [
            {name: 'includesubcategories', value: this.filterRoot.querySelector(this.SELECTORS.includeSubcategories).checked}
        ];
    }

    get filterValue() {
        return {
            name: this.name,
            jointype: this.jointype,
            values: this.values,
            filteroptions: this.filterOptions,
        };
    }
}