diff --git a/app/assets/javascripts/discourse/components/hamburger-menu.js.es6 b/app/assets/javascripts/discourse/components/hamburger-menu.js.es6
index 183df9350db..903c705c61c 100644
--- a/app/assets/javascripts/discourse/components/hamburger-menu.js.es6
+++ b/app/assets/javascripts/discourse/components/hamburger-menu.js.es6
@@ -1,67 +1,6 @@
-import { default as computed, on, observes } from 'ember-addons/ember-computed-decorators';
-
-
+import computed from 'ember-addons/ember-computed-decorators';
export default Ember.Component.extend({
- classNameBindings: ['visible::hidden', 'viewMode'],
- attributeBindings: ['style'],
- elementId: 'hamburger-menu',
- viewMode: 'dropDown',
-
- showClose: Ember.computed.equal('viewMode', 'slide-in'),
-
- @computed('viewMode')
- style(viewMode) {
- if (viewMode === 'drop-down') {
- const $buttonPanel = $('header ul.icons');
-
- const buttonPanelPos = $buttonPanel.offset();
- const myWidth = this.$().width();
-
- const posTop = parseInt(buttonPanelPos.top + $buttonPanel.height());
- const posLeft = parseInt(buttonPanelPos.left + $buttonPanel.width() - myWidth);
-
- return `left: ${posLeft}px; top: ${posTop}px`.htmlSafe();
- } else {
- const headerHeight = parseInt($('header.d-header').height() + 3);
- return `top: ${headerHeight}px`.htmlSafe();
- }
- },
-
- @computed('viewMode')
- bodyStyle(viewMode) {
- if (viewMode === 'drop-down') {
- const height = parseInt($(window).height() * 0.8)
- return `height: ${height}px`.htmlSafe();
- }
- },
-
- @observes('visible')
- _visibleChanged() {
- const isDropdown = (this.get('viewMode') === 'drop-down');
- if (this.get('visible')) {
-
- if (isDropdown) {
- $('.hamburger-dropdown').addClass('active');
- }
-
- if ($(window).width() < 1024) {
- this.set('viewMode', 'slide-in');
- } else {
- this.set('viewMode', 'drop-down');
- }
-
- $('html').on('click.close-hamburger', (e) => {
- const $target = $(e.target);
- if ($target.closest('.hamburger-dropdown').length > 0) { return; }
- if ($target.closest('#hamburger-menu').length > 0) { return; }
- this.hide();
- });
-
- } else {
- $('.hamburger-dropdown').removeClass('active');
- $('html').off('click.close-hamburger');
- }
- },
+ classNames: ['hamburger-panel'],
@computed()
showKeyboardShortcuts() {
@@ -83,29 +22,6 @@ export default Ember.Component.extend({
return this.siteSettings.faq_url ? this.siteSettings.faq_url : Discourse.getURL('/faq');
},
- @on('didInsertElement')
- _bindEvents() {
- this.$().on('click.discourse-hamburger', 'a', () => {
- this.hide();
- });
-
- this.appEvents.on('dropdowns:closeAll', this, this.hide);
-
- $('body').on('keydown.discourse-hambuger', (e) => {
- if (e.which === 27) {
- this.hide();
- }
- });
- },
-
- @on('willDestroyElement')
- _removeEvents() {
- this.appEvents.off('dropdowns:closeAll', this, this.hide);
- this.$().off('click.discourse-hamburger');
- $('body').off('keydown.discourse-hambuger');
- $('html').off('click.close-hamburger');
- },
-
@computed()
categories() {
const hideUncategorized = !this.siteSettings.allow_uncategorized_topics;
@@ -119,14 +35,7 @@ export default Ember.Component.extend({
});
},
- hide() {
- this.set('visible', false);
- },
-
actions: {
- close() {
- this.hide();
- },
keyboardShortcuts() {
this.sendAction('showKeyboardAction');
},
diff --git a/app/assets/javascripts/discourse/components/menu-panel.js.es6 b/app/assets/javascripts/discourse/components/menu-panel.js.es6
new file mode 100644
index 00000000000..962967f82d6
--- /dev/null
+++ b/app/assets/javascripts/discourse/components/menu-panel.js.es6
@@ -0,0 +1,124 @@
+import { default as computed, on, observes } from 'ember-addons/ember-computed-decorators';
+
+export default Ember.Component.extend({
+ classNameBindings: [':menu-panel', 'visible::hidden', 'viewMode'],
+ attributeBindings: ['style'],
+ viewMode: 'dropDown',
+
+ showClose: Ember.computed.equal('viewMode', 'slide-in'),
+
+ @computed('viewMode')
+ style(viewMode) {
+ if (viewMode === 'drop-down') {
+ const $buttonPanel = $('header ul.icons');
+ if ($buttonPanel.length === 0) { return; }
+
+ const buttonPanelPos = $buttonPanel.offset();
+ const myWidth = this.$().width();
+
+ const posTop = parseInt(buttonPanelPos.top + $buttonPanel.height()) - $(window).scrollTop();
+ const posLeft = parseInt(buttonPanelPos.left + $buttonPanel.width() - myWidth);
+
+ return `left: ${posLeft}px; top: ${posTop}px`.htmlSafe();
+ } else {
+ const headerHeight = parseInt($('header.d-header').height() + 3);
+ return `top: ${headerHeight}px`.htmlSafe();
+ }
+ },
+
+ @computed('viewMode')
+ bodyStyle(viewMode) {
+ if (viewMode === 'drop-down') {
+ const height = parseInt($(window).height() * 0.8)
+ return `height: ${height}px`.htmlSafe();
+ }
+ },
+
+ @observes('visible')
+ _visibleChanged() {
+ const force = this.get('force');
+ if (force) {
+ this.set('viewMode', force);
+ } else if ($(window).width() < 1024) {
+ this.set('viewMode', 'slide-in');
+ } else {
+ this.set('viewMode', 'drop-down');
+ }
+
+ const isDropdown = (this.get('viewMode') === 'drop-down');
+ const markActive = this.get('markActive');
+
+ if (this.get('visible')) {
+
+ if (isDropdown && markActive) {
+ $(markActive).addClass('active');
+ }
+
+ $('html').on('click.close-menu-panel', (e) => {
+ const $target = $(e.target);
+ if ($target.closest(markActive).length > 0) { return; }
+ if ($target.closest('.menu-panel').length > 0) { return; }
+ this.hide();
+ });
+
+ } else {
+ if (markActive) {
+ $(markActive).removeClass('active');
+ }
+ $('html').off('click.close-menu-panel');
+ }
+ },
+
+ @computed()
+ showKeyboardShortcuts() {
+ return !Discourse.Mobile.mobileView && !this.capabilities.touch;
+ },
+
+ @computed()
+ showMobileToggle() {
+ return Discourse.Mobile.mobileView || (this.siteSettings.enable_mobile_theme && this.capabilities.touch);
+ },
+
+ @computed()
+ mobileViewLinkTextKey() {
+ return Discourse.Mobile.mobileView ? "desktop_view" : "mobile_view";
+ },
+
+ @computed()
+ faqUrl() {
+ return this.siteSettings.faq_url ? this.siteSettings.faq_url : Discourse.getURL('/faq');
+ },
+
+ @on('didInsertElement')
+ _bindEvents() {
+ this.$().on('click.discourse-menu-panel', 'a', () => {
+ this.hide();
+ });
+
+ this.appEvents.on('dropdowns:closeAll', this, this.hide);
+
+ $('body').on('keydown.discourse-menu-panel', (e) => {
+ if (e.which === 27) {
+ this.hide();
+ }
+ });
+ },
+
+ @on('willDestroyElement')
+ _removeEvents() {
+ this.appEvents.off('dropdowns:closeAll', this, this.hide);
+ this.$().off('click.discourse-menu-panel');
+ $('body').off('keydown.discourse-menu-panel');
+ $('html').off('click.close-menu-panel');
+ },
+
+ hide() {
+ this.set('visible', false);
+ },
+
+ actions: {
+ close() {
+ this.hide();
+ }
+ }
+});
diff --git a/app/assets/javascripts/discourse/templates/application.hbs b/app/assets/javascripts/discourse/templates/application.hbs
index 24926f44871..53cf8fd5c09 100644
--- a/app/assets/javascripts/discourse/templates/application.hbs
+++ b/app/assets/javascripts/discourse/templates/application.hbs
@@ -1,5 +1,5 @@
{{render "header"}}
-{{hamburger-menu visible=hamburgerVisible showKeyboardAction="showKeyboardShortcutsHelp"}}
+{{hamburger-menu hamburgerVisible=hamburgerVisible showKeyboardAction="showKeyboardShortcutsHelp"}}
diff --git a/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs b/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs
index 474e3a3cd24..d92a9cbfe06 100644
--- a/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs
+++ b/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs
@@ -1,82 +1,73 @@
-{{#if visible}}
- {{#if showClose}}
-
- {{/if}}
-
-
-
- {{#if currentUser.staff}}
- -
- {{#link-to "admin" class="admin-link"}}
- {{fa-icon "wrench"}} {{i18n 'admin_title'}}
- {{/link-to}}
-
- -
- {{#link-to "adminFlags" class="flagged-posts-link"}}
- {{fa-icon "flag"}} {{i18n 'flags_title'}}
- {{#if currentUser.site_flagged_posts_count}}
- {{currentUser.site_flagged_posts_count}}
- {{/if}}
- {{/link-to}}
-
- {{/if}}
+{{#menu-panel visible=hamburgerVisible markActive=".hamburger-dropdown"}}
+
+ {{#if currentUser.staff}}
-
- {{#link-to "discovery.latest" class="latest-topics-link"}}
- {{i18n 'filters.latest.title.zero'}}
+ {{#link-to "admin" class="admin-link"}}
+ {{fa-icon "wrench"}} {{i18n 'admin_title'}}
{{/link-to}}
- {{#if siteSettings.enable_badges}}
- -
- {{#link-to 'badges' class="badge-link"}}{{i18n 'badges.title'}}{{/link-to}}
-
- {{/if}}
-
- {{#if siteSettings.enable_user_directory}}
- - {{#link-to 'users' class="user-directory-link"}}{{i18n "directory.title"}}{{/link-to}}
- {{/if}}
-
- {{#if currentUser.show_queued_posts}}
- -
- {{#link-to 'queued-posts'}}
- {{i18n "queue.title"}}
- {{#if currentUser.post_queue_new_count}}
- {{currentUser.post_queue_new_count}}
- {{/if}}
- {{/link-to}}
-
- {{/if}}
-
- {{plugin-outlet "site-map-links"}}
-
- {{#if showKeyboardShortcuts}}
- - {{i18n 'keyboard_shortcuts_help.title'}}
- {{/if}}
-
- {{i18n 'faq'}}
+ {{#link-to "adminFlags" class="flagged-posts-link"}}
+ {{fa-icon "flag"}} {{i18n 'flags_title'}}
+ {{#if currentUser.site_flagged_posts_count}}
+ {{currentUser.site_flagged_posts_count}}
+ {{/if}}
+ {{/link-to}}
+
+ {{/if}}
+ -
+ {{#link-to "discovery.latest" class="latest-topics-link"}}
+ {{i18n 'filters.latest.title.zero'}}
+ {{/link-to}}
+
+ {{#if siteSettings.enable_badges}}
+ -
+ {{#link-to 'badges' class="badge-link"}}{{i18n 'badges.title'}}{{/link-to}}
- -
- {{#link-to 'about' class="about-link"}}{{i18n 'about.simple_title'}}{{/link-to}}
-
- {{#if showMobileToggle}}
- - {{boundI18n mobileViewLinkTextKey}}
- {{/if}}
-
- {{plugin-outlet "site-map-links-last"}}
-
-
- {{#if categories}}
-
- -
- {{#link-to "discovery.categories" class="categories-link"}}{{i18n 'filters.categories.title'}}{{/link-to}}
-
-
- {{#each categories as |c|}}
- {{hamburger-category category=c}}
- {{/each}}
-
{{/if}}
-
-{{/if}}
+ {{#if siteSettings.enable_user_directory}}
+
{{#link-to 'users' class="user-directory-link"}}{{i18n "directory.title"}}{{/link-to}}
+ {{/if}}
+
+ {{#if currentUser.show_queued_posts}}
+
+ {{#link-to 'queued-posts'}}
+ {{i18n "queue.title"}}
+ {{#if currentUser.post_queue_new_count}}
+ {{currentUser.post_queue_new_count}}
+ {{/if}}
+ {{/link-to}}
+
+ {{/if}}
+
+ {{plugin-outlet "site-map-links"}}
+
+ {{#if showKeyboardShortcuts}}
+
{{i18n 'keyboard_shortcuts_help.title'}}
+ {{/if}}
+
+ {{i18n 'faq'}}
+
+
+ {{#link-to 'about' class="about-link"}}{{i18n 'about.simple_title'}}{{/link-to}}
+
+ {{#if showMobileToggle}}
+
{{boundI18n mobileViewLinkTextKey}}
+ {{/if}}
+
+ {{plugin-outlet "site-map-links-last"}}
+
+
+ {{#if categories}}
+
+ -
+ {{#link-to "discovery.categories" class="categories-link"}}{{i18n 'filters.categories.title'}}{{/link-to}}
+
+
+ {{#each categories as |c|}}
+ {{hamburger-category category=c}}
+ {{/each}}
+
+ {{/if}}
+{{/menu-panel}}
diff --git a/app/assets/javascripts/discourse/templates/components/menu-panel.hbs b/app/assets/javascripts/discourse/templates/components/menu-panel.hbs
new file mode 100644
index 00000000000..2a708126447
--- /dev/null
+++ b/app/assets/javascripts/discourse/templates/components/menu-panel.hbs
@@ -0,0 +1,10 @@
+{{#if visible}}
+ {{#if showClose}}
+
+ {{/if}}
+
+ {{yield}}
+
+{{/if}}
diff --git a/app/assets/javascripts/discourse/templates/header.hbs b/app/assets/javascripts/discourse/templates/header.hbs
index 6d833d3f321..7831fe9c61a 100644
--- a/app/assets/javascripts/discourse/templates/header.hbs
+++ b/app/assets/javascripts/discourse/templates/header.hbs
@@ -1,6 +1,5 @@
-
{{home-logo minimized=showExtraInfo}}
@@ -52,7 +51,7 @@
{{fa-icon "bars"}}
{{else}}
-