Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
Loading items

Target

Select target project
  • coscine/frontend/apps/ui
1 result
Select Git revision
Loading items
Show changes
Commits on Source (5)
{ {
"name": "ui", "name": "ui",
"version": "1.11.5", "version": "1.11.6",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
......
...@@ -112,10 +112,13 @@ ...@@ -112,10 +112,13 @@
}}</b-dropdown-item }}</b-dropdown-item
> >
<b-dropdown-item <b-dropdown-item
:disabled="resource && resource.archived" :disabled="
(resource && resource.archived) ||
(resourceTypeInformation && !resourceTypeInformation.canDelete)
"
@click="deleteFile(row.item)" @click="deleteFile(row.item)"
>{{ $t("buttons.delete") }}</b-dropdown-item >{{ $t("buttons.delete") }}
> </b-dropdown-item>
</b-dropdown> </b-dropdown>
</template> </template>
<template #cell(size)="row"> <template #cell(size)="row">
......
...@@ -16,11 +16,15 @@ ...@@ -16,11 +16,15 @@
}}: {{ resource.displayName }} }}: {{ resource.displayName }}
</p> </p>
</span> </span>
<!-- Info Circle -->
<b-icon <b-icon
id="resourceDetails" id="resourceDetails"
icon="info-circle" icon="info-circle"
:title="$t('page.resource.info')" :title="$t('page.resource.info')"
/> />
<!-- Info Popover -->
<b-popover <b-popover
v-if="resource" v-if="resource"
over over
...@@ -92,6 +96,8 @@ ...@@ -92,6 +96,8 @@
><br /> ><br />
</div> </div>
</b-popover> </b-popover>
<!-- Resource Settings Button -->
<b-button <b-button
v-if="canEditResource" v-if="canEditResource"
:title="$t('page.resource.edit')" :title="$t('page.resource.edit')"
...@@ -100,6 +106,8 @@ ...@@ -100,6 +106,8 @@
> >
<b-icon icon="pencil-fill" :title="$t('page.resource.edit')" /> <b-icon icon="pencil-fill" :title="$t('page.resource.edit')" />
</b-button> </b-button>
<!-- Upload Button -->
<b-button <b-button
:title="$t('page.resource.upload')" :title="$t('page.resource.upload')"
class="btn btn-sm" class="btn btn-sm"
...@@ -108,16 +116,20 @@ ...@@ -108,16 +116,20 @@
> >
<b-icon icon="plus" :title="$t('page.resource.upload')" /> <b-icon icon="plus" :title="$t('page.resource.upload')" />
</b-button> </b-button>
<!-- Archived badge -->
<span v-if="resource && resource.archived" class="badgeWrap"> <span v-if="resource && resource.archived" class="badgeWrap">
<b-badge pill variant="warning">{{ $t("default.archived") }}</b-badge> <b-badge pill variant="warning">{{ $t("default.archived") }}</b-badge>
</span> </span>
</div> </div>
<!-- Quota Progress Bar -->
<div class="col-sm-2"> <div class="col-sm-2">
<div <div
v-if="maxSize !== undefined && used !== undefined" v-if="maxSize !== undefined && used !== undefined"
class="progressContainer" class="progressContainer"
> >
<!-- Progress Bar -->
<b-progress :max="maxSize"> <b-progress :max="maxSize">
<b-progress-bar :value="used"> <b-progress-bar :value="used">
<span v-if="used / maxSize >= 0.5"> <span v-if="used / maxSize >= 0.5">
...@@ -136,6 +148,8 @@ ...@@ -136,6 +148,8 @@
</b-progress> </b-progress>
</div> </div>
</div> </div>
<!-- Search Bar -->
<div class="col-sm-2 searchColumn"> <div class="col-sm-2 searchColumn">
<b-input-group> <b-input-group>
<b-form-input <b-form-input
......
...@@ -10,7 +10,10 @@ ...@@ -10,7 +10,10 @@
@cancel="$emit('close', $event.target.value)" @cancel="$emit('close', $event.target.value)"
@shown="$emit('shown', $event.target.value)" @shown="$emit('shown', $event.target.value)"
> >
<div> <div v-if="resourceTypeInformation && !resourceTypeInformation.canUpdate">
{{ $t("page.resource.modalSaveDuplicatesFilesBodyWorm") }}
</div>
<div v-else>
{{ $t("page.resource.modalSaveDuplicateFilesBody") }} {{ $t("page.resource.modalSaveDuplicateFilesBody") }}
</div> </div>
<br /> <br />
...@@ -35,6 +38,9 @@ ...@@ -35,6 +38,9 @@
>{{ $t("page.resource.modalSaveDuplicateFilesBtnSkip") }}</b-button >{{ $t("page.resource.modalSaveDuplicateFilesBtnSkip") }}</b-button
> >
<b-button <b-button
:disabled="
resourceTypeInformation && !resourceTypeInformation.canUpdate
"
class="float-right" class="float-right"
style="justify-content: flex-end" style="justify-content: flex-end"
@click="$emit('ok', $event.target.value)" @click="$emit('ok', $event.target.value)"
...@@ -46,7 +52,13 @@ ...@@ -46,7 +52,13 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from "vue-demi"; import { defineComponent } from "vue-demi";
// import the store for current module
import useResourceStore from "../../../store";
import useProjectStore from "@/modules/project/store";
// import the main store
import useMainStore from "@/store/index";
import type { ResourceTypeInformation } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
import type { VisitedResourceObject } from "../../../types";
export default defineComponent({ export default defineComponent({
props: { props: {
uploadFileListReplaceFiles: { uploadFileListReplaceFiles: {
...@@ -58,6 +70,26 @@ export default defineComponent({ ...@@ -58,6 +70,26 @@ export default defineComponent({
type: Boolean, type: Boolean,
}, },
}, },
setup() {
const mainStore = useMainStore();
const resourceStore = useResourceStore();
const projectStore = useProjectStore();
return { mainStore, resourceStore, projectStore };
},
computed: {
resource(): null | VisitedResourceObject {
return this.resourceStore.currentResource;
},
resourceTypeInformation(): null | undefined | ResourceTypeInformation {
if (this.resourceStore.resourceTypes && this.resource) {
return this.resourceStore.resourceTypes.find(
(resourceType) => resourceType.id === this.resource?.type?.id
);
}
return null;
},
},
}); });
</script> </script>
...@@ -68,4 +100,7 @@ export default defineComponent({ ...@@ -68,4 +100,7 @@ export default defineComponent({
right: 33%; right: 33%;
white-space: nowrap; white-space: nowrap;
} }
.btn-secondary.disabled {
pointer-events: none;
}
</style> </style>
...@@ -7,9 +7,10 @@ ...@@ -7,9 +7,10 @@
:is-loading="isLoading" :is-loading="isLoading"
class="d-flex align-items-center" class="d-flex align-items-center"
> >
<!-- Using "checked" instead of "v-model", because "resourceForm" is a prop -->
<b-form-checkbox <b-form-checkbox
id="Archive" id="Archive"
v-model="resourceForm.archived" :checked="resourceForm.archived"
:disabled="!(isOwner || isResourceCreator) || !resourceForm" :disabled="!(isOwner || isResourceCreator) || !resourceForm"
switch switch
size="lg" size="lg"
...@@ -29,11 +30,14 @@ ...@@ -29,11 +30,14 @@
id="DeleteResource" id="DeleteResource"
type="delete" type="delete"
variant="danger" variant="danger"
:disabled="!resourceForm" :disabled="
!resourceForm ||
(resourceTypeInformation && !resourceTypeInformation.canDelete)
"
@click.prevent="isDeleteModalVisible = true" @click.prevent="isDeleteModalVisible = true"
> >
{{ $t("buttons.delete") }}</b-button {{ $t("buttons.delete") }}
> </b-button>
</coscine-form-group> </coscine-form-group>
<!-- Archive Resource Modal --> <!-- Archive Resource Modal -->
...@@ -58,18 +62,19 @@ ...@@ -58,18 +62,19 @@
import { defineComponent, PropType } from "vue-demi"; import { defineComponent, PropType } from "vue-demi";
import useProjectStore from "@/modules/project/store"; import useProjectStore from "@/modules/project/store";
import useUserStore from "@/modules/user/store"; import useUserStore from "@/modules/user/store";
import useResourceStore from "../../store";
import ArchiveResourceModal from "./modals/ArchiveResourceModal.vue"; import ArchiveResourceModal from "./modals/ArchiveResourceModal.vue";
import DeleteResourceModal from "./modals/DeleteResourceModal.vue"; import DeleteResourceModal from "./modals/DeleteResourceModal.vue";
import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources"; import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User"; import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
import type { ResourceTypeInformation } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
export default defineComponent({ export default defineComponent({
components: { components: {
ArchiveResourceModal, ArchiveResourceModal,
DeleteResourceModal, DeleteResourceModal,
}, },
props: { props: {
value: { resourceForm: {
type: Object as PropType<ResourceObject>, type: Object as PropType<ResourceObject>,
required: true, required: true,
}, },
...@@ -78,27 +83,39 @@ export default defineComponent({ ...@@ -78,27 +83,39 @@ export default defineComponent({
type: Boolean, type: Boolean,
}, },
}, },
emits: { emits: {
toggleArchive: null, toggleArchive: null,
clickDelete: null, clickDelete: null,
input: (_: ResourceObject) => null,
}, },
setup() { setup() {
const projectStore = useProjectStore(); const projectStore = useProjectStore();
const userStore = useUserStore(); const userStore = useUserStore();
const resourceStore = useResourceStore();
return { projectStore, userStore }; return { projectStore, userStore, resourceStore };
}, },
data() { data() {
return { return {
resourceForm: this.value,
isArchiveModalVisible: false, isArchiveModalVisible: false,
isDeleteModalVisible: false, isDeleteModalVisible: false,
}; };
}, },
computed: { computed: {
resource(): null | ResourceObject {
return this.resourceStore.currentResource;
},
resourceTypeInformation(): null | undefined | ResourceTypeInformation {
if (this.resourceStore.resourceTypes && this.resource) {
return this.resourceStore.resourceTypes.find(
(resourceType) => resourceType.id === this.resource?.type?.id
);
}
return null;
},
isOwner(): boolean | undefined { isOwner(): boolean | undefined {
return this.projectStore.currentUserRoleIsOwner; return this.projectStore.currentUserRoleIsOwner;
}, },
...@@ -114,15 +131,6 @@ export default defineComponent({ ...@@ -114,15 +131,6 @@ export default defineComponent({
}, },
}, },
watch: {
resource: {
handler() {
this.$emit("input", this.resourceForm);
},
deep: true,
},
},
methods: { methods: {
toggleArchive() { toggleArchive() {
this.$emit("toggleArchive"); this.$emit("toggleArchive");
...@@ -137,4 +145,8 @@ export default defineComponent({ ...@@ -137,4 +145,8 @@ export default defineComponent({
}); });
</script> </script>
<style></style> <style scoped>
.btn-danger.disabled {
pointer-events: none;
}
</style>
...@@ -144,6 +144,8 @@ export default { ...@@ -144,6 +144,8 @@ export default {
modalSaveDuplicateFilesHeader: "Dateien ersetzen oder überspringen", modalSaveDuplicateFilesHeader: "Dateien ersetzen oder überspringen",
modalSaveDuplicateFilesBody: modalSaveDuplicateFilesBody:
"Es sind bereits Dateien mit dem gleichen Namen vorhanden. Diese Dateien werden überschrieben:", "Es sind bereits Dateien mit dem gleichen Namen vorhanden. Diese Dateien werden überschrieben:",
modalSaveDuplicatesFilesBodyWorm:
"Es sind bereits Dateien mit dem gleichen Namen vorhanden. Diese Dateien können nicht überschrieben werden:",
modalSaveDuplicateFilesBtnCancel: "HOCHLADEN ABBRECHEN", modalSaveDuplicateFilesBtnCancel: "HOCHLADEN ABBRECHEN",
modalSaveDuplicateFilesBtnSkip: "DIESE DATEIEN ÜBERSPRINGEN", modalSaveDuplicateFilesBtnSkip: "DIESE DATEIEN ÜBERSPRINGEN",
modalSaveDuplicateFilesBtnOverwrite: "ÜBERSCHREIBEN", modalSaveDuplicateFilesBtnOverwrite: "ÜBERSCHREIBEN",
......
...@@ -141,6 +141,8 @@ export default { ...@@ -141,6 +141,8 @@ export default {
modalSaveDuplicateFilesHeader: "Replace or skip duplicate files", modalSaveDuplicateFilesHeader: "Replace or skip duplicate files",
modalSaveDuplicateFilesBody: modalSaveDuplicateFilesBody:
"One or more files with the same name already exist. Uploading will result in overwriting the following file(s):", "One or more files with the same name already exist. Uploading will result in overwriting the following file(s):",
modalSaveDuplicatesFilesBodyWorm:
"One or more files with the same name already exist. The following files cannot be overwritten:",
modalSaveDuplicateFilesBtnCancel: "CANCEL UPLOAD", modalSaveDuplicateFilesBtnCancel: "CANCEL UPLOAD",
modalSaveDuplicateFilesBtnSkip: "SKIP DUPLICATE FILES", modalSaveDuplicateFilesBtnSkip: "SKIP DUPLICATE FILES",
modalSaveDuplicateFilesBtnOverwrite: "OVERWRITE", modalSaveDuplicateFilesBtnOverwrite: "OVERWRITE",
......
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
<Actions <Actions
v-if="resource" v-if="resource"
v-show="tabs[currentTab].step === 'action'" v-show="tabs[currentTab].step === 'action'"
v-model="resource" :resource-form="resource"
@toggleArchive="toggleArchive" @toggleArchive="toggleArchive"
@clickDelete="clickDelete" @clickDelete="clickDelete"
/> />
......