summaryrefslogtreecommitdiffstats
path: root/src/components/DockerHostDialog.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/DockerHostDialog.vue')
-rw-r--r--src/components/DockerHostDialog.vue198
1 files changed, 198 insertions, 0 deletions
diff --git a/src/components/DockerHostDialog.vue b/src/components/DockerHostDialog.vue
new file mode 100644
index 0000000..d2cde81
--- /dev/null
+++ b/src/components/DockerHostDialog.vue
@@ -0,0 +1,198 @@
+<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 Docker Host") }}
+ </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="docker-name" class="form-label">{{ $t("Friendly Name") }}</label>
+ <input id="docker-name" v-model="dockerHost.name" type="text" class="form-control" required>
+ </div>
+
+ <div class="mb-3">
+ <label for="docker-type" class="form-label">{{ $t("Connection Type") }}</label>
+ <select id="docker-type" v-model="dockerHost.dockerType" class="form-select">
+ <option v-for="type in connectionTypes" :key="type" :value="type">{{ $t(type) }}</option>
+ </select>
+ </div>
+
+ <div class="mb-3">
+ <label for="docker-daemon" class="form-label">{{ $t("Docker Daemon") }}</label>
+ <input id="docker-daemon" v-model="dockerHost.dockerDaemon" type="text" class="form-control" required>
+
+ <div class="form-text">
+ {{ $t("Examples") }}:
+ <ul>
+ <li>/var/run/docker.sock</li>
+ <li>http://localhost:2375</li>
+ <li>https://localhost:2376 (TLS)</li>
+ </ul>
+ </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="button" class="btn btn-warning" :disabled="processing" @click="test">
+ {{ $t("Test") }}
+ </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="deleteDockerHost">
+ {{ $t("deleteDockerHostMsg") }}
+ </Confirm>
+</template>
+
+<script lang="ts">
+import { Modal } from "bootstrap";
+import Confirm from "./Confirm.vue";
+
+export default {
+ components: {
+ Confirm,
+ },
+ props: {},
+ emits: [ "added", "deleted" ],
+ data() {
+ return {
+ modal: null,
+ processing: false,
+ id: null,
+ connectionTypes: [ "socket", "tcp" ],
+ dockerHost: {
+ name: "",
+ dockerDaemon: "",
+ dockerType: "",
+ // Do not set default value here, please scroll to show()
+ }
+ };
+ },
+
+ mounted() {
+ this.modal = new Modal(this.$refs.modal);
+ },
+ methods: {
+
+ /**
+ * Confirm deletion of docker host
+ * @returns {void}
+ */
+ deleteConfirm() {
+ this.modal.hide();
+ this.$refs.confirmDelete.show();
+ },
+
+ /**
+ * Show specified docker host
+ * @param {number} dockerHostID ID of host to show
+ * @returns {void}
+ */
+ show(dockerHostID) {
+ if (dockerHostID) {
+ let found = false;
+
+ this.id = dockerHostID;
+
+ for (let n of this.$root.dockerHostList) {
+ if (n.id === dockerHostID) {
+ this.dockerHost = n;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ this.$root.toastError("Docker Host not found!");
+ }
+
+ } else {
+ this.id = null;
+ this.dockerHost = {
+ name: "",
+ dockerType: "socket",
+ dockerDaemon: "/var/run/docker.sock",
+ };
+ }
+
+ this.modal.show();
+ },
+
+ /**
+ * Add docker host
+ * @returns {void}
+ */
+ submit() {
+ this.processing = true;
+ this.$root.getSocket().emit("addDockerHost", this.dockerHost, 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);
+ }
+
+ }
+ });
+ },
+
+ /**
+ * Test the docker host
+ * @returns {void}
+ */
+ test() {
+ this.processing = true;
+ this.$root.getSocket().emit("testDockerHost", this.dockerHost, (res) => {
+ this.$root.toastRes(res);
+ this.processing = false;
+ });
+ },
+
+ /**
+ * Delete this docker host
+ * @returns {void}
+ */
+ deleteDockerHost() {
+ this.processing = true;
+ this.$root.getSocket().emit("deleteDockerHost", this.id, (res) => {
+ this.$root.toastRes(res);
+ this.processing = false;
+
+ if (res.ok) {
+ this.$emit("deleted", this.id);
+ 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>