aboutsummaryrefslogtreecommitdiff
path: root/packages/client/src/components/RepositoryCloneDropdown.vue
diff options
context:
space:
mode:
Diffstat (limited to 'packages/client/src/components/RepositoryCloneDropdown.vue')
-rw-r--r--packages/client/src/components/RepositoryCloneDropdown.vue106
1 files changed, 63 insertions, 43 deletions
diff --git a/packages/client/src/components/RepositoryCloneDropdown.vue b/packages/client/src/components/RepositoryCloneDropdown.vue
index a46d569..335604f 100644
--- a/packages/client/src/components/RepositoryCloneDropdown.vue
+++ b/packages/client/src/components/RepositoryCloneDropdown.vue
@@ -34,10 +34,11 @@
</div>
</template>
-<script>
+<script lang="ts">
+import { defineComponent } from "vue";
import { createPopper } from "@popperjs/core";
-export default {
+export default defineComponent({
name: "RepositoryCloneDropdown",
props: {
repository: {
@@ -46,18 +47,25 @@ export default {
}
},
methods: {
- async copyToClipboard(event) {
- const url_box = document.getElementById("clone").getElementsByTagName("input")[0];
+ async copyToClipboard(event: Event) {
+ const url_box = document.getElementById("clone")?.getElementsByTagName("input")[0];
+
+ if(!url_box) {
+ return;
+ }
url_box.select();
url_box.setSelectionRange(0, 99999);
document.execCommand("copy");
const copied_tooltip = document.querySelector("#copied-tooltip");
- copied_tooltip.classList.add("show");
- await new Promise(resolve => setTimeout(resolve, 2000));
- copied_tooltip.classList.remove("show");
+ if(copied_tooltip) {
+ copied_tooltip.classList.add("show");
+
+ await new Promise(resolve => setTimeout(resolve, 2000));
+ copied_tooltip.classList.remove("show");
+ }
},
getURL() {
return `${window.location.protocol}//${window.location.host}/${this.repository}`;
@@ -65,52 +73,64 @@ export default {
},
mounted() {
const dropdown_button = document.querySelector("#dropdown-button");
- const dropdown_menu = document.querySelector("#dropdown-menu");
+ const dropdown_menu = document.getElementById("dropdown-menu");
- const copied_tooltip = document.querySelector("#copied-tooltip");
+ const copied_tooltip = document.getElementById("copied-tooltip");
const copy = document.querySelector("#copy");
const tooltip_arrow = document.querySelector("#tooltip-arrow");
- createPopper(dropdown_button, dropdown_menu, {
- placement: "bottom-end",
- modifiers: [
- {
- name: "offset",
- options: { offset: [ 0, 2 ] }
- }
- ]
- });
- createPopper(copy, copied_tooltip, {
- placement: "top",
- modifiers: [
- {
- name: "offset",
- options: { offset: [ 0, 10 ] }
- },
- {
- name: "arrow",
- options: { element: tooltip_arrow }
- }
- ]
- });
- const clickOutsideDropdown = (event) => {
- if(!dropdown_menu.contains(event.target) && event.target !== dropdown_button) {
+ if(dropdown_button && dropdown_menu) {
+ createPopper(dropdown_button, dropdown_menu, {
+ placement: "bottom-end",
+ modifiers: [
+ {
+ name: "offset",
+ options: { offset: [ 0, 2 ] }
+ }
+ ]
+ });
+ }
+
+ if(copy && copied_tooltip) {
+ createPopper(copy, copied_tooltip, {
+ placement: "top",
+ modifiers: [
+ {
+ name: "offset",
+ options: { offset: [ 0, 10 ] }
+ },
+ {
+ name: "arrow",
+ options: { element: tooltip_arrow }
+ }
+ ]
+ });
+ }
+
+ const clickOutsideDropdown = (event: Event) => {
+ const target = event.target as HTMLElement;
+
+ if(dropdown_menu && dropdown_menu.contains(target) === false && target !== dropdown_button) {
dropdown_menu.classList.remove("show");
document.removeEventListener("click", clickOutsideDropdown);
}
};
- dropdown_button.addEventListener("click", () => {
- if(dropdown_menu.classList.contains("show")) {
- dropdown_menu.classList.remove("show");
- document.removeEventListener("click", clickOutsideDropdown);
- } else {
- dropdown_menu.classList.add("show");
- document.addEventListener("click", clickOutsideDropdown);
- }
- });
+ if(dropdown_button) {
+ dropdown_button.addEventListener("click", () => {
+ if(dropdown_menu) {
+ if(dropdown_menu.classList.contains("show")) {
+ dropdown_menu.classList.remove("show");
+ document.removeEventListener("click", clickOutsideDropdown);
+ } else {
+ dropdown_menu.classList.add("show");
+ document.addEventListener("click", clickOutsideDropdown);
+ }
+ }
+ });
+ }
}
-};
+});
</script>
<style lang="scss" scoped>