still improving map logic
This commit is contained in:
parent
b7356c7cf1
commit
874aee24ff
1
main.go
1
main.go
|
|
@ -94,7 +94,6 @@ func main() {
|
|||
http.HandleFunc("/logout", logoutHandler)
|
||||
http.HandleFunc("/confirm", confirmHandler)
|
||||
http.HandleFunc("/metrics", metricsHandler)
|
||||
http.HandleFunc("/lastmetrics", lastmetricsHandler)
|
||||
http.HandleFunc("/save_tracker_settings", save_tracker_settingsHandler)
|
||||
http.HandleFunc("/getstripepaymentintent", getstripepaymentintentHandler)
|
||||
http.HandleFunc("/stripewebhook", stripeWebhookHandler)
|
||||
|
|
|
|||
168
metrics.go
168
metrics.go
|
|
@ -8,6 +8,8 @@ import (
|
|||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
|
@ -31,33 +33,10 @@ type OneMetric struct {
|
|||
|
||||
// metrics handler
|
||||
|
||||
func validProperty(prop string) bool {
|
||||
valid_properties := [...]string{"lat", "lon", "vbat", "fw"}
|
||||
for _, p := range valid_properties {
|
||||
if p == prop {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func metricsHandler(response http.ResponseWriter, request *http.Request) {
|
||||
name := getUserName(request)
|
||||
if name != "" {
|
||||
|
||||
property, ok := request.URL.Query()["property"]
|
||||
if !ok || len(property[0]) < 1 {
|
||||
log.Println("Url Param 'property' is missing")
|
||||
fmt.Fprintf(response, "{ \"msg\": \"error: property must be specified in URL\" }")
|
||||
return
|
||||
}
|
||||
|
||||
if !validProperty(property[0]) {
|
||||
log.Println("Url Param 'property' is invalid")
|
||||
fmt.Fprintf(response, "{ \"msg\": \"error: invalid property\" }")
|
||||
return
|
||||
}
|
||||
|
||||
deveui, ok := request.URL.Query()["deveui"]
|
||||
|
||||
if !ok || len(deveui[0]) < 1 {
|
||||
|
|
@ -116,7 +95,7 @@ func metricsHandler(response http.ResponseWriter, request *http.Request) {
|
|||
}
|
||||
|
||||
url := "http://localhost:8086/api/v2/query?org=wobischorg"
|
||||
data := []byte(fmt.Sprintf(`from(bucket:"wobischbucket") |> range(start: %s, stop: %s) |> filter(fn: (r) => r._measurement == "measurement") |> filter(fn: (r) => r._field == "%s") |> filter(fn: (r) => r.deveui == "%s")`, mystart, mystop, property[0], mydeveui))
|
||||
data := []byte(fmt.Sprintf(`from(bucket:"wobischbucket") |> range(start: %s, stop: %s) |> filter(fn: (r) => r._measurement == "measurement") |> filter(fn: (r) => r._field == "lon" or r._field == "lat") |> filter(fn: (r) => r.deveui == "%s")`, mystart, mystop, mydeveui))
|
||||
|
||||
req, err := http.NewRequest("POST", url, bytes.NewBuffer(data))
|
||||
if err != nil {
|
||||
|
|
@ -145,26 +124,59 @@ func metricsHandler(response http.ResponseWriter, request *http.Request) {
|
|||
if err != nil {
|
||||
log.Fatal("Error reading body. ", err)
|
||||
}
|
||||
fmt.Println("response Body:", string(body))
|
||||
|
||||
m := make(map[int64][2]float64)
|
||||
|
||||
fmt.Fprintf(response, "[\n")
|
||||
scanner := bufio.NewScanner(strings.NewReader(string(body)))
|
||||
first := true
|
||||
for scanner.Scan() {
|
||||
s := strings.Split(scanner.Text(), ",")
|
||||
fmt.Printf("Scanned Line: %v\n", s)
|
||||
if (len(s) >= 7) && !(strings.HasPrefix(s[5], "_")) {
|
||||
t, err := time.Parse(time.RFC3339, s[5])
|
||||
if err != nil {
|
||||
fmt.Printf("error converting time: %s\n", s[5])
|
||||
continue
|
||||
}
|
||||
a := t.Unix()
|
||||
b := s[6]
|
||||
if b == "0" {
|
||||
fmt.Println("skip 0 value for lon/lat")
|
||||
} else {
|
||||
t := s[7]
|
||||
f, err := strconv.ParseFloat(b, 64)
|
||||
if err == nil {
|
||||
v := m[a]
|
||||
if t == "lon" {
|
||||
v[0] = f
|
||||
}
|
||||
if t == "lat" {
|
||||
v[1] = f
|
||||
}
|
||||
m[a] = v
|
||||
} else {
|
||||
fmt.Printf("error converting string to float64: %s\n", b)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
first := true
|
||||
fmt.Fprintf(response, "[\n")
|
||||
keys := make([]int64, 0, len(m))
|
||||
for k := range m {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
sort.SliceStable(keys, func(i, j int) bool { return keys[i] < keys[j] })
|
||||
|
||||
for _, k := range keys {
|
||||
if !(first) {
|
||||
fmt.Fprintf(response, ",")
|
||||
} else {
|
||||
first = false
|
||||
}
|
||||
fmt.Fprintf(response, "[%d000,%s]\n", a, b)
|
||||
}
|
||||
|
||||
fmt.Fprintf(response, "[%d, %f, %f]\n", k, m[k][0], m[k][1])
|
||||
}
|
||||
fmt.Fprintf(response, "]\n")
|
||||
|
||||
|
|
@ -173,106 +185,6 @@ func metricsHandler(response http.ResponseWriter, request *http.Request) {
|
|||
}
|
||||
}
|
||||
|
||||
func lastmetricsHandler(response http.ResponseWriter, request *http.Request) {
|
||||
name := getUserName(request)
|
||||
if name != "" {
|
||||
|
||||
deveui, ok := request.URL.Query()["deveui"]
|
||||
|
||||
if !ok || len(deveui[0]) < 1 {
|
||||
log.Println("Url Param 'deveui' is missing")
|
||||
fmt.Fprintf(response, "{ \"msg\": \"deveui must be specified in URL\" }")
|
||||
return
|
||||
}
|
||||
// Query()["deveui"] will return an array of items,
|
||||
// we only want the single item.
|
||||
mydeveui := deveui[0]
|
||||
|
||||
if !(Contains(getMyDevs(name), mydeveui)) {
|
||||
log.Println("specified 'deveui' does not belong to this user")
|
||||
fmt.Fprintf(response, "{ \"msg\": \"specified deveui does not belong to this user\" }")
|
||||
return
|
||||
}
|
||||
|
||||
log.Println("Url Param 'deveui' is: " + string(mydeveui))
|
||||
|
||||
url := "http://localhost:8086/api/v2/query?org=wobischorg"
|
||||
data := []byte(fmt.Sprintf(`from(bucket:"wobischbucket")
|
||||
|> range(start:-365d)
|
||||
|> filter(fn: (r) => r._measurement == "measurement" and r.deveui == "%s")
|
||||
|> filter(fn: (r) => r._field == "lat" or r._field == "lon" or r._field == "vbat" or r._field == "fw")
|
||||
|> last(column: "_time") |> yield(name: "last")`, mydeveui))
|
||||
|
||||
req, err := http.NewRequest("POST", url, bytes.NewBuffer(data))
|
||||
if err != nil {
|
||||
log.Fatal("Error reading request. ", err)
|
||||
}
|
||||
|
||||
// Set headers
|
||||
req.Header.Set("Authorization", "Token TQvQxxLLAj1kTKWuEqcx7BA-KfE6WtJUeDlPa_Dnvms6Zqf6uh6lMbpXtzcsCjKO_x3PrpxxGDR5E6YnDB5PFg==")
|
||||
req.Header.Set("accept", "application/csv")
|
||||
req.Header.Set("content-type", "application/vnd.flux")
|
||||
|
||||
// Set client timeout
|
||||
client := &http.Client{Timeout: time.Second * 10}
|
||||
|
||||
// Send request
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
log.Fatal("Error reading response. ", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
fmt.Println("response Status:", resp.Status)
|
||||
fmt.Println("response Headers:", resp.Header)
|
||||
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
log.Fatal("Error reading body. ", err)
|
||||
}
|
||||
fmt.Println("response Body 1:", string(body))
|
||||
|
||||
scanner := bufio.NewScanner(strings.NewReader(string(body)))
|
||||
ts := ""
|
||||
lat := ""
|
||||
lon := ""
|
||||
vbat := ""
|
||||
fw := ""
|
||||
location, err := time.LoadLocation("Europe/Zurich")
|
||||
for scanner.Scan() {
|
||||
s := strings.Split(scanner.Text(), ",")
|
||||
if (len(s) >= 7) && !(strings.HasPrefix(s[5], "_")) {
|
||||
mytime, err := time.Parse(time.RFC3339, s[5])
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
ts = mytime.In(location).Format("02.01.2006 15:04")
|
||||
value := s[6]
|
||||
field := s[7]
|
||||
if field == "lat" {
|
||||
lat = value
|
||||
} else if field == "lon" {
|
||||
lon = value
|
||||
} else if field == "vbat" {
|
||||
vbat = value
|
||||
} else if field == "fw" {
|
||||
fw = value
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Fprintf(response, `{
|
||||
"ts": "%s",
|
||||
"lat": "%s",
|
||||
"lon": "%s",
|
||||
"vbat": "%s",
|
||||
"fw": "%s"
|
||||
}`, ts, lat, lon, vbat, fw)
|
||||
|
||||
} else {
|
||||
fmt.Fprintf(response, "{ \"msg\": \"Only available for logged in users\" }")
|
||||
}
|
||||
}
|
||||
|
||||
func CalcDaysUntil(mydate string) int {
|
||||
var days int
|
||||
layout := "02.01.2006"
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
cat /home/appuser/wo-bisch-web/static/js/fontawesome-5.11.2/all.js |/home/appuser/wo-bisch-web/minify-fa-js.py home,address-card,balance-scale,sign-out-alt,sign-in-alt,calendar,balance-scale,thermometer-half,tint,cloud,battery-three-quarters,envelope,check,lock,exclamation-triangle,cog,plus,shopping-cart,minus,arrow-right,caret-down,map-marked-alt >/home/appuser/wo-bisch-web/static/js/fontawesome-5.11.2/all-minified.js
|
||||
cat /home/appuser/wo-bisch-web/static/js/fontawesome-5.11.2/all.js |/home/appuser/wo-bisch-web/minify-fa-js.py home,address-card,balance-scale,sign-out-alt,sign-in-alt,calendar,globe,tint,battery-three-quarters,envelope,check,lock,exclamation-triangle,cog,plus,shopping-cart,minus,arrow-right,caret-down,map-marked-alt >/home/appuser/wo-bisch-web/static/js/fontawesome-5.11.2/all-minified.js
|
||||
|
|
|
|||
|
|
@ -1,63 +0,0 @@
|
|||
{{define "body_content"}}
|
||||
{{ if ne .UserName "" }}
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/momentjs/latest/moment-with-locales.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />
|
||||
|
||||
<link href="static/bulma-calendar/css/bulma-calendar.min.css" rel="stylesheet">
|
||||
<script src="static/bulma-calendar/js/bulma-calendar.min.js"></script>
|
||||
|
||||
<div class="columns" id="myselectors">
|
||||
<div class="column is-half py-1">
|
||||
<div id="reportrange" style="background: #fff; cursor: pointer; padding: 5px 10px; border: 1px solid #ccc; width: 100%">
|
||||
<i class="fa fa-calendar"></i>
|
||||
<span></span> <i class="fa fa-caret-down"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-half py-1">
|
||||
<a id="btn_w" class="button">
|
||||
<span class="icon">
|
||||
<i class="fa fa-balance-scale"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a id="btn_t" class="button">
|
||||
<span class="icon">
|
||||
<i class="fa fa-thermometer-half"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a id="btn_h" class="button">
|
||||
<span class="icon">
|
||||
<i class="fa fa-tint"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a id="btn_p" class="button">
|
||||
<span class="icon">
|
||||
<i class="fa fa-cloud"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a id="btn_vp" class="button">
|
||||
<span class="icon">
|
||||
<i class="fa fa-battery-three-quarters"></i>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="static/js/graph.js"></script>
|
||||
|
||||
<div>
|
||||
<section id="chart">
|
||||
<!-- Content ... -->
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
|
||||
|
||||
<script src="static/js/chart.js"></script>
|
||||
|
||||
{{ else }}
|
||||
<h4>Bitte zuerst <a href="login.html">einloggen</a></h4>
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
{{define "body_content"}}
|
||||
{{ if ne .UserName "" }}
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/momentjs/latest/moment-with-locales.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />
|
||||
|
||||
<link href="static/bulma-calendar/css/bulma-calendar.min.css" rel="stylesheet">
|
||||
<script src="static/bulma-calendar/js/bulma-calendar.min.js"></script>
|
||||
|
||||
<div class="columns" id="myselectors">
|
||||
<div class="column is-half py-1">
|
||||
<div id="reportrange" style="background: #fff; cursor: pointer; padding: 5px 10px; border: 1px solid #ccc; width: 100%">
|
||||
<i class="fa fa-calendar"></i>
|
||||
<span></span> <i class="fa fa-caret-down"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-half py-1">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="static/js/map.js"></script>
|
||||
<script src="static/js/graph.js"></script>
|
||||
|
||||
<div>
|
||||
<section id="chart">
|
||||
<!-- Content ... -->
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<script src="https://api3.geo.admin.ch/loader.js?lang=en&version=4.4.2" type="text/javascript"></script>
|
||||
<div id="map" class="mapbig"></div>
|
||||
|
||||
<script>
|
||||
var urlParams = new URLSearchParams(window.location.search);
|
||||
var deveui = urlParams.get('deveui');
|
||||
var lon = urlParams.get('lon');
|
||||
var lat = urlParams.get('lat');
|
||||
var position = ol.proj.fromLonLat([lon, lat], "EPSG:2056");
|
||||
|
||||
|
||||
var layer = ga.layer.create('ch.swisstopo.pixelkarte-farbe');
|
||||
var map = new ga.Map({
|
||||
target: 'map',
|
||||
layers: [layer],
|
||||
view: new ol.View({
|
||||
center: position,
|
||||
resolution: 20
|
||||
})
|
||||
});
|
||||
|
||||
// Create the layer with the icon
|
||||
var vectorLayer = new ol.layer.Vector({
|
||||
source: new ol.source.Vector({
|
||||
features: [new ol.Feature({
|
||||
geometry: new ol.geom.Point(position)
|
||||
})]
|
||||
}),
|
||||
style: new ol.style.Style({
|
||||
image: new ol.style.Icon({
|
||||
anchor: [0.5, 1],
|
||||
anchorXUnits: 'fraction',
|
||||
anchorYUnits: 'fraction',
|
||||
src: '/static/images/marker.png'
|
||||
})
|
||||
})
|
||||
});
|
||||
map.addLayer(vectorLayer);
|
||||
</script>
|
||||
|
||||
|
||||
<div class="slidecontainer">
|
||||
<input class="slider" id="datetimeslider" type="range" label="Zeitpunkt" min="0" max="200000" step="1" value="100000" onchange="updateSlider(this)" ontouchmove="updateSliderTooltip(this)" onmousemove="updateSliderTooltip(this)" />
|
||||
|
||||
<script>
|
||||
function updateSlider(c)
|
||||
{
|
||||
if(c.value <= 50000)
|
||||
{
|
||||
if(c.step != 1)
|
||||
c.step = 1;
|
||||
alert(c.value);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(c.step != 3)
|
||||
c.step = 3;
|
||||
alert(c.value);
|
||||
}
|
||||
}
|
||||
|
||||
function updateSliderTooltip(c)
|
||||
{
|
||||
$('#tooltiptext').html(c.value);
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
<div class="slidecontainer has-textcentered">
|
||||
<span id="tooltiptext">0</span>
|
||||
</div>
|
||||
{{ else }}
|
||||
<h4>Bitte zuerst <a href="login.html">einloggen</a></h4>
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
{{define "body_content"}}
|
||||
{{ if ne .UserName "" }}
|
||||
<script src="https://api3.geo.admin.ch/loader.js?lang=en&version=4.4.2" type="text/javascript"></script>
|
||||
<div id="modal" class="modal">
|
||||
<div class="modal-background"></div>
|
||||
<div class="modal-card">
|
||||
|
|
@ -83,74 +84,37 @@ Sie erhalten eine E-Mail, sobald die Zahlung erfolgreich abgeschlossen ist.
|
|||
</div>
|
||||
|
||||
{{range .LastMetrics}}
|
||||
<div class="column waage is-full notification is-warning">
|
||||
<div class="column tracker is-full notification is-warning">
|
||||
<p class="is-size-2 is-size-5-mobile has-text-centered has-text-weight-bold" ><span class="alias" id="alias_{{.Deveui}}">{{.Alias}}</span>{{ if not .Readonly }}<a class="show-modal" class="block-link"><span style="float:right;" class="icon is-size-4 is-size-5-mobile"><i class="fa fa-cog"></i></span></a>{{ end }}</p>
|
||||
<p id="lastmeasurement_{{.Deveui}}" class="has-text-centered">letzte übermittelte Messung: {{.Timestamp}}</p>
|
||||
<div id="{{.Deveui}}">
|
||||
<div class="column is-full notification is-warning">
|
||||
<nav class="level">
|
||||
<div class="level-item has-text-centered">
|
||||
<a class="block-link" href="/graph.html?deveui={{.Deveui}}&alias={{.Alias}}&property=t">
|
||||
<div>
|
||||
<p class="icon"><i class="fa fa-thermometer-half"></i></p>
|
||||
<p id="temp_{{.Deveui}}" class="title">Lat {{.Lat}}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="level-item has-text-centered">
|
||||
<a class="block-link" href="/graph.html?deveui={{.Deveui}}&alias={{.Alias}}&property=h">
|
||||
<div>
|
||||
<p class="icon"><i class="fa fa-tint"></i></p>
|
||||
<p id="humidity_{{.Deveui}}" class="title">Lon {{.Lon}}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{{ if (lt .DaysUntilDeactivated 0) }}
|
||||
<div class="level-item has-text-centered">
|
||||
<div>
|
||||
<p class="icon"><i class="fa fa-balance-scale"></i></p>
|
||||
<p id="weight_{{.Deveui}}" class="title is-size-2 has-text-weight-bold has-text-danger">Abo ist abgelaufen</p>
|
||||
</div>
|
||||
</div>
|
||||
{{ else }}
|
||||
{{ end }}
|
||||
<div class="level-item has-text-centered">
|
||||
<a class="block-link" href="/graph.html?deveui={{.Deveui}}&alias={{.Alias}}&property=p">
|
||||
<div>
|
||||
<p class="icon"><i class="fa fa-cloud"></i></p>
|
||||
<p id="pressure_{{.Deveui}}" class="title">VBat {{.Vbat}} mV</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="level-item has-text-centered">
|
||||
<a class="block-link" href="/graph.html?deveui={{.Deveui}}&alias={{.Alias}}&property=vp">
|
||||
<div>
|
||||
<p class="icon"><i class="fa fa-battery-three-quarters"></i></p>
|
||||
<p id="acculevel_{{.Deveui}}" class="title">Fw {{.Fw}}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<script src="https://api3.geo.admin.ch/loader.js?lang=en&version=4.4.2" type="text/javascript"></script>
|
||||
<div id="{{.Deveui}}" class="columns mt-3">
|
||||
<div class="column is-one-quarter"></div>
|
||||
<div class="column is-half">
|
||||
<a class="block-link" href="/map.html?deveui={{.Deveui}}&alias={{.Alias}}&lat={{.Lat}}&lon={{.Lon}}">
|
||||
<div id="map_{{.Deveui}}" class="map"></div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="column is-one-quarter"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var position = ol.proj.fromLonLat([{{.LonJS}}, {{.LatJS}}], "EPSG:2056");
|
||||
<script>
|
||||
var position = ol.proj.fromLonLat([{{.LonJS}}, {{.LatJS}}], "EPSG:2056");
|
||||
|
||||
var layer = ga.layer.create('ch.swisstopo.pixelkarte-farbe');
|
||||
var map_{{.DeveuiJS}} = new ga.Map({
|
||||
var layer = ga.layer.create('ch.swisstopo.pixelkarte-farbe');
|
||||
var map_{{.DeveuiJS}} = new ga.Map({
|
||||
target: 'map_{{.Deveui}}',
|
||||
interactions: [],
|
||||
controls: [],
|
||||
layers: [layer],
|
||||
view: new ol.View({
|
||||
center: position,
|
||||
controls: [],
|
||||
resolution: 20
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
// Create the layer with the icon
|
||||
var vectorLayer = new ol.layer.Vector({
|
||||
// Create the layer with the icon
|
||||
var vectorLayer = new ol.layer.Vector({
|
||||
source: new ol.source.Vector({
|
||||
features: [new ol.Feature({
|
||||
geometry: new ol.geom.Point(position)
|
||||
|
|
@ -164,40 +128,9 @@ var vectorLayer = new ol.layer.Vector({
|
|||
src: '/static/images/marker.png'
|
||||
})
|
||||
})
|
||||
});
|
||||
map_{{.DeveuiJS}}.addLayer(vectorLayer);
|
||||
</script>
|
||||
|
||||
|
||||
<div class="slidecontainer">
|
||||
<input class="slider" id="datetimeslider" type="range" label="Zeitpunkt" min="0" max="200000" step="1" value="100000" onchange="updateSlider(this)" ontouchmove="updateSliderTooltip(this)" onmousemove="updateSliderTooltip(this)" />
|
||||
|
||||
<script>
|
||||
function updateSlider(c)
|
||||
{
|
||||
if(c.value <= 50000)
|
||||
{
|
||||
if(c.step != 1)
|
||||
c.step = 1;
|
||||
alert(c.value);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(c.step != 3)
|
||||
c.step = 3;
|
||||
alert(c.value);
|
||||
}
|
||||
}
|
||||
|
||||
function updateSliderTooltip(c)
|
||||
{
|
||||
$('#tooltiptext').html(c.value);
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
<div class="slidecontainer has-textcentered">
|
||||
<span id="tooltiptext">0</span>
|
||||
</div>
|
||||
});
|
||||
map_{{.DeveuiJS}}.addLayer(vectorLayer);
|
||||
</script>
|
||||
|
||||
<div class="has-text-centered">
|
||||
<span class="is-size-6 has-text-centered">Abo aktiv bis</span>
|
||||
|
|
@ -226,12 +159,11 @@ function updateSliderTooltip(c)
|
|||
</a>
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/momentjs/latest/moment-with-locales.min.js"></script>
|
||||
<script src="static/js/scales.js"></script>
|
||||
<script src="static/js/tracker.js"></script>
|
||||
{{ else }}
|
||||
<h4>Bitte zuerst <a href="login.html">einloggen</a></h4>
|
||||
{{end}}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,11 @@
|
|||
html,body,.section,.container {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.container {
|
||||
height: 70%;
|
||||
}
|
||||
|
||||
.image.is-10by1 img, .image.is-20by3 img {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
|
|
@ -36,16 +44,6 @@ hr.top {
|
|||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.apexcharts-title-text {
|
||||
font-weight: 700 !important;
|
||||
font-size: 24px !important;
|
||||
font-family: "Rubik", sans-serif !important;
|
||||
}
|
||||
|
||||
.apexcharts-legend {
|
||||
font-family: "Rubik", sans-serif;
|
||||
}
|
||||
|
||||
/**
|
||||
* * The CSS shown here will not be introduced in the Quickstart guide, but
|
||||
* * shows how you can use CSS to style your Element's container.
|
||||
|
|
@ -87,6 +85,14 @@ input:focus,
|
|||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.map {
|
||||
height: 300px;
|
||||
}
|
||||
|
||||
.mapbig {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.slidecontainer {
|
||||
width: 100%;
|
||||
margin-top: 10px;
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -748,8 +748,6 @@
|
|||
|
||||
"balance-scale": [640, 512, [], "f24e", "M256 336h-.02c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0C-2.06 328.75.02 320.33.02 336H0c0 44.18 57.31 80 128 80s128-35.82 128-80zM128 176l72 144H56l72-144zm511.98 160c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0-87.12 174.26-85.04 165.84-85.04 181.51H384c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02zM440 320l72-144 72 144H440zm88 128H352V153.25c23.51-10.29 41.16-31.48 46.39-57.25H528c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16H383.64C369.04 12.68 346.09 0 320 0s-49.04 12.68-63.64 32H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h129.61c5.23 25.76 22.87 46.96 46.39 57.25V448H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z"],
|
||||
|
||||
"balance-scale": [640, 512, [], "f24e", "M256 336h-.02c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0C-2.06 328.75.02 320.33.02 336H0c0 44.18 57.31 80 128 80s128-35.82 128-80zM128 176l72 144H56l72-144zm511.98 160c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0-87.12 174.26-85.04 165.84-85.04 181.51H384c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02zM440 320l72-144 72 144H440zm88 128H352V153.25c23.51-10.29 41.16-31.48 46.39-57.25H528c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16H383.64C369.04 12.68 346.09 0 320 0s-49.04 12.68-63.64 32H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h129.61c5.23 25.76 22.87 46.96 46.39 57.25V448H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z"],
|
||||
|
||||
"battery-three-quarters": [640, 512, [], "f241", "M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-144 96H96v128h320V192z"],
|
||||
|
||||
"calendar": [448, 512, [], "f133", "M12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm436-44v-36c0-26.5-21.5-48-48-48h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v36c0 6.6 5.4 12 12 12h424c6.6 0 12-5.4 12-12z"],
|
||||
|
|
@ -758,14 +756,14 @@
|
|||
|
||||
"check": [512, 512, [], "f00c", "M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"],
|
||||
|
||||
"cloud": [640, 512, [], "f0c2", "M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4z"],
|
||||
|
||||
"cog": [512, 512, [], "f013", "M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z"],
|
||||
|
||||
"envelope": [512, 512, [], "f0e0", "M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"],
|
||||
|
||||
"exclamation-triangle": [576, 512, [], "f071", "M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"],
|
||||
|
||||
"globe": [496, 512, [], "f0ac", "M336.5 160C322 70.7 287.8 8 248 8s-74 62.7-88.5 152h177zM152 256c0 22.2 1.2 43.5 3.3 64h185.3c2.1-20.5 3.3-41.8 3.3-64s-1.2-43.5-3.3-64H155.3c-2.1 20.5-3.3 41.8-3.3 64zm324.7-96c-28.6-67.9-86.5-120.4-158-141.6 24.4 33.8 41.2 84.7 50 141.6h108zM177.2 18.4C105.8 39.6 47.8 92.1 19.3 160h108c8.7-56.9 25.5-107.8 49.9-141.6zM487.4 192H372.7c2.1 21 3.3 42.5 3.3 64s-1.2 43-3.3 64h114.6c5.5-20.5 8.6-41.8 8.6-64s-3.1-43.5-8.5-64zM120 256c0-21.5 1.2-43 3.3-64H8.6C3.2 212.5 0 233.8 0 256s3.2 43.5 8.6 64h114.6c-2-21-3.2-42.5-3.2-64zm39.5 96c14.5 89.3 48.7 152 88.5 152s74-62.7 88.5-152h-177zm159.3 141.6c71.4-21.2 129.4-73.7 158-141.6h-108c-8.8 56.9-25.6 107.8-50 141.6zM19.3 352c28.6 67.9 86.5 120.4 158 141.6-24.4-33.8-41.2-84.7-50-141.6h-108z"],
|
||||
|
||||
"home": [576, 512, [], "f015", "M280.37 148.26L96 300.11V464a16 16 0 0 0 16 16l112.06-.29a16 16 0 0 0 15.92-16V368a16 16 0 0 1 16-16h64a16 16 0 0 1 16 16v95.64a16 16 0 0 0 16 16.05L464 480a16 16 0 0 0 16-16V300L295.67 148.26a12.19 12.19 0 0 0-15.3 0zM571.6 251.47L488 182.56V44.05a12 12 0 0 0-12-12h-56a12 12 0 0 0-12 12v72.61L318.47 43a48 48 0 0 0-61 0L4.34 251.47a12 12 0 0 0-1.6 16.9l25.5 31A12 12 0 0 0 45.15 301l235.22-193.74a12.19 12.19 0 0 1 15.3 0L530.9 301a12 12 0 0 0 16.9-1.6l25.5-31a12 12 0 0 0-1.7-16.93z"],
|
||||
|
||||
"lock": [448, 512, [], "f023", "M400 224h-24v-72C376 68.2 307.8 0 224 0S72 68.2 72 152v72H48c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V272c0-26.5-21.5-48-48-48zm-104 0H152v-72c0-39.7 32.3-72 72-72s72 32.3 72 72v72z"],
|
||||
|
|
@ -782,8 +780,6 @@
|
|||
|
||||
"sign-out-alt": [512, 512, [], "f2f5", "M497 273L329 441c-15 15-41 4.5-41-17v-96H152c-13.3 0-24-10.7-24-24v-96c0-13.3 10.7-24 24-24h136V88c0-21.4 25.9-32 41-17l168 168c9.3 9.4 9.3 24.6 0 34zM192 436v-40c0-6.6-5.4-12-12-12H96c-17.7 0-32-14.3-32-32V160c0-17.7 14.3-32 32-32h84c6.6 0 12-5.4 12-12V76c0-6.6-5.4-12-12-12H96c-53 0-96 43-96 96v192c0 53 43 96 96 96h84c6.6 0 12-5.4 12-12z"],
|
||||
|
||||
"thermometer-half": [256, 512, [], "f2c9", "M192 384c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-23.685 12.876-44.349 32-55.417V224c0-17.673 14.327-32 32-32s32 14.327 32 32v104.583c19.124 11.068 32 31.732 32 55.417zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z"],
|
||||
|
||||
"tint": [352, 512, [], "f043", "M205.22 22.09c-7.94-28.78-49.44-30.12-58.44 0C100.01 179.85 0 222.72 0 333.91 0 432.35 78.72 512 176 512s176-79.65 176-178.09c0-111.75-99.79-153.34-146.78-311.82zM176 448c-61.75 0-112-50.25-112-112 0-8.84 7.16-16 16-16s16 7.16 16 16c0 44.11 35.89 80 80 80 8.84 0 16 7.16 16 16s-7.16 16-16 16z"],
|
||||
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,48 @@
|
|||
var urlParams = new URLSearchParams(window.location.search);
|
||||
var deveui = urlParams.get('deveui');
|
||||
var start = urlParams.get('start');
|
||||
var stop = urlParams.get('stop');
|
||||
|
||||
function refreshDatapoints(deveui, start, stop) {
|
||||
range = ""
|
||||
range = range + "&start=" + start;
|
||||
range = range + "&stop=" + stop;
|
||||
|
||||
$.getJSON('https://wo-bisch.ch/metrics?deveui=' + deveui + range, function(mydata) {
|
||||
if ("msg" in mydata) {
|
||||
if (mydata.msg.includes("expired")) {
|
||||
$('#chart').html(`<article class="message is-danger">
|
||||
<div class="message-body">
|
||||
Abo ist abgelaufen
|
||||
</div>
|
||||
</article>`);
|
||||
} else if (mydata.msg.includes("error:")) {
|
||||
$('#myselectors').hide();
|
||||
$('#chart').html(`<article class="message is-danger">
|
||||
<div class="message-body">
|
||||
Fehler im Aufruf
|
||||
</div>
|
||||
</article>`);
|
||||
} else {
|
||||
location.reload(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
alert(mydata);
|
||||
});
|
||||
}
|
||||
|
||||
if (start == null) {
|
||||
var dstart = moment({hour: 0});
|
||||
var start = dstart.utc().format('YYYY-MM-DDTHH:mm:ss[Z]');
|
||||
}
|
||||
|
||||
if (stop == null) {
|
||||
var dstop = moment();
|
||||
var stop = dstop.utc().format('YYYY-MM-DDTHH:mm:ss[Z]');
|
||||
}
|
||||
|
||||
$('#reportrange span').html(moment(start).locale('de').format('D. MMM YYYY') + ' - ' + moment(stop).locale('de').format('D. MMM YYYY'));
|
||||
|
||||
refreshDatapoints(deveui,start,stop);
|
||||
|
|
@ -1,69 +0,0 @@
|
|||
// Create a GeoAdmin Map
|
||||
var map = new ga.Map({
|
||||
|
||||
// Define the div where the map is placed
|
||||
target: 'map',
|
||||
|
||||
// Create a view
|
||||
view: new ol.View({
|
||||
|
||||
// Define the default resolution
|
||||
// 10 means that one pixel is 10m width and height
|
||||
// List of resolution of the WMTS layers:
|
||||
// 650, 500, 250, 100, 50, 20, 10, 5, 2.5, 2, 1, 0.5, 0.25, 0.1
|
||||
resolution: 650,
|
||||
|
||||
// Define a coordinate CH1903+ (EPSG:2056) for the center of the view
|
||||
center: [2660000, 1190000]
|
||||
})
|
||||
});
|
||||
|
||||
// Create a background layer
|
||||
var lyr1 = ga.layer.create('ch.swisstopo.pixelkarte-grau');
|
||||
|
||||
// Add the layers in the map
|
||||
map.addLayer(lyr1);
|
||||
|
||||
var position = [2709136, 1270186];
|
||||
|
||||
// Zoom on the position
|
||||
map.getView().setCenter(position);
|
||||
map.getView().setResolution(10);
|
||||
|
||||
// Create the layer with the icon
|
||||
var vectorLayer = new ol.layer.Vector({
|
||||
source: new ol.source.Vector({
|
||||
features: [new ol.Feature({
|
||||
geometry: new ol.geom.Point(position)
|
||||
})]
|
||||
}),
|
||||
style: new ol.style.Style({
|
||||
image: new ol.style.Icon({
|
||||
anchor: [0.5, 0.5],
|
||||
anchorXUnits: 'fraction',
|
||||
anchorYUnits: 'fraction',
|
||||
src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oLCAwhG8L1qXwAAAJ1SURBVDjLTZPBThRBEIa/6uleYtDVA8QHUGIw4ehVb3Ii+AK+guGid696Ud/AN4BAiFw9ePUAbmK4SIAo7OxuZtnZmZ7umfLQED1U0of6qur/q1oA9PgYWVlBBwNHCGt4v8Ws3GRa9BmPoSimDIc7jEYfqOtD+fw56MYGsruL6GCAPH6Mqjq+f9+jbZ9T1zArYVoo4zFMJsJoBMMh5PkBT55syNu3QZ89QwD07MxxcjJBZJEQFGME7+H8HC4vIc+5LqSMRsJsVuDcsnz7Fozu7zuOjvYoy0WKqeKccP8+3LkDvoHJJEVRwHQqVJVydXWXP392dXXVWcpyjbZ9DiggGIGmgdNTOPkFFxc3MMxmUJaCb5TQrBPCmmU43AKg64QQElhVMBrDZJzgsryBoaohBiFGEHllyfNNOoW2BV9DNU8G3gBlCfM51HWCQ4BOQQxo98Ly+3cfa5UQJCVVCZjP07uuUzQNhAhdB5kBI4qau5Y8hyxLlb3/B3gPtU9gDBDbZJPNQIRr2Viqaor3fWJMyU2T3G8aaGOS1ikYAZOBMSlAiLGwVNUOV1cvaVuIMU0S22uwTbvJDFgLCwsJjhFUQXXbEOMHQoC6VrxPBdr4H5wl8N49WFqC27eh11NcD5z7ZFjoHaJ6QIhCjErbpe4qSa+zcOsWLC4mCaqKdYK1X/D1YTrlN68de/s51byPqoIImUnde700Qa8HoIgIIRT8OFqWeRWMrq8j794HHj1YQuQA1XSNxkCWKSJK26YVqgqdfuHnz2WZV0EfPrz+TE+fIl+/oqurDu/XMGYLkU2c62MtwJQs28aYj1TVoQwGQVdWkONj/gL3ho+XUT2DTgAAAABJRU5ErkJggg=='
|
||||
})
|
||||
})
|
||||
});
|
||||
map.addLayer(vectorLayer);
|
||||
|
||||
// Create the popup
|
||||
var popup = new ol.Overlay({
|
||||
position: position,
|
||||
element: $(
|
||||
'<div class="popup">' +
|
||||
'<div class="title"<h3>Kdo FU Waffenplaetze</h3></div>' +
|
||||
'<div class="subtitle">' +
|
||||
'<br>Kaserne Auenfeld<br>' +
|
||||
'<div class="middle">' +
|
||||
'<br>8500 Frauenfeld<br>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'<div class="close">' +
|
||||
'<div type="button" onclick="$(\'.popup\').hide()"<span aria-hidden="true">X</span></div>' +
|
||||
'</div>' +
|
||||
'</div>')
|
||||
});
|
||||
map.addOverlay(popup);
|
||||
alert("Blabla");
|
||||
|
|
@ -84,7 +84,7 @@ $(".abo_pay").click(function() {
|
|||
charge_data = '';
|
||||
abo_table = '<table class="table is-bordered is-fullwidth" >';
|
||||
abo_table += '<tr><th class="is-2">Alias</th><th>verlängern bis</th><th class="has-text-right">Betrag</th></tr>';
|
||||
$(".waage").each(function( index ) {
|
||||
$(".tracker").each(function( index ) {
|
||||
console.log( index + ": " + $( this ).find(".alias").html() );
|
||||
this_count = Number($( this ).find(".abo_add_years").html());
|
||||
if (this_count > 0) {
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
.image.is-10by1 img, .image.is-20by3 img {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.image.is-10by1 {
|
||||
padding-top: 10%;
|
||||
}
|
||||
|
||||
.image.is-20by3 {
|
||||
padding-top: 15%;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 0 0 15px 0;
|
||||
}
|
||||
|
||||
.signup-box {
|
||||
margin: auto;
|
||||
width: 300px;
|
||||
background: rgba(255,255,255,0.05);
|
||||
border: 1px solid rgba(255,255,255,0.3);
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.block-link {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.apexcharts-title-text {
|
||||
font-weight: 700 !important;
|
||||
font-size: 24px !important;
|
||||
font-family: "Rubik", sans-serif !important;
|
||||
}
|
||||
|
||||
.apexcharts-legend {
|
||||
font-family: "Rubik", sans-serif;
|
||||
}
|
||||
|
||||
/**
|
||||
* * The CSS shown here will not be introduced in the Quickstart guide, but
|
||||
* * shows how you can use CSS to style your Element's container.
|
||||
* */
|
||||
input,
|
||||
.StripeElement {
|
||||
height: 40px;
|
||||
padding: 10px 12px;
|
||||
|
||||
color: #32325d;
|
||||
background-color: white;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 4px;
|
||||
|
||||
box-shadow: 0 1px 3px 0 #e6ebf1;
|
||||
-webkit-transition: box-shadow 150ms ease;
|
||||
transition: box-shadow 150ms ease;
|
||||
}
|
||||
|
||||
input:focus,
|
||||
.StripeElement--focus {
|
||||
box-shadow: 0 1px 3px 0 #cfd7df;
|
||||
}
|
||||
|
||||
.StripeElement--invalid {
|
||||
border-color: #fa755a;
|
||||
}
|
||||
|
||||
.StripeElement--webkit-autofill {
|
||||
background-color: #fefde5 !important;
|
||||
}
|
||||
|
||||
.checkboxes input {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.checkboxes label span {
|
||||
vertical-align: middle;
|
||||
margin-left: 5px;
|
||||
}
|
||||
20353
static/wo-bisch-web.css
20353
static/wo-bisch-web.css
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue