Skip to content
Snippets Groups Projects
PermissionListModal.vue 4.64 KiB
Newer Older
  • Learn to ignore specific revisions
  • <script setup lang="ts">
    
    import type { BucketPermissionIn, BucketPermissionOut } from "@/client/s3proxy";
    
    import type { FolderTree } from "@/types/PseudoFolder";
    
    import { reactive } from "vue";
    
    import { BucketPermissionService } from "@/client/s3proxy";
    
    import { onBeforeMount, watch } from "vue";
    
    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[];
    
      loading: boolean;
    
      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) {
    
      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>