230 lines
6.9 KiB
Vue
230 lines
6.9 KiB
Vue
<template>
|
|
<div
|
|
class="flex flex-col md:flex-row md:items-center"
|
|
:class="{
|
|
'py-3 border-b border-gray-200 dark:border-gray-700':
|
|
shouldShowCheckboxes ||
|
|
shouldShowDeleteMenu ||
|
|
softDeletes ||
|
|
!viaResource ||
|
|
hasFilters ||
|
|
haveStandaloneActions,
|
|
}"
|
|
>
|
|
<div class="flex items-center flex-1">
|
|
<div class="md:ml-3">
|
|
<SelectAllDropdown
|
|
v-if="shouldShowCheckboxes"
|
|
:all-matching-resource-count="allMatchingResourceCount"
|
|
:current-page-count="currentPageCount"
|
|
@toggle-select-all="toggleSelectAll"
|
|
@toggle-select-all-matching="toggleSelectAllMatching"
|
|
@deselect="$emit('deselect')"
|
|
/>
|
|
</div>
|
|
|
|
<!-- Toolbar Items -->
|
|
<div class="h-9 ml-auto flex items-center pr-2 md:pr-3">
|
|
<!-- Action Selector -->
|
|
<div class="hidden md:flex px-2">
|
|
<ActionSelector
|
|
v-if="shouldShowActionSelector"
|
|
:resource-name="resourceName"
|
|
:via-resource="actionQueryString.viaResource"
|
|
:via-resource-id="actionQueryString.viaResourceId"
|
|
:via-relationship="actionQueryString.viaRelationship"
|
|
:actions="availableActions"
|
|
:pivot-actions="pivotActions"
|
|
:pivot-name="pivotName"
|
|
:endpoint="actionsEndpoint"
|
|
:selected-resources="selectedResourcesForActionSelector"
|
|
@actionExecuted="getResources"
|
|
/>
|
|
</div>
|
|
|
|
<!-- Resource Polling -->
|
|
<Button
|
|
@click="togglePolling"
|
|
v-if="shouldShowPollingToggle"
|
|
icon="clock"
|
|
variant="link"
|
|
:state="currentlyPolling ? 'default' : 'mellow'"
|
|
/>
|
|
|
|
<!-- Lenses -->
|
|
<LensSelector
|
|
v-if="lenses?.length > 0"
|
|
:resource-name="resourceName"
|
|
:lenses="lenses"
|
|
/>
|
|
|
|
<!-- Filters -->
|
|
<FilterMenu
|
|
v-if="filters.length > 0 || softDeletes || !viaResource"
|
|
:active-filter-count="activeFilterCount"
|
|
:filters-are-applied="filtersAreApplied"
|
|
:filters="filters"
|
|
:per-page-options="filterPerPageOptions"
|
|
:per-page="perPage"
|
|
:resource-name="resourceName"
|
|
:soft-deletes="softDeletes"
|
|
:trashed="trashed"
|
|
:via-resource="viaResource"
|
|
@clear-selected-filters="clearSelectedFilters(lens || null)"
|
|
@filter-changed="filterChanged"
|
|
@per-page-changed="updatePerPageChanged"
|
|
@trashed-changed="trashedChanged"
|
|
/>
|
|
|
|
<DeleteMenu
|
|
class="flex"
|
|
v-if="shouldShowDeleteMenu"
|
|
dusk="delete-menu"
|
|
:soft-deletes="softDeletes"
|
|
:resources="resources"
|
|
:selected-resources="selectedResources"
|
|
:via-many-to-many="viaManyToMany"
|
|
:all-matching-resource-count="allMatchingResourceCount"
|
|
:all-matching-selected="selectAllMatchingChecked"
|
|
:authorized-to-delete-selected-resources="
|
|
authorizedToDeleteSelectedResources
|
|
"
|
|
:authorized-to-force-delete-selected-resources="
|
|
authorizedToForceDeleteSelectedResources
|
|
"
|
|
:authorized-to-delete-any-resources="authorizedToDeleteAnyResources"
|
|
:authorized-to-force-delete-any-resources="
|
|
authorizedToForceDeleteAnyResources
|
|
"
|
|
:authorized-to-restore-selected-resources="
|
|
authorizedToRestoreSelectedResources
|
|
"
|
|
:authorized-to-restore-any-resources="authorizedToRestoreAnyResources"
|
|
@deleteSelected="deleteSelectedResources"
|
|
@deleteAllMatching="deleteAllMatchingResources"
|
|
@forceDeleteSelected="forceDeleteSelectedResources"
|
|
@forceDeleteAllMatching="forceDeleteAllMatchingResources"
|
|
@restoreSelected="restoreSelectedResources"
|
|
@restoreAllMatching="restoreAllMatchingResources"
|
|
@close="closeDeleteModal"
|
|
:trashed-parameter="trashedParameter"
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Mobile Action Selector -->
|
|
<div
|
|
v-if="shouldShowActionSelector"
|
|
class="flex items-center md:hidden px-2 pt-3 mt-2 md:mt-0 border-t border-gray-200 dark:border-gray-700"
|
|
>
|
|
<ActionSelector
|
|
width="full"
|
|
:resource-name="resourceName"
|
|
:via-resource="actionQueryString.viaResource"
|
|
:via-resource-id="actionQueryString.viaResourceId"
|
|
:via-relationship="actionQueryString.viaRelationship"
|
|
:actions="availableActions"
|
|
:pivot-actions="pivotActions"
|
|
:pivot-name="pivotName"
|
|
:endpoint="actionsEndpoint"
|
|
:selected-resources="selectedResourcesForActionSelector"
|
|
@actionExecuted="getResources"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { Button } from 'laravel-nova-ui'
|
|
|
|
export default {
|
|
components: { Button },
|
|
|
|
emits: ['start-polling', 'stop-polling', 'deselect'],
|
|
|
|
props: [
|
|
'actionsEndpoint',
|
|
'actionQueryString',
|
|
'allMatchingResourceCount',
|
|
'authorizedToDeleteAnyResources',
|
|
'authorizedToDeleteSelectedResources',
|
|
'authorizedToForceDeleteAnyResources',
|
|
'authorizedToForceDeleteSelectedResources',
|
|
'authorizedToRestoreAnyResources',
|
|
'authorizedToRestoreSelectedResources',
|
|
'availableActions',
|
|
'clearSelectedFilters',
|
|
'closeDeleteModal',
|
|
'currentlyPolling',
|
|
'deleteAllMatchingResources',
|
|
'deleteSelectedResources',
|
|
'filterChanged',
|
|
'forceDeleteAllMatchingResources',
|
|
'forceDeleteSelectedResources',
|
|
'getResources',
|
|
'hasFilters',
|
|
'haveStandaloneActions',
|
|
'lenses',
|
|
'lens',
|
|
'isLensView',
|
|
'perPage',
|
|
'perPageOptions',
|
|
'pivotActions',
|
|
'pivotName',
|
|
'resources',
|
|
'resourceInformation',
|
|
'resourceName',
|
|
'currentPageCount',
|
|
'restoreAllMatchingResources',
|
|
'restoreSelectedResources',
|
|
'selectAllChecked',
|
|
'selectAllMatchingChecked',
|
|
'selectedResources',
|
|
'selectedResourcesForActionSelector',
|
|
'shouldShowActionSelector',
|
|
'shouldShowCheckboxes',
|
|
'shouldShowDeleteMenu',
|
|
'shouldShowPollingToggle',
|
|
'softDeletes',
|
|
'toggleSelectAll',
|
|
'toggleSelectAllMatching',
|
|
'togglePolling',
|
|
'trashed',
|
|
'trashedChanged',
|
|
'trashedParameter',
|
|
'updatePerPageChanged',
|
|
'viaManyToMany',
|
|
'viaResource',
|
|
],
|
|
|
|
computed: {
|
|
/**
|
|
* Return the filters from state
|
|
*/
|
|
filters() {
|
|
return this.$store.getters[`${this.resourceName}/filters`]
|
|
},
|
|
|
|
/**
|
|
* Determine via state whether filters are applied
|
|
*/
|
|
filtersAreApplied() {
|
|
return this.$store.getters[`${this.resourceName}/filtersAreApplied`]
|
|
},
|
|
|
|
/**
|
|
* Return the number of active filters
|
|
*/
|
|
activeFilterCount() {
|
|
return this.$store.getters[`${this.resourceName}/activeFilterCount`]
|
|
},
|
|
|
|
filterPerPageOptions() {
|
|
if (this.resourceInformation) {
|
|
return this.perPageOptions || this.resourceInformation.perPageOptions
|
|
}
|
|
},
|
|
},
|
|
}
|
|
</script>
|