Project

General

Profile

1
import { $, hasTouch, isTouch, pointerEnter, pointerLeave, query } from '../util/index';
2

    
3
export default function (UIkit) {
4

    
5
    UIkit.component('toggle', {
6

    
7
        mixins: [UIkit.mixin.toggable],
8

    
9
        args: 'target',
10

    
11
        props: {
12
            href: String,
13
            target: null,
14
            mode: 'list',
15
            media: 'media'
16
        },
17

    
18
        defaults: {
19
            href: false,
20
            target: false,
21
            mode: 'click',
22
            queued: true,
23
            media: false
24
        },
25

    
26
        computed: {
27

    
28
            target() {
29
                return query(this.$props.target || this.href, this.$el) || this.$el;
30
            }
31

    
32
        },
33

    
34
        events: [
35

    
36
            {
37

    
38
                name: `${pointerEnter} ${pointerLeave}`,
39

    
40
                filter() {
41
                    return ~this.mode.indexOf('hover');
42
                },
43

    
44
                handler(e) {
45
                    if (!isTouch(e)) {
46
                        this.toggle(`toggle${e.type === pointerEnter ? 'show' : 'hide'}`);
47
                    }
48
                }
49

    
50
            },
51

    
52
            {
53

    
54
                name: 'click',
55

    
56
                filter() {
57
                    return ~this.mode.indexOf('click') || hasTouch;
58
                },
59

    
60
                handler(e) {
61

    
62
                    if (!isTouch(e) && !~this.mode.indexOf('click')) {
63
                        return;
64
                    }
65

    
66
                    // TODO better isToggled handling
67
                    var link = $(e.target).closest('a[href]');
68
                    if ($(e.target).closest('a[href="#"], button').length
69
                        || link.length && (
70
                            this.cls
71
                            || !this.target.is(':visible')
72
                            || link.attr('href')[0] === '#' && this.target.is(link.attr('href'))
73
                        )
74
                    ) {
75
                        e.preventDefault();
76
                    }
77

    
78
                    this.toggle();
79
                }
80

    
81
            }
82
        ],
83

    
84
        update: {
85

    
86
            write() {
87

    
88
                if (!~this.mode.indexOf('media') || !this.media) {
89
                    return;
90
                }
91

    
92
                var toggled = this.isToggled(this.target);
93
                if (window.matchMedia(this.media).matches ? !toggled : toggled) {
94
                    this.toggle();
95
                }
96

    
97
            },
98

    
99
            events: ['load', 'resize']
100

    
101
        },
102

    
103
        methods: {
104

    
105
            toggle(type) {
106

    
107
                var event = $.Event(type || 'toggle');
108
                this.target.triggerHandler(event, [this]);
109

    
110
                if (!event.isDefaultPrevented()) {
111
                    this.toggleElement(this.target);
112
                }
113
            }
114

    
115
        }
116

    
117
    });
118

    
119
}
(28-28/28)