Skip to content

Commit

Permalink
Merge pull request #64 from roboc/file_field
Browse files Browse the repository at this point in the history
Fix #37: Don't delete file on form submit
  • Loading branch information
roboc committed Jul 3, 2018
2 parents 09fff3d + 4bb845a commit cee9b76
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 32 deletions.
7 changes: 6 additions & 1 deletion resources/assets/js/Admin/FieldRegistry.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import Sortable, {CONFIG_JQUERY_SORTABLE} from "./Fields/Sortable";
import Slug from "./Fields/Slug";
import ObjectRelation from "./Fields/ObjectRelation";
import MapCoordinates from "./Fields/MapCoordinates";
import File from "./Fields/File";

export let FIELD_TYPE_DEFINITIONS = [
{
Expand Down Expand Up @@ -43,6 +44,10 @@ export let FIELD_TYPE_DEFINITIONS = [
{
handler: MapCoordinates,
selector: '.coordinate_picker'
},
{
handler: File,
selector: '.type-file'
}
];

Expand Down Expand Up @@ -135,4 +140,4 @@ class FieldRegistry {
}
}

export default new FieldRegistry(FIELD_TYPE_DEFINITIONS);
export default new FieldRegistry(FIELD_TYPE_DEFINITIONS);
27 changes: 27 additions & 0 deletions resources/assets/js/Admin/Fields/File.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
export default class File {
/**
* @param element
*/
constructor(element) {
this.element = element;

this.registerEventHandlers();
}

/**
* @return {void}
*/
registerEventHandlers() {
let field = this.getField();

field.find('button.remove').on('click', function () {
field.find('input.remove').val(1);
field.find('.thumbnail').hide();
field.find('.file-details').hide();
});
}

getField() {
return jQuery(this.element);
}
}
40 changes: 17 additions & 23 deletions src/Admin/Form/Fields/ArboryFile.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public function getDisk(): string
/**
* @param string $disk
*/
public function setDisk( string $disk )
public function setDisk(string $disk)
{
$this->disk = $disk;
}
Expand All @@ -43,9 +43,8 @@ public function getValue()
{
$value = parent::getValue();

if ( is_string( $value ) )
{
$value = \Arbory\Base\Files\ArboryFile::where( 'id', $value )->first();
if (is_string($value)) {
$value = \Arbory\Base\Files\ArboryFile::where('id', $value)->first();
}

return $value;
Expand All @@ -56,34 +55,32 @@ public function getValue()
*/
public function render()
{
return ( new FileFieldRenderer( $this ) )->render();
return (new FileFieldRenderer($this))->render();
}

/**
* @return void
*/
protected function deleteCurrentFileIfExists()
{
if ( $this->isRequired() )
{
if ($this->isRequired()) {
return;
}

$arboryFilesRepository = app( 'arbory_files' );
$arboryFilesRepository = app('arbory_files');

$currentFile = $this->getValue();

if( $currentFile )
{
$arboryFilesRepository->delete( $currentFile->getKey() );
if ($currentFile) {
$arboryFilesRepository->delete($currentFile->getKey());
}
}

/**
* @param Request $request
* @return void
*/
public function beforeModelSave( Request $request )
public function beforeModelSave(Request $request)
{
}

Expand All @@ -94,23 +91,20 @@ public function beforeModelSave( Request $request )
* @throws \RuntimeException
* @throws \InvalidArgumentException
*/
public function afterModelSave( Request $request )
public function afterModelSave(Request $request)
{
$input = $request->input( $this->getNameSpacedName() );
$uploadedFile = $request->file( $this->getNameSpacedName() );
$input = $request->input($this->getNameSpacedName());
$uploadedFile = $request->file($this->getNameSpacedName());

if( $input && array_key_exists( 'remove', $input ) )
{
if (array_get($input, 'remove')) {
$this->deleteCurrentFileIfExists();
}

if( $uploadedFile )
{
if ($uploadedFile) {
$this->deleteCurrentFileIfExists();

$factory = new ArboryFileFactory( new ArboryFilesRepository( $this->getDisk() ) );

$factory->make( $this->getModel(), $uploadedFile, $this->getName() );
$factory = new ArboryFileFactory(new ArboryFilesRepository($this->getDisk()));
$factory->make($this->getModel(), $uploadedFile, $this->getName());
}
}

Expand All @@ -119,6 +113,6 @@ public function afterModelSave( Request $request )
*/
public function isRequired(): bool
{
return in_array( 'arbory_file_required', $this->getRules(), true );
return in_array('arbory_file_required', $this->getRules(), true);
}
}
20 changes: 13 additions & 7 deletions src/Admin/Form/Fields/Renderer/FileFieldRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class FileFieldRenderer extends InputFieldRenderer
/**
* @var string
*/
protected $type = 'item';
protected $type = 'file';

/**
* @return ArboryFile
Expand Down Expand Up @@ -69,21 +69,27 @@ public function createFileDetails(ArboryFile $file): Element
{
$fileSize = (new FileSize($file))->getReadableSize();

$fileDetails = Html::div();
$fileDetails = Html::div()->addClass('file-details');
$downloadLink = Html::a($file->getOriginalName() . ' / ' . $fileSize)->addAttributes([
'href' => $file->getUrl(),
"target" => "_blank",
"download"
'target' => '_blank',
'download'
]);
$removeInput =
$removeButton =
Html::button()->addClass('remove fa fa-times')->addAttributes([
'type' => 'submit',
'name' => Element::formatName($this->field->getNameSpacedName() . '.remove'),
'type' => 'button',
]);

$removeInput = Html::input()
->setType('hidden')
->setName($this->field->getNameSpacedName() . '.remove')
->setValue('')
->addClass('remove');

$fileDetails->append($downloadLink);

if (!$this->field->isRequired()) {
$fileDetails->append($removeButton);
$fileDetails->append($removeInput);
}

Expand Down
8 changes: 7 additions & 1 deletion src/Admin/Form/Fields/Renderer/ImageFieldRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,13 @@ public function render()

if( $arboryFile )
{
$value->append( Html::image()->addAttributes( [ 'src' => $image->getUrl( $this->getManipulationParameters() ) ] ) );
$value->append(
Html::image()
->addAttributes([
'src' => $image->getUrl($this->getManipulationParameters())
])
->addClass('thumbnail')
);
$value->append( $this->createFileDetails( $arboryFile ) );
}

Expand Down

0 comments on commit cee9b76

Please sign in to comment.