feat: Added layered prompt support(#2659)

This commit is contained in:
ArthurMousatov 2023-08-23 00:47:36 -04:00
parent 184b7c14f2
commit df8349e352
17 changed files with 80 additions and 66 deletions

View File

@ -90,10 +90,10 @@ export default {
};
},
watch: {
show(val, old) {
this.active = val === "search";
currentPrompt(val, old) {
this.active = val.prompt === "search";
if (old === "search" && !this.active) {
if (old.prompt === "search" && !this.active) {
if (this.reload) {
this.setReload(true);
}
@ -116,8 +116,8 @@ export default {
},
},
computed: {
...mapState(["user", "show"]),
...mapGetters(["isListing"]),
...mapState(["user"]),
...mapGetters(["isListing", "currentPrompt"]),
boxes() {
return boxes;
},

View File

@ -133,9 +133,9 @@ export default {
},
computed: {
...mapState(["user"]),
...mapGetters(["isLogged"]),
...mapGetters(["isLogged", "currentPrompt"]),
active() {
return this.$store.state.show === "sidebar";
return this.currentPrompt.prompt === "sidebar";
},
signup: () => signup,
version: () => version,

View File

@ -11,7 +11,7 @@
<slot />
<div id="dropdown" :class="{ active: this.$store.state.show === 'more' }">
<div id="dropdown" :class="{ active: this.currentPrompt.prompt === 'more' }">
<slot name="actions" />
</div>
@ -25,7 +25,7 @@
<div
class="overlay"
v-show="this.$store.state.show == 'more'"
v-show="this.currentPrompt.prompt == 'more'"
@click="$store.commit('closeHovers')"
/>
</header>
@ -35,6 +35,7 @@
import { logoURL } from "@/utils/constants";
import Action from "@/components/header/Action";
import { mapGetters } from "vuex";
export default {
name: "header-bar",
@ -52,6 +53,9 @@ export default {
this.$store.commit("showHover", "sidebar");
},
},
computed: {
...mapGetters(["currentPrompt"]),
}
};
</script>

View File

@ -37,8 +37,8 @@ import buttons from "@/utils/buttons";
export default {
name: "delete",
computed: {
...mapGetters(["isListing", "selectedCount"]),
...mapState(["req", "selected", "showConfirm"]),
...mapGetters(["isListing", "selectedCount", "currentPrompt"]),
...mapState(["req", "selected"]),
},
methods: {
...mapMutations(["closeHovers"]),
@ -50,7 +50,7 @@ export default {
await api.remove(this.$route.path);
buttons.success("delete");
this.showConfirm();
this.currentPrompt?.confirm();
this.closeHovers();
return;
}

View File

@ -11,7 +11,7 @@
v-for="(ext, format) in formats"
:key="format"
class="button button--block"
@click="showConfirm(format)"
@click="currentPrompt.confirm(format)"
v-focus
>
{{ ext }}
@ -21,7 +21,7 @@
</template>
<script>
import { mapState } from "vuex";
import { mapGetters } from "vuex";
export default {
name: "download",
@ -38,6 +38,8 @@ export default {
},
};
},
computed: mapState(["showConfirm"]),
computed: {
...mapGetters(["currentPrompt"]),
},
};
</script>

View File

@ -9,6 +9,17 @@
</div>
<div class="card-action">
<div v-if="user.perm.create">
<button
class="button button--flat"
@click="$store.commit('showHover', 'newDir')"
:aria-label="$t('sidebar.newFolder')"
:title="$t('sidebar.newFolder')"
>
<i class="material-icons">create_new_folder</i>
<span>{{ $t("sidebar.newFolder") }}</span>
</button>
</div>
<button
class="button button--flat button--grey"
@click="$store.commit('closeHovers')"
@ -46,7 +57,7 @@ export default {
dest: null,
};
},
computed: mapState(["req", "selected"]),
computed: mapState(["req", "selected", "user"]),
methods: {
move: async function (event) {
event.preventDefault();

View File

@ -1,6 +1,6 @@
<template>
<div>
<component ref="currentComponent" :is="currentComponent"></component>
<component ref="getCurrentPrompt" :is="getCurrentPrompt"></component>
<div v-show="showOverlay" @click="resetPrompts" class="overlay"></div>
</div>
</template>
@ -20,7 +20,7 @@ import ReplaceRename from "./ReplaceRename";
import Share from "./Share";
import Upload from "./Upload";
import ShareDelete from "./ShareDelete";
import { mapState } from "vuex";
import { mapGetters, mapState } from "vuex";
import buttons from "@/utils/buttons";
export default {
@ -52,7 +52,7 @@ export default {
},
created() {
window.addEventListener("keydown", (event) => {
if (this.show == null) return;
if (this.currentPrompt == null) return;
let prompt = this.$refs.currentComponent;
@ -64,7 +64,7 @@ export default {
// Enter
if (event.keyCode == 13) {
switch (this.show) {
switch (this.currentPrompt.prompt) {
case "delete":
prompt.submit();
break;
@ -82,31 +82,15 @@ export default {
});
},
computed: {
...mapState(["show", "plugins"]),
currentComponent: function () {
const matched =
[
"info",
"help",
"delete",
"rename",
"move",
"copy",
"newFile",
"newDir",
"download",
"replace",
"replace-rename",
"share",
"upload",
"share-delete",
].indexOf(this.show) >= 0;
return (matched && this.show) || null;
},
...mapState(["plugins"]),
...mapGetters(["currentPrompt"]),
showOverlay: function () {
return (
this.show !== null && this.show !== "search" && this.show !== "more"
this.currentPrompt !== null &&
this.currentPrompt.prompt
!== "search" &&
this.currentPrompt.prompt
!== "more"
);
},
},

View File

@ -19,7 +19,7 @@
</button>
<button
class="button button--flat button--blue"
@click="showAction"
@click="currentPrompt.action"
:aria-label="$t('buttons.continue')"
:title="$t('buttons.continue')"
>
@ -27,7 +27,7 @@
</button>
<button
class="button button--flat button--red"
@click="showConfirm"
@click="currentPrompt.confirm"
:aria-label="$t('buttons.replace')"
:title="$t('buttons.replace')"
>
@ -38,10 +38,10 @@
</template>
<script>
import { mapState } from "vuex";
import { mapGetters } from "vuex";
export default {
name: "replace",
computed: mapState(["showConfirm", "showAction"]),
computed: mapGetters(["currentPrompt"]),
};
</script>

View File

@ -19,7 +19,7 @@
</button>
<button
class="button button--flat button--blue"
@click="(event) => showConfirm(event, 'rename')"
@click="(event) => currentPrompt.confirm(event, 'rename')"
:aria-label="$t('buttons.rename')"
:title="$t('buttons.rename')"
>
@ -27,7 +27,7 @@
</button>
<button
class="button button--flat button--red"
@click="(event) => showConfirm(event, 'overwrite')"
@click="(event) => currentPrompt.confirm(event, 'overwrite')"
:aria-label="$t('buttons.replace')"
:title="$t('buttons.replace')"
>
@ -38,10 +38,10 @@
</template>
<script>
import { mapState } from "vuex";
import { mapGetters } from "vuex";
export default {
name: "replace-rename",
computed: mapState(["showConfirm"]),
computed: mapGetters(["currentPrompt"]),
};
</script>

View File

@ -25,16 +25,16 @@
</template>
<script>
import { mapState } from "vuex";
import { mapGetters } from "vuex";
export default {
name: "share-delete",
computed: {
...mapState(["showConfirm"]),
...mapGetters(["currentPrompt"]),
},
methods: {
submit: function () {
this.showConfirm();
this.currentPrompt?.confirm();
},
},
};

View File

@ -43,6 +43,9 @@ const getters = {
return files.sort((a, b) => a.progress - b.progress);
},
currentPrompt: (state) => {
return state.prompts.length > 0 ? state.prompts[state.prompts.length - 1] : null;
},
};
export default getters;

View File

@ -20,10 +20,8 @@ const state = {
reload: false,
selected: [],
multiple: false,
show: null,
prompts: [],
showShell: false,
showConfirm: null,
showAction: null,
};
export default new Vuex.Store({

View File

@ -4,6 +4,8 @@ import moment from "moment";
const mutations = {
closeHovers: (state) => {
state.show = null;
state.prompts.pop();
console.log(state.prompts);
state.showConfirm = null;
state.showAction = null;
},
@ -13,10 +15,16 @@ const mutations = {
showHover: (state, value) => {
if (typeof value !== "object") {
state.show = value;
state.prompts.push({
prompt: value,
confirm: null,
action: null
});
return;
}
state.show = value.prompt;
state.prompts.push(value);
state.showConfirm = value.confirm;
if (value.action !== undefined) {
state.showAction = value.action;
@ -24,9 +32,11 @@ const mutations = {
},
showError: (state) => {
state.show = "error";
state.prompts.push("error");
},
showSuccess: (state) => {
state.show = "success";
state.prompts.push("success");
},
setLoading: (state, value) => {
state.loading = value;

View File

@ -50,7 +50,7 @@ export default {
};
},
computed: {
...mapState(["req", "reload", "loading", "show"]),
...mapState(["req", "reload", "loading"]),
currentView() {
if (this.req.type == undefined) {
return null;

View File

@ -30,7 +30,7 @@ export default {
UploadFiles,
},
computed: {
...mapGetters(["isLogged", "progress"]),
...mapGetters(["isLogged", "progress", "currentPrompt"]),
...mapState(["user"]),
isExecEnabled: () => enableExec,
},
@ -38,7 +38,7 @@ export default {
$route: function () {
this.$store.commit("resetSelected");
this.$store.commit("multiple", false);
if (this.$store.state.show !== "success")
if (this.currentPrompt.prompt !== "success")
this.$store.commit("closeHovers");
},
},

View File

@ -143,7 +143,7 @@
</template>
<script>
import { mapState } from "vuex";
import { mapGetters, mapState } from "vuex";
import { files as api } from "@/api";
import { resizePreview } from "@/utils/constants";
import url from "@/utils/url";
@ -177,7 +177,8 @@ export default {
};
},
computed: {
...mapState(["req", "user", "oldReq", "jwt", "loading", "show"]),
...mapState(["req", "user", "oldReq", "jwt", "loading"]),
...mapGetters(["currentPrompt"]),
hasPrevious() {
return this.previousLink !== "";
},
@ -195,7 +196,7 @@ export default {
return api.getDownloadURL(this.req, true);
},
showMore() {
return this.$store.state.show === "more";
return this.currentPrompt.prompt === "more";
},
isResizeEnabled() {
return resizePreview;
@ -247,7 +248,7 @@ export default {
this.$router.replace({ path: this.nextLink });
},
key(event) {
if (this.show !== null) {
if (this.currentPrompt !== null) {
return;
}

View File

@ -37,7 +37,7 @@
</form>
</div>
<div v-if="$store.state.show === 'deleteUser'" class="card floating">
<div v-if="this.currentPrompt.prompt === 'deleteUser'" class="card floating">
<div class="card-content">
<p>Are you sure you want to delete this user?</p>
</div>
@ -61,7 +61,7 @@
</template>
<script>
import { mapState, mapMutations } from "vuex";
import { mapState, mapMutations, mapGetters } from "vuex";
import { users as api, settings } from "@/api";
import UserForm from "@/components/settings/UserForm";
import Errors from "@/views/Errors";
@ -89,6 +89,7 @@ export default {
return this.$route.path === "/settings/users/new";
},
...mapState(["loading"]),
...mapGetters(["currentPrompt"])
},
watch: {
$route: "fetchData",