Project

General

Profile

1 46812 stefanos.g
import { $ } from '../util/index';
2
3
export default function (UIkit) {
4
5
    UIkit.component('height-match', {
6
7
        args: 'target',
8
9
        props: {
10
            target: String,
11
            row: Boolean
12
        },
13
14
        defaults: {
15
            target: '> *',
16
            row: true
17
        },
18
19
        computed: {
20
21
            elements() {
22
                return $(this.target, this.$el);
23
            }
24
25
        },
26
27
        update: {
28
29
            read() {
30
31
                var lastOffset = false;
32
33
                this.elements.css('minHeight', '');
34
35
                this.rows = !this.row
36
                    ? [this.match(this.elements)]
37
                    : this.elements.toArray().reduce((rows, el) => {
38
39
                        if (lastOffset !== el.offsetTop) {
40
                            rows.push([el]);
41
                        } else {
42
                            rows[rows.length - 1].push(el);
43
                        }
44
45
                        lastOffset = el.offsetTop;
46
47
                        return rows;
48
49
                    }, []).map(elements => this.match($(elements)));
50
            },
51
52
            write() {
53
54
                this.rows.forEach(({height, elements}) =>
55
                    elements && elements.each((_, el) =>
56
                        el.style.minHeight = `${height}px`
57
                    )
58
                );
59
60
            },
61
62
            events: ['resize']
63
64
        },
65
66
        methods: {
67
68
            match(elements) {
69
70
                if (elements.length < 2) {
71
                    return {};
72
                }
73
74
                var max = 0, heights = [];
75
76
                elements = elements
77
                    .each((_, el) => {
78
79
                        var $el, style, hidden;
80
81
                        if (el.offsetHeight === 0) {
82
                            $el = $(el);
83
                            style = $el.attr('style') || null;
84
                            hidden = $el.attr('hidden') || null;
85
86
                            $el.attr({
87
                                style: `${style};display:block !important;`,
88
                                hidden: null
89
                            });
90
                        }
91
92
                        max = Math.max(max, el.offsetHeight);
93
                        heights.push(el.offsetHeight);
94
95
                        if ($el) {
96
                            $el.attr({style, hidden});
97
                        }
98
99
                    })
100
                    .filter(i => heights[i] < max);
101
102
                return {height: max, elements};
103
            }
104
        }
105
106
    });
107
108
}