changeset 5187:5f4d054fea31 new-fwa

Merged default into new-fwa branch.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 01 Apr 2020 15:38:20 +0200
parents 1c5c9fdaf730 (current diff) adf7b9f1273b (diff)
children f742b5cf9a64
files
diffstat 7 files changed, 84 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/client/src/components/TimeSlider.vue	Tue Mar 31 20:03:05 2020 +0200
+++ b/client/src/components/TimeSlider.vue	Wed Apr 01 15:38:20 2020 +0200
@@ -146,6 +146,7 @@
         const [hours, minutes] = this.timeSelection.split(":");
         date = setHours(date, hours);
         date = setMinutes(date, minutes);
+        if (date > new Date()) return;
         this.$store.commit("application/setSelectedTime", date);
         this.rescaleSlider(50);
       }
@@ -160,6 +161,7 @@
         let date = this.selectedTime;
         date = setHours(date, value.split(":")[0]);
         date = setMinutes(date, value.split(":")[1]);
+        if (date > new Date()) return;
         this.$store.commit("application/setSelectedTime", date);
         this.rescaleSlider(800);
       }
@@ -283,8 +285,24 @@
         .on("drag", this.onDrag)
         .on("end", () => {
           d3.select(".line").classed("active", false);
+          const now = new Date();
+          if (this.selectedTime > now) this.selectedTime = now;
+          d3.select(".line").attr(
+            "x",
+            xAxis.scale()(d3.isoParse(this.selectedTime))
+          );
         });
 
+      svg
+        .append("rect")
+        .attr("class", "future")
+        .attr("x", xAxis.scale()(d3.isoParse(toIsoDate(new Date()))))
+        .attr("y", 0)
+        .attr("width", svgWidth)
+        .attr("height", svgHeight)
+        .attr("fill", "#333333")
+        .attr("opacity", 0.3);
+
       // Create cursor to indicate to the selected time
       svg
         .append("rect")
@@ -340,6 +358,7 @@
       xAxis.scale(newX);
       d3.select(".axis--x").call(xAxis);
       d3.select(".line").attr("x", newX(d3.isoParse(this.selectedTime)));
+      d3.select(".future").attr("x", newX(d3.isoParse(new Date())));
     },
     onClick() {
       // Extract the click location
--- a/client/src/components/layers/Layers.vue	Tue Mar 31 20:03:05 2020 +0200
+++ b/client/src/components/layers/Layers.vue	Wed Apr 01 15:38:20 2020 +0200
@@ -33,7 +33,7 @@
         <Layerselect layerId="WATERWAYPROFILES" />
         <Layerselect layerId="BOTTLENECKSTATUS" />
         <Layerselect layerId="BOTTLENECKFAIRWAYAVAILABILITY" />
-        <Layerselect layerId="DATAAVAILABILITY" />
+        <Layerselect v-if="!showTimeSlider" layerId="DATAAVAILABILITY" />
         <Layerselect layerId="DISTANCEMARKS" />
         <Layerselect layerId="DISTANCEMARKSAXIS" />
         <Layerselect layerId="GAUGES" />
@@ -67,7 +67,7 @@
     Layerselect: () => import("./Layerselect")
   },
   computed: {
-    ...mapState("application", ["showLayers"]),
+    ...mapState("application", ["showLayers", "showTimeSlider"]),
     ...mapState("map", ["openLayersMaps", "reviewActive"]),
     ...mapGetters("map", ["openLayersMap"]),
     label() {
@@ -85,6 +85,13 @@
     }
   },
   watch: {
+    showTimeSlider() {
+      if (!this.showTimeSlider) return;
+      const availabilityLayer = this.openLayersMap().getLayer(
+        "DATAAVAILABILITY"
+      );
+      availabilityLayer.setVisible(false);
+    },
     reviewActive() {
       if (!this.reviewActive) {
         const fairwaydimensionLayer = this.openLayersMap().getLayer(
--- a/client/src/components/layers/layers.js	Tue Mar 31 20:03:05 2020 +0200
+++ b/client/src/components/layers/layers.js	Wed Apr 01 15:38:20 2020 +0200
@@ -8,8 +8,8 @@
 import {
   and as andFilter,
   equalTo,
-  lessThanOrEqualTo,
-  greaterThanOrEqualTo
+  greaterThanOrEqualTo,
+  lessThanOrEqualTo
 } from "ol/format/filter";
 
 import { HTTP } from "@/lib/http";
@@ -78,6 +78,8 @@
           vectorSource.addFeatures(features);
         } catch (error) {
           console.log(error);
+          console.log("Loading failed for:", vectorSource);
+          vectorSource.addFeatures([]);
         }
       })
       .catch(error => {
@@ -443,7 +445,15 @@
                 featureTypes: ["fairway_dimensions"],
                 filter: andFilter(
                   equalTo("level_of_service", 1),
-                  equalTo("staging_done", true)
+                  equalTo("staging_done", true),
+                  lessThanOrEqualTo(
+                    "valid_from",
+                    store.state.application.refreshLayersTime.toISOString()
+                  ),
+                  greaterThanOrEqualTo(
+                    "valid_to",
+                    store.state.application.refreshLayersTime.toISOString()
+                  )
                 )
               },
               source,
@@ -469,7 +479,15 @@
                 featureTypes: ["fairway_dimensions"],
                 filter: andFilter(
                   equalTo("level_of_service", 2),
-                  equalTo("staging_done", true)
+                  equalTo("staging_done", true),
+                  lessThanOrEqualTo(
+                    "valid_from",
+                    store.state.application.refreshLayersTime.toISOString()
+                  ),
+                  greaterThanOrEqualTo(
+                    "valid_to",
+                    store.state.application.refreshLayersTime.toISOString()
+                  )
                 )
               },
               source,
@@ -495,7 +513,15 @@
                 featureTypes: ["fairway_dimensions"],
                 filter: andFilter(
                   equalTo("level_of_service", 3),
-                  equalTo("staging_done", true)
+                  equalTo("staging_done", true),
+                  lessThanOrEqualTo(
+                    "valid_from",
+                    store.state.application.refreshLayersTime.toISOString()
+                  ),
+                  greaterThanOrEqualTo(
+                    "valid_to",
+                    store.state.application.refreshLayersTime.toISOString()
+                  )
                 )
               },
               source,
