Completed
Push — master ( 530622...0684ff )
by D
02:37
created

Tabs.changeCurrent   A

Complexity

Conditions 1

Size

Total Lines 15
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 15
dl 0
loc 15
rs 9.65
c 0
b 0
f 0
cc 1
1
import {define} from "../globals/globals";
2
import {TabsInterface} from "../interfaces/TabsInterface";
3
import {TabsOptions} from "../types/TabsOptions";
4
5
(function (root, factory) {
6
    if (typeof define === 'function' && define.amd) {
7
        define([], factory);
8
    } else if (typeof module === 'object' && module.exports) {
9
        module.exports = factory();
10
    } else {
11
        root!.Tabs = factory();
12
    }
13
}(typeof self !== 'undefined' ? self : this, function () {
14
15
    class Tabs implements TabsInterface {
16
        public options: TabsOptions;
17
18
        constructor(options:TabsOptions) {
19
            this.options = options || {};
20
            this.options.tabTogglers = (Object.keys(this.options).length && options.tabTogglers) ? (typeof options.tabTogglers === 'string' ? document.querySelectorAll(options.tabTogglers) : options.tabTogglers) : document.querySelectorAll('.tabs [data-pane]');
21
            this.onInit();
22
            this.onLoad();
23
        }
24
25
        static clearClasses(arr: NodeListOf<HTMLElement>): void {
26
            arr.forEach(function (el: HTMLElement) {
27
                el.classList.remove('active');
28
            })
29
        }
30
31
        protected onLoad(): void {
32
            if(this.options && (this.options.onLoad as Function)) {
33
                this.options.onLoad!();
34
            }
35
        }
36
37
        protected onInit(): void {
38
            this.setCurrentOnInit();
39
            this.initClasses();
40
            this.changeCurrent();
41
        }
42
43
        private setCurrentOnInit(): void {
44
            let currentTabToggler = (this.options.tabTogglers)[0];
45
            let currentPane: HTMLElement;
46
            if(this.options.tabTogglers[0] instanceof HTMLElement) {
47
                currentPane = document.getElementById(currentTabToggler.dataset.pane)!;
48
            }
49
50
            currentTabToggler.classList.add('active');
51
            currentPane!.classList.add('active');
52
        }
53
54
        private initClasses(): void {
55
            this.options.tabTogglers.forEach(function(tabToggler: HTMLElement) {
56
                let matchedPane = document.getElementById(tabToggler.dataset.pane!) as HTMLElement;
57
                matchedPane!.classList.add('tab-pane')
58
            })
59
        }
60
61
        protected changeCurrent(): void {
62
            let that = this;
63
64
            that.options.tabTogglers.forEach(function (tabToggler: HTMLElement) {
65
                tabToggler.addEventListener('click', function (e: Event) {
66
                    e.preventDefault();
67
68
                    Tabs.clearClasses(that.options.tabTogglers);
69
                    Tabs.clearClasses(document.querySelectorAll('.tab-pane'));
70
71
                    this.classList.add('active');
72
73
                    let matchedPane = document.getElementById(this.dataset.pane!);
74
                    matchedPane!.classList.add('active');
75
                })
76
            })
77
        }
78
    }
79
80
    return Tabs;
81
}));