Skip to content

Commit

Permalink
# moved existing media handling to trait
Browse files Browse the repository at this point in the history
  • Loading branch information
ebess committed Sep 3, 2019
1 parent 55b9b1c commit afe8a2d
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 61 deletions.
2 changes: 1 addition & 1 deletion dist/js/field.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"devDependencies": {
"cross-env": "^5.0.0",
"laravel-mix": "^4.0.7",
"laravel-nova": "*",
"laravel-nova": "^1.0.9",
"object-to-formdata": "^1.5.2",
"resolve-url-loader": "2.3.1",
"sass": "^1.19.0",
Expand Down
13 changes: 7 additions & 6 deletions resources/js/components/fields/FormField.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
<gallery slot="value" ref="gallery" v-if="hasSetInitialValue"
v-model="value" editable custom-properties :field="field" :multiple="field.multiple"
:has-error="hasError" :first-error="firstError"/>
<button type="button" class="form-file-btn btn btn-default btn-primary mt-2" @click="existingMediaOpen = true">{{ openExistingMediaLabel }}</button>
<existing-media
:open="existingMediaOpen"
@close="existingMediaOpen = false"
@select="(item) => { addExistingItem(item) }"
></existing-media>

<div v-if="field.existingMedia">
<button type="button" class="form-file-btn btn btn-default btn-primary mt-2" @click="existingMediaOpen = true">
{{ openExistingMediaLabel }}
</button>
<existing-media :open="existingMediaOpen" @close="existingMediaOpen = false" @select="addExistingItem"/>
</div>
</div>
</template>
</component>
Expand Down
55 changes: 55 additions & 0 deletions src/Fields/HandlesExistingMediaTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

namespace Ebess\AdvancedNovaMediaLibrary\Fields;

use Laravel\Nova\Http\Requests\NovaRequest;
use Spatie\MediaLibrary\Filesystem\Filesystem;
use Spatie\MediaLibrary\Helpers\TemporaryDirectory;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Illuminate\Support\Collection;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
* @mixin Media
*/
trait HandlesExistingMediaTrait
{
public function enableExistingMedia(): self
{
return $this->withMeta(['existingMedia' => true]);
}

private function addExistingMedia(NovaRequest $request, $data, HasMedia $model, string $collection, Collection $medias): Collection
{
$addedMediaIds = $medias->pluck('id')->toArray();

return collect($data)
->filter(function ($value) use ($addedMediaIds) {
return (!($value instanceof UploadedFile)) && !(in_array((int) $value, $addedMediaIds));
})->map(function ($model_id, int $index) use ($request, $model, $collection) {
$mediaClass = config('medialibrary.media_model');
$existingMedia = $mediaClass::find($model_id);

// Mimic copy behaviour
// See Spatie\MediaLibrary\Models\Media->copy()
$temporaryDirectory = TemporaryDirectory::create();
$temporaryFile = $temporaryDirectory->path($existingMedia->file_name);
app(Filesystem::class)->copyFromMediaLibrary($existingMedia, $temporaryFile);
$media = $model->addMedia($temporaryFile)->withCustomProperties($this->customProperties);

if($this->responsive) {
$media->withResponsiveImages();
}

$media = $media->toMediaCollection($collection);

// fill custom properties for recently created media
$this->fillMediaCustomPropertiesFromRequest($request, $media, $index, $collection);

// Delete our temp collection
$temporaryDirectory->delete();

return $media->getKey();
});
}
}
50 changes: 1 addition & 49 deletions src/Fields/Media.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,14 @@
use Illuminate\Support\Collection;
use Laravel\Nova\Fields\Field;
use Laravel\Nova\Http\Requests\NovaRequest;
use Spatie\MediaLibrary\Filesystem\Filesystem;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
use Spatie\MediaLibrary\Helpers\TemporaryDirectory;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Illuminate\Support\Facades\Validator;

class Media extends Field
{
use HandlesCustomPropertiesTrait, HandlesConversionsTrait;
use HandlesCustomPropertiesTrait, HandlesConversionsTrait, HandlesExistingMediaTrait;

public $component = 'advanced-media-library-field';

Expand Down Expand Up @@ -155,52 +153,6 @@ private function setOrder($ids)
$mediaClass::setNewOrder($ids);
}

private function addExistingMedia(NovaRequest $request, $data, HasMedia $model, string $collection, Collection $medias): Collection
{
$addedMediaIds = $medias->pluck('id')->toArray();

return collect($data)
->filter(function ($value) use ($addedMediaIds) {
return (!($value instanceof UploadedFile)) && !(in_array((int) $value, $addedMediaIds));
})->map(function ($model_id, int $index) use ($request, $model, $collection) {
$mediaClass = config('medialibrary.media_model');
$existingMedia = $mediaClass::find($model_id);

// Mimic copy behaviour
// See Spatie\MediaLibrary\Models\Media->copy()
$temporaryDirectory = TemporaryDirectory::create();
$temporaryFile = $temporaryDirectory->path($existingMedia->file_name);
app(Filesystem::class)->copyFromMediaLibrary($existingMedia, $temporaryFile);
$media = $model->addMedia($temporaryFile)->withCustomProperties($this->customProperties);

if($this->responsive) {
$media->withResponsiveImages();
}

if (is_callable($this->setFileNameCallback)) {
$media->setFileName(
call_user_func($this->setFileNameCallback, $file->getClientOriginalName(), $file->getClientOriginalExtension(), $model)
);
}

if (is_callable($this->setNameCallback)) {
$media->setName(
call_user_func($this->setNameCallback, $file->getClientOriginalName(), $model)
);
}

$media = $media->toMediaCollection($collection);

// fill custom properties for recently created media
$this->fillMediaCustomPropertiesFromRequest($request, $media, $index, $collection);

// Delete our temp collection
$temporaryDirectory->delete();

return $media->getKey();
});
}

private function addNewMedia(NovaRequest $request, $data, HasMedia $model, string $collection): Collection
{
return collect($data)
Expand Down
1 change: 0 additions & 1 deletion src/Http/Controllers/MediaController.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ public function index(MediaRequest $request)

$searchText = $request->input('search_text') ?: null;
$perPage = $request->input('per_page') ?: 18;
$page = $request->input('page') ?: 1;

$query = null;

Expand Down
6 changes: 3 additions & 3 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3230,9 +3230,9 @@ laravel-mix@^4.0.7:
webpack-notifier "^1.5.1"
yargs "^12.0.5"

laravel-nova@*:
version "1.0.8"
resolved "https://registry.yarnpkg.com/laravel-nova/-/laravel-nova-1.0.8.tgz#6a4a687541ce89017604c3458865f3c7eb3001a2"
laravel-nova@^1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/laravel-nova/-/laravel-nova-1.0.9.tgz#66ec4cbc1eb896ce058d0a6451e5e24a68888038"
dependencies:
babel-plugin-syntax-jsx "^6.18.0"
form-backend-validation "^2.3.3"
Expand Down

0 comments on commit afe8a2d

Please sign in to comment.