DRY up header height calculation

This commit is contained in:
Robin Ward 2015-09-02 14:12:40 -04:00
parent a501947d67
commit b3a930f2ed
4 changed files with 34 additions and 36 deletions

View File

@ -1,4 +1,5 @@
import { default as computed, on, observes } from 'ember-addons/ember-computed-decorators'; import { default as computed, on, observes } from 'ember-addons/ember-computed-decorators';
import { headerHeight } from 'discourse/views/header';
const PANEL_BODY_MARGIN = 30; const PANEL_BODY_MARGIN = 30;
const mutationSupport = !!window['MutationObserver']; const mutationSupport = !!window['MutationObserver'];
@ -46,11 +47,7 @@ export default Ember.Component.extend({
$('body').addClass('drop-down-visible'); $('body').addClass('drop-down-visible');
} else { } else {
$panelBody.height('auto'); $panelBody.height('auto');
const $header = $('header.d-header'); this.$().css({ left: "auto", top: headerHeight() + "px" });
const headerOffset = $header.offset();
const headerOffsetTop = (headerOffset) ? headerOffset.top : 0;
const headerHeight = parseInt($header.height() + headerOffsetTop - $window.scrollTop() + 3);
this.$().css({ left: "auto", top: headerHeight + "px" });
$('body').removeClass('drop-down-visible'); $('body').removeClass('drop-down-visible');
} }

View File

@ -5,6 +5,7 @@ import avatarTemplate from 'discourse/lib/avatar-template';
import positioningWorkaround from 'discourse/lib/safari-hacks'; import positioningWorkaround from 'discourse/lib/safari-hacks';
import debounce from 'discourse/lib/debounce'; import debounce from 'discourse/lib/debounce';
import { linkSeenMentions, fetchUnseenMentions } from 'discourse/lib/link-mentions'; import { linkSeenMentions, fetchUnseenMentions } from 'discourse/lib/link-mentions';
import { headerHeight } from 'discourse/views/header';
const ComposerView = Ember.View.extend(Ember.Evented, { const ComposerView = Ember.View.extend(Ember.Evented, {
_lastKeyTimeout: null, _lastKeyTimeout: null,
@ -124,11 +125,7 @@ const ComposerView = Ember.View.extend(Ember.Evented, {
$replyControl.DivResizer({ $replyControl.DivResizer({
maxHeight(winHeight) { maxHeight(winHeight) {
const $header = $('header.d-header'); return winHeight - headerHeight();
const headerOffset = $header.offset();
const headerOffsetTop = (headerOffset) ? headerOffset.top : 0;
const headerHeight = parseInt($header.height() + headerOffsetTop - $(window).scrollTop() + 5);
return winHeight - headerHeight;
}, },
resize: runResize, resize: runResize,
onDrag: (sizePx) => this.movePanels(sizePx) onDrag: (sizePx) => this.movePanels(sizePx)

View File

@ -1,52 +1,55 @@
import { on } from 'ember-addons/ember-computed-decorators';
export default Ember.View.extend({ export default Ember.View.extend({
tagName: 'header', tagName: 'header',
classNames: ['d-header', 'clearfix'], classNames: ['d-header', 'clearfix'],
classNameBindings: ['editingTopic'], classNameBindings: ['editingTopic'],
templateName: 'header', templateName: 'header',
examineDockHeader: function() { examineDockHeader() {
var headerView = this;
// Check the dock after the current run loop. While rendering, // Check the dock after the current run loop. While rendering,
// it's much slower to calculate `outlet.offset()` // it's much slower to calculate `outlet.offset()`
Em.run.next(function () { Ember.run.next(() => {
if (!headerView.docAt) { if (!this.docAt) {
var outlet = $('#main-outlet'); const outlet = $('#main-outlet');
if (!(outlet && outlet.length === 1)) return; if (!(outlet && outlet.length === 1)) return;
headerView.docAt = outlet.offset().top; this.docAt = outlet.offset().top;
} }
var offset = window.pageYOffset || $('html').scrollTop(); const offset = window.pageYOffset || $('html').scrollTop();
if (offset >= headerView.docAt) { if (offset >= this.docAt) {
if (!headerView.dockedHeader) { if (!this.dockedHeader) {
$('body').addClass('docked'); $('body').addClass('docked');
headerView.dockedHeader = true; this.dockedHeader = true;
} }
} else { } else {
if (headerView.dockedHeader) { if (this.dockedHeader) {
$('body').removeClass('docked'); $('body').removeClass('docked');
headerView.dockedHeader = false; this.dockedHeader = false;
} }
} }
}); });
}, },
_tearDown: function() { @on('willDestroyElement')
_tearDown() {
$(window).unbind('scroll.discourse-dock'); $(window).unbind('scroll.discourse-dock');
$(document).unbind('touchmove.discourse-dock'); $(document).unbind('touchmove.discourse-dock');
this.$('a.unread-private-messages, a.unread-notifications, a[data-notifications]').off('click.notifications'); this.$('a.unread-private-messages, a.unread-notifications, a[data-notifications]').off('click.notifications');
$('body').off('keydown.header'); $('body').off('keydown.header');
}.on('willDestroyElement'), },
_setup: function() { @on('didInsertElement')
const self = this; _setup() {
$(window).bind('scroll.discourse-dock', () => this.examineDockHeader());
$(window).bind('scroll.discourse-dock', function() { $(document).bind('touchmove.discourse-dock', () => this.examineDockHeader());
self.examineDockHeader(); this.examineDockHeader();
}); }
$(document).bind('touchmove.discourse-dock', function() {
self.examineDockHeader();
});
self.examineDockHeader();
}.on('didInsertElement')
}); });
export function headerHeight() {
const $header = $('header.d-header');
const headerOffset = $header.offset();
const headerOffsetTop = (headerOffset) ? headerOffset.top : 0;
return parseInt($header.height() + headerOffsetTop - $(window).scrollTop() + 5);
}

View File

@ -73,6 +73,7 @@
//= require ./discourse/components/notifications-button //= require ./discourse/components/notifications-button
//= require ./discourse/components/topic-notifications-button //= require ./discourse/components/topic-notifications-button
//= require ./discourse/lib/link-mentions //= require ./discourse/lib/link-mentions
//= require ./discourse/views/header
//= require ./discourse/views/composer //= require ./discourse/views/composer
//= require ./discourse/lib/show-modal //= require ./discourse/lib/show-modal
//= require ./discourse/lib/screen-track //= require ./discourse/lib/screen-track