Newer
Older
import type { BucketPermissionIn, BucketPermissionOut } from "@/client/s3proxy";
import type { FolderTree } from "@/types/PseudoFolder";
import { BucketPermissionService } from "@/client/s3proxy";
import BootstrapModal from "@/components/modals/BootstrapModal.vue";
import PermissionModal from "@/components/object-storage/modals/PermissionModal.vue";
// Props
// -----------------------------------------------------------------------------
const props = defineProps<{
bucketName: string;
subFolders: FolderTree;
modalID: string;
addPermission: undefined | BucketPermissionOut;
}>();
// Reactive State
// -----------------------------------------------------------------------------
const state = reactive({
permissions: [],
loading: true,
currentPermission: {
bucket_name: "bucketname",
uid: "uid",
permission: "READ",
grantee_display_name: "display_name",
permissions: BucketPermissionOut[];
currentPermission: BucketPermissionOut;
});
const randomIDSuffix = Math.random().toString(16).substr(2, 8);
// Watchers
// -----------------------------------------------------------------------------
watch(
() => props.bucketName,
(newBucketName) => {
updateBucketPermissions(newBucketName);
}
);
watch(
() => props.addPermission,
(newBucketPermission) => {
if (newBucketPermission !== undefined) {
state.permissions.push(newBucketPermission);
}
}
);
// Function
// -----------------------------------------------------------------------------
function updateBucketPermissions(bucketName: string) {
state.loading = true;
BucketPermissionService.bucketPermissionListPermissionsPerBucket(bucketName)
.then((permissions) => {
state.permissions = permissions;
})
.catch((err) => {
console.error(err);
})
.finally(() => {
state.loading = false;
});
}
function permissionDeleted(bucketPermission: BucketPermissionIn) {
state.permissions = state.permissions.filter(
(perm) => perm.uid != bucketPermission.uid
);
}
function permissionCreated(bucketPermission: BucketPermissionOut) {
state.permissions.push(bucketPermission);
}
function permissionEdited(bucketPermission: BucketPermissionOut) {
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
const index = state.permissions.findIndex(
(perm) => perm.uid == bucketPermission.uid
);
state.permissions[index] = bucketPermission;
}
// Lifecycle Hooks
// -----------------------------------------------------------------------------
onBeforeMount(() => {
updateBucketPermissions(props.bucketName);
});
</script>
<template>
<permission-modal
:deletable="true"
:editable="true"
:readonly="true"
:edit-user-permission="state.currentPermission"
:bucket-name="state.currentPermission.bucket_name"
:sub-folders="props.subFolders"
:back-modal-id="props.modalID"
:modalID="'permission-list-edit-modal' + randomIDSuffix"
@permission-deleted="permissionDeleted"
@permission-created="permissionCreated"
@permission-edited="permissionEdited"
/>
<bootstrap-modal
:modalID="props.modalID"
:static-backdrop="true"
modal-label="Permission List Modal"
>
<template v-slot:header> Bucket Permissions </template>
<template v-slot:body>
<ul v-if="state.loading" class="list-group">
<li
class="list-group-item list-group-item-action placeholder-wave"
v-for="n in 5"
:key="n"
>
<span class="placeholder col-2 bg-info"></span>
<span class="placeholder col-8 offset-1"></span>
</li>
</ul>
<div v-else>
<div class="list-group" v-if="state.permissions.length > 0">
<button
type="button"
class="list-group-item list-group-item-action text-truncate"
v-for="permission in state.permissions"
:key="permission.uid"
@click="state.currentPermission = permission"
data-bs-toggle="modal"
:data-bs-target="'#permission-list-edit-modal' + randomIDSuffix"
>
<div class="row">
<span class="text-info col-2">{{ permission.permission }}</span>
<span class="col-9"> {{ permission.grantee_display_name }}</span>
</div>
</button>
</div>
<div v-else>
<h3 class="text-center">No Bucket Permissions for this bucket yet</h3>
</div>
</div>
</template>
<template v-slot:footer>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
Close
</button>
</template>
</bootstrap-modal>
</template>
<style scoped></style>