--- a/client/src/store/map.js	Tue Mar 31 20:03:05 2020 +0200
+++ b/client/src/store/map.js	Wed Apr 01 15:38:20 2020 +0200
@@ -617,15 +617,15 @@
           let layer = layers[i];
           if (layer instanceof VectorLayer) {
             layer.getSource().clear(true);
+          } else {
+            layer.getSource().refresh();
           }
-          layer.getSource().refresh();
         }
       });
     },
     refreshTimebasedLayers({ state, rootState }) {
       const layers = [
         "BOTTLENECKS",
-        "GAUGES",
         "FAIRWAYDIMENSIONSLOS1",
         "FAIRWAYDIMENSIONSLOS2",
         "FAIRWAYDIMENSIONSLOS3",
@@ -642,8 +642,8 @@
             layer.getSource().updateParams({
               TIME: rootState.application.refreshLayersTime.toISOString()
             });
+            layer.getSource().refresh();
           }
-          layer.getSource().refresh();
         }
       });
     },
--- a/pkg/controllers/importqueue.go	Tue Mar 31 20:03:05 2020 +0200
+++ b/pkg/controllers/importqueue.go	Wed Apr 01 15:38:20 2020 +0200
@@ -674,7 +674,10 @@
 	ctx := req.Context()
 	accepted := state == "accepted"
 
-	if err = imports.DecideImport(ctx, id, accepted, reviewer); err != nil {
+	switch err = imports.DecideImport(ctx, id, accepted, reviewer); {
+	case err == imports.ErrRetrying:
+		return "", fmt.Errorf("Finalizing import #%d is re-scheduled.", id)
+	case err != nil:
 		return "", err
 	}
 
--- a/pkg/imports/queue.go	Tue Mar 31 20:03:05 2020 +0200
+++ b/pkg/imports/queue.go	Wed Apr 01 15:38:20 2020 +0200
@@ -17,6 +17,7 @@
 	"context"
 	"database/sql"
 	"encoding/json"
+	"errors"
 	"fmt"
 	"log"
 	"runtime/debug"
@@ -124,6 +125,8 @@
 	reviewJobWait    = time.Minute
 )
 
+var ErrRetrying = errors.New("retrying")
+
 type importQueue struct {
 	cmdCh chan func(*importQueue)
 
@@ -694,7 +697,10 @@
 		return err
 	}
 
-	<-done
+	_, retry := <-done
+	if retry {
+		return ErrRetrying
+	}
 	return nil
 }
 
@@ -931,6 +937,8 @@
 
 		go func(jc JobCreator, idj *idJob) {
 
+			var retry bool
+
 			defer func() {
 				// Unlock the dependencies.
 				q.unlockDependencies(jc)
@@ -938,7 +946,11 @@
 				q.cmdCh <- func(q *importQueue) {
 					if w := q.waiting[idj.id]; w != nil {
 						log.Printf("info: unlock waiting %d\n", idj.id)
-						close(w)
+						if retry {
+							w <- struct{}{}
+						} else {
+							close(w)
+						}
 						delete(q.waiting, idj.id)
 					}
 				}
@@ -970,7 +982,7 @@
 					})
 			})()
 
-			var unchanged, retry bool
+			var unchanged bool
 			if v, ok := errDo.(UnchangedError); ok {
 				feedback.Info("unchanged: %s", v.Error())
 				unchanged = true
--- a/schema/updates/1437/01.historicise_fairway_dimensions.sql	Tue Mar 31 20:03:05 2020 +0200
+++ b/schema/updates/1437/01.historicise_fairway_dimensions.sql	Wed Apr 01 15:38:20 2020 +0200
@@ -1,3 +1,6 @@
+-- Drop trigger first to avoid execution during following operations
+DROP TRIGGER fairway_dimensions_area_unique ON waterway.fairway_dimensions;
+
 ALTER TABLE waterway.fairway_dimensions
     ADD validity tstzrange NOT NULL DEFAULT tstzrange(current_timestamp, NULL)
         CHECK (NOT isempty(validity));
@@ -19,7 +22,6 @@
         current_timestamp),
     NULL);
 
-DROP TRIGGER fairway_dimensions_area_unique ON waterway.fairway_dimensions;
 CREATE CONSTRAINT TRIGGER fairway_dimensions_area_unique
     AFTER INSERT OR UPDATE OF area, validity, staging_done
     ON waterway.fairway_dimensions