Mercurial > gemma
changeset 3773:57c8cfff4920 simplify-sounding-results
Merged default into simplify-sounding-results branch.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 01 Jul 2019 11:08:57 +0200 |
parents | 545304d3ff93 (current diff) fd6d62b08af7 (diff) |
children | bb62c98fcf05 |
files | |
diffstat | 10 files changed, 310 insertions(+), 99 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags Mon Jul 01 11:08:19 2019 +0200 +++ b/.hgtags Mon Jul 01 11:08:57 2019 +0200 @@ -7,3 +7,4 @@ 4d69b79e9df6e2b646ac60f75f6655bb3c64f6c6 v2.1.0 4d7b481e1d392cd68c48a4ad19fc2865110e724e v3-uat2 d4a5d11e23a043026a747c626d133b45047d17df v3 +ad93adaeb68827534b1b3dd96c50096b3fa9a24c v3.1-preview20190626
--- a/client/src/components/importconfiguration/ScheduledImports.vue Mon Jul 01 11:08:19 2019 +0200 +++ b/client/src/components/importconfiguration/ScheduledImports.vue Mon Jul 01 11:08:57 2019 +0200 @@ -818,6 +818,8 @@ data["depth"] = this.depth * 1; data["source-organization"] = this.sourceOrganization; } + if (this.waitRetry) data["wait-retry"] = this.waitRetry; + if (this.trys) data["trys"] = Number(this.trys); data["send-email"] = this.eMailNotification; this.triggerActive = false; this.$store
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/importoverview/AGMLogItem.vue Mon Jul 01 11:08:57 2019 +0200 @@ -0,0 +1,113 @@ +<template> + <div class="d-flex flex-column"> + <div class="px-2 d-flex justify-content-between"> + <div class="d-flex"> + <div @click="toggleShow(index)" class="my-auto text-left"> + <UISpinnerButton + :state="show" + :icons="['angle-right', 'angle-down']" + classes="text-info" + /> + </div> + <div> + {{ line["fk-gauge-id"] }} + <sup v-if="isNew(line)" class="text-success"> + (<translate>New</translate>) + </sup> + </div> + </div> + <div>{{ line["measure-date"] | dateTime }}</div> + </div> + <div v-if="show" class="compare-table"> + <div class="row no-gutters px-4 text-left font-weight-bold"> + <div :class="isNew(line) ? 'col-6' : 'col-4'"> + <translate>Value</translate> + </div> + <div v-if="isOld(line)" class="col-4"> + <translate>Old</translate> + </div> + <div :class="isNew(line) ? 'col-6' : 'col-4'"> + <translate>New</translate> + </div> + </div> + <div + class="row no-gutters px-4 text-left" + v-for="(entry, index) in Object.keys(line.versions[0])" + :key="index" + v-if="isNew(line) || isDifferent(line, entry)" + > + <div :class="isNew(line) ? 'col-6' : 'col-4'"> + {{ entry }} + </div> + <div :class="isNew(line) ? 'col-6' : 'col-4'"> + {{ line.versions[0][entry] }} + </div> + <div + v-if="isOld(line) && isDifferent(line, entry)" + :class="isNew(line) ? 'col-6' : 'col-4'" + > + {{ line.versions[1][entry] }} + </div> + </div> + </div> + </div> +</template> + +<script> +export default { + props: ["line", "index", "showDiff"], + computed: { + show() { + return this.index === this.showDiff; + } + }, + methods: { + toggleShow(index) { + this.$emit("openDiff", index); + }, + isNew(result) { + return result && result.versions && result.versions.length === 1; + }, + isOld(result) { + return !this.isNew(result); + }, + isDifferent(result, entry) { + return ( + this.isOld(result) && + result.versions[0][entry] != result.versions[1][entry] + ); + } + } +}; +</script> + +<style lang="sass" scoped> +.diffs + width: 100% + overflow-y: auto + > div + border-top: dashed 1px #dee2e6 + &:first-child + border-top: none + .compare-table + position: relative + overflow: hidden + &::after + content: '' + position: absolute + top: 0 + right: -5px + bottom: 0 + left: -5px + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.4) + > div + font-size: 0.7rem + &:nth-child(odd) + background-color: #f8f9fa + +.split + max-height: 35vh + +.full + max-height: 70vh +</style>
--- a/client/src/components/importoverview/ApprovedGaugeMeasurementDetail.vue Mon Jul 01 11:08:19 2019 +0200 +++ b/client/src/components/importoverview/ApprovedGaugeMeasurementDetail.vue Mon Jul 01 11:08:57 2019 +0200 @@ -6,58 +6,17 @@ split: showLogs }" > - <div v-for="(result, index) in details.summary" :key="index"> - <div class="px-2 d-flex justify-content-between"> - <div class="d-flex"> - <div @click="toggleDiff(index)" class="my-auto text-left"> - <UISpinnerButton - :state="showDiff === index" - :icons="['angle-right', 'angle-down']" - classes="text-info" - /> - </div> - <div> - {{ result["fk-gauge-id"] }} - <sup v-if="isNew(result)" class="text-success"> - (<translate>New</translate>) - </sup> - </div> - </div> - <div>{{ result["measure-date"] | dateTime }}</div> - </div> - <div v-if="showDiff === index" class="compare-table"> - <div class="row no-gutters px-4 text-left font-weight-bold"> - <div :class="isNew(result) ? 'col-6' : 'col-4'"> - <translate>Value</translate> - </div> - <div v-if="isOld(result)" class="col-4"> - <translate>Old</translate> - </div> - <div :class="isNew(result) ? 'col-6' : 'col-4'"> - <translate>New</translate> - </div> - </div> - <div - class="row no-gutters px-4 text-left" - v-for="(entry, index) in Object.keys(result.versions[0])" - :key="index" - v-if="isNew(result) || isDifferent(result, entry)" - > - <div :class="isNew(result) ? 'col-6' : 'col-4'"> - {{ entry }} - </div> - <div :class="isNew(result) ? 'col-6' : 'col-4'"> - {{ result.versions[0][entry] }} - </div> - <div - v-if="isOld(result) && isDifferent(result, entry)" - :class="isNew(result) ? 'col-6' : 'col-4'" - > - {{ result.versions[1][entry] }} - </div> - </div> - </div> - </div> + <virtual-list :size="scrollistConfig.size" :remain="scrollistConfig.remain"> + <Item + class="d-flex flex-row px-2 border-top" + v-for="(item, index) in details.summary" + @openDiff="toggleDiff" + :key="index" + :line="item" + :index="index" + :showDiff="showDiff" + /> + </virtual-list> </div> </template> @@ -107,6 +66,7 @@ * Thomas Junk <thomas.junk@intevation.de> */ import { mapState } from "vuex"; +import virtualList from "vue-virtual-scroll-list"; export default { data() { @@ -114,28 +74,33 @@ showDiff: 0 // open first item by default }; }, + components: { + "virtual-list": virtualList, + Item: () => import("./AGMLogItem") + }, computed: { - ...mapState("imports", ["showLogs", "details"]) + ...mapState("imports", ["showLogs", "details"]), + scrollistConfig() { + const smallLayout = { + size: 10, + remain: 20 + }; + const largeLayout = { + size: 12, + remain: 22 + }; + if (this.showAdditional) return smallLayout; + return largeLayout; + } }, methods: { toggleDiff(number) { + console.log(number); if (this.showDiff !== number) { this.showDiff = number; } else { this.showDiff = false; } - }, - isNew(result) { - return result && result.versions && result.versions.length === 1; - }, - isOld(result) { - return !this.isNew(result); - }, - isDifferent(result, entry) { - return ( - this.isOld(result) && - result.versions[0][entry] != result.versions[1][entry] - ); } } };
--- a/client/src/components/systemconfiguration/MorphologyClassbreaks.vue Mon Jul 01 11:08:19 2019 +0200 +++ b/client/src/components/systemconfiguration/MorphologyClassbreaks.vue Mon Jul 01 11:08:57 2019 +0200 @@ -11,8 +11,42 @@ v-for="(value, i) in morphologyClassbreaks" :key="i" > + <div class="input-group-prepend"> + <button + class="btn btn-sm btn-outline-secondary" + :style=" + 'width: 20px; background-color: ' + + (morphologyClassbreaks[i][1] || 'transparent') + " + type="button" + @click="showColorPicker('sounding-' + i)" + ></button> + <div + class="color-picker card shadow-sm" + v-if="activeColorPicker === 'sounding-' + i" + > + <UIBoxHeader + :title="colorPickerTitle" + icon="paint-brush" + :closeCallback="() => (activeColorPicker = null)" + :actions="[ + { + callback: () => { + morphologyClassbreaks[i][1] = '#ffffff'; + activeColorPicker = null; + }, + icon: 'trash' + } + ]" + /> + <chrome-picker + v-model="morphologyClassbreaks[i][1]" + @input="color => (morphologyClassbreaks[i][1] = color.hex)" + /> + </div> + </div> <input - v-model="morphologyClassbreaks[i]" + v-model="morphologyClassbreaks[i][0]" type="number" min="0" step="0.1" @@ -52,8 +86,44 @@ v-for="(value, i) in morphologyClassbreaksCompare" :key="i" > + <div class="input-group-prepend"> + <button + class="btn btn-sm btn-outline-secondary" + :style=" + 'width: 20px; background-color: ' + + (morphologyClassbreaksCompare[i][1] || 'transparent') + " + type="button" + @click="showColorPicker('compare-' + i)" + ></button> + <div + class="color-picker card shadow-sm" + v-if="activeColorPicker === 'compare-' + i" + > + <UIBoxHeader + :title="colorPickerTitle" + icon="paint-brush" + :closeCallback="() => (activeColorPicker = null)" + :actions="[ + { + callback: () => { + morphologyClassbreaksCompare[i][1] = '#ffffff'; + activeColorPicker = null; + }, + icon: 'trash' + } + ]" + /> + <chrome-picker + v-model="morphologyClassbreaksCompare[i][1]" + @input=" + color => (morphologyClassbreaksCompare[i][1] = color.hex) + " + /> + </div> + </div> <input - v-model="morphologyClassbreaksCompare[i]" + v-model="morphologyClassbreaksCompare[i][0]" type="number" step="0.1" class="form-control form-control-sm" @@ -94,13 +164,31 @@ <style lang="sass" scoped> .classbreak - width: 92px + width: 105px .btn-outline-secondary border-color: #ccc color: #ccc &:hover background: #eee color: #dc3545 + .color-picker + position: absolute + top: -4px + left: 19px + z-index: 9 + overflow: hidden + border-top-left-radius: 0 !important + .btn + border-radius: 0 !important + .vc-chrome + box-shadow: none +/deep/ + .vc-chrome-alpha-wrap + display: none !important + .vc-chrome-hue-wrap + margin-top: 10px + .vc-chrome-saturation-wrap + border-radius: 0 </style> <script> @@ -118,34 +206,69 @@ * Markus Kottländer <markus@intevation.de> */ import { mapState } from "vuex"; +import { Chrome } from "vue-color"; export default { + components: { + "chrome-picker": Chrome + }, data() { return { morphologyClassbreaks: [], - morphologyClassbreaksCompare: [] + morphologyClassbreaksCompare: [], + activeColorPicker: null, + closeColorPickerListener: null }; }, computed: { - ...mapState("application", ["config"]) + ...mapState("application", ["config"]), + colorPickerTitle() { + return this.$gettext("Choose color"); + } }, methods: { + showColorPicker(id) { + this.activeColorPicker = this.activeColorPicker === id ? null : id; + }, submit() { this.$store.dispatch("application/saveConfig", { - morphology_classbreaks: this.morphologyClassbreaks.join(","), - morphology_classbreaks_compare: this.morphologyClassbreaksCompare.join( - "," - ) + morphology_classbreaks: this.morphologyClassbreaks + .map(cb => (cb[1] === "#ffffff" ? cb[0] : cb.join(":"))) + .join(","), + morphology_classbreaks_compare: this.morphologyClassbreaksCompare + .map(cb => (cb[1] === "#ffffff" ? cb[0] : cb.join(":"))) + .join(",") }); } }, mounted() { this.morphologyClassbreaks = this.config.morphology_classbreaks .split(",") - .map(n => Number(n)); + .map(cb => cb.split(":")) + .map(cb => { + cb[0] = Number(cb[0]); + cb[1] = cb[1] || "#ffffff"; + return cb; + }); this.morphologyClassbreaksCompare = this.config.morphology_classbreaks_compare .split(",") - .map(n => Number(n)); + .map(cb => cb.split(":")) + .map(cb => { + cb[0] = Number(cb[0]); + cb[1] = cb[1] || "#ffffff"; + return cb; + }); + + this.closeColorPickerListener = e => { + // Escape + if (e.keyCode === 27) { + this.activeColorPicker = null; + } + }; + window.addEventListener("keydown", this.closeColorPickerListener); + }, + destroyed() { + window.removeEventListener("keydown", this.closeColorPickerListener); } }; </script>
--- a/client/src/main.js Mon Jul 01 11:08:19 2019 +0200 +++ b/client/src/main.js Mon Jul 01 11:08:57 2019 +0200 @@ -75,6 +75,7 @@ faMapMarkedAlt, faMinus, faObjectGroup, + faPaintBrush, faPaperPlane, faPencilAlt, faPlay, @@ -143,6 +144,7 @@ faMapMarkedAlt, faMinus, faObjectGroup, + faPaintBrush, faPaperPlane, faPencilAlt, faPlay,
--- a/pkg/controllers/srimports.go Mon Jul 01 11:08:19 2019 +0200 +++ b/pkg/controllers/srimports.go Mon Jul 01 11:08:57 2019 +0200 @@ -201,9 +201,12 @@ var once sync.Once closeOnce := func() { zr.Close() } + var isZIP bool = false if zr, err = zip.OpenReader(srFile); err != nil { - messages = append(messages, fmt.Sprintf("ZIP problem: %v", err)) + messages = append(messages, fmt.Sprintf("%v - "+ + "Trying TXT file mode.", err)) } else { + isZIP = true defer once.Do(closeOnce) } @@ -216,27 +219,29 @@ find := func(ext string) *zip.File { return common.FindInZIP(zr, ext) } var noXYZ bool - if zr != nil { - noXYZ = find(".xyz") == nil && find(".txt") == nil - } + if isZIP { + if zr != nil { + noXYZ = find(".xyz") == nil && find(".txt") == nil + } - if noXYZ { - messages = append(messages, "no .xyz or .txt file found.") - } + if noXYZ { + messages = append(messages, "no .xyz or .txt file found.") + } - if mj := find("meta.json"); mj == nil { - messages = append(messages, "no 'meta.json' file found.") - } else { - if meta, err := loadMeta(mj); err != nil { - messages = append(messages, - fmt.Sprintf("'meta.json' found but invalid: %v", err)) + if mj := find("meta.json"); mj == nil { + messages = append(messages, "no 'meta.json' file found.") } else { - errs := meta.Validate(req.Context(), conn) - for _, err := range errs { + if meta, err := loadMeta(mj); err != nil { messages = append(messages, - fmt.Sprintf("invalid 'meta.json': %v", err)) + fmt.Sprintf("'meta.json' found but invalid: %v", err)) + } else { + errs := meta.Validate(req.Context(), conn) + for _, err := range errs { + messages = append(messages, + fmt.Sprintf("invalid 'meta.json': %v", err)) + } + result.Meta = meta } - result.Meta = meta } }
--- a/pkg/controllers/stretches.go Mon Jul 01 11:08:19 2019 +0200 +++ b/pkg/controllers/stretches.go Mon Jul 01 11:08:57 2019 +0200 @@ -540,13 +540,13 @@ for _, bn := range loaded { l := bn.measurements.classify( - from, to, + res.from, res.to, bn.ldc, (*availMeasurement).getValue, ) b := bn.measurements.classify( - from, to, + res.from, res.to, bn.breaks, bn.access, )
--- a/pkg/imports/sr.go Mon Jul 01 11:08:19 2019 +0200 +++ b/pkg/imports/sr.go Mon Jul 01 11:08:57 2019 +0200 @@ -224,8 +224,8 @@ z, err := zip.OpenReader(zpath) if err != nil { - feedback.Warn("Expected ZIP file: %v", err) - feedback.Warn("Falling back to TXT file mode.") + feedback.Info("%v", err) + feedback.Info("Falling back to TXT file mode.") z = nil } if z != nil {
--- a/schema/default_sysconfig.sql Mon Jul 01 11:08:19 2019 +0200 +++ b/schema/default_sysconfig.sql Mon Jul 01 11:08:57 2019 +0200 @@ -35,7 +35,7 @@ INSERT INTO sys_admin.system_config VALUES ('gm_forecast_offset_72h', 15); INSERT INTO sys_admin.system_config VALUES ('gm_forecast_vs_reality_nsc_24h', -12.5); INSERT INTO sys_admin.system_config VALUES ('gm_forecast_vs_reality_nsc_72h', -12.5); -INSERT INTO sys_admin.system_config VALUES ('morphology_classbreaks', '1,1.5,1.7,1.9,2.1,2.3,2.5,2.7,2.9,3.1,3.3,3.5,4.0,4.5,5,5.5,6,6.5,7'); -INSERT INTO sys_admin.system_config VALUES ('morphology_classbreaks_compare', '-2,-1.9,-1.8,-1.7,-1.6,-1.5,-1.4,-1.3,-1.2,-1.1,-1,-0.9,-0.8,-0.7,-0.6,-0.5,-0.4,-0.3,-0.2,-0.1,0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2'); +INSERT INTO sys_admin.system_config VALUES ('morphology_classbreaks', '1:#ff00dd,1.5,1.7,1.9,2.1,2.3,2.5:#f25f20,2.7,2.9,3.1,3.3,3.5,4:#8ad51a,4.5,5,5.5,6,6.5,7:#1414ff'); +INSERT INTO sys_admin.system_config VALUES ('morphology_classbreaks_compare', '-2:#06b100,-1.9,-1.8,-1.7,-1.6,-1.5,-1.4,-1.3,-1.2,-1.1,-1:#1cc68e,-0.9,-0.8,-0.7,-0.6,-0.5,-0.4,-0.3,-0.2,-0.1,0:#c2c2c2,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1:#fff01a,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2:#f80012'); COMMIT;