{
$this->checkPermission('image-create-all');
$this->validate($request, [
- 'file' => 'required|is_image'
+ 'file' => 'required|image'
]);
if (!$this->imageRepo->isValidType($type)) {
public function boot()
{
// Custom validation methods
- Validator::extend('is_image', function ($attribute, $value, $parameters, $validator) {
+ Validator::extend('image', function ($attribute, $value, $parameters, $validator) {
$imageMimes = ['image/png', 'image/bmp', 'image/gif', 'image/jpeg', 'image/jpg', 'image/tiff', 'image/webp'];
return in_array($value->getMimeType(), $imageMimes);
});
function mounted() {
let container = this.$el;
let _this = this;
- new DropZone(container, {
+ this._dz = new DropZone(container, {
+ addRemoveLinks: true,
+ dictRemoveFile: trans('components.image_upload_remove'),
url: function() {
return _this.uploadUrl;
},
$(file.previewElement).find('[data-dz-errormessage]').text(message);
}
- if (xhr.status === 413) setMessage(trans('errors.server_upload_limit'));
+ if (xhr && xhr.status === 413) setMessage(trans('errors.server_upload_limit'));
if (errorMessage.file) setMessage(errorMessage.file[0]);
});
}
}
function data() {
- return {}
+ return {};
}
+const methods = {
+ onClose: function () {
+ this._dz.removeAllFiles(true);
+ }
+};
+
module.exports = {
template,
props,
mounted,
data,
-};
\ No newline at end of file
+ methods
+};
hide() {
this.showing = false;
+ this.selectedImage = false;
+ this.$refs.dropzone.onClose();
this.$el.children[0].components.overlay.hide();
},
data,
computed,
components: {dropzone},
-};
\ No newline at end of file
+};
padding: 0;
align-items: center;
text-align: center;
+ justify-content: center;
width: 28px;
padding-left: $-xs;
padding-right: $-xs;
&:hover {
background-color: #EEE;
}
- i {
- flex: 1;
- padding: 0;
+ .svg-icon {
+ margin-right: 0px;
}
}
> div .outline input {
background-color: #F8F8F8;
padding: $-m;
border: 1px solid #DDD;
-}
\ No newline at end of file
+}
margin-left: 1px;
padding: $-m $-l;
overflow-y: auto;
+ overflow-x: hidden;
border-left: 1px solid #DDD;
.dropzone-container {
margin-top: $-m;
.dz-preview.dz-file-preview .dz-image {
border-radius: 4px;
- background: #999;
- background: linear-gradient(to bottom, #eee, #ddd);
+ background: #e9e9e9;
}
.dz-preview.dz-file-preview .dz-details {
}
.dz-preview .dz-remove {
- font-size: 14px;
+ font-size: 13px;
text-align: center;
display: block;
cursor: pointer;
border: none;
+ margin-top: 3px;
}
.dz-preview .dz-remove:hover {
border: 1px solid transparent;
}
-.dz-preview .dz-details .dz-filename span, .dz-preview .dz-details .dz-size span {
+.dz-preview .dz-details .dz-filename span {
background-color: rgba(255, 255, 255, 0.4);
padding: 0 0.4em;
border-radius: 3px;
.dz-preview .dz-success-mark, .dz-preview .dz-error-mark {
pointer-events: none;
opacity: 0;
- z-index: 500;
+ z-index: 1001;
position: absolute;
display: block;
top: 50%;
left: 50%;
margin-left: -27px;
- margin-top: -27px;
+ margin-top: -35px;
}
.dz-preview .dz-success-mark svg, .dz-preview .dz-error-mark svg {
display: block;
}
-.dz-preview.dz-error:hover .dz-error-message {
- opacity: 1;
- pointer-events: auto;
+.dz-preview.dz-error {
+ .dz-image, .dz-details {
+ &:hover ~ .dz-error-message {
+ opacity: 1;
+ pointer-events: auto;
+ }
+ }
}
.dz-preview .dz-error-message {
opacity: 0;
transition: opacity 0.3s ease;
border-radius: 4px;
- font-size: 11.5px;
+ font-size: 12px;
line-height: 1.2;
top: 88px;
left: -26px;
.text-muted {
color: #999;
}
-}
\ No newline at end of file
+}
flex: 1;
padding-top: 0;
}
+ div[toolbox-tab-content] .padded.files {
+ overflow-x: hidden;
+ }
h4 {
font-size: 24px;
margin: $-m 0 0 0;
'image_upload_success' => 'Image uploaded successfully',
'image_update_success' => 'Image details successfully updated',
'image_delete_success' => 'Image successfully deleted',
+ 'image_upload_remove' => 'Remove',
/**
* Code editor
'code_language' => 'Code Language',
'code_content' => 'Code Content',
'code_save' => 'Save Code',
-];
\ No newline at end of file
+];
'cannot_get_image_from_url' => 'Cannot get image from :url',
'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.',
'server_upload_limit' => 'The server does not allow uploads of this size. Please try a smaller file size.',
+ 'uploaded' => 'The server does not allow uploads of this size. Please try a smaller file size.',
'image_upload_error' => 'An error occurred uploading the image',
'image_upload_type_error' => 'The image type being uploaded is invalid',
'error_occurred' => 'An Error Occurred',
'app_down' => ':appName is down right now',
'back_soon' => 'It will be back up soon.',
-];
\ No newline at end of file
+];
<div id="image-manager" image-type="{{ $imageType }}" uploaded-to="{{ $uploaded_to or 0 }}">
- <div overlay v-cloak>
+ <div overlay v-cloak @click="hide()">
<div class="popup-body" @click.stop="">
<div class="popup-header primary-background">
<div class="popup-title">{{ trans('components.image_select') }}</div>
- <button class="overlay-close neg corner-button button">x</button>
+ <button class="overlay-close neg corner-button button" @click="hide()">x</button>
</div>
<div class="flex-fill image-manager-body">
</div>
- <dropzone placeholder="{{ trans('components.image_dropzone') }}" :upload-url="uploadUrl" :uploaded-to="uploadedTo" @success="uploadSuccess"></dropzone>
+ <dropzone ref="dropzone" placeholder="{{ trans('components.image_dropzone') }}" :upload-url="uploadUrl" :uploaded-to="uploadedTo" @success="uploadSuccess"></dropzone>
</div>
</div>