diff --git a/app/assets/javascripts/admin/helpers/human-size.js.es6 b/app/assets/javascripts/admin/helpers/human-size.js.es6
index 34d17402da9..a43897c627e 100644
--- a/app/assets/javascripts/admin/helpers/human-size.js.es6
+++ b/app/assets/javascripts/admin/helpers/human-size.js.es6
@@ -1,3 +1,3 @@
-Em.Handlebars.helper('human-size', function(size) {
- return new Handlebars.SafeString(I18n.toHumanSize(size));
-});
+import { htmlHelper } from 'discourse/lib/helpers';
+
+export default htmlHelper(size => I18n.toHumanSize(size));
diff --git a/app/assets/javascripts/admin/helpers/preserve-newlines.js.es6 b/app/assets/javascripts/admin/helpers/preserve-newlines.js.es6
index aeb9f30b377..5f70a2acc84 100644
--- a/app/assets/javascripts/admin/helpers/preserve-newlines.js.es6
+++ b/app/assets/javascripts/admin/helpers/preserve-newlines.js.es6
@@ -1,3 +1,3 @@
-Em.Handlebars.helper('preserve-newlines', str => {
- return new Handlebars.SafeString(Discourse.Utilities.escapeExpression(str).replace(/\n/g, "
"));
-});
+import { htmlHelper } from 'discourse/lib/helpers';
+
+export default htmlHelper(str => Discourse.Utilities.escapeExpression(str).replace(/\n/g, "
"));
diff --git a/app/assets/javascripts/admin/helpers/value-at-tl.js.es6 b/app/assets/javascripts/admin/helpers/value-at-tl.js.es6
index 8fdc4e5d2bf..aeac49e83d6 100644
--- a/app/assets/javascripts/admin/helpers/value-at-tl.js.es6
+++ b/app/assets/javascripts/admin/helpers/value-at-tl.js.es6
@@ -1,4 +1,4 @@
-import registerUnbound from 'discourse/helpers/register-unbound';
+import { registerUnbound } from 'discourse/lib/helpers';
registerUnbound('value-at-tl', function(data, params) {
var tl = parseInt(params.level, 10);
diff --git a/app/assets/javascripts/admin/templates/customize-css-html-show.hbs b/app/assets/javascripts/admin/templates/customize-css-html-show.hbs
index 387cf32d705..024c670845d 100644
--- a/app/assets/javascripts/admin/templates/customize-css-html-show.hbs
+++ b/app/assets/javascripts/admin/templates/customize-css-html-show.hbs
@@ -32,7 +32,7 @@
{
const hash = params.hash;
- return new Handlebars.SafeString(renderSpinner((hash && hash.size) ? hash.size : undefined));
+ return renderSpinner((hash && hash.size) ? hash.size : undefined);
});
export { spinnerHTML, renderSpinner };
diff --git a/app/assets/javascripts/discourse/helpers/max-usernames.js.es6 b/app/assets/javascripts/discourse/helpers/max-usernames.js.es6
index 4eb136e2afa..fd4b6819cdf 100644
--- a/app/assets/javascripts/discourse/helpers/max-usernames.js.es6
+++ b/app/assets/javascripts/discourse/helpers/max-usernames.js.es6
@@ -1,4 +1,4 @@
-import registerUnbound from 'discourse/helpers/register-unbound';
+import { registerUnbound } from 'discourse/lib/helpers';
registerUnbound('max-usernames', function(usernames, params) {
var maxLength = parseInt(params.max) || 3;
diff --git a/app/assets/javascripts/discourse/helpers/period-title.js.es6 b/app/assets/javascripts/discourse/helpers/period-title.js.es6
index d8267547a77..ee18503b062 100644
--- a/app/assets/javascripts/discourse/helpers/period-title.js.es6
+++ b/app/assets/javascripts/discourse/helpers/period-title.js.es6
@@ -1,3 +1,5 @@
+import { htmlHelper } from 'discourse/lib/helpers';
+
const TITLE_SUBS = {
all: 'all_time',
yearly: 'this_year',
@@ -6,7 +8,7 @@ const TITLE_SUBS = {
daily: 'today',
};
-export default Ember.Handlebars.makeBoundHelper(function (period, options) {
+export default htmlHelper((period, options) => {
const title = I18n.t('filters.top.' + (TITLE_SUBS[period] || 'this_week'));
if (options.hash.showDateRange) {
var dateString = "";
@@ -27,8 +29,9 @@ export default Ember.Handlebars.makeBoundHelper(function (period, options) {
dateString = moment().format(I18n.t('dates.full_no_year_no_time'));
break;
}
- return new Handlebars.SafeString(title + "
" + dateString + "");
+
+ return `${title}
${dateString}`;
} else {
- return new Handlebars.SafeString(title);
+ return title;
}
});
diff --git a/app/assets/javascripts/discourse/helpers/plugin-outlet.js.es6 b/app/assets/javascripts/discourse/helpers/plugin-outlet.js.es6
index f55beeba54c..b15685f0e6c 100644
--- a/app/assets/javascripts/discourse/helpers/plugin-outlet.js.es6
+++ b/app/assets/javascripts/discourse/helpers/plugin-outlet.js.es6
@@ -46,13 +46,7 @@
The list of disabled plugins is returned via the `Site` singleton.
**/
-
-// TODO: Add all plugin-outlet names dynamically
-const rewireableOutlets = [
- 'hamburger-admin'
-];
-
-const _rewires = {};
+import { registerHelper } from 'discourse/lib/helpers';
let _connectorCache, _rawCache;
@@ -73,14 +67,6 @@ function findOutlets(collection, callback) {
let outletName = segments[segments.length-2];
const uniqueName = segments[segments.length-1];
- const outletRewires = _rewires[outletName];
- if (outletRewires) {
- const newOutlet = outletRewires[uniqueName];
- if (newOutlet) {
- outletName = newOutlet;
- }
- }
-
callback(outletName, res, uniqueName);
}
});
@@ -144,7 +130,6 @@ function viewInjections(container) {
// unbound version of outlets, only has a template
Handlebars.registerHelper('plugin-outlet', function(name){
-
if (!_rawCache) { buildConnectorCache(); }
const functions = _rawCache[name];
@@ -160,7 +145,7 @@ Handlebars.registerHelper('plugin-outlet', function(name){
});
-Ember.HTMLBars._registerHelper('plugin-outlet', function(params, hash, options, env) {
+registerHelper('plugin-outlet', function(params, hash, options, env) {
const connectionName = params[0];
if (!_connectorCache) { buildConnectorCache(); }
@@ -190,11 +175,5 @@ Ember.HTMLBars._registerHelper('plugin-outlet', function(params, hash, options,
}
});
-// Allow plugins to rewire outlets to new outlets if they exist. For example, the akismet
-// plugin will use `hamburger-admin` if it exists, otherwise `site-menu-links`
-export function rewire(uniqueName, outlet, wantedOutlet) {
- if (rewireableOutlets.indexOf(wantedOutlet) !== -1) {
- _rewires[outlet] = _rewires[outlet] || {};
- _rewires[outlet][uniqueName] = wantedOutlet;
- }
-}
+// No longer used
+export function rewire() { }
diff --git a/app/assets/javascripts/discourse/helpers/raw.js.es6 b/app/assets/javascripts/discourse/helpers/raw.js.es6
index fbef46ff04d..b7c89470f7b 100644
--- a/app/assets/javascripts/discourse/helpers/raw.js.es6
+++ b/app/assets/javascripts/discourse/helpers/raw.js.es6
@@ -1,4 +1,4 @@
-import registerUnbound from 'discourse/helpers/register-unbound';
+import { registerUnbound } from 'discourse/lib/helpers';
// see: https://github.com/emberjs/ember.js/issues/12634
var missingViews = {};
diff --git a/app/assets/javascripts/discourse/helpers/shorten-url.js.es6 b/app/assets/javascripts/discourse/helpers/shorten-url.js.es6
index 39152fd7370..4862b04d78d 100644
--- a/app/assets/javascripts/discourse/helpers/shorten-url.js.es6
+++ b/app/assets/javascripts/discourse/helpers/shorten-url.js.es6
@@ -1,4 +1,4 @@
-import registerUnbound from 'discourse/helpers/register-unbound';
+import { registerUnbound } from 'discourse/lib/helpers';
registerUnbound('shorten-url', function(url) {
var matches = url.match(/\//g);
diff --git a/app/assets/javascripts/discourse/helpers/topic-link.js.es6 b/app/assets/javascripts/discourse/helpers/topic-link.js.es6
index 579aecf4dff..ca03e990d0c 100644
--- a/app/assets/javascripts/discourse/helpers/topic-link.js.es6
+++ b/app/assets/javascripts/discourse/helpers/topic-link.js.es6
@@ -1,4 +1,4 @@
-import registerUnbound from 'discourse/helpers/register-unbound';
+import { registerUnbound } from 'discourse/lib/helpers';
registerUnbound('topic-link', function(topic) {
var title = topic.get('fancyTitle');
diff --git a/app/assets/javascripts/discourse/helpers/user-avatar.js.es6 b/app/assets/javascripts/discourse/helpers/user-avatar.js.es6
index c5eac31ad61..2388f45a685 100644
--- a/app/assets/javascripts/discourse/helpers/user-avatar.js.es6
+++ b/app/assets/javascripts/discourse/helpers/user-avatar.js.es6
@@ -1,4 +1,4 @@
-import registerUnbound from 'discourse/helpers/register-unbound';
+import { registerUnbound } from 'discourse/lib/helpers';
function renderAvatar(user, options) {
options = options || {};
diff --git a/app/assets/javascripts/discourse/helpers/user-status.js.es6 b/app/assets/javascripts/discourse/helpers/user-status.js.es6
index e40197b7b51..2c388b31642 100644
--- a/app/assets/javascripts/discourse/helpers/user-status.js.es6
+++ b/app/assets/javascripts/discourse/helpers/user-status.js.es6
@@ -1,17 +1,16 @@
import { iconHTML } from 'discourse/helpers/fa-icon';
+import { htmlHelper } from 'discourse/lib/helpers';
-const Safe = Handlebars.SafeString;
-
-export default Ember.Handlebars.makeBoundHelper(function(user, args) {
+export default htmlHelper((user, args) => {
if (!user) { return; }
const name = Discourse.Utilities.escapeExpression(user.get('name'));
const currentUser = args.hash.currentUser;
if (currentUser && user.get('admin') && currentUser.get('staff')) {
- return new Safe(iconHTML('shield', { label: I18n.t('user.admin', { user: name }) }));
+ return iconHTML('shield', { label: I18n.t('user.admin', { user: name }) });
}
if (user.get('moderator')) {
- return new Safe(iconHTML('shield', { label: I18n.t('user.moderator', { user: name }) }));
+ return iconHTML('shield', { label: I18n.t('user.moderator', { user: name }) });
}
});
diff --git a/app/assets/javascripts/discourse/lib/ember_compat_handlebars.js b/app/assets/javascripts/discourse/lib/ember_compat_handlebars.js
index 23875153c84..6539100a491 100644
--- a/app/assets/javascripts/discourse/lib/ember_compat_handlebars.js
+++ b/app/assets/javascripts/discourse/lib/ember_compat_handlebars.js
@@ -148,7 +148,8 @@
RawHandlebars.get = function(ctx, property, options){
if (options.types && options.data.view) {
- return options.data.view.getStream(property).value();
+ var view = options.data.view;
+ return view.getStream ? view.getStream(property).value() : view.getAttr(property);
} else {
return Ember.get(ctx, property);
}
diff --git a/app/assets/javascripts/discourse/helpers/register-unbound.js.es6 b/app/assets/javascripts/discourse/lib/helpers.js.es6
similarity index 61%
rename from app/assets/javascripts/discourse/helpers/register-unbound.js.es6
rename to app/assets/javascripts/discourse/lib/helpers.js.es6
index 3db687c5205..5ae2cbe1654 100644
--- a/app/assets/javascripts/discourse/helpers/register-unbound.js.es6
+++ b/app/assets/javascripts/discourse/lib/helpers.js.es6
@@ -1,3 +1,20 @@
+// `Ember.Helper` is only available in versions after 1.12
+export function htmlHelper(fn) {
+ if (Ember.Helper) {
+ return Ember.Helper.helper(function() {
+ return new Handlebars.SafeString(fn.apply(this, Array.prototype.slice.call(arguments)));
+ });
+ } else {
+ return Ember.Handlebars.makeBoundHelper(function() {
+ return new Handlebars.SafeString(fn.apply(this, Array.prototype.slice.call(arguments)));
+ });
+ }
+}
+
+export function registerHelper(name, fn) {
+ Ember.HTMLBars._registerHelper(name, fn);
+}
+
const get = Discourse.EmberCompatHandlebars.get;
function resolveParams(ctx, options) {
@@ -21,7 +38,7 @@ function resolveParams(ctx, options) {
return params;
}
-export default function registerUnbound(name, fn) {
+export function registerUnbound(name, fn) {
const func = function(property, options) {
if (options.types && (options.types[0] === "ID" || options.types[0] === "PathExpression")) {
property = get(this, property, options);
diff --git a/app/assets/javascripts/discourse/templates/modal/history.hbs b/app/assets/javascripts/discourse/templates/modal/history.hbs
index e9820aab8fd..1b005e13dea 100644
--- a/app/assets/javascripts/discourse/templates/modal/history.hbs
+++ b/app/assets/javascripts/discourse/templates/modal/history.hbs
@@ -5,7 +5,7 @@
{{d-button action="loadPreviousVersion" icon="backward" title="post.revisions.controls.previous" disabled=loadPreviousDisabled}}
{{#conditional-loading-spinner condition=loading size="small"}}
- {{boundI18n revisionsTextKey previous=previousVersion current=model.current_version total=model.version_count}}
+ {{{revisionsText}}}
{{/conditional-loading-spinner}}
{{d-button action="loadNextVersion" icon="forward" title="post.revisions.controls.next" disabled=loadNextDisabled}}
diff --git a/app/assets/javascripts/discourse/templates/user/messages.hbs b/app/assets/javascripts/discourse/templates/user/messages.hbs
index 9f4c6b62f85..56f03b2e618 100644
--- a/app/assets/javascripts/discourse/templates/user/messages.hbs
+++ b/app/assets/javascripts/discourse/templates/user/messages.hbs
@@ -26,7 +26,7 @@
{{#link-to 'userPrivateMessages.group' group.name}}
- {{capitalize group.name}}
+ {{capitalize-string group.name}}
{{/link-to}}
diff --git a/app/assets/javascripts/main_include.js b/app/assets/javascripts/main_include.js
index 0af76b9aaf0..7aad77c3c5f 100644
--- a/app/assets/javascripts/main_include.js
+++ b/app/assets/javascripts/main_include.js
@@ -14,14 +14,14 @@
//= require ./discourse/lib/debounce
//= require ./discourse/lib/quote
//= require ./discourse/lib/key-value-store
+//= require ./discourse/lib/helpers
//= require ./discourse/helpers/i18n
//= require ./discourse/helpers/fa-icon
-//= require ./discourse/helpers/register-unbound
//= require ./discourse/lib/ember_compat_handlebars
+//= require ./discourse/lib/helpers
//= require ./discourse/lib/computed
//= require ./discourse/lib/formatter
//= require ./discourse/lib/eyeline
-//= require ./discourse/helpers/register-unbound
//= require ./discourse/mixins/scrolling
//= require ./discourse/models/model
//= require ./discourse/models/rest
@@ -88,7 +88,6 @@
//= require ./discourse/components/conditional-loading-spinner
//= require ./discourse/helpers/user-avatar
//= require ./discourse/helpers/cold-age-class
-//= require ./discourse/helpers/capitalize
//= require ./discourse/helpers/loading-spinner
//= require ./discourse/helpers/category-link
//= require ./discourse/lib/export-result
diff --git a/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6 b/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6
index 0e44215049f..47f0d5ba5af 100644
--- a/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6
+++ b/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6
@@ -24,7 +24,7 @@ export default Em.Component.extend({
options.forEach((option, i) => {
const percentage = percentages[i];
- const style = new Ember.Handlebars.SafeString(`width: ${percentage}%`);
+ const style = new Handlebars.SafeString(`width: ${percentage}%`);
option.setProperties({
percentage,