Mercurial > gemma
changeset 2979:8f266dc8b4e3 unified_import
unified_imports: moved imports partially to new UI
author | Thomas Junk <thomas.junk@intevation.de> |
---|---|
date | Tue, 09 Apr 2019 14:52:55 +0200 |
parents | d6dd158b8071 |
children | a9b61290fcc2 |
files | client/src/components/Sidebar.vue client/src/components/importconfiguration/Import.vue client/src/components/importconfiguration/ImportDetails.vue client/src/components/importconfiguration/types/Availablefairwaydepth.vue client/src/components/importconfiguration/types/Bottleneck.vue client/src/components/importconfiguration/types/Distancemarksashore.vue client/src/components/importconfiguration/types/Distancemarksvirtual.vue client/src/components/importconfiguration/types/Fairwaydimensions.vue client/src/components/importconfiguration/types/Gaugemeasurement.vue client/src/components/importconfiguration/types/ScheduledImports.vue client/src/components/importconfiguration/types/Waterwayarea.vue client/src/components/importconfiguration/types/Waterwayaxis.vue client/src/components/importconfiguration/types/Waterwaygauges.vue client/src/components/importschedule/Importschedule.vue client/src/components/importschedule/Importscheduledetail.vue client/src/components/importschedule/importtypes/Availablefairwaydepth.vue client/src/components/importschedule/importtypes/Bottleneck.vue client/src/components/importschedule/importtypes/Distancemarksashore.vue client/src/components/importschedule/importtypes/Distancemarksvirtual.vue client/src/components/importschedule/importtypes/Fairwaydimensions.vue client/src/components/importschedule/importtypes/Gaugemeasurement.vue client/src/components/importschedule/importtypes/Waterwayarea.vue client/src/components/importschedule/importtypes/Waterwayaxis.vue client/src/components/importschedule/importtypes/Waterwaygauges.vue client/src/router.js client/src/store/importschedule.js |
diffstat | 26 files changed, 1969 insertions(+), 2350 deletions(-) [+] |
line wrap: on
line diff
--- a/client/src/components/Sidebar.vue Tue Apr 09 13:42:44 2019 +0200 +++ b/client/src/components/Sidebar.vue Tue Apr 09 14:52:55 2019 +0200 @@ -43,14 +43,10 @@ </router-link> </div> <div v-if="isWaterwayAdmin"> - <router-link to="/importschedule"> + <router-link to="/imports/configuration"> <font-awesome-icon class="fa-fw mr-2" fixed-width icon="clock" /> <translate class="fix-trans-space">Imports</translate> </router-link> - <router-link to="/imports/configuration"> - <font-awesome-icon class="fa-fw mr-2" fixed-width icon="clock" /> - <translate class="fix-trans-space">Imports (New)</translate> - </router-link> <small class="text-muted pl-3"> <translate>Systemadministration</translate> </small>
--- a/client/src/components/importconfiguration/Import.vue Tue Apr 09 13:42:44 2019 +0200 +++ b/client/src/components/importconfiguration/Import.vue Tue Apr 09 14:52:55 2019 +0200 @@ -58,48 +58,15 @@ </UITableBody> </div> <ImportDetails v-if="mode === $options.MODES.EDIT"></ImportDetails> - <div class="d-flex flex-row-reverse w-100 mb-3"> - <button - :key="1" - v-if="mode === $options.MODES.EDIT && !isOnetime" - @click="back()" - class="btn btn-warning mr-3" - > - Back - </button> - <button - :key="2" - v-if=" - mode === $options.MODES.EDIT && - currentSchedule.importType && - !isOnetime - " - type="submit" - class="shadow-sm btn btn-info submit-button mr-3" - > - <translate>Submit</translate> - </button> + <div class="d-flex flex-row w-100 mb-3"> <button :key="3" v-if="mode === $options.MODES.LIST && !isOnetime" @click="newConfiguration()" - class="btn btn-info mr-3" + class="ml-auto btn btn-info mr-3" > <translate>New import</translate> </button> - <button - v-if=" - mode === $options.MODES.EDIT && - currentSchedule.importType && - !isOnetime - " - @click="triggerManualImport" - type="button" - class="shadow-sm btn btn-outline-info trigger mr-auto ml-3" - > - <font-awesome-icon class="fa-fw mr-2" fixed-width icon="play" /> - <translate>Trigger import</translate> - </button> </div> </div> </template>
--- a/client/src/components/importconfiguration/ImportDetails.vue Tue Apr 09 13:42:44 2019 +0200 +++ b/client/src/components/importconfiguration/ImportDetails.vue Tue Apr 09 14:52:55 2019 +0200 @@ -57,6 +57,15 @@ class="mt-3" v-if="Import === $options.IMPORTTYPES.SOUNDINGRESULTS" /> + <ScheduledImports + class="mt-3" + v-if="Import && !isOnetime" + ></ScheduledImports> + <div v-if="!Import" class="d-flex flex-row w-100 mt-3"> + <button :key="1" @click="back()" class="ml-auto btn btn-warning"> + Back + </button> + </div> </div> </template> @@ -77,28 +86,31 @@ * Thomas Junk <thomas.junk@intevation.de> * Tom Gottfried <tom.gottfried@intevation.de> */ -import { - IMPORTTYPES - // IMPORTTYPEKIND, - // initializeCurrentSchedule -} from "@/store/importschedule"; +import { IMPORTTYPES } from "@/store/importschedule"; import { mapState } from "vuex"; -// import { displayInfo, displayError } from "@/lib/errors.js"; -// import app from "@/main.js"; -// import { HTTP } from "@/lib/http"; - export default { components: { ApprovedGaugeMeasurement: () => import("./types/ApprovedGaugeMeasurement.vue"), WaterwayProfiles: () => import("./types/WaterwayProfiles"), - SoundingResults: () => import("./types/Soundingresults.vue") + SoundingResults: () => import("./types/Soundingresults.vue"), + ScheduledImports: () => import("./types/ScheduledImports.vue") }, data() { return {}; }, computed: { ...mapState("importschedule", ["currentSchedule"]), + isOnetime() { + for (let kind of [ + this.$options.IMPORTTYPES.SOUNDINGRESULTS, + this.$options.IMPORTTYPES.APPROVEDGAUGEMEASUREMENTS, + this.$options.IMPORTTYPES.WATERWAYPROFILES + ]) { + if (kind === this.currentSchedule.importType) return true; + } + return false; + }, Import: { get() { return this.currentSchedule.importType; @@ -114,7 +126,11 @@ return this.$gettext("Regular Imports"); } }, - methods: {}, + methods: { + back() { + this.$store.commit("importschedule/setListMode"); + } + }, IMPORTTYPES: IMPORTTYPES }; </script>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importconfiguration/types/Availablefairwaydepth.vue Tue Apr 09 14:52:55 2019 +0200 @@ -0,0 +1,51 @@ +<template> + <div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-100"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>URL</translate> </small> + </div> + <div class="w-100"> + <input + @input="urlChanged" + class="url form-control" + type="url" + :value="url" + /> + </div> + </div> + </div> + <div v-if="!url" class="d-flex flex-row"> + <small + ><translate class="text-danger">Please enter a URL</translate></small + > + </div> + </div> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Thomas Junk <thomas.junk@intevation.de> + */ +export default { + name: "availablefairwaydepth", + props: ["url"], + methods: { + urlChanged(e) { + this.$emit("urlChanged", e.target.value); + } + } +}; +</script> + +<style></style>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importconfiguration/types/Bottleneck.vue Tue Apr 09 14:52:55 2019 +0200 @@ -0,0 +1,107 @@ +<template> + <div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-100"> + <template v-if="!directImport"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>URL</translate> </small> + </div> + <div class="w-100"> + <input + @input="urlChanged" + class="url form-control" + type="url" + :value="url" + /> + </div> + </template> + </div> + <div v-if="false" class="flex-column mt-3 text-left"> + <div class="d-flex flex-row"> + <small class="text-muted mr-2" + ><translate>Insecure</translate> + </small> + </div> + <div class="d-flex flex-row"> + <toggle-button + v-model="insecure" + class="mt-2" + :speed="100" + :color="{ + checked: '#FF0000', + unchecked: '#E9ECEF', + disabled: '#CCCCCC' + }" + :labels="{ + checked: this.$options.on, + unchecked: this.$options.off + }" + :width="60" + :height="30" + /> + </div> + </div> + </div> + <div v-if="!url" class="d-flex flex-row"> + <small + ><translate class="text-danger">Please enter a URL</translate></small + > + </div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> + <translate>Tolerance for snapping of waterway axis [m]</translate> + </small> + </div> + <div class="w-100"> + <input + @input="toleranceChanged" + class="tolerance form-control" + type="number" + min="0" + :value="tolerance" + /> + </div> + <div v-if="!tolerance" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a tolerance value</translate + ></small + > + </div> + </div> + </div> + </div> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018, 2019 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Thomas Junk <thomas.junk@intevation.de> + * Tom Gottfried <tom.gottfried@intevation.de> + */ +export default { + name: "bottleneckimport", + props: ["url", "tolerance", "directImport"], + methods: { + urlChanged(e) { + this.$emit("urlChanged", e.target.value); + }, + toleranceChanged(e) { + this.$emit("toleranceChanged", e.target.value); + } + } +}; +</script> + +<style></style>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importconfiguration/types/Distancemarksashore.vue Tue Apr 09 14:52:55 2019 +0200 @@ -0,0 +1,99 @@ +<template> + <div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-100"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>URL</translate> </small> + </div> + <div class="w-100"> + <input + @input="urlChanged" + class="url form-control" + type="url" + :value="url" + /> + </div> + </div> + </div> + <div v-if="!url" class="d-flex flex-row"> + <small + ><translate class="text-danger">Please enter a URL</translate></small + > + </div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>Featuretype</translate> </small> + </div> + <div class="w-100"> + <input + @input="featureTypeChanged" + class="featuretype form-control" + type="text" + :value="featureType" + /> + </div> + <div v-if="!featureType" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a Featuretype</translate + ></small + > + </div> + </div> + <div class="flex-column mt-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>SortBy</translate> </small> + </div> + <div class="w-100"> + <input + @input="sortByChanged" + class="sortby form-control" + type="text" + :value="sortBy" + /> + </div> + <div v-if="!sortBy" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter SortBy</translate + ></small + > + </div> + </div> + </div> + </div> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Thomas Junk <thomas.junk@intevation.de> + */ +export default { + name: "distancemarksashore", + props: ["url", "featureType", "sortBy"], + methods: { + urlChanged(e) { + this.$emit("urlChanged", e.target.value); + }, + featureTypeChanged(e) { + this.$emit("featureTypeChanged", e.target.value); + }, + sortByChanged(e) { + this.$emit("sortByChanged", e.target.value); + } + } +}; +</script> + +<style></style>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importconfiguration/types/Distancemarksvirtual.vue Tue Apr 09 14:52:55 2019 +0200 @@ -0,0 +1,116 @@ +<template> + <div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-100"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>URL</translate> </small> + </div> + <div class="w-100"> + <input + @input="urlChanged" + class="url form-control" + type="url" + :value="url" + /> + </div> + </div> + </div> + <div v-if="!url" class="d-flex flex-row"> + <small + ><translate class="text-danger">Please enter a URL</translate></small + > + </div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>Username</translate> </small> + </div> + <div class="w-100"> + <input + @input="usernameChanged" + class="username form-control" + type="text" + :value="username" + /> + </div> + <div v-if="!username" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a Username</translate + ></small + > + </div> + </div> + <div class="flex-column mt-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>Password</translate> </small> + </div> + <div class="w-100 d-flex flex-row"> + <input + @input="passwordChanged" + class="pasword form-control" + :type="showPassword" + :value="password" + /> + <span + class="input-group-text ml-2" + @click="passwordVisible = !passwordVisible" + > + <font-awesome-icon :icon="passwordVisible ? 'eye-slash' : 'eye'" /> + </span> + </div> + <div v-if="!password" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a Password</translate + ></small + > + </div> + </div> + </div> + </div> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Thomas Junk <thomas.junk@intevation.de> + */ +export default { + name: "distancemarksvirtual", + props: ["url", "username", "password"], + data() { + return { + passwordVisible: false + }; + }, + computed: { + showPassword() { + if (this.passwordVisible) return "text"; + return "password"; + } + }, + methods: { + urlChanged(e) { + this.$emit("urlChanged", e.target.value); + }, + usernameChanged(e) { + this.$emit("usernameChanged", e.target.value); + }, + passwordChanged(e) { + this.$emit("passwordChanged", e.target.value); + } + } +}; +</script> + +<style></style>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importconfiguration/types/Fairwaydimensions.vue Tue Apr 09 14:52:55 2019 +0200 @@ -0,0 +1,243 @@ +<template> + <div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-100"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>URL</translate> </small> + </div> + <div class="w-100"> + <input + @input="urlChanged" + class="url form-control" + type="url" + :value="url" + /> + </div> + </div> + </div> + <div v-if="!url" class="d-flex flex-row"> + <small + ><translate class="text-danger">Please enter a URL</translate></small + > + </div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>Featuretype</translate> </small> + </div> + <div class="w-100"> + <input + @input="featureTypeChanged" + class="featuretype form-control" + type="text" + :value="featureType" + /> + </div> + <div v-if="!featureType" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a Featuretype</translate + ></small + > + </div> + </div> + <div class="flex-column mt-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>SortBy</translate> </small> + </div> + <div class="w-100"> + <input + @input="sortByChanged" + class="sortby form-control" + type="text" + :value="sortBy" + /> + </div> + <div v-if="!sortBy" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter SortBy</translate + ></small + > + </div> + </div> + </div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>LOS</translate> </small> + </div> + <div class="w-100"> + <select v-model="los" class="form-control"> + <option>1</option> + <option>2</option> + <option>3</option> + </select> + </div> + <div v-if="!LOS" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a level of service</translate + ></small + > + </div> + </div> + <div class="flex-column mt-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>Depth</translate> </small> + </div> + <div class="d-flex flex-row"> + <input + @input="depthChanged" + class="depth form-control" + type="number" + :value="depth" + /> + <div class="ml-2 my-auto">cm</div> + </div> + <div v-if="!depth" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a depth</translate + ></small + > + </div> + </div> + </div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>MinWidth</translate> </small> + </div> + <div class="d-flex flex-row"> + <input + @input="minWidthChanged" + class="minwidth form-control" + type="number" + :value="minWidth" + /> + <div class="ml-2 my-auto"> m</div> + </div> + <div v-if="!minWidth" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a minimum width</translate + ></small + > + </div> + </div> + <div class="flex-column mt-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>MaxWidth</translate> </small> + </div> + <div class="d-flex flex-row"> + <input + @input="maxWidthChanged" + class="maxwidth form-control" + type="number" + :value="maxWidth" + /> + <div class="ml-2 my-auto"> m</div> + </div> + <div v-if="!maxWidth" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a maximum width</translate + ></small + > + </div> + </div> + </div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> + <translate>Source orgranization</translate> + </small> + </div> + <div class="w-100"> + <input + @input="sourceOrganizationChanged" + class="sourceorganization form-control" + type="text" + :value="sourceOrganization" + /> + </div> + <div v-if="!sourceOrganization" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a source orgranization</translate + ></small + > + </div> + </div> + </div> + </div> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Thomas Junk <thomas.junk@intevation.de> + */ +export default { + name: "fairwaydimensions", + props: [ + "url", + "featureType", + "sortBy", + "depth", + "LOS", + "minWidth", + "maxWidth", + "sourceOrganization" + ], + methods: { + urlChanged(e) { + this.$emit("urlChanged", e.target.value); + }, + featureTypeChanged(e) { + this.$emit("featureTypeChanged", e.target.value); + }, + sortByChanged(e) { + this.$emit("sortByChanged", e.target.value); + }, + depthChanged(e) { + this.$emit("depthChanged", e.target.value * 1); + }, + LOSChanged(e) { + this.$emit("LOSChanged", e.target.value * 1); + }, + minWidthChanged(e) { + this.$emit("minWidthChanged", e.target.value * 1); + }, + maxWidthChanged(e) { + this.$emit("maxWidthChanged", e.target.value * 1); + }, + sourceOrganizationChanged(e) { + this.$emit("sourceOrganizationChanged", e.target.value); + } + }, + computed: { + los: { + get() { + return this.LOS; + }, + set(value) { + this.$emit("LOSChanged", value * 1); + } + } + } +}; +</script> + +<style></style>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importconfiguration/types/Gaugemeasurement.vue Tue Apr 09 14:52:55 2019 +0200 @@ -0,0 +1,51 @@ +<template> + <div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-100"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>URL</translate> </small> + </div> + <div class="w-100"> + <input + @input="urlChanged" + class="url form-control" + type="url" + :value="url" + /> + </div> + </div> + </div> + <div v-if="!url" class="d-flex flex-row"> + <small + ><translate class="text-danger">Please enter a URL</translate></small + > + </div> + </div> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Thomas Junk <thomas.junk@intevation.de> + */ +export default { + name: "gaugemeasurement", + props: ["url"], + methods: { + urlChanged(e) { + this.$emit("urlChanged", e.target.value); + } + } +}; +</script> + +<style></style>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importconfiguration/types/ScheduledImports.vue Tue Apr 09 14:52:55 2019 +0200 @@ -0,0 +1,957 @@ +<template> + <form @submit.prevent="save" class="w-100"> + <div v-if="directImportAvailable" class="flex-column"> + <div class="flex-row text-left"> + <small class="text-muted"> + <translate>Import via</translate> + </small> + </div> + <div class="flex-flex-row text-left"> + <!-- '#75c791' is the DEFAULT_COLOR_CHECKED + from vue-js-toggle-button as here both states are active --> + <toggle-button + :color="{ unchecked: '#75c791' }" + v-model="directImport" + class="mt-2" + :speed="100" + :labels="{ + checked: this.$options.FILE, + unchecked: this.$options.URL + }" + :width="60" + :height="30" + /> + </div> + </div> + <Availablefairwaydepth + v-if=" + import_ == $options.IMPORTTYPES.FAIRWAYAVAILABILITY && !directImport + " + @urlChanged="setUrl" + :url="url" + /> + <Bottleneck + v-if="import_ == $options.IMPORTTYPES.BOTTLENECK" + @urlChanged="setUrl" + @toleranceChanged="setTolerance" + :url="url" + :tolerance="tolerance" + :directImport="directImport" + /> + <Distancemarksvirtual + v-if="import_ == $options.IMPORTTYPES.DISTANCEMARKSVIRTUAL" + @urlChanged="setUrl" + @usernameChanged="setUsername" + @passwordChanged="setPassword" + :url="url" + :username="username" + :password="password" + /> + <Distancemarksashore + v-if="import_ == $options.IMPORTTYPES.DISTANCEMARKSASHORE" + @urlChanged="setUrl" + @featureTypeChanged="setFeatureType" + @sortByChanged="setSortBy" + :url="url" + :featureType="featureType" + :sortBy="sortBy" + /> + <Faiwaydimensions + v-if="import_ == $options.IMPORTTYPES.FAIRWAYDIMENSION" + @urlChanged="setUrl" + @featureTypeChanged="setFeatureType" + @sortByChanged="setSortBy" + @LOSChanged="setLOS" + @depthChanged="setDepth" + @minWidthChanged="setMinWidth" + @maxWidthChanged="setMaxWidth" + @sourceOrganizationChanged="setSourceOrganization" + :url="url" + :featureType="featureType" + :sortBy="sortBy" + :LOS="LOS" + :minWidth="minWidth" + :maxWidth="maxWidth" + :sourceOrganization="sourceOrganization" + :depth="depth" + /> + <Gaugemeasurement + v-if="import_ == $options.IMPORTTYPES.GAUGEMEASUREMENT && !directImport" + @urlChanged="setUrl" + :url="url" + /> + <Waterwayarea + v-if="import_ == $options.IMPORTTYPES.WATERWAYAREA" + @urlChanged="setUrl" + @featureTypeChanged="setFeatureType" + @sortByChanged="setSortBy" + :url="url" + :featureType="featureType" + :sortBy="sortBy" + /> + <Waterwaygauges + v-if="import_ == $options.IMPORTTYPES.WATERWAYGAUGES" + @urlChanged="setUrl" + @usernameChanged="setUsername" + @passwordChanged="setPassword" + :url="url" + :username="username" + :password="password" + /> + <Waterwayaxis + v-if="import_ == $options.IMPORTTYPES.WATERWAYAXIS" + @urlChanged="setUrl" + @featureTypeChanged="setFeatureType" + @sortByChanged="setSortBy" + :url="url" + :featureType="featureType" + :sortBy="sortBy" + /> + + <template v-if="!directImport || !directImportAvailable"> + <div class="d-flex flex-row mt-3"> + <div class="flex-column mr-4"> + <div class="flex-row text-left"> + <small class="text-muted"> + <translate>Email Notification</translate> + </small> + </div> + <div class="flex-flex-row text-left"> + <toggle-button + v-model="eMailNotification" + class="mt-2" + :speed="100" + :labels="{ + checked: this.$options.on, + unchecked: this.$options.off + }" + :width="60" + :height="30" + /> + </div> + </div> + + <div class="flex-column mr-4"> + <div class="flex-row text-left"> + <small class="text-muted"> + <translate>Scheduled</translate>? + </small> + </div> + <div class="flex-flex-row text-left"> + <toggle-button + v-model="scheduled" + class="mt-2" + :speed="100" + :labels="{ + checked: this.$options.on, + unchecked: this.$options.off + }" + :width="60" + :height="30" + /> + </div> + </div> + <div class="flex-column mr-2"> + <div class="flex-row text-left"> + <small class="text-muted"> + <translate>Simple schedule</translate> + </small> + </div> + <div class="flex-flex-row text-left"> + <toggle-button + :disabled="!scheduled" + v-model="easyCron" + class="mt-2" + :speed="100" + :labels="{ + checked: this.$options.on, + unchecked: this.$options.off + }" + :width="60" + :height="30" + /> + </div> + </div> + </div> + <div class="flex-column w-100 mr-2"> + <div class="flex-row text-left"> + <small class="text-muted"> + <translate>Schedule</translate> + </small> + </div> + <div v-if="easyCron" class="text-left w-50"> + <select :disabled="!scheduled" v-model="simple" class="form-control" + ><option value="weekly"><translate>Weekly</translate></option> + <option value="monthly"><translate>Monthly</translate> </option> + </select> + </div> + <div v-if="!easyCron" class="text-left w-100"> + <div class="d-flex flex-row"> + <h4 class="mt-auto mb-auto mr-2">{{ $options.EVERY }}</h4> + <select + :disabled="!scheduled" + style="width: 130px;" + v-model="cronMode" + class="form-control" + @change="clearInputs" + > + <option :value="null"></option> + <option + v-for="(option, key) in $options.CRONMODE" + :value="key" + :key="key" + >{{ option }}</option + > + </select> + <div v-if="cronMode == 'hour'" class="ml-1 d-flex flex-row"> + <h4 class="mt-auto mb-auto">{{ $options.ON }}</h4> + <input + :disabled="!scheduled" + v-model="minutes" + class="cronfield ml-1 mr-1 form-control" + type="number" + /> + <h4 class="mt-auto mb-auto">{{ $options.MINUTESPAST }}</h4> + </div> + <div v-if="cronMode == 'day'" class="ml-1 d-flex flex-row"> + <h4 class="mt-auto mb-auto">{{ $options.AT }}</h4> + <input + :disabled="!scheduled" + v-model="hour" + class="cronfield ml-1 mr-1 form-control" + type="number" + /> + <input + :disabled="!scheduled" + v-model="minutes" + class="cronfield ml-1 mr-1 form-control" + type="number" + /> + <h4 class="mt-auto mb-auto">{{ $options.OCLOCK }}</h4> + </div> + <div v-if="cronMode == 'week'" class="ml-1 d-flex flex-row"> + <h4 class="ml-1 mr-1 mt-auto mb-auto">{{ $options.ON }}</h4> + <select :disabled="!scheduled" v-model="day" class="form-control"> + <option + v-for="(option, key) in $options.DAYSOFWEEK" + :key="key" + :value="key" + >{{ option }}</option + > + </select> + <h4 class="ml-1 mt-auto mb-auto">{{ $options.AT }}</h4> + <input + :disabled="!scheduled" + v-model="hour" + class="cronfield ml-1 mr-1 form-control" + type="number" + /> + <input + :disabled="!scheduled" + v-model="minutes" + class="cronfield ml-1 mr-1 form-control" + type="number" + /> + </div> + <div v-if="cronMode == 'month'" class="ml-1 d-flex flex-row"> + <h4 class="ml-1 mt-auto mb-auto">{{ $options.ON }}</h4> + <input + :disabled="!scheduled" + v-model="dayOfMonth" + class="cronfield ml-1 mr-1 form-control" + type="number" + /> + <h4 class="mt-auto mb-auto">{{ $options.AT }}</h4> + <input + :disabled="!scheduled" + v-model="hour" + class="cronfield ml-1 mr-2 form-control" + type="number" + /> + <input + :disabled="!scheduled" + v-model="minutes" + class="cronfield ml-1 mr-2 form-control" + type="number" + /> + <h4 class="mt-auto mb-auto">{{ $options.OCLOCK }}</h4> + </div> + <div v-if="cronMode == 'year'" class="ml-1 d-flex flex-row"> + <h4 class="ml-1 mt-auto mb-auto">{{ $options.ON }}</h4> + <input + :disabled="!scheduled" + v-model="dayOfMonth" + class="cronfield ml-1 mr-1 form-control" + type="number" + /> + <h4 class="mt-auto mb-auto">{{ $options.OF }}</h4> + <select + :disabled="!scheduled" + v-model="month" + class="ml-1 mr-1 form-control" + > + <option + v-for="(option, key) in $options.MONTHS" + :value="key" + :key="key" + >{{ option }}</option + > + </select> + <h4 class="mt-auto mb-auto">{{ $options.ON }}</h4> + <input + :disabled="!scheduled" + v-model="hour" + class="cronfield ml-1 mr-1 form-control" + type="number" + /> + <input + :disabled="!scheduled" + v-model="minutes" + class="cronfield ml-1 mr-1 form-control" + type="number" + /> + </div> + </div> + <div class="mt-3 w-50 d-flex flex-row"> + <h5 class="mt-auto mb-auto mr-2"> + <translate>Cronstring</translate> + </h5> + <input + :disabled="!scheduled" + class="form-control" + v-model="cronString" + type="text" + /> + </div> + </div> + </div> + </template> + <div v-else class="d-flex flex-row text-left"> + <div class="mt-3 mb-3 flex-column w-100"> + <div class="custom-file"> + <input + accept=".xml" + type="file" + @change="fileSelected" + class="custom-file-input" + id="uploadFile" + /> + <label class="pointer custom-file-label" for="uploadFile"> + {{ uploadLabel }} + </label> + </div> + </div> + </div> + <div class="w-100 d-flex flex-row mt-3"> + <button + @click="triggerManualImport" + type="button" + class="shadow-sm btn btn-outline-info" + :disabled="!triggerActive || !isValid" + > + <font-awesome-icon class="fa-fw mr-2" fixed-width icon="play" /> + <translate>Trigger import</translate> + </button> + <button + :disabled="!isValid" + type="submit" + class="ml-auto shadow-sm btn btn-info mr-3" + > + <translate>Save</translate> + </button> + <button :key="1" @click="back()" class="btn btn-warning"> + Back + </button> + </div> + </form> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018, 2019 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Thomas Junk <thomas.junk@intevation.de> + * Tom Gottfried <tom.gottfried@intevation.de> + */ +import { + IMPORTTYPES, + IMPORTTYPEKIND, + initializeCurrentSchedule +} from "@/store/importschedule"; +import { mapState } from "vuex"; +import { displayInfo, displayError } from "@/lib/errors.js"; +import app from "@/main.js"; +import { HTTP } from "@/lib/http"; + +export default { + name: "importscheduledetail", + components: { + Availablefairwaydepth: () => import("./Availablefairwaydepth"), + Bottleneck: () => import("./Bottleneck"), + Distancemarksvirtual: () => import("./Distancemarksvirtual"), + Distancemarksashore: () => import("./Distancemarksashore"), + Faiwaydimensions: () => import("./Fairwaydimensions"), + Gaugemeasurement: () => import("./Gaugemeasurement"), + Waterwayarea: () => import("./Waterwayarea"), + Waterwaygauges: () => import("./Waterwaygauges"), + Waterwayaxis: () => import("./Waterwayaxis") + }, + data() { + return { + directImport: false, + passwordVisible: false, + uploadLabel: this.$gettext("choose file to upload"), + uploadFile: null, + ...initializeCurrentSchedule() + }; + }, + mounted() { + this.initialize(); + }, + watch: { + cronMode() { + this.cronString = this.calcCronString(); + }, + minutes() { + this.cronString = this.calcCronString(); + }, + hour() { + this.cronString = this.calcCronString(); + }, + month() { + this.cronString = this.calcCronString(); + }, + day() { + this.cronString = this.calcCronString(); + }, + dayOfMonth() { + this.cronString = this.calcCronString(); + }, + importScheduleDetailVisible() { + this.initialize(); + }, + cronString() { + if (this.isWeekly(this.cronString)) { + this.simple = "weekly"; + } + if (this.isMonthly(this.cronString)) { + this.simple = "monthly"; + } + } + }, + computed: { + ...mapState("importschedule", [ + "importScheduleDetailVisible", + "currentSchedule" + ]), + import_() { + return this.currentSchedule.importType; + }, + dialogLabel() { + if (this.id) return this.$gettext("Import") + " " + this.id; + return this.$gettext("New Import"); + }, + directImportAvailable() { + switch (this.import_) { + case this.$options.IMPORTTYPES.BOTTLENECK: + case this.$options.IMPORTTYPES.FAIRWAYAVAILABILITY: + case this.$options.IMPORTTYPES.GAUGEMEASUREMENT: + return true; + default: + return false; + } + }, + isCredentialsRequired() { + switch (this.import_) { + case this.$options.IMPORTTYPES.WATERWAYGAUGES: + case this.$options.IMPORTTYPES.DISTANCEMARKSVIRTUAL: + return true; + default: + return false; + } + }, + isURLRequired() { + switch (this.import_) { + case this.$options.IMPORTTYPES.BOTTLENECK: + case this.$options.IMPORTTYPES.WATERWAYAXIS: + case this.$options.IMPORTTYPES.GAUGEMEASUREMENT: + case this.$options.IMPORTTYPES.FAIRWAYAVAILABILITY: + case this.$options.IMPORTTYPES.WATERWAYAREA: + case this.$options.IMPORTTYPES.FAIRWAYDIMENSION: + case this.$options.IMPORTTYPES.WATERWAYGAUGES: + case this.$options.IMPORTTYPES.DISTANCEMARKSVIRTUAL: + case this.$options.IMPORTTYPES.DISTANCEMARKSASHORE: + return true; + default: + return false; + } + }, + isFeatureTypeRequired() { + switch (this.import_) { + case this.$options.IMPORTTYPES.WATERWAYAXIS: + case this.$options.IMPORTTYPES.WATERWAYAREA: + case this.$options.IMPORTTYPES.FAIRWAYDIMENSION: + case this.$options.IMPORTTYPES.DISTANCEMARKSASHORE: + return true; + default: + return false; + } + }, + isSortbyRequired() { + switch (this.import_) { + case this.$options.IMPORTTYPES.WATERWAYAXIS: + case this.$options.IMPORTTYPES.WATERWAYAREA: + case this.$options.IMPORTTYPES.FAIRWAYDIMENSION: + case this.$options.IMPORTTYPES.DISTANCEMARKSASHORE: + return true; + default: + return false; + } + }, + isToleranceRequired() { + switch (this.import_) { + case this.$options.IMPORTTYPES.BOTTLENECK: + return true; + default: + return false; + } + }, + isValid() { + if (!this.import_) return false; + if (this.isToleranceRequired && !this.tolerance) return false; + if (this.directImport && !this.uploadFile) return false; + else if (!this.directImport) { + if (this.isURLRequired && !this.url) return false; + if (this.isSortbyRequired && !this.sortBy) return false; + if (this.isFeatureTypeRequired && !this.featureType) return false; + if (this.isCredentialsRequired && (!this.username || !this.password)) + return false; + if (this.import_ == this.$options.IMPORTTYPES.FAIRWAYDIMENSION) { + if ( + !this.LOS || + !this.minWidth || + !this.maxWidth || + !this.depth || + !this.sourceOrganization + ) + return false; + } + } + return true; + } + }, + methods: { + back() { + this.$store.commit("importschedule/setListMode"); + }, + fileSelected(e) { + const files = e.target.files || e.dataTransfer.files; + if (!files) return; + this.uploadLabel = files[0].name; + this.uploadFile = files[0]; + }, + setUrl(value) { + this.url = value; + }, + setFeatureType(value) { + this.featureType = value; + }, + setSortBy(value) { + this.sortBy = value; + }, + setTolerance(value) { + this.tolerance = value; + }, + setUsername(value) { + this.username = value; + }, + setPassword(value) { + this.password = value; + }, + setLOS(value) { + this.LOS = value; + }, + setMinWidth(value) { + this.minWidth = value; + }, + setMaxWidth(value) { + this.maxWidth = value; + }, + setDepth(value) { + this.depth = value; + }, + setSourceOrganization(value) { + this.sourceOrganization = value; + }, + calcCronString() { + let getValue = value => { + return this[value] !== null ? this[value] : "*"; + }; + + const min = getValue("minutes"); + const h = getValue("hour"); + const dm = getValue("dayOfMonth"); + const m = getValue("month"); + const wd = getValue("day"); + + if (this.cronMode === "15minutes") return "0 */15 * * * *"; + if (this.cronMode === "hour") return `0 ${min} * * * *`; + if (this.cronMode === "day") return `0 ${min} ${h} * * *`; + if (this.cronMode === "week") return `0 ${min} ${h} * * ${wd}`; + if (this.cronMode === "month") return `0 ${min} ${h} ${dm} * *`; + if (this.cronMode === "year") return `0 ${min} ${h} ${dm} ${m} *`; + return this.cronString; + }, + validateBottleneckfields() { + return !!this.url; + }, + initialize() { + this.id = this.currentSchedule.id; + this.importType = this.currentSchedule.importType; + this.schedule = this.currentSchedule.schedule; + this.scheduled = this.currentSchedule.scheduled; + this.importSource = this.currentSchedule.importSource; + this.eMailNotification = this.currentSchedule.eMailNotification; + this.easyCron = this.currentSchedule.easyCron; + this.cronMode = this.currentSchedule.cronMode; + this.minutes = this.currentSchedule.minutes; + this.month = this.currentSchedule.month; + this.hour = this.currentSchedule.hour; + this.day = this.currentSchedule.day; + this.dayOfMonth = this.currentSchedule.dayOfMonth; + this.simple = this.currentSchedule.simple; + this.url = this.currentSchedule.url; + this.insecure = this.currentSchedule.insecure; + this.cronString = this.currentSchedule.cronString; + this.featureType = this.currentSchedule.featureType; + this.sortBy = this.currentSchedule.sortBy; + this.tolerance = this.currentSchedule.tolerance; + this.username = this.currentSchedule.username; + this.password = this.currentSchedule.password; + this.LOS = this.currentSchedule.LOS; + this.minWidth = this.currentSchedule.minWidth; + this.maxWidth = this.currentSchedule.maxWidth; + this.depth = this.currentSchedule.depth; + this.sourceOrganization = this.currentSchedule.sourceOrganization; + this.directImport = false; + }, + isWeekly(cron) { + return /0 \d{1,2} \d{1,2} \* \* \d{1}/.test(cron); + }, + isMonthly(cron) { + return /0 \d{1,2} \d{1,2} \d{1,2} \* \*/.test(cron); + }, + clearInputs() { + this.minutes = this.currentSchedule.minutes; + this.month = this.currentSchedule.month; + this.hour = this.currentSchedule.hour; + this.day = this.currentSchedule.day; + this.dayOfMonth = this.currentSchedule.dayOfMonth; + }, + triggerFileUpload() { + if (!this.uploadFile) return; + let formData = new FormData(); + let routeParam = ""; + switch (this.import_) { + case this.$options.IMPORTTYPES.BOTTLENECK: + formData.append("tolerance", this.tolerance); + routeParam = "ubn"; + break; + case this.$options.IMPORTTYPES.FAIRWAYAVAILABILITY: + routeParam = "ufa"; + break; + case this.$options.IMPORTTYPES.GAUGEMEASUREMENT: + routeParam = "ugm"; + break; + default: + throw new Error("invalid importroute"); + } + + formData.append(routeParam, this.uploadFile); + HTTP.post("/imports/" + routeParam, formData, { + headers: { + "X-Gemma-Auth": localStorage.getItem("token"), + "Content-Type": "multipart/form-data" + } + }) + .then(response => { + const { id } = response.data; + displayInfo({ + title: this.$gettext("File Import"), + message: this.$gettext("Import import: #") + id + }); + this.closeDetailview(); + this.$store.dispatch("importschedule/loadSchedules").catch(error => { + const { status, data } = error.response; + displayError({ + title: this.gettext("Backend Error"), + message: `${status}: ${data.message || data}` + }); + }); + }) + .catch(error => { + const { status, data } = error.response; + displayError({ + title: this.$gettext("Backend Error"), + message: `${status}: ${data.message || data}` + }); + }); + }, + triggerManualImport() { + if (!this.triggerActive) return; + if (!this.import_) return; + if (this.directImport) { + if (!this.uploadFile) return; + this.triggerFileUpload(); + return; + } + let data = {}; + if (this.isURLRequired) { + if (!this.url) return; + data["url"] = this.url; + data["insecure"] = this.insecure; + } + if (this.isFeatureTypeRequired) { + if (!this.featureType) return; + data["feature-type"] = this.featureType; + } + if (this.isSortbyRequired) { + if (!this.sortBy) return; + data["sort-by"] = this.sortBy; + } + if (this.isToleranceRequired) { + if (!this.tolerance) return; + data["tolerance"] = parseFloat(this.tolerance); + } + if (this.isCredentialsRequired) { + if (!this.username || !this.password) return; + data["user"] = this.username; + data["password"] = this.password; + } + if (this.import_ == this.$options.IMPORTTYPES.FAIRWAYDIMENSION) { + if ( + !this.LOS || + !this.minWidth || + !this.maxWidth || + !this.depth || + !this.sourceOrganization + ) + return; + data["feature-type"] = this.featureType; + data["sort-by"] = this.sortBy; + data["los"] = this.LOS * 1; + data["min-width"] = this.minWidth * 1; + data["max-width"] = this.maxWidth * 1; + data["depth"] = this.depth * 1; + data["source-organization"] = this.sourceOrganization; + } + data["send-email"] = this.eMailNotification; + this.triggerActive = false; + this.$store + .dispatch("importschedule/triggerImport", { + type: IMPORTTYPEKIND[this.import_], + data + }) + .then(response => { + const { id } = response.data; + displayInfo({ + title: this.$gettext("Import"), + message: this.$gettext("Manually triggered import: #") + id + }); + }) + .catch(error => { + const { status, data } = error.response; + displayError({ + title: this.$gettext("Backend Error"), + message: `${status}: ${data.message || data}` + }); + }) + .finally(() => { + this.triggerActive = true; + }); + }, + save() { + if (!this.import_) return; + let cron = this.cronString; + if (this.easyCron) { + if (this.simple === "weekly") cron = "0 0 0 * * 0"; + if (this.simple === "monthly") cron = "0 0 0 1 * *"; + } + let data = {}; + let config = {}; + data["kind"] = IMPORTTYPEKIND[this.import_]; + + if (this.isURLRequired) { + if (!this.url) return; + config["url"] = this.url; + config["insecure"] = this.insecure; + } + if (this.isSortbyRequired) { + if (!this.sortBy) return; + config["sort-by"] = this.sortBy; + } + if (this.isFeatureTypeRequired) { + if (!this.featureType) return; + config["feature-type"] = this.featureType; + } + if (this.isToleranceRequired) { + if (!this.tolerance) return; + config["tolerance"] = parseFloat(this.tolerance); + } + if (this.isCredentialsRequired) { + if (!this.username || !this.password) return; + config = { + ...config, + user: this.username, + password: this.password + }; + } + if (this.import_ == this.$options.IMPORTTYPES.FAIRWAYDIMENSION) { + if ( + !this.LOS || + !this.minWidth || + !this.maxWidth || + !this.depth || + !this.sourceOrganization + ) + return; + config = { ...config, los: this.LOS, depth: this.depth }; + config["min-width"] = this.minWidth; + config["max-width"] = this.maxWidth; + config["source-organization"] = this.sourceOrganization; + } + if (this.scheduled) config["cron"] = cron; + config["send-email"] = this.eMailNotification; + if (!this.id) { + data["config"] = config; + this.$store + .dispatch("importschedule/saveCurrentSchedule", data) + .then(response => { + const { id } = response.data; + displayInfo({ + title: this.$gettext("Import"), + message: this.$gettext("Saved import: #") + id + }); + this.closeDetailview(); + this.$store + .dispatch("importschedule/loadSchedules") + .catch(error => { + const { status, data } = error.response; + displayError({ + title: this.gettext("Backend Error"), + message: `${status}: ${data.message || data}` + }); + }); + }) + .catch(error => { + const { status, data } = error.response; + displayError({ + title: this.$gettext("Backend Error"), + message: `${status}: ${data.message || data}` + }); + }); + } else { + this.$store + .dispatch("importschedule/updateCurrentSchedule", { + data: config, + id: this.id + }) + .then(response => { + const { id } = response.data; + displayInfo({ + title: this.$gettext("Import"), + message: this.$gettext("update import: #") + id + }); + this.closeDetailview(); + this.$store + .dispatch("importschedule/loadSchedules") + .catch(error => { + const { status, data } = error.response; + displayError({ + title: this.gettext("Backend Error"), + message: `${status}: ${data.message || data}` + }); + }); + }) + .catch(error => { + const { status, data } = error.response; + displayError({ + title: this.$gettext("Backend Error"), + message: `${status}: ${data.message || data}` + }); + }); + } + }, + closeDetailview() { + this.$store.commit("importschedule/clearCurrentSchedule"); + this.$store.commit("importschedule/setImportScheduleDetailInvisible"); + } + }, + IMPORTTYPES: IMPORTTYPES, + on: "on", + off: "off", + FILE: app.$gettext("File"), + URL: app.$gettext("URL"), + EVERY: app.$gettext("Every"), + MINUTESPAST: app.$gettext("minutes past"), + ON: app.$gettext("on"), + OF: app.$gettext("of"), + AT: app.$gettext("at"), + OCLOCK: app.$gettext("o' clock"), + CRONMODE: { + "15minutes": app.$gettext("15 minutes"), + hour: app.$gettext("hour"), + day: app.$gettext("day"), + week: app.$gettext("week"), + month: app.$gettext("month"), + year: app.$gettext("year") + }, + DAYSOFWEEK: { + 1: app.$gettext("Monday"), + 2: app.$gettext("Tuesday"), + 3: app.$gettext("Wednesday"), + 4: app.$gettext("Thursday"), + 5: app.$gettext("Friday"), + 6: app.$gettext("Saturday"), + 0: app.$gettext("Sunday") + }, + MONTHS: { + 1: app.$gettext("January"), + 2: app.$gettext("February"), + 3: app.$gettext("March"), + 4: app.$gettext("April"), + 5: app.$gettext("May"), + 6: app.$gettext("June"), + 7: app.$gettext("July"), + 8: app.$gettext("August"), + 9: app.$gettext("September"), + 10: app.$gettext("October"), + 11: app.$gettext("November"), + 12: app.$gettext("December") + } +}; +</script> + +<style lang="scss" scoped> +.cronfield { + width: 55px; +} + +.importscheduledetailscard { + min-height: 550px; +} + +.importscheduledetails { + width: 100%; + margin-top: $offset; + margin-right: $offset; +} +</style>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importconfiguration/types/Waterwayarea.vue Tue Apr 09 14:52:55 2019 +0200 @@ -0,0 +1,99 @@ +<template> + <div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-100"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>URL</translate> </small> + </div> + <div class="w-100"> + <input + @input="urlChanged" + class="url form-control" + type="url" + :value="url" + /> + </div> + </div> + </div> + <div v-if="!url" class="d-flex flex-row"> + <small + ><translate class="text-danger">Please enter a URL</translate></small + > + </div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>Featuretype</translate> </small> + </div> + <div class="w-100"> + <input + @input="featureTypeChanged" + class="featuretype form-control" + type="text" + :value="featureType" + /> + </div> + <div v-if="!featureType" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a Featuretype</translate + ></small + > + </div> + </div> + <div class="flex-column mt-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>SortBy</translate> </small> + </div> + <div class="w-100"> + <input + @input="sortByChanged" + class="sortby form-control" + type="text" + :value="sortBy" + /> + </div> + <div v-if="!sortBy" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter SortBy</translate + ></small + > + </div> + </div> + </div> + </div> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Thomas Junk <thomas.junk@intevation.de> + */ +export default { + name: "waterwayarea", + props: ["url", "featureType", "sortBy"], + methods: { + urlChanged(e) { + this.$emit("urlChanged", e.target.value); + }, + featureTypeChanged(e) { + this.$emit("featureTypeChanged", e.target.value); + }, + sortByChanged(e) { + this.$emit("sortByChanged", e.target.value); + } + } +}; +</script> + +<style></style>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importconfiguration/types/Waterwayaxis.vue Tue Apr 09 14:52:55 2019 +0200 @@ -0,0 +1,99 @@ +<template> + <div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-100"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>URL</translate> </small> + </div> + <div class="w-100"> + <input + @input="urlChanged" + class="url form-control" + type="url" + :value="url" + /> + </div> + </div> + </div> + <div v-if="!url" class="d-flex flex-row"> + <small + ><translate class="text-danger">Please enter a URL</translate></small + > + </div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>Featuretype</translate> </small> + </div> + <div class="w-100"> + <input + @input="featureTypeChanged" + class="featuretype form-control" + type="text" + :value="featureType" + /> + </div> + <div v-if="!featureType" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a Featuretype</translate + ></small + > + </div> + </div> + <div class="flex-column mt-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>SortBy</translate> </small> + </div> + <div class="w-100"> + <input + @input="sortByChanged" + class="sortby form-control" + type="text" + :value="sortBy" + /> + </div> + <div v-if="!sortBy" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter SortBy</translate + ></small + > + </div> + </div> + </div> + </div> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Thomas Junk <thomas.junk@intevation.de> + */ +export default { + name: "waterwayaxis", + props: ["url", "featureType", "sortBy"], + methods: { + urlChanged(e) { + this.$emit("urlChanged", e.target.value); + }, + featureTypeChanged(e) { + this.$emit("featureTypeChanged", e.target.value); + }, + sortByChanged(e) { + this.$emit("sortByChanged", e.target.value); + } + } +}; +</script> + +<style></style>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importconfiguration/types/Waterwaygauges.vue Tue Apr 09 14:52:55 2019 +0200 @@ -0,0 +1,116 @@ +<template> + <div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-100"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>URL</translate> </small> + </div> + <div class="w-100"> + <input + @input="urlChanged" + class="url form-control" + type="url" + :value="url" + /> + </div> + </div> + </div> + <div v-if="!url" class="d-flex flex-row"> + <small + ><translate class="text-danger">Please enter a URL</translate></small + > + </div> + <div class="d-flex flex-row"> + <div class="flex-column mt-3 mr-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>Username</translate> </small> + </div> + <div class="w-100"> + <input + @input="usernameChanged" + class="username form-control" + type="text" + :value="username" + /> + </div> + <div v-if="!username" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a Username</translate + ></small + > + </div> + </div> + <div class="flex-column mt-3 w-50"> + <div class="flex-row text-left"> + <small class="text-muted"> <translate>Password</translate> </small> + </div> + <div class="w-100 d-flex flex-row"> + <input + @input="passwordChanged" + class="password form-control" + :type="showPassword" + :value="password" + /> + <span + class="input-group-text ml-2" + @click="passwordVisible = !passwordVisible" + > + <font-awesome-icon :icon="passwordVisible ? 'eye-slash' : 'eye'" /> + </span> + </div> + <div v-if="!password" class="d-flex flex-row"> + <small + ><translate class="text-danger" + >Please enter a Password</translate + ></small + > + </div> + </div> + </div> + </div> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Thomas Junk <thomas.junk@intevation.de> + */ +export default { + name: "waterwaygauges", + props: ["username", "password", "url"], + data() { + return { + passwordVisible: false + }; + }, + computed: { + showPassword() { + if (this.passwordVisible) return "text"; + return "password"; + } + }, + methods: { + urlChanged(e) { + this.$emit("urlChanged", e.target.value); + }, + usernameChanged(e) { + this.$emit("usernameChanged", e.target.value); + }, + passwordChanged(e) { + this.$emit("passwordChanged", e.target.value); + } + } +}; +</script> + +<style></style>
--- a/client/src/components/importschedule/Importschedule.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,273 +0,0 @@ -<template> - <div class="d-flex flex-row"> - <Spacer /> - <div class="mt-2 w-100"> - <div class="card flex-grow-1 schedulecard shadow-xs"> - <UIBoxHeader icon="clock" :title="importScheduleLabel" /> - <div class="searchandfilter p-3 w-50 mx-auto"> - <div class="searchgroup input-group"> - <div class="input-group-prepend"> - <span class="input-group-text" id="search"> - <font-awesome-icon icon="search" /> - </span> - </div> - <input - v-model="searchQuery" - type="text" - class="form-control" - placeholder - aria-label="Search" - aria-describedby="search" - /> - </div> - </div> - <UITableHeader - :columns="[ - { id: 'id', title: `${idLabel}`, class: 'col-1' }, - { id: 'kind', title: `${typeLabel}`, class: 'col-2' }, - { id: 'user', title: `${authorLabel}`, class: 'col-2' }, - { id: 'config.cron', title: `${scheduleLabel}`, class: 'col-2' }, - { id: 'config.send-email', title: `${emailLabel}`, class: 'col-2' } - ]" - /> - <UITableBody - :data="filteredSchedules() | sortTable(sortColumn, sortDirection)" - :isActive="item => currentSchedule && item.id === currentSchedule.id" - > - <template v-slot:row="{ item: schedule }"> - <div class="table-cell col-1">{{ schedule.id }}</div> - <div class="table-cell col-2"> - {{ schedule.kind.toUpperCase() }} - </div> - <div class="table-cell col-2">{{ schedule.user }}</div> - <div class="table-cell col-2">{{ schedule.config.cron }}</div> - <div class="table-cell col-2 text-center"> - <font-awesome-icon - v-if="schedule.config['send-email']" - class="fa-fw mr-2" - fixed-width - icon="check" - /> - </div> - <div class="table-cell col justify-content-end"> - <button - @click="editSchedule(schedule.id)" - class="btn btn-xs btn-dark mr-1" - :disabled="importScheduleDetailVisible" - > - <font-awesome-icon icon="pencil-alt" fixed-width /> - </button> - <button - @click="deleteSchedule(schedule)" - class="btn btn-xs btn-dark mr-1" - :disabled="importScheduleDetailVisible" - > - <font-awesome-icon icon="trash" fixed-width /> - </button> - <button - @click="triggerManualImport(schedule.id)" - class="btn btn-xs btn-dark" - :disabled="importScheduleDetailVisible" - > - <font-awesome-icon icon="play" fixed-width /> - </button> - </div> - </template> - </UITableBody> - <div class="p-3 text-right"> - <button - :disabled="importScheduleDetailVisible" - @click="newImport" - class="btn btn-info newbutton" - > - <translate>New Import</translate> - </button> - </div> - </div> - </div> - <Importscheduledetail /> - </div> -</template> - -<style lang="sass" scoped> -th - border-top: 0px - -.card-body - padding-bottom: $small-offset - -.schedulecard - margin-right: $small-offset - min-height: 20rem - -.schedulecard-body - width: 100% - margin-left: auto - margin-right: auto -</style> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - * Markus Kottländer <markus.kottlaender@intevation.de> - */ - -import { mapState } from "vuex"; -import { HTTP } from "@/lib/http"; -import { displayInfo, displayError } from "@/lib/errors"; -import { sortTable } from "@/lib/mixins"; - -export default { - name: "importschedule", - mixins: [sortTable], - components: { - Importscheduledetail: () => import("./Importscheduledetail"), - Spacer: () => import("@/components/Spacer") - }, - data() { - return { - searchQuery: "" - }; - }, - computed: { - ...mapState("application", ["showSidebar"]), - ...mapState("importschedule", [ - "schedules", - "currentSchedule", - "importScheduleDetailVisible" - ]), - importScheduleLabel() { - return this.$gettext("Import Schedule"); - }, - idLabel() { - return this.$gettext("ID"); - }, - typeLabel() { - return this.$gettext("Type"); - }, - authorLabel() { - return this.$gettext("Author"); - }, - scheduleLabel() { - return this.$gettext("Schedule"); - }, - emailLabel() { - return this.$gettext("Email"); - }, - spacerStyle() { - return [ - "spacer ml-3", - { - "spacer-expanded": this.showSidebar, - "spacer-collapsed": !this.showSidebar - } - ]; - } - }, - methods: { - filteredSchedules() { - return this.schedules.filter(s => { - return (s.id + s.kind) - .toLowerCase() - .includes(this.searchQuery.toLowerCase()); - }); - }, - editSchedule(id) { - this.$store - .dispatch("importschedule/loadSchedule", id) - .then(() => { - this.$store.commit("importschedule/setImportScheduleDetailVisible"); - }) - .catch(error => { - const { status, data } = error.response; - displayError({ - title: this.$gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }); - }, - triggerManualImport(id) { - HTTP.get("/imports/config/" + id + "/run", { - headers: { "X-Gemma-Auth": localStorage.getItem("token") } - }) - .then(response => { - const { id } = response.data; - displayInfo({ - title: this.$gettext("Imports"), - message: this.$gettext("Manually triggered import: #") + id - }); - }) - .catch(error => { - const { status, data } = error.response; - displayError({ - title: this.$gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }); - }, - getSchedules() { - this.$store.dispatch("importschedule/loadSchedules").catch(error => { - const { status, data } = error.response; - displayError({ - title: this.$gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }); - }, - newImport() { - this.$store.commit("importschedule/setImportScheduleDetailVisible"); - }, - deleteSchedule(schedule) { - console.log(schedule); - this.$store.commit("application/popup", { - icon: "trash", - title: this.$gettext("Delete Import"), - content: - this.$gettext("Do you really want to delete the import with ID") + - `<b>${schedule.id}</b>` + - this.$gettext("of type") + - `<b>${schedule.kind.toUpperCase()}</b>?`, - confirm: { - label: this.$gettext("Delete"), - icon: "trash", - callback: () => { - this.$store - .dispatch("importschedule/deleteSchedule", schedule.id) - .then(() => { - this.getSchedules(); - displayInfo({ - title: this.$gettext("Imports"), - message: this.$gettext("Deleted import: #") + schedule.id - }); - }) - .catch(error => { - const { status, data } = error.response; - displayError({ - title: this.$gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }); - } - }, - cancel: { - label: this.$gettext("Cancel"), - icon: "times" - } - }); - } - }, - mounted() { - this.getSchedules(); - } -}; -</script>
--- a/client/src/components/importschedule/Importscheduledetail.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1027 +0,0 @@ -<template> - <div - class="importscheduledetails fadeIn animated" - v-if="importScheduleDetailVisible" - > - <div class="card shadow-xs importscheduledetailscard pb-5"> - <UIBoxHeader :title="dialogLabel" :closeCallback="closeDetailview" /> - <div class="card-body"> - <form @submit.prevent="save" class="ml-2 mr-2"> - <div class="d-flex flex-row"> - <div class="flex-column w-50 mr-3"> - <div class="flex-row text-left"> - <small class="text-muted"> - <translate>Imports</translate> - </small> - </div> - <select v-model="import_" class="custom-select" id="importtype"> - <option :value="$options.IMPORTTYPES.BOTTLENECK"> - <translate>Bottlenecks</translate> - </option> - <option :value="$options.IMPORTTYPES.WATERWAYAXIS"> - <translate>Waterway axis</translate> - </option> - <option :value="$options.IMPORTTYPES.GAUGEMEASUREMENT"> - <translate>Gauge measurement</translate> - </option> - <option :value="$options.IMPORTTYPES.FAIRWAYAVAILABILITY"> - <translate>Available fairway depths</translate> - </option> - <option :value="$options.IMPORTTYPES.WATERWAYAREA"> - <translate>Waterway area</translate> - </option> - <option :value="$options.IMPORTTYPES.FAIRWAYDIMENSION"> - <translate>Fairway dimension</translate> - </option> - <option :value="$options.IMPORTTYPES.WATERWAYGAUGES"> - <translate>Waterway gauges</translate> - </option> - <option :value="$options.IMPORTTYPES.DISTANCEMARKSVIRTUAL"> - <translate>Distance marks virtual</translate> - </option> - <option :value="$options.IMPORTTYPES.DISTANCEMARKSASHORE"> - <translate>Distance marks ashore</translate> - </option> - </select> - </div> - <div class="flex-column ml-4"> - <div class="flex-row text-left"> - <small class="text-muted"> - <translate>Email Notification</translate> - </small> - </div> - <div class="flex-flex-row text-left"> - <toggle-button - v-model="eMailNotification" - class="mt-2" - :speed="100" - :labels="{ - checked: this.$options.on, - unchecked: this.$options.off - }" - :width="60" - :height="30" - /> - </div> - </div> - </div> - <div v-if="directImportAvailable" class="flex-column"> - <div class="flex-row text-left"> - <small class="text-muted"> - <translate>Import via</translate> - </small> - </div> - <div class="flex-flex-row text-left"> - <!-- '#75c791' is the DEFAULT_COLOR_CHECKED - from vue-js-toggle-button as here both states are active --> - <toggle-button - :color="{ unchecked: '#75c791' }" - v-model="directImport" - class="mt-2" - :speed="100" - :labels="{ - checked: this.$options.FILE, - unchecked: this.$options.URL - }" - :width="60" - :height="30" - /> - </div> - </div> - <Availablefairwaydepth - v-if=" - import_ == $options.IMPORTTYPES.FAIRWAYAVAILABILITY && - !directImport - " - @urlChanged="setUrl" - :url="url" - /> - <Bottleneck - v-if="import_ == $options.IMPORTTYPES.BOTTLENECK" - @urlChanged="setUrl" - @toleranceChanged="setTolerance" - :url="url" - :tolerance="tolerance" - :directImport="directImport" - /> - <Distancemarksvirtual - v-if="import_ == $options.IMPORTTYPES.DISTANCEMARKSVIRTUAL" - @urlChanged="setUrl" - @usernameChanged="setUsername" - @passwordChanged="setPassword" - :url="url" - :username="username" - :password="password" - /> - <Distancemarksashore - v-if="import_ == $options.IMPORTTYPES.DISTANCEMARKSASHORE" - @urlChanged="setUrl" - @featureTypeChanged="setFeatureType" - @sortByChanged="setSortBy" - :url="url" - :featureType="featureType" - :sortBy="sortBy" - /> - <Faiwaydimensions - v-if="import_ == $options.IMPORTTYPES.FAIRWAYDIMENSION" - @urlChanged="setUrl" - @featureTypeChanged="setFeatureType" - @sortByChanged="setSortBy" - @LOSChanged="setLOS" - @depthChanged="setDepth" - @minWidthChanged="setMinWidth" - @maxWidthChanged="setMaxWidth" - @sourceOrganizationChanged="setSourceOrganization" - :url="url" - :featureType="featureType" - :sortBy="sortBy" - :LOS="LOS" - :minWidth="minWidth" - :maxWidth="maxWidth" - :sourceOrganization="sourceOrganization" - :depth="depth" - /> - <Gaugemeasurement - v-if=" - import_ == $options.IMPORTTYPES.GAUGEMEASUREMENT && !directImport - " - @urlChanged="setUrl" - :url="url" - /> - <Waterwayarea - v-if="import_ == $options.IMPORTTYPES.WATERWAYAREA" - @urlChanged="setUrl" - @featureTypeChanged="setFeatureType" - @sortByChanged="setSortBy" - :url="url" - :featureType="featureType" - :sortBy="sortBy" - /> - <Waterwaygauges - v-if="import_ == $options.IMPORTTYPES.WATERWAYGAUGES" - @urlChanged="setUrl" - @usernameChanged="setUsername" - @passwordChanged="setPassword" - :url="url" - :username="username" - :password="password" - /> - <Waterwayaxis - v-if="import_ == $options.IMPORTTYPES.WATERWAYAXIS" - @urlChanged="setUrl" - @featureTypeChanged="setFeatureType" - @sortByChanged="setSortBy" - :url="url" - :featureType="featureType" - :sortBy="sortBy" - /> - - <template v-if="!directImport || !directImportAvailable"> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-4"> - <div class="flex-row text-left"> - <small class="text-muted"> - <translate>Scheduled</translate>? - </small> - </div> - <div class="flex-flex-row text-left"> - <toggle-button - v-model="scheduled" - class="mt-2" - :speed="100" - :labels="{ - checked: this.$options.on, - unchecked: this.$options.off - }" - :width="60" - :height="30" - /> - </div> - </div> - <div class="flex-column mt-3 mr-2"> - <div class="flex-row text-left"> - <small class="text-muted"> - <translate>Simple schedule</translate> - </small> - </div> - <div class="flex-flex-row text-left"> - <toggle-button - :disabled="!scheduled" - v-model="easyCron" - class="mt-2" - :speed="100" - :labels="{ - checked: this.$options.on, - unchecked: this.$options.off - }" - :width="60" - :height="30" - /> - </div> - </div> - </div> - <div class="flex-column w-100 mr-2"> - <div class="flex-row text-left"> - <small class="text-muted"> - <translate>Schedule</translate> - </small> - </div> - <div v-if="easyCron" class="text-left w-50"> - <select - :disabled="!scheduled" - v-model="simple" - class="form-control" - ><option value="weekly"><translate>Weekly</translate></option> - <option value="monthly" - ><translate>Monthly</translate> - </option> - </select> - </div> - <div v-if="!easyCron" class="text-left w-100"> - <div class="d-flex flex-row"> - <h4 class="mt-auto mb-auto mr-2">{{ $options.EVERY }}</h4> - <select - :disabled="!scheduled" - style="width: 130px;" - v-model="cronMode" - class="form-control" - @change="clearInputs" - > - <option :value="null"></option> - <option - v-for="(option, key) in $options.CRONMODE" - :value="key" - :key="key" - >{{ option }}</option - > - </select> - <div v-if="cronMode == 'hour'" class="ml-1 d-flex flex-row"> - <h4 class="mt-auto mb-auto">{{ $options.ON }}</h4> - <input - :disabled="!scheduled" - v-model="minutes" - class="cronfield ml-1 mr-1 form-control" - type="number" - /> - <h4 class="mt-auto mb-auto">{{ $options.MINUTESPAST }}</h4> - </div> - <div v-if="cronMode == 'day'" class="ml-1 d-flex flex-row"> - <h4 class="mt-auto mb-auto">{{ $options.AT }}</h4> - <input - :disabled="!scheduled" - v-model="hour" - class="cronfield ml-1 mr-1 form-control" - type="number" - /> - <input - :disabled="!scheduled" - v-model="minutes" - class="cronfield ml-1 mr-1 form-control" - type="number" - /> - <h4 class="mt-auto mb-auto">{{ $options.OCLOCK }}</h4> - </div> - <div v-if="cronMode == 'week'" class="ml-1 d-flex flex-row"> - <h4 class="ml-1 mr-1 mt-auto mb-auto">{{ $options.ON }}</h4> - <select - :disabled="!scheduled" - v-model="day" - class="form-control" - > - <option - v-for="(option, key) in $options.DAYSOFWEEK" - :key="key" - :value="key" - >{{ option }}</option - > - </select> - <h4 class="ml-1 mt-auto mb-auto">{{ $options.AT }}</h4> - <input - :disabled="!scheduled" - v-model="hour" - class="cronfield ml-1 mr-1 form-control" - type="number" - /> - <input - :disabled="!scheduled" - v-model="minutes" - class="cronfield ml-1 mr-1 form-control" - type="number" - /> - </div> - <div v-if="cronMode == 'month'" class="ml-1 d-flex flex-row"> - <h4 class="ml-1 mt-auto mb-auto">{{ $options.ON }}</h4> - <input - :disabled="!scheduled" - v-model="dayOfMonth" - class="cronfield ml-1 mr-1 form-control" - type="number" - /> - <h4 class="mt-auto mb-auto">{{ $options.AT }}</h4> - <input - :disabled="!scheduled" - v-model="hour" - class="cronfield ml-1 mr-2 form-control" - type="number" - /> - <input - :disabled="!scheduled" - v-model="minutes" - class="cronfield ml-1 mr-2 form-control" - type="number" - /> - <h4 class="mt-auto mb-auto">{{ $options.OCLOCK }}</h4> - </div> - <div v-if="cronMode == 'year'" class="ml-1 d-flex flex-row"> - <h4 class="ml-1 mt-auto mb-auto">{{ $options.ON }}</h4> - <input - :disabled="!scheduled" - v-model="dayOfMonth" - class="cronfield ml-1 mr-1 form-control" - type="number" - /> - <h4 class="mt-auto mb-auto">{{ $options.OF }}</h4> - <select - :disabled="!scheduled" - v-model="month" - class="ml-1 mr-1 form-control" - > - <option - v-for="(option, key) in $options.MONTHS" - :value="key" - :key="key" - >{{ option }}</option - > - </select> - <h4 class="mt-auto mb-auto">{{ $options.ON }}</h4> - <input - :disabled="!scheduled" - v-model="hour" - class="cronfield ml-1 mr-1 form-control" - type="number" - /> - <input - :disabled="!scheduled" - v-model="minutes" - class="cronfield ml-1 mr-1 form-control" - type="number" - /> - </div> - </div> - <div class="mt-3 w-50 d-flex flex-row"> - <h5 class="mt-auto mb-auto mr-2"> - <translate>Cronstring</translate> - </h5> - <input - :disabled="!scheduled" - class="form-control" - v-model="cronString" - type="text" - /> - </div> - </div> - </div> - <button - :disabled="!isValid" - type="submit" - class="shadow-sm btn btn-info submit-button" - > - <translate>Save</translate> - </button> - </template> - <div v-else class="d-flex flex-row text-left"> - <div class="mt-3 mb-3 flex-column w-100"> - <div class="custom-file"> - <input - accept=".xml" - type="file" - @change="fileSelected" - class="custom-file-input" - id="uploadFile" - /> - <label class="pointer custom-file-label" for="uploadFile"> - {{ uploadLabel }} - </label> - </div> - </div> - </div> - <button - @click="triggerManualImport" - type="button" - class="shadow-sm btn btn-outline-info trigger" - :disabled="!triggerActive || !isValid" - > - <font-awesome-icon class="fa-fw mr-2" fixed-width icon="play" /> - <translate>Trigger import</translate> - </button> - </form> - </div> - </div> - </div> -</template> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018, 2019 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - * Tom Gottfried <tom.gottfried@intevation.de> - */ -import { - IMPORTTYPES, - IMPORTTYPEKIND, - initializeCurrentSchedule -} from "@/store/importschedule"; -import { mapState } from "vuex"; -import { displayInfo, displayError } from "@/lib/errors.js"; -import app from "@/main.js"; -import { HTTP } from "@/lib/http"; - -export default { - name: "importscheduledetail", - components: { - Availablefairwaydepth: () => - import("@/components/importschedule/importtypes/Availablefairwaydepth"), - Bottleneck: () => - import("@/components/importschedule/importtypes/Bottleneck"), - Distancemarksvirtual: () => - import("@/components/importschedule/importtypes/Distancemarksvirtual"), - Distancemarksashore: () => - import("@/components/importschedule/importtypes/Distancemarksashore"), - Faiwaydimensions: () => - import("@/components/importschedule/importtypes/Fairwaydimensions"), - Gaugemeasurement: () => - import("@/components/importschedule/importtypes/Gaugemeasurement"), - Waterwayarea: () => - import("@/components/importschedule/importtypes/Waterwayarea"), - Waterwaygauges: () => - import("@/components/importschedule/importtypes/Waterwaygauges"), - Waterwayaxis: () => - import("@/components/importschedule/importtypes/Waterwayaxis") - }, - data() { - return { - directImport: false, - passwordVisible: false, - uploadLabel: this.$gettext("choose file to upload"), - uploadFile: null, - ...initializeCurrentSchedule() - }; - }, - mounted() { - this.initialize(); - }, - watch: { - cronMode() { - this.cronString = this.calcCronString(); - }, - minutes() { - this.cronString = this.calcCronString(); - }, - hour() { - this.cronString = this.calcCronString(); - }, - month() { - this.cronString = this.calcCronString(); - }, - day() { - this.cronString = this.calcCronString(); - }, - dayOfMonth() { - this.cronString = this.calcCronString(); - }, - importScheduleDetailVisible() { - this.initialize(); - }, - cronString() { - if (this.isWeekly(this.cronString)) { - this.simple = "weekly"; - } - if (this.isMonthly(this.cronString)) { - this.simple = "monthly"; - } - } - }, - computed: { - ...mapState("importschedule", [ - "importScheduleDetailVisible", - "currentSchedule" - ]), - dialogLabel() { - if (this.id) return this.$gettext("Import") + " " + this.id; - return this.$gettext("New Import"); - }, - directImportAvailable() { - switch (this.import_) { - case this.$options.IMPORTTYPES.BOTTLENECK: - case this.$options.IMPORTTYPES.FAIRWAYAVAILABILITY: - case this.$options.IMPORTTYPES.GAUGEMEASUREMENT: - return true; - default: - return false; - } - }, - isCredentialsRequired() { - switch (this.import_) { - case this.$options.IMPORTTYPES.WATERWAYGAUGES: - case this.$options.IMPORTTYPES.DISTANCEMARKSVIRTUAL: - return true; - default: - return false; - } - }, - isURLRequired() { - switch (this.import_) { - case this.$options.IMPORTTYPES.BOTTLENECK: - case this.$options.IMPORTTYPES.WATERWAYAXIS: - case this.$options.IMPORTTYPES.GAUGEMEASUREMENT: - case this.$options.IMPORTTYPES.FAIRWAYAVAILABILITY: - case this.$options.IMPORTTYPES.WATERWAYAREA: - case this.$options.IMPORTTYPES.FAIRWAYDIMENSION: - case this.$options.IMPORTTYPES.WATERWAYGAUGES: - case this.$options.IMPORTTYPES.DISTANCEMARKSVIRTUAL: - case this.$options.IMPORTTYPES.DISTANCEMARKSASHORE: - return true; - default: - return false; - } - }, - isFeatureTypeRequired() { - switch (this.import_) { - case this.$options.IMPORTTYPES.WATERWAYAXIS: - case this.$options.IMPORTTYPES.WATERWAYAREA: - case this.$options.IMPORTTYPES.FAIRWAYDIMENSION: - case this.$options.IMPORTTYPES.DISTANCEMARKSASHORE: - return true; - default: - return false; - } - }, - isSortbyRequired() { - switch (this.import_) { - case this.$options.IMPORTTYPES.WATERWAYAXIS: - case this.$options.IMPORTTYPES.WATERWAYAREA: - case this.$options.IMPORTTYPES.FAIRWAYDIMENSION: - case this.$options.IMPORTTYPES.DISTANCEMARKSASHORE: - return true; - default: - return false; - } - }, - isToleranceRequired() { - switch (this.import_) { - case this.$options.IMPORTTYPES.BOTTLENECK: - return true; - default: - return false; - } - }, - isValid() { - if (!this.import_) return false; - if (this.isToleranceRequired && !this.tolerance) return false; - if (this.directImport && !this.uploadFile) return false; - else if (!this.directImport) { - if (this.isURLRequired && !this.url) return false; - if (this.isSortbyRequired && !this.sortBy) return false; - if (this.isFeatureTypeRequired && !this.featureType) return false; - if (this.isCredentialsRequired && (!this.username || !this.password)) - return false; - if (this.import_ == this.$options.IMPORTTYPES.FAIRWAYDIMENSION) { - if ( - !this.LOS || - !this.minWidth || - !this.maxWidth || - !this.depth || - !this.sourceOrganization - ) - return false; - } - } - return true; - } - }, - methods: { - fileSelected(e) { - const files = e.target.files || e.dataTransfer.files; - if (!files) return; - this.uploadLabel = files[0].name; - this.uploadFile = files[0]; - }, - setUrl(value) { - this.url = value; - }, - setFeatureType(value) { - this.featureType = value; - }, - setSortBy(value) { - this.sortBy = value; - }, - setTolerance(value) { - this.tolerance = value; - }, - setUsername(value) { - this.username = value; - }, - setPassword(value) { - this.password = value; - }, - setLOS(value) { - this.LOS = value; - }, - setMinWidth(value) { - this.minWidth = value; - }, - setMaxWidth(value) { - this.maxWidth = value; - }, - setDepth(value) { - this.depth = value; - }, - setSourceOrganization(value) { - this.sourceOrganization = value; - }, - calcCronString() { - let getValue = value => { - return this[value] !== null ? this[value] : "*"; - }; - - const min = getValue("minutes"); - const h = getValue("hour"); - const dm = getValue("dayOfMonth"); - const m = getValue("month"); - const wd = getValue("day"); - - if (this.cronMode === "15minutes") return "0 */15 * * * *"; - if (this.cronMode === "hour") return `0 ${min} * * * *`; - if (this.cronMode === "day") return `0 ${min} ${h} * * *`; - if (this.cronMode === "week") return `0 ${min} ${h} * * ${wd}`; - if (this.cronMode === "month") return `0 ${min} ${h} ${dm} * *`; - if (this.cronMode === "year") return `0 ${min} ${h} ${dm} ${m} *`; - return this.cronString; - }, - validateBottleneckfields() { - return !!this.url; - }, - initialize() { - this.id = this.currentSchedule.id; - this.importType = this.currentSchedule.importType; - this.schedule = this.currentSchedule.schedule; - this.scheduled = this.currentSchedule.scheduled; - this.import_ = this.currentSchedule.import_; - this.importSource = this.currentSchedule.importSource; - this.eMailNotification = this.currentSchedule.eMailNotification; - this.easyCron = this.currentSchedule.easyCron; - this.cronMode = this.currentSchedule.cronMode; - this.minutes = this.currentSchedule.minutes; - this.month = this.currentSchedule.month; - this.hour = this.currentSchedule.hour; - this.day = this.currentSchedule.day; - this.dayOfMonth = this.currentSchedule.dayOfMonth; - this.simple = this.currentSchedule.simple; - this.url = this.currentSchedule.url; - this.insecure = this.currentSchedule.insecure; - this.cronString = this.currentSchedule.cronString; - this.featureType = this.currentSchedule.featureType; - this.sortBy = this.currentSchedule.sortBy; - this.tolerance = this.currentSchedule.tolerance; - this.username = this.currentSchedule.username; - this.password = this.currentSchedule.password; - this.LOS = this.currentSchedule.LOS; - this.minWidth = this.currentSchedule.minWidth; - this.maxWidth = this.currentSchedule.maxWidth; - this.depth = this.currentSchedule.depth; - this.sourceOrganization = this.currentSchedule.sourceOrganization; - this.directImport = false; - }, - isWeekly(cron) { - return /0 \d{1,2} \d{1,2} \* \* \d{1}/.test(cron); - }, - isMonthly(cron) { - return /0 \d{1,2} \d{1,2} \d{1,2} \* \*/.test(cron); - }, - clearInputs() { - this.minutes = this.currentSchedule.minutes; - this.month = this.currentSchedule.month; - this.hour = this.currentSchedule.hour; - this.day = this.currentSchedule.day; - this.dayOfMonth = this.currentSchedule.dayOfMonth; - }, - triggerFileUpload() { - if (!this.uploadFile) return; - let formData = new FormData(); - let routeParam = ""; - switch (this.import_) { - case this.$options.IMPORTTYPES.BOTTLENECK: - formData.append("tolerance", this.tolerance); - routeParam = "ubn"; - break; - case this.$options.IMPORTTYPES.FAIRWAYAVAILABILITY: - routeParam = "ufa"; - break; - case this.$options.IMPORTTYPES.GAUGEMEASUREMENT: - routeParam = "ugm"; - break; - default: - throw new Error("invalid importroute"); - } - - formData.append(routeParam, this.uploadFile); - HTTP.post("/imports/" + routeParam, formData, { - headers: { - "X-Gemma-Auth": localStorage.getItem("token"), - "Content-Type": "multipart/form-data" - } - }) - .then(response => { - const { id } = response.data; - displayInfo({ - title: this.$gettext("File Import"), - message: this.$gettext("Import import: #") + id - }); - this.closeDetailview(); - this.$store.dispatch("importschedule/loadSchedules").catch(error => { - const { status, data } = error.response; - displayError({ - title: this.gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }); - }) - .catch(error => { - const { status, data } = error.response; - displayError({ - title: this.$gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }); - }, - triggerManualImport() { - if (!this.triggerActive) return; - if (!this.import_) return; - if (this.directImport) { - if (!this.uploadFile) return; - this.triggerFileUpload(); - return; - } - let data = {}; - if (this.isURLRequired) { - if (!this.url) return; - data["url"] = this.url; - data["insecure"] = this.insecure; - } - if (this.isFeatureTypeRequired) { - if (!this.featureType) return; - data["feature-type"] = this.featureType; - } - if (this.isSortbyRequired) { - if (!this.sortBy) return; - data["sort-by"] = this.sortBy; - } - if (this.isToleranceRequired) { - if (!this.tolerance) return; - data["tolerance"] = parseFloat(this.tolerance); - } - if (this.isCredentialsRequired) { - if (!this.username || !this.password) return; - data["user"] = this.username; - data["password"] = this.password; - } - if (this.import_ == this.$options.IMPORTTYPES.FAIRWAYDIMENSION) { - if ( - !this.LOS || - !this.minWidth || - !this.maxWidth || - !this.depth || - !this.sourceOrganization - ) - return; - data["feature-type"] = this.featureType; - data["sort-by"] = this.sortBy; - data["los"] = this.LOS * 1; - data["min-width"] = this.minWidth * 1; - data["max-width"] = this.maxWidth * 1; - data["depth"] = this.depth * 1; - data["source-organization"] = this.sourceOrganization; - } - data["send-email"] = this.eMailNotification; - this.triggerActive = false; - this.$store - .dispatch("importschedule/triggerImport", { - type: IMPORTTYPEKIND[this.import_], - data - }) - .then(response => { - const { id } = response.data; - displayInfo({ - title: this.$gettext("Import"), - message: this.$gettext("Manually triggered import: #") + id - }); - }) - .catch(error => { - const { status, data } = error.response; - displayError({ - title: this.$gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }) - .finally(() => { - this.triggerActive = true; - }); - }, - save() { - if (!this.import_) return; - let cron = this.cronString; - if (this.easyCron) { - if (this.simple === "weekly") cron = "0 0 0 * * 0"; - if (this.simple === "monthly") cron = "0 0 0 1 * *"; - } - let data = {}; - let config = {}; - data["kind"] = IMPORTTYPEKIND[this.import_]; - - if (this.isURLRequired) { - if (!this.url) return; - config["url"] = this.url; - config["insecure"] = this.insecure; - } - if (this.isSortbyRequired) { - if (!this.sortBy) return; - config["sort-by"] = this.sortBy; - } - if (this.isFeatureTypeRequired) { - if (!this.featureType) return; - config["feature-type"] = this.featureType; - } - if (this.isToleranceRequired) { - if (!this.tolerance) return; - config["tolerance"] = parseFloat(this.tolerance); - } - if (this.isCredentialsRequired) { - if (!this.username || !this.password) return; - config = { - ...config, - user: this.username, - password: this.password - }; - } - if (this.import_ == this.$options.IMPORTTYPES.FAIRWAYDIMENSION) { - if ( - !this.LOS || - !this.minWidth || - !this.maxWidth || - !this.depth || - !this.sourceOrganization - ) - return; - config = { ...config, los: this.LOS, depth: this.depth }; - config["min-width"] = this.minWidth; - config["max-width"] = this.maxWidth; - config["source-organization"] = this.sourceOrganization; - } - if (this.scheduled) config["cron"] = cron; - config["send-email"] = this.eMailNotification; - if (!this.id) { - data["config"] = config; - this.$store - .dispatch("importschedule/saveCurrentSchedule", data) - .then(response => { - const { id } = response.data; - displayInfo({ - title: this.$gettext("Import"), - message: this.$gettext("Saved import: #") + id - }); - this.closeDetailview(); - this.$store - .dispatch("importschedule/loadSchedules") - .catch(error => { - const { status, data } = error.response; - displayError({ - title: this.gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }); - }) - .catch(error => { - const { status, data } = error.response; - displayError({ - title: this.$gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }); - } else { - this.$store - .dispatch("importschedule/updateCurrentSchedule", { - data: config, - id: this.id - }) - .then(response => { - const { id } = response.data; - displayInfo({ - title: this.$gettext("Import"), - message: this.$gettext("update import: #") + id - }); - this.closeDetailview(); - this.$store - .dispatch("importschedule/loadSchedules") - .catch(error => { - const { status, data } = error.response; - displayError({ - title: this.gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }); - }) - .catch(error => { - const { status, data } = error.response; - displayError({ - title: this.$gettext("Backend Error"), - message: `${status}: ${data.message || data}` - }); - }); - } - }, - closeDetailview() { - this.$store.commit("importschedule/clearCurrentSchedule"); - this.$store.commit("importschedule/setImportScheduleDetailInvisible"); - } - }, - IMPORTTYPES: IMPORTTYPES, - on: "on", - off: "off", - FILE: app.$gettext("File"), - URL: app.$gettext("URL"), - EVERY: app.$gettext("Every"), - MINUTESPAST: app.$gettext("minutes past"), - ON: app.$gettext("on"), - OF: app.$gettext("of"), - AT: app.$gettext("at"), - OCLOCK: app.$gettext("o' clock"), - CRONMODE: { - "15minutes": app.$gettext("15 minutes"), - hour: app.$gettext("hour"), - day: app.$gettext("day"), - week: app.$gettext("week"), - month: app.$gettext("month"), - year: app.$gettext("year") - }, - DAYSOFWEEK: { - 1: app.$gettext("Monday"), - 2: app.$gettext("Tuesday"), - 3: app.$gettext("Wednesday"), - 4: app.$gettext("Thursday"), - 5: app.$gettext("Friday"), - 6: app.$gettext("Saturday"), - 0: app.$gettext("Sunday") - }, - MONTHS: { - 1: app.$gettext("January"), - 2: app.$gettext("February"), - 3: app.$gettext("March"), - 4: app.$gettext("April"), - 5: app.$gettext("May"), - 6: app.$gettext("June"), - 7: app.$gettext("July"), - 8: app.$gettext("August"), - 9: app.$gettext("September"), - 10: app.$gettext("October"), - 11: app.$gettext("November"), - 12: app.$gettext("December") - } -}; -</script> - -<style lang="scss" scoped> -.cronfield { - width: 55px; -} - -.importscheduledetailscard { - min-height: 550px; -} - -.importscheduledetails { - width: 100%; - margin-top: $offset; - margin-right: $offset; -} - -.trigger { - position: absolute; - left: $large-offset; - bottom: $offset; -} - -.submit-button { - position: absolute; - right: $large-offset; - bottom: $offset; -} -</style>
--- a/client/src/components/importschedule/importtypes/Availablefairwaydepth.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -<template> - <div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-100"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>URL</translate> </small> - </div> - <div class="w-100"> - <input - @input="urlChanged" - class="url form-control" - type="url" - :value="url" - /> - </div> - </div> - </div> - <div v-if="!url" class="d-flex flex-row"> - <small - ><translate class="text-danger">Please enter a URL</translate></small - > - </div> - </div> -</template> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - */ -export default { - name: "availablefairwaydepth", - props: ["url"], - methods: { - urlChanged(e) { - this.$emit("urlChanged", e.target.value); - } - } -}; -</script> - -<style></style>
--- a/client/src/components/importschedule/importtypes/Bottleneck.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -<template> - <div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-100"> - <template v-if="!directImport"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>URL</translate> </small> - </div> - <div class="w-100"> - <input - @input="urlChanged" - class="url form-control" - type="url" - :value="url" - /> - </div> - </template> - </div> - <div v-if="false" class="flex-column mt-3 text-left"> - <div class="d-flex flex-row"> - <small class="text-muted mr-2" - ><translate>Insecure</translate> - </small> - </div> - <div class="d-flex flex-row"> - <toggle-button - v-model="insecure" - class="mt-2" - :speed="100" - :color="{ - checked: '#FF0000', - unchecked: '#E9ECEF', - disabled: '#CCCCCC' - }" - :labels="{ - checked: this.$options.on, - unchecked: this.$options.off - }" - :width="60" - :height="30" - /> - </div> - </div> - </div> - <div v-if="!url" class="d-flex flex-row"> - <small - ><translate class="text-danger">Please enter a URL</translate></small - > - </div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> - <translate>Tolerance for snapping of waterway axis [m]</translate> - </small> - </div> - <div class="w-100"> - <input - @input="toleranceChanged" - class="tolerance form-control" - type="number" - min="0" - :value="tolerance" - /> - </div> - <div v-if="!tolerance" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a tolerance value</translate - ></small - > - </div> - </div> - </div> - </div> -</template> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018, 2019 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - * Tom Gottfried <tom.gottfried@intevation.de> - */ -export default { - name: "bottleneckimport", - props: ["url", "tolerance", "directImport"], - methods: { - urlChanged(e) { - this.$emit("urlChanged", e.target.value); - }, - toleranceChanged(e) { - this.$emit("toleranceChanged", e.target.value); - } - } -}; -</script> - -<style></style>
--- a/client/src/components/importschedule/importtypes/Distancemarksashore.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -<template> - <div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-100"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>URL</translate> </small> - </div> - <div class="w-100"> - <input - @input="urlChanged" - class="url form-control" - type="url" - :value="url" - /> - </div> - </div> - </div> - <div v-if="!url" class="d-flex flex-row"> - <small - ><translate class="text-danger">Please enter a URL</translate></small - > - </div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>Featuretype</translate> </small> - </div> - <div class="w-100"> - <input - @input="featureTypeChanged" - class="featuretype form-control" - type="text" - :value="featureType" - /> - </div> - <div v-if="!featureType" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a Featuretype</translate - ></small - > - </div> - </div> - <div class="flex-column mt-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>SortBy</translate> </small> - </div> - <div class="w-100"> - <input - @input="sortByChanged" - class="sortby form-control" - type="text" - :value="sortBy" - /> - </div> - <div v-if="!sortBy" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter SortBy</translate - ></small - > - </div> - </div> - </div> - </div> -</template> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - */ -export default { - name: "distancemarksashore", - props: ["url", "featureType", "sortBy"], - methods: { - urlChanged(e) { - this.$emit("urlChanged", e.target.value); - }, - featureTypeChanged(e) { - this.$emit("featureTypeChanged", e.target.value); - }, - sortByChanged(e) { - this.$emit("sortByChanged", e.target.value); - } - } -}; -</script> - -<style></style>
--- a/client/src/components/importschedule/importtypes/Distancemarksvirtual.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -<template> - <div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-100"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>URL</translate> </small> - </div> - <div class="w-100"> - <input - @input="urlChanged" - class="url form-control" - type="url" - :value="url" - /> - </div> - </div> - </div> - <div v-if="!url" class="d-flex flex-row"> - <small - ><translate class="text-danger">Please enter a URL</translate></small - > - </div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>Username</translate> </small> - </div> - <div class="w-100"> - <input - @input="usernameChanged" - class="username form-control" - type="text" - :value="username" - /> - </div> - <div v-if="!username" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a Username</translate - ></small - > - </div> - </div> - <div class="flex-column mt-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>Password</translate> </small> - </div> - <div class="w-100 d-flex flex-row"> - <input - @input="passwordChanged" - class="pasword form-control" - :type="showPassword" - :value="password" - /> - <span - class="input-group-text ml-2" - @click="passwordVisible = !passwordVisible" - > - <font-awesome-icon :icon="passwordVisible ? 'eye-slash' : 'eye'" /> - </span> - </div> - <div v-if="!password" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a Password</translate - ></small - > - </div> - </div> - </div> - </div> -</template> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - */ -export default { - name: "distancemarksvirtual", - props: ["url", "username", "password"], - data() { - return { - passwordVisible: false - }; - }, - computed: { - showPassword() { - if (this.passwordVisible) return "text"; - return "password"; - } - }, - methods: { - urlChanged(e) { - this.$emit("urlChanged", e.target.value); - }, - usernameChanged(e) { - this.$emit("usernameChanged", e.target.value); - }, - passwordChanged(e) { - this.$emit("passwordChanged", e.target.value); - } - } -}; -</script> - -<style></style>
--- a/client/src/components/importschedule/importtypes/Fairwaydimensions.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,243 +0,0 @@ -<template> - <div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-100"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>URL</translate> </small> - </div> - <div class="w-100"> - <input - @input="urlChanged" - class="url form-control" - type="url" - :value="url" - /> - </div> - </div> - </div> - <div v-if="!url" class="d-flex flex-row"> - <small - ><translate class="text-danger">Please enter a URL</translate></small - > - </div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>Featuretype</translate> </small> - </div> - <div class="w-100"> - <input - @input="featureTypeChanged" - class="featuretype form-control" - type="text" - :value="featureType" - /> - </div> - <div v-if="!featureType" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a Featuretype</translate - ></small - > - </div> - </div> - <div class="flex-column mt-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>SortBy</translate> </small> - </div> - <div class="w-100"> - <input - @input="sortByChanged" - class="sortby form-control" - type="text" - :value="sortBy" - /> - </div> - <div v-if="!sortBy" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter SortBy</translate - ></small - > - </div> - </div> - </div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>LOS</translate> </small> - </div> - <div class="w-100"> - <select v-model="los" class="form-control"> - <option>1</option> - <option>2</option> - <option>3</option> - </select> - </div> - <div v-if="!LOS" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a level of service</translate - ></small - > - </div> - </div> - <div class="flex-column mt-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>Depth</translate> </small> - </div> - <div class="d-flex flex-row"> - <input - @input="depthChanged" - class="depth form-control" - type="number" - :value="depth" - /> - <div class="ml-2 my-auto">cm</div> - </div> - <div v-if="!depth" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a depth</translate - ></small - > - </div> - </div> - </div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>MinWidth</translate> </small> - </div> - <div class="d-flex flex-row"> - <input - @input="minWidthChanged" - class="minwidth form-control" - type="number" - :value="minWidth" - /> - <div class="ml-2 my-auto"> m</div> - </div> - <div v-if="!minWidth" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a minimum width</translate - ></small - > - </div> - </div> - <div class="flex-column mt-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>MaxWidth</translate> </small> - </div> - <div class="d-flex flex-row"> - <input - @input="maxWidthChanged" - class="maxwidth form-control" - type="number" - :value="maxWidth" - /> - <div class="ml-2 my-auto"> m</div> - </div> - <div v-if="!maxWidth" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a maximum width</translate - ></small - > - </div> - </div> - </div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> - <translate>Source orgranization</translate> - </small> - </div> - <div class="w-100"> - <input - @input="sourceOrganizationChanged" - class="sourceorganization form-control" - type="text" - :value="sourceOrganization" - /> - </div> - <div v-if="!sourceOrganization" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a source orgranization</translate - ></small - > - </div> - </div> - </div> - </div> -</template> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - */ -export default { - name: "fairwaydimensions", - props: [ - "url", - "featureType", - "sortBy", - "depth", - "LOS", - "minWidth", - "maxWidth", - "sourceOrganization" - ], - methods: { - urlChanged(e) { - this.$emit("urlChanged", e.target.value); - }, - featureTypeChanged(e) { - this.$emit("featureTypeChanged", e.target.value); - }, - sortByChanged(e) { - this.$emit("sortByChanged", e.target.value); - }, - depthChanged(e) { - this.$emit("depthChanged", e.target.value * 1); - }, - LOSChanged(e) { - this.$emit("LOSChanged", e.target.value * 1); - }, - minWidthChanged(e) { - this.$emit("minWidthChanged", e.target.value * 1); - }, - maxWidthChanged(e) { - this.$emit("maxWidthChanged", e.target.value * 1); - }, - sourceOrganizationChanged(e) { - this.$emit("sourceOrganizationChanged", e.target.value); - } - }, - computed: { - los: { - get() { - return this.LOS; - }, - set(value) { - this.$emit("LOSChanged", value * 1); - } - } - } -}; -</script> - -<style></style>
--- a/client/src/components/importschedule/importtypes/Gaugemeasurement.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -<template> - <div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-100"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>URL</translate> </small> - </div> - <div class="w-100"> - <input - @input="urlChanged" - class="url form-control" - type="url" - :value="url" - /> - </div> - </div> - </div> - <div v-if="!url" class="d-flex flex-row"> - <small - ><translate class="text-danger">Please enter a URL</translate></small - > - </div> - </div> -</template> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - */ -export default { - name: "gaugemeasurement", - props: ["url"], - methods: { - urlChanged(e) { - this.$emit("urlChanged", e.target.value); - } - } -}; -</script> - -<style></style>
--- a/client/src/components/importschedule/importtypes/Waterwayarea.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -<template> - <div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-100"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>URL</translate> </small> - </div> - <div class="w-100"> - <input - @input="urlChanged" - class="url form-control" - type="url" - :value="url" - /> - </div> - </div> - </div> - <div v-if="!url" class="d-flex flex-row"> - <small - ><translate class="text-danger">Please enter a URL</translate></small - > - </div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>Featuretype</translate> </small> - </div> - <div class="w-100"> - <input - @input="featureTypeChanged" - class="featuretype form-control" - type="text" - :value="featureType" - /> - </div> - <div v-if="!featureType" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a Featuretype</translate - ></small - > - </div> - </div> - <div class="flex-column mt-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>SortBy</translate> </small> - </div> - <div class="w-100"> - <input - @input="sortByChanged" - class="sortby form-control" - type="text" - :value="sortBy" - /> - </div> - <div v-if="!sortBy" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter SortBy</translate - ></small - > - </div> - </div> - </div> - </div> -</template> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - */ -export default { - name: "waterwayarea", - props: ["url", "featureType", "sortBy"], - methods: { - urlChanged(e) { - this.$emit("urlChanged", e.target.value); - }, - featureTypeChanged(e) { - this.$emit("featureTypeChanged", e.target.value); - }, - sortByChanged(e) { - this.$emit("sortByChanged", e.target.value); - } - } -}; -</script> - -<style></style>
--- a/client/src/components/importschedule/importtypes/Waterwayaxis.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -<template> - <div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-100"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>URL</translate> </small> - </div> - <div class="w-100"> - <input - @input="urlChanged" - class="url form-control" - type="url" - :value="url" - /> - </div> - </div> - </div> - <div v-if="!url" class="d-flex flex-row"> - <small - ><translate class="text-danger">Please enter a URL</translate></small - > - </div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>Featuretype</translate> </small> - </div> - <div class="w-100"> - <input - @input="featureTypeChanged" - class="featuretype form-control" - type="text" - :value="featureType" - /> - </div> - <div v-if="!featureType" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a Featuretype</translate - ></small - > - </div> - </div> - <div class="flex-column mt-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>SortBy</translate> </small> - </div> - <div class="w-100"> - <input - @input="sortByChanged" - class="sortby form-control" - type="text" - :value="sortBy" - /> - </div> - <div v-if="!sortBy" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter SortBy</translate - ></small - > - </div> - </div> - </div> - </div> -</template> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - */ -export default { - name: "waterwayaxis", - props: ["url", "featureType", "sortBy"], - methods: { - urlChanged(e) { - this.$emit("urlChanged", e.target.value); - }, - featureTypeChanged(e) { - this.$emit("featureTypeChanged", e.target.value); - }, - sortByChanged(e) { - this.$emit("sortByChanged", e.target.value); - } - } -}; -</script> - -<style></style>
--- a/client/src/components/importschedule/importtypes/Waterwaygauges.vue Tue Apr 09 13:42:44 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -<template> - <div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-100"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>URL</translate> </small> - </div> - <div class="w-100"> - <input - @input="urlChanged" - class="url form-control" - type="url" - :value="url" - /> - </div> - </div> - </div> - <div v-if="!url" class="d-flex flex-row"> - <small - ><translate class="text-danger">Please enter a URL</translate></small - > - </div> - <div class="d-flex flex-row"> - <div class="flex-column mt-3 mr-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>Username</translate> </small> - </div> - <div class="w-100"> - <input - @input="usernameChanged" - class="username form-control" - type="text" - :value="username" - /> - </div> - <div v-if="!username" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a Username</translate - ></small - > - </div> - </div> - <div class="flex-column mt-3 w-50"> - <div class="flex-row text-left"> - <small class="text-muted"> <translate>Password</translate> </small> - </div> - <div class="w-100 d-flex flex-row"> - <input - @input="passwordChanged" - class="password form-control" - :type="showPassword" - :value="password" - /> - <span - class="input-group-text ml-2" - @click="passwordVisible = !passwordVisible" - > - <font-awesome-icon :icon="passwordVisible ? 'eye-slash' : 'eye'" /> - </span> - </div> - <div v-if="!password" class="d-flex flex-row"> - <small - ><translate class="text-danger" - >Please enter a Password</translate - ></small - > - </div> - </div> - </div> - </div> -</template> - -<script> -/* This is Free Software under GNU Affero General Public License v >= 3.0 - * without warranty, see README.md and license for details. - * - * SPDX-License-Identifier: AGPL-3.0-or-later - * License-Filename: LICENSES/AGPL-3.0.txt - * - * Copyright (C) 2018 by via donau - * – Österreichische Wasserstraßen-Gesellschaft mbH - * Software engineering by Intevation GmbH - * - * Author(s): - * Thomas Junk <thomas.junk@intevation.de> - */ -export default { - name: "waterwaygauges", - props: ["username", "password", "url"], - data() { - return { - passwordVisible: false - }; - }, - computed: { - showPassword() { - if (this.passwordVisible) return "text"; - return "password"; - } - }, - methods: { - urlChanged(e) { - this.$emit("urlChanged", e.target.value); - }, - usernameChanged(e) { - this.$emit("usernameChanged", e.target.value); - }, - passwordChanged(e) { - this.$emit("passwordChanged", e.target.value); - } - } -}; -</script> - -<style></style>
--- a/client/src/router.js Tue Apr 09 13:42:44 2019 +0200 +++ b/client/src/router.js Tue Apr 09 14:52:55 2019 +0200 @@ -81,22 +81,6 @@ } }, { - path: "/importschedule", - name: "importschedule", - component: () => import("./components/importschedule/Importschedule.vue"), - meta: { - requiresAuth: true - }, - beforeEnter: (to, from, next) => { - const isWaterwayAdmin = store.getters["user/isWaterwayAdmin"]; - if (!isWaterwayAdmin) { - next("/login"); - } else { - next(); - } - } - }, - { path: "/", name: "mainview", component: Maplayer,
--- a/client/src/store/importschedule.js Tue Apr 09 13:42:44 2019 +0200 +++ b/client/src/store/importschedule.js Tue Apr 09 14:52:55 2019 +0200 @@ -62,7 +62,6 @@ id: null, importType: null, schedule: null, - import_: null, importSource: null, eMailNotification: false, scheduled: false, @@ -137,7 +136,7 @@ const { kind, config, id } = payload; const eMailNotification = config["send-email"]; const { cron, url } = config; - Vue.set(state.currentSchedule, "import_", KINDIMPORTTYPE[kind]); + Vue.set(state.currentSchedule, "importType", KINDIMPORTTYPE[kind]); Vue.set(state.currentSchedule, "id", id); if (cron) { Vue.set(state.currentSchedule, "scheduled", true);