diff --git a/app/assets/javascripts/admin/components/site-setting.js.es6 b/app/assets/javascripts/admin/components/site-setting.js.es6
index 8b6601b4d37..662e4ef684c 100644
--- a/app/assets/javascripts/admin/components/site-setting.js.es6
+++ b/app/assets/javascripts/admin/components/site-setting.js.es6
@@ -1,12 +1,11 @@
import BufferedContent from 'discourse/mixins/buffered-content';
-import ScrollTop from 'discourse/mixins/scroll-top';
import SiteSetting from 'admin/models/site-setting';
import { propertyNotEqual } from 'discourse/lib/computed';
import computed from 'ember-addons/ember-computed-decorators';
const CustomTypes = ['bool', 'enum', 'list', 'url_list', 'host_list', 'category_list', 'value_list'];
-export default Ember.Component.extend(BufferedContent, ScrollTop, {
+export default Ember.Component.extend(BufferedContent, {
classNameBindings: [':row', ':setting', 'setting.overridden', 'typeClass'],
content: Ember.computed.alias('setting'),
dirty: propertyNotEqual('buffered.value', 'setting.value'),
diff --git a/app/assets/javascripts/admin/templates/badges-index.hbs b/app/assets/javascripts/admin/templates/badges-index.hbs
index 6ee80748f81..c94f59fe105 100644
--- a/app/assets/javascripts/admin/templates/badges-index.hbs
+++ b/app/assets/javascripts/admin/templates/badges-index.hbs
@@ -1,4 +1,4 @@
-
+{{#d-section class="current-badge span13"}}
{{i18n 'admin.badges.none_selected'}}
@@ -6,4 +6,4 @@
{{fa-icon "plus"}} {{i18n 'admin.badges.new'}}
{{/link-to}}
-
+{{/d-section}}
diff --git a/app/assets/javascripts/admin/templates/badges-show.hbs b/app/assets/javascripts/admin/templates/badges-show.hbs
index f29829eba55..e0ae7001df0 100644
--- a/app/assets/javascripts/admin/templates/badges-show.hbs
+++ b/app/assets/javascripts/admin/templates/badges-show.hbs
@@ -1,4 +1,4 @@
-
+{{#d-section class="current-badge span13"}}
-
+{{/d-section}}
{{#if grant_count}}
diff --git a/app/assets/javascripts/admin/templates/site-settings-category.hbs b/app/assets/javascripts/admin/templates/site-settings-category.hbs
index 3e8b088f692..2e44f80c38c 100644
--- a/app/assets/javascripts/admin/templates/site-settings-category.hbs
+++ b/app/assets/javascripts/admin/templates/site-settings-category.hbs
@@ -1,9 +1,9 @@
{{#if filteredContent}}
-
+ {{#d-section class="form-horizontal settings"}}
{{#each filteredContent as |setting|}}
{{site-setting setting=setting saveAction="saveSetting"}}
{{/each}}
-
+ {{/d-section}}
{{else}}
{{i18n 'admin.site_settings.no_results'}}
diff --git a/app/assets/javascripts/admin/templates/user.hbs b/app/assets/javascripts/admin/templates/user.hbs
index c24cd68950a..3b1c7742714 100644
--- a/app/assets/javascripts/admin/templates/user.hbs
+++ b/app/assets/javascripts/admin/templates/user.hbs
@@ -1 +1,3 @@
-{{outlet}}
+{{#d-section}}
+ {{outlet}}
+{{/d-section}}
diff --git a/app/assets/javascripts/admin/views/admin-badges-index.js.es6 b/app/assets/javascripts/admin/views/admin-badges-index.js.es6
deleted file mode 100644
index f0b0ceb85d1..00000000000
--- a/app/assets/javascripts/admin/views/admin-badges-index.js.es6
+++ /dev/null
@@ -1,3 +0,0 @@
-import ScrollTop from 'discourse/mixins/scroll-top';
-
-export default Ember.View.extend(ScrollTop);
diff --git a/app/assets/javascripts/admin/views/admin-badges-show.js.es6 b/app/assets/javascripts/admin/views/admin-badges-show.js.es6
deleted file mode 100644
index 55f7e0b64d8..00000000000
--- a/app/assets/javascripts/admin/views/admin-badges-show.js.es6
+++ /dev/null
@@ -1,7 +0,0 @@
-import ScrollTop from 'discourse/mixins/scroll-top';
-
-export default Ember.View.extend(ScrollTop, {
- _scrollOnModelChange: function() {
- this._scrollTop();
- }.observes('controller.model.id')
-});
diff --git a/app/assets/javascripts/admin/views/admin-user.js.es6 b/app/assets/javascripts/admin/views/admin-user.js.es6
deleted file mode 100644
index 2bd2497f157..00000000000
--- a/app/assets/javascripts/admin/views/admin-user.js.es6
+++ /dev/null
@@ -1 +0,0 @@
-export default Ember.View.extend(Discourse.ScrollTop);
diff --git a/app/assets/javascripts/discourse/components/d-section.js.es6 b/app/assets/javascripts/discourse/components/d-section.js.es6
index 1bb1942003e..41e044f95eb 100644
--- a/app/assets/javascripts/discourse/components/d-section.js.es6
+++ b/app/assets/javascripts/discourse/components/d-section.js.es6
@@ -1,14 +1,9 @@
-import DiscourseURL from 'discourse/lib/url';
+import { scrollTop } from 'discourse/mixins/scroll-top';
// Can add a body class from within a component, also will scroll to the top automatically.
export default Ember.Component.extend({
tagName: 'section',
- _scrollTop() {
- if (Ember.testing) { return; }
- $(document).scrollTop(0);
- },
-
didInsertElement() {
this._super();
@@ -26,8 +21,7 @@ export default Ember.Component.extend({
return;
}
- if (DiscourseURL.isJumpScheduled()) { return; }
- Ember.run.scheduleOnce('afterRender', this, this._scrollTop);
+ scrollTop();
},
willDestroyElement() {
diff --git a/app/assets/javascripts/discourse/components/watch-read.js.es6 b/app/assets/javascripts/discourse/components/watch-read.js.es6
new file mode 100644
index 00000000000..2a92380cbec
--- /dev/null
+++ b/app/assets/javascripts/discourse/components/watch-read.js.es6
@@ -0,0 +1,24 @@
+import isElementInViewport from "discourse/lib/is-element-in-viewport";
+
+export default Ember.Component.extend({
+ didInsertElement() {
+ this._super();
+ const currentUser = this.currentUser;
+ if (!currentUser) { return; }
+
+ const path = this.get('path');
+ if (path === "faq" || path === "guidelines") {
+ $(window).on('load.faq resize.faq scroll.faq', () => {
+ const faqUnread = !currentUser.get('read_faq');
+ if (faqUnread && isElementInViewport($(".contents p").last())) {
+ this.sendAction();
+ }
+ });
+ }
+ },
+
+ willDestroyElement() {
+ this._super();
+ $(window).off('load.faq resize.faq scroll.faq');
+ }
+});
diff --git a/app/assets/javascripts/discourse/controllers/static.js.es6 b/app/assets/javascripts/discourse/controllers/static.js.es6
index 2c31b962c75..166a0676a7f 100644
--- a/app/assets/javascripts/discourse/controllers/static.js.es6
+++ b/app/assets/javascripts/discourse/controllers/static.js.es6
@@ -6,6 +6,9 @@ export default Ember.Controller.extend({
showLoginButton: Em.computed.equal("model.path", "login"),
+ @computed('model.path')
+ bodyClass: path => `static-${path}`,
+
@computed("model.path")
showSignupButton() {
return this.get("model.path") === "login" && this.get('application.canSignUp');
diff --git a/app/assets/javascripts/discourse/mixins/scroll-top.js.es6 b/app/assets/javascripts/discourse/mixins/scroll-top.js.es6
index 35af1d0eee9..5945c73a600 100644
--- a/app/assets/javascripts/discourse/mixins/scroll-top.js.es6
+++ b/app/assets/javascripts/discourse/mixins/scroll-top.js.es6
@@ -1,14 +1,24 @@
import DiscourseURL from 'discourse/lib/url';
+import { deprecated } from 'discourse/mixins/scroll-top';
+
+const context = {
+ _scrollTop() {
+ if (Ember.testing) { return; }
+ $(document).scrollTop(0);
+ }
+};
function scrollTop() {
if (DiscourseURL.isJumpScheduled()) { return; }
- Ember.run.schedule('afterRender', function() {
- $(document).scrollTop(0);
- });
+ Ember.run.scheduleOnce('afterRender', context, context._scrollTop);
}
export default Ember.Mixin.create({
- _scrollTop: scrollTop.on('didInsertElement')
+ didInsertElement() {
+ deprecated('The `ScrollTop` mixin is deprecated. Replace it with a `{{d-section}}` component');
+ this._super();
+ scrollTop();
+ }
});
export { scrollTop };
diff --git a/app/assets/javascripts/discourse/templates/static.hbs b/app/assets/javascripts/discourse/templates/static.hbs
index 91662eb3348..529b5ba149e 100644
--- a/app/assets/javascripts/discourse/templates/static.hbs
+++ b/app/assets/javascripts/discourse/templates/static.hbs
@@ -1,14 +1,16 @@
-
-
- {{plugin-outlet "above-static"}}
- {{{model.html}}}
+{{#d-section bodyClass=bodyClass class="container"}}
+ {{#watch-read action="markFaqRead" path=model.path}}
+
+ {{plugin-outlet "above-static"}}
+ {{{model.html}}}
- {{#if showSignupButton}}
- {{d-button action="showCreateAccount" class="btn-primary sign-up-button" label="sign_up"}}
- {{/if}}
+ {{#if showSignupButton}}
+ {{d-button action="showCreateAccount" class="btn-primary sign-up-button" label="sign_up"}}
+ {{/if}}
- {{#if showLoginButton}}
- {{d-button action="showLogin" class="btn-primary login-button" icon="user" label="log_in"}}
- {{/if}}
-
-
+ {{#if showLoginButton}}
+ {{d-button action="showLogin" class="btn-primary login-button" icon="user" label="log_in"}}
+ {{/if}}
+
+ {{/watch-read}}
+{{/d-section}}
diff --git a/app/assets/javascripts/discourse/templates/user.hbs b/app/assets/javascripts/discourse/templates/user.hbs
index 1d890517e24..fb22c218c36 100644
--- a/app/assets/javascripts/discourse/templates/user.hbs
+++ b/app/assets/javascripts/discourse/templates/user.hbs
@@ -1,5 +1,5 @@
-
-
+
+ {{#d-section class="user-main"}}
{{#unless collapsedInfo}}
@@ -186,5 +186,5 @@
-
+ {{/d-section}}
diff --git a/app/assets/javascripts/discourse/templates/user/activity.hbs b/app/assets/javascripts/discourse/templates/user/activity.hbs
index 72805bb8fd8..c5243f1ffb0 100644
--- a/app/assets/javascripts/discourse/templates/user/activity.hbs
+++ b/app/assets/javascripts/discourse/templates/user/activity.hbs
@@ -1,4 +1,4 @@
-{{#d-section pageClass="user-activity" class="user-nagivation" scrollTop="false"}}
+{{#d-section pageClass="user-activity" class="user-navigation" scrollTop="false"}}
{{#mobile-nav class='activity-nav' desktopClass='action-list activity-list nav-stacked' currentPath=currentPath}}
{{#link-to 'userActivity.index'}}{{i18n 'user.filters.all'}}{{/link-to}}
diff --git a/app/assets/javascripts/discourse/views/static.js.es6 b/app/assets/javascripts/discourse/views/static.js.es6
deleted file mode 100644
index d075558a722..00000000000
--- a/app/assets/javascripts/discourse/views/static.js.es6
+++ /dev/null
@@ -1,40 +0,0 @@
-import isElementInViewport from "discourse/lib/is-element-in-viewport";
-import ScrollTop from 'discourse/mixins/scroll-top';
-import { on } from 'ember-addons/ember-computed-decorators';
-
-export default Ember.View.extend(ScrollTop, {
-
- @on('didInsertElement')
- _addBodyClass() {
- const path = this.get('controller.model.path');
- $('body').addClass(`static-${path}`);
- },
-
- @on('willDestroyElement')
- _removeBodyClass() {
- const path = this.get('controller.model.path');
- $('body').removeClass(`static-${path}`);
- },
-
- @on('didInsertElement')
- _checkRead() {
- const currentUser = this.get('controller.currentUser');
- if (currentUser) {
- const path = this.get('controller.model.path');
- if (path === "faq" || path === "guidelines") {
- const controller = this.get('controller');
- $(window).on('load.faq resize.faq scroll.faq', function() {
- const faqUnread = !currentUser.get('read_faq');
- if (faqUnread && isElementInViewport($(".contents p").last())) {
- controller.send('markFaqRead');
- }
- });
- }
- }
- },
-
- @on('willDestroyElement')
- _stopChecking() {
- $(window).off('load.faq resize.faq scroll.faq');
- }
-});
diff --git a/app/assets/javascripts/discourse/views/user.js.es6 b/app/assets/javascripts/discourse/views/user.js.es6
deleted file mode 100644
index 0b358f18eef..00000000000
--- a/app/assets/javascripts/discourse/views/user.js.es6
+++ /dev/null
@@ -1,4 +0,0 @@
-import ScrollTop from 'discourse/mixins/scroll-top';
-
-export default Ember.View.extend(ScrollTop, {
-});
diff --git a/test/javascripts/acceptance/static-test.js.es6 b/test/javascripts/acceptance/static-test.js.es6
index e3ad8afa386..26bc4e594bc 100644
--- a/test/javascripts/acceptance/static-test.js.es6
+++ b/test/javascripts/acceptance/static-test.js.es6
@@ -4,21 +4,25 @@ acceptance("Static");
test("Static Pages", () => {
visit("/faq");
andThen(() => {
+ ok($('body.static-faq').length, "has the body class");
ok(exists(".body-page"), "The content is present");
});
visit("/guidelines");
andThen(() => {
+ ok($('body.static-guidelines').length, "has the body class");
ok(exists(".body-page"), "The content is present");
});
visit("/tos");
andThen(() => {
+ ok($('body.static-tos').length, "has the body class");
ok(exists(".body-page"), "The content is present");
});
visit("/privacy");
andThen(() => {
+ ok($('body.static-privacy').length, "has the body class");
ok(exists(".body-page"), "The content is present");
});
diff --git a/test/javascripts/acceptance/user-test.js.es6 b/test/javascripts/acceptance/user-test.js.es6
index 045750778e8..36bc916295e 100644
--- a/test/javascripts/acceptance/user-test.js.es6
+++ b/test/javascripts/acceptance/user-test.js.es6
@@ -28,5 +28,6 @@ test("Root URL - Viewing Self", () => {
andThen(() => {
ok($('body.user-summary-page').length, "has the body class");
equal(currentPath(), 'user.summary', "it defaults to summary");
+ ok(exists('.container.viewing-self'), "has the viewing-self class");
});
});
diff --git a/test/javascripts/helpers/create-pretender.js.es6 b/test/javascripts/helpers/create-pretender.js.es6
index 54e33dcf43c..a9a6d769e44 100644
--- a/test/javascripts/helpers/create-pretender.js.es6
+++ b/test/javascripts/helpers/create-pretender.js.es6
@@ -65,9 +65,7 @@ export default function() {
this.get('/users/eviltrout.json', () => {
const json = fixturesByUrl['/users/eviltrout.json'];
- if (loggedIn()) {
- json.user.can_edit = true;
- }
+ json.user.can_edit = loggedIn();
return response(json);
});