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;