diff --git a/.eslintignore b/.eslintignore index cc014c8b92..5e8b92a1c9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,7 +1,5 @@ app/assets/javascripts/env.js -app/assets/javascripts/main_include.js app/assets/javascripts/main_include_admin.js -app/assets/javascripts/pagedown_custom.js app/assets/javascripts/vendor.js app/assets/javascripts/locales/i18n.js app/assets/javascripts/ember-addons/ @@ -11,11 +9,9 @@ lib/javascripts/messageformat.js lib/javascripts/moment.js lib/javascripts/moment_locale/ lib/highlight_js/ +plugins/**/lib/javascripts/locale public/javascripts/ -spec/phantom_js/smoke_test.js vendor/ test/javascripts/test_helper.js -test/javascripts/test_helper.js test/javascripts/fixtures test/javascripts/helpers/assertions.js -app/assets/javascripts/ember-addons/ diff --git a/.gitignore b/.gitignore index 8a1f8652b9..fbaaa54386 100644 --- a/.gitignore +++ b/.gitignore @@ -117,9 +117,12 @@ bundler_stubs/* vendor/bundle/* *.db -#ignore jetbrains ide file +# ignore jetbrains ide file *.iml +# vim swap +*.swn + # ignore nodejs files /node_modules /package-lock.json diff --git a/.travis.yml b/.travis.yml index 73ae46e5b0..a62d28ebc6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,8 +21,6 @@ addons: matrix: fast_finish: true - allow_failures: - - rvm: 2.5.0 rvm: - 2.5.0 diff --git a/Gemfile b/Gemfile index e558ffb47c..a513adb80e 100644 --- a/Gemfile +++ b/Gemfile @@ -36,12 +36,12 @@ gem 'redis-namespace' gem 'active_model_serializers', '~> 0.8.3' -gem 'onebox', '1.8.33' +gem 'onebox', '1.8.36' gem 'http_accept_language', '~>2.0.5', require: false gem 'ember-rails', '0.18.5' -gem 'ember-source' +gem 'ember-source', '2.13.3' gem 'ember-handlebars-template', '0.7.5' gem 'barber' @@ -53,14 +53,13 @@ gem 'fast_xs' gem 'fast_xor' -# Forked until https://github.com/sdsykes/fastimage/pull/93 is merged -gem 'discourse_fastimage', require: 'fastimage' +gem 'fastimage' gem 'aws-sdk-s3', require: false gem 'excon', require: false gem 'unf', require: false -gem 'email_reply_trimmer', '0.1.8' +gem 'email_reply_trimmer', '0.1.9' # Forked until https://github.com/toy/image_optim/pull/149 is merged gem 'discourse_image_optim', require: 'image_optim' @@ -83,7 +82,7 @@ gem 'omniauth-oauth2', require: false gem 'omniauth-google-oauth2' gem 'oj' -gem 'pg' +gem 'pg', '~> 0.21.0' gem 'pry-rails', require: false gem 'r2', '~> 0.2.5', require: false gem 'rake' diff --git a/Gemfile.lock b/Gemfile.lock index 529aa37e43..b2397688ec 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -74,7 +74,7 @@ GEM uniform_notifier (~> 1.10.0) byebug (9.0.6) certified (1.0.0) - coderay (1.1.1) + coderay (1.1.2) concurrent-ruby (1.0.5) connection_pool (2.2.1) cppjieba_rb (0.3.0) @@ -85,14 +85,13 @@ GEM diff-lcs (1.3) discourse-qunit-rails (0.0.11) railties - discourse_fastimage (2.1.0) discourse_image_optim (0.24.5) exifr (~> 1.2, >= 1.2.2) fspath (~> 3.0) image_size (~> 1.5) in_threads (~> 1.3) progress (~> 3.0, >= 3.0.1) - email_reply_trimmer (0.1.8) + email_reply_trimmer (0.1.9) ember-data-source (2.2.1) ember-source (>= 1.8, < 3.0) ember-handlebars-template (0.7.5) @@ -120,6 +119,7 @@ GEM rake rake-compiler fast_xs (0.8.0) + fastimage (2.1.1) ffi (1.9.18) flamegraph (0.9.5) foreman (0.84.0) @@ -144,8 +144,8 @@ GEM railties (>= 4.2.0) thor (>= 0.14, < 2.0) jwt (1.5.6) - kgio (2.11.0) - libv8 (5.9.211.38.1) + kgio (2.11.1) + libv8 (6.3.292.48.1) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) @@ -166,7 +166,7 @@ GEM mail (2.6.6) mime-types (>= 1.16, < 4) memory_profiler (0.9.8) - message_bus (2.1.1) + message_bus (2.1.2) rack (>= 1.1.3) metaclass (0.0.4) method_source (0.8.2) @@ -175,8 +175,8 @@ GEM mime-types-data (3.2016.0521) mini_mime (0.1.3) mini_portile2 (2.3.0) - mini_racer (0.1.11) - libv8 (~> 5.7) + mini_racer (0.1.15) + libv8 (~> 6.3) mini_suffix (0.3.0) ffi (~> 1.9) minitest (5.10.3) @@ -232,7 +232,7 @@ GEM omniauth-twitter (1.3.0) omniauth-oauth (~> 1.1) rack - onebox (1.8.33) + onebox (1.8.36) fast_blank (>= 1.0.0) htmlentities (~> 4.3) moneta (~> 1.0) @@ -246,7 +246,7 @@ GEM parallel (1.12.0) parser (2.4.0.0) ast (~> 2.2) - pg (0.20.0) + pg (0.21.0) powerpack (0.1.1) progress (3.3.1) pry (0.10.4) @@ -275,7 +275,7 @@ GEM nokogiri (>= 1.6) rails-html-sanitizer (1.0.3) loofah (~> 2.0) - rails_multisite (1.1.2) + rails_multisite (2.0.2) activerecord (> 4.2, < 6) railties (> 4.2, < 6) railties (5.1.4) @@ -293,7 +293,7 @@ GEM rb-fsevent (0.9.8) rb-inotify (0.9.8) ffi (>= 0.5.0) - rbtrace (0.4.8) + rbtrace (0.4.10) ffi (>= 1.0.6) msgpack (>= 0.4.3) trollop (>= 1.16.2) @@ -389,7 +389,7 @@ GEM unf_ext unf_ext (0.0.7.4) unicode-display_width (1.3.0) - unicorn (5.3.1) + unicorn (5.4.0) kgio (~> 2.6) raindrops (~> 0.7) uniform_notifier (1.10.0) @@ -420,12 +420,11 @@ DEPENDENCIES certified cppjieba_rb discourse-qunit-rails - discourse_fastimage discourse_image_optim - email_reply_trimmer (= 0.1.8) + email_reply_trimmer (= 0.1.9) ember-handlebars-template (= 0.7.5) ember-rails (= 0.18.5) - ember-source + ember-source (= 2.13.3) excon execjs fabrication (= 2.9.8) @@ -433,6 +432,7 @@ DEPENDENCIES fast_blank fast_xor fast_xs + fastimage flamegraph foreman gc_tracer @@ -469,9 +469,9 @@ DEPENDENCIES omniauth-oauth2 omniauth-openid omniauth-twitter - onebox (= 1.8.33) + onebox (= 1.8.36) openid-redis-store - pg + pg (~> 0.21.0) pry-nav pry-rails puma @@ -509,4 +509,4 @@ DEPENDENCIES webmock BUNDLED WITH - 1.16.0 + 1.16.1 diff --git a/app/assets/javascripts/admin/components/flag-user-lists.js.es6 b/app/assets/javascripts/admin/components/flag-user-lists.js.es6 new file mode 100644 index 0000000000..cd843ff7ab --- /dev/null +++ b/app/assets/javascripts/admin/components/flag-user-lists.js.es6 @@ -0,0 +1,3 @@ +export default Ember.Component.extend({ + classNames: ['flag-user-lists'] +}); diff --git a/app/assets/javascripts/admin/components/flagged-post-title.js.es6 b/app/assets/javascripts/admin/components/flagged-post-title.js.es6 new file mode 100644 index 0000000000..7c1c013375 --- /dev/null +++ b/app/assets/javascripts/admin/components/flagged-post-title.js.es6 @@ -0,0 +1,3 @@ +export default Ember.Component.extend({ + tagName: 'h3' +}); diff --git a/app/assets/javascripts/admin/components/flagged-post.js.es6 b/app/assets/javascripts/admin/components/flagged-post.js.es6 index 0754952a01..aaa4759e82 100644 --- a/app/assets/javascripts/admin/components/flagged-post.js.es6 +++ b/app/assets/javascripts/admin/components/flagged-post.js.es6 @@ -13,15 +13,18 @@ export default Ember.Component.extend({ 'flaggedPost.deleted' ], + canAct: Ember.computed.alias('actableFilter'), + @computed('filter') - canAct(filter) { + actableFilter(filter) { return filter === 'active'; }, removeAfter(promise) { return promise.then(() => { this.attrs.removePost(); - }).catch(() => { + }).catch(error => { + if (error._discourse_displayed) { return; } bootbox.alert(I18n.t("admin.flags.error")); }); }, diff --git a/app/assets/javascripts/admin/components/silence-details.js.es6 b/app/assets/javascripts/admin/components/silence-details.js.es6 new file mode 100644 index 0000000000..9250c1ae73 --- /dev/null +++ b/app/assets/javascripts/admin/components/silence-details.js.es6 @@ -0,0 +1,3 @@ +export default Ember.Component.extend({ + tagName: '' +}); diff --git a/app/assets/javascripts/admin/components/suspension-details.js.es6 b/app/assets/javascripts/admin/components/suspension-details.js.es6 new file mode 100644 index 0000000000..9250c1ae73 --- /dev/null +++ b/app/assets/javascripts/admin/components/suspension-details.js.es6 @@ -0,0 +1,3 @@ +export default Ember.Component.extend({ + tagName: '' +}); diff --git a/app/assets/javascripts/admin/controllers/admin-search-logs-term.js.es6 b/app/assets/javascripts/admin/controllers/admin-search-logs-term.js.es6 index 98d061e060..9204541656 100644 --- a/app/assets/javascripts/admin/controllers/admin-search-logs-term.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-search-logs-term.js.es6 @@ -1,7 +1,7 @@ export default Ember.Controller.extend({ loading: false, term: null, - period: "yearly", + period: "quarterly", searchType: "all", searchTypeOptions: [ diff --git a/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 b/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 index a2b7c94f17..346bc273c1 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 @@ -1,8 +1,10 @@ -import UserBadge from 'discourse/models/user-badge'; +import GrantBadgeController from "discourse/mixins/grant-badge-controller"; -export default Ember.Controller.extend({ +export default Ember.Controller.extend(GrantBadgeController, { adminUser: Ember.inject.controller(), user: Ember.computed.alias('adminUser.model'), + userBadges: Ember.computed.alias('model'), + allBadges: Ember.computed.alias('badges'), sortedBadges: Ember.computed.sort('model', 'badgeSortOrder'), badgeSortOrder: ['granted_at:desc'], @@ -41,36 +43,6 @@ export default Ember.Controller.extend({ return _(expanded).sortBy(group => group.granted_at).reverse().value(); }.property('model', 'model.[]', 'model.expandedBadges.[]'), - /** - Array of badges that have not been granted to this user. - - @property grantableBadges - @type {Boolean} - **/ - grantableBadges: function() { - var granted = {}; - this.get('model').forEach(function(userBadge) { - granted[userBadge.get('badge_id')] = true; - }); - - var badges = []; - this.get('badges').forEach(function(badge) { - if (badge.get('enabled') && (badge.get('multiple_grant') || !granted[badge.get('id')])) { - badges.push(badge); - } - }); - - return _.sortBy(badges, badge => badge.get('name')); - }.property('badges.[]', 'model.[]'), - - /** - Whether there are any badges that can be granted. - - @property noBadges - @type {Boolean} - **/ - noBadges: Em.computed.empty('grantableBadges'), - actions: { expandGroup: function(userBadge){ @@ -79,21 +51,21 @@ export default Ember.Controller.extend({ model.get('expandedBadges').pushObject(userBadge.badge.id); }, - grantBadge(badgeId) { - UserBadge.grant(badgeId, this.get('user.username'), this.get('badgeReason')).then(userBadge => { - this.set('badgeReason', ''); - this.get('model').pushObject(userBadge); - Ember.run.next(() => { - // Update the selected badge ID after the combobox has re-rendered. - const newSelectedBadge = this.get('grantableBadges')[0]; - if (newSelectedBadge) { - this.set('selectedBadgeId', newSelectedBadge.get('id')); - } + grantBadge() { + this.grantBadge(this.get('selectedBadgeId'), this.get('user.username'), this.get('badgeReason')) + .then(() => { + this.set('badgeReason', ''); + Ember.run.next(() => { + // Update the selected badge ID after the combobox has re-rendered. + const newSelectedBadge = this.get('grantableBadges')[0]; + if (newSelectedBadge) { + this.set('selectedBadgeId', newSelectedBadge.get('id')); + } + }); + }, function() { + // Failure + bootbox.alert(I18n.t('generic_error')); }); - }, function() { - // Failure - bootbox.alert(I18n.t('generic_error')); - }); }, revokeBadge(userBadge) { diff --git a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 index 266fdbd02c..41869d976e 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 @@ -64,6 +64,15 @@ export default Ember.Controller.extend(CanCheckEmails, { anonymize() { return this.get('model').anonymize(); }, destroy() { return this.get('model').destroy(); }, + viewActionLogs() { + this.get('adminTools').showActionLogs(this, { + target_user: this.get('model.username'), + }); + }, + + showFlagsReceived() { + this.get('adminTools').showFlagsReceived(this.get('model')); + }, showSuspendModal() { this.get('adminTools').showSuspendModal(this.get('model')); }, diff --git a/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6 index fe0416bc30..4c53ba68d8 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6 @@ -1,5 +1,7 @@ import { ajax } from 'discourse/lib/ajax'; -export default Ember.Controller.extend({ +import ModalFunctionality from 'discourse/mixins/modal-functionality'; + +export default Ember.Controller.extend(ModalFunctionality, { modelChanged: function(){ const model = this.get('model'); diff --git a/app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6 new file mode 100644 index 0000000000..bf47fb4ae3 --- /dev/null +++ b/app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6 @@ -0,0 +1,17 @@ +export default Ember.Controller.extend({ + loadingFlags: null, + user: null, + + onShow() { + this.set('loadingFlags', true); + this.store.findAll('flagged-post', { + filter: 'without_custom', + user_id: this.get('model.id') + }).then(result => { + this.set('loadingFlags', false); + console.log(result); + this.set('flaggedPosts', result); + }); + } + +}); diff --git a/app/assets/javascripts/admin/models/flagged-post.js.es6 b/app/assets/javascripts/admin/models/flagged-post.js.es6 index acd3a0e0df..c33f3d3c49 100644 --- a/app/assets/javascripts/admin/models/flagged-post.js.es6 +++ b/app/assets/javascripts/admin/models/flagged-post.js.es6 @@ -22,6 +22,11 @@ export default Post.extend({ }); }, + @computed('post_actions') + hasDisposedBy() { + return this.get('post_actions').some(action => action.disposed_by); + }, + @computed('post_actions.@each.name_key') flaggedForSpam() { return this.get('post_actions').every(action => action.name_key === 'spam'); diff --git a/app/assets/javascripts/admin/models/report.js.es6 b/app/assets/javascripts/admin/models/report.js.es6 index 03e3888f97..af078528b7 100644 --- a/app/assets/javascripts/admin/models/report.js.es6 +++ b/app/assets/javascripts/admin/models/report.js.es6 @@ -1,6 +1,7 @@ import { ajax } from 'discourse/lib/ajax'; import round from "discourse/lib/round"; import { fmt } from 'discourse/lib/computed'; +import { fillMissingDates } from 'discourse/lib/utilities'; const Report = Discourse.Model.extend({ reportUrl: fmt("type", "/admin/reports/%@"), @@ -142,14 +143,13 @@ Report.reopenClass({ group_id: groupId } }).then(json => { - // Add a percent field to each tuple - let maxY = 0; - json.report.data.forEach(row => { - if (row.y > maxY) maxY = row.y; - }); - if (maxY > 0) { - json.report.data.forEach(row => row.percentage = Math.round((row.y / maxY) * 100)); + // Add zero values for missing dates + if (json.report.data.length > 0) { + const startDateFormatted = moment(json.report.start_date).format('YYYY-MM-DD'); + const endDateFormatted = moment(json.report.end_date).format('YYYY-MM-DD'); + json.report.data = fillMissingDates(json.report.data, startDateFormatted, endDateFormatted); } + const model = Report.create({ type: type }); model.setProperties(json.report); return model; diff --git a/app/assets/javascripts/admin/routes/admin-backups-index.js.es6 b/app/assets/javascripts/admin/routes/admin-backups-index.js.es6 index fce0b126d3..8c77fdd1ae 100644 --- a/app/assets/javascripts/admin/routes/admin-backups-index.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-backups-index.js.es6 @@ -1,7 +1,15 @@ import Backup from 'admin/models/backup'; export default Ember.Route.extend({ + activate() { + this.messageBus.subscribe("/admin/backups", backups => this.controller.set("model", backups)); + }, + model() { return Backup.find(); + }, + + deactivate() { + this.messageBus.unsubscribe("/admin/backups"); } }); diff --git a/app/assets/javascripts/admin/routes/admin-backups.js.es6 b/app/assets/javascripts/admin/routes/admin-backups.js.es6 index 92ac4652fa..f992b5fc93 100644 --- a/app/assets/javascripts/admin/routes/admin-backups.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-backups.js.es6 @@ -9,26 +9,24 @@ const LOG_CHANNEL = "/admin/backups/logs"; export default Discourse.Route.extend({ activate() { - this.messageBus.subscribe(LOG_CHANNEL, this._processLogMessage.bind(this)); - }, - - _processLogMessage(log) { - if (log.message === "[STARTED]") { - this.controllerFor("adminBackups").set("model.isOperationRunning", true); - this.controllerFor("adminBackupsLogs").get('logs').clear(); - } else if (log.message === "[FAILED]") { - this.controllerFor("adminBackups").set("model.isOperationRunning", false); - bootbox.alert(I18n.t("admin.backups.operations.failed", { operation: log.operation })); - } else if (log.message === "[SUCCESS]") { - Discourse.User.currentProp("hideReadOnlyAlert", false); - this.controllerFor("adminBackups").set("model.isOperationRunning", false); - if (log.operation === "restore") { - // redirect to homepage when the restore is done (session might be lost) - window.location.pathname = Discourse.getURL("/"); + this.messageBus.subscribe(LOG_CHANNEL, (log) => { + if (log.message === "[STARTED]") { + this.controllerFor("adminBackups").set("model.isOperationRunning", true); + this.controllerFor("adminBackupsLogs").get('logs').clear(); + } else if (log.message === "[FAILED]") { + this.controllerFor("adminBackups").set("model.isOperationRunning", false); + bootbox.alert(I18n.t("admin.backups.operations.failed", { operation: log.operation })); + } else if (log.message === "[SUCCESS]") { + Discourse.User.currentProp("hideReadOnlyAlert", false); + this.controllerFor("adminBackups").set("model.isOperationRunning", false); + if (log.operation === "restore") { + // redirect to homepage when the restore is done (session might be lost) + window.location.pathname = Discourse.getURL("/"); + } + } else { + this.controllerFor("adminBackupsLogs").get('logs').pushObject(Em.Object.create(log)); } - } else { - this.controllerFor("adminBackupsLogs").get('logs').pushObject(Em.Object.create(log)); - } + }); }, model() { @@ -122,12 +120,7 @@ export default Discourse.Route.extend({ }, uploadSuccess(filename) { - const self = this; - bootbox.alert(I18n.t("admin.backups.upload.success", { filename: filename }), function() { - Backup.find().then(function (backups) { - self.controllerFor("adminBackupsIndex").set("model", backups); - }); - }); + bootbox.alert(I18n.t("admin.backups.upload.success", { filename: filename })); }, uploadError(filename, message) { diff --git a/app/assets/javascripts/admin/routes/admin-search-logs-term.js.es6 b/app/assets/javascripts/admin/routes/admin-search-logs-term.js.es6 index 775fec62c5..80c5117dc4 100644 --- a/app/assets/javascripts/admin/routes/admin-search-logs-term.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-search-logs-term.js.es6 @@ -1,4 +1,6 @@ import { ajax } from 'discourse/lib/ajax'; +import { fillMissingDates } from 'discourse/lib/utilities'; +import { translateResults } from "discourse/lib/search"; export default Discourse.Route.extend({ queryParams: { @@ -15,6 +17,16 @@ export default Discourse.Route.extend({ search_type: params.searchType } }).then(json => { + // Add zero values for missing dates + if (json.term.data.length > 0) { + const startDate = (json.term.period === "all") ? moment(json.term.data[0].x).format('YYYY-MM-DD') : moment(json.term.start_date).format('YYYY-MM-DD'); + const endDate = moment(json.term.end_date).format('YYYY-MM-DD'); + json.term.data = fillMissingDates(json.term.data, startDate, endDate); + } + if (json.term.search_result) { + json.term.search_result = translateResults(json.term.search_result); + } + const model = Ember.Object.create({ type: "search_log_term" }); model.setProperties(json.term); return model; diff --git a/app/assets/javascripts/admin/routes/admin-user-index.js.es6 b/app/assets/javascripts/admin/routes/admin-user-index.js.es6 index 36d1d8cedd..930b45c8b1 100644 --- a/app/assets/javascripts/admin/routes/admin-user-index.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-user-index.js.es6 @@ -21,15 +21,5 @@ export default Discourse.Route.extend({ availableGroups: this._availableGroups, model }); - }, - - actions: { - viewActionLogs(username) { - const controller = this.controllerFor('adminLogs.staffActionLogs'); - this.transitionTo('adminLogs.staffActionLogs').then(() => { - controller.set('filters', Ember.Object.create()); - controller._changeFilters({ target_user: username }); - }); - } } }); diff --git a/app/assets/javascripts/admin/services/admin-tools.js.es6 b/app/assets/javascripts/admin/services/admin-tools.js.es6 index 439b85cd42..a6a56d0f14 100644 --- a/app/assets/javascripts/admin/services/admin-tools.js.es6 +++ b/app/assets/javascripts/admin/services/admin-tools.js.es6 @@ -17,10 +17,26 @@ export default Ember.Service.extend({ this.siteSettings = getOwner(this).lookup('site-settings:main'); }, + showActionLogs(target, filters) { + const controller = getOwner(target).lookup('controller:adminLogs.staffActionLogs'); + target.transitionToRoute('adminLogs.staffActionLogs').then(() => { + controller.set('filters', Ember.Object.create()); + controller._changeFilters(filters); + }); + }, + + showFlagsReceived(user) { + showModal(`admin-flags-received`, { admin: true, model: user }); + }, + checkSpammer(userId) { return AdminUser.find(userId).then(au => this.spammerDetails(au)); }, + deleteUser(id) { + AdminUser.find(id).then(user => user.destroy({ deletePosts: true })); + }, + spammerDetails(adminUser) { return { deleteUser: () => this._deleteSpammer(adminUser), @@ -39,11 +55,10 @@ export default Ember.Service.extend({ controller.set('post', opts.post); } - let promise = user.adminUserView ? + return (user.adminUserView ? Ember.RSVP.resolve(user) : - AdminUser.find(user.get('id')); - - promise.then(loadedUser => { + AdminUser.find(user.get('id')) + ).then(loadedUser => { controller.setProperties({ user: loadedUser, loadingUser: false, diff --git a/app/assets/javascripts/admin/templates/components/admin-user-field-item.hbs b/app/assets/javascripts/admin/templates/components/admin-user-field-item.hbs index 419ef0b69c..99f1de8ce2 100644 --- a/app/assets/javascripts/admin/templates/components/admin-user-field-item.hbs +++ b/app/assets/javascripts/admin/templates/components/admin-user-field-item.hbs @@ -4,11 +4,11 @@ {{/admin-form-row}} {{#admin-form-row label="admin.user_fields.name"}} - {{input value=buffered.name class="user-field-name"}} + {{input value=buffered.name class="user-field-name" maxlength="255"}} {{/admin-form-row}} {{#admin-form-row label="admin.user_fields.description"}} - {{input value=buffered.description class="user-field-desc"}} + {{input value=buffered.description class="user-field-desc" maxlength="255"}} {{/admin-form-row}} {{#if bufferedFieldType.hasOptions}} diff --git a/app/assets/javascripts/admin/templates/components/flag-user-lists.hbs b/app/assets/javascripts/admin/templates/components/flag-user-lists.hbs new file mode 100644 index 0000000000..7c793b98bc --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/flag-user-lists.hbs @@ -0,0 +1,32 @@ +
{{i18n 'admin.badges.no_badges'}}
{{else}} {{/if}} diff --git a/app/assets/javascripts/admin/templates/user-index.hbs b/app/assets/javascripts/admin/templates/user-index.hbs index 96f962a0b5..24122f3877 100644 --- a/app/assets/javascripts/admin/templates/user-index.hbs +++ b/app/assets/javascripts/admin/templates/user-index.hbs @@ -6,6 +6,7 @@ {{i18n 'admin.user.show_public_profile'}} {{/link-to}} {{/if}} + {{#if model.can_view_action_logs}} {{d-button action="viewActionLogs" actionParam=model.username icon="list-alt" label="admin.user.action_logs"}} {{/if}} @@ -466,7 +467,18 @@| {{i18n 'categories.category'}} | +{{i18n 'categories.category'}} | {{i18n 'categories.topics'}} | {{#if showTopics}}{{i18n 'categories.latest'}} | {{/if}}
|---|---|---|---|
|
diff --git a/app/assets/javascripts/discourse/templates/components/category-drop.hbs b/app/assets/javascripts/discourse/templates/components/category-drop.hbs
deleted file mode 100644
index ba5062a429..0000000000
--- a/app/assets/javascripts/discourse/templates/components/category-drop.hbs
+++ /dev/null
@@ -1,30 +0,0 @@
-{{#if category}}
-
-
- {{#if category.read_restricted}}
- {{d-icon "lock"}}
- {{/if}}
- {{category.name}}
-
-{{else}}
- {{#if noSubcategories}}
- {{i18n 'categories.no_subcategory'}}
- {{else}}
- {{allCategoriesLabel}}
- {{/if}}
-{{/if}}
-
-{{#if categories}}
-
- {{d-icon expandIcon}}
-
-
-{{/if}}
diff --git a/app/assets/javascripts/discourse/templates/components/category-name-fields.hbs b/app/assets/javascripts/discourse/templates/components/category-name-fields.hbs
new file mode 100644
index 0000000000..e0766f4828
--- /dev/null
+++ b/app/assets/javascripts/discourse/templates/components/category-name-fields.hbs
@@ -0,0 +1,10 @@
+
{{{preview}}}
- {{plugin-outlet name="editor-preview" classNames="d-editor-plugin"}}
+ {{plugin-outlet name="editor-preview" classNames="d-editor-plugin"}}
|