Created
October 20, 2022 21:29
-
-
Save dmason30/86e606ff913c10f7e37118f491dd9066 to your computer and use it in GitHub Desktop.
Displays disabled buttons on nova resource index when rows have conditional actions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Index: resources/js/components/ResourceTableRow.vue | |
IDEA additional info: | |
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP | |
<+>UTF-8 | |
=================================================================== | |
diff --git a/resources/js/components/ResourceTableRow.vue b/resources/js/components/ResourceTableRow.vue | |
--- a/resources/js/components/ResourceTableRow.vue (revision 325274bea63bbff23afb280ddb4dd70dff253ca9) | |
+++ b/resources/js/components/ResourceTableRow.vue (date 1666301196856) | |
@@ -76,21 +76,22 @@ | |
/> | |
<!-- View Resource Link --> | |
- <template v-if="resource.authorizedToView"> | |
+ <template v-if="resource.authorizedToViewSome"> | |
<Link | |
v-tooltip.click="__('View')" | |
:aria-label="__('View')" | |
:data-testid="`${testId}-view-button`" | |
+ :disabled="!resource.authorizedToView" | |
:dusk="`${resource['id'].value}-view-button`" | |
:href="$url(`/resources/${resourceName}/${resource['id'].value}`)" | |
- class="toolbar-button hover:text-primary-500 px-2" | |
+ class="toolbar-button hover:text-primary-500 px-2 disabled:opacity-50" | |
@click.stop | |
> | |
<Icon type="eye" /> | |
</Link> | |
</template> | |
- <template v-if="resource.authorizedToUpdate"> | |
+ <template v-if="resource.authorizedToUpdateSome"> | |
<!-- Edit Pivot Button --> | |
<Link | |
v-if=" | |
@@ -99,6 +100,7 @@ | |
" | |
v-tooltip.click="__('Edit Attached')" | |
:aria-label="__('Edit Attached')" | |
+ :disabled="!resource.authorizedToUpdate" | |
:dusk="`${resource['id'].value}-edit-attached-button`" | |
:href=" | |
$url( | |
@@ -109,7 +111,7 @@ | |
} | |
) | |
" | |
- class="toolbar-button hover:text-primary-500" | |
+ class="toolbar-button hover:text-primary-500 disabled:opacity-50" | |
@click.stop | |
> | |
<Icon type="pencil-alt" /> | |
@@ -120,6 +122,7 @@ | |
v-else | |
v-tooltip.click="__('Edit')" | |
:aria-label="__('Edit')" | |
+ :disabled="!resource.authorizedToUpdate" | |
:dusk="`${resource['id'].value}-edit-button`" | |
:href=" | |
$url(`/resources/${resourceName}/${resource['id'].value}/edit`, { | |
@@ -128,7 +131,7 @@ | |
viaRelationship: viaRelationship, | |
}) | |
" | |
- class="toolbar-button hover:text-primary-500 px-2" | |
+ class="toolbar-button hover:text-primary-500 px-2 disabled:opacity-50" | |
@click.stop | |
> | |
<Icon type="pencil-alt" /> | |
@@ -138,14 +141,15 @@ | |
<!-- Delete Resource Link --> | |
<button | |
v-if=" | |
- resource.authorizedToDelete && | |
+ (resource.authorizedToDeleteSome || resource.authorizedToDelete) && | |
(!resource.softDeleted || viaManyToMany) | |
" | |
v-tooltip.click="__(viaManyToMany ? 'Detach' : 'Delete')" | |
:aria-label="__(viaManyToMany ? 'Detach' : 'Delete')" | |
:data-testid="`${testId}-delete-button`" | |
+ :disabled="!resource.authorizedToDelete" | |
:dusk="`${resource['id'].value}-delete-button`" | |
- class="toolbar-button hover:text-primary-500 px-2" | |
+ class="toolbar-button hover:text-primary-500 px-2 disabled:opacity-50" | |
@click.stop="openDeleteModal" | |
> | |
<Icon type="trash" /> | |
@@ -154,12 +158,13 @@ | |
<!-- Restore Resource Link --> | |
<button | |
v-if=" | |
- resource.authorizedToRestore && | |
+ ((resource.authorizedToRestoreSome && !resource.authorizedToDelete) || resource.authorizedToRestore) && | |
resource.softDeleted && | |
!viaManyToMany | |
" | |
v-tooltip.click="__('Restore')" | |
:aria-label="__('Restore')" | |
+ :disabled="!resource.authorizedToRestore" | |
:dusk="`${resource['id'].value}-restore-button`" | |
class="toolbar-button hover:text-primary-500 px-2" | |
@click.stop="openRestoreModal" | |
Index: src/Http/Resources/IndexViewResource.php | |
IDEA additional info: | |
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP | |
<+>UTF-8 | |
=================================================================== | |
diff --git a/src/Http/Resources/IndexViewResource.php b/src/Http/Resources/IndexViewResource.php | |
--- a/src/Http/Resources/IndexViewResource.php (revision 325274bea63bbff23afb280ddb4dd70dff253ca9) | |
+++ b/src/Http/Resources/IndexViewResource.php (date 1666300805996) | |
@@ -3,6 +3,7 @@ | |
namespace Laravel\Nova\Http\Resources; | |
use Laravel\Nova\Http\Requests\ResourceIndexRequest; | |
+use Laravel\Nova\ResourceCollection; | |
class IndexViewResource extends Resource | |
{ | |
@@ -18,9 +19,21 @@ | |
[$paginator, $total, $sortable] = $request->searchIndex(); | |
+ /** @var ResourceCollection $resources */ | |
+ $resources = $paginator->getCollection()->mapInto($resource)->map->serializeForIndex($request); | |
+ | |
+ $authorized = [ | |
+ 'authorizedToViewSome' => $resources->some('authorizedToView', true), | |
+ 'authorizedToUpdateSome' => $resources->some('authorizedToUpdate', true), | |
+ 'authorizedToDeleteSome' => $resources->some('authorizedToDelete', true), | |
+ 'authorizedToRestoreSome' => $resources->some('authorizedToRestore', true), | |
+ ]; | |
+ | |
return [ | |
'label' => $resource::label(), | |
- 'resources' => $paginator->getCollection()->mapInto($resource)->map->serializeForIndex($request), | |
+ 'resources' => $resources->map(function (array $resource) use ($authorized) { | |
+ return array_merge($resource, $authorized); | |
+ }), | |
'prev_page_url' => $paginator->previousPageUrl(), | |
'next_page_url' => $paginator->nextPageUrl(), | |
'per_page' => $paginator->perPage(), |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment