diff --git a/app/assets/javascripts/admin/routes/admin-customize-themes.js.es6 b/app/assets/javascripts/admin/routes/admin-customize-themes.js.es6 index 24ee2312f3..49a74bc281 100644 --- a/app/assets/javascripts/admin/routes/admin-customize-themes.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-customize-themes.js.es6 @@ -16,8 +16,7 @@ export default Ember.Route.extend({ }, addTheme(theme) { - const all = this.modelFor("adminCustomizeThemes"); - all.pushObject(theme); + this.refresh(); this.transitionTo("adminCustomizeThemes.show", theme.get("id")); }, diff --git a/app/assets/javascripts/admin/templates/customize-themes-index.hbs b/app/assets/javascripts/admin/templates/customize-themes-index.hbs index 39bdfc7c85..565d0024db 100644 --- a/app/assets/javascripts/admin/templates/customize-themes-index.hbs +++ b/app/assets/javascripts/admin/templates/customize-themes-index.hbs @@ -4,7 +4,7 @@

{{I18n "admin.customize.theme.themes_intro"}}

{{#each externalResources as |resource|}} - + {{d-icon resource.icon}} {{I18n resource.key}} diff --git a/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs b/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs index c5819da791..109e7e32e1 100644 --- a/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs +++ b/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs @@ -78,11 +78,10 @@ {{#unless item.editing}} {{d-button - class="btn-default" + class="btn-default btn-danger" action=(action "destroy") actionParam=item - icon="far-trash-alt" - class="btn-danger"}} + icon="far-trash-alt"}} {{d-button class="btn-default" action=(action "edit") diff --git a/app/assets/javascripts/discourse/controllers/history.js.es6 b/app/assets/javascripts/discourse/controllers/history.js.es6 index b42a99f1dd..369b37bbd4 100644 --- a/app/assets/javascripts/discourse/controllers/history.js.es6 +++ b/app/assets/javascripts/discourse/controllers/history.js.es6 @@ -199,17 +199,17 @@ export default Ember.Controller.extend(ModalFunctionality, { @computed("displayingInline") inlineClass(displayingInline) { - return displayingInline ? "btn-primary" : ""; + return displayingInline ? "btn-danger" : "btn-flat"; }, @computed("displayingSideBySide") sideBySideClass(displayingSideBySide) { - return displayingSideBySide ? "btn-primary" : ""; + return displayingSideBySide ? "btn-danger" : "btn-flat"; }, @computed("displayingSideBySideMarkdown") sideBySideMarkdownClass(displayingSideBySideMarkdown) { - return displayingSideBySideMarkdown ? "btn-primary" : ""; + return displayingSideBySideMarkdown ? "btn-danger" : "btn-flat"; }, @computed("model.category_id_changes") diff --git a/app/assets/javascripts/discourse/controllers/move-to-topic.js.es6 b/app/assets/javascripts/discourse/controllers/move-to-topic.js.es6 index 6df047caa5..5e47258f7c 100644 --- a/app/assets/javascripts/discourse/controllers/move-to-topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/move-to-topic.js.es6 @@ -71,6 +71,7 @@ export default Ember.Controller.extend(ModalFunctionality, { this.set("selection", canSplitTopic ? "new_message" : "existing_message"); } else if (!canSplitTopic) { this.set("selection", "existing_topic"); + Ember.run.next(() => $("#choose-topic-title").focus()); } }, diff --git a/app/assets/javascripts/discourse/lib/plugin-api.js.es6 b/app/assets/javascripts/discourse/lib/plugin-api.js.es6 index 34a607d93e..a44548c175 100644 --- a/app/assets/javascripts/discourse/lib/plugin-api.js.es6 +++ b/app/assets/javascripts/discourse/lib/plugin-api.js.es6 @@ -55,7 +55,19 @@ class PluginApi { * If the user is not logged in, it will be `null`. **/ getCurrentUser() { - return this.container.lookup("current-user:main"); + return this._lookupContainer("current-user:main"); + } + + _lookupContainer(path) { + if ( + !this.container || + this.container.isDestroying || + this.container.isDestroyed + ) { + return; + } + + return this.container.lookup(path); } _resolveClass(resolverName, opts) { @@ -222,7 +234,7 @@ class PluginApi { * ``` **/ addPosterIcon(cb) { - const site = this.container.lookup("site:main"); + const site = this._lookupContainer("site:main"); const loc = site && site.mobileView ? "before" : "after"; decorateWidget(`poster-name:${loc}`, dec => { @@ -424,8 +436,8 @@ class PluginApi { ``` **/ onAppEvent(name, fn) { - let appEvents = this.container.lookup("app-events:main"); - appEvents.on(name, fn); + const appEvents = this._lookupContainer("app-events:main"); + appEvents && appEvents.on(name, fn); } /** @@ -562,7 +574,8 @@ class PluginApi { * will issue a request to `/mice.json` **/ addStorePluralization(thing, plural) { - this.container.lookup("service:store").addPluralization(thing, plural); + const store = this._lookupContainer("service:store"); + store && store.addPluralization(thing, plural); } /** diff --git a/app/assets/javascripts/discourse/lib/search.js.es6 b/app/assets/javascripts/discourse/lib/search.js.es6 index 8fab105cfe..a3f47f7a12 100644 --- a/app/assets/javascripts/discourse/lib/search.js.es6 +++ b/app/assets/javascripts/discourse/lib/search.js.es6 @@ -80,7 +80,7 @@ export function translateResults(results, opts) { more: groupedSearchResult[`more_${name}`] }; - if (result.more && name === "posts" && opts.fullSearchUrl) { + if (result.more && componentName === "topic" && opts.fullSearchUrl) { result.more = false; result.moreUrl = opts.fullSearchUrl; } diff --git a/app/assets/javascripts/discourse/models/result-set.js.es6 b/app/assets/javascripts/discourse/models/result-set.js.es6 index 527477957a..5f85ce9417 100644 --- a/app/assets/javascripts/discourse/models/result-set.js.es6 +++ b/app/assets/javascripts/discourse/models/result-set.js.es6 @@ -25,12 +25,9 @@ export default Ember.ArrayProxy.extend({ if (this.get("length") < totalRows && !this.get("loadingMore")) { this.set("loadingMore", true); - const self = this; return this.store .appendResults(this, this.get("__type"), loadMoreUrl) - .finally(function() { - self.set("loadingMore", false); - }); + .finally(() => this.set("loadingMore", false)); } return Ember.RSVP.resolve(); @@ -46,12 +43,9 @@ export default Ember.ArrayProxy.extend({ return; } - const self = this; this.set("refreshing", true); return this.store .refreshResults(this, this.get("__type"), refreshUrl) - .finally(function() { - self.set("refreshing", false); - }); + .finally(() => this.set("refreshing", false)); } }); diff --git a/app/assets/javascripts/discourse/models/store.js.es6 b/app/assets/javascripts/discourse/models/store.js.es6 index d1af36337e..f5b97f3856 100644 --- a/app/assets/javascripts/discourse/models/store.js.es6 +++ b/app/assets/javascripts/discourse/models/store.js.es6 @@ -83,12 +83,9 @@ export default Ember.Object.extend({ // Mostly for legacy, things like TopicList without ResultSets findFiltered(type, findArgs) { - const self = this; return this.adapterFor(type) .find(this, type, findArgs) - .then(function(result) { - return self._build(type, result); - }); + .then(result => this._build(type, result)); }, _hydrateFindResults(result, type, findArgs) { @@ -149,28 +146,25 @@ export default Ember.Object.extend({ }, refreshResults(resultSet, type, url) { - const self = this; return ajax(url).then(result => { - const typeName = Ember.String.underscore(self.pluralize(type)); + const typeName = Ember.String.underscore(this.pluralize(type)); const content = result[typeName].map(obj => - self._hydrate(type, obj, result) + this._hydrate(type, obj, result) ); resultSet.set("content", content); }); }, appendResults(resultSet, type, url) { - const self = this; - - return ajax(url).then(function(result) { - let typeName = Ember.String.underscore(self.pluralize(type)); + return ajax(url).then(result => { + let typeName = Ember.String.underscore(this.pluralize(type)); let pageTarget = result.meta || result; let totalRows = pageTarget["total_rows_" + typeName] || resultSet.get("totalRows"); let loadMoreUrl = pageTarget["load_more_" + typeName]; let content = result[typeName].map(obj => - self._hydrate(type, obj, result) + this._hydrate(type, obj, result) ); resultSet.setProperties({ totalRows, loadMoreUrl }); @@ -300,20 +294,19 @@ export default Ember.Object.extend({ }, _hydrateEmbedded(type, obj, root) { - const self = this; - Object.keys(obj).forEach(function(k) { + Object.keys(obj).forEach(k => { const m = /(.+)\_id(s?)$/.exec(k); if (m) { const subType = m[1]; if (m[2]) { - const hydrated = obj[k].map(function(id) { - return self._lookupSubType(subType, type, id, root); - }); - obj[self.pluralize(subType)] = hydrated || []; + const hydrated = obj[k].map(id => + this._lookupSubType(subType, type, id, root) + ); + obj[this.pluralize(subType)] = hydrated || []; delete obj[k]; } else { - const hydrated = self._lookupSubType(subType, type, obj[k], root); + const hydrated = this._lookupSubType(subType, type, obj[k], root); if (hydrated) { obj[subType] = hydrated; delete obj[k]; diff --git a/app/assets/javascripts/discourse/models/topic.js.es6 b/app/assets/javascripts/discourse/models/topic.js.es6 index af6cc421bf..489333e588 100644 --- a/app/assets/javascripts/discourse/models/topic.js.es6 +++ b/app/assets/javascripts/discourse/models/topic.js.es6 @@ -78,7 +78,7 @@ const Topic = RestModel.extend({ } } - const poster_ids = _.pluck(posters, "user_id"); + const poster_ids = posters.map(p => p.user && p.user.id).filter(id => id); participants.some(p => { if (!poster_ids.includes(p.user_id)) { users.splice(users.length - pushOffset, 0, p); diff --git a/app/assets/javascripts/discourse/templates/components/d-editor.hbs b/app/assets/javascripts/discourse/templates/components/d-editor.hbs index 4391669a79..41694e0b9d 100644 --- a/app/assets/javascripts/discourse/templates/components/d-editor.hbs +++ b/app/assets/javascripts/discourse/templates/components/d-editor.hbs @@ -39,7 +39,7 @@
{{conditional-loading-spinner condition=loading}} - {{textarea tabindex=tabindex value=value class="d-editor-input" placeholder=placeholderTranslated disabled=disabled}} + {{textarea autocomplete="off" tabindex=tabindex value=value class="d-editor-input" placeholder=placeholderTranslated disabled=disabled}} {{popup-input-tip validation=validation}} {{plugin-outlet name="after-d-editor" tagName="" args=outletArgs}} diff --git a/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs b/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs index 33da28314e..a7fc8cac35 100644 --- a/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs +++ b/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs @@ -17,7 +17,7 @@

{{if nameFirst user.name (format-username username)}} {{user-status user currentUser=currentUser}}

- {{plugin-outlet name="user-card-after-username" args=(hash user=user) tagName=''}} + {{plugin-outlet name="user-card-after-username" args=(hash user=user showUser=(action "showUser")) tagName=''}} {{#unless nameFirst}} {{#if user.name}} diff --git a/app/assets/javascripts/discourse/templates/composer.hbs b/app/assets/javascripts/discourse/templates/composer.hbs index c59c4b5760..4f313982e7 100644 --- a/app/assets/javascripts/discourse/templates/composer.hbs +++ b/app/assets/javascripts/discourse/templates/composer.hbs @@ -106,8 +106,8 @@ uploadIcon=uploadIcon isCancellable=isCancellable uploadProgress=uploadProgress - groupsMentioned="groupsMentioned" - cannotSeeMention="cannotSeeMention" + groupsMentioned=(action "groupsMentioned") + cannotSeeMention=(action "cannotSeeMention") importQuote=(action "importQuote") togglePreview=(action "togglePreview") showToolbar=showToolbar diff --git a/app/assets/javascripts/discourse/templates/mobile/list/topic-list-item.raw.hbs b/app/assets/javascripts/discourse/templates/mobile/list/topic-list-item.raw.hbs index 2363ec4371..7333de7d55 100644 --- a/app/assets/javascripts/discourse/templates/mobile/list/topic-list-item.raw.hbs +++ b/app/assets/javascripts/discourse/templates/mobile/list/topic-list-item.raw.hbs @@ -8,6 +8,7 @@
{{/unless~}}