FIX: Use topic progress widget for jumping to posts

This commit is contained in:
Robin Ward 2016-05-24 17:00:10 -04:00
parent 3c30fa628b
commit a6b2f5ddba
No known key found for this signature in database
GPG Key ID: 0E091E2B4ED1B83D
5 changed files with 66 additions and 40 deletions

View File

@ -2,19 +2,32 @@ import { default as computed, observes } from 'ember-addons/ember-computed-decor
export default Ember.Component.extend({
elementId: 'topic-progress-wrapper',
classNameBindings: ['docked'],
classNameBindings: ['docked', 'hidden'],
expanded: false,
toPostIndex: null,
docked: false,
progressPosition: null,
postStream: Ember.computed.alias('topic.postStream'),
userWantsToJump: null,
init() {
this._super();
(this.get('delegated') || []).forEach(m => this.set(m, m));
},
@computed('userWantsToJump')
hidden(userWantsToJump) {
return !userWantsToJump && !this.site.mobileView;
},
keyboardTrigger(kbdEvent) {
if (kbdEvent.type === 'jump') {
this.set('expanded', true);
this.set('userWantsToJump', true);
Ember.run.scheduleOnce('afterRender', () => this.$('.jump-form input').focus());
}
},
@computed('postStream.loaded', 'progressPosition', 'postStream.filteredPostsCount', 'postStream.highest_post_number')
streamPercentage(loaded, progressPosition, filteredPostsCount, highestPostNumber) {
if (!loaded) { return 0; }
@ -64,11 +77,8 @@ export default Ember.Component.extend({
.on("composer:resized", this, this._dock)
.on("composer:closed", this, this._dock)
.on("topic:scrolled", this, this._dock)
.on('topic:current-post-changed', postNumber => this.set('progressPosition', postNumber));
// Reflows are expensive. Cache the jQuery selector
// and the width when inserted into the DOM
this._$topicProgress = this.$('#topic-progress');
.on('topic:current-post-changed', postNumber => this.set('progressPosition', postNumber))
.on('topic-progress:keyboard-trigger', this, this.keyboardTrigger);
Ember.run.scheduleOnce('afterRender', this, this._updateProgressBar);
},
@ -79,18 +89,22 @@ export default Ember.Component.extend({
.off("composer:resized", this, this._dock)
.off("composer:closed", this, this._dock)
.off('topic:scrolled', this, this._dock)
.off('topic:current-post-changed');
.off('topic:current-post-changed')
.off('topic-progress:keyboard-trigger');
},
_updateProgressBar() {
if (this.get('hidden')) { return; }
const $topicProgress = this.$('#topic-progress');
// speeds up stuff, bypass jquery slowness and extra checks
if (!this._totalWidth) {
this._totalWidth = this._$topicProgress[0].offsetWidth;
this._totalWidth = $topicProgress[0].offsetWidth;
}
const totalWidth = this._totalWidth;
const progressWidth = this.get('streamPercentage') * totalWidth;
this._$topicProgress.find('.bg')
$topicProgress.find('.bg')
.css("border-right-width", (progressWidth === totalWidth) ? "0px" : "1px")
.width(progressWidth);
},
@ -143,6 +157,7 @@ export default Ember.Component.extend({
this.send('jumpPost');
} else if (e.keyCode === 27) {
this.send('toggleExpansion');
this.set('userWantsToJump', false);
}
}
},
@ -151,6 +166,7 @@ export default Ember.Component.extend({
toggleExpansion(opts) {
this.toggleProperty('expanded');
if (this.get('expanded')) {
this.set('userWantsToJump', false);
this.set('toPostIndex', this.get('progressPosition'));
if(opts && opts.highlight){
// TODO: somehow move to view?
@ -175,18 +191,23 @@ export default Ember.Component.extend({
postIndex = this.get('postStream.filteredPostsCount');
}
this.set('toPostIndex', postIndex);
this.set('expanded', false);
this._beforeJump();
this.sendAction('jumpToIndex', postIndex);
},
jumpTop() {
this.set('expanded', false);
this._beforeJump();
this.sendAction('jumpTop');
},
jumpBottom() {
this.set('expanded', false);
this._beforeJump();
this.sendAction('jumpBottom');
}
},
_beforeJump() {
this.set('expanded', false);
this.set('userWantsToJump', false);
}
});

View File

@ -21,6 +21,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, {
enteredAt: null,
enteredIndex: null,
retrying: false,
userTriggeredProgress: null,
topicDelegated: [
'toggleMultiSelect',

View File

@ -159,7 +159,7 @@ export default {
},
toggleProgress() {
this.container.lookup('controller:topic-progress').send('toggleExpansion', {highlight: true});
this.appEvents.trigger('topic-progress:keyboard-trigger', { type: 'jump' });
},
toggleSearch(event) {

View File

@ -1,27 +1,29 @@
{{#if expanded}}
<nav id='topic-progress-expanded'>
{{d-button action="jumpTop"
disabled=jumpTopDisabled
class="full no-text"
icon="caret-up"
label="topic.progress.go_top"}}
<div class='jump-form'>
{{input value=toPostIndex}}
{{d-button action="jumpPost" label="topic.progress.go"}}
{{#unless hidden}}
{{#if expanded}}
<nav id='topic-progress-expanded'>
{{d-button action="jumpTop"
disabled=jumpTopDisabled
class="full no-text"
icon="caret-up"
label="topic.progress.go_top"}}
<div class='jump-form'>
{{input value=toPostIndex}}
{{d-button action="jumpPost" label="topic.progress.go"}}
</div>
{{d-button action="jumpBottom"
disabled=jumpBottomDisabled
class="full no-text jump-bottom"
icon="caret-down"
label="topic.progress.go_bottom"}}
</nav>
{{/if}}
<nav id='topic-progress' title="{{i18n 'topic.progress.title'}}" class="{{if hideProgress 'hidden'}}">
<div class='nums'>
<h4>{{progressPosition}}</h4><span class="{{if hugeNumberOfPosts 'hidden'}}">
<span>/</span>
<h4>{{postStream.filteredPostsCount}}</h4></span>
</div>
{{d-button action="jumpBottom"
disabled=jumpBottomDisabled
class="full no-text jump-bottom"
icon="caret-down"
label="topic.progress.go_bottom"}}
<i class="fa {{unless expanded 'fa-sort'}}"></i>
<div class='bg'>&nbsp;</div>
</nav>
{{/if}}
<nav id='topic-progress' title="{{i18n 'topic.progress.title'}}" class="{{if hideProgress 'hidden'}}">
<div class='nums'>
<h4>{{progressPosition}}</h4><span class="{{if hugeNumberOfPosts 'hidden'}}">
<span>/</span>
<h4>{{postStream.filteredPostsCount}}</h4></span>
</div>
<i class="fa {{unless expanded 'fa-sort'}}"></i>
<div class='bg'>&nbsp;</div>
</nav>
{{/unless}}

View File

@ -77,9 +77,11 @@
loading=model.postStream.loading
delegated=topicDelegated}}
{{else}}
{{topic-progress topic=model delegated=topicDelegated}}
{{topic-admin-menu-button topic=model fixed="true" delegated=topicDelegated}}
{{/if}}
{{topic-progress topic=model delegated=topicDelegated}}
{{conditional-loading-spinner condition=model.postStream.loadingAbove}}
{{plugin-outlet "topic-above-posts"}}