diff --git a/classes/FirstLetterStrategy.php b/classes/FirstLetterStrategy.php
index d2f30bf..58911d1 100644
--- a/classes/FirstLetterStrategy.php
+++ b/classes/FirstLetterStrategy.php
@@ -20,6 +20,13 @@ class FirstLetterStrategy {
return pathinfo($filename, PATHINFO_FILENAME).'-'.$width.'.'.pathinfo($filename, PATHINFO_EXTENSION);
}
+ public function versionRegex($filename) {
+ $ext = preg_quote(pathinfo($filename, PATHINFO_EXTENSION), '/');
+ $name = preg_quote(pathinfo($filename, PATHINFO_FILENAME), '/');
+
+ return "/^{$name}-[0-9]+\.{$ext}$/";
+ }
+
public function croppedPath() {
return 'cropped';
}
diff --git a/classes/UploadStorage.php b/classes/UploadStorage.php
index 3b2e3bd..8a21417 100644
--- a/classes/UploadStorage.php
+++ b/classes/UploadStorage.php
@@ -30,7 +30,39 @@ class UploadStorage {
'crop' => $this->data['crop']
]);
- return $fileName;
+ return $sourcePath.'/'.$fileName;
+ }
+
+ public function getFileData($filename) {
+ $realname = preg_replace('/^source/', 'cropped', $filename);
+
+ return [
+ 'url' => $this->storage()->url($realname),
+ 'type' => $this->storage()->mimeType($filename),
+ 'size' => $this->storage()->size($filename),
+ 'name' => pathinfo($filename, PATHINFO_BASENAME)
+ ];
+ }
+
+ public function removeFile($filename) {
+ $sourcePath = $this->getStrategy()->sourcePath($filename).'/'.$filename;
+ $croppedPath = $this->getStrategy()->croppedPath().'/'.$filename;
+
+ if (!Storage::disk($this->disk)->exists($sourcePath)) {
+ return;
+ }
+
+ if (Storage::disk($this->disk)->exists($croppedPath)) {
+ Storage::disk($this->disk)->delete($croppedPath);
+ }
+
+ collect(Storage::disk($this->disk)->files($this->getStrategy()->publicPath($filename)))->filter(function($file) use ($filename) {
+ return preg_match($this->getStrategy()->versionRegex($filename), pathinfo($file, PATHINFO_BASENAME));
+ })->each(function($file) {
+ Storage::disk($this->disk)->delete($file);
+ });
+
+ Storage::disk($this->disk)->delete($sourcePath);
}
private function storage() {
diff --git a/formwidgets/Responsiveimage.php b/formwidgets/Responsiveimage.php
index 710a334..4c612e4 100644
--- a/formwidgets/Responsiveimage.php
+++ b/formwidgets/Responsiveimage.php
@@ -118,8 +118,11 @@ class Responsiveimage extends FormWidgetBase
*/
protected function prepareVars()
{
- $this->vars['aspectRatio'] = $this->aspectRatio;
- $this->vars['minWidth'] = $this->minWidth;
+ $this->vars['aspectRatio'] = $this->aspectRatio ?: 'null';
+ $this->vars['minWidth'] = $this->minWidth ?: '0';
+ $this->vars['name'] = $this->formField->getName();
+ $this->vars['value'] = str_replace('"', "'", json_encode($this->getLoadValue()));
+ $this->vars['model'] = $this->model;
}
/**
@@ -134,6 +137,15 @@ class Responsiveimage extends FormWidgetBase
return $record;
}
+ public function getLoadValue() {
+ $value = parent::getLoadValue();
+ if (!$value) {
+ return null;
+ }
+
+ return app(UploadStorage::class)->getFileData($value['file']);
+ }
+
/**
* Returns the escaped and translated prompt text to display according to the type.
* @return string
@@ -186,46 +198,6 @@ class Responsiveimage extends FormWidgetBase
return $cssDimensions;
}
- /**
- * Returns the specified accepted file types, or the default
- * based on the mode. Image mode will return:
- * - jpg,jpeg,bmp,png,gif,svg
- * @return string
- */
- public function getAcceptedFileTypes($includeDot = false)
- {
- $types = $this->fileTypes;
-
- if ($types === false) {
- $isImage = starts_with($this->getDisplayMode(), 'image');
- $types = implode(',', FileDefinitions::get($isImage ? 'imageExtensions' : 'defaultExtensions'));
- }
-
- if (!$types || $types == '*') {
- return null;
- }
-
- if (!is_array($types)) {
- $types = explode(',', $types);
- }
-
- $types = array_map(function ($value) use ($includeDot) {
- $value = trim($value);
-
- if (substr($value, 0, 1) == '.') {
- $value = substr($value, 1);
- }
-
- if ($includeDot) {
- $value = '.'.$value;
- }
-
- return $value;
- }, $types);
-
- return implode(',', $types);
- }
-
/**
* Removes a file attachment.
*/
@@ -281,7 +253,7 @@ class Responsiveimage extends FormWidgetBase
*/
public function getSaveValue($value)
{
- return FormField::NO_SAVE_DATA;
+ return $value ? json_decode($value) : null;
}
/**
@@ -300,9 +272,16 @@ class Responsiveimage extends FormWidgetBase
throw new ApplicationException('File is not valid');
}
- app(UploadStorage::class)->storeFileFromUpload($uploadedFile, $data);
+ $filename = app(UploadStorage::class)->storeFileFromUpload($uploadedFile, $data);
- return Response::make('', 200);
+ return Response::json([
+ 'file' => $filename,
+ 'data' => array_only($data, ['title', 'description'])
+ ], 200);
+ }
+
+ public function onDelete() {
+ app(UploadStorage::class)->removeFile(Input::get('fileName'));
}
/**
diff --git a/formwidgets/responsiveimage/assets/css/main.css b/formwidgets/responsiveimage/assets/css/main.css
index a6e31a4..9737200 100644
--- a/formwidgets/responsiveimage/assets/css/main.css
+++ b/formwidgets/responsiveimage/assets/css/main.css
@@ -169,6 +169,17 @@
position: relative;
background: white;
border: 1px solid rgba(0,0,0,0.2);
+ [data-dz-remove] {
+ position: absolute;
+ right: 0;
+ top: 0;
+ width: 2rem;
+ height: 2rem;
+ color: #333;
+ fill: currentColor;
+ margin-top: 0.5rem;
+ margin-right: 0.5rem;
+ }
div.details {
padding: 1rem;
flex: 1 0 0;
@@ -184,9 +195,9 @@
}
}
img {
- width: 15rem;
- height: 10rem;
- object-fit: cover;
+ width: 15rem !important;
+ height: 10rem !important;
+ object-fit: cover !important;
}
div.cdz-progress {
position: absolute;
diff --git a/formwidgets/responsiveimage/assets/src/App.vue b/formwidgets/responsiveimage/assets/src/App.vue
index c304758..d667140 100644
--- a/formwidgets/responsiveimage/assets/src/App.vue
+++ b/formwidgets/responsiveimage/assets/src/App.vue
@@ -9,10 +9,12 @@
-