Passed
Branch develop (9d5aa6)
by Nikolay
04:57
created

sites/admin-cabinet/assets/js/src/Language/language-select.js   A

Complexity

Total Complexity 14
Complexity/F 1.75

Size

Lines of Code 112
Function Count 8

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 14
eloc 55
c 0
b 0
f 0
dl 0
loc 112
rs 10
mnd 6
bc 6
fnc 8
bpm 0.75
cpm 1.75
noi 0
1
/*
2
 * MikoPBX - free phone system for small business
3
 * Copyright © 2017-2023 Alexey Portnov and Nikolay Beketov
4
 *
5
 * This program is free software: you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 3 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License along with this program.
16
 * If not, see <https://www.gnu.org/licenses/>.
17
 */
18
/* global globalWebAdminLanguage, globalAvailableLanguages, globalAvailableLanguageFlags, globalTranslate, globalRootUrl, PbxApi*/
19
20
21
/**
22
 * The LanguageSelect object is responsible for changing system interface menu
23
 *
24
 * @module LanguageSelect
25
 */
26
const LanguageSelect = {
27
28
    /**
29
     * Array to store possible language keys.
30
     */
31
    possibleLanguages: [],
32
33
    /**
34
     * Language selector DOM element.
35
     * @type {jQuery}
36
     */
37
    $selector: $('#web-admin-language-selector'),
38
39
    /**
40
     * Initializes the LanguageSelect object.
41
     */
42
    initialize() {
43
        if (LanguageSelect.$selector === undefined) {
44
            // If language selector DOM element is not found, return
45
            return;
46
        }
47
48
        // Initialize the language selector dropdown
49
        LanguageSelect.$selector.dropdown({
50
            values: LanguageSelect.prepareMenu(),  // Set dropdown values using the prepared menu
51
            templates: {
52
                menu: LanguageSelect.customDropdownMenu, // Use custom dropdown menu template
53
            },
54
            onChange: LanguageSelect.onChangeLanguage,  // Handle language change event
55
        });
56
    },
57
58
    /**
59
     * Prepares the dropdown menu for the language selector.
60
     * @returns {Array} The prepared menu items.
61
     */
62
    prepareMenu() {
63
64
        const resArray = [];    // Array to store menu items
65
        const objectAvailableLanguages = JSON.parse(globalAvailableLanguages);  // Parse available languages JSON
66
67
        // Iterate over available languages and prepare dropdown menu items
68
        $.each(objectAvailableLanguages, (key, value) => {
69
            const v = {
70
                name: value.name,
71
                value: key,
72
                flag: value.flag,
73
            };
74
            if (key === globalWebAdminLanguage) {
75
                v.selected = true;  // Set 'selected' property for the current language
76
            }
77
            resArray.push(v); // Add menu item to the array
78
            LanguageSelect.possibleLanguages.push(key); // Add language key to possibleLanguages array
79
        });
80
        return resArray; // Return the prepared menu
81
    },
82
83
    /**
84
     * Custom dropdown menu template.
85
     * @param {object} response - The dropdown menu response.
86
     * @param {object} fields - The dropdown menu fields.
87
     * @returns {string} The HTML for the custom dropdown menu.
88
     */
89
    customDropdownMenu(response, fields) {
90
        const values = response[fields.values] || {};
91
        let html = '';
92
        $.each(values, (index, option) => {
93
            if (html === '') {
94
                html += `<a class="item" target="_blank" href="https://weblate.mikopbx.com/engage/mikopbx/"><i class="pencil alternate icon"></i> ${globalTranslate.lang_HelpWithTranslateIt}</a>`;
95
                html += '<div class="divider"></div>';
96
            }
97
            html += `<div class="item" data-value="${option.value}">`;
98
            html += `<i class="flag ${option.flag}"></i>`; // Add flag icon HTML for a given language key.
99
            html += option.name;
100
            html += '</div>';
101
        });
102
        return html;
103
    },
104
105
    /**
106
     * Handles the language change event.
107
     * @param {string} value - The selected language value.
108
     */
109
    onChangeLanguage(value) {
110
        if (value === globalWebAdminLanguage) {
111
            return;
112
        }
113
        if (!LanguageSelect.possibleLanguages.includes(value)) {
114
            LanguageSelect.$selector.dropdown("set selected", globalWebAdminLanguage);
115
            return;
116
        }
117
        $.api({
118
            url: `${globalRootUrl}language/change/`,
119
            data: {newLanguage: value},
120
            method: 'POST',
121
            on: 'now',
122
            onSuccess(response) {
123
                if (response !== undefined && response.success === true) {
124
                    const event = document.createEvent('Event');
125
                    event.initEvent('ConfigDataChanged', false, true);
126
                    window.dispatchEvent(event);
127
                    window.location.reload();
128
                }
129
            },
130
        });
131
    },
132
};
133
134
// When the document is ready, initialize the language select dropdown
135
$(document).ready(() => {
136
    LanguageSelect.initialize();
137
});
138