dnet45/modules/uoa-repository-dashboard-gui/trunk/src/public/js/core/height-match.js @ 46812
1 |
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 |
}
|