added button for enable Drag&Drop

This commit is contained in:
2026-08-22 21:07:13 +02:00
parent 1569a0797e
commit 369b3b7728
4 changed files with 107 additions and 24 deletions
+9 -9
View File
@@ -1,12 +1,12 @@
{ {
"name": "bugreport", "name": "bugreport",
"version": "0.0.2", "version": "0.0.3",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "bugreport", "name": "bugreport",
"version": "0.0.2", "version": "0.0.3",
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^6.7.2", "@fortawesome/fontawesome-free": "^6.7.2",
"@fortawesome/fontawesome-svg-core": "^6.7.2", "@fortawesome/fontawesome-svg-core": "^6.7.2",
@@ -1326,9 +1326,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "3.3.15", "version": "3.3.18",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
"integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@@ -1381,9 +1381,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.5.16", "version": "8.5.26",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
"integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -1400,7 +1400,7 @@
], ],
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"nanoid": "^3.3.12", "nanoid": "^3.3.17",
"picocolors": "^1.1.1", "picocolors": "^1.1.1",
"source-map-js": "^1.2.1" "source-map-js": "^1.2.1"
}, },
+43 -1
View File
@@ -20,6 +20,18 @@
</button> </button>
</div> </div>
<div class="menu"> <div class="menu">
<label
class="drag-drop-toggle"
:title="dragDropEnabled ? 'Drag & drop je zapnutý' : 'Drag & drop je vypnutý'"
>
<input
v-model="dragDropEnabled"
type="checkbox"
:aria-label="dragDropEnabled ? 'Vypnúť drag & drop' : 'Zapnúť drag & drop'"
@change="onDragDropChange"
/>
<span>Drag & drop</span>
</label>
<router-link to="/add" <router-link to="/add"
><font-awesome-icon :icon="['fas', 'square-plus']" /> Pridať ><font-awesome-icon :icon="['fas', 'square-plus']" /> Pridať
bug</router-link bug</router-link
@@ -45,11 +57,29 @@
</template> </template>
<script setup> <script setup>
import { ref } from "vue"; import { onMounted, onUnmounted, ref } from "vue";
import backend from "./backend"; import backend from "./backend";
import events from "./events"; import events from "./events";
import {
getDragDropEnabled,
getDragDropMediaQuery,
getDragDropPreference,
setDragDropEnabled,
} from "./dragDropSettings";
const short_bug = ref(""); const short_bug = ref("");
const dragMediaQuery = getDragDropMediaQuery();
const dragDropEnabled = ref(getDragDropEnabled(dragMediaQuery));
function updateAutomaticDragDropState() {
if (getDragDropPreference() != null) return;
dragDropEnabled.value = getDragDropEnabled(dragMediaQuery);
}
function onDragDropChange() {
setDragDropEnabled(dragDropEnabled.value);
events.emit("drag-drop-changed", dragDropEnabled.value);
}
function onShortBugEnter(event) { function onShortBugEnter(event) {
if (event.keyCode == 13) { if (event.keyCode == 13) {
@@ -64,4 +94,16 @@ function shortBugAdd() {
events.emit("reports-changed"); events.emit("reports-changed");
}); });
} }
onMounted(() => {
if (dragMediaQuery != null) {
dragMediaQuery.addEventListener("change", updateAutomaticDragDropState);
}
});
onUnmounted(() => {
if (dragMediaQuery != null) {
dragMediaQuery.removeEventListener("change", updateAutomaticDragDropState);
}
});
</script> </script>
+28 -1
View File
@@ -151,6 +151,29 @@ button:focus-visible,
#header .menu { #header .menu {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center;
}
#header .drag-drop-toggle {
display: inline-flex;
align-items: center;
gap: 8px;
border: 1px solid var(--color-text0);
padding: 5px 10px;
border-radius: 5px;
margin-left: 20px;
cursor: pointer;
user-select: none;
transition: all 0.3s;
}
#header .drag-drop-toggle:hover {
color: var(--color-text1);
background-color: var(--color-bg1);
}
#header .drag-drop-toggle input {
width: 16px;
height: 16px;
margin: 0;
cursor: pointer;
} }
#header .menu a, #header .menu a,
#header .menu a:visited, #header .menu a:visited,
@@ -205,7 +228,8 @@ button:focus-visible,
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
} }
#header .menu a { #header .menu a,
#header .drag-drop-toggle {
margin: 5px; margin: 5px;
} }
} }
@@ -256,6 +280,9 @@ button:focus-visible,
border-top-right-radius: 5px; border-top-right-radius: 5px;
cursor: grab; cursor: grab;
} }
#dashboard.drag-disabled .report .report-header {
cursor: default;
}
#dashboard .report .report-header .report-title { #dashboard .report .report-header .report-title {
} }
#dashboard .report .report-header h3 { #dashboard .report .report-header h3 {
+27 -13
View File
@@ -1,7 +1,7 @@
<template> <template>
<FullScreenLoader v-if="loading" /> <FullScreenLoader v-if="loading" />
<div id="dashboard"> <div id="dashboard" :class="{ 'drag-disabled': isDragDisabled }">
<div id="inbox"> <div id="inbox">
<h2>Nezaradené</h2> <h2>Nezaradené</h2>
<draggable <draggable
@@ -146,6 +146,10 @@ import draggable from "vuedraggable";
import backend from "../backend"; import backend from "../backend";
import FullScreenLoader from "../components/FullScreenLoader.vue"; import FullScreenLoader from "../components/FullScreenLoader.vue";
import events from "../events"; import events from "../events";
import {
getDragDropEnabled,
getDragDropMediaQuery,
} from "../dragDropSettings";
export default { export default {
components: { components: {
@@ -156,7 +160,7 @@ export default {
data() { data() {
return { return {
loading: false, loading: false,
isDragDisabled: false, isDragDisabled: !getDragDropEnabled(),
dragMediaQuery: null, dragMediaQuery: null,
itemsUncategorized: [], itemsUncategorized: [],
itemsWaiting: [], itemsWaiting: [],
@@ -165,8 +169,15 @@ export default {
}; };
}, },
methods: { methods: {
updateDragState(event) { updateDragState() {
this.isDragDisabled = event.matches; this.isDragDisabled = !getDragDropEnabled(this.dragMediaQuery);
},
updateDragPreference(enabled) {
this.isDragDisabled = !enabled;
},
onReportsChanged() {
console.log("Dashoboard reports-changed");
this.loadData(false);
}, },
loadData(use_loader = true) { loadData(use_loader = true) {
if (use_loader) this.loading = true; if (use_loader) this.loading = true;
@@ -241,18 +252,21 @@ export default {
}, },
}, },
mounted() { mounted() {
this.dragMediaQuery = window.matchMedia("(max-width: 768px), (any-pointer: coarse)"); this.dragMediaQuery = getDragDropMediaQuery();
this.updateDragState(this.dragMediaQuery); this.updateDragState();
this.dragMediaQuery.addEventListener("change", this.updateDragState); if (this.dragMediaQuery != null) {
this.dragMediaQuery.addEventListener("change", this.updateDragState);
}
this.loadData(); this.loadData();
events.on("reports-changed", () => { events.on("reports-changed", this.onReportsChanged);
console.log("Dashoboard reports-changed"); events.on("drag-drop-changed", this.updateDragPreference);
this.loadData(false);
});
}, },
unmounted() { unmounted() {
this.dragMediaQuery.removeEventListener("change", this.updateDragState); if (this.dragMediaQuery != null) {
events.off("reports-changed"); this.dragMediaQuery.removeEventListener("change", this.updateDragState);
}
events.off("reports-changed", this.onReportsChanged);
events.off("drag-drop-changed", this.updateDragPreference);
} }
}; };
</script> </script>