Mercurial > gemma
changeset 4608:c03449c96437 geoserver_sql_views
Merge default into geoserver_sql_views
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Thu, 05 Sep 2019 17:02:03 +0200 |
parents | 064b6c46ea6c (current diff) 086640dc0fba (diff) |
children | 1bf26d18b4d7 |
files | client/docs/developer.md client/src/components/fairway/Profiles.vue schema/version.sql |
diffstat | 37 files changed, 2617 insertions(+), 1483 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/docs/dev-generalconsiderations.md Thu Sep 05 17:02:03 2019 +0200 @@ -0,0 +1,67 @@ +# General considerations + +## We chose [vuejs](https://vuejs.org/) + +Vue is a modern framework for webdevelopment. +It offers a very homogenous ecosystem (vuejs, vuecli, vue-router vuex) combined with up to date fontend rendering techniques like virtual DOM. + +## We chose [vue cli](https://cli.vuejs.org/) + +Vue cli allows a good jumpstart for a vuejs project. +There is no manual boilerplate to write. Everything is in place and already wired. The skeleton is easy extendable and in contrast to +other frameworks (i.e. create-react-app) there is no "eject" for further customization necessary. + +Configuration: + +- Babel +- Router +- Vuex +- CSSPreprocessor +- Linter+Unit +- Testing+E2E +- Testing +- No Typescript (No advantages) +- No PWA (IE11 compatibility makes more modern approaches unavailable) + +- SASS as CSS Preprocessor (widely used, allows programmatic CSS, familarity) +- Eslint + Prettier (Rationale below) +- Lint on Save +- Jest as Unittesting framework (zeroconf, ease of use) [productpage](https://jestjs.io/ +- Nightwatch (Seleniumbased, familarity with selenium, Chromedriver ootB) + +Everything in dedicated config files + +## We chose [vuex](https://vuex.vuejs.org/guide/) + +Vuex is the store component of vuejs. For medium to complex applications it is reasonable to centralize state globally, to make every possible interaction with state transparent. Interactions with state become traceable in contrast to chains built with components and properties. + +Perhaps it is resonable to configure [strict mode](https://vuex.vuejs.org/api/#strict) in the future (for development). State changes should only be allowed through `actions` and `mutations`. + +Besides traceability vuex allows to dumb down components. + +## We chose [prettier](https://prettier.io/) in combination with [eslint](https://eslint.org/) + +To enforce tight styling guidelines (e.g. avoidance of problems with [semicolons](https://eslint.org/docs/rules/no-unexpected-multiline)) and strict formatting rules, prettier was chosen. Prettier as a plugin is widey supported: + +- [vim](https://github.com/prettier/vim-prettier) +- [emacs](https://github.com/prettier/prettier-emacs) +- [VSCode](https://github.com/prettier/prettier-vscode) + +On top, there is [pretty quick](https://www.npmjs.com/package/pretty-quick) a tool, which allows autmatically solving linting issues for you. + +Overall prettier makes styling issues a non-issue: You get achieve styled code as a result. Code which is automatically formatted is easier to read for humans (it is in every project the same guideline) and easier to read for machines (which offer help like `pretty-quick`). + +Similar philosophy as behind [gofmt](https://golang.org/cmd/gofmt/) + +## We chose [env](https://github.com/motdotla/dotenv) as configurtion file format + +It is good practice to store configuration in the environment (see [12 factor app](https://12factor.net/config)). +From this idea evolved the practice to use `.env` files for configuring the environment. +`.env` is a standard widely supported, e.g. + +- [go](https://github.com/joho/godotenv) +- [Node](https://www.npmjs.com/package/dotenv) +- [Webpack](https://www.npmjs.com/package/dotenv-webpack) + +Last but not least: `.env` is the format, which is used by [vue-cli](https://cli.vuejs.org/guide/mode-and-env.html) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/docs/dev-translations.md Thu Sep 05 17:02:03 2019 +0200 @@ -0,0 +1,64 @@ +# Translation + +## Workflow + +Application -> .po files -> Weblate -> .po files -> Application + +### Depencencies + + * `gettext` (e.g. from Debian gettext 0.19.8.1-9) + * `vue-gettext` and `easygettext` (e.g. via yarn or npm) + +In order to extract the messages from the templates call `make makemessages`. +After that you have the `.po`-file which could be translated. + +After translation, `make translations` has to be called to generate the `translations.json`, that is being done automatically via yarn serve/build. +which is consumed by `vue-gettext`. + +The workflow is as follows: + +`component.vue ---> /tmp/template.pot ---> app/locale/fr_FR/LC_MESSAGES/app.po ---> app/translations.json` + +(taken from the documentation of `vue-gettext`) + +### Some rules to marking strings for translations + +- `gettext` must be called only in javascript part. For html part we use `<translate>` and `<v-translate>` to make sure that `makemessages` marks the strings correctly +- passing a value with \`\` to `gettext` leads to break up the translation process (e.g. gettext(\` text to translate ${value} \`)) +- passing html element (e.g. `<div>`) to gettext is interpreted as string. +- The strings to translate have to be included in the source code and not directly in `.po` files. + +## Why was gettext chosen? + +The goal was to internationalize our application for the following +languages: + +- EN +- DE +- SK +- HU +- HR +- BG +- RO + + +## We chose [vue-gettext](https://github.com/Polyconseil/vue-gettext) + + Rationale: + * No other framework supports our preferred translation cycle fully + * The original string can be seen in the source code at the right place. + * Relies in parts on well known utilities (xgettext) + * Allows phrases as parameters instead of Variables + $gettext("Dear Sir") opposed to $("greeting") + +Downsides: + +- At present (July 2018) there are some annoying issues, which demand quirky solutions: + + - [xgettext fails with some .vue files](https://github.com/Polyconseil/vue-gettext/issues/28) which forces us to use `(`, `)` around templates + - [translations in attributes](https://github.com/Polyconseil/vue-gettext/issues/9) which leaves us with either interpolating in templates with `<translate></translate>` or use computed properties in Vue components (cf. Login component). + - [inconsistent white space handling](https://github.com/Polyconseil/vue-gettext/issues/80) if you need a white space preserved before the translated tag, use `<span v-translate class="fix-trans-space">to be translated</a>` (see `src/assets/application.sass`). + +- Is dependent on external (=non JS) tools (`xgettext`) which are not able to consume `.vue`-files directly, which in turn leads to unexpected behaviour. +- +
--- a/client/docs/developer.md Thu Sep 05 16:55:40 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ -# General considerations - -## We chose [vuejs](https://vuejs.org/) - -Vue is a modern framework for webdevelopment. -It offers a very homogenous ecosystem (vuejs, vuecli, vue-router vuex) combined with up to date fontend rendering techniques like virtual DOM. - -## We chose [vue cli](https://cli.vuejs.org/) - -Vue cli allows a good jumpstart for a vuejs project. -There is no manual boilerplate to write. Everything is in place and already wired. The skeleton is easy extendable and in contrast to -other frameworks (i.e. create-react-app) there is no "eject" for further customization necessary. - -Configuration: - -- Babel -- Router -- Vuex -- CSSPreprocessor -- Linter+Unit -- Testing+E2E -- Testing -- No Typescript (No advantages) -- No PWA (IE11 compatibility makes more modern approaches unavailable) - -- SASS as CSS Preprocessor (widely used, allows programmatic CSS, familarity) -- Eslint + Prettier (Rationale below) -- Lint on Save -- Jest as Unittesting framework (zeroconf, ease of use) [productpage](https://jestjs.io/ -- Nightwatch (Seleniumbased, familarity with selenium, Chromedriver ootB) - -Everything in dedicated config files - -## We chose [vuex](https://vuex.vuejs.org/guide/) - -Vuex is the store component of vuejs. For medium to complex applications it is reasonable to centralize state globally, to make every possible interaction with state transparent. Interactions with state become traceable in contrast to chains built with components and properties. - -Perhaps it is resonable to configure [strict mode](https://vuex.vuejs.org/api/#strict) in the future (for development). State changes should only be allowed through `actions` and `mutations`. - -Besides traceability vuex allows to dumb down components. - -## We chose [prettier](https://prettier.io/) in combination with [eslint](https://eslint.org/) - -To enforce tight styling guidelines (e.g. avoidance of problems with [semicolons](https://eslint.org/docs/rules/no-unexpected-multiline)) and strict formatting rules, prettier was chosen. Prettier as a plugin is widey supported: - -- [vim](https://github.com/prettier/vim-prettier) -- [emacs](https://github.com/prettier/prettier-emacs) -- [VSCode](https://github.com/prettier/prettier-vscode) - -On top, there is [pretty quick](https://www.npmjs.com/package/pretty-quick) a tool, which allows autmatically solving linting issues for you. - -Overall prettier makes styling issues a non-issue: You get achieve styled code as a result. Code which is automatically formatted is easier to read for humans (it is in every project the same guideline) and easier to read for machines (which offer help like `pretty-quick`). - -Similar philosophy as behind [gofmt](https://golang.org/cmd/gofmt/) - -## We chose [env](https://github.com/motdotla/dotenv) as configurtion file format - -It is good practice to store configuration in the environment (see [12 factor app](https://12factor.net/config)). -From this idea evolved the practice to use `.env` files for configuring the environment. -`.env` is a standard widely supported, e.g. - -- [go](https://github.com/joho/godotenv) -- [Node](https://www.npmjs.com/package/dotenv) -- [Webpack](https://www.npmjs.com/package/dotenv-webpack) - -Last but not least: `.env` is the format, which is used by [vue-cli](https://cli.vuejs.org/guide/mode-and-env.html) - -# Translation - -We want to internationalize our application for the following -languages: - -- EN -- DE -- SK -- HU -- HR -- BG -- RO - -## Our preferred translation cycle is as follows: - -Application -> .po files -> Weblate -> .po files -> Application - -There are several possibilities to achieve this goal. - -## We chose [vue-gettext](https://github.com/Polyconseil/vue-gettext) - - Rationale: - * No other framework supports our preferred translation cycle fully - * Relies in parts on well known utilities (xgettext) - * Allows phrases as parameters instead of Variables - $gettext("Dear Sir") opposed to $("greeting") - -Downsides: - -- At present (July 2018) there are some annoying issues, which demand quirky solutions: - - - [xgettext fails with some .vue files](https://github.com/Polyconseil/vue-gettext/issues/28) which forces us to use `(`, `)` around templates - - [translations in attributes](https://github.com/Polyconseil/vue-gettext/issues/9) which leaves us with either interpolating in templates with `<translate></translate>` or use computed properties in Vue components (cf. Login component). - - [inconsistent white space handling](https://github.com/Polyconseil/vue-gettext/issues/80) if you need a white space preserved before the translated tag, use `<span v-translate class="fix-trans-space">to be translated</a>` (see `src/assets/application.sass`). - -- Is dependend on external (=non JS) tools (`xgettext`) which are not able to consume `.vue`-files directly, which in turn leads to unexpected behaviour. -- - -## Commands -You need the following applications to run the process: - * `gettext` (e.g. from Debian gettext 0.19.8.1-9) - * `vue-gettext` and `easygettext` (e.g. via yarn or npm) - -In order to extract the messages from the templates call `make makemessages`. -After that you have the `.po`-file which could be translated. - -After translation, `make translations` has to be called to generate the `translations.json`, that is being done automatically via yarn serve/build. -which is consumed by `vue-gettext`. - -The workflow is as follows: - -`component.vue ---> /tmp/template.pot ---> app/locale/fr_FR/LC_MESSAGES/app.po ---> app/translations.json` - -(taken from the documentation of `vue-gettext`) - -## Some rules to marking strings for translations - -- `gettext` must be called only in javascript part. For html part we use `<translate>` and `<v-translate>` to make sure that `makemessages` marks the strings correctly -- passing a value with \`\` to `gettext` leads to break up the translation process (e.g. gettext(\` text to translate ${value} \`)) -- passing html element (e.g. `<div>`) to gettext is interpreted as string. -- The strings to translate have to be included in the source code and not directly in `.po` files.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/docs/developers.md Thu Sep 05 17:02:03 2019 +0200 @@ -0,0 +1,37 @@ +When developing wamos, check out + +* [How translations are handled](dev-translations.md) +* [Rationale of some choices](dev-generalconsiderations.md) + +## Hints + +When testing the vuex store object can be accessed from the +webbrowsers console like + +```javascript +store = document.getElementsByTagName('a')[0].__vue__.$store +``` + +This allows for setting test values where getting real test data +is complicated. For example testing the diagramm for the +fairwayavailability (tested with Chromium 73 und gemma-2019-09-04): + +```javascript +data = store.state.fairwayavailability.csv + +data=`#time,# < LDC (164.0) [h],# >= LDC (164.0) [h],# < 230.0 [h],# >= 230.0 [h],# >= 250.0 [h] +01-2019,0 ,744, 0, 0,744 +02-2019,324,324,150,174,324 +03-2019, 24,696, 80, 45, 50 +04-2019,120,600, 24, 24,672.5 +05-2019,140,80 , 80, 45, 50 +06-2019, 0, 0, 0, 0, 0.000 +07-2019, 0,300, 0, 0, 0 +08-2019, 0, 0,744, 0, 0 +09-2019, 0,720, 0, 96,624 +` + +store.commit("fairwayavailability/setAvailableFairwayDepthData", data) +``` + +(Depends on the code structure in store/fairwayavailability.js.)
--- a/client/src/components/App.vue Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/components/App.vue Thu Sep 05 17:02:03 2019 +0200 @@ -97,7 +97,7 @@ } }, components: { - Profiles: () => import("./fairway/Profiles"), + Profiles: () => import("./fairway/BottleneckDialogue"), Gauges: () => import("./gauge/Gauges"), Pdftool: () => import("./Pdftool"), Identify: () => import("./identify/Identify"),
--- a/client/src/components/fairway/AvailableFairwayDepth.vue Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/components/fairway/AvailableFairwayDepth.vue Thu Sep 05 17:02:03 2019 +0200 @@ -42,6 +42,17 @@ >Download CSV</a > </div> + <div class="btn-group-toggle w-100 mt-2"> + <label + class="btn btn-outline-secondary btn-sm" + :class="{ active: showNumbers }" + ><input + type="checkbox" + v-model="showNumbers" + autocomplete="off" + />Numbers + </label> + </div> </DiagramLegend> <div ref="diagramContainer" @@ -69,6 +80,7 @@ * * Thomas Junk <thomas.junk@intevation.de> * * Markus Kottländer <markus.kottlaender@intevation.de> * * Fadi Abbud <fadi.abbud@intevation.de> + * * Bernhard Reiter <bernhard.reiter@intevation.de> */ import * as d3 from "d3"; import app from "@/main"; @@ -81,7 +93,14 @@ import { FREQUENCIES } from "@/store/fairwayavailability"; import { defaultDiagramTemplate } from "@/lib/DefaultDiagramTemplate"; -const hoursInDays = x => Math.round(x / 24); +// FIXME This is a rounding methods that shows that we have fractions, +// because we are coming from hours. Users will understand the underlying +// math better and we can see if this is wanted. +// With the backend just giving us the summarized hours, we cannot do +// a classification of each day into a category. +// (The name of the function is kept to keep the diff more readable and +// should changed if this is more clarified.) +const hoursInDays = x => Math.round((x * 10) / 24) / 10; export default { mixins: [diagram, pdfgen, templateLoader], @@ -106,7 +125,8 @@ }, templateData: null, templates: [], - defaultTemplate: defaultDiagramTemplate + defaultTemplate: defaultDiagramTemplate, + showNumbers: false }; }, created() { @@ -454,9 +474,8 @@ const dy = document .querySelector(".diagram-container") .getBoundingClientRect().left; - const value = Number.parseFloat(hoursInDays(d.height)).toFixed(2); d3.select("#tooltip") - .text(Math.round(value)) + .text(hoursInDays(d.height)) .attr("y", y - 10) .attr("x", d3.event.pageX - dy); //d3.event.pageX gives coordinates relative to SVG @@ -472,9 +491,33 @@ }) .attr("x", ldcOffset + spaceBetween / 2) .attr("width", widthPerItem - ldcOffset - spaceBetween) + .attr("id", "lower") .attr("fill", (d, i) => { return this.$options.COLORS.REST[i]; }); + if (this.showNumbers) { + everyBar + .selectAll("g.bars") + .data(d => d.lowerLevels) + .enter() + .filter(d => hoursInDays(d.height) > 0) + .insert("text") + .attr("y", d => { + return ( + 2 * yScale(0) - + yScale(hoursInDays(d.translateY)) + + this.paddingTop + + (yScale(0) - yScale(hoursInDays(d.height))) + + (yScale(0) - yScale(1.9)) //instead o alignment-baseline hanging + ); + }) + .attr("x", widthPerItem / 2) + .text(d => hoursInDays(d.height)) + // does not work with svg2pdf .attr("alignment-baseline", "hanging") + .attr("text-anchor", "middle") + .attr("font-size", "8") + .attr("fill", "black"); + } }, fnheight({ name, yScale }) { return d => yScale(0) - yScale(hoursInDays(d[name])); @@ -484,7 +527,7 @@ everyBar .append("rect") .on("mouseover", function() { - d3.select(this).attr("opacity", "0.8"); + d3.select(this).attr("opacity", "0.7"); d3.select("#tooltip").attr("opacity", 1); }) .on("mouseout", function() { @@ -496,9 +539,8 @@ const dy = document .querySelector(".diagram-container") .getBoundingClientRect().left; - const value = Number.parseFloat(hoursInDays(d.ldc)).toFixed(2); d3.select("#tooltip") - .text(Math.round(value)) + .text(hoursInDays(d.ldc)) .attr("y", y - 50) .attr("x", d3.event.pageX - dy); //d3.event.pageX gives coordinates relative to SVG @@ -514,6 +556,21 @@ ) .attr("fill", this.$options.COLORS.LDC) .attr("id", "ldc"); + if (this.showNumbers) { + everyBar + .filter(d => hoursInDays(d.ldc) > 0) + .append("text") + .attr("y", yScale(0.5)) // some distance from the bar + .attr("x", spaceBetween / 2) + .text(d => hoursInDays(d.ldc)) + .attr("text-anchor", "left") + .attr("font-size", "8") + .attr( + "transform", + d => `translate(0 ${this.paddingTop + -1 * height(d)})` + ) + .attr("fill", "black"); + } }, drawHighestLevel({ everyBar, @@ -538,11 +595,8 @@ const dy = document .querySelector(".diagram-container") .getBoundingClientRect().left; - const value = Number.parseFloat(hoursInDays(d.highestLevel)).toFixed( - 2 - ); d3.select("#tooltip") - .text(Math.round(value)) + .text(hoursInDays(d.highestLevel)) .attr("y", y - 50) .attr("x", d3.event.pageX - dy); //d3.event.pageX gives coordinates relative to SVG @@ -557,6 +611,21 @@ d => `translate(0 ${this.paddingTop + -1 * height(d)})` ) .attr("fill", this.$options.COLORS.HIGHEST); + if (this.showNumbers) { + everyBar + .filter(d => hoursInDays(d.highestLevel) > 0) + .append("text") + .attr("y", yScale(0.5)) // some distance from the bar + .attr("x", widthPerItem / 2) + .text(d => hoursInDays(d.highestLevel)) + .attr("text-anchor", "middle") + .attr("font-size", "8") + .attr( + "transform", + d => `translate(0 ${this.paddingTop + -1 * height(d)})` + ) + .attr("fill", "black"); + } }, drawLabelPerBar({ everyBar, dimensions, widthPerItem }) { everyBar @@ -647,13 +716,16 @@ watch: { fwData() { this.drawDiagram(); + }, + showNumbers() { + this.drawDiagram(); } }, LEGEND: app.$gettext("Sum of days"), COLORS: { - LDC: "#cdcdcd", - HIGHEST: "#3675ff", - REST: ["#782121", "#ff6c6c", "#ffaaaa"] + LDC: "aqua", + HIGHEST: "blue", + REST: ["hotpink", "darksalmon", "#ffaaaa"] } }; </script>
--- a/client/src/components/fairway/AvailableFairwayDepthLNWL.vue Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/components/fairway/AvailableFairwayDepthLNWL.vue Thu Sep 05 17:02:03 2019 +0200 @@ -606,9 +606,9 @@ } }, LEGEND: app.$gettext("Percent"), - AFDCOLORS: ["#3636ff", "#f49b7f", "#e15472"], + AFDCOLORS: ["blue", "darksalmon", "hotpink"], LWNLCOLORS: { - LDC: "#97ddf3", + LDC: "aqua", HDC: "#43FFE1" } };
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/fairway/BottleneckDialogue.vue Thu Sep 05 17:02:03 2019 +0200 @@ -0,0 +1,707 @@ +<template> + <div + :class="[ + 'box ui-element rounded bg-white text-nowrap', + { expanded: showProfiles } + ]" + > + <div style="width: 18rem"> + <UIBoxHeader + icon="chart-area" + :title="profilesLable" + :closeCallback="close" + /> + <div class="box-body"> + <UISpinnerOverlay v-if="surveysLoading || profileLoading" /> + <select + @change="moveToBottleneck" + v-model="selectedBottleneck" + class="form-control font-weight-bold" + > + <option :value="null"> + <translate>Select Bottleneck</translate> + </option> + <optgroup + v-for="(bottlenecksForCountry, cc) in orderedBottlenecks" + :key="cc" + :label="cc" + > + <option + v-for="bn in bottlenecksForCountry" + :key="bn.properties.id" + :value="bn.properties.name" + > + {{ bn.properties.name }} + </option> + </optgroup> + </select> + <div v-if="selectedBottleneck"> + <div class="d-flex flex-column mt-2"> + <div class="flex-fill"> + <small class="text-muted"> + <translate>Waterlevel</translate>: + </small> + <select + v-model="selectedWaterLevel" + class="form-control form-control-sm small" + > + <option value="ref"> + <translate>Depth Reference</translate> + <template v-if="selectedSurvey"> + ({{ selectedSurvey.depth_reference }}/{{ + $options.filters.waterlevel( + selectedSurvey.waterlevel_value + ) + }} + m) + </template> + </option> + <option value="current"> + <translate>Current Waterlevel</translate> + <template v-if="bottleneck"> + ({{ + $options.filters.waterlevel( + bottleneck.get("gm_waterlevel") + ) + }} + m) + </template> + </option> + </select> + </div> + <div class="flex-fill"> + <small class="text-muted"> <translate>Survey</translate>: </small> + <div class="d-flex"> + <select + v-model="selectedSurvey" + class="form-control form-control-sm small" + > + <option + v-for="survey in surveys" + :key="survey.date_info" + :value="survey" + >{{ survey.date_info | surveyDate }}</option + > + </select> + <button + class="btn btn-dark btn-xs ml-2" + @click="deleteSelectedSurvey" + > + <font-awesome-icon icon="trash" /> + </button> + </div> + </div> + <div class="flex-fill" v-if="selectedSurvey && surveys.length > 1"> + <small class="text-muted mt-1"> + <translate>Compare with</translate>: + </small> + <select + v-model="additionalSurvey" + class="form-control form-control-sm small" + > + <option :value="null">None</option> + <option + v-for="survey in additionalSurveys" + :key="survey.date_info" + :value="survey" + >{{ survey.date_info | surveyDate }}</option + > + </select> + </div> + </div> + <div class="mt-2 d-flex" v-if="additionalSurvey"> + <button + v-if="differencesLoading" + class="btn btn-info btn-xs flex-fill" + disabled + > + <font-awesome-icon icon="spinner" spin class="mr-1" /> + <translate>Calculating differences</translate> + </button> + <button + class="btn btn-info btn-xs flex-fill" + @click="differencesVisible ? showSurvey() : showDifferences()" + v-else + > + <translate v-if="differencesVisible" key="showsurvey" + >Show survey</translate + > + <translate v-else key="showdifferences" + >Show differences</translate + > + </button> + <button + v-if="!paneSetup.includes('FAIRWAYPROFILE')" + class="btn btn-info btn-xs ml-2" + @click="$store.commit('application/paneRotate')" + v-tooltip="rotatePanesTooltip" + > + <font-awesome-icon icon="redo" fixed-width /> + </button> + <button + class="btn btn-info btn-xs ml-2" + @click="toggleSyncMaps()" + v-tooltip="syncMapsTooltip" + > + <font-awesome-icon + :icon="mapsAreSynced ? 'unlink' : 'link'" + fixed-width + /> + </button> + </div> + <hr class="w-100 mb-0" /> + <small class="text-muted d-block mt-2"> + <translate>Saved cross profiles</translate>: + </small> + <div class="d-flex"> + <select + :class="[ + 'form-control form-control-sm flex-fill', + { 'rounded-left-only': selectedCut } + ]" + v-model="selectedCut" + > + <option></option> + <option + v-for="(cut, index) in previousCuts" + :value="cut" + :key="index" + >{{ cut.label }}</option + > + </select> + <button + class="btn btn-xs btn-dark ml-2" + @click="deleteSelectedCut(selectedCut)" + v-if="selectedCut" + > + <font-awesome-icon icon="trash" /> + </button> + </div> + <small class="text-muted d-block mt-2"> + <translate>Enter coordinates manually</translate>: + </small> + <div class="position-relative"> + <input + class="form-control form-control-sm pr-5" + placeholder="Lat,Lon,Lat,Lon" + v-model="coordinatesInput" + /> + <button + class="btn btn-sm btn-info position-absolute input-button-right" + @click="applyManualCoordinates" + style="top: 0; right: 0;" + v-if="coordinatesInputIsValid" + > + <font-awesome-icon icon="check" /> + </button> + </div> + <small class="d-flex text-left mt-2" v-if="startPoint && endPoint"> + <div class="text-nowrap mr-3"> + <b> <translate>Start</translate>: </b> <br /> + Lat: {{ startPoint[1] }} <br /> + Lon: {{ startPoint[0] }} + </div> + <div class="text-nowrap"> + <b>End:</b> <br /> + Lat: {{ endPoint[1] }} <br /> + Lon: {{ endPoint[0] }} + </div> + <button + v-clipboard:copy="coordinatesForClipboard" + v-clipboard:success="onCopyCoordinates" + class="btn btn-info btn-sm ml-auto mt-auto" + > + <font-awesome-icon icon="copy" /> + </button> + </small> + <div class="d-flex mt-3"> + <div + class="pr-3 w-50" + v-if="startPoint && endPoint && !selectedCut" + > + <button + class="btn btn-info btn-sm w-100" + @click="showLabelInput = !showLabelInput" + > + <font-awesome-icon :icon="showLabelInput ? 'times' : 'check'" /> + {{ showLabelInput ? "Cancel" : "Save" }} + </button> + </div> + <div + :class="startPoint && endPoint && !selectedCut ? 'w-50' : 'w-100'" + > + <button + class="btn btn-info btn-sm w-100" + @click="toggleCutTool" + :disabled="!selectedSurvey" + > + <font-awesome-icon :icon="cutToolEnabled ? 'times' : 'plus'" /> + {{ cutToolEnabled ? "Cancel" : "New" }} + </button> + </div> + </div> + <div v-if="showLabelInput" class="mt-2"> + <small class="text-muted"> + <translate>Enter label for cross profile</translate>: + </small> + <div class="position-relative"> + <input + class="form-control form-control-sm pr-5" + v-model="cutLabel" + /> + <button + class="btn btn-sm btn-info position-absolute input-button-right" + @click="saveCut" + v-if="cutLabel" + style="top: 0; right: 0;" + > + <font-awesome-icon icon="check" /> + </button> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<style lang="scss" scoped> +.input-button-right { + border-top-right-radius: $border-radius; + border-bottom-right-radius: $border-radius; + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.rounded-left-only { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; + border-top-left-radius: $border-radius; + border-bottom-left-radius: $border-radius; +} + +input, +select { + font-size: 0.8em; +} +</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): + * Markus Kottländer <markus.kottlaender@intevation.de> + */ +import { mapState, mapGetters } from "vuex"; +import Feature from "ol/Feature"; +import LineString from "ol/geom/LineString"; +import { displayError, displayInfo } from "@/lib/errors"; +import { HTTP } from "@/lib/http"; +import { COMPARESURVEYS } from "@/components/paneSetups"; +import lib from "@/lib/filters"; + +export default { + name: "profiles", + data() { + return { + coordinatesInput: "", + cutLabel: "", + showLabelInput: false + }; + }, + computed: { + ...mapState("application", ["showProfiles", "paneSetup"]), + ...mapState("map", ["openLayersMaps", "syncedMaps", "cutToolEnabled"]), + ...mapState("bottlenecks", [ + "bottlenecksList", + "surveys", + "surveysLoading" + ]), + ...mapState("fairwayprofile", [ + "previousCuts", + "startPoint", + "endPoint", + "profileLoading", + "differencesLoading", + "waterLevels", + "currentProfile" + ]), + ...mapGetters("map", ["openLayersMap"]), + ...mapGetters("bottlenecks", ["orderedBottlenecks"]), + profilesLable() { + return this.$gettext("Bottleneck Surveys"); + }, + selectedBottleneck: { + get() { + return this.$store.state.bottlenecks.selectedBottleneck; + }, + set(name) { + this.$store.dispatch("bottlenecks/setSelectedBottleneck", name); + } + }, + selectedWaterLevel: { + get() { + return this.$store.state.fairwayprofile.selectedWaterLevel; + }, + set(value) { + this.$store.commit("fairwayprofile/setSelectedWaterLevel", value); + } + }, + selectedSurvey: { + get() { + return this.$store.state.bottlenecks.selectedSurvey; + }, + set(survey) { + this.$store.commit("fairwayprofile/additionalSurvey", null); + this.$store.commit("bottlenecks/selectedSurvey", survey); + } + }, + additionalSurvey: { + get() { + return this.$store.state.fairwayprofile.additionalSurvey; + }, + set(survey) { + this.$store.commit("fairwayprofile/additionalSurvey", survey); + } + }, + selectedCut: { + get() { + return this.$store.state.fairwayprofile.selectedCut; + }, + set(cut) { + this.$store.commit("fairwayprofile/selectedCut", cut); + if (!cut) { + this.$store.commit("fairwayprofile/clearCurrentProfile"); + this.openLayersMaps.forEach(m => { + m.getLayer("CUTTOOL") + .getSource() + .clear(); + }); + } + } + }, + additionalSurveys() { + return this.surveys.filter( + survey => survey.date_info !== this.selectedSurvey.date_info + ); + }, + coordinatesForClipboard() { + return ( + this.startPoint[1] + + "," + + this.startPoint[0] + + "," + + this.endPoint[1] + + "," + + this.endPoint[0] + ); + }, + coordinatesInputIsValid() { + const coordinates = this.coordinatesInput + .split(",") + .map(coord => parseFloat(coord.trim())) + .filter(c => Number(c) === c); + return coordinates.length === 4; + }, + differencesVisible() { + return ( + this.openLayersMap(COMPARESURVEYS.compare.id) && + !this.openLayersMap(COMPARESURVEYS.compare.id) + .getLayer("BOTTLENECKISOLINE") + .getVisible() && + this.openLayersMap(COMPARESURVEYS.compare.id) + .getLayer("DIFFERENCES") + .getVisible() + ); + }, + rotatePanesTooltip() { + return this.$gettext("Rotate Maps"); + }, + syncMapsTooltip() { + return this.$gettext( + this.mapsAreSynced ? "Unsynchronize Maps" : "Synchronize Maps" + ); + }, + mapsAreSynced() { + return this.syncedMaps.includes(COMPARESURVEYS.compare.id); + }, + bottleneck() { + return this.openLayersMap() + ? this.openLayersMap() + .getLayer("BOTTLENECKS") + .getSource() + .getFeatures() + .find(f => f.get("objnam") === this.selectedBottleneck) + : null; + } + }, + watch: { + selectedBottleneck() { + this.$store.dispatch("fairwayprofile/previousCuts"); + this.cutLabel = + this.selectedBottleneck + " (" + new Date().toISOString() + ")"; + }, + selectedSurvey(survey) { + this.loadProfile(survey); + }, + additionalSurvey(survey) { + if (survey) { + this.loadDifferences(); + this.$store.commit( + "application/paneSetup", + Object.keys(this.currentProfile).length + ? "COMPARESURVEYS_FAIRWAYPROFILE" + : "COMPARESURVEYS" + ); + this.$store.commit("map/syncedMaps", [COMPARESURVEYS.compare.id]); + } else { + this.$store.commit( + "application/paneSetup", + Object.keys(this.currentProfile).length ? "FAIRWAYPROFILE" : "DEFAULT" + ); + this.$store.commit("map/syncedMaps", []); + } + this.loadProfile(survey); + }, + selectedCut(cut) { + if (cut) { + this.applyCoordinates(cut.coordinates); + } + } + }, + methods: { + toggleSyncMaps() { + if (this.mapsAreSynced) { + this.$store.commit( + "map/syncedMaps", + this.syncedMaps.filter(m => m !== COMPARESURVEYS.compare.id) + ); + } else { + this.$store.commit("map/syncedMaps", [COMPARESURVEYS.compare.id]); + } + }, + loadDifferences() { + this.$store.commit("fairwayprofile/setDifferencesLoading", true); + HTTP.post( + "/diff", + { + bottleneck: this.selectedSurvey.bottleneck_id, + minuend: this.selectedSurvey.date_info, + subtrahend: this.additionalSurvey.date_info + }, + { + headers: { + "X-Gemma-Auth": localStorage.getItem("token") + } + } + ) + .then() + .catch(error => { + let status, data, message; + if (error.response) { + status = error.response.status; + data = error.response.data; + message = `${status}: ${data.message || data}`; + } else { + message = error; + } + displayError({ + title: this.$gettext("Backend Error"), + message: message + }); + }) + .finally(() => { + this.$store.commit("fairwayprofile/setDifferencesLoading", false); + }); + }, + showDifferences() { + this.openLayersMap(COMPARESURVEYS.compare.id) + .getLayer("BOTTLENECKISOLINE") + .setVisible(false); + this.openLayersMap(COMPARESURVEYS.compare.id) + .getLayer("DIFFERENCES") + .setVisible(true); + }, + showSurvey() { + this.openLayersMap(COMPARESURVEYS.compare.id) + .getLayer("BOTTLENECKISOLINE") + .setVisible(true); + this.openLayersMap(COMPARESURVEYS.compare.id) + .getLayer("DIFFERENCES") + .setVisible(false); + }, + close() { + this.$store.commit("application/showProfiles", false); + }, + loadProfile(survey) { + if (survey) { + this.$store.commit("fairwayprofile/profileLoading", true); + this.$store + .dispatch("fairwayprofile/loadProfile", survey) + .finally(() => { + this.$store.commit("fairwayprofile/profileLoading", false); + }); + } + }, + toggleCutTool() { + this.$store.commit("map/cutToolEnabled", !this.cutToolEnabled); + this.$store.commit("map/lineToolEnabled", false); + this.$store.commit("map/polygonToolEnabled", false); + this.$store.commit("map/setCurrentMeasurement", null); + }, + onCopyCoordinates() { + displayInfo({ + message: this.$gettext("Coordinates copied to clipboard!") + }); + }, + applyManualCoordinates() { + const coordinates = this.coordinatesInput + .split(",") + .map(coord => parseFloat(coord.trim())); + this.selectedCut = null; + this.coordinatesInput = ""; + this.applyCoordinates([ + coordinates[1], + coordinates[0], + coordinates[3], + coordinates[2] + ]); + }, + applyCoordinates(coordinates) { + // allow only numbers + coordinates = coordinates.filter(c => Number(c) === c); + if (coordinates.length === 4) { + // draw line on map + this.openLayersMaps.forEach(m => { + m.getLayer("CUTTOOL") + .getSource() + .clear(); + }); + const cut = new Feature({ + geometry: new LineString([ + [coordinates[0], coordinates[1]], + [coordinates[2], coordinates[3]] + ]).transform("EPSG:4326", "EPSG:3857") + }); + this.openLayersMaps.forEach(m => { + m.getLayer("CUTTOOL") + .getSource() + .addFeature(cut); + }); + + // draw diagram + this.$store.dispatch("fairwayprofile/cut", cut); + } else { + displayError({ + title: this.$gettext("Invalid input"), + message: this.$gettext( + "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon" + ) + }); + } + }, + saveCut() { + const previousCuts = + JSON.parse(localStorage.getItem("previousCuts")) || []; + const newEntry = { + label: this.cutLabel, + bottleneckName: this.selectedBottleneck, + coordinates: [...this.startPoint, ...this.endPoint], + timestamp: new Date().getTime() + }; + const existingEntry = previousCuts.find(cut => { + return JSON.stringify(cut) === JSON.stringify(newEntry); + }); + if (!existingEntry) previousCuts.push(newEntry); + if (previousCuts.length > 100) previousCuts.shift(); + localStorage.setItem("previousCuts", JSON.stringify(previousCuts)); + this.$store.dispatch("fairwayprofile/previousCuts"); + + this.showLabelInput = false; + displayInfo({ + title: this.$gettext("Profile saved!"), + message: this.$gettext( + 'You can now select these coordinates from the "Saved cross profiles" menu to restore this cross profile.' + ) + }); + }, + deleteSelectedSurvey() { + const surveyText = `${this.selectedBottleneck}: ${lib.surveyDate( + this.selectedSurvey.date_info + )}`; + this.$store.commit("application/popup", { + icon: "trash", + title: this.$gettext("Delete survey"), + content: + `<small><b>` + + this.$gettext("Do you really want to delete the survey:") + + `</b><br> + ${surveyText}</small>`, + confirm: { + label: this.$gettext("Delete"), + icon: "trash", + callback: () => { + displayInfo({ title: this.$gettext("Not implemented") }); + } + }, + cancel: { + label: this.$gettext("Cancel"), + icon: "times" + } + }); + }, + deleteSelectedCut(cut) { + this.$store.commit("application/popup", { + icon: "trash", + title: this.$gettext("Delete cross profile"), + content: + `<small><b>` + + this.$gettext("Do you really want to delete the cross profile:") + + `</b><br> + ${cut.label}</small>`, + confirm: { + label: this.$gettext("Delete"), + icon: "trash", + callback: () => { + let previousCuts = + JSON.parse(localStorage.getItem("previousCuts")) || []; + previousCuts = previousCuts.filter(cut => { + return JSON.stringify(cut) !== JSON.stringify(this.selectedCut); + }); + localStorage.setItem("previousCuts", JSON.stringify(previousCuts)); + this.$store.commit("fairwayprofile/selectedCut", null); + this.$store.dispatch("fairwayprofile/previousCuts"); + displayInfo({ title: this.$gettext("Profile deleted!") }); + } + }, + cancel: { + label: this.$gettext("Cancel"), + icon: "times" + } + }); + }, + moveToBottleneck() { + const bottleneck = this.bottlenecksList.find( + bn => bn.properties.name === this.selectedBottleneck + ); + if (!bottleneck) return; + this.$store.dispatch("map/moveToFeauture", { + feature: bottleneck, + zoom: 17, + preventZoomOut: true + }); + } + }, + mounted() { + this.$store.dispatch("bottlenecks/loadBottlenecksList"); + } +}; +</script>
--- a/client/src/components/fairway/Profiles.vue Thu Sep 05 16:55:40 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,675 +0,0 @@ -<template> - <div - :class="[ - 'box ui-element rounded bg-white text-nowrap', - { expanded: showProfiles } - ]" - > - <div style="width: 18rem"> - <UIBoxHeader - icon="chart-area" - :title="profilesLable" - :closeCallback="close" - /> - <div class="box-body"> - <UISpinnerOverlay v-if="surveysLoading || profileLoading" /> - <select - @change="moveToBottleneck" - v-model="selectedBottleneck" - class="form-control font-weight-bold" - > - <option :value="null"> - <translate>Select Bottleneck</translate> - </option> - <optgroup - v-for="(bottlenecksForCountry, cc) in orderedBottlenecks" - :key="cc" - :label="cc" - > - <option - v-for="bn in bottlenecksForCountry" - :key="bn.properties.id" - :value="bn.properties.name" - > - {{ bn.properties.name }} - </option> - </optgroup> - </select> - <div v-if="selectedBottleneck"> - <div class="d-flex mt-2"> - <div class="flex-fill" style="max-width: 75px;"> - <small class="text-muted"> - <translate>Waterlevel</translate>: - </small> - <select - v-model="selectedWaterLevel" - class="form-control form-control-sm small" - > - <option value="ref"> - <translate>Depth Reference</translate> - <template v-if="selectedSurvey"> - ({{ selectedSurvey.depth_reference }}/{{ - $options.filters.waterlevel( - selectedSurvey.waterlevel_value - ) - }} - m) - </template> - </option> - <option value="current"> - <translate>Current Waterlevel</translate> - <template v-if="bottleneck"> - ({{ - $options.filters.waterlevel( - bottleneck.get("gm_waterlevel") - ) - }} - m) - </template> - </option> - </select> - </div> - <div class="flex-fill ml-2"> - <small class="text-muted"> <translate>Survey</translate>: </small> - <select - v-model="selectedSurvey" - class="form-control form-control-sm small" - > - <option - v-for="survey in surveys" - :key="survey.date_info" - :value="survey" - >{{ survey.date_info | surveyDate }}</option - > - </select> - </div> - <div - class="flex-fill ml-2" - v-if="selectedSurvey && surveys.length > 1" - > - <small class="text-muted mt-1"> - <translate>Compare with</translate>: - </small> - <select - v-model="additionalSurvey" - class="form-control form-control-sm small" - > - <option :value="null">None</option> - <option - v-for="survey in additionalSurveys" - :key="survey.date_info" - :value="survey" - >{{ survey.date_info | surveyDate }}</option - > - </select> - </div> - </div> - <div class="mt-2 d-flex" v-if="additionalSurvey"> - <button - v-if="differencesLoading" - class="btn btn-info btn-xs flex-fill" - disabled - > - <font-awesome-icon icon="spinner" spin class="mr-1" /> - <translate>Calculating differences</translate> - </button> - <button - class="btn btn-info btn-xs flex-fill" - @click="differencesVisible ? showSurvey() : showDifferences()" - v-else - > - <translate v-if="differencesVisible" key="showsurvey" - >Show survey</translate - > - <translate v-else key="showdifferences" - >Show differences</translate - > - </button> - <button - v-if="!paneSetup.includes('FAIRWAYPROFILE')" - class="btn btn-info btn-xs ml-2" - @click="$store.commit('application/paneRotate')" - v-tooltip="rotatePanesTooltip" - > - <font-awesome-icon icon="redo" fixed-width /> - </button> - <button - class="btn btn-info btn-xs ml-2" - @click="toggleSyncMaps()" - v-tooltip="syncMapsTooltip" - > - <font-awesome-icon - :icon="mapsAreSynced ? 'unlink' : 'link'" - fixed-width - /> - </button> - </div> - <hr class="w-100 mb-0" /> - <small class="text-muted d-block mt-2"> - <translate>Saved cross profiles</translate>: - </small> - <div class="d-flex"> - <select - :class="[ - 'form-control form-control-sm flex-fill', - { 'rounded-left-only': selectedCut } - ]" - v-model="selectedCut" - > - <option></option> - <option - v-for="(cut, index) in previousCuts" - :value="cut" - :key="index" - >{{ cut.label }}</option - > - </select> - <button - class="btn btn-sm btn-dark input-button-right" - @click="deleteSelectedCut(selectedCut)" - v-if="selectedCut" - > - <font-awesome-icon icon="trash" /> - </button> - </div> - <small class="text-muted d-block mt-2"> - <translate>Enter coordinates manually</translate>: - </small> - <div class="position-relative"> - <input - class="form-control form-control-sm pr-5" - placeholder="Lat,Lon,Lat,Lon" - v-model="coordinatesInput" - /> - <button - class="btn btn-sm btn-info position-absolute input-button-right" - @click="applyManualCoordinates" - style="top: 0; right: 0;" - v-if="coordinatesInputIsValid" - > - <font-awesome-icon icon="check" /> - </button> - </div> - <small class="d-flex text-left mt-2" v-if="startPoint && endPoint"> - <div class="text-nowrap mr-3"> - <b> <translate>Start</translate>: </b> <br /> - Lat: {{ startPoint[1] }} <br /> - Lon: {{ startPoint[0] }} - </div> - <div class="text-nowrap"> - <b>End:</b> <br /> - Lat: {{ endPoint[1] }} <br /> - Lon: {{ endPoint[0] }} - </div> - <button - v-clipboard:copy="coordinatesForClipboard" - v-clipboard:success="onCopyCoordinates" - class="btn btn-info btn-sm ml-auto mt-auto" - > - <font-awesome-icon icon="copy" /> - </button> - </small> - <div class="d-flex mt-3"> - <div - class="pr-3 w-50" - v-if="startPoint && endPoint && !selectedCut" - > - <button - class="btn btn-info btn-sm w-100" - @click="showLabelInput = !showLabelInput" - > - <font-awesome-icon :icon="showLabelInput ? 'times' : 'check'" /> - {{ showLabelInput ? "Cancel" : "Save" }} - </button> - </div> - <div - :class="startPoint && endPoint && !selectedCut ? 'w-50' : 'w-100'" - > - <button - class="btn btn-info btn-sm w-100" - @click="toggleCutTool" - :disabled="!selectedSurvey" - > - <font-awesome-icon :icon="cutToolEnabled ? 'times' : 'plus'" /> - {{ cutToolEnabled ? "Cancel" : "New" }} - </button> - </div> - </div> - <div v-if="showLabelInput" class="mt-2"> - <small class="text-muted"> - <translate>Enter label for cross profile</translate>: - </small> - <div class="position-relative"> - <input - class="form-control form-control-sm pr-5" - v-model="cutLabel" - /> - <button - class="btn btn-sm btn-info position-absolute input-button-right" - @click="saveCut" - v-if="cutLabel" - style="top: 0; right: 0;" - > - <font-awesome-icon icon="check" /> - </button> - </div> - </div> - </div> - </div> - </div> - </div> -</template> - -<style lang="scss" scoped> -.input-button-right { - border-top-right-radius: $border-radius; - border-bottom-right-radius: $border-radius; - border-top-left-radius: 0 !important; - border-bottom-left-radius: 0 !important; -} - -.rounded-left-only { - border-top-right-radius: 0 !important; - border-bottom-right-radius: 0 !important; - border-top-left-radius: $border-radius; - border-bottom-left-radius: $border-radius; -} - -input, -select { - font-size: 0.8em; -} -</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): - * Markus Kottländer <markus.kottlaender@intevation.de> - */ -import { mapState, mapGetters } from "vuex"; -import Feature from "ol/Feature"; -import LineString from "ol/geom/LineString"; -import { displayError, displayInfo } from "@/lib/errors"; -import { HTTP } from "@/lib/http"; -import { COMPARESURVEYS } from "@/components/paneSetups"; - -export default { - name: "profiles", - data() { - return { - coordinatesInput: "", - cutLabel: "", - showLabelInput: false - }; - }, - computed: { - ...mapState("application", ["showProfiles", "paneSetup"]), - ...mapState("map", ["openLayersMaps", "syncedMaps", "cutToolEnabled"]), - ...mapState("bottlenecks", [ - "bottlenecksList", - "surveys", - "surveysLoading" - ]), - ...mapState("fairwayprofile", [ - "previousCuts", - "startPoint", - "endPoint", - "profileLoading", - "differencesLoading", - "waterLevels", - "currentProfile" - ]), - ...mapGetters("map", ["openLayersMap"]), - ...mapGetters("bottlenecks", ["orderedBottlenecks"]), - profilesLable() { - return this.$gettext("Bottleneck Surveys"); - }, - selectedBottleneck: { - get() { - return this.$store.state.bottlenecks.selectedBottleneck; - }, - set(name) { - this.$store.dispatch("bottlenecks/setSelectedBottleneck", name); - } - }, - selectedWaterLevel: { - get() { - return this.$store.state.fairwayprofile.selectedWaterLevel; - }, - set(value) { - this.$store.commit("fairwayprofile/setSelectedWaterLevel", value); - } - }, - selectedSurvey: { - get() { - return this.$store.state.bottlenecks.selectedSurvey; - }, - set(survey) { - this.$store.commit("fairwayprofile/additionalSurvey", null); - this.$store.commit("bottlenecks/selectedSurvey", survey); - } - }, - additionalSurvey: { - get() { - return this.$store.state.fairwayprofile.additionalSurvey; - }, - set(survey) { - this.$store.commit("fairwayprofile/additionalSurvey", survey); - } - }, - selectedCut: { - get() { - return this.$store.state.fairwayprofile.selectedCut; - }, - set(cut) { - this.$store.commit("fairwayprofile/selectedCut", cut); - if (!cut) { - this.$store.commit("fairwayprofile/clearCurrentProfile"); - this.openLayersMaps.forEach(m => { - m.getLayer("CUTTOOL") - .getSource() - .clear(); - }); - } - } - }, - additionalSurveys() { - return this.surveys.filter( - survey => survey.date_info !== this.selectedSurvey.date_info - ); - }, - coordinatesForClipboard() { - return ( - this.startPoint[1] + - "," + - this.startPoint[0] + - "," + - this.endPoint[1] + - "," + - this.endPoint[0] - ); - }, - coordinatesInputIsValid() { - const coordinates = this.coordinatesInput - .split(",") - .map(coord => parseFloat(coord.trim())) - .filter(c => Number(c) === c); - return coordinates.length === 4; - }, - differencesVisible() { - return ( - this.openLayersMap(COMPARESURVEYS.compare.id) && - !this.openLayersMap(COMPARESURVEYS.compare.id) - .getLayer("BOTTLENECKISOLINE") - .getVisible() && - this.openLayersMap(COMPARESURVEYS.compare.id) - .getLayer("DIFFERENCES") - .getVisible() - ); - }, - rotatePanesTooltip() { - return this.$gettext("Rotate Maps"); - }, - syncMapsTooltip() { - return this.$gettext( - this.mapsAreSynced ? "Unsynchronize Maps" : "Synchronize Maps" - ); - }, - mapsAreSynced() { - return this.syncedMaps.includes(COMPARESURVEYS.compare.id); - }, - bottleneck() { - return this.openLayersMap() - ? this.openLayersMap() - .getLayer("BOTTLENECKS") - .getSource() - .getFeatures() - .find(f => f.get("objnam") === this.selectedBottleneck) - : null; - } - }, - watch: { - selectedBottleneck() { - this.$store.dispatch("fairwayprofile/previousCuts"); - this.cutLabel = - this.selectedBottleneck + " (" + new Date().toISOString() + ")"; - }, - selectedSurvey(survey) { - this.loadProfile(survey); - }, - additionalSurvey(survey) { - if (survey) { - this.loadDifferences(); - this.$store.commit( - "application/paneSetup", - Object.keys(this.currentProfile).length - ? "COMPARESURVEYS_FAIRWAYPROFILE" - : "COMPARESURVEYS" - ); - this.$store.commit("map/syncedMaps", [COMPARESURVEYS.compare.id]); - } else { - this.$store.commit( - "application/paneSetup", - Object.keys(this.currentProfile).length ? "FAIRWAYPROFILE" : "DEFAULT" - ); - this.$store.commit("map/syncedMaps", []); - } - this.loadProfile(survey); - }, - selectedCut(cut) { - if (cut) { - this.applyCoordinates(cut.coordinates); - } - } - }, - methods: { - toggleSyncMaps() { - if (this.mapsAreSynced) { - this.$store.commit( - "map/syncedMaps", - this.syncedMaps.filter(m => m !== COMPARESURVEYS.compare.id) - ); - } else { - this.$store.commit("map/syncedMaps", [COMPARESURVEYS.compare.id]); - } - }, - loadDifferences() { - this.$store.commit("fairwayprofile/setDifferencesLoading", true); - HTTP.post( - "/diff", - { - bottleneck: this.selectedSurvey.bottleneck_id, - minuend: this.selectedSurvey.date_info, - subtrahend: this.additionalSurvey.date_info - }, - { - headers: { - "X-Gemma-Auth": localStorage.getItem("token") - } - } - ) - .then() - .catch(error => { - let status, data, message; - if (error.response) { - status = error.response.status; - data = error.response.data; - message = `${status}: ${data.message || data}`; - } else { - message = error; - } - displayError({ - title: this.$gettext("Backend Error"), - message: message - }); - }) - .finally(() => { - this.$store.commit("fairwayprofile/setDifferencesLoading", false); - }); - }, - showDifferences() { - this.openLayersMap(COMPARESURVEYS.compare.id) - .getLayer("BOTTLENECKISOLINE") - .setVisible(false); - this.openLayersMap(COMPARESURVEYS.compare.id) - .getLayer("DIFFERENCES") - .setVisible(true); - }, - showSurvey() { - this.openLayersMap(COMPARESURVEYS.compare.id) - .getLayer("BOTTLENECKISOLINE") - .setVisible(true); - this.openLayersMap(COMPARESURVEYS.compare.id) - .getLayer("DIFFERENCES") - .setVisible(false); - }, - close() { - this.$store.commit("application/showProfiles", false); - }, - loadProfile(survey) { - if (survey) { - this.$store.commit("fairwayprofile/profileLoading", true); - this.$store - .dispatch("fairwayprofile/loadProfile", survey) - .finally(() => { - this.$store.commit("fairwayprofile/profileLoading", false); - }); - } - }, - toggleCutTool() { - this.$store.commit("map/cutToolEnabled", !this.cutToolEnabled); - this.$store.commit("map/lineToolEnabled", false); - this.$store.commit("map/polygonToolEnabled", false); - this.$store.commit("map/setCurrentMeasurement", null); - }, - onCopyCoordinates() { - displayInfo({ - message: this.$gettext("Coordinates copied to clipboard!") - }); - }, - applyManualCoordinates() { - const coordinates = this.coordinatesInput - .split(",") - .map(coord => parseFloat(coord.trim())); - this.selectedCut = null; - this.coordinatesInput = ""; - this.applyCoordinates([ - coordinates[1], - coordinates[0], - coordinates[3], - coordinates[2] - ]); - }, - applyCoordinates(coordinates) { - // allow only numbers - coordinates = coordinates.filter(c => Number(c) === c); - if (coordinates.length === 4) { - // draw line on map - this.openLayersMaps.forEach(m => { - m.getLayer("CUTTOOL") - .getSource() - .clear(); - }); - const cut = new Feature({ - geometry: new LineString([ - [coordinates[0], coordinates[1]], - [coordinates[2], coordinates[3]] - ]).transform("EPSG:4326", "EPSG:3857") - }); - this.openLayersMaps.forEach(m => { - m.getLayer("CUTTOOL") - .getSource() - .addFeature(cut); - }); - - // draw diagram - this.$store.dispatch("fairwayprofile/cut", cut); - } else { - displayError({ - title: this.$gettext("Invalid input"), - message: this.$gettext( - "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon" - ) - }); - } - }, - saveCut() { - const previousCuts = - JSON.parse(localStorage.getItem("previousCuts")) || []; - const newEntry = { - label: this.cutLabel, - bottleneckName: this.selectedBottleneck, - coordinates: [...this.startPoint, ...this.endPoint], - timestamp: new Date().getTime() - }; - const existingEntry = previousCuts.find(cut => { - return JSON.stringify(cut) === JSON.stringify(newEntry); - }); - if (!existingEntry) previousCuts.push(newEntry); - if (previousCuts.length > 100) previousCuts.shift(); - localStorage.setItem("previousCuts", JSON.stringify(previousCuts)); - this.$store.dispatch("fairwayprofile/previousCuts"); - - this.showLabelInput = false; - displayInfo({ - title: this.$gettext("Profile saved!"), - message: this.$gettext( - 'You can now select these coordinates from the "Saved cross profiles" menu to restore this cross profile.' - ) - }); - }, - deleteSelectedCut(cut) { - this.$store.commit("application/popup", { - icon: "trash", - title: this.$gettext("Delete cross profile"), - content: - this.$gettext("Do you really want to delete the cross profile:") + - `<br> - <b>${cut.label}</b>`, - confirm: { - label: this.$gettext("Delete"), - icon: "trash", - callback: () => { - let previousCuts = - JSON.parse(localStorage.getItem("previousCuts")) || []; - previousCuts = previousCuts.filter(cut => { - return JSON.stringify(cut) !== JSON.stringify(this.selectedCut); - }); - localStorage.setItem("previousCuts", JSON.stringify(previousCuts)); - this.$store.commit("fairwayprofile/selectedCut", null); - this.$store.dispatch("fairwayprofile/previousCuts"); - displayInfo({ title: this.$gettext("Profile deleted!") }); - } - }, - cancel: { - label: this.$gettext("Cancel"), - icon: "times" - } - }); - }, - moveToBottleneck() { - const bottleneck = this.bottlenecksList.find( - bn => bn.properties.name === this.selectedBottleneck - ); - if (!bottleneck) return; - this.$store.dispatch("map/moveToFeauture", { - feature: bottleneck, - zoom: 17, - preventZoomOut: true - }); - } - }, - mounted() { - this.$store.dispatch("bottlenecks/loadBottlenecksList"); - } -}; -</script>
--- a/client/src/components/importoverview/FairwayDimensionDetail.vue Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/components/importoverview/FairwayDimensionDetail.vue Thu Sep 05 17:02:03 2019 +0200 @@ -16,5 +16,70 @@ * Author(s): * Thomas Junk <thomas.junk@intevation.de> */ -export default {}; +import { HTTP } from "@/lib/http"; +import { WFS } from "ol/format"; +import { or as orFilter, equalTo as equalToFilter } from "ol/format/filter"; +//import { displayError } from "@/lib/errors"; +import { mapGetters } from "vuex"; +import Feature from "ol/Feature"; +import Polygon from "ol/geom/Polygon"; + +const getFromWFS = (type, filter) => { + return new Promise((resolve, reject) => { + var featureCollectionRequest = new WFS().writeGetFeature({ + srsName: "EPSG:4326", + featureNS: "gemma", + featurePrefix: "gemma", + featureTypes: [type], + outputFormat: "application/json", + filter: filter + }); + HTTP.post( + "/internal/wfs", + new XMLSerializer().serializeToString(featureCollectionRequest), + { + headers: { + "X-Gemma-Auth": localStorage.getItem("token"), + "Content-type": "text/xml; charset=UTF-8" + } + } + ) + .then(response => { + resolve(response); + }) + .catch(error => { + reject(error); + }); + }); +}; + +export default { + props: ["summary"], + mounted() { + const ids = this.fairWayDimensionIDs.map(id => { + return equalToFilter("id", id); + }); + getFromWFS("fairway_dimensions", orFilter(...ids)).then(response => { + let { features } = response.data; + const fairwaydimensionLayer = this.openLayersMap().getLayer( + "FDREVIEWLAYER" + ); + features = features.map(f => { + let result = new Feature({ + geometry: new Polygon(f.geometry.coordinates) + }); + result.setId(f.id); + return result; + }); + fairwaydimensionLayer.setVisible(true); + fairwaydimensionLayer.getSource().addFeatures(features); + }); + }, + computed: { + ...mapGetters("map", ["openLayersMap"]), + fairWayDimensionIDs() { + return this.summary["fd-area"].map(e => e.id); + } + } +}; </script>
--- a/client/src/components/importoverview/LogDetail.vue Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/components/importoverview/LogDetail.vue Thu Sep 05 17:02:03 2019 +0200 @@ -35,7 +35,7 @@ v-if="entry.id === showAdditional && isPending && (isFD || isAGM || isBN)" class="d-flex border-bottom" > - <FairwayDimensionDetail v-if="isFD" /> + <FairwayDimensionDetail :summary="details.summary" v-if="isFD" /> <ApprovedGaugeMeasurementDetail v-if="isAGM" /> <BottleneckDetail :entry="entry" v-if="isBN" /> </div>
--- a/client/src/components/layers/LegendElement.vue Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/components/layers/LegendElement.vue Thu Sep 05 17:02:03 2019 +0200 @@ -113,7 +113,7 @@ `&legend_options=columns:4;fontAntiAliasing:true`; } else { this.url = - `/internal/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=` + + `/internal/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&SCALE=80000&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=` + this.layer.getSource().getParams().LAYERS + `&legend_options=columns:1;fontAntiAliasing:true;forceLabels:off`; }
--- a/client/src/components/map/layers.js Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/components/map/layers.js Thu Sep 05 17:02:03 2019 +0200 @@ -180,6 +180,13 @@ // Shared feature source for layers: // BOTTLENECKS, BOTTLENECKSTATUS and BOTTLENECKFAIRWAYAVAILABILITY // Reduces bottlenecks_geoserver requests and number of stored feature objects. + const FDREVIEWLAYER = new VectorLayer({ + id: "FDREVIEWLAYER", + label: "Review", + visible: true, + source: new VectorSource(), + style: styles.sections + }); const bottlenecksSource = new VectorSource({ strategy: bboxStrategy }); bottlenecksSource.setLoader( buildVectorLoader( @@ -637,7 +644,8 @@ }); })(), DRAWLAYER, - CUTLAYER + CUTLAYER, + FDREVIEWLAYER ]; layerConfigs[mapId] = config;
--- a/client/src/components/map/styles.js Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/components/map/styles.js Thu Sep 05 17:02:03 2019 +0200 @@ -221,22 +221,25 @@ } if (feature.get("fa_critical") && feature.get("fa_data")) { let data = feature.get("fa_data"); - let lnwlHeight = (80 / 100) * data.ldc; - let belowThresholdHeight = (80 / 100) * data.below; - let betweenThresholdHeight = (80 / 100) * data.between; - let aboveThresholdHeight = (80 / 100) * data.above; - + const heightInPixel = 82; + const relativeHeightInPercent = heightInPixel / 100; + let lnwlHeight = relativeHeightInPercent * data.ldc; + let belowThresholdHeight = relativeHeightInPercent * data.below; + let betweenThresholdHeight = relativeHeightInPercent * data.between; + let aboveThresholdHeight = relativeHeightInPercent * data.above; + let lnwl = `<rect x='2' y='${heightInPixel - + lnwlHeight}' width='10' height='${lnwlHeight}' stroke-width='0' fill='aqua'/>`; + let above = `<rect x='12' y='${heightInPixel - + aboveThresholdHeight}' width='18' height='${aboveThresholdHeight}' stroke-width='0' fill='blue'/>`; + let between = `<rect x='12' y='${heightInPixel - + aboveThresholdHeight - + betweenThresholdHeight}' width='18' height='${betweenThresholdHeight}' stroke-width='0' fill='darksalmon'/>`; + let below = `<rect x='12' y='${heightInPixel - + aboveThresholdHeight - + betweenThresholdHeight - + belowThresholdHeight}' width='18' height='${belowThresholdHeight}' stroke-width='0' fill='hotpink'/>`; let frame = `<rect x='0' y='0' width='32' height='84' stroke-width='0' fill='white'/>`; - let lnwl = `<rect x='2' y='${80 - - lnwlHeight + - 2}' width='10' height='${lnwlHeight}' stroke-width='0' fill='aqua'/>`; - let range1 = `<rect x='12' y='2' width='18' height='${belowThresholdHeight}' stroke-width='0' fill='hotpink'/>`; - let range2 = `<rect x='12' y='${belowThresholdHeight + - 2}' width='18' height='${betweenThresholdHeight}' stroke-width='0' fill='darksalmon'/>`; - let range3 = `<rect x='12' y='${80 - - aboveThresholdHeight + - 2}' width='18' height='${aboveThresholdHeight}' stroke-width='0' fill='blue'/>`; - let svg = `data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='32' height='84'><g>${frame}${lnwl}${range1}${range2}${range3}</g></svg>`; + let svg = `data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='32' height='84'><g>${frame}${lnwl}${above}${between}${below}</g></svg>`; let bnCenter = getCenter(feature.getGeometry().getExtent()); s.push( new Style({
--- a/client/src/components/stretches/Stretches.vue Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/components/stretches/Stretches.vue Thu Sep 05 17:02:03 2019 +0200 @@ -48,6 +48,12 @@ /> </button> <button + class="btn btn-xs btn-dark mr-2" + @click="download(stretch)" + > + <font-awesome-icon icon="download" fixed-width /> + </button> + <button class="btn btn-xs btn-dark" @click="deleteStretch(stretch)" > @@ -99,6 +105,7 @@ import { displayError, displayInfo } from "@/lib/errors"; import { HTTP } from "@/lib/http"; import { sortTable } from "@/lib/mixins"; +import { format } from "date-fns"; export default { mixins: [sortTable], @@ -134,6 +141,23 @@ } }, methods: { + download(stretch) { + const { name } = stretch.properties; + HTTP.get(`/data/stretch/shape/${name}`, { + responseType: "blob", + headers: { + "X-Gemma-Auth": localStorage.getItem("token") + } + }).then(response => { + const link = document.createElement("a"); + const now = new Date(); + link.href = window.URL.createObjectURL(response.data); + link.download = `${name}-${format(now, "YYYY-mm-DD")}.zip`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }); + }, filteredStretches() { return this.stretches.filter(s => { return (s.properties.name + s.properties.source_organization)
--- a/client/src/components/systemconfiguration/ColorSettings.vue Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/components/systemconfiguration/ColorSettings.vue Thu Sep 05 17:02:03 2019 +0200 @@ -26,7 +26,12 @@ <div class="card-body p-0"> <chrome-picker v-model="f.strokeColor" - :class="{ hide: f.noOpacity }" + :class="{ + hide: + f.noOpacity || + f.name === 'Distance Marks' || + f.name === 'Distance Marks, Axis' + }" /> </div> </div> @@ -144,14 +149,12 @@ { name: "Distance Marks, Axis", strokeColor: initSColor, - fillColor: initSColor, - noOpacity: true + fillColor: initSColor }, { name: "Distance Marks", strokeColor: initSColor, - fillColor: initSColor, - noOpacity: true + fillColor: initSColor }, { name: "Waterway profiles", @@ -258,12 +261,7 @@ fillC = feature.fillColor ? feature.fillColor.hex8 || feature.fillColor : initFColor; - // Now we do not handle alpha-color value for WMS-Layers - // ToDo: implementation in front-backend. - let strokeCForWMS = feature.strokeColor.hex || feature.strokeColor, - fillCForWMS = feature.fillColor - ? feature.fillColor.hex || feature.fillColor - : initFColor; + let strokeCForWMS = feature.strokeColor.hex || feature.strokeColor; let noChangeMsg = name => { displayInfo({ title: name + ":", @@ -413,12 +411,12 @@ case "Distance Marks, Axis": { if ( strokeCForWMS !== this.config.distance_marks_stroke || - fillCForWMS !== this.config.distance_marks_fill + fillC !== this.config.distance_marks_fill ) { this.$store .dispatch("application/saveConfig", { distance_marks_stroke: strokeCForWMS, - distance_marks_fill: fillCForWMS + distance_marks_fill: fillC }) .finally(() => this.$store.dispatch("application/loadConfig")); } else { @@ -429,12 +427,12 @@ case "Distance Marks": { if ( strokeCForWMS !== this.config.distance_marks_ashore_stroke || - fillCForWMS !== this.config.distance_marks_ashore_fill + fillC !== this.config.distance_marks_ashore_fill ) { this.$store .dispatch("application/saveConfig", { distance_marks_ashore_stroke: strokeCForWMS, - distance_marks_ashore_fill: fillCForWMS + distance_marks_ashore_fill: fillC }) .finally(() => this.$store.dispatch("application/loadConfig")); } else {
--- a/client/src/locale/bg_BG/LC_MESSAGES/app.po Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/locale/bg_BG/LC_MESSAGES/app.po Thu Sep 05 17:02:03 2019 +0200 @@ -91,6 +91,10 @@ msgid "Accesslog" msgstr "" +#: src/components/identify/Identify.vue:59 +msgid "According gauge data:" +msgstr "" + #: src/components/usermanagement/Userdetail.vue:242 #: src/components/usermanagement/Usermanagement.vue:82 msgid "Add User" @@ -112,7 +116,7 @@ msgid "April" msgstr "" -#: src/store/map.js:207 +#: src/store/map.js:214 msgid "Area" msgstr "Район" @@ -124,6 +128,18 @@ msgid "August" msgstr "" +#: src/components/identify/Identify.vue:324 +msgid "Avail: Below treshold" +msgstr "" + +#: src/components/identify/Identify.vue:321 +msgid "Avail: Last measurement <" +msgstr "" + +#: src/components/identify/Identify.vue:327 +msgid "Avail: Latest measurement older than" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:61 msgid "Availability of Gauge Measurements" msgstr "" @@ -170,7 +186,7 @@ #: src/components/gauge/HydrologicalConditions.vue:237 #: src/components/gauge/HydrologicalConditions.vue:1040 #: src/components/gauge/Waterlevel.vue:240 -#: src/components/gauge/Waterlevel.vue:1164 +#: src/components/gauge/Waterlevel.vue:1178 #: src/components/importconfiguration/Import.vue:130 #: src/components/importconfiguration/Import.vue:147 #: src/components/importconfiguration/Import.vue:166 @@ -193,15 +209,15 @@ #: src/components/importoverview/LogEntry.vue:160 #: src/components/importoverview/SectionDetails.vue:109 #: src/components/importoverview/StretchDetails.vue:113 -#: src/components/layers/Layerselect.vue:137 src/components/map/Map.vue:203 +#: src/components/layers/Layerselect.vue:158 src/components/map/Map.vue:213 #: src/components/sections/SectionForm.vue:339 -#: src/components/sections/Sections.vue:179 -#: src/components/sections/Sections.vue:189 -#: src/components/sections/Sections.vue:231 +#: src/components/sections/Sections.vue:170 +#: src/components/sections/Sections.vue:180 +#: src/components/sections/Sections.vue:222 #: src/components/stretches/StretchForm.vue:362 -#: src/components/stretches/Stretches.vue:179 -#: src/components/stretches/Stretches.vue:189 -#: src/components/stretches/Stretches.vue:241 +#: src/components/stretches/Stretches.vue:170 +#: src/components/stretches/Stretches.vue:180 +#: src/components/stretches/Stretches.vue:232 #: src/components/systemconfiguration/PDFTemplates.vue:165 #: src/components/systemconfiguration/PDFTemplates.vue:254 #: src/components/systemconfiguration/PDFTemplates.vue:292 @@ -248,7 +264,7 @@ #: src/components/fairway/Profiles.vue:654 #: src/components/importconfiguration/Import.vue:204 #: src/components/importoverview/ImportOverview.vue:447 -#: src/components/stretches/Stretches.vue:215 +#: src/components/stretches/Stretches.vue:206 #: src/components/systemconfiguration/PDFTemplates.vue:331 #: src/components/usermanagement/Usermanagement.vue:268 msgid "Cancel" @@ -263,7 +279,7 @@ msgid "Choose a distance mark by clicking on the map." msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:275 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:294 msgid "Choose color" msgstr "" @@ -291,6 +307,14 @@ msgid "Compare with" msgstr "" +#: src/components/identify/Identify.vue:343 +msgid "Confidence per 24h" +msgstr "" + +#: src/components/identify/Identify.vue:342 +msgid "Confidence per 72h" +msgstr "" + #: src/components/Sidebar.vue:65 msgid "Configuration" msgstr "" @@ -323,11 +347,6 @@ msgid "Cronstring" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:6 -#, fuzzy -msgid "Currency of Bottleneck Surveys" -msgstr "Критични участъци" - #: src/components/fairway/Profiles.vue:59 msgid "Current Waterlevel" msgstr "" @@ -336,21 +355,21 @@ msgid "Data Availability/Accuracy" msgstr "" -#: src/components/identify/Identify.vue:194 -msgid "Data too old. Treshold: " +#: src/components/identify/Identify.vue:360 +msgid "Data too old. Treshold:" msgstr "" -#: src/components/identify/Identify.vue:191 -msgid "Data within revisiting treshold " +#: src/components/identify/Identify.vue:357 +msgid "Data within revisiting treshold" msgstr "" -#: src/components/identify/Identify.vue:189 +#: src/components/identify/Identify.vue:355 msgid "Data within the revisiting time" msgstr "" #: src/components/importconfiguration/types/Soundingresults.vue:94 -#: src/components/sections/Sections.vue:136 -#: src/components/stretches/Stretches.vue:136 +#: src/components/sections/Sections.vue:127 +#: src/components/stretches/Stretches.vue:127 #: src/components/systemconfiguration/PDFTemplates.vue:120 msgid "Date" msgstr "" @@ -392,7 +411,7 @@ msgid "Define sections" msgstr "" -#: src/components/sections/Sections.vue:130 +#: src/components/sections/Sections.vue:121 msgid "Define Sections" msgstr "" @@ -400,13 +419,13 @@ msgid "Define stretches" msgstr "" -#: src/components/stretches/Stretches.vue:130 +#: src/components/stretches/Stretches.vue:121 msgid "Define Stretches" msgstr "" #: src/components/fairway/Profiles.vue:639 #: src/components/importconfiguration/Import.vue:182 -#: src/components/stretches/Stretches.vue:205 +#: src/components/stretches/Stretches.vue:196 #: src/components/systemconfiguration/PDFTemplates.vue:308 #: src/components/usermanagement/Usermanagement.vue:242 msgid "Delete" @@ -420,7 +439,7 @@ msgid "Delete Import" msgstr "" -#: src/components/stretches/Stretches.vue:197 +#: src/components/stretches/Stretches.vue:188 msgid "Delete Stretch" msgstr "" @@ -448,8 +467,8 @@ msgid "deleted successfully" msgstr "" -#: src/components/sections/Sections.vue:206 -#: src/components/stretches/Stretches.vue:210 +#: src/components/sections/Sections.vue:197 +#: src/components/stretches/Stretches.vue:201 msgid "Deleting " msgstr "" @@ -477,11 +496,11 @@ msgid "Depthreference" msgstr "" -#: src/components/identify/formatter.js:62 +#: src/components/identify/formatter.js:68 msgid "Distance Mark" msgstr "" -#: src/components/identify/formatter.js:65 +#: src/components/identify/formatter.js:71 msgid "Distance Mark ashore" msgstr "" @@ -509,11 +528,11 @@ msgid "Do you really want to delete the import with ID" msgstr "" -#: src/components/stretches/Stretches.vue:199 +#: src/components/stretches/Stretches.vue:190 msgid "Do you really want to delete this stretch:" msgstr "" -#: src/components/identify/Identify.vue:76 +#: src/components/identify/Identify.vue:130 msgid "Download" msgstr "" @@ -689,15 +708,15 @@ msgid "G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:96 +#: src/components/identify/formatter.js:102 msgid "Gauge" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:195 +msgid "Gauge Forecast Confidence" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:124 -msgid "Gauge Forecast Confidence" -msgstr "" - -#: src/components/systemconfiguration/DataAccuracy.vue:197 msgid "Gauge Forecast vs. Reality" msgstr "" @@ -726,10 +745,14 @@ msgid "Generated by" msgstr "" -#: src/components/identify/Identify.vue:106 +#: src/components/identify/Identify.vue:160 msgid "Generated PDFs use font:" msgstr "" +#: src/components/identify/Identify.vue:340 +msgid "Highest confidence" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1062 msgid "hour" msgstr "" @@ -756,7 +779,7 @@ msgid "ID" msgstr "" -#: src/components/identify/Identify.vue:179 src/components/map/MapPopup.vue:148 +#: src/components/identify/Identify.vue:240 src/components/map/MapPopup.vue:148 #: src/components/toolbar/Identify.vue:49 msgid "Identified Features" msgstr "" @@ -864,11 +887,11 @@ msgid "Latest Measurement" msgstr "" -#: src/components/identify/formatter.js:100 +#: src/components/identify/formatter.js:106 msgid "Latest Waterlevel" msgstr "" -#: src/components/identify/formatter.js:99 +#: src/components/identify/formatter.js:105 msgid "Latest Waterlevel Date" msgstr "" @@ -877,7 +900,7 @@ msgid "Layers" msgstr "Слоеве" -#: src/store/map.js:180 +#: src/store/map.js:187 msgid "Length" msgstr "" @@ -946,7 +969,7 @@ msgid "Measurement" msgstr "" -#: src/components/identify/formatter.js:102 +#: src/components/identify/formatter.js:108 msgid "Measurement Count in Last 14 Days" msgstr "" @@ -954,13 +977,13 @@ msgid "measurements in the last 14 days." msgstr "" -#: src/components/identify/formatter.js:79 -#: src/components/identify/formatter.js:90 +#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:96 msgid "Min. G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:77 -#: src/components/identify/formatter.js:88 +#: src/components/identify/formatter.js:83 +#: src/components/identify/formatter.js:94 msgid "Min. Gauge Waterlevel Date" msgstr "" @@ -990,13 +1013,27 @@ #: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:6 #: src/components/identify/formatter.js:7 -#: src/components/sections/Sections.vue:133 -#: src/components/stretches/Stretches.vue:133 +#: src/components/sections/Sections.vue:124 +#: src/components/stretches/Stretches.vue:124 #: src/components/systemconfiguration/PDFTemplates.vue:117 #, fuzzy msgid "Name" msgstr "име" +#: src/components/identify/Identify.vue:252 +#: src/components/identify/Identify.vue:253 +#: src/components/identify/Identify.vue:254 +#: src/components/identify/Identify.vue:266 +#: src/components/identify/Identify.vue:267 +#: src/components/identify/Identify.vue:268 +msgid "Nash-Sutcliffe" +msgstr "" + +#: src/components/identify/Identify.vue:255 +#: src/components/identify/Identify.vue:269 +msgid "Nash-Sutcliffe not available" +msgstr "" + #: src/components/sections/SectionForm.vue:131 #: src/components/stretches/StretchForm.vue:148 msgid "National Object name" @@ -1019,11 +1056,11 @@ msgid "New import" msgstr "" -#: src/components/sections/Sections.vue:75 +#: src/components/sections/Sections.vue:66 msgid "New section" msgstr "" -#: src/components/stretches/Stretches.vue:75 +#: src/components/stretches/Stretches.vue:66 msgid "New stretch" msgstr "" @@ -1037,7 +1074,7 @@ msgid "No data available." msgstr "" -#: src/components/identify/Identify.vue:68 +#: src/components/identify/Identify.vue:122 msgid "No features identified." msgstr "" @@ -1049,7 +1086,7 @@ msgid "No style-changes" msgstr "" -#: src/components/stretches/Stretches.vue:209 +#: src/components/stretches/Stretches.vue:200 msgid "Not implemented" msgstr "" @@ -1058,7 +1095,7 @@ msgstr "" #: src/components/gauge/HydrologicalConditions.vue:630 -#: src/components/gauge/Waterlevel.vue:725 +#: src/components/gauge/Waterlevel.vue:735 msgid "Now" msgstr "" @@ -1312,6 +1349,11 @@ msgid "quarterly" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:6 +#, fuzzy +msgid "Recency of Bottleneck Surveys" +msgstr "Критични участъци" + #: src/components/Pdftool.vue:722 msgid "Ref gauge" msgstr "" @@ -1343,8 +1385,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:44 #: src/components/systemconfiguration/DataAccuracy.vue:274 #: src/components/systemconfiguration/MapLayers.vue:58 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:97 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:198 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:101 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:208 msgid "Reset to defaults" msgstr "" @@ -1360,8 +1402,8 @@ msgid "retryDescription" msgstr "" -#: src/components/sections/Sections.vue:142 -#: src/components/stretches/Stretches.vue:142 +#: src/components/sections/Sections.vue:133 +#: src/components/stretches/Stretches.vue:133 msgid "Review pending import" msgstr "" @@ -1374,6 +1416,10 @@ msgid "Rotate Maps" msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:312 +msgid "Same value is used in multiple fields. Please check" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1074 msgid "Saturday" msgstr "" @@ -1408,7 +1454,7 @@ msgid "Scheduled" msgstr "" -#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:91 msgid "Section" msgstr "" @@ -1441,8 +1487,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:38 #: src/components/systemconfiguration/DataAccuracy.vue:271 #: src/components/systemconfiguration/MapLayers.vue:55 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:91 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:192 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:95 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:202 msgid "Send" msgstr "" @@ -1482,7 +1528,7 @@ msgid "Simple" msgstr "" -#: src/components/identify/Identify.vue:93 +#: src/components/identify/Identify.vue:147 msgid "" "Some data ©\n" " <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n" @@ -1501,7 +1547,7 @@ msgid "Sounding Result" msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:102 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:109 msgid "Sounding Result Comparison" msgstr "" @@ -1509,8 +1555,8 @@ msgid "Soundingresults" msgstr "" -#: src/components/sections/Sections.vue:139 -#: src/components/stretches/Stretches.vue:139 +#: src/components/sections/Sections.vue:130 +#: src/components/stretches/Stretches.vue:130 msgid "Source organization" msgstr "" @@ -1524,11 +1570,11 @@ msgid "Source orgranization" msgstr "" -#: src/components/identify/Identify.vue:90 +#: src/components/identify/Identify.vue:144 msgid "source-code" msgstr "" -#: src/components/sections/Sections.vue:205 +#: src/components/sections/Sections.vue:196 msgid "Staging Area" msgstr "" @@ -1561,7 +1607,7 @@ msgid "Status" msgstr "" -#: src/components/identify/formatter.js:74 +#: src/components/identify/formatter.js:80 msgid "Stretch" msgstr "" @@ -1616,7 +1662,7 @@ msgid "Testmail sent" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:132 +#: src/components/systemconfiguration/DataAccuracy.vue:203 msgid "" "The highest confidence value is less than\n" " <b>%{gm24} cm</b>\n" @@ -1625,13 +1671,13 @@ " within last 72 hours." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:177 +#: src/components/systemconfiguration/DataAccuracy.vue:248 msgid "" "The highest confidence value within the last 24 hours is\n" " greater than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:155 +#: src/components/systemconfiguration/DataAccuracy.vue:226 msgid "" "The highest confidence value within the last 72 hours is\n" " greater than" @@ -1664,19 +1710,19 @@ " respective bottleneck." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:250 +#: src/components/systemconfiguration/DataAccuracy.vue:177 msgid "" "The Nash-Sutcliffe coefficient for last 24 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:230 +#: src/components/systemconfiguration/DataAccuracy.vue:157 msgid "" "The Nash-Sutcliffe coefficient for last 72 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:205 +#: src/components/systemconfiguration/DataAccuracy.vue:132 msgid "" "The Nash-Sutcliffe coefficient is greater than\n" " <b>%{nsc24}</b>\n" @@ -1689,6 +1735,10 @@ msgid "The provided template has no name property." msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:331 +msgid "There are invalid classbreak values. Please check" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:88 msgid "There are less than" msgstr "" @@ -1700,11 +1750,11 @@ #: src/components/fairway/Profiles.vue:423 #: src/components/importconfiguration/types/Soundingresults.vue:232 #: src/components/importconfiguration/types/Soundingresults.vue:251 -#: src/components/layers/Layerselect.vue:67 +#: src/components/layers/Layerselect.vue:68 msgid "this" msgstr "" -#: src/components/identify/Identify.vue:84 +#: src/components/identify/Identify.vue:138 msgid "" "This app uses <i>gemma</i>, which is Free Software under <br/>\n" " %{ license } without warranty, see docs for details." @@ -1792,8 +1842,8 @@ msgid "URL" msgstr "" -#: src/components/identify/Identify.vue:80 -#: src/components/identify/Identify.vue:182 +#: src/components/identify/Identify.vue:134 +#: src/components/identify/Identify.vue:243 msgid "User Manual" msgstr "" @@ -1810,7 +1860,7 @@ msgid "Users" msgstr "" -#: src/components/identify/Identify.vue:99 +#: src/components/identify/Identify.vue:153 msgid "" "Uses\n" " <a href=\"https://download.geonames.org/export/dump/readme.txt" @@ -1836,7 +1886,7 @@ msgstr "" #: src/components/gauge/HydrologicalConditions.vue:663 -#: src/components/gauge/Waterlevel.vue:611 +#: src/components/gauge/Waterlevel.vue:613 msgid "Waterlevel [m]" msgstr "" @@ -1857,7 +1907,7 @@ msgid "Waterway area" msgstr "" -#: src/components/identify/formatter.js:59 +#: src/components/identify/formatter.js:65 msgid "Waterway Area" msgstr "" @@ -1865,7 +1915,7 @@ msgid "Waterway axis" msgstr "" -#: src/components/identify/formatter.js:68 +#: src/components/identify/formatter.js:74 msgid "Waterway Axis" msgstr "" @@ -1873,7 +1923,7 @@ msgid "Waterway gauges" msgstr "" -#: src/components/identify/formatter.js:71 +#: src/components/identify/formatter.js:77 msgid "Waterway Profile" msgstr ""
--- a/client/src/locale/de_AT/LC_MESSAGES/app.po Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/locale/de_AT/LC_MESSAGES/app.po Thu Sep 05 17:02:03 2019 +0200 @@ -92,6 +92,10 @@ msgid "Accesslog" msgstr "Zugriffs-Protokoll" +#: src/components/identify/Identify.vue:59 +msgid "According gauge data:" +msgstr "" + #: src/components/usermanagement/Userdetail.vue:242 #: src/components/usermanagement/Usermanagement.vue:82 msgid "Add User" @@ -114,7 +118,7 @@ msgid "April" msgstr "April" -#: src/store/map.js:207 +#: src/store/map.js:214 msgid "Area" msgstr "Fläche" @@ -126,6 +130,20 @@ msgid "August" msgstr "August" +#: src/components/identify/Identify.vue:324 +msgid "Avail: Below treshold" +msgstr "" + +#: src/components/identify/Identify.vue:321 +#, fuzzy +msgid "Avail: Last measurement <" +msgstr "Messung" + +#: src/components/identify/Identify.vue:327 +#, fuzzy +msgid "Avail: Latest measurement older than" +msgstr "Messung" + #: src/components/systemconfiguration/DataAccuracy.vue:61 #, fuzzy msgid "Availability of Gauge Measurements" @@ -177,7 +195,7 @@ #: src/components/gauge/HydrologicalConditions.vue:237 #: src/components/gauge/HydrologicalConditions.vue:1040 #: src/components/gauge/Waterlevel.vue:240 -#: src/components/gauge/Waterlevel.vue:1164 +#: src/components/gauge/Waterlevel.vue:1178 #: src/components/importconfiguration/Import.vue:130 #: src/components/importconfiguration/Import.vue:147 #: src/components/importconfiguration/Import.vue:166 @@ -200,15 +218,15 @@ #: src/components/importoverview/LogEntry.vue:160 #: src/components/importoverview/SectionDetails.vue:109 #: src/components/importoverview/StretchDetails.vue:113 -#: src/components/layers/Layerselect.vue:137 src/components/map/Map.vue:203 +#: src/components/layers/Layerselect.vue:158 src/components/map/Map.vue:213 #: src/components/sections/SectionForm.vue:339 -#: src/components/sections/Sections.vue:179 -#: src/components/sections/Sections.vue:189 -#: src/components/sections/Sections.vue:231 +#: src/components/sections/Sections.vue:170 +#: src/components/sections/Sections.vue:180 +#: src/components/sections/Sections.vue:222 #: src/components/stretches/StretchForm.vue:362 -#: src/components/stretches/Stretches.vue:179 -#: src/components/stretches/Stretches.vue:189 -#: src/components/stretches/Stretches.vue:241 +#: src/components/stretches/Stretches.vue:170 +#: src/components/stretches/Stretches.vue:180 +#: src/components/stretches/Stretches.vue:232 #: src/components/systemconfiguration/PDFTemplates.vue:165 #: src/components/systemconfiguration/PDFTemplates.vue:254 #: src/components/systemconfiguration/PDFTemplates.vue:292 @@ -254,7 +272,7 @@ #: src/components/fairway/Profiles.vue:654 #: src/components/importconfiguration/Import.vue:204 #: src/components/importoverview/ImportOverview.vue:447 -#: src/components/stretches/Stretches.vue:215 +#: src/components/stretches/Stretches.vue:206 #: src/components/systemconfiguration/PDFTemplates.vue:331 #: src/components/usermanagement/Usermanagement.vue:268 #, fuzzy @@ -270,7 +288,7 @@ msgid "Choose a distance mark by clicking on the map." msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:275 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:294 msgid "Choose color" msgstr "" @@ -299,6 +317,14 @@ msgid "Compare with" msgstr "Vergleiche mit" +#: src/components/identify/Identify.vue:343 +msgid "Confidence per 24h" +msgstr "" + +#: src/components/identify/Identify.vue:342 +msgid "Confidence per 72h" +msgstr "" + #: src/components/Sidebar.vue:65 msgid "Configuration" msgstr "Konfiguration" @@ -331,11 +357,6 @@ msgid "Cronstring" msgstr "Crontab-Zeile" -#: src/components/systemconfiguration/DataAccuracy.vue:6 -#, fuzzy -msgid "Currency of Bottleneck Surveys" -msgstr "Seichtstellen" - #: src/components/fairway/Profiles.vue:59 msgid "Current Waterlevel" msgstr "" @@ -344,21 +365,21 @@ msgid "Data Availability/Accuracy" msgstr "" -#: src/components/identify/Identify.vue:194 -msgid "Data too old. Treshold: " +#: src/components/identify/Identify.vue:360 +msgid "Data too old. Treshold:" msgstr "" -#: src/components/identify/Identify.vue:191 -msgid "Data within revisiting treshold " +#: src/components/identify/Identify.vue:357 +msgid "Data within revisiting treshold" msgstr "" -#: src/components/identify/Identify.vue:189 +#: src/components/identify/Identify.vue:355 msgid "Data within the revisiting time" msgstr "" #: src/components/importconfiguration/types/Soundingresults.vue:94 -#: src/components/sections/Sections.vue:136 -#: src/components/stretches/Stretches.vue:136 +#: src/components/sections/Sections.vue:127 +#: src/components/stretches/Stretches.vue:127 #: src/components/systemconfiguration/PDFTemplates.vue:120 msgid "Date" msgstr "Datum" @@ -403,7 +424,7 @@ msgid "Define sections" msgstr "" -#: src/components/sections/Sections.vue:130 +#: src/components/sections/Sections.vue:121 msgid "Define Sections" msgstr "" @@ -411,13 +432,13 @@ msgid "Define stretches" msgstr "" -#: src/components/stretches/Stretches.vue:130 +#: src/components/stretches/Stretches.vue:121 msgid "Define Stretches" msgstr "" #: src/components/fairway/Profiles.vue:639 #: src/components/importconfiguration/Import.vue:182 -#: src/components/stretches/Stretches.vue:205 +#: src/components/stretches/Stretches.vue:196 #: src/components/systemconfiguration/PDFTemplates.vue:308 #: src/components/usermanagement/Usermanagement.vue:242 #, fuzzy @@ -434,7 +455,7 @@ msgid "Delete Import" msgstr "Neuer Import" -#: src/components/stretches/Stretches.vue:197 +#: src/components/stretches/Stretches.vue:188 #, fuzzy msgid "Delete Stretch" msgstr "Konto löschen" @@ -467,8 +488,8 @@ msgid "deleted successfully" msgstr "Erfolgreich" -#: src/components/sections/Sections.vue:206 -#: src/components/stretches/Stretches.vue:210 +#: src/components/sections/Sections.vue:197 +#: src/components/stretches/Stretches.vue:201 msgid "Deleting " msgstr "Löchen " @@ -497,11 +518,11 @@ msgid "Depthreference" msgstr "Tiefenreferenz" -#: src/components/identify/formatter.js:62 +#: src/components/identify/formatter.js:68 msgid "Distance Mark" msgstr "" -#: src/components/identify/formatter.js:65 +#: src/components/identify/formatter.js:71 msgid "Distance Mark ashore" msgstr "" @@ -529,11 +550,11 @@ msgid "Do you really want to delete the import with ID" msgstr "" -#: src/components/stretches/Stretches.vue:199 +#: src/components/stretches/Stretches.vue:190 msgid "Do you really want to delete this stretch:" msgstr "" -#: src/components/identify/Identify.vue:76 +#: src/components/identify/Identify.vue:130 msgid "Download" msgstr "Herunterladen" @@ -717,15 +738,15 @@ msgid "G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:96 +#: src/components/identify/formatter.js:102 msgid "Gauge" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:195 +msgid "Gauge Forecast Confidence" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:124 -msgid "Gauge Forecast Confidence" -msgstr "" - -#: src/components/systemconfiguration/DataAccuracy.vue:197 msgid "Gauge Forecast vs. Reality" msgstr "" @@ -756,11 +777,15 @@ msgid "Generated by" msgstr "– erstellt von:" -#: src/components/identify/Identify.vue:106 +#: src/components/identify/Identify.vue:160 #, fuzzy msgid "Generated PDFs use font:" msgstr "PDF generieren" +#: src/components/identify/Identify.vue:340 +msgid "Highest confidence" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1062 msgid "hour" msgstr "Stunde" @@ -787,7 +812,7 @@ msgid "ID" msgstr "ID" -#: src/components/identify/Identify.vue:179 src/components/map/MapPopup.vue:148 +#: src/components/identify/Identify.vue:240 src/components/map/MapPopup.vue:148 #: src/components/toolbar/Identify.vue:49 #, fuzzy msgid "Identified Features" @@ -905,12 +930,12 @@ msgid "Latest Measurement" msgstr "Messung" -#: src/components/identify/formatter.js:100 +#: src/components/identify/formatter.js:106 #, fuzzy msgid "Latest Waterlevel" msgstr "Messung" -#: src/components/identify/formatter.js:99 +#: src/components/identify/formatter.js:105 #, fuzzy msgid "Latest Waterlevel Date" msgstr "Messung" @@ -920,7 +945,7 @@ msgid "Layers" msgstr "Ebenen" -#: src/store/map.js:180 +#: src/store/map.js:187 msgid "Length" msgstr "Länge" @@ -990,7 +1015,7 @@ msgid "Measurement" msgstr "Messung" -#: src/components/identify/formatter.js:102 +#: src/components/identify/formatter.js:108 msgid "Measurement Count in Last 14 Days" msgstr "" @@ -998,13 +1023,13 @@ msgid "measurements in the last 14 days." msgstr "" -#: src/components/identify/formatter.js:79 -#: src/components/identify/formatter.js:90 +#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:96 msgid "Min. G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:77 -#: src/components/identify/formatter.js:88 +#: src/components/identify/formatter.js:83 +#: src/components/identify/formatter.js:94 msgid "Min. Gauge Waterlevel Date" msgstr "" @@ -1035,12 +1060,26 @@ #: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:6 #: src/components/identify/formatter.js:7 -#: src/components/sections/Sections.vue:133 -#: src/components/stretches/Stretches.vue:133 +#: src/components/sections/Sections.vue:124 +#: src/components/stretches/Stretches.vue:124 #: src/components/systemconfiguration/PDFTemplates.vue:117 msgid "Name" msgstr "Name" +#: src/components/identify/Identify.vue:252 +#: src/components/identify/Identify.vue:253 +#: src/components/identify/Identify.vue:254 +#: src/components/identify/Identify.vue:266 +#: src/components/identify/Identify.vue:267 +#: src/components/identify/Identify.vue:268 +msgid "Nash-Sutcliffe" +msgstr "" + +#: src/components/identify/Identify.vue:255 +#: src/components/identify/Identify.vue:269 +msgid "Nash-Sutcliffe not available" +msgstr "" + #: src/components/sections/SectionForm.vue:131 #: src/components/stretches/StretchForm.vue:148 #, fuzzy @@ -1065,11 +1104,11 @@ msgid "New import" msgstr "Neuer Import" -#: src/components/sections/Sections.vue:75 +#: src/components/sections/Sections.vue:66 msgid "New section" msgstr "" -#: src/components/stretches/Stretches.vue:75 +#: src/components/stretches/Stretches.vue:66 msgid "New stretch" msgstr "" @@ -1083,7 +1122,7 @@ msgid "No data available." msgstr "" -#: src/components/identify/Identify.vue:68 +#: src/components/identify/Identify.vue:122 msgid "No features identified." msgstr "Keine Objekte identifiziert." @@ -1095,7 +1134,7 @@ msgid "No style-changes" msgstr "" -#: src/components/stretches/Stretches.vue:209 +#: src/components/stretches/Stretches.vue:200 #, fuzzy msgid "Not implemented" msgstr "Nicht implementiert" @@ -1105,7 +1144,7 @@ msgstr "November" #: src/components/gauge/HydrologicalConditions.vue:630 -#: src/components/gauge/Waterlevel.vue:725 +#: src/components/gauge/Waterlevel.vue:735 msgid "Now" msgstr "" @@ -1377,6 +1416,11 @@ msgid "quarterly" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:6 +#, fuzzy +msgid "Recency of Bottleneck Surveys" +msgstr "Seichtstellen" + #: src/components/Pdftool.vue:722 msgid "Ref gauge" msgstr "" @@ -1410,8 +1454,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:44 #: src/components/systemconfiguration/DataAccuracy.vue:274 #: src/components/systemconfiguration/MapLayers.vue:58 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:97 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:198 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:101 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:208 msgid "Reset to defaults" msgstr "" @@ -1427,8 +1471,8 @@ msgid "retryDescription" msgstr "" -#: src/components/sections/Sections.vue:142 -#: src/components/stretches/Stretches.vue:142 +#: src/components/sections/Sections.vue:133 +#: src/components/stretches/Stretches.vue:133 msgid "Review pending import" msgstr "" @@ -1441,6 +1485,10 @@ msgid "Rotate Maps" msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:312 +msgid "Same value is used in multiple fields. Please check" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1074 msgid "Saturday" msgstr "Samstag" @@ -1477,7 +1525,7 @@ msgid "Scheduled" msgstr "Zeitplan" -#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:91 #, fuzzy msgid "Section" msgstr "Projektion" @@ -1513,8 +1561,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:38 #: src/components/systemconfiguration/DataAccuracy.vue:271 #: src/components/systemconfiguration/MapLayers.vue:55 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:91 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:192 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:95 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:202 msgid "Send" msgstr "Absenden" @@ -1556,7 +1604,7 @@ msgid "Simple" msgstr "" -#: src/components/identify/Identify.vue:93 +#: src/components/identify/Identify.vue:147 msgid "" "Some data ©\n" " <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n" @@ -1577,7 +1625,7 @@ msgid "Sounding Result" msgstr "Seichtstellenvermessung" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:102 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:109 #, fuzzy msgid "Sounding Result Comparison" msgstr "Seichtstellenvermessung" @@ -1587,8 +1635,8 @@ msgid "Soundingresults" msgstr "Seichtstellenvermessung" -#: src/components/sections/Sections.vue:139 -#: src/components/stretches/Stretches.vue:139 +#: src/components/sections/Sections.vue:130 +#: src/components/stretches/Stretches.vue:130 #, fuzzy msgid "Source organization" msgstr "Bitte ein Datum eingeben" @@ -1604,11 +1652,11 @@ msgid "Source orgranization" msgstr "" -#: src/components/identify/Identify.vue:90 +#: src/components/identify/Identify.vue:144 msgid "source-code" msgstr "Quelltext" -#: src/components/sections/Sections.vue:205 +#: src/components/sections/Sections.vue:196 msgid "Staging Area" msgstr "Import-Überprüfung" @@ -1645,7 +1693,7 @@ msgid "Status" msgstr "Zustand" -#: src/components/identify/formatter.js:74 +#: src/components/identify/formatter.js:80 #, fuzzy msgid "Stretch" msgstr "Konto löschen" @@ -1704,7 +1752,7 @@ msgid "Testmail sent" msgstr "E-Mail wurde gesendet" -#: src/components/systemconfiguration/DataAccuracy.vue:132 +#: src/components/systemconfiguration/DataAccuracy.vue:203 msgid "" "The highest confidence value is less than\n" " <b>%{gm24} cm</b>\n" @@ -1713,13 +1761,13 @@ " within last 72 hours." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:177 +#: src/components/systemconfiguration/DataAccuracy.vue:248 msgid "" "The highest confidence value within the last 24 hours is\n" " greater than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:155 +#: src/components/systemconfiguration/DataAccuracy.vue:226 msgid "" "The highest confidence value within the last 72 hours is\n" " greater than" @@ -1752,19 +1800,19 @@ " respective bottleneck." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:250 +#: src/components/systemconfiguration/DataAccuracy.vue:177 msgid "" "The Nash-Sutcliffe coefficient for last 24 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:230 +#: src/components/systemconfiguration/DataAccuracy.vue:157 msgid "" "The Nash-Sutcliffe coefficient for last 72 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:205 +#: src/components/systemconfiguration/DataAccuracy.vue:132 msgid "" "The Nash-Sutcliffe coefficient is greater than\n" " <b>%{nsc24}</b>\n" @@ -1777,6 +1825,10 @@ msgid "The provided template has no name property." msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:331 +msgid "There are invalid classbreak values. Please check" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:88 msgid "There are less than" msgstr "" @@ -1788,11 +1840,11 @@ #: src/components/fairway/Profiles.vue:423 #: src/components/importconfiguration/types/Soundingresults.vue:232 #: src/components/importconfiguration/types/Soundingresults.vue:251 -#: src/components/layers/Layerselect.vue:67 +#: src/components/layers/Layerselect.vue:68 msgid "this" msgstr "" -#: src/components/identify/Identify.vue:84 +#: src/components/identify/Identify.vue:138 msgid "" "This app uses <i>gemma</i>, which is Free Software under <br/>\n" " %{ license } without warranty, see docs for details." @@ -1881,8 +1933,8 @@ msgid "URL" msgstr "" -#: src/components/identify/Identify.vue:80 -#: src/components/identify/Identify.vue:182 +#: src/components/identify/Identify.vue:134 +#: src/components/identify/Identify.vue:243 #, fuzzy msgid "User Manual" msgstr "Benutzername" @@ -1900,7 +1952,7 @@ msgid "Users" msgstr "Benutzer" -#: src/components/identify/Identify.vue:99 +#: src/components/identify/Identify.vue:153 msgid "" "Uses\n" " <a href=\"https://download.geonames.org/export/dump/readme.txt" @@ -1930,7 +1982,7 @@ msgstr "" #: src/components/gauge/HydrologicalConditions.vue:663 -#: src/components/gauge/Waterlevel.vue:611 +#: src/components/gauge/Waterlevel.vue:613 msgid "Waterlevel [m]" msgstr "" @@ -1953,7 +2005,7 @@ msgid "Waterway area" msgstr "Waterway-Benutzer" -#: src/components/identify/formatter.js:59 +#: src/components/identify/formatter.js:65 #, fuzzy msgid "Waterway Area" msgstr "Waterway-Benutzer" @@ -1962,7 +2014,7 @@ msgid "Waterway axis" msgstr "" -#: src/components/identify/formatter.js:68 +#: src/components/identify/formatter.js:74 #, fuzzy msgid "Waterway Axis" msgstr "Waterway-Admin" @@ -1971,7 +2023,7 @@ msgid "Waterway gauges" msgstr "" -#: src/components/identify/formatter.js:71 +#: src/components/identify/formatter.js:77 #, fuzzy msgid "Waterway Profile" msgstr "Einlesen der Wasserwegsprofile"
--- a/client/src/locale/en_GB/LC_MESSAGES/app.po Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/locale/en_GB/LC_MESSAGES/app.po Thu Sep 05 17:02:03 2019 +0200 @@ -89,6 +89,10 @@ msgid "Accesslog" msgstr "" +#: src/components/identify/Identify.vue:59 +msgid "According gauge data:" +msgstr "" + #: src/components/usermanagement/Userdetail.vue:242 #: src/components/usermanagement/Usermanagement.vue:82 msgid "Add User" @@ -110,7 +114,7 @@ msgid "April" msgstr "" -#: src/store/map.js:207 +#: src/store/map.js:214 msgid "Area" msgstr "" @@ -122,6 +126,18 @@ msgid "August" msgstr "" +#: src/components/identify/Identify.vue:324 +msgid "Avail: Below treshold" +msgstr "" + +#: src/components/identify/Identify.vue:321 +msgid "Avail: Last measurement <" +msgstr "" + +#: src/components/identify/Identify.vue:327 +msgid "Avail: Latest measurement older than" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:61 msgid "Availability of Gauge Measurements" msgstr "" @@ -168,7 +184,7 @@ #: src/components/gauge/HydrologicalConditions.vue:237 #: src/components/gauge/HydrologicalConditions.vue:1040 #: src/components/gauge/Waterlevel.vue:240 -#: src/components/gauge/Waterlevel.vue:1164 +#: src/components/gauge/Waterlevel.vue:1178 #: src/components/importconfiguration/Import.vue:130 #: src/components/importconfiguration/Import.vue:147 #: src/components/importconfiguration/Import.vue:166 @@ -191,15 +207,15 @@ #: src/components/importoverview/LogEntry.vue:160 #: src/components/importoverview/SectionDetails.vue:109 #: src/components/importoverview/StretchDetails.vue:113 -#: src/components/layers/Layerselect.vue:137 src/components/map/Map.vue:203 +#: src/components/layers/Layerselect.vue:158 src/components/map/Map.vue:213 #: src/components/sections/SectionForm.vue:339 -#: src/components/sections/Sections.vue:179 -#: src/components/sections/Sections.vue:189 -#: src/components/sections/Sections.vue:231 +#: src/components/sections/Sections.vue:170 +#: src/components/sections/Sections.vue:180 +#: src/components/sections/Sections.vue:222 #: src/components/stretches/StretchForm.vue:362 -#: src/components/stretches/Stretches.vue:179 -#: src/components/stretches/Stretches.vue:189 -#: src/components/stretches/Stretches.vue:241 +#: src/components/stretches/Stretches.vue:170 +#: src/components/stretches/Stretches.vue:180 +#: src/components/stretches/Stretches.vue:232 #: src/components/systemconfiguration/PDFTemplates.vue:165 #: src/components/systemconfiguration/PDFTemplates.vue:254 #: src/components/systemconfiguration/PDFTemplates.vue:292 @@ -243,7 +259,7 @@ #: src/components/fairway/Profiles.vue:654 #: src/components/importconfiguration/Import.vue:204 #: src/components/importoverview/ImportOverview.vue:447 -#: src/components/stretches/Stretches.vue:215 +#: src/components/stretches/Stretches.vue:206 #: src/components/systemconfiguration/PDFTemplates.vue:331 #: src/components/usermanagement/Usermanagement.vue:268 msgid "Cancel" @@ -258,7 +274,7 @@ msgid "Choose a distance mark by clicking on the map." msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:275 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:294 msgid "Choose color" msgstr "" @@ -286,6 +302,14 @@ msgid "Compare with" msgstr "" +#: src/components/identify/Identify.vue:343 +msgid "Confidence per 24h" +msgstr "" + +#: src/components/identify/Identify.vue:342 +msgid "Confidence per 72h" +msgstr "" + #: src/components/Sidebar.vue:65 msgid "Configuration" msgstr "" @@ -317,10 +341,6 @@ msgid "Cronstring" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:6 -msgid "Currency of Bottleneck Surveys" -msgstr "" - #: src/components/fairway/Profiles.vue:59 msgid "Current Waterlevel" msgstr "" @@ -329,21 +349,21 @@ msgid "Data Availability/Accuracy" msgstr "" -#: src/components/identify/Identify.vue:194 -msgid "Data too old. Treshold: " +#: src/components/identify/Identify.vue:360 +msgid "Data too old. Treshold:" msgstr "" -#: src/components/identify/Identify.vue:191 -msgid "Data within revisiting treshold " +#: src/components/identify/Identify.vue:357 +msgid "Data within revisiting treshold" msgstr "" -#: src/components/identify/Identify.vue:189 +#: src/components/identify/Identify.vue:355 msgid "Data within the revisiting time" msgstr "" #: src/components/importconfiguration/types/Soundingresults.vue:94 -#: src/components/sections/Sections.vue:136 -#: src/components/stretches/Stretches.vue:136 +#: src/components/sections/Sections.vue:127 +#: src/components/stretches/Stretches.vue:127 #: src/components/systemconfiguration/PDFTemplates.vue:120 msgid "Date" msgstr "" @@ -385,7 +405,7 @@ msgid "Define sections" msgstr "" -#: src/components/sections/Sections.vue:130 +#: src/components/sections/Sections.vue:121 msgid "Define Sections" msgstr "" @@ -393,13 +413,13 @@ msgid "Define stretches" msgstr "" -#: src/components/stretches/Stretches.vue:130 +#: src/components/stretches/Stretches.vue:121 msgid "Define Stretches" msgstr "" #: src/components/fairway/Profiles.vue:639 #: src/components/importconfiguration/Import.vue:182 -#: src/components/stretches/Stretches.vue:205 +#: src/components/stretches/Stretches.vue:196 #: src/components/systemconfiguration/PDFTemplates.vue:308 #: src/components/usermanagement/Usermanagement.vue:242 msgid "Delete" @@ -413,7 +433,7 @@ msgid "Delete Import" msgstr "" -#: src/components/stretches/Stretches.vue:197 +#: src/components/stretches/Stretches.vue:188 msgid "Delete Stretch" msgstr "" @@ -441,8 +461,8 @@ msgid "deleted successfully" msgstr "" -#: src/components/sections/Sections.vue:206 -#: src/components/stretches/Stretches.vue:210 +#: src/components/sections/Sections.vue:197 +#: src/components/stretches/Stretches.vue:201 msgid "Deleting " msgstr "" @@ -470,11 +490,11 @@ msgid "Depthreference" msgstr "" -#: src/components/identify/formatter.js:62 +#: src/components/identify/formatter.js:68 msgid "Distance Mark" msgstr "" -#: src/components/identify/formatter.js:65 +#: src/components/identify/formatter.js:71 msgid "Distance Mark ashore" msgstr "" @@ -502,11 +522,11 @@ msgid "Do you really want to delete the import with ID" msgstr "" -#: src/components/stretches/Stretches.vue:199 +#: src/components/stretches/Stretches.vue:190 msgid "Do you really want to delete this stretch:" msgstr "" -#: src/components/identify/Identify.vue:76 +#: src/components/identify/Identify.vue:130 msgid "Download" msgstr "" @@ -681,15 +701,15 @@ msgid "G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:96 +#: src/components/identify/formatter.js:102 msgid "Gauge" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:195 +msgid "Gauge Forecast Confidence" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:124 -msgid "Gauge Forecast Confidence" -msgstr "" - -#: src/components/systemconfiguration/DataAccuracy.vue:197 msgid "Gauge Forecast vs. Reality" msgstr "" @@ -718,10 +738,14 @@ msgid "Generated by" msgstr "" -#: src/components/identify/Identify.vue:106 +#: src/components/identify/Identify.vue:160 msgid "Generated PDFs use font:" msgstr "" +#: src/components/identify/Identify.vue:340 +msgid "Highest confidence" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1062 msgid "hour" msgstr "" @@ -748,7 +772,7 @@ msgid "ID" msgstr "" -#: src/components/identify/Identify.vue:179 src/components/map/MapPopup.vue:148 +#: src/components/identify/Identify.vue:240 src/components/map/MapPopup.vue:148 #: src/components/toolbar/Identify.vue:49 msgid "Identified Features" msgstr "" @@ -856,11 +880,11 @@ msgid "Latest Measurement" msgstr "" -#: src/components/identify/formatter.js:100 +#: src/components/identify/formatter.js:106 msgid "Latest Waterlevel" msgstr "" -#: src/components/identify/formatter.js:99 +#: src/components/identify/formatter.js:105 msgid "Latest Waterlevel Date" msgstr "" @@ -868,7 +892,7 @@ msgid "Layers" msgstr "" -#: src/store/map.js:180 +#: src/store/map.js:187 msgid "Length" msgstr "" @@ -936,7 +960,7 @@ msgid "Measurement" msgstr "" -#: src/components/identify/formatter.js:102 +#: src/components/identify/formatter.js:108 msgid "Measurement Count in Last 14 Days" msgstr "" @@ -944,13 +968,13 @@ msgid "measurements in the last 14 days." msgstr "" -#: src/components/identify/formatter.js:79 -#: src/components/identify/formatter.js:90 +#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:96 msgid "Min. G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:77 -#: src/components/identify/formatter.js:88 +#: src/components/identify/formatter.js:83 +#: src/components/identify/formatter.js:94 msgid "Min. Gauge Waterlevel Date" msgstr "" @@ -980,12 +1004,26 @@ #: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:6 #: src/components/identify/formatter.js:7 -#: src/components/sections/Sections.vue:133 -#: src/components/stretches/Stretches.vue:133 +#: src/components/sections/Sections.vue:124 +#: src/components/stretches/Stretches.vue:124 #: src/components/systemconfiguration/PDFTemplates.vue:117 msgid "Name" msgstr "" +#: src/components/identify/Identify.vue:252 +#: src/components/identify/Identify.vue:253 +#: src/components/identify/Identify.vue:254 +#: src/components/identify/Identify.vue:266 +#: src/components/identify/Identify.vue:267 +#: src/components/identify/Identify.vue:268 +msgid "Nash-Sutcliffe" +msgstr "" + +#: src/components/identify/Identify.vue:255 +#: src/components/identify/Identify.vue:269 +msgid "Nash-Sutcliffe not available" +msgstr "" + #: src/components/sections/SectionForm.vue:131 #: src/components/stretches/StretchForm.vue:148 msgid "National Object name" @@ -1008,11 +1046,11 @@ msgid "New import" msgstr "" -#: src/components/sections/Sections.vue:75 +#: src/components/sections/Sections.vue:66 msgid "New section" msgstr "" -#: src/components/stretches/Stretches.vue:75 +#: src/components/stretches/Stretches.vue:66 msgid "New stretch" msgstr "" @@ -1026,7 +1064,7 @@ msgid "No data available." msgstr "" -#: src/components/identify/Identify.vue:68 +#: src/components/identify/Identify.vue:122 msgid "No features identified." msgstr "" @@ -1038,7 +1076,7 @@ msgid "No style-changes" msgstr "" -#: src/components/stretches/Stretches.vue:209 +#: src/components/stretches/Stretches.vue:200 msgid "Not implemented" msgstr "" @@ -1047,7 +1085,7 @@ msgstr "" #: src/components/gauge/HydrologicalConditions.vue:630 -#: src/components/gauge/Waterlevel.vue:725 +#: src/components/gauge/Waterlevel.vue:735 msgid "Now" msgstr "" @@ -1298,6 +1336,10 @@ msgid "quarterly" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:6 +msgid "Recency of Bottleneck Surveys" +msgstr "" + #: src/components/Pdftool.vue:722 msgid "Ref gauge" msgstr "" @@ -1329,8 +1371,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:44 #: src/components/systemconfiguration/DataAccuracy.vue:274 #: src/components/systemconfiguration/MapLayers.vue:58 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:97 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:198 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:101 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:208 msgid "Reset to defaults" msgstr "" @@ -1346,8 +1388,8 @@ msgid "retryDescription" msgstr "" -#: src/components/sections/Sections.vue:142 -#: src/components/stretches/Stretches.vue:142 +#: src/components/sections/Sections.vue:133 +#: src/components/stretches/Stretches.vue:133 msgid "Review pending import" msgstr "" @@ -1360,6 +1402,10 @@ msgid "Rotate Maps" msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:312 +msgid "Same value is used in multiple fields. Please check" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1074 msgid "Saturday" msgstr "" @@ -1394,7 +1440,7 @@ msgid "Scheduled" msgstr "" -#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:91 msgid "Section" msgstr "" @@ -1426,8 +1472,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:38 #: src/components/systemconfiguration/DataAccuracy.vue:271 #: src/components/systemconfiguration/MapLayers.vue:55 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:91 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:192 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:95 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:202 msgid "Send" msgstr "" @@ -1467,7 +1513,7 @@ msgid "Simple" msgstr "" -#: src/components/identify/Identify.vue:93 +#: src/components/identify/Identify.vue:147 msgid "" "Some data ©\n" " <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n" @@ -1486,7 +1532,7 @@ msgid "Sounding Result" msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:102 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:109 msgid "Sounding Result Comparison" msgstr "" @@ -1494,8 +1540,8 @@ msgid "Soundingresults" msgstr "" -#: src/components/sections/Sections.vue:139 -#: src/components/stretches/Stretches.vue:139 +#: src/components/sections/Sections.vue:130 +#: src/components/stretches/Stretches.vue:130 msgid "Source organization" msgstr "" @@ -1509,11 +1555,11 @@ msgid "Source orgranization" msgstr "" -#: src/components/identify/Identify.vue:90 +#: src/components/identify/Identify.vue:144 msgid "source-code" msgstr "" -#: src/components/sections/Sections.vue:205 +#: src/components/sections/Sections.vue:196 msgid "Staging Area" msgstr "" @@ -1546,7 +1592,7 @@ msgid "Status" msgstr "" -#: src/components/identify/formatter.js:74 +#: src/components/identify/formatter.js:80 msgid "Stretch" msgstr "" @@ -1601,7 +1647,7 @@ msgid "Testmail sent" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:132 +#: src/components/systemconfiguration/DataAccuracy.vue:203 msgid "" "The highest confidence value is less than\n" " <b>%{gm24} cm</b>\n" @@ -1610,13 +1656,13 @@ " within last 72 hours." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:177 +#: src/components/systemconfiguration/DataAccuracy.vue:248 msgid "" "The highest confidence value within the last 24 hours is\n" " greater than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:155 +#: src/components/systemconfiguration/DataAccuracy.vue:226 msgid "" "The highest confidence value within the last 72 hours is\n" " greater than" @@ -1649,19 +1695,19 @@ " respective bottleneck." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:250 +#: src/components/systemconfiguration/DataAccuracy.vue:177 msgid "" "The Nash-Sutcliffe coefficient for last 24 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:230 +#: src/components/systemconfiguration/DataAccuracy.vue:157 msgid "" "The Nash-Sutcliffe coefficient for last 72 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:205 +#: src/components/systemconfiguration/DataAccuracy.vue:132 msgid "" "The Nash-Sutcliffe coefficient is greater than\n" " <b>%{nsc24}</b>\n" @@ -1674,6 +1720,10 @@ msgid "The provided template has no name property." msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:331 +msgid "There are invalid classbreak values. Please check" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:88 msgid "There are less than" msgstr "" @@ -1685,11 +1735,11 @@ #: src/components/fairway/Profiles.vue:423 #: src/components/importconfiguration/types/Soundingresults.vue:232 #: src/components/importconfiguration/types/Soundingresults.vue:251 -#: src/components/layers/Layerselect.vue:67 +#: src/components/layers/Layerselect.vue:68 msgid "this" msgstr "" -#: src/components/identify/Identify.vue:84 +#: src/components/identify/Identify.vue:138 msgid "" "This app uses <i>gemma</i>, which is Free Software under <br/>\n" " %{ license } without warranty, see docs for details." @@ -1776,8 +1826,8 @@ msgid "URL" msgstr "" -#: src/components/identify/Identify.vue:80 -#: src/components/identify/Identify.vue:182 +#: src/components/identify/Identify.vue:134 +#: src/components/identify/Identify.vue:243 msgid "User Manual" msgstr "" @@ -1794,7 +1844,7 @@ msgid "Users" msgstr "" -#: src/components/identify/Identify.vue:99 +#: src/components/identify/Identify.vue:153 msgid "" "Uses\n" " <a href=\"https://download.geonames.org/export/dump/readme.txt" @@ -1820,7 +1870,7 @@ msgstr "" #: src/components/gauge/HydrologicalConditions.vue:663 -#: src/components/gauge/Waterlevel.vue:611 +#: src/components/gauge/Waterlevel.vue:613 msgid "Waterlevel [m]" msgstr "" @@ -1841,7 +1891,7 @@ msgid "Waterway area" msgstr "" -#: src/components/identify/formatter.js:59 +#: src/components/identify/formatter.js:65 msgid "Waterway Area" msgstr "" @@ -1849,7 +1899,7 @@ msgid "Waterway axis" msgstr "" -#: src/components/identify/formatter.js:68 +#: src/components/identify/formatter.js:74 msgid "Waterway Axis" msgstr "" @@ -1857,7 +1907,7 @@ msgid "Waterway gauges" msgstr "" -#: src/components/identify/formatter.js:71 +#: src/components/identify/formatter.js:77 msgid "Waterway Profile" msgstr ""
--- a/client/src/locale/hr_HR/LC_MESSAGES/app.po Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/locale/hr_HR/LC_MESSAGES/app.po Thu Sep 05 17:02:03 2019 +0200 @@ -93,6 +93,10 @@ msgid "Accesslog" msgstr "Zapis pristupa" +#: src/components/identify/Identify.vue:59 +msgid "According gauge data:" +msgstr "" + #: src/components/usermanagement/Userdetail.vue:242 #: src/components/usermanagement/Usermanagement.vue:82 msgid "Add User" @@ -115,7 +119,7 @@ msgid "April" msgstr "Travanj" -#: src/store/map.js:207 +#: src/store/map.js:214 msgid "Area" msgstr "Područje" @@ -127,6 +131,20 @@ msgid "August" msgstr "Kolovoz" +#: src/components/identify/Identify.vue:324 +msgid "Avail: Below treshold" +msgstr "" + +#: src/components/identify/Identify.vue:321 +#, fuzzy +msgid "Avail: Last measurement <" +msgstr "Mjerenje" + +#: src/components/identify/Identify.vue:327 +#, fuzzy +msgid "Avail: Latest measurement older than" +msgstr "Mjerenje" + #: src/components/systemconfiguration/DataAccuracy.vue:61 #, fuzzy msgid "Availability of Gauge Measurements" @@ -178,7 +196,7 @@ #: src/components/gauge/HydrologicalConditions.vue:237 #: src/components/gauge/HydrologicalConditions.vue:1040 #: src/components/gauge/Waterlevel.vue:240 -#: src/components/gauge/Waterlevel.vue:1164 +#: src/components/gauge/Waterlevel.vue:1178 #: src/components/importconfiguration/Import.vue:130 #: src/components/importconfiguration/Import.vue:147 #: src/components/importconfiguration/Import.vue:166 @@ -201,15 +219,15 @@ #: src/components/importoverview/LogEntry.vue:160 #: src/components/importoverview/SectionDetails.vue:109 #: src/components/importoverview/StretchDetails.vue:113 -#: src/components/layers/Layerselect.vue:137 src/components/map/Map.vue:203 +#: src/components/layers/Layerselect.vue:158 src/components/map/Map.vue:213 #: src/components/sections/SectionForm.vue:339 -#: src/components/sections/Sections.vue:179 -#: src/components/sections/Sections.vue:189 -#: src/components/sections/Sections.vue:231 +#: src/components/sections/Sections.vue:170 +#: src/components/sections/Sections.vue:180 +#: src/components/sections/Sections.vue:222 #: src/components/stretches/StretchForm.vue:362 -#: src/components/stretches/Stretches.vue:179 -#: src/components/stretches/Stretches.vue:189 -#: src/components/stretches/Stretches.vue:241 +#: src/components/stretches/Stretches.vue:170 +#: src/components/stretches/Stretches.vue:180 +#: src/components/stretches/Stretches.vue:232 #: src/components/systemconfiguration/PDFTemplates.vue:165 #: src/components/systemconfiguration/PDFTemplates.vue:254 #: src/components/systemconfiguration/PDFTemplates.vue:292 @@ -255,7 +273,7 @@ #: src/components/fairway/Profiles.vue:654 #: src/components/importconfiguration/Import.vue:204 #: src/components/importoverview/ImportOverview.vue:447 -#: src/components/stretches/Stretches.vue:215 +#: src/components/stretches/Stretches.vue:206 #: src/components/systemconfiguration/PDFTemplates.vue:331 #: src/components/usermanagement/Usermanagement.vue:268 #, fuzzy @@ -271,7 +289,7 @@ msgid "Choose a distance mark by clicking on the map." msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:275 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:294 msgid "Choose color" msgstr "" @@ -300,6 +318,14 @@ msgid "Compare with" msgstr "Usporedi sa" +#: src/components/identify/Identify.vue:343 +msgid "Confidence per 24h" +msgstr "" + +#: src/components/identify/Identify.vue:342 +msgid "Confidence per 72h" +msgstr "" + #: src/components/Sidebar.vue:65 msgid "Configuration" msgstr "Konfiguracija" @@ -331,11 +357,6 @@ msgid "Cronstring" msgstr "Crontab - linija" -#: src/components/systemconfiguration/DataAccuracy.vue:6 -#, fuzzy -msgid "Currency of Bottleneck Surveys" -msgstr "Kritični sektori" - #: src/components/fairway/Profiles.vue:59 msgid "Current Waterlevel" msgstr "" @@ -344,21 +365,21 @@ msgid "Data Availability/Accuracy" msgstr "" -#: src/components/identify/Identify.vue:194 -msgid "Data too old. Treshold: " +#: src/components/identify/Identify.vue:360 +msgid "Data too old. Treshold:" msgstr "" -#: src/components/identify/Identify.vue:191 -msgid "Data within revisiting treshold " +#: src/components/identify/Identify.vue:357 +msgid "Data within revisiting treshold" msgstr "" -#: src/components/identify/Identify.vue:189 +#: src/components/identify/Identify.vue:355 msgid "Data within the revisiting time" msgstr "" #: src/components/importconfiguration/types/Soundingresults.vue:94 -#: src/components/sections/Sections.vue:136 -#: src/components/stretches/Stretches.vue:136 +#: src/components/sections/Sections.vue:127 +#: src/components/stretches/Stretches.vue:127 #: src/components/systemconfiguration/PDFTemplates.vue:120 msgid "Date" msgstr "Datum" @@ -404,7 +425,7 @@ msgid "Define sections" msgstr "Definiraj dionice" -#: src/components/sections/Sections.vue:130 +#: src/components/sections/Sections.vue:121 #, fuzzy msgid "Define Sections" msgstr "Definiraj dionice" @@ -413,14 +434,14 @@ msgid "Define stretches" msgstr "Definiraj dionice" -#: src/components/stretches/Stretches.vue:130 +#: src/components/stretches/Stretches.vue:121 #, fuzzy msgid "Define Stretches" msgstr "Definiraj dionice" #: src/components/fairway/Profiles.vue:639 #: src/components/importconfiguration/Import.vue:182 -#: src/components/stretches/Stretches.vue:205 +#: src/components/stretches/Stretches.vue:196 #: src/components/systemconfiguration/PDFTemplates.vue:308 #: src/components/usermanagement/Usermanagement.vue:242 #, fuzzy @@ -437,7 +458,7 @@ msgid "Delete Import" msgstr "Obrisan uvoz: #" -#: src/components/stretches/Stretches.vue:197 +#: src/components/stretches/Stretches.vue:188 #, fuzzy msgid "Delete Stretch" msgstr "Definiraj dionice" @@ -471,8 +492,8 @@ msgid "deleted successfully" msgstr "Uspješno" -#: src/components/sections/Sections.vue:206 -#: src/components/stretches/Stretches.vue:210 +#: src/components/sections/Sections.vue:197 +#: src/components/stretches/Stretches.vue:201 msgid "Deleting " msgstr "Brisanje " @@ -501,12 +522,12 @@ msgid "Depthreference" msgstr "Referentna dubina" -#: src/components/identify/formatter.js:62 +#: src/components/identify/formatter.js:68 #, fuzzy msgid "Distance Mark" msgstr "Virtualne Oznake Udaljenosti" -#: src/components/identify/formatter.js:65 +#: src/components/identify/formatter.js:71 #, fuzzy msgid "Distance Mark ashore" msgstr "Virtualne Oznake Udaljenosti" @@ -537,11 +558,11 @@ msgid "Do you really want to delete the import with ID" msgstr "" -#: src/components/stretches/Stretches.vue:199 +#: src/components/stretches/Stretches.vue:190 msgid "Do you really want to delete this stretch:" msgstr "" -#: src/components/identify/Identify.vue:76 +#: src/components/identify/Identify.vue:130 msgid "Download" msgstr "Preuzimanje" @@ -725,15 +746,15 @@ msgid "G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:96 +#: src/components/identify/formatter.js:102 msgid "Gauge" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:195 +msgid "Gauge Forecast Confidence" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:124 -msgid "Gauge Forecast Confidence" -msgstr "" - -#: src/components/systemconfiguration/DataAccuracy.vue:197 msgid "Gauge Forecast vs. Reality" msgstr "" @@ -764,11 +785,15 @@ msgid "Generated by" msgstr "– kreiran od:" -#: src/components/identify/Identify.vue:106 +#: src/components/identify/Identify.vue:160 #, fuzzy msgid "Generated PDFs use font:" msgstr "Kreiraj PDF" +#: src/components/identify/Identify.vue:340 +msgid "Highest confidence" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1062 msgid "hour" msgstr "sat" @@ -795,7 +820,7 @@ msgid "ID" msgstr "ID" -#: src/components/identify/Identify.vue:179 src/components/map/MapPopup.vue:148 +#: src/components/identify/Identify.vue:240 src/components/map/MapPopup.vue:148 #: src/components/toolbar/Identify.vue:49 #, fuzzy msgid "Identified Features" @@ -913,12 +938,12 @@ msgid "Latest Measurement" msgstr "Mjerenje" -#: src/components/identify/formatter.js:100 +#: src/components/identify/formatter.js:106 #, fuzzy msgid "Latest Waterlevel" msgstr "Mjerenje" -#: src/components/identify/formatter.js:99 +#: src/components/identify/formatter.js:105 #, fuzzy msgid "Latest Waterlevel Date" msgstr "Mjerenje" @@ -928,7 +953,7 @@ msgid "Layers" msgstr "Slojevi" -#: src/store/map.js:180 +#: src/store/map.js:187 msgid "Length" msgstr "Duljina" @@ -998,7 +1023,7 @@ msgid "Measurement" msgstr "Mjerenje" -#: src/components/identify/formatter.js:102 +#: src/components/identify/formatter.js:108 msgid "Measurement Count in Last 14 Days" msgstr "" @@ -1006,13 +1031,13 @@ msgid "measurements in the last 14 days." msgstr "" -#: src/components/identify/formatter.js:79 -#: src/components/identify/formatter.js:90 +#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:96 msgid "Min. G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:77 -#: src/components/identify/formatter.js:88 +#: src/components/identify/formatter.js:83 +#: src/components/identify/formatter.js:94 msgid "Min. Gauge Waterlevel Date" msgstr "" @@ -1043,12 +1068,26 @@ #: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:6 #: src/components/identify/formatter.js:7 -#: src/components/sections/Sections.vue:133 -#: src/components/stretches/Stretches.vue:133 +#: src/components/sections/Sections.vue:124 +#: src/components/stretches/Stretches.vue:124 #: src/components/systemconfiguration/PDFTemplates.vue:117 msgid "Name" msgstr "Naziv" +#: src/components/identify/Identify.vue:252 +#: src/components/identify/Identify.vue:253 +#: src/components/identify/Identify.vue:254 +#: src/components/identify/Identify.vue:266 +#: src/components/identify/Identify.vue:267 +#: src/components/identify/Identify.vue:268 +msgid "Nash-Sutcliffe" +msgstr "" + +#: src/components/identify/Identify.vue:255 +#: src/components/identify/Identify.vue:269 +msgid "Nash-Sutcliffe not available" +msgstr "" + #: src/components/sections/SectionForm.vue:131 #: src/components/stretches/StretchForm.vue:148 msgid "National Object name" @@ -1072,12 +1111,12 @@ msgid "New import" msgstr "Novi uvoz" -#: src/components/sections/Sections.vue:75 +#: src/components/sections/Sections.vue:66 #, fuzzy msgid "New section" msgstr "Nova dionica" -#: src/components/stretches/Stretches.vue:75 +#: src/components/stretches/Stretches.vue:66 msgid "New stretch" msgstr "Nova dionica" @@ -1091,7 +1130,7 @@ msgid "No data available." msgstr "" -#: src/components/identify/Identify.vue:68 +#: src/components/identify/Identify.vue:122 msgid "No features identified." msgstr "Nema identificiranih objekata." @@ -1103,7 +1142,7 @@ msgid "No style-changes" msgstr "" -#: src/components/stretches/Stretches.vue:209 +#: src/components/stretches/Stretches.vue:200 msgid "Not implemented" msgstr "Nije implementirano" @@ -1112,7 +1151,7 @@ msgstr "Studeni" #: src/components/gauge/HydrologicalConditions.vue:630 -#: src/components/gauge/Waterlevel.vue:725 +#: src/components/gauge/Waterlevel.vue:735 msgid "Now" msgstr "" @@ -1370,6 +1409,11 @@ msgid "quarterly" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:6 +#, fuzzy +msgid "Recency of Bottleneck Surveys" +msgstr "Kritični sektori" + #: src/components/Pdftool.vue:722 msgid "Ref gauge" msgstr "" @@ -1403,8 +1447,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:44 #: src/components/systemconfiguration/DataAccuracy.vue:274 #: src/components/systemconfiguration/MapLayers.vue:58 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:97 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:198 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:101 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:208 msgid "Reset to defaults" msgstr "" @@ -1420,8 +1464,8 @@ msgid "retryDescription" msgstr "" -#: src/components/sections/Sections.vue:142 -#: src/components/stretches/Stretches.vue:142 +#: src/components/sections/Sections.vue:133 +#: src/components/stretches/Stretches.vue:133 msgid "Review pending import" msgstr "" @@ -1434,6 +1478,10 @@ msgid "Rotate Maps" msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:312 +msgid "Same value is used in multiple fields. Please check" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1074 msgid "Saturday" msgstr "Subota" @@ -1468,7 +1516,7 @@ msgid "Scheduled" msgstr "Planiran" -#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:91 #, fuzzy msgid "Section" msgstr "Projekcija" @@ -1504,8 +1552,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:38 #: src/components/systemconfiguration/DataAccuracy.vue:271 #: src/components/systemconfiguration/MapLayers.vue:55 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:91 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:192 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:95 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:202 msgid "Send" msgstr "Pošalji" @@ -1546,7 +1594,7 @@ msgid "Simple" msgstr "" -#: src/components/identify/Identify.vue:93 +#: src/components/identify/Identify.vue:147 msgid "" "Some data ©\n" " <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n" @@ -1569,7 +1617,7 @@ msgid "Sounding Result" msgstr "Rezultat Hidrografskog mjerenja" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:102 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:109 #, fuzzy msgid "Sounding Result Comparison" msgstr "Rezultat Hidrografskog mjerenja" @@ -1579,8 +1627,8 @@ msgid "Soundingresults" msgstr "Rezultat Hidrografskog mjerenja" -#: src/components/sections/Sections.vue:139 -#: src/components/stretches/Stretches.vue:139 +#: src/components/sections/Sections.vue:130 +#: src/components/stretches/Stretches.vue:130 msgid "Source organization" msgstr "Organizacija izvora" @@ -1595,11 +1643,11 @@ msgid "Source orgranization" msgstr "Organizacija izvora" -#: src/components/identify/Identify.vue:90 +#: src/components/identify/Identify.vue:144 msgid "source-code" msgstr "izvorni kod" -#: src/components/sections/Sections.vue:205 +#: src/components/sections/Sections.vue:196 msgid "Staging Area" msgstr "Pristanište" @@ -1634,7 +1682,7 @@ msgid "Status" msgstr "Stanje" -#: src/components/identify/formatter.js:74 +#: src/components/identify/formatter.js:80 #, fuzzy msgid "Stretch" msgstr "Definiraj dionice" @@ -1692,7 +1740,7 @@ msgid "Testmail sent" msgstr "E-mail je poslan" -#: src/components/systemconfiguration/DataAccuracy.vue:132 +#: src/components/systemconfiguration/DataAccuracy.vue:203 msgid "" "The highest confidence value is less than\n" " <b>%{gm24} cm</b>\n" @@ -1701,13 +1749,13 @@ " within last 72 hours." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:177 +#: src/components/systemconfiguration/DataAccuracy.vue:248 msgid "" "The highest confidence value within the last 24 hours is\n" " greater than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:155 +#: src/components/systemconfiguration/DataAccuracy.vue:226 msgid "" "The highest confidence value within the last 72 hours is\n" " greater than" @@ -1740,19 +1788,19 @@ " respective bottleneck." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:250 +#: src/components/systemconfiguration/DataAccuracy.vue:177 msgid "" "The Nash-Sutcliffe coefficient for last 24 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:230 +#: src/components/systemconfiguration/DataAccuracy.vue:157 msgid "" "The Nash-Sutcliffe coefficient for last 72 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:205 +#: src/components/systemconfiguration/DataAccuracy.vue:132 msgid "" "The Nash-Sutcliffe coefficient is greater than\n" " <b>%{nsc24}</b>\n" @@ -1765,6 +1813,10 @@ msgid "The provided template has no name property." msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:331 +msgid "There are invalid classbreak values. Please check" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:88 msgid "There are less than" msgstr "" @@ -1776,11 +1828,11 @@ #: src/components/fairway/Profiles.vue:423 #: src/components/importconfiguration/types/Soundingresults.vue:232 #: src/components/importconfiguration/types/Soundingresults.vue:251 -#: src/components/layers/Layerselect.vue:67 +#: src/components/layers/Layerselect.vue:68 msgid "this" msgstr "" -#: src/components/identify/Identify.vue:84 +#: src/components/identify/Identify.vue:138 msgid "" "This app uses <i>gemma</i>, which is Free Software under <br/>\n" " %{ license } without warranty, see docs for details." @@ -1869,8 +1921,8 @@ msgid "URL" msgstr "URL" -#: src/components/identify/Identify.vue:80 -#: src/components/identify/Identify.vue:182 +#: src/components/identify/Identify.vue:134 +#: src/components/identify/Identify.vue:243 #, fuzzy msgid "User Manual" msgstr "Korisničko ime" @@ -1888,7 +1940,7 @@ msgid "Users" msgstr "Korisnici" -#: src/components/identify/Identify.vue:99 +#: src/components/identify/Identify.vue:153 msgid "" "Uses\n" " <a href=\"https://download.geonames.org/export/dump/readme.txt" @@ -1918,7 +1970,7 @@ msgstr "" #: src/components/gauge/HydrologicalConditions.vue:663 -#: src/components/gauge/Waterlevel.vue:611 +#: src/components/gauge/Waterlevel.vue:613 msgid "Waterlevel [m]" msgstr "" @@ -1940,7 +1992,7 @@ msgid "Waterway area" msgstr "Područje plovnog puta" -#: src/components/identify/formatter.js:59 +#: src/components/identify/formatter.js:65 #, fuzzy msgid "Waterway Area" msgstr "Područje plovnog puta" @@ -1949,7 +2001,7 @@ msgid "Waterway axis" msgstr "Os plovnog puta" -#: src/components/identify/formatter.js:68 +#: src/components/identify/formatter.js:74 #, fuzzy msgid "Waterway Axis" msgstr "Os plovnog puta" @@ -1958,7 +2010,7 @@ msgid "Waterway gauges" msgstr "Vodomjerna stanica" -#: src/components/identify/formatter.js:71 +#: src/components/identify/formatter.js:77 #, fuzzy msgid "Waterway Profile" msgstr "Uvoz Profila Plovnog Puta"
--- a/client/src/locale/hu_HU/LC_MESSAGES/app.po Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/locale/hu_HU/LC_MESSAGES/app.po Thu Sep 05 17:02:03 2019 +0200 @@ -92,6 +92,10 @@ msgid "Accesslog" msgstr "Bejelentkezési log" +#: src/components/identify/Identify.vue:59 +msgid "According gauge data:" +msgstr "" + #: src/components/usermanagement/Userdetail.vue:242 #: src/components/usermanagement/Usermanagement.vue:82 msgid "Add User" @@ -113,7 +117,7 @@ msgid "April" msgstr "Április" -#: src/store/map.js:207 +#: src/store/map.js:214 msgid "Area" msgstr "terület" @@ -125,6 +129,18 @@ msgid "August" msgstr "Augusztus" +#: src/components/identify/Identify.vue:324 +msgid "Avail: Below treshold" +msgstr "" + +#: src/components/identify/Identify.vue:321 +msgid "Avail: Last measurement <" +msgstr "" + +#: src/components/identify/Identify.vue:327 +msgid "Avail: Latest measurement older than" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:61 msgid "Availability of Gauge Measurements" msgstr "" @@ -174,7 +190,7 @@ #: src/components/gauge/HydrologicalConditions.vue:237 #: src/components/gauge/HydrologicalConditions.vue:1040 #: src/components/gauge/Waterlevel.vue:240 -#: src/components/gauge/Waterlevel.vue:1164 +#: src/components/gauge/Waterlevel.vue:1178 #: src/components/importconfiguration/Import.vue:130 #: src/components/importconfiguration/Import.vue:147 #: src/components/importconfiguration/Import.vue:166 @@ -197,15 +213,15 @@ #: src/components/importoverview/LogEntry.vue:160 #: src/components/importoverview/SectionDetails.vue:109 #: src/components/importoverview/StretchDetails.vue:113 -#: src/components/layers/Layerselect.vue:137 src/components/map/Map.vue:203 +#: src/components/layers/Layerselect.vue:158 src/components/map/Map.vue:213 #: src/components/sections/SectionForm.vue:339 -#: src/components/sections/Sections.vue:179 -#: src/components/sections/Sections.vue:189 -#: src/components/sections/Sections.vue:231 +#: src/components/sections/Sections.vue:170 +#: src/components/sections/Sections.vue:180 +#: src/components/sections/Sections.vue:222 #: src/components/stretches/StretchForm.vue:362 -#: src/components/stretches/Stretches.vue:179 -#: src/components/stretches/Stretches.vue:189 -#: src/components/stretches/Stretches.vue:241 +#: src/components/stretches/Stretches.vue:170 +#: src/components/stretches/Stretches.vue:180 +#: src/components/stretches/Stretches.vue:232 #: src/components/systemconfiguration/PDFTemplates.vue:165 #: src/components/systemconfiguration/PDFTemplates.vue:254 #: src/components/systemconfiguration/PDFTemplates.vue:292 @@ -252,7 +268,7 @@ #: src/components/fairway/Profiles.vue:654 #: src/components/importconfiguration/Import.vue:204 #: src/components/importoverview/ImportOverview.vue:447 -#: src/components/stretches/Stretches.vue:215 +#: src/components/stretches/Stretches.vue:206 #: src/components/systemconfiguration/PDFTemplates.vue:331 #: src/components/usermanagement/Usermanagement.vue:268 msgid "Cancel" @@ -267,7 +283,7 @@ msgid "Choose a distance mark by clicking on the map." msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:275 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:294 msgid "Choose color" msgstr "" @@ -295,6 +311,14 @@ msgid "Compare with" msgstr "" +#: src/components/identify/Identify.vue:343 +msgid "Confidence per 24h" +msgstr "" + +#: src/components/identify/Identify.vue:342 +msgid "Confidence per 72h" +msgstr "" + #: src/components/Sidebar.vue:65 msgid "Configuration" msgstr "" @@ -327,11 +351,6 @@ msgid "Cronstring" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:6 -#, fuzzy -msgid "Currency of Bottleneck Surveys" -msgstr "Gázlók" - #: src/components/fairway/Profiles.vue:59 msgid "Current Waterlevel" msgstr "" @@ -340,21 +359,21 @@ msgid "Data Availability/Accuracy" msgstr "" -#: src/components/identify/Identify.vue:194 -msgid "Data too old. Treshold: " +#: src/components/identify/Identify.vue:360 +msgid "Data too old. Treshold:" msgstr "" -#: src/components/identify/Identify.vue:191 -msgid "Data within revisiting treshold " +#: src/components/identify/Identify.vue:357 +msgid "Data within revisiting treshold" msgstr "" -#: src/components/identify/Identify.vue:189 +#: src/components/identify/Identify.vue:355 msgid "Data within the revisiting time" msgstr "" #: src/components/importconfiguration/types/Soundingresults.vue:94 -#: src/components/sections/Sections.vue:136 -#: src/components/stretches/Stretches.vue:136 +#: src/components/sections/Sections.vue:127 +#: src/components/stretches/Stretches.vue:127 #: src/components/systemconfiguration/PDFTemplates.vue:120 msgid "Date" msgstr "" @@ -396,7 +415,7 @@ msgid "Define sections" msgstr "" -#: src/components/sections/Sections.vue:130 +#: src/components/sections/Sections.vue:121 msgid "Define Sections" msgstr "" @@ -404,13 +423,13 @@ msgid "Define stretches" msgstr "" -#: src/components/stretches/Stretches.vue:130 +#: src/components/stretches/Stretches.vue:121 msgid "Define Stretches" msgstr "" #: src/components/fairway/Profiles.vue:639 #: src/components/importconfiguration/Import.vue:182 -#: src/components/stretches/Stretches.vue:205 +#: src/components/stretches/Stretches.vue:196 #: src/components/systemconfiguration/PDFTemplates.vue:308 #: src/components/usermanagement/Usermanagement.vue:242 msgid "Delete" @@ -424,7 +443,7 @@ msgid "Delete Import" msgstr "" -#: src/components/stretches/Stretches.vue:197 +#: src/components/stretches/Stretches.vue:188 msgid "Delete Stretch" msgstr "" @@ -452,8 +471,8 @@ msgid "deleted successfully" msgstr "" -#: src/components/sections/Sections.vue:206 -#: src/components/stretches/Stretches.vue:210 +#: src/components/sections/Sections.vue:197 +#: src/components/stretches/Stretches.vue:201 msgid "Deleting " msgstr "" @@ -481,11 +500,11 @@ msgid "Depthreference" msgstr "" -#: src/components/identify/formatter.js:62 +#: src/components/identify/formatter.js:68 msgid "Distance Mark" msgstr "" -#: src/components/identify/formatter.js:65 +#: src/components/identify/formatter.js:71 msgid "Distance Mark ashore" msgstr "" @@ -513,11 +532,11 @@ msgid "Do you really want to delete the import with ID" msgstr "" -#: src/components/stretches/Stretches.vue:199 +#: src/components/stretches/Stretches.vue:190 msgid "Do you really want to delete this stretch:" msgstr "" -#: src/components/identify/Identify.vue:76 +#: src/components/identify/Identify.vue:130 msgid "Download" msgstr "" @@ -693,15 +712,15 @@ msgid "G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:96 +#: src/components/identify/formatter.js:102 msgid "Gauge" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:195 +msgid "Gauge Forecast Confidence" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:124 -msgid "Gauge Forecast Confidence" -msgstr "" - -#: src/components/systemconfiguration/DataAccuracy.vue:197 msgid "Gauge Forecast vs. Reality" msgstr "" @@ -731,10 +750,14 @@ msgid "Generated by" msgstr "- létrehozta:" -#: src/components/identify/Identify.vue:106 +#: src/components/identify/Identify.vue:160 msgid "Generated PDFs use font:" msgstr "" +#: src/components/identify/Identify.vue:340 +msgid "Highest confidence" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1062 msgid "hour" msgstr "" @@ -761,7 +784,7 @@ msgid "ID" msgstr "" -#: src/components/identify/Identify.vue:179 src/components/map/MapPopup.vue:148 +#: src/components/identify/Identify.vue:240 src/components/map/MapPopup.vue:148 #: src/components/toolbar/Identify.vue:49 msgid "Identified Features" msgstr "" @@ -869,11 +892,11 @@ msgid "Latest Measurement" msgstr "" -#: src/components/identify/formatter.js:100 +#: src/components/identify/formatter.js:106 msgid "Latest Waterlevel" msgstr "" -#: src/components/identify/formatter.js:99 +#: src/components/identify/formatter.js:105 msgid "Latest Waterlevel Date" msgstr "" @@ -882,7 +905,7 @@ msgid "Layers" msgstr "Rétegek" -#: src/store/map.js:180 +#: src/store/map.js:187 msgid "Length" msgstr "" @@ -951,7 +974,7 @@ msgid "Measurement" msgstr "" -#: src/components/identify/formatter.js:102 +#: src/components/identify/formatter.js:108 msgid "Measurement Count in Last 14 Days" msgstr "" @@ -959,13 +982,13 @@ msgid "measurements in the last 14 days." msgstr "" -#: src/components/identify/formatter.js:79 -#: src/components/identify/formatter.js:90 +#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:96 msgid "Min. G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:77 -#: src/components/identify/formatter.js:88 +#: src/components/identify/formatter.js:83 +#: src/components/identify/formatter.js:94 msgid "Min. Gauge Waterlevel Date" msgstr "" @@ -995,13 +1018,27 @@ #: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:6 #: src/components/identify/formatter.js:7 -#: src/components/sections/Sections.vue:133 -#: src/components/stretches/Stretches.vue:133 +#: src/components/sections/Sections.vue:124 +#: src/components/stretches/Stretches.vue:124 #: src/components/systemconfiguration/PDFTemplates.vue:117 #, fuzzy msgid "Name" msgstr "Név" +#: src/components/identify/Identify.vue:252 +#: src/components/identify/Identify.vue:253 +#: src/components/identify/Identify.vue:254 +#: src/components/identify/Identify.vue:266 +#: src/components/identify/Identify.vue:267 +#: src/components/identify/Identify.vue:268 +msgid "Nash-Sutcliffe" +msgstr "" + +#: src/components/identify/Identify.vue:255 +#: src/components/identify/Identify.vue:269 +msgid "Nash-Sutcliffe not available" +msgstr "" + #: src/components/sections/SectionForm.vue:131 #: src/components/stretches/StretchForm.vue:148 msgid "National Object name" @@ -1024,11 +1061,11 @@ msgid "New import" msgstr "" -#: src/components/sections/Sections.vue:75 +#: src/components/sections/Sections.vue:66 msgid "New section" msgstr "" -#: src/components/stretches/Stretches.vue:75 +#: src/components/stretches/Stretches.vue:66 msgid "New stretch" msgstr "" @@ -1042,7 +1079,7 @@ msgid "No data available." msgstr "" -#: src/components/identify/Identify.vue:68 +#: src/components/identify/Identify.vue:122 msgid "No features identified." msgstr "" @@ -1054,7 +1091,7 @@ msgid "No style-changes" msgstr "" -#: src/components/stretches/Stretches.vue:209 +#: src/components/stretches/Stretches.vue:200 msgid "Not implemented" msgstr "" @@ -1063,7 +1100,7 @@ msgstr "" #: src/components/gauge/HydrologicalConditions.vue:630 -#: src/components/gauge/Waterlevel.vue:725 +#: src/components/gauge/Waterlevel.vue:735 msgid "Now" msgstr "" @@ -1317,6 +1354,11 @@ msgid "quarterly" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:6 +#, fuzzy +msgid "Recency of Bottleneck Surveys" +msgstr "Gázlók" + #: src/components/Pdftool.vue:722 msgid "Ref gauge" msgstr "" @@ -1348,8 +1390,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:44 #: src/components/systemconfiguration/DataAccuracy.vue:274 #: src/components/systemconfiguration/MapLayers.vue:58 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:97 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:198 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:101 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:208 msgid "Reset to defaults" msgstr "" @@ -1365,8 +1407,8 @@ msgid "retryDescription" msgstr "" -#: src/components/sections/Sections.vue:142 -#: src/components/stretches/Stretches.vue:142 +#: src/components/sections/Sections.vue:133 +#: src/components/stretches/Stretches.vue:133 msgid "Review pending import" msgstr "" @@ -1379,6 +1421,10 @@ msgid "Rotate Maps" msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:312 +msgid "Same value is used in multiple fields. Please check" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1074 msgid "Saturday" msgstr "" @@ -1413,7 +1459,7 @@ msgid "Scheduled" msgstr "" -#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:91 msgid "Section" msgstr "" @@ -1446,8 +1492,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:38 #: src/components/systemconfiguration/DataAccuracy.vue:271 #: src/components/systemconfiguration/MapLayers.vue:55 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:91 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:192 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:95 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:202 #, fuzzy msgid "Send" msgstr "Küldés" @@ -1489,7 +1535,7 @@ msgid "Simple" msgstr "" -#: src/components/identify/Identify.vue:93 +#: src/components/identify/Identify.vue:147 msgid "" "Some data ©\n" " <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n" @@ -1508,7 +1554,7 @@ msgid "Sounding Result" msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:102 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:109 msgid "Sounding Result Comparison" msgstr "" @@ -1516,8 +1562,8 @@ msgid "Soundingresults" msgstr "" -#: src/components/sections/Sections.vue:139 -#: src/components/stretches/Stretches.vue:139 +#: src/components/sections/Sections.vue:130 +#: src/components/stretches/Stretches.vue:130 msgid "Source organization" msgstr "" @@ -1531,11 +1577,11 @@ msgid "Source orgranization" msgstr "" -#: src/components/identify/Identify.vue:90 +#: src/components/identify/Identify.vue:144 msgid "source-code" msgstr "" -#: src/components/sections/Sections.vue:205 +#: src/components/sections/Sections.vue:196 msgid "Staging Area" msgstr "" @@ -1568,7 +1614,7 @@ msgid "Status" msgstr "" -#: src/components/identify/formatter.js:74 +#: src/components/identify/formatter.js:80 msgid "Stretch" msgstr "" @@ -1623,7 +1669,7 @@ msgid "Testmail sent" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:132 +#: src/components/systemconfiguration/DataAccuracy.vue:203 msgid "" "The highest confidence value is less than\n" " <b>%{gm24} cm</b>\n" @@ -1632,13 +1678,13 @@ " within last 72 hours." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:177 +#: src/components/systemconfiguration/DataAccuracy.vue:248 msgid "" "The highest confidence value within the last 24 hours is\n" " greater than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:155 +#: src/components/systemconfiguration/DataAccuracy.vue:226 msgid "" "The highest confidence value within the last 72 hours is\n" " greater than" @@ -1671,19 +1717,19 @@ " respective bottleneck." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:250 +#: src/components/systemconfiguration/DataAccuracy.vue:177 msgid "" "The Nash-Sutcliffe coefficient for last 24 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:230 +#: src/components/systemconfiguration/DataAccuracy.vue:157 msgid "" "The Nash-Sutcliffe coefficient for last 72 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:205 +#: src/components/systemconfiguration/DataAccuracy.vue:132 msgid "" "The Nash-Sutcliffe coefficient is greater than\n" " <b>%{nsc24}</b>\n" @@ -1696,6 +1742,10 @@ msgid "The provided template has no name property." msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:331 +msgid "There are invalid classbreak values. Please check" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:88 msgid "There are less than" msgstr "" @@ -1707,11 +1757,11 @@ #: src/components/fairway/Profiles.vue:423 #: src/components/importconfiguration/types/Soundingresults.vue:232 #: src/components/importconfiguration/types/Soundingresults.vue:251 -#: src/components/layers/Layerselect.vue:67 +#: src/components/layers/Layerselect.vue:68 msgid "this" msgstr "" -#: src/components/identify/Identify.vue:84 +#: src/components/identify/Identify.vue:138 msgid "" "This app uses <i>gemma</i>, which is Free Software under <br/>\n" " %{ license } without warranty, see docs for details." @@ -1799,8 +1849,8 @@ msgid "URL" msgstr "" -#: src/components/identify/Identify.vue:80 -#: src/components/identify/Identify.vue:182 +#: src/components/identify/Identify.vue:134 +#: src/components/identify/Identify.vue:243 msgid "User Manual" msgstr "" @@ -1817,7 +1867,7 @@ msgid "Users" msgstr "" -#: src/components/identify/Identify.vue:99 +#: src/components/identify/Identify.vue:153 msgid "" "Uses\n" " <a href=\"https://download.geonames.org/export/dump/readme.txt" @@ -1843,7 +1893,7 @@ msgstr "" #: src/components/gauge/HydrologicalConditions.vue:663 -#: src/components/gauge/Waterlevel.vue:611 +#: src/components/gauge/Waterlevel.vue:613 msgid "Waterlevel [m]" msgstr "" @@ -1864,7 +1914,7 @@ msgid "Waterway area" msgstr "" -#: src/components/identify/formatter.js:59 +#: src/components/identify/formatter.js:65 msgid "Waterway Area" msgstr "" @@ -1872,7 +1922,7 @@ msgid "Waterway axis" msgstr "" -#: src/components/identify/formatter.js:68 +#: src/components/identify/formatter.js:74 msgid "Waterway Axis" msgstr "" @@ -1880,7 +1930,7 @@ msgid "Waterway gauges" msgstr "" -#: src/components/identify/formatter.js:71 +#: src/components/identify/formatter.js:77 msgid "Waterway Profile" msgstr ""
--- a/client/src/locale/ro_RO/LC_MESSAGES/app.po Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/locale/ro_RO/LC_MESSAGES/app.po Thu Sep 05 17:02:03 2019 +0200 @@ -92,6 +92,10 @@ msgid "Accesslog" msgstr "Acces la log" +#: src/components/identify/Identify.vue:59 +msgid "According gauge data:" +msgstr "" + #: src/components/usermanagement/Userdetail.vue:242 #: src/components/usermanagement/Usermanagement.vue:82 msgid "Add User" @@ -113,7 +117,7 @@ msgid "April" msgstr "Aprilie" -#: src/store/map.js:207 +#: src/store/map.js:214 msgid "Area" msgstr "Zona" @@ -125,6 +129,20 @@ msgid "August" msgstr "August" +#: src/components/identify/Identify.vue:324 +msgid "Avail: Below treshold" +msgstr "" + +#: src/components/identify/Identify.vue:321 +#, fuzzy +msgid "Avail: Last measurement <" +msgstr "Ultima Masuratoare" + +#: src/components/identify/Identify.vue:327 +#, fuzzy +msgid "Avail: Latest measurement older than" +msgstr "Ultima Masuratoare" + #: src/components/systemconfiguration/DataAccuracy.vue:61 #, fuzzy msgid "Availability of Gauge Measurements" @@ -175,7 +193,7 @@ #: src/components/gauge/HydrologicalConditions.vue:237 #: src/components/gauge/HydrologicalConditions.vue:1040 #: src/components/gauge/Waterlevel.vue:240 -#: src/components/gauge/Waterlevel.vue:1164 +#: src/components/gauge/Waterlevel.vue:1178 #: src/components/importconfiguration/Import.vue:130 #: src/components/importconfiguration/Import.vue:147 #: src/components/importconfiguration/Import.vue:166 @@ -198,15 +216,15 @@ #: src/components/importoverview/LogEntry.vue:160 #: src/components/importoverview/SectionDetails.vue:109 #: src/components/importoverview/StretchDetails.vue:113 -#: src/components/layers/Layerselect.vue:137 src/components/map/Map.vue:203 +#: src/components/layers/Layerselect.vue:158 src/components/map/Map.vue:213 #: src/components/sections/SectionForm.vue:339 -#: src/components/sections/Sections.vue:179 -#: src/components/sections/Sections.vue:189 -#: src/components/sections/Sections.vue:231 +#: src/components/sections/Sections.vue:170 +#: src/components/sections/Sections.vue:180 +#: src/components/sections/Sections.vue:222 #: src/components/stretches/StretchForm.vue:362 -#: src/components/stretches/Stretches.vue:179 -#: src/components/stretches/Stretches.vue:189 -#: src/components/stretches/Stretches.vue:241 +#: src/components/stretches/Stretches.vue:170 +#: src/components/stretches/Stretches.vue:180 +#: src/components/stretches/Stretches.vue:232 #: src/components/systemconfiguration/PDFTemplates.vue:165 #: src/components/systemconfiguration/PDFTemplates.vue:254 #: src/components/systemconfiguration/PDFTemplates.vue:292 @@ -252,7 +270,7 @@ #: src/components/fairway/Profiles.vue:654 #: src/components/importconfiguration/Import.vue:204 #: src/components/importoverview/ImportOverview.vue:447 -#: src/components/stretches/Stretches.vue:215 +#: src/components/stretches/Stretches.vue:206 #: src/components/systemconfiguration/PDFTemplates.vue:331 #: src/components/usermanagement/Usermanagement.vue:268 msgid "Cancel" @@ -267,7 +285,7 @@ msgid "Choose a distance mark by clicking on the map." msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:275 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:294 msgid "Choose color" msgstr "" @@ -296,6 +314,14 @@ msgid "Compare with" msgstr "Compara cu" +#: src/components/identify/Identify.vue:343 +msgid "Confidence per 24h" +msgstr "" + +#: src/components/identify/Identify.vue:342 +msgid "Confidence per 72h" +msgstr "" + #: src/components/Sidebar.vue:65 msgid "Configuration" msgstr "Configurare" @@ -327,11 +353,6 @@ msgid "Cronstring" msgstr "Sir cronologic" -#: src/components/systemconfiguration/DataAccuracy.vue:6 -#, fuzzy -msgid "Currency of Bottleneck Surveys" -msgstr "Puncte critice" - #: src/components/fairway/Profiles.vue:59 #, fuzzy msgid "Current Waterlevel" @@ -341,21 +362,21 @@ msgid "Data Availability/Accuracy" msgstr "" -#: src/components/identify/Identify.vue:194 -msgid "Data too old. Treshold: " +#: src/components/identify/Identify.vue:360 +msgid "Data too old. Treshold:" msgstr "" -#: src/components/identify/Identify.vue:191 -msgid "Data within revisiting treshold " +#: src/components/identify/Identify.vue:357 +msgid "Data within revisiting treshold" msgstr "" -#: src/components/identify/Identify.vue:189 +#: src/components/identify/Identify.vue:355 msgid "Data within the revisiting time" msgstr "" #: src/components/importconfiguration/types/Soundingresults.vue:94 -#: src/components/sections/Sections.vue:136 -#: src/components/stretches/Stretches.vue:136 +#: src/components/sections/Sections.vue:127 +#: src/components/stretches/Stretches.vue:127 #: src/components/systemconfiguration/PDFTemplates.vue:120 msgid "Date" msgstr "Data" @@ -401,7 +422,7 @@ msgid "Define sections" msgstr "Defineşte secţiunile" -#: src/components/sections/Sections.vue:130 +#: src/components/sections/Sections.vue:121 #, fuzzy msgid "Define Sections" msgstr "Defineşte sectoarele" @@ -410,13 +431,13 @@ msgid "Define stretches" msgstr "Defineşte secţiunile" -#: src/components/stretches/Stretches.vue:130 +#: src/components/stretches/Stretches.vue:121 msgid "Define Stretches" msgstr "Defineşte sectoarele" #: src/components/fairway/Profiles.vue:639 #: src/components/importconfiguration/Import.vue:182 -#: src/components/stretches/Stretches.vue:205 +#: src/components/stretches/Stretches.vue:196 #: src/components/systemconfiguration/PDFTemplates.vue:308 #: src/components/usermanagement/Usermanagement.vue:242 msgid "Delete" @@ -430,7 +451,7 @@ msgid "Delete Import" msgstr "Sterge importul" -#: src/components/stretches/Stretches.vue:197 +#: src/components/stretches/Stretches.vue:188 msgid "Delete Stretch" msgstr "Sterge sectorul" @@ -459,8 +480,8 @@ msgid "deleted successfully" msgstr "sterse cu succes" -#: src/components/sections/Sections.vue:206 -#: src/components/stretches/Stretches.vue:210 +#: src/components/sections/Sections.vue:197 +#: src/components/stretches/Stretches.vue:201 msgid "Deleting " msgstr "Șterge " @@ -489,12 +510,12 @@ msgid "Depthreference" msgstr "Adâncimea de eeferinţă" -#: src/components/identify/formatter.js:62 +#: src/components/identify/formatter.js:68 #, fuzzy msgid "Distance Mark" msgstr "Marcaj distanță pe uscat" -#: src/components/identify/formatter.js:65 +#: src/components/identify/formatter.js:71 #, fuzzy msgid "Distance Mark ashore" msgstr "Marcaj distanță pe uscat" @@ -523,11 +544,11 @@ msgid "Do you really want to delete the import with ID" msgstr "Chiar vrei să ştergi importul cu ID" -#: src/components/stretches/Stretches.vue:199 +#: src/components/stretches/Stretches.vue:190 msgid "Do you really want to delete this stretch:" msgstr "Chiar vrei să ştergi acest sector:" -#: src/components/identify/Identify.vue:76 +#: src/components/identify/Identify.vue:130 msgid "Download" msgstr "Descarcă" @@ -706,16 +727,16 @@ msgid "G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:96 +#: src/components/identify/formatter.js:102 #, fuzzy msgid "Gauge" msgstr "Mire" -#: src/components/systemconfiguration/DataAccuracy.vue:124 +#: src/components/systemconfiguration/DataAccuracy.vue:195 msgid "Gauge Forecast Confidence" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:197 +#: src/components/systemconfiguration/DataAccuracy.vue:124 msgid "Gauge Forecast vs. Reality" msgstr "" @@ -746,10 +767,14 @@ msgid "Generated by" msgstr "Generat de" -#: src/components/identify/Identify.vue:106 +#: src/components/identify/Identify.vue:160 msgid "Generated PDFs use font:" msgstr "Genereaza PDF-uri:" +#: src/components/identify/Identify.vue:340 +msgid "Highest confidence" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1062 msgid "hour" msgstr "ora" @@ -777,7 +802,7 @@ msgid "ID" msgstr "Eticheta" -#: src/components/identify/Identify.vue:179 src/components/map/MapPopup.vue:148 +#: src/components/identify/Identify.vue:240 src/components/map/MapPopup.vue:148 #: src/components/toolbar/Identify.vue:49 #, fuzzy msgid "Identified Features" @@ -888,12 +913,12 @@ msgid "Latest Measurement" msgstr "Ultima Masuratoare" -#: src/components/identify/formatter.js:100 +#: src/components/identify/formatter.js:106 #, fuzzy msgid "Latest Waterlevel" msgstr "Nivelul apei" -#: src/components/identify/formatter.js:99 +#: src/components/identify/formatter.js:105 #, fuzzy msgid "Latest Waterlevel Date" msgstr "Nivelul apei" @@ -903,7 +928,7 @@ msgid "Layers" msgstr "Straturi" -#: src/store/map.js:180 +#: src/store/map.js:187 msgid "Length" msgstr "Lungime" @@ -973,7 +998,7 @@ msgid "Measurement" msgstr "Ultima Masuratoare" -#: src/components/identify/formatter.js:102 +#: src/components/identify/formatter.js:108 msgid "Measurement Count in Last 14 Days" msgstr "" @@ -981,13 +1006,13 @@ msgid "measurements in the last 14 days." msgstr "" -#: src/components/identify/formatter.js:79 -#: src/components/identify/formatter.js:90 +#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:96 msgid "Min. G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:77 -#: src/components/identify/formatter.js:88 +#: src/components/identify/formatter.js:83 +#: src/components/identify/formatter.js:94 msgid "Min. Gauge Waterlevel Date" msgstr "" @@ -1018,12 +1043,26 @@ #: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:6 #: src/components/identify/formatter.js:7 -#: src/components/sections/Sections.vue:133 -#: src/components/stretches/Stretches.vue:133 +#: src/components/sections/Sections.vue:124 +#: src/components/stretches/Stretches.vue:124 #: src/components/systemconfiguration/PDFTemplates.vue:117 msgid "Name" msgstr "Nume" +#: src/components/identify/Identify.vue:252 +#: src/components/identify/Identify.vue:253 +#: src/components/identify/Identify.vue:254 +#: src/components/identify/Identify.vue:266 +#: src/components/identify/Identify.vue:267 +#: src/components/identify/Identify.vue:268 +msgid "Nash-Sutcliffe" +msgstr "" + +#: src/components/identify/Identify.vue:255 +#: src/components/identify/Identify.vue:269 +msgid "Nash-Sutcliffe not available" +msgstr "" + #: src/components/sections/SectionForm.vue:131 #: src/components/stretches/StretchForm.vue:148 msgid "National Object name" @@ -1047,12 +1086,12 @@ msgid "New import" msgstr "Import nou" -#: src/components/sections/Sections.vue:75 +#: src/components/sections/Sections.vue:66 #, fuzzy msgid "New section" msgstr "Sector nou" -#: src/components/stretches/Stretches.vue:75 +#: src/components/stretches/Stretches.vue:66 msgid "New stretch" msgstr "Sector nou" @@ -1066,7 +1105,7 @@ msgid "No data available." msgstr "Nu sunt disponibile date." -#: src/components/identify/Identify.vue:68 +#: src/components/identify/Identify.vue:122 msgid "No features identified." msgstr "Nicio caracteristica identificata." @@ -1078,7 +1117,7 @@ msgid "No style-changes" msgstr "" -#: src/components/stretches/Stretches.vue:209 +#: src/components/stretches/Stretches.vue:200 msgid "Not implemented" msgstr "Nu este implementat" @@ -1087,7 +1126,7 @@ msgstr "Noiembrie" #: src/components/gauge/HydrologicalConditions.vue:630 -#: src/components/gauge/Waterlevel.vue:725 +#: src/components/gauge/Waterlevel.vue:735 msgid "Now" msgstr "Acum" @@ -1342,6 +1381,11 @@ msgid "quarterly" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:6 +#, fuzzy +msgid "Recency of Bottleneck Surveys" +msgstr "Puncte critice" + #: src/components/Pdftool.vue:722 msgid "Ref gauge" msgstr "Mira de referinta" @@ -1375,8 +1419,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:44 #: src/components/systemconfiguration/DataAccuracy.vue:274 #: src/components/systemconfiguration/MapLayers.vue:58 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:97 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:198 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:101 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:208 msgid "Reset to defaults" msgstr "" @@ -1392,8 +1436,8 @@ msgid "retryDescription" msgstr "" -#: src/components/sections/Sections.vue:142 -#: src/components/stretches/Stretches.vue:142 +#: src/components/sections/Sections.vue:133 +#: src/components/stretches/Stretches.vue:133 msgid "Review pending import" msgstr "" @@ -1406,6 +1450,10 @@ msgid "Rotate Maps" msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:312 +msgid "Same value is used in multiple fields. Please check" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1074 msgid "Saturday" msgstr "Sambata" @@ -1441,7 +1489,7 @@ msgid "Scheduled" msgstr "Programat" -#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:91 #, fuzzy msgid "Section" msgstr "Proiectie" @@ -1478,8 +1526,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:38 #: src/components/systemconfiguration/DataAccuracy.vue:271 #: src/components/systemconfiguration/MapLayers.vue:55 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:91 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:192 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:95 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:202 msgid "Send" msgstr "Trimite" @@ -1522,7 +1570,7 @@ msgid "Simple" msgstr "" -#: src/components/identify/Identify.vue:93 +#: src/components/identify/Identify.vue:147 msgid "" "Some data ©\n" " <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n" @@ -1545,7 +1593,7 @@ msgid "Sounding Result" msgstr "Rezultate masuratori hidrografice" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:102 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:109 #, fuzzy msgid "Sounding Result Comparison" msgstr "Rezultate masuratori hidrografice" @@ -1554,8 +1602,8 @@ msgid "Soundingresults" msgstr "Rezultate masuratori hidrografice" -#: src/components/sections/Sections.vue:139 -#: src/components/stretches/Stretches.vue:139 +#: src/components/sections/Sections.vue:130 +#: src/components/stretches/Stretches.vue:130 msgid "Source organization" msgstr "Organizatia sursa" @@ -1570,11 +1618,11 @@ msgid "Source orgranization" msgstr "Organizatia sursa" -#: src/components/identify/Identify.vue:90 +#: src/components/identify/Identify.vue:144 msgid "source-code" msgstr "cod sursa" -#: src/components/sections/Sections.vue:205 +#: src/components/sections/Sections.vue:196 msgid "Staging Area" msgstr "Debarcader" @@ -1608,7 +1656,7 @@ msgid "Status" msgstr "Stare" -#: src/components/identify/formatter.js:74 +#: src/components/identify/formatter.js:80 #, fuzzy msgid "Stretch" msgstr "Defineşte sectoarele" @@ -1666,7 +1714,7 @@ msgid "Testmail sent" msgstr "E-mail-ul de test a fost trimis" -#: src/components/systemconfiguration/DataAccuracy.vue:132 +#: src/components/systemconfiguration/DataAccuracy.vue:203 msgid "" "The highest confidence value is less than\n" " <b>%{gm24} cm</b>\n" @@ -1675,13 +1723,13 @@ " within last 72 hours." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:177 +#: src/components/systemconfiguration/DataAccuracy.vue:248 msgid "" "The highest confidence value within the last 24 hours is\n" " greater than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:155 +#: src/components/systemconfiguration/DataAccuracy.vue:226 msgid "" "The highest confidence value within the last 72 hours is\n" " greater than" @@ -1714,19 +1762,19 @@ " respective bottleneck." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:250 +#: src/components/systemconfiguration/DataAccuracy.vue:177 msgid "" "The Nash-Sutcliffe coefficient for last 24 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:230 +#: src/components/systemconfiguration/DataAccuracy.vue:157 msgid "" "The Nash-Sutcliffe coefficient for last 72 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:205 +#: src/components/systemconfiguration/DataAccuracy.vue:132 msgid "" "The Nash-Sutcliffe coefficient is greater than\n" " <b>%{nsc24}</b>\n" @@ -1739,6 +1787,10 @@ msgid "The provided template has no name property." msgstr "Templat-ul furnizat nu are nume." +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:331 +msgid "There are invalid classbreak values. Please check" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:88 msgid "There are less than" msgstr "" @@ -1750,11 +1802,11 @@ #: src/components/fairway/Profiles.vue:423 #: src/components/importconfiguration/types/Soundingresults.vue:232 #: src/components/importconfiguration/types/Soundingresults.vue:251 -#: src/components/layers/Layerselect.vue:67 +#: src/components/layers/Layerselect.vue:68 msgid "this" msgstr "" -#: src/components/identify/Identify.vue:84 +#: src/components/identify/Identify.vue:138 msgid "" "This app uses <i>gemma</i>, which is Free Software under <br/>\n" " %{ license } without warranty, see docs for details." @@ -1847,8 +1899,8 @@ msgid "URL" msgstr "URL" -#: src/components/identify/Identify.vue:80 -#: src/components/identify/Identify.vue:182 +#: src/components/identify/Identify.vue:134 +#: src/components/identify/Identify.vue:243 #, fuzzy msgid "User Manual" msgstr "Nume utilizator" @@ -1866,7 +1918,7 @@ msgid "Users" msgstr "Utilizatori" -#: src/components/identify/Identify.vue:99 +#: src/components/identify/Identify.vue:153 msgid "" "Uses\n" " <a href=\"https://download.geonames.org/export/dump/readme.txt" @@ -1896,7 +1948,7 @@ msgstr "Nivelul apei" #: src/components/gauge/HydrologicalConditions.vue:663 -#: src/components/gauge/Waterlevel.vue:611 +#: src/components/gauge/Waterlevel.vue:613 #, fuzzy msgid "Waterlevel [m]" msgstr "Nivelul apei [cm]" @@ -1920,7 +1972,7 @@ msgid "Waterway area" msgstr "Aria caii navigabile" -#: src/components/identify/formatter.js:59 +#: src/components/identify/formatter.js:65 #, fuzzy msgid "Waterway Area" msgstr "Aria caii navigabile" @@ -1929,7 +1981,7 @@ msgid "Waterway axis" msgstr "Axa caii navigabile" -#: src/components/identify/formatter.js:68 +#: src/components/identify/formatter.js:74 #, fuzzy msgid "Waterway Axis" msgstr "Axa caii navigabile" @@ -1938,7 +1990,7 @@ msgid "Waterway gauges" msgstr "Mire ale caii navigabile" -#: src/components/identify/formatter.js:71 +#: src/components/identify/formatter.js:77 #, fuzzy msgid "Waterway Profile" msgstr "Profile ale caii navigabile"
--- a/client/src/locale/sk_SK/LC_MESSAGES/app.po Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/locale/sk_SK/LC_MESSAGES/app.po Thu Sep 05 17:02:03 2019 +0200 @@ -91,6 +91,10 @@ msgid "Accesslog" msgstr "" +#: src/components/identify/Identify.vue:59 +msgid "According gauge data:" +msgstr "" + #: src/components/usermanagement/Userdetail.vue:242 #: src/components/usermanagement/Usermanagement.vue:82 msgid "Add User" @@ -112,7 +116,7 @@ msgid "April" msgstr "" -#: src/store/map.js:207 +#: src/store/map.js:214 msgid "Area" msgstr "Oblasť" @@ -124,6 +128,18 @@ msgid "August" msgstr "" +#: src/components/identify/Identify.vue:324 +msgid "Avail: Below treshold" +msgstr "" + +#: src/components/identify/Identify.vue:321 +msgid "Avail: Last measurement <" +msgstr "" + +#: src/components/identify/Identify.vue:327 +msgid "Avail: Latest measurement older than" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:61 msgid "Availability of Gauge Measurements" msgstr "" @@ -170,7 +186,7 @@ #: src/components/gauge/HydrologicalConditions.vue:237 #: src/components/gauge/HydrologicalConditions.vue:1040 #: src/components/gauge/Waterlevel.vue:240 -#: src/components/gauge/Waterlevel.vue:1164 +#: src/components/gauge/Waterlevel.vue:1178 #: src/components/importconfiguration/Import.vue:130 #: src/components/importconfiguration/Import.vue:147 #: src/components/importconfiguration/Import.vue:166 @@ -193,15 +209,15 @@ #: src/components/importoverview/LogEntry.vue:160 #: src/components/importoverview/SectionDetails.vue:109 #: src/components/importoverview/StretchDetails.vue:113 -#: src/components/layers/Layerselect.vue:137 src/components/map/Map.vue:203 +#: src/components/layers/Layerselect.vue:158 src/components/map/Map.vue:213 #: src/components/sections/SectionForm.vue:339 -#: src/components/sections/Sections.vue:179 -#: src/components/sections/Sections.vue:189 -#: src/components/sections/Sections.vue:231 +#: src/components/sections/Sections.vue:170 +#: src/components/sections/Sections.vue:180 +#: src/components/sections/Sections.vue:222 #: src/components/stretches/StretchForm.vue:362 -#: src/components/stretches/Stretches.vue:179 -#: src/components/stretches/Stretches.vue:189 -#: src/components/stretches/Stretches.vue:241 +#: src/components/stretches/Stretches.vue:170 +#: src/components/stretches/Stretches.vue:180 +#: src/components/stretches/Stretches.vue:232 #: src/components/systemconfiguration/PDFTemplates.vue:165 #: src/components/systemconfiguration/PDFTemplates.vue:254 #: src/components/systemconfiguration/PDFTemplates.vue:292 @@ -247,7 +263,7 @@ #: src/components/fairway/Profiles.vue:654 #: src/components/importconfiguration/Import.vue:204 #: src/components/importoverview/ImportOverview.vue:447 -#: src/components/stretches/Stretches.vue:215 +#: src/components/stretches/Stretches.vue:206 #: src/components/systemconfiguration/PDFTemplates.vue:331 #: src/components/usermanagement/Usermanagement.vue:268 msgid "Cancel" @@ -262,7 +278,7 @@ msgid "Choose a distance mark by clicking on the map." msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:275 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:294 msgid "Choose color" msgstr "" @@ -290,6 +306,14 @@ msgid "Compare with" msgstr "" +#: src/components/identify/Identify.vue:343 +msgid "Confidence per 24h" +msgstr "" + +#: src/components/identify/Identify.vue:342 +msgid "Confidence per 72h" +msgstr "" + #: src/components/Sidebar.vue:65 msgid "Configuration" msgstr "" @@ -321,11 +345,6 @@ msgid "Cronstring" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:6 -#, fuzzy -msgid "Currency of Bottleneck Surveys" -msgstr "Brody a úžiny" - #: src/components/fairway/Profiles.vue:59 msgid "Current Waterlevel" msgstr "" @@ -334,21 +353,21 @@ msgid "Data Availability/Accuracy" msgstr "" -#: src/components/identify/Identify.vue:194 -msgid "Data too old. Treshold: " +#: src/components/identify/Identify.vue:360 +msgid "Data too old. Treshold:" msgstr "" -#: src/components/identify/Identify.vue:191 -msgid "Data within revisiting treshold " +#: src/components/identify/Identify.vue:357 +msgid "Data within revisiting treshold" msgstr "" -#: src/components/identify/Identify.vue:189 +#: src/components/identify/Identify.vue:355 msgid "Data within the revisiting time" msgstr "" #: src/components/importconfiguration/types/Soundingresults.vue:94 -#: src/components/sections/Sections.vue:136 -#: src/components/stretches/Stretches.vue:136 +#: src/components/sections/Sections.vue:127 +#: src/components/stretches/Stretches.vue:127 #: src/components/systemconfiguration/PDFTemplates.vue:120 msgid "Date" msgstr "" @@ -391,7 +410,7 @@ msgid "Define sections" msgstr "" -#: src/components/sections/Sections.vue:130 +#: src/components/sections/Sections.vue:121 msgid "Define Sections" msgstr "" @@ -399,13 +418,13 @@ msgid "Define stretches" msgstr "" -#: src/components/stretches/Stretches.vue:130 +#: src/components/stretches/Stretches.vue:121 msgid "Define Stretches" msgstr "" #: src/components/fairway/Profiles.vue:639 #: src/components/importconfiguration/Import.vue:182 -#: src/components/stretches/Stretches.vue:205 +#: src/components/stretches/Stretches.vue:196 #: src/components/systemconfiguration/PDFTemplates.vue:308 #: src/components/usermanagement/Usermanagement.vue:242 msgid "Delete" @@ -419,7 +438,7 @@ msgid "Delete Import" msgstr "" -#: src/components/stretches/Stretches.vue:197 +#: src/components/stretches/Stretches.vue:188 msgid "Delete Stretch" msgstr "" @@ -447,8 +466,8 @@ msgid "deleted successfully" msgstr "" -#: src/components/sections/Sections.vue:206 -#: src/components/stretches/Stretches.vue:210 +#: src/components/sections/Sections.vue:197 +#: src/components/stretches/Stretches.vue:201 msgid "Deleting " msgstr "" @@ -476,11 +495,11 @@ msgid "Depthreference" msgstr "" -#: src/components/identify/formatter.js:62 +#: src/components/identify/formatter.js:68 msgid "Distance Mark" msgstr "" -#: src/components/identify/formatter.js:65 +#: src/components/identify/formatter.js:71 msgid "Distance Mark ashore" msgstr "" @@ -508,11 +527,11 @@ msgid "Do you really want to delete the import with ID" msgstr "" -#: src/components/stretches/Stretches.vue:199 +#: src/components/stretches/Stretches.vue:190 msgid "Do you really want to delete this stretch:" msgstr "" -#: src/components/identify/Identify.vue:76 +#: src/components/identify/Identify.vue:130 msgid "Download" msgstr "" @@ -687,15 +706,15 @@ msgid "G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:96 +#: src/components/identify/formatter.js:102 msgid "Gauge" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:195 +msgid "Gauge Forecast Confidence" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:124 -msgid "Gauge Forecast Confidence" -msgstr "" - -#: src/components/systemconfiguration/DataAccuracy.vue:197 msgid "Gauge Forecast vs. Reality" msgstr "" @@ -724,10 +743,14 @@ msgid "Generated by" msgstr "" -#: src/components/identify/Identify.vue:106 +#: src/components/identify/Identify.vue:160 msgid "Generated PDFs use font:" msgstr "" +#: src/components/identify/Identify.vue:340 +msgid "Highest confidence" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1062 msgid "hour" msgstr "" @@ -754,7 +777,7 @@ msgid "ID" msgstr "" -#: src/components/identify/Identify.vue:179 src/components/map/MapPopup.vue:148 +#: src/components/identify/Identify.vue:240 src/components/map/MapPopup.vue:148 #: src/components/toolbar/Identify.vue:49 msgid "Identified Features" msgstr "" @@ -862,11 +885,11 @@ msgid "Latest Measurement" msgstr "" -#: src/components/identify/formatter.js:100 +#: src/components/identify/formatter.js:106 msgid "Latest Waterlevel" msgstr "" -#: src/components/identify/formatter.js:99 +#: src/components/identify/formatter.js:105 msgid "Latest Waterlevel Date" msgstr "" @@ -875,7 +898,7 @@ msgid "Layers" msgstr "Vrstvy" -#: src/store/map.js:180 +#: src/store/map.js:187 msgid "Length" msgstr "" @@ -945,7 +968,7 @@ msgid "Measurement" msgstr "" -#: src/components/identify/formatter.js:102 +#: src/components/identify/formatter.js:108 msgid "Measurement Count in Last 14 Days" msgstr "" @@ -953,13 +976,13 @@ msgid "measurements in the last 14 days." msgstr "" -#: src/components/identify/formatter.js:79 -#: src/components/identify/formatter.js:90 +#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:96 msgid "Min. G.W. Count in Last 14 Days" msgstr "" -#: src/components/identify/formatter.js:77 -#: src/components/identify/formatter.js:88 +#: src/components/identify/formatter.js:83 +#: src/components/identify/formatter.js:94 msgid "Min. Gauge Waterlevel Date" msgstr "" @@ -989,12 +1012,26 @@ #: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:6 #: src/components/identify/formatter.js:7 -#: src/components/sections/Sections.vue:133 -#: src/components/stretches/Stretches.vue:133 +#: src/components/sections/Sections.vue:124 +#: src/components/stretches/Stretches.vue:124 #: src/components/systemconfiguration/PDFTemplates.vue:117 msgid "Name" msgstr "Názov" +#: src/components/identify/Identify.vue:252 +#: src/components/identify/Identify.vue:253 +#: src/components/identify/Identify.vue:254 +#: src/components/identify/Identify.vue:266 +#: src/components/identify/Identify.vue:267 +#: src/components/identify/Identify.vue:268 +msgid "Nash-Sutcliffe" +msgstr "" + +#: src/components/identify/Identify.vue:255 +#: src/components/identify/Identify.vue:269 +msgid "Nash-Sutcliffe not available" +msgstr "" + #: src/components/sections/SectionForm.vue:131 #: src/components/stretches/StretchForm.vue:148 msgid "National Object name" @@ -1017,11 +1054,11 @@ msgid "New import" msgstr "" -#: src/components/sections/Sections.vue:75 +#: src/components/sections/Sections.vue:66 msgid "New section" msgstr "" -#: src/components/stretches/Stretches.vue:75 +#: src/components/stretches/Stretches.vue:66 msgid "New stretch" msgstr "" @@ -1035,7 +1072,7 @@ msgid "No data available." msgstr "" -#: src/components/identify/Identify.vue:68 +#: src/components/identify/Identify.vue:122 msgid "No features identified." msgstr "" @@ -1047,7 +1084,7 @@ msgid "No style-changes" msgstr "" -#: src/components/stretches/Stretches.vue:209 +#: src/components/stretches/Stretches.vue:200 msgid "Not implemented" msgstr "" @@ -1056,7 +1093,7 @@ msgstr "" #: src/components/gauge/HydrologicalConditions.vue:630 -#: src/components/gauge/Waterlevel.vue:725 +#: src/components/gauge/Waterlevel.vue:735 msgid "Now" msgstr "" @@ -1309,6 +1346,11 @@ msgid "quarterly" msgstr "" +#: src/components/systemconfiguration/DataAccuracy.vue:6 +#, fuzzy +msgid "Recency of Bottleneck Surveys" +msgstr "Brody a úžiny" + #: src/components/Pdftool.vue:722 msgid "Ref gauge" msgstr "" @@ -1340,8 +1382,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:44 #: src/components/systemconfiguration/DataAccuracy.vue:274 #: src/components/systemconfiguration/MapLayers.vue:58 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:97 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:198 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:101 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:208 msgid "Reset to defaults" msgstr "" @@ -1357,8 +1399,8 @@ msgid "retryDescription" msgstr "" -#: src/components/sections/Sections.vue:142 -#: src/components/stretches/Stretches.vue:142 +#: src/components/sections/Sections.vue:133 +#: src/components/stretches/Stretches.vue:133 msgid "Review pending import" msgstr "" @@ -1371,6 +1413,10 @@ msgid "Rotate Maps" msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:312 +msgid "Same value is used in multiple fields. Please check" +msgstr "" + #: src/components/importconfiguration/ScheduledImports.vue:1074 msgid "Saturday" msgstr "" @@ -1405,7 +1451,7 @@ msgid "Scheduled" msgstr "" -#: src/components/identify/formatter.js:85 +#: src/components/identify/formatter.js:91 msgid "Section" msgstr "" @@ -1438,8 +1484,8 @@ #: src/components/systemconfiguration/ColorSettings.vue:38 #: src/components/systemconfiguration/DataAccuracy.vue:271 #: src/components/systemconfiguration/MapLayers.vue:55 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:91 -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:192 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:95 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:202 msgid "Send" msgstr "Poslať" @@ -1480,7 +1526,7 @@ msgid "Simple" msgstr "" -#: src/components/identify/Identify.vue:93 +#: src/components/identify/Identify.vue:147 msgid "" "Some data ©\n" " <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n" @@ -1499,7 +1545,7 @@ msgid "Sounding Result" msgstr "" -#: src/components/systemconfiguration/MorphologyClassbreaks.vue:102 +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:109 msgid "Sounding Result Comparison" msgstr "" @@ -1507,8 +1553,8 @@ msgid "Soundingresults" msgstr "" -#: src/components/sections/Sections.vue:139 -#: src/components/stretches/Stretches.vue:139 +#: src/components/sections/Sections.vue:130 +#: src/components/stretches/Stretches.vue:130 msgid "Source organization" msgstr "" @@ -1522,11 +1568,11 @@ msgid "Source orgranization" msgstr "" -#: src/components/identify/Identify.vue:90 +#: src/components/identify/Identify.vue:144 msgid "source-code" msgstr "" -#: src/components/sections/Sections.vue:205 +#: src/components/sections/Sections.vue:196 msgid "Staging Area" msgstr "" @@ -1559,7 +1605,7 @@ msgid "Status" msgstr "" -#: src/components/identify/formatter.js:74 +#: src/components/identify/formatter.js:80 msgid "Stretch" msgstr "" @@ -1614,7 +1660,7 @@ msgid "Testmail sent" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:132 +#: src/components/systemconfiguration/DataAccuracy.vue:203 msgid "" "The highest confidence value is less than\n" " <b>%{gm24} cm</b>\n" @@ -1623,13 +1669,13 @@ " within last 72 hours." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:177 +#: src/components/systemconfiguration/DataAccuracy.vue:248 msgid "" "The highest confidence value within the last 24 hours is\n" " greater than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:155 +#: src/components/systemconfiguration/DataAccuracy.vue:226 msgid "" "The highest confidence value within the last 72 hours is\n" " greater than" @@ -1662,19 +1708,19 @@ " respective bottleneck." msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:250 +#: src/components/systemconfiguration/DataAccuracy.vue:177 msgid "" "The Nash-Sutcliffe coefficient for last 24 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:230 +#: src/components/systemconfiguration/DataAccuracy.vue:157 msgid "" "The Nash-Sutcliffe coefficient for last 72 hours is less\n" " than" msgstr "" -#: src/components/systemconfiguration/DataAccuracy.vue:205 +#: src/components/systemconfiguration/DataAccuracy.vue:132 msgid "" "The Nash-Sutcliffe coefficient is greater than\n" " <b>%{nsc24}</b>\n" @@ -1687,6 +1733,10 @@ msgid "The provided template has no name property." msgstr "" +#: src/components/systemconfiguration/MorphologyClassbreaks.vue:331 +msgid "There are invalid classbreak values. Please check" +msgstr "" + #: src/components/systemconfiguration/DataAccuracy.vue:88 msgid "There are less than" msgstr "" @@ -1698,11 +1748,11 @@ #: src/components/fairway/Profiles.vue:423 #: src/components/importconfiguration/types/Soundingresults.vue:232 #: src/components/importconfiguration/types/Soundingresults.vue:251 -#: src/components/layers/Layerselect.vue:67 +#: src/components/layers/Layerselect.vue:68 msgid "this" msgstr "" -#: src/components/identify/Identify.vue:84 +#: src/components/identify/Identify.vue:138 msgid "" "This app uses <i>gemma</i>, which is Free Software under <br/>\n" " %{ license } without warranty, see docs for details." @@ -1789,8 +1839,8 @@ msgid "URL" msgstr "" -#: src/components/identify/Identify.vue:80 -#: src/components/identify/Identify.vue:182 +#: src/components/identify/Identify.vue:134 +#: src/components/identify/Identify.vue:243 msgid "User Manual" msgstr "" @@ -1807,7 +1857,7 @@ msgid "Users" msgstr "" -#: src/components/identify/Identify.vue:99 +#: src/components/identify/Identify.vue:153 msgid "" "Uses\n" " <a href=\"https://download.geonames.org/export/dump/readme.txt" @@ -1833,7 +1883,7 @@ msgstr "" #: src/components/gauge/HydrologicalConditions.vue:663 -#: src/components/gauge/Waterlevel.vue:611 +#: src/components/gauge/Waterlevel.vue:613 msgid "Waterlevel [m]" msgstr "" @@ -1854,7 +1904,7 @@ msgid "Waterway area" msgstr "" -#: src/components/identify/formatter.js:59 +#: src/components/identify/formatter.js:65 msgid "Waterway Area" msgstr "" @@ -1862,7 +1912,7 @@ msgid "Waterway axis" msgstr "" -#: src/components/identify/formatter.js:68 +#: src/components/identify/formatter.js:74 msgid "Waterway Axis" msgstr "" @@ -1870,7 +1920,7 @@ msgid "Waterway gauges" msgstr "" -#: src/components/identify/formatter.js:71 +#: src/components/identify/formatter.js:77 msgid "Waterway Profile" msgstr ""
--- a/client/src/store/fairwayavailability.js Thu Sep 05 16:55:40 2019 +0200 +++ b/client/src/store/fairwayavailability.js Thu Sep 05 17:02:03 2019 +0200 @@ -4,7 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later * License-Filename: LICENSES/AGPL-3.0.txt * - * Copyright (C) 2018 by via donau + * Copyright (C) 2018, 2019 by via donau * – Österreichische Wasserstraßen-Gesellschaft mbH * Software engineering by Intevation GmbH * @@ -178,9 +178,6 @@ setSelectedFairwayAvailability: (state, feature) => { state.selectedFairwayAvailabilityFeature = feature; }, - setFwData: (state, fwData) => { - state.fwData = fwData; - }, setFwLNWLData: (state, fwLNWLData) => { state.fwLNWLData = fwLNWLData; }, @@ -195,8 +192,17 @@ state.fwLNWLOverviewData.splice(existingIndex, 1); state.fwLNWLOverviewData.push(data); }, - setLegend: (state, header) => { - const headerEntries = header.split(","); + setLegendLNWL: (state, headerLNWL) => { + state.headerLNWL = headerLNWL; + }, + // See docs/developers.md for an example how to directly + // call this method for testing. + setAvailableFairwayDepthData: (state, data) => { + state.csv = data; + const csv = data.split("\n").filter(x => x !== ""); //omit empty lines + + // setLegend + const headerEntries = csv.shift().split(","); headerEntries.shift(); headerEntries.shift(); state.legend = headerEntries.map(x => { @@ -204,9 +210,8 @@ entry = entry.replace("[h]", "").trim(); // omit unit return entry; }); - }, - setLegendLNWL: (state, headerLNWL) => { - this.headerLNWL = headerLNWL; + + state.fwData = transformAFD(csv); } }, actions: { @@ -247,12 +252,7 @@ headers: { "X-Gemma-Auth": localStorage.getItem("token") } }) .then(response => { - const { data } = response; - commit("setCSV", data); - const csv = data.split("\n").filter(x => x !== ""); //omit empty lines - commit("setLegend", csv.shift()); - let transformed = transformAFD(csv); - commit("setFwData", transformed); + commit("setAvailableFairwayDepthData", response.data); resolve(response); }) .catch(error => {
--- a/pkg/controllers/routes.go Thu Sep 05 16:55:40 2019 +0200 +++ b/pkg/controllers/routes.go Thu Sep 05 17:02:03 2019 +0200 @@ -229,6 +229,9 @@ api.Handle("/imports/ugm", waterwayAdmin( importUploadedGaugeMeasurement())).Methods(http.MethodPost) + api.Handle("/imports/stsh", sysAdmin( + importUploadedStretchShape())).Methods(http.MethodPost) + api.Handle("/imports/{kind:st}", sysAdmin(&mw.JSONHandler{ Input: importModel, Handle: manualImport,
--- a/pkg/controllers/shapestretches.go Thu Sep 05 16:55:40 2019 +0200 +++ b/pkg/controllers/shapestretches.go Thu Sep 05 17:02:03 2019 +0200 @@ -23,6 +23,7 @@ "net/http" "os" "path/filepath" + "strings" "time" "github.com/gorilla/mux" @@ -75,8 +76,6 @@ } } - log.Printf("info: total number points: %d\n", n) - return ps } @@ -84,24 +83,24 @@ points := flattenPoints(mp) - p := &shp.Polygon{} - var numParts int for _, pl := range mp { numParts += len(pl) } - log.Printf("info: number parts: %d\n", numParts) - + p := &shp.Polygon{} p.NumParts = int32(numParts) p.NumPoints = int32(len(points)) p.Parts = make([]int32, numParts) var marker int32 - - for i, pl := range mp { - p.Parts[i] = marker - marker += int32(len(pl)) + var i int + for _, pl := range mp { + for _, r := range pl { + p.Parts[i] = marker + i++ + marker += int32(len(r)) + } } p.Points = points @@ -216,12 +215,43 @@ } defer writer.Close() - // TODO: Write geometry + fields := []shp.Field{ + shp.StringField("NAME", 50), + shp.StringField("OBJNAM", 50), + shp.StringField("NOBJNAM", 50), + shp.StringField("LOWER", 25), + shp.StringField("UPPER", 25), + shp.StringField("SOURCE", 50), + shp.StringField("DATEINFO", 25), + shp.StringField("COUNTRIES", 50), + } + + writer.SetFields(fields) + p := asShpPolygon(geom) writer.Write(p) - return nil + write := func(field int, v interface{}) { + if err == nil { + err = writer.WriteAttribute(0, field, v) + } + } + + write(0, name) + write(1, objnam) + if nobjnam.Valid { + write(2, nobjnam.String) + } + write(3, lower) + write(4, upper) + write(5, source) + write(6, dateInfo.Format(time.RFC3339)) + if len(countries) > 0 { + write(7, strings.Join(countries, ",")) + } + + return err }(); err != nil { http.Error( rw, fmt.Sprintf("creating shapefile failed: %v.", err),
--- a/pkg/controllers/uploadedimports.go Thu Sep 05 16:55:40 2019 +0200 +++ b/pkg/controllers/uploadedimports.go Thu Sep 05 17:02:03 2019 +0200 @@ -135,6 +135,16 @@ ) } +func importUploadedStretchShape() http.HandlerFunc { + return uploadedImport( + imports.STSHJobKind, + "stretch.zip", + func(_ *http.Request, dir string) (imports.Job, error) { + return &imports.StretchShape{Dir: dir}, nil + }, + ) +} + func (bup badUploadParameterError) Error() string { return string(bup) }
--- a/pkg/geoserver/templates.go Thu Sep 05 16:55:40 2019 +0200 +++ b/pkg/geoserver/templates.go Thu Sep 05 17:02:03 2019 +0200 @@ -11,6 +11,7 @@ // Author(s): // * Sascha L. Teichmann <sascha.teichmann@intevation.de> // * Markus Kottländer <markus.kottlaender@intevation.de> +// * Bernhard Reiter <bernhard.reiter@intevation.de> package geoserver @@ -18,6 +19,7 @@ "context" "database/sql" "regexp" + "strconv" "strings" "text/template" @@ -54,6 +56,9 @@ } func templateConfigValues(tmplTxt string) (string, error) { + // As SLDs cannot handle opacity as hex part of the color setting + // we split out the 7-8 chars of keys ending on "_fill" color settings + // into keys ending on "_fill_opacity" tmpl, err := template.New("template").Parse(tmplTxt) if err != nil { return "", err @@ -61,11 +66,45 @@ // Try to extract the needed keys from the template. keys := extractKeysFromTemplate(tmplTxt) + + // filter out keys ending on "_opacity" and put them in their own slice + var opacityKeys []string + n := 0 + for _, key := range keys { + if strings.HasSuffix(key, "_opacity") { + opacityKeys = append(opacityKeys, key) + } else { + keys[n] = key + n++ + } + } + keys = keys[:n] + kv, err := loadConfigValues(keys) if err != nil { return "", err } + // if there convert opacity hex value into float between 0-1 + // otherwise just use 1.0 + for _, opacityKey := range opacityKeys { + fillKey := opacityKey[0 : len(opacityKey)-8] + fillValue := kv[fillKey] + if fillValue != "" && len(fillValue) == 9 { + opacity, err := strconv.ParseInt(fillValue[7:9], 16, 0) + if err == nil { + kv[opacityKey] = strconv.FormatFloat( + float64(opacity)/255, 'f', 2, 64) + kv[fillKey] = kv[fillKey][0:7] + } else { + return "", err + } + + } else { + kv[opacityKey] = "1.0" + } + } + var buf strings.Builder if err = tmpl.Execute(&buf, kv); err != nil { return "", err
--- a/pkg/imports/st.go Thu Sep 05 16:55:40 2019 +0200 +++ b/pkg/imports/st.go Thu Sep 05 17:02:03 2019 +0200 @@ -40,9 +40,7 @@ type stJobCreator struct{} -func init() { - RegisterJobCreator(STJobKind, stJobCreator{}) -} +func init() { RegisterJobCreator(STJobKind, stJobCreator{}) } func (stJobCreator) Description() string { return "stretch" }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/imports/stsh.go Thu Sep 05 17:02:03 2019 +0200 @@ -0,0 +1,368 @@ +// 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) 2019 by via donau +// – Österreichische Wasserstraßen-Gesellschaft mbH +// Software engineering by Intevation GmbH +// +// Author(s): +// * Sascha L. Teichmann <sascha.teichmann@intevation.de> + +package imports + +import ( + "archive/zip" + "context" + "database/sql" + "errors" + "fmt" + "os" + "path" + "path/filepath" + "strings" + "time" + + shp "github.com/jonas-p/go-shp" + + "gemma.intevation.de/gemma/pkg/common" + "gemma.intevation.de/gemma/pkg/models" +) + +type StretchShape struct { + Dir string `json:"dir"` +} + +const STSHJobKind JobKind = "stsh" + +type stshJobCreator struct{} + +func init() { RegisterJobCreator(STSHJobKind, stshJobCreator{}) } + +func (stshJobCreator) Description() string { return "stretch from shape" } + +func (stshJobCreator) AutoAccept() bool { return false } + +func (stshJobCreator) Create() Job { return new(StretchShape) } + +func (stshJobCreator) Depends() [2][]string { + return [2][]string{ + {"stretches", "stretch_countries"}, + {}, + } +} + +const ( + stshInsertSQL = ` +INSERT INTO waterway.stretches ( + name, + stretch, + area, + objnam, + nobjnam, + date_info, + source_organization +) VALUES ( + $1, + isrsrange(isrs_fromText($2), isrs_fromText($3)), + ST_GeomFromWKB($4, 4326), + $5, + $6, + $7, + $8) +RETURNING id` +) + +// StageDone is merely the same as for the normal stretch import. +func (stshJobCreator) StageDone( + ctx context.Context, + tx *sql.Tx, + id int64, +) error { + return stJobCreator{}.StageDone(ctx, tx, id) +} + +func (stsh *StretchShape) CleanUp() error { + return os.RemoveAll(stsh.Dir) +} + +func fixAttribute(s string) string { + return strings.TrimRight(s, "\x00") +} + +type stretchSummary struct { + ID int64 `json:"id"` + Name string `json:"name"` + From string `json:"from"` + To string `json:"to"` + ObjNam string `json:"objnam"` + NObjNam *string `json:"nobjnam"` + Date models.Date `json:"date-info"` + Countries models.UniqueCountries `json:"countries"` +} + +func parseUniqueCountries(s string) (models.UniqueCountries, error) { + unique := map[models.Country]struct{}{} + var countries models.UniqueCountries + for _, c := range strings.Split(s, ",") { + if c = strings.ToUpper(strings.TrimSpace(c)); c == "" { + continue + } + n := models.Country(c) + if !n.Valid() { + return nil, fmt.Errorf("'%s' is not a valid country code", c) + } + if _, found := unique[n]; found { + return nil, fmt.Errorf("'%s' is not a unique country code", c) + } + countries = append(countries, n) + unique[n] = struct{}{} + } + return countries, nil +} + +func (stsh *StretchShape) Do( + ctx context.Context, + importID int64, + conn *sql.Conn, + feedback Feedback, +) (interface{}, error) { + + start := time.Now() + defer func() { + feedback.Info("Storing stretches from shape file took %v.", + time.Since(start)) + }() + + zpath := filepath.Join(stsh.Dir, "stretch.zip") + + z, err := zip.OpenReader(zpath) + if err != nil { + return nil, err + } + defer z.Close() + + shpF := common.FindInZIP(z, ".shp") + if shpF == nil { + return nil, errors.New("no SHP file found in ZIP") + } + prefix := strings.TrimSuffix(shpF.Name, path.Ext(shpF.Name)) + dbfF := common.FindInZIP(z, prefix+".dbf") + if dbfF == nil { + return nil, fmt.Errorf("no DBF file found for %s", shpF.Name) + } + + shpR, err := shpF.Open() + if err != nil { + return nil, err + } + + dbfR, err := dbfF.Open() + if err != nil { + shpR.Close() + return nil, err + } + sr := shp.SequentialReaderFromExt(shpR, dbfR) + defer sr.Close() + + fields := sr.Fields() + + // Map the attribute column indices. + + var ( + nameIdx = -1 + objnamIdx = -1 + nobjnamIdx = -1 + lowerIdx = -1 + upperIdx = -1 + sourceIdx = -1 + dateInfoIdx = -1 + countriesIdx = -1 + ) + + type index struct { + name string + idx *int + } + + indices := []index{ + {"name", &nameIdx}, + {"objnam", &objnamIdx}, + {"nobjnam", &nobjnamIdx}, + {"lower", &lowerIdx}, + {"upper", &upperIdx}, + {"source", &sourceIdx}, + {"source", &sourceIdx}, + {"dateinfo", &dateInfoIdx}, + {"countries", &countriesIdx}, + } + +nextField: + for i := range fields { + name := strings.ToLower(fields[i].String()) + for j := range indices { + if name == indices[j].name { + *indices[j].idx = i + continue nextField + } + } + } + + var missingFields []string + + for i := range indices { + if *indices[i].idx == -1 { + missingFields = append(missingFields, indices[i].name) + } + } + + if len(missingFields) > 0 { + return nil, fmt.Errorf("missing fields in attributes: %s", + strings.Join(missingFields, ", ")) + } + + // Now we have ensured that all columns are in place + // so start extracting data from the shape file. + + tx, err := conn.BeginTx(ctx, nil) + if err != nil { + return nil, err + } + defer tx.Rollback() + + insStmt, err := tx.PrepareContext(ctx, stshInsertSQL) + if err != nil { + return nil, err + } + defer insStmt.Close() + + insCountryStmt, err := tx.PrepareContext(ctx, stInsertCountrySQL) + if err != nil { + return nil, err + } + defer insCountryStmt.Close() + + trackStmt, err := tx.PrepareContext(ctx, trackImportSQL) + if err != nil { + return nil, err + } + defer trackStmt.Close() + + var stretches []*stretchSummary + + for sr.Next() { + + _, p := sr.Shape() + if p == nil { + feedback.Warn("Invalid NULL geometry found.") + continue + } + poly, err := shapeToPolygon(p) + if err != nil { + feedback.Warn("Invalid geometry found: %v.", err) + continue + } + + var ( + name = fixAttribute(sr.Attribute(nameIdx)) + objnam = fixAttribute(sr.Attribute(objnamIdx)) + nobjnam = fixAttribute(sr.Attribute(nobjnamIdx)) + lower = fixAttribute(sr.Attribute(lowerIdx)) + upper = fixAttribute(sr.Attribute(upperIdx)) + dateInfo = fixAttribute(sr.Attribute(dateInfoIdx)) + source = fixAttribute(sr.Attribute(sourceIdx)) + cnts = fixAttribute(sr.Attribute(countriesIdx)) + ) + + feedback.Info("Importing stretch %s (%s - %s).", + name, lower, upper) + + date, err := common.ParseTime(dateInfo) + if err != nil { + feedback.Warn("Invalid time value: %v.", err) + continue + } + + countries, err := parseUniqueCountries(cnts) + if err != nil { + feedback.Warn("Countries: %v.", err) + continue + } + + var nobjnamNull sql.NullString + if nobjnam != "" { + nobjnamNull = sql.NullString{ + String: nobjnam, + Valid: true, + } + } + + // Convert to a multi polygon. + area := poly.MultiPolygonGeom().AsWKB() + + var id int64 + + if err := insStmt.QueryRowContext( + ctx, + name, + lower, upper, + area, + objnam, + nobjnamNull, + date, + source, + ).Scan(&id); err != nil { + return nil, err + } + + // Store the countries + for _, country := range countries { + if _, err := insCountryStmt.ExecContext(ctx, country); err != nil { + return nil, err + } + } + + // Finally track the stretch + + if _, err := trackStmt.ExecContext( + ctx, + importID, + "waterway.stretches", + id, + ); err != nil { + return nil, err + } + + stretch := &stretchSummary{ + ID: id, + Name: name, + From: lower, + To: upper, + ObjNam: objnam, + Date: models.Date{date}, + Countries: countries, + } + + if nobjnamNull.Valid { + stretch.NObjNam = &nobjnamNull.String + } + + stretches = append(stretches, stretch) + } + + if err := sr.Err(); err != nil { + return nil, err + } + + if len(stretches) == 0 { + return nil, UnchangedError("No stretches written.") + } + + if err := tx.Commit(); err != nil { + return nil, err + } + + return stretches, nil +}
--- a/pkg/imports/wkb.go Thu Sep 05 16:55:40 2019 +0200 +++ b/pkg/imports/wkb.go Thu Sep 05 17:02:03 2019 +0200 @@ -55,6 +55,15 @@ return buf.Bytes() } +func (ls lineSlice) LinearRingGeom() wkb.LinearRingGeom { + lr := make(wkb.LinearRingGeom, len(ls)) + for i, v := range ls { + lr[i].X = v[0] + lr[i].Y = v[1] + } + return lr +} + func (p pointSlice) asWKB() []byte { size := 1 + 4 + 2*8 @@ -147,3 +156,27 @@ } return out } + +func (ps polygonSlice) MultiPolygonGeom() wkb.MultiPolygonGeom { + + var mp wkb.MultiPolygonGeom + var curr wkb.PolygonGeom + + for _, r := range ps { + lr := lineSlice(r).LinearRingGeom() + // A counter clockwise ring starts a new polygon. + if lr.CCW() { + if len(curr) > 0 { + mp = append(mp, curr) + curr = wkb.PolygonGeom{} + } + } + curr = append(curr, lr) + } + + if len(curr) > 0 { + mp = append(mp, curr) + } + + return mp +}
--- a/pkg/models/common.go Thu Sep 05 16:55:40 2019 +0200 +++ b/pkg/models/common.go Thu Sep 05 17:02:03 2019 +0200 @@ -81,6 +81,16 @@ } ) +// Valid checks if the given country is a known one. +func (c Country) Valid() bool { + for _, v := range validCountries { + if string(c) == v { + return true + } + } + return false +} + // UnmarshalJSON ensures that the given string forms a valid // two letter country code. func (c *Country) UnmarshalJSON(data []byte) error {
--- a/pkg/wkb/data.go Thu Sep 05 16:55:40 2019 +0200 +++ b/pkg/wkb/data.go Thu Sep 05 17:02:03 2019 +0200 @@ -17,7 +17,6 @@ "bytes" "encoding/binary" "fmt" - "log" "math" ) @@ -31,6 +30,41 @@ MultiPolygonGeom []PolygonGeom ) +func (mpg MultiPolygonGeom) AsWKB() []byte { + + size := 1 + 4 + 4 + for _, pg := range mpg { + size += 1 + 4 + 4 + for _, r := range pg { + size += 4 + 2*8*len(r) + } + } + + buf := bytes.NewBuffer(make([]byte, 0, size)) + + binary.Write(buf, binary.LittleEndian, NDR) + binary.Write(buf, binary.LittleEndian, MultiPolygon) + binary.Write(buf, binary.LittleEndian, uint32(len(mpg))) + + for _, pg := range mpg { + binary.Write(buf, binary.LittleEndian, NDR) + binary.Write(buf, binary.LittleEndian, Polygon) + binary.Write(buf, binary.LittleEndian, uint32(len(pg))) + + for _, r := range pg { + binary.Write(buf, binary.LittleEndian, uint32(len(r))) + for _, p := range r { + x := math.Float64bits(p.X) + y := math.Float64bits(p.Y) + binary.Write(buf, binary.LittleEndian, x) + binary.Write(buf, binary.LittleEndian, y) + } + } + } + + return buf.Bytes() +} + func (mpg *MultiPolygonGeom) FromWKB(data []byte) error { r := bytes.NewReader(data) @@ -56,11 +90,10 @@ return fmt.Errorf("unknown geometry type %x", geomType) } - var numPolygons int32 + var numPolygons uint32 if err := binary.Read(r, order, &numPolygons); err != nil { return err } - log.Printf("info: num polygons: %d\n", numPolygons) polygons := make([]PolygonGeom, numPolygons) @@ -87,7 +120,6 @@ if err := binary.Read(r, order, &numRings); err != nil { return err } - log.Printf("info: num rings: %d\n", numRings) rings := make([]LinearRingGeom, numRings) @@ -96,7 +128,6 @@ if err := binary.Read(r, order, &numPoints); err != nil { return err } - log.Printf("info: num points: %d\n", numPoints) points := make([]PointGeom, numPoints) for k := range points { @@ -120,3 +151,12 @@ *mpg = polygons return nil } + +func (lr LinearRingGeom) CCW() bool { + var sum float64 + for i, v1 := range lr { + v2 := lr[(i+1)%len(lr)] + sum += (v2.X - v1.X) * (v2.Y + v1.Y) + } + return sum > 0 +}
--- a/schema/README.md Thu Sep 05 16:55:40 2019 +0200 +++ b/schema/README.md Thu Sep 05 17:02:03 2019 +0200 @@ -4,3 +4,5 @@ to be more similiar to UML and leave out some less useful labels. See `../docker/README.md` + +Look at `updates/README.md` to how databases are updated.
--- a/schema/default_sysconfig.sql Thu Sep 05 16:55:40 2019 +0200 +++ b/schema/default_sysconfig.sql Thu Sep 05 17:02:03 2019 +0200 @@ -47,11 +47,11 @@ INSERT INTO sys_admin.system_config VALUES ('fairwaydimensionslos3_fill','#ffffff66'); INSERT INTO sys_admin.system_config VALUES ('waterwayprofiles_stroke','#0000ff80'); -INSERT INTO sys_admin.system_config VALUES ('distance_marks_fill', '#ff9999'); +INSERT INTO sys_admin.system_config VALUES ('distance_marks_fill', '#ff99994d'); INSERT INTO sys_admin.system_config VALUES ('distance_marks_stroke', '#6666ff'); -INSERT INTO sys_admin.system_config VALUES ('distance_marks_ashore_fill', '#8888FF'); -INSERT INTO sys_admin.system_config VALUES ('distance_marks_ashore_stroke', '#3333FF'); -INSERT INTO sys_admin.system_config VALUES ('waterway_axis_stroke', '#0000FF'); +INSERT INTO sys_admin.system_config VALUES ('distance_marks_ashore_fill', '#8888ff1a'); +INSERT INTO sys_admin.system_config VALUES ('distance_marks_ashore_stroke', '#3333ff'); +INSERT INTO sys_admin.system_config VALUES ('waterway_axis_stroke', '#0000ff'); INSERT INTO sys_admin.system_config VALUES ('waterway_area_stroke', '#006600'); COMMIT;
--- a/schema/updates/1111/01.styles_config.sql Thu Sep 05 16:55:40 2019 +0200 +++ b/schema/updates/1111/01.styles_config.sql Thu Sep 05 17:02:03 2019 +0200 @@ -1,4 +1,7 @@ -INSERT INTO sys_admin.system_config VALUES ('distance_marks_ashore_fill', '#8888FF') ON CONFLICT (config_key) DO NOTHING; -INSERT INTO sys_admin.system_config VALUES ('distance_marks_ashore_stroke', '#3333FF') ON CONFLICT (config_key) DO NOTHING; -INSERT INTO sys_admin.system_config VALUES ('waterway_axis_stroke', '#0000FF') ON CONFLICT (config_key) DO NOTHING; -INSERT INTO sys_admin.system_config VALUES ('waterway_area_stroke', '#006600') ON CONFLICT (config_key) DO NOTHING; \ No newline at end of file +INSERT INTO sys_admin.system_config VALUES ('distance_marks_fill', '#ff99994d') ON CONFLICT (config_key) DO NOTHING; +INSERT INTO sys_admin.system_config VALUES ('distance_marks_ashore_fill', '#8888ff1a') ON CONFLICT (config_key) DO NOTHING; +INSERT INTO sys_admin.system_config VALUES ('distance_marks_ashore_stroke', '#3333ff') ON CONFLICT (config_key) DO NOTHING; +INSERT INTO sys_admin.system_config VALUES ('waterway_axis_stroke', '#0000ff') ON CONFLICT (config_key) DO NOTHING; +INSERT INTO sys_admin.system_config VALUES ('waterway_area_stroke', '#006600') ON CONFLICT (config_key) DO NOTHING; + +-- The user changed styles will be overwritten with the default values. \ No newline at end of file
--- a/schema/updates/README.md Thu Sep 05 16:55:40 2019 +0200 +++ b/schema/updates/README.md Thu Sep 05 17:02:03 2019 +0200 @@ -69,4 +69,4 @@ database updated using `schema/update-db.sh`! - Update `schema/version.sql`, so that it reflects the new schema - version you just created. + version you've just created.