Skip to content

Commit d54bbee

Browse files
Merge pull request #11 from pavlovicnemanja/master
feat(dropdown): Added smart function for dropdown menus
2 parents c284d16 + 9f4d942 commit d54bbee

File tree

11 files changed

+173
-17
lines changed

11 files changed

+173
-17
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.sass-cache/
22
*.css.map
33
node_modules/
4+
dist/
45
nbproject/

Gruntfile.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ module.exports = function (grunt) {
4646
files: {
4747
'dist/superdesk-ui-framework.js': [
4848
'node_modules/angular-ui-bootstrap/ui-bootstrap.min.js',
49-
'app/scripts/index.js'
49+
'app/scripts/index.js',
50+
'app/scripts/dropdown.js'
5051
]
5152
}
5253
}
@@ -75,6 +76,14 @@ module.exports = function (grunt) {
7576
livereload: true,
7677
spawn: false
7778
}
79+
},
80+
uglify: {
81+
files: ['app/scripts/**/*.js'],
82+
tasks: ['uglify'],
83+
options: {
84+
livereload: true,
85+
spawn: false
86+
}
7887
}
7988
}
8089
});

app/scripts/dropdown.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
'use strict';
2+
3+
sdDropdown.$inject = ['$window'];
4+
function sdDropdown($window) {
5+
return {
6+
link: function (scope, elem) {
7+
var menu = elem.children('.dropdown__menu');
8+
var button = elem.children('[dropdown__toggle]');
9+
10+
var settings = {
11+
isTopOriented: menu.hasClass('dropdown--dropup'),
12+
isRightOriented: menu.hasClass('pull-right'),
13+
isInlineOriented: elem.hasClass('dropdown--dropright') ||
14+
elem.hasClass('dropdown--dropleft')
15+
};
16+
17+
function closeToBottom(event) {
18+
return event.clientY > $window.innerHeight - (menu.outerHeight() + button.outerHeight());
19+
}
20+
21+
function closeToLeft() {
22+
return elem.offset().left < menu.outerWidth();
23+
}
24+
25+
function closeToRight() {
26+
return ($window.innerWidth - elem.offset().left) < menu.outerWidth();
27+
}
28+
29+
button.bind('click mouseover', function (event) {
30+
// Check if menu is near bottom edge
31+
if (closeToBottom(event)) {
32+
elem.addClass('dropdown--dropup');
33+
} else if (!settings.isTopOriented) {
34+
elem.removeClass('dropdown--dropup');
35+
}
36+
37+
// Check if menu is near left edge
38+
if (closeToLeft()) {
39+
menu.removeClass('pull-right');
40+
} else if (settings.isRightOriented) {
41+
menu.addClass('pull-right');
42+
}
43+
44+
// Check if menu is near right edge
45+
if (closeToRight()) {
46+
menu.addClass('pull-right');
47+
} else if (!settings.isRightOriented) {
48+
menu.removeClass('pull-right');
49+
}
50+
});
51+
}
52+
};
53+
}
54+
55+
sdDropdownAppendToBody.$inject = ['$window'];
56+
function sdDropdownAppendToBody($window) {
57+
return {
58+
require: 'dropdown',
59+
link: function (scope, elem, attr, ctrl) {
60+
var button = elem.find('[dropdown__toggle]');
61+
62+
function closeToRight(menu) {
63+
return ($window.innerWidth - elem.offset().left) < menu.outerWidth();
64+
}
65+
66+
scope.$watch(ctrl.isOpen, function (isOpen) {
67+
if (!isOpen)
68+
return false;
69+
70+
var style = {
71+
display: isOpen ? 'block' : 'none',
72+
top: elem.offset().top + button.outerHeight(),
73+
left: elem.offset().left,
74+
opacity: 1
75+
};
76+
77+
scope.$evalAsync(function () {
78+
ctrl.dropdownMenu.css({opacity: 0});
79+
});
80+
81+
scope.$applyAsync(function () {
82+
// Check if menu is near bottom edge
83+
if (elem.hasClass('dropdown--dropup')) {
84+
style.top = elem.offset().top - button.outerHeight() - ctrl.dropdownMenu.outerHeight();
85+
}
86+
87+
// Check if menu is near left edge
88+
if (closeToRight(ctrl.dropdownMenu)) {
89+
style.left = $window.innerWidth - ctrl.dropdownMenu.outerWidth() - 15;
90+
}
91+
92+
// Apply modified css to dropdown menu element
93+
ctrl.dropdownMenu.css(style);
94+
});
95+
});
96+
}
97+
};
98+
}
99+
100+
angular.module('superdesk-ui.dropdown', [])
101+
.directive('dropdown', sdDropdown)
102+
.directive('dropdownAppendToBody', sdDropdownAppendToBody);

app/scripts/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22

33
angular.module('superdesk-ui', [
4-
'ui.bootstrap'
4+
'ui.bootstrap',
5+
'superdesk-ui.dropdown',
56
]);

app/styles/dropdowns/_basic-dropdown.scss

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ $dropdownLinkBackgroundHover: $sd-hover;
121121
button {
122122
width: 100%;
123123
text-align: left;
124+
-webkit-appearance: none;
125+
border: 0;
124126
}
125127
a, button {
126128
display: block;

dist/superdesk-ui-framework.core.css

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/superdesk-ui-framework.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/superdesk-ui-framework.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/superdesk-ui-framework.min.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/js/vendor.js

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)