summaryrefslogtreecommitdiffstats
path: root/src/components/ProxyDialog.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/ProxyDialog.vue')
-rw-r--r--src/components/ProxyDialog.vue224
1 files changed, 224 insertions, 0 deletions
diff --git a/src/components/ProxyDialog.vue b/src/components/ProxyDialog.vue
new file mode 100644
index 0000000..fc92359
--- /dev/null
+++ b/src/components/ProxyDialog.vue
@@ -0,0 +1,224 @@
+<template>
+ <form @submit.prevent="submit">
+ <div ref="modal" class="modal fade" tabindex="-1" data-bs-backdrop="static">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 id="exampleModalLabel" class="modal-title">
+ {{ $t("Setup Proxy") }}
+ </h5>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" />
+ </div>
+ <div class="modal-body">
+ <div class="mb-3">
+ <label for="proxy-protocol" class="form-label">{{ $t("Proxy Protocol") }}</label>
+ <select id="proxy-protocol" v-model="proxy.protocol" class="form-select">
+ <option value="https">HTTPS</option>
+ <option value="http">HTTP</option>
+ <option value="socks">SOCKS</option>
+ <option value="socks5">SOCKS v5</option>
+ <option value="socks5h">SOCKS v5 (+DNS)</option>
+ <option value="socks4">SOCKS v4</option>
+ </select>
+ </div>
+
+ <div class="mb-3">
+ <label for="proxy-host" class="form-label">{{ $t("Proxy Server") }}</label>
+ <div class="d-flex">
+ <input id="proxy-host" v-model="proxy.host" type="text" class="form-control" required :placeholder="$t('Server Address')">
+ <input v-model="proxy.port" type="number" class="form-control ms-2" style="width: 100px;" required min="1" max="65535" :placeholder="$t('Port')">
+ </div>
+ </div>
+
+ <div class="mb-3">
+ <div class="form-check form-switch">
+ <input id="mark-auth" v-model="proxy.auth" class="form-check-input" type="checkbox">
+ <label for="mark-auth" class="form-check-label">{{ $t("Proxy server has authentication") }}</label>
+ </div>
+ </div>
+
+ <div v-if="proxy.auth" class="mb-3">
+ <label for="proxy-username" class="form-label">{{ $t("User") }}</label>
+ <input id="proxy-username" v-model="proxy.username" type="text" class="form-control" required>
+ </div>
+
+ <div v-if="proxy.auth" class="mb-3">
+ <label for="proxy-password" class="form-label">{{ $t("Password") }}</label>
+ <input id="proxy-password" v-model="proxy.password" type="password" class="form-control" required>
+ </div>
+
+ <div class="mb-3 mt-4">
+ <hr class="dropdown-divider mb-4">
+
+ <div class="form-check form-switch">
+ <input id="mark-active" v-model="proxy.active" class="form-check-input" type="checkbox">
+ <label for="mark-active" class="form-check-label">{{ $t("enabled") }}</label>
+ </div>
+ <div class="form-text">
+ {{ $t("enableProxyDescription") }}
+ </div>
+
+ <br />
+
+ <div class="form-check form-switch">
+ <input id="mark-default" v-model="proxy.default" class="form-check-input" type="checkbox">
+ <label for="mark-default" class="form-check-label">{{ $t("setAsDefault") }}</label>
+ </div>
+ <div class="form-text">
+ {{ $t("setAsDefaultProxyDescription") }}
+ </div>
+
+ <br />
+
+ <div class="form-check form-switch">
+ <input id="apply-existing" v-model="proxy.applyExisting" class="form-check-input" type="checkbox">
+ <label class="form-check-label" for="apply-existing">{{ $t("Apply on all existing monitors") }}</label>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal-footer">
+ <button v-if="id" type="button" class="btn btn-danger" :disabled="processing" @click="deleteConfirm">
+ {{ $t("Delete") }}
+ </button>
+ <button type="submit" class="btn btn-primary" :disabled="processing">
+ <div v-if="processing" class="spinner-border spinner-border-sm me-1"></div>
+ {{ $t("Save") }}
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </form>
+
+ <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteProxy">
+ {{ $t("deleteProxyMsg") }}
+ </Confirm>
+</template>
+
+<script lang="ts">
+import { Modal } from "bootstrap";
+
+import Confirm from "./Confirm.vue";
+
+export default {
+ components: {
+ Confirm,
+ },
+ props: {},
+ emits: [ "added" ],
+ data() {
+ return {
+ model: null,
+ processing: false,
+ id: null,
+ proxy: {
+ protocol: null,
+ host: null,
+ port: null,
+ auth: false,
+ username: null,
+ password: null,
+ active: false,
+ default: false,
+ applyExisting: false,
+ }
+ };
+ },
+
+ mounted() {
+ this.modal = new Modal(this.$refs.modal);
+ },
+
+ methods: {
+ /**
+ * Show dialog to confirm deletion
+ * @returns {void}
+ */
+ deleteConfirm() {
+ this.modal.hide();
+ this.$refs.confirmDelete.show();
+ },
+
+ /**
+ * Show settings for specified proxy
+ * @param {number} proxyID ID of proxy to show
+ * @returns {void}
+ */
+ show(proxyID) {
+ if (proxyID) {
+ this.id = proxyID;
+
+ for (let proxy of this.$root.proxyList) {
+ if (proxy.id === proxyID) {
+ this.proxy = proxy;
+ break;
+ }
+ }
+ } else {
+ this.id = null;
+ this.proxy = {
+ protocol: "https",
+ host: null,
+ port: null,
+ auth: false,
+ username: null,
+ password: null,
+ active: true,
+ default: false,
+ applyExisting: false,
+ };
+ }
+
+ this.modal.show();
+ },
+
+ /**
+ * Submit form data for saving
+ * @returns {void}
+ */
+ submit() {
+ this.processing = true;
+ this.$root.getSocket().emit("addProxy", this.proxy, this.id, (res) => {
+ this.$root.toastRes(res);
+ this.processing = false;
+
+ if (res.ok) {
+ this.modal.hide();
+
+ // Emit added event, doesn't emit edit.
+ if (! this.id) {
+ this.$emit("added", res.id);
+ }
+ }
+ });
+ },
+
+ /**
+ * Delete this proxy
+ * @returns {void}
+ */
+ deleteProxy() {
+ this.processing = true;
+ this.$root.getSocket().emit("deleteProxy", this.id, (res) => {
+ this.$root.toastRes(res);
+ this.processing = false;
+
+ if (res.ok) {
+ this.modal.hide();
+ }
+ });
+ },
+ },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../assets/vars.scss";
+
+.dark {
+ .modal-dialog .form-text, .modal-dialog p {
+ color: $dark-font-color;
+ }
+}
+</style>