diff --git a/.travis.yml b/.travis.yml index 807cfa25fe..513f3c15ad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ env: - "RAILS_MASTER=1" addons: - postgresql: 9.3 + postgresql: 9.5 apt: packages: - gifsicle @@ -40,6 +40,7 @@ before_install: - gem install bundler - git clone --depth=1 https://github.com/discourse/discourse-backup-uploads-to-s3.git plugins/discourse-backup-uploads-to-s3 - git clone --depth=1 https://github.com/discourse/discourse-spoiler-alert.git plugins/discourse-spoiler-alert + - git clone --depth=1 https://github.com/discourse/discourse-cakeday.git plugins/discourse-cakeday - npm i -g eslint babel-eslint - eslint app/assets/javascripts - eslint --ext .es6 app/assets/javascripts diff --git a/Gemfile b/Gemfile index 9e5b727f9a..abf697bb3b 100644 --- a/Gemfile +++ b/Gemfile @@ -48,7 +48,7 @@ gem 'onebox' gem 'http_accept_language', '~>2.0.5', require: false gem 'ember-rails', '0.18.5' -gem 'ember-source', '1.12.2' +gem 'ember-source', '2.4.6' gem 'barber' gem 'babel-transpiler' @@ -66,7 +66,7 @@ gem 'aws-sdk', require: false gem 'excon', require: false gem 'unf', require: false -gem 'email_reply_trimmer', '0.1.4' +gem 'email_reply_trimmer', '0.1.6' # note: for image_optim to correctly work you need to follow # https://github.com/toy/image_optim @@ -122,6 +122,7 @@ end group :test do gem 'fakeweb', '~> 1.3.0', require: false gem 'minitest', require: false + gem 'timecop' end group :test, :development do @@ -138,7 +139,6 @@ group :test, :development do gem 'rspec-rails', require: false gem 'shoulda', require: false gem 'simplecov', require: false - gem 'timecop' gem 'rspec-given' gem 'rspec-html-matchers' gem 'spork-rails' @@ -150,7 +150,6 @@ group :development do gem 'bullet', require: !!ENV['BULLET'] gem 'better_errors' gem 'binding_of_caller' - gem 'librarian', '>= 0.0.25', require: false gem 'annotate' gem 'foreman', require: false end diff --git a/Gemfile.lock b/Gemfile.lock index 48c8b97299..64bf4bc6d2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -80,10 +80,10 @@ GEM docile (1.1.5) domain_name (0.5.25) unf (>= 0.0.5, < 1.0.0) - email_reply_trimmer (0.1.4) - ember-data-source (1.0.0.beta.16.1) - ember-source (~> 1.8) - ember-handlebars-template (0.7.3) + email_reply_trimmer (0.1.6) + ember-data-source (2.2.1) + ember-source (>= 1.8, < 3.0) + ember-handlebars-template (0.7.4) barber (>= 0.11.0) sprockets (>= 3.3, < 4) ember-rails (0.18.5) @@ -93,7 +93,7 @@ GEM ember-source (>= 1.1.0) jquery-rails (>= 1.0.17) railties (>= 3.1) - ember-source (1.12.2) + ember-source (2.4.6) erubis (2.7.0) eventmachine (1.2.0.1) excon (0.53.0) @@ -137,16 +137,13 @@ GEM image_size (1.4.1) in_threads (1.3.1) jmespath (1.3.1) - jquery-rails (4.0.5) - rails-dom-testing (~> 1.0) + jquery-rails (4.2.1) + rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) json (1.8.3) jwt (1.5.2) kgio (2.10.0) - librarian (0.1.2) - highline - thor (~> 0.15) libv8 (5.3.332.38.1) listen (0.7.3) logster (1.2.5) @@ -186,7 +183,7 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (~> 1.2) - oj (2.14.3) + oj (2.17.5) omniauth (1.3.1) hashie (>= 1.2, < 4) rack (>= 1.0, < 3) @@ -215,7 +212,7 @@ GEM omniauth-twitter (1.2.1) json (~> 1.3) omniauth-oauth (~> 1.1) - onebox (1.5.50) + onebox (1.6.0) htmlentities (~> 4.3.4) moneta (~> 0.8) multi_json (~> 1.11) @@ -224,7 +221,7 @@ GEM openid-redis-store (0.0.2) redis ruby-openid - pg (0.18.4) + pg (0.19.0) progress (3.1.1) pry (0.10.4) coderay (~> 1.1.0) @@ -267,13 +264,14 @@ GEM loofah (~> 2.0) rails-observers (0.1.2) activemodel (~> 4.0) - rails_multisite (1.0.4) + rails_multisite (1.0.6) + rails (> 4.2, < 5) railties (4.2.7.1) actionpack (= 4.2.7.1) activesupport (= 4.2.7.1) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - raindrops (0.16.0) + raindrops (0.17.0) rake (11.2.2) rake-compiler (0.9.9) rake @@ -284,7 +282,7 @@ GEM ffi (>= 1.0.6) msgpack (>= 0.4.3) trollop (>= 1.16.2) - redis (3.3.0) + redis (3.3.1) redis-namespace (1.5.2) redis (~> 3.0, >= 3.0.4) rest-client (1.8.0) @@ -345,9 +343,10 @@ GEM shoulda-context (1.2.1) shoulda-matchers (2.8.0) activesupport (>= 3.0.0) - sidekiq (4.1.2) + sidekiq (4.2.4) concurrent-ruby (~> 1.0) connection_pool (~> 2.2, >= 2.2.0) + rack-protection (>= 1.5.0) redis (~> 3.2, >= 3.2.1) sidekiq-statistic (1.2.0) sidekiq (>= 3.3.4, < 5) @@ -391,7 +390,7 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.7.1) - unicorn (5.1.0) + unicorn (5.2.0) kgio (~> 2.6) raindrops (~> 0.7) uniform_notifier (1.10.0) @@ -412,9 +411,9 @@ DEPENDENCIES certified discourse-qunit-rails discourse_fastimage (= 2.0.3) - email_reply_trimmer (= 0.1.4) + email_reply_trimmer (= 0.1.6) ember-rails (= 0.18.5) - ember-source (= 1.12.2) + ember-source (= 2.4.6) excon execjs fabrication (= 2.9.8) @@ -431,7 +430,6 @@ DEPENDENCIES htmlentities http_accept_language (~> 2.0.5) image_optim (= 0.20.2) - librarian (>= 0.0.25) listen (= 0.7.3) logster lru_redux diff --git a/app/assets/javascripts/admin/components/ace-editor.js.es6 b/app/assets/javascripts/admin/components/ace-editor.js.es6 index 561ebc6d8a..01773d2cbf 100644 --- a/app/assets/javascripts/admin/components/ace-editor.js.es6 +++ b/app/assets/javascripts/admin/components/ace-editor.js.es6 @@ -1,26 +1,17 @@ -/* global ace:true */ import loadScript from 'discourse/lib/load-script'; -import { escapeExpression } from 'discourse/lib/utilities'; -import { bufferedRender } from 'discourse-common/lib/buffered-render'; +import { observes } from 'ember-addons/ember-computed-decorators'; -export default Ember.Component.extend(bufferedRender({ +export default Ember.Component.extend({ mode: 'css', classNames: ['ace-wrapper'], _editor: null, _skipContentChangeEvent: null, - contentChanged: function() { + @observes('content') + contentChanged() { if (this._editor && !this._skipContentChangeEvent) { this._editor.getSession().setValue(this.get('content')); } - }.observes('content'), - - buildBuffer(buffer) { - buffer.push("
"); - if (this.get('content')) { - buffer.push(escapeExpression(this.get('content'))); - } - buffer.push("
"); }, _destroyEditor: function() { @@ -40,31 +31,30 @@ export default Ember.Component.extend(bufferedRender({ } }, - _initEditor: function() { - const self = this; + didInsertElement() { + this._super(); - loadScript("/javascripts/ace/ace.js", { scriptTag: true }).then(function() { - ace.require(['ace/ace'], function(loadedAce) { - const editor = loadedAce.edit(self.$('.ace')[0]); + loadScript("/javascripts/ace/ace.js", { scriptTag: true }).then(() => { + window.ace.require(['ace/ace'], loadedAce => { + const editor = loadedAce.edit(this.$('.ace')[0]); editor.setTheme("ace/theme/chrome"); editor.setShowPrintMargin(false); - editor.getSession().setMode("ace/mode/" + self.get('mode')); - editor.on('change', function() { - self._skipContentChangeEvent = true; - self.set('content', editor.getSession().getValue()); - self._skipContentChangeEvent = false; + editor.getSession().setMode("ace/mode/" + this.get('mode')); + editor.on('change', () => { + this._skipContentChangeEvent = true; + this.set('content', editor.getSession().getValue()); + this._skipContentChangeEvent = false; }); editor.$blockScrolling = Infinity; - self.$().data('editor', editor); - self._editor = editor; - if (self.appEvents) { + this.$().data('editor', editor); + this._editor = editor; + if (this.appEvents) { // xxx: don't run during qunit tests - self.appEvents.on('ace:resize', self, self.resize); + this.appEvents.on('ace:resize', self, self.resize); } }); }); - - }.on('didInsertElement') -})); + } +}); diff --git a/app/assets/javascripts/admin/components/customize-link.js.es6 b/app/assets/javascripts/admin/components/customize-link.js.es6 index 79d8cc26f4..0600f6b5cd 100644 --- a/app/assets/javascripts/admin/components/customize-link.js.es6 +++ b/app/assets/javascripts/admin/components/customize-link.js.es6 @@ -1,6 +1,8 @@ +import { getOwner } from 'discourse-common/lib/get-owner'; + export default Ember.Component.extend({ router: function() { - return this.container.lookup('router:main'); + return getOwner(this).lookup('router:main'); }.property(), active: function() { diff --git a/app/assets/javascripts/admin/views/admin.js.es6 b/app/assets/javascripts/admin/components/disable-custom-stylesheets.js.es6 similarity index 53% rename from app/assets/javascripts/admin/views/admin.js.es6 rename to app/assets/javascripts/admin/components/disable-custom-stylesheets.js.es6 index fc4a611fe4..f4d86899d0 100644 --- a/app/assets/javascripts/admin/views/admin.js.es6 +++ b/app/assets/javascripts/admin/components/disable-custom-stylesheets.js.es6 @@ -1,12 +1,14 @@ -export default Ember.View.extend({ - _disableCustomStylesheets: function() { +export default Ember.Component.extend({ + willInsertElement() { + this._super(); if (this.session.get("disableCustomCSS")) { $("link.custom-css").attr("rel", ""); this.session.set("disableCustomCSS", false); } - }.on("willInsertElement"), + }, - _enableCustomStylesheets: function() { + willDestroyElement() { + this._super(); $("link.custom-css").attr("rel", "stylesheet"); - }.on("willDestroyElement") + } }); diff --git a/app/assets/javascripts/admin/components/permalinks-list.js.es6 b/app/assets/javascripts/admin/components/permalinks-list.js.es6 deleted file mode 100644 index c425437686..0000000000 --- a/app/assets/javascripts/admin/components/permalinks-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/permalinks_list_item"}) -}); diff --git a/app/assets/javascripts/admin/components/screened-emails-list.js.es6 b/app/assets/javascripts/admin/components/screened-emails-list.js.es6 deleted file mode 100644 index 1b32fb36fe..0000000000 --- a/app/assets/javascripts/admin/components/screened-emails-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/screened_emails_list_item"}) -}); diff --git a/app/assets/javascripts/admin/components/screened-ip-addresses-list.js.es6 b/app/assets/javascripts/admin/components/screened-ip-addresses-list.js.es6 deleted file mode 100644 index 0d30fc6d48..0000000000 --- a/app/assets/javascripts/admin/components/screened-ip-addresses-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/screened_ip_addresses_list_item"}) -}); diff --git a/app/assets/javascripts/admin/components/screened-urls-list.js.es6 b/app/assets/javascripts/admin/components/screened-urls-list.js.es6 deleted file mode 100644 index b9d8b76667..0000000000 --- a/app/assets/javascripts/admin/components/screened-urls-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/screened_urls_list_item"}) -}); diff --git a/app/assets/javascripts/admin/components/site-setting.js.es6 b/app/assets/javascripts/admin/components/site-setting.js.es6 index 8b6601b4d3..662e4ef684 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/components/staff-action-logs-list.js.es6 b/app/assets/javascripts/admin/components/staff-action-logs-list.js.es6 deleted file mode 100644 index cec82dba43..0000000000 --- a/app/assets/javascripts/admin/components/staff-action-logs-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 75, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/staff_action_logs_list_item"}) -}); diff --git a/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 index 605ebe83af..558b9b4973 100644 --- a/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 @@ -1,3 +1,4 @@ +import DiscourseURL from 'discourse/lib/url'; import { ajax } from 'discourse/lib/ajax'; export default Ember.Controller.extend({ @@ -35,8 +36,11 @@ export default Ember.Controller.extend({ } else { this._toggleReadOnlyMode(false); } - } + }, + download(backup) { + DiscourseURL.redirectTo(backup.get('link')); + } }, _toggleReadOnlyMode(enable) { diff --git a/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 index 160f998365..5da4b0afb5 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 @@ -1,12 +1,23 @@ import EmailPreview from 'admin/models/email-preview'; +import { popupAjaxError } from 'discourse/lib/ajax-error'; export default Ember.Controller.extend({ + emailEmpty: Em.computed.empty('email'), + sendEmailDisabled: Em.computed.or('emailEmpty', 'sendingEmail'), + showSendEmailForm: Em.computed.notEmpty('model.html_content'), + htmlEmpty: Em.computed.empty('model.html_content'), + + iframeSrc: function() { + return ('data:text/html;charset=utf-8,' + encodeURI(this.get('model.html_content'))); + }.property('model.html_content'), + actions: { refresh() { const model = this.get('model'); this.set('loading', true); + this.set('sentEmail', false); EmailPreview.findDigest(this.get('lastSeen'), this.get('username')).then(email => { model.setProperties(email.getProperties('html_content', 'text_content')); this.set('loading', false); @@ -15,6 +26,23 @@ export default Ember.Controller.extend({ toggleShowHtml() { this.toggleProperty('showHtml'); + }, + + sendEmail() { + this.set('sendingEmail', true); + this.set('sentEmail', false); + + const self = this; + + EmailPreview.sendDigest(this.get('lastSeen'), this.get('username'), this.get('email')).then(result => { + if (result.errors) { + bootbox.alert(result.errors); + } else { + self.set('sentEmail', true); + } + }).catch(popupAjaxError).finally(function() { + self.set('sendingEmail', false); + }); } } diff --git a/app/assets/javascripts/admin/controllers/admin-site-text-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-site-text-index.js.es6 index 0c770bd06b..bc2147e923 100644 --- a/app/assets/javascripts/admin/controllers/admin-site-text-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-site-text-index.js.es6 @@ -1,38 +1,14 @@ -import { default as computed } from 'ember-addons/ember-computed-decorators'; - let lastSearch; +let lastOverridden; export default Ember.Controller.extend({ - _q: null, searching: false, siteTexts: null, preferred: false, - _overridden: null, queryParams: ['q', 'overridden'], - @computed - overridden: { - set(value) { - if (!value || value === "false") { value = false; } - this._overridden = value; - return value; - }, - get() { - return this._overridden; - } - }, - - @computed - q: { - set(value) { - if (Ember.isEmpty(value)) { value = null; } - this._q = value; - return value; - }, - get() { - return this._q; - } - }, + q: null, + overridden: null, _performSearch() { this.store.find('site-text', this.getProperties('q', 'overridden')).then(results => { @@ -46,11 +22,14 @@ export default Ember.Controller.extend({ }, search(overridden) { + this.set('overridden', overridden); + const q = this.get('q'); - if (q !== lastSearch || overridden) { + if (q !== lastSearch || overridden !== lastOverridden) { this.set('searching', true); Ember.run.debounce(this, this._performSearch, 400); lastSearch = q; + lastOverridden = overridden; } } } diff --git a/app/assets/javascripts/admin/controllers/modals/delete-site-customization-details.js.es6 b/app/assets/javascripts/admin/controllers/modals/delete-site-customization-details.js.es6 index d38c396ceb..95537e305a 100644 --- a/app/assets/javascripts/admin/controllers/modals/delete-site-customization-details.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/delete-site-customization-details.js.es6 @@ -1,7 +1,7 @@ import ChangeSiteCustomizationDetailsController from "admin/controllers/modals/change-site-customization-details"; export default ChangeSiteCustomizationDetailsController.extend({ - onShow: function() { + onShow() { this.send("selectPrevious"); } }); diff --git a/app/assets/javascripts/admin/models/email-preview.js.es6 b/app/assets/javascripts/admin/models/email-preview.js.es6 index f992bf250d..cfe96c6e0d 100644 --- a/app/assets/javascripts/admin/models/email-preview.js.es6 +++ b/app/assets/javascripts/admin/models/email-preview.js.es6 @@ -17,6 +17,20 @@ EmailPreview.reopenClass({ }).then(function (result) { return EmailPreview.create(result); }); + }, + + sendDigest: function(lastSeenAt, username, email) { + if (Em.isEmpty(lastSeenAt)) { + lastSeenAt = moment().subtract(7, 'days').format('YYYY-MM-DD'); + } + + if (Em.isEmpty(username)) { + username = Discourse.User.current().username; + } + + return ajax("/admin/email/send-digest.json", { + data: { last_seen_at: lastSeenAt, username: username, email: email } + }); } }); diff --git a/app/assets/javascripts/admin/routes/admin-backups.js.es6 b/app/assets/javascripts/admin/routes/admin-backups.js.es6 index ad6f79a8cb..95407e9ff3 100644 --- a/app/assets/javascripts/admin/routes/admin-backups.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-backups.js.es6 @@ -49,7 +49,7 @@ export default Discourse.Route.extend({ actions: { startBackup() { - showModal('modals/admin-start-backup'); + showModal('admin-start-backup', { admin: true }); this.controllerFor('modal').set('modalClass', 'start-backup-modal'); }, diff --git a/app/assets/javascripts/admin/routes/admin-badges-show.js.es6 b/app/assets/javascripts/admin/routes/admin-badges-show.js.es6 index 537fdcfda8..cc0155181f 100644 --- a/app/assets/javascripts/admin/routes/admin-badges-show.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-badges-show.js.es6 @@ -27,7 +27,7 @@ export default Ember.Route.extend({ editGroupings() { const model = this.controllerFor('admin-badges').get('badgeGroupings'); - showModal('modals/admin-edit-badge-groupings', { model }); + showModal('admin-edit-badge-groupings', { model, admin: true }); }, preview(badge, explain) { @@ -42,7 +42,7 @@ export default Ember.Route.extend({ } }).then(function(model) { badge.set('preview_loading', false); - showModal('modals/admin-badge-preview', { model }); + showModal('admin-badge-preview', { model, admin: true }); }).catch(function(error) { badge.set('preview_loading', false); Em.Logger.error(error); diff --git a/app/assets/javascripts/admin/routes/admin-email-index.js.es6 b/app/assets/javascripts/admin/routes/admin-email-index.js.es6 index 1b75e39f6f..ae1272c0b9 100644 --- a/app/assets/javascripts/admin/routes/admin-email-index.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-email-index.js.es6 @@ -3,9 +3,5 @@ import EmailSettings from 'admin/models/email-settings'; export default Discourse.Route.extend({ model() { return EmailSettings.find(); - }, - - renderTemplate() { - this.render('admin/templates/email_index', { into: 'adminEmail' }); } }); diff --git a/app/assets/javascripts/admin/routes/admin-email-rejected.js.es6 b/app/assets/javascripts/admin/routes/admin-email-rejected.js.es6 index a7819b31a6..22c4141275 100644 --- a/app/assets/javascripts/admin/routes/admin-email-rejected.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-email-rejected.js.es6 @@ -6,7 +6,7 @@ export default AdminEmailIncomings.extend({ actions: { showIncomingEmail(id) { - showModal('modals/admin-incoming-email'); + showModal('admin-incoming-email', { admin: true }); this.controllerFor("modals/admin-incoming-email").load(id); } } diff --git a/app/assets/javascripts/admin/routes/admin-flags-list.js.es6 b/app/assets/javascripts/admin/routes/admin-flags-list.js.es6 index ebbc3e6d2b..ba00186d90 100644 --- a/app/assets/javascripts/admin/routes/admin-flags-list.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-flags-list.js.es6 @@ -14,12 +14,12 @@ export default Discourse.Route.extend({ actions: { showAgreeFlagModal(model) { - showModal('modals/admin-agree-flag', { model }); + showModal('admin-agree-flag', { model, admin: true }); this.controllerFor('modal').set('modalClass', 'agree-flag-modal'); }, showDeleteFlagModal(model) { - showModal('modals/admin-delete-flag', { model }); + showModal('admin-delete-flag', { model, admin: true }); this.controllerFor('modal').set('modalClass', 'delete-flag-modal'); } diff --git a/app/assets/javascripts/admin/routes/admin-logs-screened-emails.js.es6 b/app/assets/javascripts/admin/routes/admin-logs-screened-emails.js.es6 index 1008dc1c1d..d31e521924 100644 --- a/app/assets/javascripts/admin/routes/admin-logs-screened-emails.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-logs-screened-emails.js.es6 @@ -1,6 +1,6 @@ export default Discourse.Route.extend({ renderTemplate: function() { - this.render('admin/templates/logs/screened_emails', {into: 'adminLogs'}); + this.render('admin/templates/logs/screened-emails', {into: 'adminLogs'}); }, setupController: function() { diff --git a/app/assets/javascripts/admin/routes/admin-logs-screened-ip-addresses.js.es6 b/app/assets/javascripts/admin/routes/admin-logs-screened-ip-addresses.js.es6 index ca914fe1d2..c6518c244c 100644 --- a/app/assets/javascripts/admin/routes/admin-logs-screened-ip-addresses.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-logs-screened-ip-addresses.js.es6 @@ -1,6 +1,6 @@ export default Discourse.Route.extend({ renderTemplate() { - this.render('admin/templates/logs/screened_ip_addresses', {into: 'adminLogs'}); + this.render('admin/templates/logs/screened-ip-addresses', {into: 'adminLogs'}); }, setupController() { diff --git a/app/assets/javascripts/admin/routes/admin-logs-screened-urls.js.es6 b/app/assets/javascripts/admin/routes/admin-logs-screened-urls.js.es6 index 093dd26331..ee65fda090 100644 --- a/app/assets/javascripts/admin/routes/admin-logs-screened-urls.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-logs-screened-urls.js.es6 @@ -1,6 +1,6 @@ export default Discourse.Route.extend({ renderTemplate: function() { - this.render('admin/templates/logs/screened_urls', {into: 'adminLogs'}); + this.render('admin/templates/logs/screened-urls', {into: 'adminLogs'}); }, setupController: function() { diff --git a/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js.es6 b/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js.es6 index 6ef900e843..48d04abc5f 100644 --- a/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js.es6 @@ -3,7 +3,7 @@ import showModal from 'discourse/lib/show-modal'; export default Discourse.Route.extend({ // TODO: make this automatic using an `{{outlet}}` renderTemplate: function() { - this.render('admin/templates/logs/staff_action_logs', {into: 'adminLogs'}); + this.render('admin/templates/logs/staff-action-logs', {into: 'adminLogs'}); }, setupController: function(controller) { @@ -13,13 +13,18 @@ export default Discourse.Route.extend({ actions: { showDetailsModal(model) { - showModal('modals/admin-staff-action-log-details', { model }); + showModal('admin-staff-action-log-details', { model, admin: true }); this.controllerFor('modal').set('modalClass', 'log-details-modal'); }, showCustomDetailsModal(model) { - const modalName = "modals/" + (model.action_name + '_details').replace("_", "-"); - showModal(modalName, { model }); + const modalName = (model.action_name + '_details').replace(/\_/g, "-"); + + showModal(modalName, { + model, + admin: true, + templateName: 'site-customization-change' + }); this.controllerFor('modal').set('modalClass', 'tabbed-modal log-details-modal'); } } diff --git a/app/assets/javascripts/admin/routes/admin-route-map.js.es6 b/app/assets/javascripts/admin/routes/admin-route-map.js.es6 index 69b51e5cab..9b1b2c72c2 100644 --- a/app/assets/javascripts/admin/routes/admin-route-map.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-route-map.js.es6 @@ -3,11 +3,11 @@ export default { map() { this.route('dashboard', { path: '/' }); - this.resource('adminSiteSettings', { path: '/site_settings' }, function() { - this.resource('adminSiteSettingsCategory', { path: 'category/:category_id'} ); + this.route('adminSiteSettings', { path: '/site_settings', resetNamespace: true }, function() { + this.route('adminSiteSettingsCategory', { path: 'category/:category_id', resetNamespace: true} ); }); - this.resource('adminEmail', { path: '/email'}, function() { + this.route('adminEmail', { path: '/email', resetNamespace: true}, function() { this.route('sent'); this.route('skipped'); this.route('bounced'); @@ -16,72 +16,72 @@ export default { this.route('previewDigest', { path: '/preview-digest' }); }); - this.resource('adminCustomize', { path: '/customize' } ,function() { + this.route('adminCustomize', { path: '/customize', resetNamespace: true } ,function() { this.route('colors'); - this.resource('adminCustomizeCssHtml', { path: 'css_html' }, function() { + this.route('adminCustomizeCssHtml', { path: 'css_html', resetNamespace: true }, function() { this.route('show', {path: '/:site_customization_id/:section'}); }); - this.resource('adminSiteText', { path: '/site_texts' }, function() { + this.route('adminSiteText', { path: '/site_texts', resetNamespace: true }, function() { this.route('edit', { path: '/:id' }); }); - this.resource('adminUserFields', { path: '/user_fields' }); - this.resource('adminEmojis', { path: '/emojis' }); - this.resource('adminPermalinks', { path: '/permalinks' }); - this.resource('adminEmbedding', { path: '/embedding' }); - this.resource('adminCustomizeEmailTemplates', { path: '/email_templates' }, function() { + this.route('adminUserFields', { path: '/user_fields', resetNamespace: true }); + this.route('adminEmojis', { path: '/emojis', resetNamespace: true }); + this.route('adminPermalinks', { path: '/permalinks', resetNamespace: true }); + this.route('adminEmbedding', { path: '/embedding', resetNamespace: true }); + this.route('adminCustomizeEmailTemplates', { path: '/email_templates', resetNamespace: true }, function() { this.route('edit', { path: '/:id' }); }); }); - this.resource('adminApi', { path: '/api' }, function() { - this.resource('adminApiKeys', { path: '/keys' }); + this.route('adminApi', { path: '/api', resetNamespace: true }, function() { + this.route('adminApiKeys', { path: '/keys', resetNamespace: true }); - this.resource('adminWebHooks', { path: '/web_hooks' }, function() { + this.route('adminWebHooks', { path: '/web_hooks', resetNamespace: true }, function() { this.route('show', { path: '/:web_hook_id' }); this.route('showEvents', { path: '/:web_hook_id/events' }); }); }); - this.resource('admin.backups', { path: '/backups' }, function() { + this.route('admin.backups', { path: '/backups', resetNamespace: true }, function() { this.route('logs'); }); - this.resource('adminReports', { path: '/reports/:type' }); + this.route('adminReports', { path: '/reports/:type', resetNamespace: true }); - this.resource('adminFlags', { path: '/flags' }, function() { + this.route('adminFlags', { path: '/flags', resetNamespace: true }, function() { this.route('list', { path: '/:filter' }); }); - this.resource('adminLogs', { path: '/logs' }, function() { + this.route('adminLogs', { path: '/logs', resetNamespace: true }, function() { this.route('staffActionLogs', { path: '/staff_action_logs' }); this.route('screenedEmails', { path: '/screened_emails' }); this.route('screenedIpAddresses', { path: '/screened_ip_addresses' }); this.route('screenedUrls', { path: '/screened_urls' }); }); - this.resource('adminGroups', { path: '/groups' }, function() { + this.route('adminGroups', { path: '/groups', resetNamespace: true }, function() { this.route('bulk'); this.route('bulkComplete', { path: 'bulk-complete' }); - this.resource('adminGroupsType', { path: '/:type' }, function() { - this.resource('adminGroup', { path: '/:name' }); + this.route('adminGroupsType', { path: '/:type', resetNamespace: true }, function() { + this.route('adminGroup', { path: '/:name', resetNamespace: true }); }); }); - this.resource('adminUsers', { path: '/users' }, function() { - this.resource('adminUser', { path: '/:user_id/:username' }, function() { + this.route('adminUsers', { path: '/users', resetNamespace: true }, function() { + this.route('adminUser', { path: '/:user_id/:username', resetNamespace: true }, function() { this.route('badges'); this.route('tl3Requirements', { path: '/tl3_requirements' }); }); - this.resource('adminUsersList', { path: '/list' }, function() { + this.route('adminUsersList', { path: '/list', resetNamespace: true }, function() { this.route('show', { path: '/:filter' }); }); }); - this.resource('adminBadges', { path: '/badges' }, function() { + this.route('adminBadges', { path: '/badges', resetNamespace: true }, function() { this.route('show', { path: '/:badge_id' }); }); } 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 5a3afa10ca..c10e5957d5 100644 --- a/app/assets/javascripts/admin/routes/admin-user-index.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-user-index.js.es6 @@ -26,7 +26,7 @@ export default Discourse.Route.extend({ actions: { showSuspendModal(model) { - showModal('modals/admin-suspend-user', { model }); + showModal('admin-suspend-user', { model, admin: true }); this.controllerFor('modal').set('modalClass', 'suspend-user-modal'); } } diff --git a/app/assets/javascripts/admin/templates/admin.hbs b/app/assets/javascripts/admin/templates/admin.hbs index e29125aec3..77904edc48 100644 --- a/app/assets/javascripts/admin/templates/admin.hbs +++ b/app/assets/javascripts/admin/templates/admin.hbs @@ -1,4 +1,4 @@ -
+{{#disable-custom-stylesheets class="container"}}
@@ -34,4 +34,4 @@
-
+{{/disable-custom-stylesheets}} diff --git a/app/assets/javascripts/admin/templates/backups_index.hbs b/app/assets/javascripts/admin/templates/backups-index.hbs similarity index 86% rename from app/assets/javascripts/admin/templates/backups_index.hbs rename to app/assets/javascripts/admin/templates/backups-index.hbs index 308e73f0fd..a8220a4e1a 100644 --- a/app/assets/javascripts/admin/templates/backups_index.hbs +++ b/app/assets/javascripts/admin/templates/backups-index.hbs @@ -19,7 +19,12 @@ {{human-size backup.size}}
- {{fa-icon "download"}}{{i18n 'admin.backups.operations.download.label'}} + {{d-button class="download" + action="download" + actionParam=backup + icon="download" + title="admin.backups.operations.download.title" + label="admin.backups.operations.download.label"}} {{#if status.isOperationRunning}} {{d-button icon="trash-o" action="destroyBackup" actionParam=backup class="btn-danger" disabled="true" title="admin.backups.operations.is_running"}} {{d-button icon="play" action="startRestore" actionParam=backup disabled=status.restoreDisabled title=restoreTitle label="admin.backups.operations.restore.label"}} diff --git a/app/assets/javascripts/admin/templates/backups.hbs b/app/assets/javascripts/admin/templates/backups.hbs index 7562754c08..ea8bc18987 100644 --- a/app/assets/javascripts/admin/templates/backups.hbs +++ b/app/assets/javascripts/admin/templates/backups.hbs @@ -1,35 +1,37 @@ -
-
- +
+
+
+ +
+
+ {{#if model.canRollback}} + {{d-button action="rollback" + class="btn-rollback" + label="admin.backups.operations.rollback.label" + title="admin.backups.operations.rollback.title" + icon="ambulance" + disabled=rollbackDisabled}} + {{/if}} + {{#if model.isOperationRunning}} + {{d-button action="cancelOperation" + class="btn-danger" + title="admin.backups.operations.cancel.title" + label="admin.backups.operations.cancel.label" + icon="times"}} + {{else}} + {{d-button action="startBackup" + class="btn-primary" + title="admin.backups.operations.backup.title" + label="admin.backups.operations.backup.label" + icon="rocket"}} + {{/if}} +
-
- {{#if model.canRollback}} - {{d-button action="rollback" - class="btn-rollback" - label="admin.backups.operations.rollback.label" - title="admin.backups.operations.rollback.title" - icon="ambulance" - disabled=rollbackDisabled}} - {{/if}} - {{#if model.isOperationRunning}} - {{d-button action="cancelOperation" - class="btn-danger" - title="admin.backups.operations.cancel.title" - label="admin.backups.operations.cancel.label" - icon="times"}} - {{else}} - {{d-button action="startBackup" - class="btn-primary" - title="admin.backups.operations.backup.title" - label="admin.backups.operations.backup.label" - icon="rocket"}} - {{/if}} -
-
-
- {{outlet}} +
+ {{outlet}} +
diff --git a/app/assets/javascripts/admin/templates/badges-index.hbs b/app/assets/javascripts/admin/templates/badges-index.hbs index 6ee80748f8..c94f59fe10 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 f29829eba5..e0ae7001df 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"}}
@@ -143,7 +143,7 @@ {{/unless}}
-
+{{/d-section}} {{#if grant_count}}
diff --git a/app/assets/javascripts/admin/templates/components/ace-editor.hbs b/app/assets/javascripts/admin/templates/components/ace-editor.hbs new file mode 100644 index 0000000000..c837b2b34e --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/ace-editor.hbs @@ -0,0 +1 @@ +
{{content}}
diff --git a/app/assets/javascripts/admin/templates/components/permalinks-list.hbs b/app/assets/javascripts/admin/templates/components/permalinks-list.hbs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/admin/templates/components/site-customization-change-details.hbs b/app/assets/javascripts/admin/templates/components/site-customization-change-details.hbs new file mode 100644 index 0000000000..a9ea9cea09 --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/site-customization-change-details.hbs @@ -0,0 +1,18 @@ +
+ {{i18n 'admin.customize.enabled'}}: {{change.enabled}} +
+ +{{site-customization-change-field field=change.stylesheet name="admin.customize.css"}} +{{site-customization-change-field icon="mobile" field=change.mobile_stylesheet name="admin.customize.css"}} + +{{site-customization-change-field field=change.header name="admin.customize.header"}} +{{site-customization-change-field icon="mobile" field=change.mobile_header name="admin.customize.header"}} + +{{site-customization-change-field field=change.top name="admin.customize.top"}} +{{site-customization-change-field icon="mobile" field=change.mobile_top name="admin.customize.top"}} + +{{site-customization-change-field field=change.footer name="admin.customize.footer"}} +{{site-customization-change-field icon="mobile" field=change.mobile_footer name="admin.customize.footer"}} + +{{site-customization-change-field icon="file-text-o" field=change.head_tag name="admin.customize.head_tag.text"}} +{{site-customization-change-field icon="file-text-o" field=change.body_tag name="admin.customize.body_tag.text"}} diff --git a/app/assets/javascripts/admin/templates/components/site-customization-change-field.hbs b/app/assets/javascripts/admin/templates/components/site-customization-change-field.hbs new file mode 100644 index 0000000000..43aea18163 --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/site-customization-change-field.hbs @@ -0,0 +1,7 @@ +{{#if field}} +
+ {{i18n name}}: ({{i18n 'character_count' count=field.length}}) +
+ {{textarea value=field class="plain"}} +
+{{/if}} diff --git a/app/assets/javascripts/admin/templates/customize_colors.hbs b/app/assets/javascripts/admin/templates/customize-colors.hbs similarity index 100% rename from app/assets/javascripts/admin/templates/customize_colors.hbs rename to app/assets/javascripts/admin/templates/customize-colors.hbs diff --git a/app/assets/javascripts/admin/templates/email_index.hbs b/app/assets/javascripts/admin/templates/email-index.hbs similarity index 100% rename from app/assets/javascripts/admin/templates/email_index.hbs rename to app/assets/javascripts/admin/templates/email-index.hbs diff --git a/app/assets/javascripts/admin/templates/email_preview_digest.hbs b/app/assets/javascripts/admin/templates/email-preview-digest.hbs similarity index 50% rename from app/assets/javascripts/admin/templates/email_preview_digest.hbs rename to app/assets/javascripts/admin/templates/email-preview-digest.hbs index 7bd2a4455f..80f48717b0 100644 --- a/app/assets/javascripts/admin/templates/email_preview_digest.hbs +++ b/app/assets/javascripts/admin/templates/email-preview-digest.hbs @@ -19,9 +19,36 @@
{{#conditional-loading-spinner condition=loading}} - {{#if showHtml}} - {{{model.html_content}}} - {{else}} -
{{{model.text_content}}}
+ +