Skip to content

Instantly share code, notes, and snippets.

@dmason30
Created October 20, 2022 21:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dmason30/86e606ff913c10f7e37118f491dd9066 to your computer and use it in GitHub Desktop.
Save dmason30/86e606ff913c10f7e37118f491dd9066 to your computer and use it in GitHub Desktop.
Displays disabled buttons on nova resource index when rows have conditional actions
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