diff --git a/ghost/admin/app/components/gh-image-uploader.js b/ghost/admin/app/components/gh-image-uploader.js index 8dd3ef1953..bf5f21841c 100644 --- a/ghost/admin/app/components/gh-image-uploader.js +++ b/ghost/admin/app/components/gh-image-uploader.js @@ -24,8 +24,10 @@ export default Component.extend({ text: '', altText: '', saveButton: true, - accept: 'image/gif,image/jpg,image/jpeg,image/png,image/svg+xml', - extensions: ['gif', 'jpg', 'jpeg', 'png', 'svg'], + accept: null, + extensions: null, + uploadUrl: null, + allowUrlInput: true, validate: null, dragClass: null, @@ -39,6 +41,10 @@ export default Component.extend({ config: injectService(), notifications: injectService(), + _defaultAccept: 'image/gif,image/jpg,image/jpeg,image/png,image/svg+xml', + _defaultExtensions: ['gif', 'jpg', 'jpeg', 'png', 'svg'], + _defaultUploadUrl: '/uploads/', + // TODO: this wouldn't be necessary if the server could accept direct // file uploads formData: computed('file', function () { @@ -83,6 +89,16 @@ export default Component.extend({ didReceiveAttrs() { let image = this.get('image'); this.set('url', image); + + if (!this.get('accept')) { + this.set('accept', this.get('_defaultAccept')); + } + if (!this.get('extensions')) { + this.set('extensions', this.get('_defaultExtensions')); + } + if (!this.get('uploadUrl')) { + this.set('uploadUrl', this.get('_defaultUploadUrl')); + } }, dragOver(event) { @@ -161,7 +177,10 @@ export default Component.extend({ } if (isUnsupportedMediaTypeError(error)) { - message = 'The image type you uploaded is not supported. Please use .PNG, .JPG, .GIF, .SVG.'; + let validExtensions = this.get('extensions').join(', .').toUpperCase(); + validExtensions = `.${validExtensions}`; + + message = `The image type you uploaded is not supported. Please use ${validExtensions}`; } else if (isRequestEntityTooLargeError(error)) { message = 'The image you uploaded was larger than the maximum file size your server allows.'; } else if (error.errors && !isBlank(error.errors[0].message)) { @@ -177,7 +196,9 @@ export default Component.extend({ generateRequest() { let ajax = this.get('ajax'); let formData = this.get('formData'); - let url = `${ghostPaths().apiRoot}/uploads/`; + let uploadUrl = this.get('uploadUrl'); + // CASE: we want to upload an icon and we have to POST it to a different endpoint, expecially for icons + let url = `${ghostPaths().apiRoot}${uploadUrl}`; this._uploadStarted(); diff --git a/ghost/admin/app/controllers/settings/general.js b/ghost/admin/app/controllers/settings/general.js index e6b45210b3..8ab8a3489d 100644 --- a/ghost/admin/app/controllers/settings/general.js +++ b/ghost/admin/app/controllers/settings/general.js @@ -14,6 +14,7 @@ export default Controller.extend(SettingsSaveMixin, { showUploadLogoModal: false, showUploadCoverModal: false, + showUploadIconModal: false, showDeleteThemeModal: notEmpty('themeToDelete'), ajax: injectService(), @@ -24,10 +25,17 @@ export default Controller.extend(SettingsSaveMixin, { _scratchFacebook: null, _scratchTwitter: null, + iconMimeTypes: 'image/png,image/x-icon', + iconExtensions: ['ico', 'png'], + logoImageSource: computed('model.logo', function () { return this.get('model.logo') || ''; }), + iconImageSource: computed('model.icon', function () { + return this.get('model.icon') || ''; + }), + coverImageSource: computed('model.cover', function () { return this.get('model.cover') || ''; }), @@ -131,6 +139,10 @@ export default Controller.extend(SettingsSaveMixin, { this.toggleProperty('showUploadLogoModal'); }, + toggleUploadIconModal() { + this.toggleProperty('showUploadIconModal'); + }, + validateFacebookUrl() { let newUrl = this.get('_scratchFacebook'); let oldUrl = this.get('model.facebook'); diff --git a/ghost/admin/app/models/setting.js b/ghost/admin/app/models/setting.js index 9bcad64dba..86a4e70425 100644 --- a/ghost/admin/app/models/setting.js +++ b/ghost/admin/app/models/setting.js @@ -10,6 +10,7 @@ export default Model.extend(ValidationEngine, { description: attr('string'), logo: attr('string'), cover: attr('string'), + icon: attr('string'), defaultLang: attr('string'), postsPerPage: attr('number'), forceI18n: attr('boolean'), diff --git a/ghost/admin/app/templates/components/gh-image-uploader.hbs b/ghost/admin/app/templates/components/gh-image-uploader.hbs index af8a63071e..ebfc9d95aa 100644 --- a/ghost/admin/app/templates/components/gh-image-uploader.hbs +++ b/ghost/admin/app/templates/components/gh-image-uploader.hbs @@ -19,10 +19,11 @@