Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

{"version":3,"file":"form.min.js","sources":["../src/form.js"],"sourcesContent":["// This file is part of the Zoom plugin for Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Populates or de-populates password field based on whether the\n * password is required or not.\n *\n * @copyright  2018 UC Regents\n * @author     Kubilay Agi\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/form-autocomplete', 'core/str', 'core/notification'], function($, autocomplete, str, notification) {\n\n    /**\n     * CSS selectors used throughout the file.\n     *\n     * @type {object}\n     */\n    var SELECTORS = {\n        REPEAT_SELECT: 'select[name=\"recurrence_type\"]',\n        REPEAT_INTERVAL: '.repeat_interval',\n        REPEAT_INTERVAL_DAILY: '#interval_daily',\n        REPEAT_INTERVAL_WEEKLY: '#interval_weekly',\n        REPEAT_INTERVAL_MONTHLY: '#interval_monthly',\n        REPEAT_INTERVAL_OPTIONS: 'select[name=\"repeat_interval\"] option',\n        START_TIME: 'select[name*=\"start_time\"]',\n        DURATION: '*[name*=\"duration\"]',\n        RECURRING: 'input[name=\"recurring\"][type!=\"hidden\"]',\n        OPTION_JBH: 'input[name=\"option_jbh\"][type!=\"hidden\"]',\n        OPTION_WAITING_ROOM: 'input[name=\"option_waiting_room\"][type!=\"hidden\"]'\n    };\n\n    /**\n     * Repeat interval options.\n     *\n     * @type {object}\n     */\n    var REPEAT_OPTIONS = {\n        REPEAT_OPTION_NONE: 0,\n        REPEAT_OPTION_DAILY: 1,\n        REPEAT_OPTION_WEEKLY: 2,\n        REPEAT_OPTION_MONTHLY: 3\n    };\n\n    /**\n     * The max values for each repeat option.\n     *\n     * @type {object}\n     */\n    var REPEAT_MAX_OPTIONS = {\n        REPEAT_OPTION_DAILY: 90,\n        REPEAT_OPTION_WEEKLY: 12,\n        REPEAT_OPTION_MONTHLY: 3\n    };\n\n    /**\n     * The init function.\n     */\n    var init = function() {\n        var optionJoinBeforeHost = $(SELECTORS.OPTION_JBH);\n        var optionWaitingRoom = $(SELECTORS.OPTION_WAITING_ROOM);\n        optionJoinBeforeHost.change(function() {\n            if (optionJoinBeforeHost.is(':checked') === true) {\n                optionWaitingRoom.prop('checked', false);\n            }\n        });\n        optionWaitingRoom.change(function() {\n            if (optionWaitingRoom.is(':checked') === true) {\n                optionJoinBeforeHost.prop('checked', false);\n            }\n        });\n\n        // First toggle the values based on initial selections.\n        toggleStartTimeDuration();\n        toggleRepeatIntervalText();\n        limitRepeatValues();\n        // Add listerner to \"Repeat Every\" drop-down.\n        $(SELECTORS.REPEAT_SELECT).change(function() {\n            toggleStartTimeDuration();\n            toggleRepeatIntervalText();\n            limitRepeatValues();\n        });\n        // Add listener for the \"Recurring\" checkbox\n        $(SELECTORS.RECURRING).change(function() {\n            toggleStartTimeDuration();\n        });\n\n        var breakoutroomsEditor = new BreakoutroomsEditor();\n        breakoutroomsEditor.init();\n    };\n\n    /**\n     * Toggle start time and duration elements.\n     */\n    var toggleStartTimeDuration = function() {\n        // Disable start time and duration if \"No Fixed Time\" recurring meeting/webinar selected.\n        var disabled = false;\n        var repeatVal = parseInt($(SELECTORS.REPEAT_SELECT).val(), 10);\n        if ($(SELECTORS.RECURRING).prop('checked') && repeatVal === REPEAT_OPTIONS.REPEAT_OPTION_NONE) {\n            disabled = true;\n        }\n        $(SELECTORS.START_TIME).prop('disabled', disabled);\n        $(SELECTORS.DURATION).prop('disabled', disabled);\n    };\n\n    /**\n     * Toggle the text based on repeat type.\n     * To show either Days, Weeks or Months\n     */\n    var toggleRepeatIntervalText = function() {\n        $(SELECTORS.REPEAT_INTERVAL).hide();\n        var repeatSelectVal = parseInt($(SELECTORS.REPEAT_SELECT).val(), 10);\n        if (repeatSelectVal === REPEAT_OPTIONS.REPEAT_OPTION_DAILY) {\n            $(SELECTORS.REPEAT_INTERVAL_DAILY).show();\n        } else if (repeatSelectVal === REPEAT_OPTIONS.REPEAT_OPTION_WEEKLY) {\n            $(SELECTORS.REPEAT_INTERVAL_WEEKLY).show();\n        } else if (repeatSelectVal === REPEAT_OPTIONS.REPEAT_OPTION_MONTHLY) {\n            $(SELECTORS.REPEAT_INTERVAL_MONTHLY).show();\n        }\n    };\n\n    /**\n     * Limit the options shown in the drop-down based on repeat type selected.\n     * Max value for daily meeting is 90.\n     * Max value for weekly meeting is 12.\n     * Max value for monthly meeting is 3.\n     */\n    var limitRepeatValues = function() {\n        var selectedValue = parseInt($(SELECTORS.REPEAT_SELECT).val(), 10);\n        // Restrict options if weekly or monthly option selected.\n        $(SELECTORS.REPEAT_INTERVAL_OPTIONS).each(function() {\n            if (selectedValue === REPEAT_OPTIONS.REPEAT_OPTION_WEEKLY) {\n                if (this.value > REPEAT_MAX_OPTIONS.REPEAT_OPTION_WEEKLY) {\n                    $(this).hide();\n                }\n            } else if (selectedValue === REPEAT_OPTIONS.REPEAT_OPTION_MONTHLY) {\n                if (this.value > REPEAT_MAX_OPTIONS.REPEAT_OPTION_MONTHLY) {\n                    $(this).hide();\n                }\n            } else {\n                $(this).show();\n            }\n        });\n    };\n\n    /**\n     * Tabs component.\n     * @param {object} tabsColumn\n     * @param {object} tabsContentColumn\n     * @param {int}    initialTabsCount\n     * @param {object} emptyAlert\n     */\n    var TabsComponent = function(tabsColumn, tabsContentColumn, initialTabsCount, emptyAlert) {\n        this.tabsColumn = tabsColumn;\n        this.tabsContentColumn = tabsContentColumn;\n        this.emptyAlert = emptyAlert;\n        this.countTabs = initialTabsCount;\n\n        /**\n         * Build tab\n         * @param {object} item\n         * @returns {object} tab element\n         */\n        this.buildTab = function(item) {\n            var tab = item.tab.element;\n            var tabLink = $(\".nav-link\", tab);\n\n            // Setting tab id.\n            tab.attr('id', 'tab-' + this.countTabs);\n\n            // Setting tab name.\n            $(\".tab-name\", tabLink).text(item.tab.name);\n\n            // Setting tab href.\n            tabLink.attr('href', '#link' + this.countTabs);\n\n            // Activating tab\n            $(\"li a\", this.tabsColumn).removeClass('active');\n            tabLink.addClass('active');\n\n            return tab;\n        };\n\n        /**\n         * Build tab content.\n         * @param {object} item\n         * @returns {object} content of tab element\n         */\n        this.buildTabContent = function(item) {\n            var tabContent = item.tabContent.element;\n\n            // Setting tabContent id.\n            tabContent.attr('id', 'link' + this.countTabs);\n\n            // Activating tabContent.\n            $(\".tab-pane\", this.tabsContentColumn).removeClass('active');\n            tabContent.addClass('active');\n\n            return tabContent;\n        };\n\n\n        /**\n         * Add tab\n         * @param {object} item\n         * @returns {object} tab element\n         */\n        this.addTab = function(item) {\n            var tab = this.buildTab(item);\n            var tabContent = this.buildTabContent(item);\n\n            this.emptyAlert.addClass('hidden');\n            $(\"ul\", this.tabsColumn).append(tab);\n            $(\".tab-content\", this.tabsContentColumn).append(tabContent);\n\n            return {\"element\": tab, \"content\": tabContent};\n        };\n\n        /**\n         * Delete tab\n         * @param {object} item\n         */\n        this.deleteTab = function(item) {\n            var tab = item;\n            var tabContent = $($('a', tab).attr('href'));\n\n            tab.remove();\n            tabContent.remove();\n\n            var countTabs = $(\"li\", this.tabsColumn).length;\n            if (!countTabs) {\n                this.emptyAlert.removeClass('hidden');\n            } else {\n                var countActiveTabs = $(\"li a.active\", this.tabsColumn).length;\n                if (!countActiveTabs) {\n                    $(\"li:first-child a\", this.tabsColumn).trigger('click');\n                }\n            }\n        };\n    };\n\n    /**\n     * Breakout rooms editor.\n     */\n    var BreakoutroomsEditor = function() {\n        this.roomsListColumn = $(\"#mod-zoom-meeting-rooms-list\");\n        this.roomsList = $(\"ul\", this.roomsListColumn);\n        this.addBtn = $(\"#add-room\", this.roomsListColumn);\n        this.emptyAlert = $(\".empty-alert\", this.roomsListColumn);\n        this.deleteBtn = $(\".delete-room\", this.roomsListColumn);\n        this.roomsDataColumn = $(\"#mod-zoom-meeting-rooms-data\");\n        this.roomItemToClone = $('#rooms-list-item').html();\n        this.roomItemDataToClone = $('#rooms-list-item-data').html();\n        this.initialRoomsCount = parseInt(this.roomsListColumn.attr('data-initial-rooms-count'));\n        this.tabsComponent = new TabsComponent(this.roomsListColumn, this.roomsDataColumn, this.initialRoomsCount, this.emptyAlert);\n\n        // Add room event.\n        this.init = function() {\n            var stringkeys = [{key: 'room', component: 'zoom'}];\n            str.get_strings(stringkeys).then(function() {\n                return null;\n            }).fail(notification.exception);\n\n            this.addRoomEvent();\n            this.deleteRoomEvent();\n            var countRooms = $(\"li\", this.roomsListColumn).length;\n            if (countRooms) {\n                this.changeRoomNameEvent();\n                this.buildAutocompleteComponents();\n            } else {\n                this.emptyAlert.removeClass('hidden');\n            }\n        };\n        // Add room event.\n        this.addRoomEvent = function() {\n            var thisObject = this;\n\n            // Adding addroom button click event.\n            thisObject.addBtn.click(function() {\n                thisObject.tabsComponent.countTabs++;\n\n                var newRoomName = M.util.get_string('room', 'zoom') + ' ' + thisObject.tabsComponent.countTabs;\n                var newRoomElement = $(thisObject.roomItemToClone);\n                var newRoomDataElement = $(thisObject.roomItemDataToClone);\n                var newRoomIndex = thisObject.tabsComponent.countTabs;\n\n                // Setting new room name.\n                var roomNameInputId = 'room-name-' + newRoomIndex;\n                $(\"input[type=text]\", newRoomDataElement).prev().attr('for', roomNameInputId);\n                $(\"input[type=text]\", newRoomDataElement).attr('id', roomNameInputId);\n                $(\"input[type=text]\", newRoomDataElement).attr('name', roomNameInputId);\n                $(\"input[type=text]\", newRoomDataElement).val(newRoomName);\n                $(\"input[type=text]\", newRoomDataElement).next().attr('name', 'rooms[' + newRoomIndex + ']');\n                $(\"input[type=text]\", newRoomDataElement).next().val(newRoomName);\n\n                // Setting new room participants select id/name.\n                var roomParticipantsSelectId = 'participants-' + newRoomIndex;\n                $(\".room-participants\", newRoomDataElement).attr('id', roomParticipantsSelectId);\n                $(\".room-participants\", newRoomDataElement).attr('name', 'roomsparticipants[' + newRoomIndex + '][]');\n\n                // Setting new room participant groups select id/name.\n                var roomGroupsSelectId = 'groups-' + newRoomIndex;\n                $(\".room-groups\", newRoomDataElement).attr('id', roomGroupsSelectId);\n                $(\".room-groups\", newRoomDataElement).attr('name', 'roomsgroups[' + newRoomIndex + '][]');\n\n                // Add new room tab\n                var newRoom = {\"tab\": {\"name\": newRoomName, \"element\": newRoomElement},\n                    \"tabContent\": {\"element\": newRoomDataElement}};\n\n                var addedTab = thisObject.tabsComponent.addTab(newRoom);\n\n                // Adding new room tab delete button click event.\n                $(\"li:last .delete-room\", thisObject.roomsList).click(function() {\n                    var thisItem = $(this).closest('li');\n                    thisObject.tabsComponent.deleteTab(thisItem);\n                });\n\n                // Adding new room change name event.\n                $(\"input[type=text]\", addedTab.content).on(\"change keyup paste\", function() {\n                    var newHiddenValue = this.value;\n                    $(this).next().val(newHiddenValue);\n\n                    $(\".tab-name\", addedTab.element).text(this.value);\n                });\n\n                // Convert select dropdowns to autocomplete component.\n                thisObject.buildAutocompleteComponent(roomParticipantsSelectId, 'addparticipant');\n                thisObject.buildAutocompleteComponent(roomGroupsSelectId, 'addparticipantgroup');\n            });\n        };\n\n        // Delete room event.\n        this.deleteRoomEvent = function() {\n            var thisObject = this;\n\n            // Adding deleteroom button click event.\n            thisObject.deleteBtn.click(function() {\n                var thisItem = $(this).closest('li');\n                thisObject.tabsComponent.deleteTab(thisItem);\n            });\n        };\n\n        // Change room name event.\n        this.changeRoomNameEvent = function() {\n            var thisObject = this;\n\n            $(\"li\", this.roomsListColumn).each(function() {\n                var tabIdArr = $(this).attr('id').split('-');\n                var tabIndex = tabIdArr[1];\n                $('input[name=\"room-name-' + tabIndex + '\"]', thisObject.roomsDataColumn).on(\"change keyup paste\", function() {\n                    var newHiddenValue = this.value;\n                    $(this).next().val(newHiddenValue);\n\n                    $(\"#tab-\" + tabIndex + \" .tab-name\").text(this.value);\n                });\n            });\n        };\n\n        /**\n         * Build autocomplete components.\n         */\n        this.buildAutocompleteComponents = function() {\n            var thisObject = this;\n            $(\".room-participants\", thisObject.roomsDataColumn).each(function() {\n                var thisItemId = $(this).attr('id');\n                thisObject.buildAutocompleteComponent(thisItemId, 'addparticipant');\n            });\n\n            $(\".room-groups\", thisObject.roomsDataColumn).each(function() {\n                var thisItemId = $(this).attr('id');\n                thisObject.buildAutocompleteComponent(thisItemId, 'addparticipantgroup');\n            });\n        };\n\n        /**\n         * Build autocomplete component.\n         * @param {string} id\n         * @param {string} placeholder\n         */\n        this.buildAutocompleteComponent = function(id, placeholder) {\n            var stringkeys = [{key: placeholder, component: 'zoom'}, {key: 'selectionarea', component: 'zoom'}];\n            str.get_strings(stringkeys).then(function(langstrings) {\n                var placeholderString = langstrings[0];\n                var noSelectionString = langstrings[1];\n\n                autocomplete.enhance('#' + id, false, '', placeholderString, false, true, noSelectionString, true);\n                return null;\n            }).fail(notification.exception);\n        };\n    };\n\n    return {\n        init: init\n    };\n});\n"],"names":["define","$","autocomplete","str","notification","SELECTORS","REPEAT_OPTIONS","REPEAT_MAX_OPTIONS","toggleStartTimeDuration","disabled","repeatVal","parseInt","val","prop","toggleRepeatIntervalText","hide","repeatSelectVal","show","limitRepeatValues","selectedValue","each","this","value","TabsComponent","tabsColumn","tabsContentColumn","initialTabsCount","emptyAlert","countTabs","buildTab","item","tab","element","tabLink","attr","text","name","removeClass","addClass","buildTabContent","tabContent","addTab","append","deleteTab","remove","length","trigger","BreakoutroomsEditor","roomsListColumn","roomsList","addBtn","deleteBtn","roomsDataColumn","roomItemToClone","html","roomItemDataToClone","initialRoomsCount","tabsComponent","init","get_strings","key","component","then","fail","exception","addRoomEvent","deleteRoomEvent","changeRoomNameEvent","buildAutocompleteComponents","thisObject","click","newRoomName","M","util","get_string","newRoomElement","newRoomDataElement","newRoomIndex","roomNameInputId","prev","next","roomParticipantsSelectId","roomGroupsSelectId","newRoom","addedTab","thisItem","closest","content","on","newHiddenValue","buildAutocompleteComponent","tabIndex","split","thisItemId","id","placeholder","stringkeys","langstrings","placeholderString","noSelectionString","enhance","optionJoinBeforeHost","optionWaitingRoom","change","is"],"mappings":"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"}