Skip to content

Commit

Permalink
Support Actions (#40)
Browse files Browse the repository at this point in the history
  • Loading branch information
milewski committed Oct 27, 2023
1 parent 41fa100 commit 9b9ad1c
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 12 deletions.
2 changes: 1 addition & 1 deletion dist/js/field.js

Large diffs are not rendered by default.

18 changes: 12 additions & 6 deletions resources/js/components/FilePondWrapper.vue
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
<script>
import { ref } from 'vue'
import cloneDeep from 'lodash/cloneDeep'
import vueFilePond from 'vue-filepond'
import FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type'
import FilePondPluginImagePreview from 'filepond-plugin-image-preview'
Expand All @@ -56,16 +57,16 @@
export default {
components: { FilePond },
props: [ 'field', 'resourceName', 'onChange', 'errors', 'columns', 'limit', 'allowReorder', 'allowRemove' ],
props: [ 'field', 'resourceName', 'onChange', 'errors', 'columns', 'limit', 'allowReorder', 'allowRemove', 'mode', 'action' ],
setup(props) {
return {
instance: ref(),
nameField: props.field.attribute,
files: [ ...props.field.value ],
files: cloneDeep(props.field.value),
cssVars: {
'--filepond-column': (100 / (props.columns || props.field.columns)) + '%',
'--filepond-max-height': props.field.maxHeight
'--filepond-max-height': props.field.maxHeight,
},
serverOptions: {
url: '/nova-vendor/nova-filepond',
Expand All @@ -74,19 +75,24 @@
process: {
url: '/process',
ondata: formData => {
if (props.mode === 'action-modal') {
formData.append('action', props.action)
}
formData.append('attribute', props.field.attribute)
formData.append('resourceName', props.resourceName)
return formData
},
onerror: errors => {
props.errors.record(JSON.parse(errors))
}
},
},
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
}
}
},
},
}
},
Expand Down
25 changes: 22 additions & 3 deletions resources/js/components/FormField.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
<template #field>

<FilePondWrapper
:mode="mode"
:action="action"
ref="instance"
:field="field"
:resourceName="resourceName"
Expand All @@ -23,7 +25,7 @@

<script>
import { ref } from 'vue'
import { ref, computed } from 'vue'
import { FormField, HandlesValidationErrors } from 'laravel-nova'
import FilePondWrapper from './FilePondWrapper'
Expand All @@ -35,10 +37,26 @@
resourceId: String,
field: Object,
},
setup(props) {
setup(props, context) {
const instance = ref()
const files = ref([])
const action = computed(() => {
try {
const attributes = new URLSearchParams(context.attrs[ 'sync-endpoint' ].split('?')[ 1 ])
const { action } = Object.fromEntries(attributes.entries())
return action
} catch {
return null
}
})
function fill(formData) {
Expand Down Expand Up @@ -69,9 +87,10 @@
return {
fill,
action,
instance,
updateFiles,
setInitialValue
setInitialValue,
}
},
Expand Down
16 changes: 14 additions & 2 deletions src/Http/Controllers/ProcessController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
use Laravel\Nova\Actions\Action;
use Laravel\Nova\Fields\FieldCollection;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\Nova;
use Symfony\Component\HttpFoundation\Response;
Expand All @@ -27,6 +29,7 @@ public function __invoke(NovaRequest $request): Response
{
$attribute = $request->input('attribute');
$resourceName = $request->input('resourceName');
$actionUriKey = $request->input('action');
$file = $request->file($attribute);

if (!$file->isValid()) {
Expand All @@ -42,8 +45,17 @@ public function __invoke(NovaRequest $request): Response

$resource = Nova::resourceInstanceForKey($resourceName);

$rules = $resource
->creationFields($request)
$fields = match (true) {
!is_null($actionUriKey) => new FieldCollection(
items: $resource
->availableActions($request)
->first(fn (Action $action) => $action->uriKey() === $actionUriKey)
->fields($request),
),
default => $resource->creationFields($request),
};

$rules = $fields
->firstWhere('attribute', $attribute)
->getCreationRules($request);

Expand Down

0 comments on commit 9b9ad1c

Please sign in to comment.