commit f967f4698ff3520a4aaf1896d1839410bb032333 Author: Barpfotenbaer Date: Wed May 3 09:06:13 2023 +0200 Version zu Ende April 2023 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b25ca52 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +# Basic Go makefile + +#CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-w -extldflags "-static"' -o Toolbox *.go +#GOCMD=GOOS=js GOARCH=wasm go +#GOCMD=go +GOCMD=CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go +GOBUILD=$(GOCMD) build +GOCLEAN=$(GOCMD) clean +GOTEST=$(GOCMD) test +GOGET=$(GOCMD) get + +all: build wasm + +build: + $(GOBUILD) -a -ldflags '-w -extldflags "-static"' -v -o Toolbox *.go +dbg-build: + $(GOBUILD) -v -gcflags=all="-N -l" -tags debug +test: + $(GOTEST) -v ./... +clean: + $(GOCLEAN) +wasm: + exec make -C ./goMetrix/app.wasm/ all & diff --git a/Toolbox b/Toolbox new file mode 100755 index 0000000..9378911 Binary files /dev/null and b/Toolbox differ diff --git a/build.js b/build.js new file mode 100644 index 0000000..7851d25 --- /dev/null +++ b/build.js @@ -0,0 +1,2 @@ +// put your build process in here. +console.log("my build process"); diff --git a/defaults/defaults.go b/defaults/defaults.go new file mode 100644 index 0000000..76bfce3 --- /dev/null +++ b/defaults/defaults.go @@ -0,0 +1,314 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package defaults + +import ( + // "errors" + "fmt" + "io/ioutil" + "log" + "os" + "strconv" + "strings" + + // "time" + // + gjs "github.com/tidwall/gjson" +) + +// DEF_log == 0 -> log aus +const DEF_lognone = 0 // -> log aus +const DEF_logerro = 1 // -> log an + fehler +const DEF_logwarn = 2 // -> log an + warnungen +const DEF_loginfo = 3 // -> log an + nachrichten +const DEF_logdebg = 4 // -> log an + alles +var DEF_log int = DEF_logerro // >0 = log an +var DEF_alias string = ":root" // start.alias +var DEF_apikey string = "00000000-0000-0000-0000-000000000000" // start.apikey +var DEF_siteurl string = "http://127.0.0.1:8080" // start.siteurl +var DEF_routeurl string = "https://planetary-data-portal.org" // start.routeurl +var DEF_idletime float64 = 1800 // start.release (sekunden) +var DEF_codebase string = "static" // root für verzeichnisse +var DEF_toolboxdirs string = ";/fubagDataset;" // +var DEF_metrixdirs string = "/fubagMetrix" // replacement for former metrixToolbox +var DEF_wasmdirs_www string = "/wasm/" +var DEF_wasmdirs_fs string = "static/wasm" + +var DEF_httphost string = "127.0.0.1" +var DEF_httpport int = 8085 +var DEF_dbhost string = "127.0.0.1" +var DEF_dbport int = 6414 +var DEF_dbuser string = "postgres" +var DEF_dbpassword string = "postgres" +var DEF_dbname string = "fubagTools" + +const DEF_dateISO = "2006-01-02" +const DEF_timeISO = "15:04:05" +const DEF_stampISO = "2006-01-02 15:04:05" + +const ( + DEF_customerid = 1 + DEF_project = "archium" + DEF_coninfo = "sslmode=disable host=%s port=%d user=%s password=%s dbname=%s sslmode=disable" + DEF_schema = "html" + DEF_tablecustomer = "html_customer" + DEF_tablelayout = "html_layout" + DEF_tablecontent = "html_content" + DEF_fieldsiteurl = "hla_siteurl" + DEF_fieldrouteurl = "hla_routeurl" + DEF_fieldlayout = "hla_layout" + DEF_fieldsource = "hla_source" + DEF_fieldcontent = "hco_content" + DEF_fieldalias = "hcu_aliasroot" + DEF_fieldapikey = "hcu_apikey" + DEF_fieldidletime = "hcu_idleseconds" + DEF_fieldproject = "hcu_project" + DEF_sqllayout = "SELECT hcu.*, hla.* " + + "FROM %schema%.%tablecustomer% hcu " + + "LEFT JOIN %schema%.%tablelayout% hla ON hla.hla_customerid = hcu.hcu_customerid " + + "WHERE hcu.hcu_customerid = %customerid%;" + DEF_sqlcontent = "SELECT hcu.*, hla.*, hco.* " + + "FROM %schema%.%tablecustomer% hcu " + + "LEFT JOIN %schema%.%tablelayout% hla ON hla.hla_customerid = hcu.hcu_customerid " + + "LEFT JOIN %schema%.%tablecontent% hco ON hco.hco_customerid = hcu.hcu_customerid " + + "WHERE hcu.hcu_customerid = %customerid% AND hco.hco_type = '%type%' " + + "ORDER BY hco_layoutid ASC, hco_contentid ASC;" + DEF_sqlproject = "SELECT hcu.* " + + "FROM %schema%.%tablecustomer% hcu " + + "WHERE hcu.hcu_customerid = %customerid%;" + DEF_sqlgetjson = "SELECT html.\"GetJson\";('%json%');" + DEF_sqlgetsvg = "SELECT * FROM html.\"GetSvg\"(%shadow%,%width%,%height%,'%matrix%','%viewbox%','%names%');" + // + DEF_sqlUserParam = "id,userIdentifier,lastName,firstName" + DEF_sqlUserAdd = "SELECT html.\"AddUser\"('%id%', '%userIdentifier%', '%lastName%', '%firstName%');" +) + +func MenuRoot(_alias, _name string) string { + return "{\n" + // + "\t"success": true,\n" + // + "\t"rows":[{\n" + // + "\t\t"id":1,\n" + // + "\t\t"text":"" + _name + "",\n" + // start-dataverse + "\t\t"iconCls":"icon-package",\n" + + "\t\t"attributes":{"level":1,"alias":"" + _alias + "","name":"" + _name + "","datasetPid":"%datasetPid%"},\n" + // + "\t\t"children":%children%\n" + // + "\t}]\n" + // + "}" +} + +func MenuChildDataverse() string { + return "{\n" + // + "%tabb%"id":%id%,\n" + // + "%tabb%"text":"%count%%title%",\n" + // + "%icon%" + // + "%tabb%"attributes":{"level":%level%,"type":"%type%"," + // + ""title":"%title%","alias":"%alias%","name":"%name%"},\n" + // + "%tabb%"children":%children%\n" + // + "%taba%}" +} + +func MenuChildDataset() string { + return "{\n" + + "%tabb%"id":%id%,\n" + // + "%tabb%"text":"%count%%title%",\n" + // + "%icon%" + // + "%tabb%"attributes":{"level":%level%,"type":"%type%"," + // + ""datasetPid":"%datasetPid%","datasetId":"%datasetId%"," + // + ""title":"%title%","subject":%subjects%},\n" + // + "%tabb%"children":%children%\n" + // + "%taba%}" +} + +func MenuChildFile() string { + return "{\n" + // + "%tabb%"id":%id%,\n" + // + "%tabb%"text":"%label%",\n" + // + "%icon%" + // + "%tabb%"attributes":{"level":%level%,"type":"%type%"},\n" + // + "%tabb%"children":[]\n" + // + "%taba%}" +} + +func MenuChildFileSimple() string { + return "{\n" + // + "%tabb%"text":"%label%",\n" + // + "%icon%" + // + "%tabb%"attributes":{"level":%level%,"type":"%type%"},\n" + // + "%tabb%"children":[]\n" + // + "%taba%}" +} + +func MenuChildUser() string { + return "{\n" + + "\t"id":%id%,\n" + + "\t"text":"%name%",\n" + + "\t"attributes":{"level":%level%,"lastname":"%lastname%","firstname":"%firstname%"}\n" + + "}" +} + +func LogToggle(_logging int) int { + oldlog := DEF_log + // + if _logging != 0 { + log.SetOutput(os.Stdout) + } else { + log.SetOutput(ioutil.Discard) + } + DEF_log = _logging + // + return oldlog +} + +func LogMessage(_label, _message string, _loglevel int) { + if _loglevel > 0 { + if _loglevel <= DEF_log { + // DEF_log == 1 -> log an + fehler + // DEF_log == 2 -> log an + warnungen + // DEF_log == 3 -> log an + nachrichten + // DEF_log == 4 -> log an + mimimi + if len(_label) > 0 { + switch _loglevel { + case 1: + log.Printf("( ERROR ) > %v: %v \n", _label, _message) + case 2: + log.Printf("( WARN ) > %v: %v \n", _label, _message) + case 3: + log.Printf("( INFO ) > %v: %v \n", _label, _message) + case 4: + log.Printf("( DEBG ) > %v: %v \n", _label, _message) + } + } else { + switch _loglevel { + case 1: + log.Printf("( ERROR ) > %v \n", _message) + case 2: + log.Printf("( WARN ) > %v \n", _message) + case 3: + log.Printf("( INFO ) > %v \n", _message) + case 4: + log.Printf("( DEBG ) > %v \n", _message) + } + } + } + } +} + +func LogMessage2Level(_label, _message string, _loglevel int) { + oldlog := LogToggle(_loglevel) + LogMessage(_label, _message, _loglevel) + LogToggle(oldlog) +} + +func LogError(_label string, _error error) { + oldlog := LogToggle(1) + LogMessage(_label, fmt.Sprintf("%v", _error), DEF_logerro) + LogToggle(oldlog) +} + +func GetArguments() { + allArgs := os.Args[1:] + if len(allArgs) > 0 { + log.Println("Initialize package - Parameter..") + //LogToggle(1) + for i, vparam := range allArgs { + mparam := strings.Split(vparam, ":") + switch mparam[0] { + case "log": + iint, err := strconv.Atoi(mparam[1]) + if err == nil { + LogToggle(1) + log.Printf("\t[%v]: '%v:%v'\n", i, mparam[0], mparam[1]) + LogToggle(iint) + continue + } + case "host": + DEF_httphost = mparam[1] + case "port": + iint, err := strconv.Atoi(mparam[1]) + if err == nil { + DEF_httpport = iint + } + case "codebase": + DEF_codebase = mparam[1] + case "toolboxdirs": + DEF_toolboxdirs = mparam[1] + case "metrixdirs": + DEF_metrixdirs = mparam[1] + case "dbpassword": + DEF_dbpassword = mparam[1] + case "dbuser": + DEF_dbuser = mparam[1] + case "dbname": + DEF_dbname = mparam[1] + case "dbhost": + DEF_dbhost = mparam[1] + case "dbport": + iint, err := strconv.Atoi(mparam[1]) + if err == nil { + DEF_dbport = iint + } + case "dataverse": + DEF_alias = mparam[1] + default: + oldlog := LogToggle(DEF_logerro) + LogMessage("GetArguments()", fmt.Sprintf("\t[%v]: '%v:%v' is unknown.\n", i, mparam[0], mparam[1]), DEF_logerro) + LogToggle(oldlog) + continue + } + //log.Printf("\t[%v]: '%v:%v'\n", i, mparam[0], mparam[1]) + } + } +} + +// fehler bereitstellen (momentan 20210316) +func get_error(_error string, _type string) string { + json := "\t" + `"success":false,` + "\n" + json = json + "\t" + `"msg":` + "{\n" + status := gjs.Get(_error, "status") + if status.String() == "ERROR" { + message := gjs.Get(_error, "message") + if len(message.String()) > 0 { + json = json + "\t\t" + `"title"` + ":" + `"Error"` + ",\n" + json = json + "\t\t" + `"msg"` + ":" + `"%message%"` + ",\n" + json = json + "\t\t" + `"type"` + ":" + `"%type%"` + json = strings.Replace(json, "%message%", strings.Replace(message.String(), """, "'", -1), -1) + json = strings.Replace(json, "%type%", _type, -1) + } + } else { + if status.Type == gjs.Null { + message := fmt.Sprintf("%v", _error) + if len(message) > 0 { + json = json + "\t\t" + `"title"` + ":" + `"Error"` + ",\n" + json = json + "\t\t" + `"msg"` + ":" + `"%message%"` + ",\n" + json = json + "\t\t" + `"type"` + ":" + `"%type%"` + json = strings.Replace(json, "%message%", strings.Replace(message, """, "'", -1), -1) + json = strings.Replace(json, "%type%", _type, -1) + } + } + } + json = json + "\n\t}" + // + return json +} + +func GetError(_error error, _type, _label string) string { + // + sjson := "{\n" + get_error(fmt.Sprintf("%v:

%v", _label, _error), _type) + "\n}" + // + return sjson +} + +func GetErrorByString(_error, _type, _label string) string { + // + sjson := get_error(fmt.Sprintf("%v:

%v", _label, _error), _type) + // + return sjson +} diff --git a/goDataverse/connect/connect.go b/goDataverse/connect/connect.go new file mode 100644 index 0000000..938e883 --- /dev/null +++ b/goDataverse/connect/connect.go @@ -0,0 +1,157 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package connect + +import ( + "bytes" + "encoding/json" + "fmt" + "log" + + // "log" + "io/ioutil" + "net/http" + "strings" + + // "net/url" + def "Toolbox/defaults" + tol "Toolbox/goDataverse/tools" +) + +func GetRequest(url string, params, header tol.ColMap) ([]byte, error) { + client := &http.Client{} + req, _ := http.NewRequest("GET", url, nil) + for k, v := range header { + req.Header.Add(k, v) + } + query := req.URL.Query() + for k, v := range params { + query.Add(k, v) + } + + req.URL.RawQuery = query.Encode() + def.LogMessage("GetRequest(url.encode)", url, def.DEF_logdebg) + res, err := client.Do(req) + if err != nil { + def.LogError("GetRequest(do)", err) + } else { + defer res.Body.Close() + b, err := ioutil.ReadAll(res.Body) + if err == nil { + return b, err + } + } + return []byte(""), err +} + +func GetRequestMap(_url string, params tol.ColMapInt, header tol.ColMap) ([]byte, error) { + client := &http.Client{} + // _url = _url + "&fq=(title:1)" + // _url = strings.Replace(_url, "*", `((title:2.+OR+title:Ebene))`, -1) + def.LogMessage("GetRequestMap(map)", _url, def.DEF_logdebg) + req, _ := http.NewRequest("GET", _url, nil) + for k, v := range header { + req.Header.Add(k, v) + } + query := req.URL.Query() + for _, ival := range params { + for k, v := range ival { + def.LogMessage("GetRequestMap(values)", fmt.Sprintf("%v: %v (%v)", k, v, ival), def.DEF_logdebg) + query.Add(k, v) + } + } + // + req.URL.RawQuery = query.Encode() + def.LogMessage("GetRequestmap(encode)", req.URL.String(), def.DEF_logdebg) + req.URL.RawQuery = strings.Replace(req.URL.RawQuery, "_q_=", "q=", -1) + def.LogMessage("GetRequestMap(replac)", req.URL.String(), def.DEF_logdebg) + res, err := client.Do(req) + if err == nil { + defer res.Body.Close() + b, err := ioutil.ReadAll(res.Body) + if err == nil { + return b, err + } + } + return []byte(""), err +} + +func PostRequest(url string, params, header tol.ColMap) ([]byte, error) { + client := &http.Client{} + postData, err := json.Marshal(params) + def.LogMessage("PostRequest(data)", fmt.Sprintf("%v", postData), def.DEF_logdebg) + req, _ := http.NewRequest("POST", url, bytes.NewReader(postData)) + if err == nil { + for k, v := range header { + req.Header.Add(k, v) + } + res, err := client.Do(req) + if err == nil { + defer res.Body.Close() + b, err := ioutil.ReadAll(res.Body) + if err == nil { + return b, err + } + } + } + return []byte(""), err +} + +func PostRequestB(url string, postData []byte, header tol.ColMap) ([]byte, error) { + client := &http.Client{} + req, err := http.NewRequest("POST", url, bytes.NewReader(postData)) + if err == nil { + for k, v := range header { + req.Header.Add(k, v) + } + res, err := client.Do(req) + if err == nil { + defer res.Body.Close() + b, err := ioutil.ReadAll(res.Body) + return b, err + } + } + return []byte(""), err +} + +func DeleteRequest(url string, header tol.ColMap) ([]byte, error) { + client := &http.Client{} + req, _ := http.NewRequest("DELETE", url, nil) + + for k, v := range header { + req.Header.Add(k, v) + } + def.LogMessage("DeleteRequest(url)", req.URL.String(), def.DEF_logdebg) + res, _ := client.Do(req) + //def.LogMessage("DeleteRequest(do)", res.Request.Header., def.DEF_logdebg) + b, err := ioutil.ReadAll(res.Body) + res.Body.Close() + + return b, err +} + +func Redirect(_w http.ResponseWriter, _r *http.Request, _url string) { + // remove/add not default ports from _r.Host + target := _url + // if len(_r.URL.RawQuery) > 0 { + // target += "?" + _r.URL.RawQuery + // } + log.Printf("redirect to: %s", target) + reponse, err := http.Get(_url) + body, err := ioutil.ReadAll(reponse.Body) + if err != nil { + panic(err) + } + fmt.Println("response body", reponse.Body) + _w.Write(body) + log.Printf("redirect to: %s, %v, %v", target, string(body), err) + //http.Redirect(_w, _r, target, http.StatusSeeOther) +} diff --git a/goDataverse/dataset/dataset.go b/goDataverse/dataset/dataset.go new file mode 100644 index 0000000..16846a8 --- /dev/null +++ b/goDataverse/dataset/dataset.go @@ -0,0 +1,142 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package dataset + +import ( + "fmt" + // "log" + "strings" + + def "Toolbox/defaults" + con "Toolbox/goDataverse/connect" + tol "Toolbox/goDataverse/tools" + + gjs "github.com/tidwall/gjson" +) + +func GetDatasetLastVersion(_dp tol.TDVParams, _id string) (string, error) { + var imajor int64 = 1 + var iminor int64 = 0 + var state string = "draft" + var url string = tol.GetSiteUrl(_dp) + "/api/datasets/" + _id + "/versions" + res, err := con.GetRequest(url, tol.ColMap{}, + tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + if err == nil { + var ver = tol.GetObjectFromStr(fmt.Sprintf("%s", res)) + if ver.IsObject() { + status := gjs.Get(ver.String(), "status") + if status.String() == "OK" { + lst := gjs.Get(ver.String(), "data") + if lst.IsArray() { + for _, entry := range lst.Array() { + if entry.IsObject() { + tmpstate := gjs.Get(entry.String(), "versionState") + switch tmpstate.String() { + case "DRAFT": + break + case "RELEASED": + tmpmajor := gjs.Get(entry.String(), "versionNumber") + if tmpmajor.Int() > imajor { + imajor = tmpmajor.Int() + iminor = gjs.Get(entry.String(), "versionMinorNumber").Int() + } else { + if tmpmajor.Int() == imajor { + tmpminor := gjs.Get(entry.String(), "versionMinorNumber") + if tmpminor.Int() > iminor { + iminor = tmpminor.Int() + } + } + } + state = tmpstate.String() + break + //fmt.Println("GetDatasetLastVersion():", _id, imajor, iminor, state, gjs.Get(entry.String(), "id")) + } + } + } + } + } + } + } + // auswertung: falls keine "released" version vorhanden, dann draft zurück + var version string = ":" + state + switch state { + case "RELEASED": + version = fmt.Sprintf("%v.%v", imajor, iminor) + } + // + return version, err +} + +func GetDatasetByPersistentId(_dp tol.TDVParams, _persist, _version string) (string, error) { + var persist string = _persist + var version string = _version + if len(persist) == 0 { + persist = _dp.DP_datasetPid + } + var url string = tol.GetSiteUrl(_dp) + "/api/datasets/:persistentId/%versions%?persistentId=" + persist + if len(version) > 0 { + version = "versions/" + version + "/" + } else { + if len(_dp.DP_datasetVersion) > 0 { + version = "versions/" + _dp.DP_datasetVersion + "/" + } + } + url = strings.Replace(url, "%versions%", version, -1) + def.LogMessage("GetDatasetByPersistentId(url)", url, def.DEF_logdebg) + res, err := con.GetRequest(url, tol.ColMap{}, + tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} + +func GetDatasetMetadata(_dp tol.TDVParams, _id, _version string) (string, error) { + var version string = _version + var url string = tol.GetSiteUrl(_dp) + "/api/datasets/" + _id + "/%versions%/metadata" + if len(version) > 0 { + version = "versions/" + version + } else { + if len(_dp.DP_datasetVersion) > 0 { + version = "versions/" + _dp.DP_datasetVersion + } else { + version = "versions/1.0" + } + } + url = strings.Replace(url, "%versions%", version, -1) + def.LogMessage("GetDatasetMetadata(url)", url, def.DEF_logdebg) + res, err := con.GetRequest(url, tol.ColMap{}, + tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} + +func GetDatasetMetafield(_dp tol.TDVParams, _id string) (string, error) { + var url string = tol.GetSiteUrl(_dp) + "/api/admin/datasetfield/" + _id + def.LogMessage("GetDatasetMetafield(url)", url, def.DEF_logdebg) + res, err := con.GetRequest(url, tol.ColMap{}, + tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} + +func CreateDataset(_dp tol.TDVParams, _parent, _params string) (string, error) { + res, err := con.PostRequestB(tol.GetSiteUrl(_dp)+"/api/dataverses/"+_parent+"/datasets", + []byte(_params), tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} + +// +func DownloadByDataset(_dp tol.TDVParams) ([]byte, error) { + res, err := con.GetRequest(tol.GetSiteUrl(_dp)+"/api/access/dataset/:persistentId/?persistentId="+_dp.DP_datasetPid, + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return res, err +} diff --git a/goDataverse/dataverse/dataverse.go b/goDataverse/dataverse/dataverse.go new file mode 100644 index 0000000..5353289 --- /dev/null +++ b/goDataverse/dataverse/dataverse.go @@ -0,0 +1,80 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package dataverse + +import ( + "fmt" + // + con "Toolbox/goDataverse/connect" + tol "Toolbox/goDataverse/tools" +) + +func ListDataverses(_dp tol.TDVParams) (string, error) { + res, err := con.GetRequest(tol.GetSiteUrl(_dp)+"/api/search?q=*&types=dataverse&per_page=1000", + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} + +func ListDataverses2(server_url, api_token string) string { + response, _ := con.GetRequest(server_url+"/api/search?q=*&types=dataverse&per_page=1000", + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": api_token}) + // + return (fmt.Sprintf("%s", response)) +} + +func GetContentByAlias(_dp tol.TDVParams, _alias string) (string, error) { + res, err := con.GetRequest(tol.GetSiteUrl(_dp)+"/api/dataverses/"+_alias+"/contents", + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} + +func GetDataverseByIdOrAlias(_dp tol.TDVParams, _id string) (string, error) { + res, err := con.GetRequest(tol.GetSiteUrl(_dp)+"/api/dataverses/"+_id, + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} + +func GetDataverseByIdOrAlias2(server_url, api_token, id string) string { + response, _ := con.GetRequest(server_url+"/api/dataverses/"+id, map[string]string{}, map[string]string{"X-Dataverse-key": api_token}) + // + return (fmt.Sprintf("%s", response)) +} + +func GetDataverseStoragesizeById(_dp tol.TDVParams, _id string) (string, error) { + res, err := con.GetRequest(tol.GetSiteUrl(_dp)+"/api/dataverses/"+_id+"/storagesize", + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} + +func IsDataverseRoot(_dp tol.TDVParams, _alias string) (string, error) { + res, err := con.GetRequest(tol.GetSiteUrl(_dp)+"/api/dataverses/"+_alias+"/metadatablocks/isRoot", + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} + +func CreateDataverse(_dp tol.TDVParams, _parent, _params string) (string, error) { + res, err := con.PostRequestB(tol.GetSiteUrl(_dp)+"/api/dataverses/"+_parent, + []byte(_params), tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} + +func DeleteDataverseById(_dp tol.TDVParams, _id string) (string, error) { + res, err := con.DeleteRequest(tol.GetSiteUrl(_dp)+"/api/dataverses/"+_id, + tol.ColMap{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} diff --git a/goDataverse/files/files.go b/goDataverse/files/files.go new file mode 100644 index 0000000..16c75db --- /dev/null +++ b/goDataverse/files/files.go @@ -0,0 +1,48 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package files + +import ( + con "Toolbox/goDataverse/connect" + tol "Toolbox/goDataverse/tools" + "errors" + "fmt" + "strings" + + gjs "github.com/tidwall/gjson" +) + +func GetFilesByDatasetId(_dp tol.TDVParams, _datasetid, _version string, + _citation gjs.Result) (string, error) { + if len(_datasetid) == 0 { + return "", errors.New("No datasetId found.") + } + var datasetid string = _datasetid + var version string = _version + var url string = tol.GetSiteUrl(_dp) + "/api/datasets/" + datasetid + "/%versions%/files" + if len(version) > 0 { + version = "versions/" + version + } else { + if len(_dp.DP_datasetVersion) > 0 { + version = "versions/" + _dp.DP_datasetVersion + } else { + version = "versions/:latest" + } + } + + url = strings.Replace(url, "%versions%", version, -1) + + //fmt.Println("URL-files:", url) + res, err := con.GetRequest(url, map[string]string{}, + map[string]string{"X-Dataverse-key": tol.GetApiKey(_dp)}) + // + return (fmt.Sprintf("%s", res)), err +} diff --git a/goDataverse/goDataverse.debug b/goDataverse/goDataverse.debug new file mode 100644 index 0000000..86ab87d Binary files /dev/null and b/goDataverse/goDataverse.debug differ diff --git a/goDataverse/goDataverse.go b/goDataverse/goDataverse.go new file mode 100644 index 0000000..a881b85 --- /dev/null +++ b/goDataverse/goDataverse.go @@ -0,0 +1,1807 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package goDataverse + +import ( + "errors" + "fmt" + + // "html" + "log" + "regexp" + + // "sort" + "strings" + + // "time" + // "reflect" + + json "encoding/json" + // sql "database/sql" + + def "Toolbox/defaults" + dst "Toolbox/goDataverse/dataset" + dvr "Toolbox/goDataverse/dataverse" + + // fls "Toolbox/goDataverse/files" + sch "Toolbox/goDataverse/search" + tol "Toolbox/goDataverse/tools" + usr "Toolbox/goDataverse/user" + + gjs "github.com/tidwall/gjson" +) + +// ############################################################################# +// ### lokale benutzte funktionen +// ############################################################################# + +// spalten einlesen (momentan 20210308) nur userliste +func grid_getcolumns_user(labels gjs.Result, _dparam tol.TDVParams, _fparam tol.TFVParams) string { + cols := `"cols":[[` + "\n" + var columns string = "" + // spalten auslesen, wenn objekt.. + if labels.IsObject() { + conn, err := tol.CheckConnection(_fparam) + if err == nil { + def.LogMessage("grid_getcolumns_user(param)", fmt.Sprintf("what: %v, who: %v", _fparam.FP_what, _fparam.FP_who), def.DEF_logdebg) + csql := labels.String() + csql = strings.ReplaceAll(csql, "{", "[{") + csql = strings.ReplaceAll(csql, "}", "}]") + csql = strings.ReplaceAll(csql, ",", "},{") + csql = "SELECT * FROM html.\"GetColumnsByType\"('" + csql + "'::JSON, " + csql = csql + fmt.Sprintf("%v", def.DEF_customerid) + ", '" + csql = csql + _fparam.FP_what + "', 'column." + _fparam.FP_who + "', '" + csql = csql + _dparam.DP_localeCode + "', true);" + def.LogMessage("grid_getcolumns_user(sql)", csql, def.DEF_logdebg) + labelstr, err := conn.Query(csql) + if err == nil { + defer labelstr.Close() + for labelstr.Next() { + if err := labelstr.Scan(&columns); err == nil { + return columns + } + } + } + } + } + cols = cols + "\n]],\n" + return cols +} + +// spalten einlesen (momentan 20210412) +func grid_getcolumns_map(_prefix string, _map tol.ColMap, _dparam tol.TDVParams, _fparam tol.TFVParams) string { + cols := `"cols":[[` + "\n" + var columns string = "" + conn, err := tol.CheckConnection(_fparam) + if err == nil { + var csql string = fmt.Sprintf("%v\n", _map) + csql = strings.ReplaceAll(csql, "map[", "[{") + csql = strings.ReplaceAll(csql, "]", "}]") + csql = strings.ReplaceAll(csql, "\" \"", "\"},{\"") + csql = "SELECT * FROM html.\"GetColumnsByType\"('" + csql + "'::JSON, " + csql = csql + fmt.Sprintf("%v", def.DEF_customerid) + ", " + csql = csql + "'" + _fparam.FP_what + "', '" + _prefix + _fparam.FP_who + "', " + csql = csql + "'" + _dparam.DP_localeCode + "', true);" + labelstr, err := conn.Query(csql) + if err == nil { + for labelstr.Next() { + if err := labelstr.Scan(&columns); err == nil { + return columns + } + } + } + } + cols = cols + "\n]],\n" + return cols +} + +// zeilen für grid einlesen (momentan 20210412) über map[] +func grid_getrows_map(_map tol.RowMap, _fparam tol.TFVParams, _forwhat string) string { + // fmt.Printf("grid_getrow_map(begin-%v) > \n", _forwhat) + rows := `"rows":[` + "\n" + conn, err := tol.CheckConnection(_fparam) + if err == nil { + // fmt.Printf("grid_getrow_map() > %v\n", _map) + var rowsql string = "" + rowsql = rowsql + fmt.Sprintf("%v", _map) + switch _forwhat { + case "dataset": + // fmt.Printf("grid_getrow_map(sql-%v) > %v", _forwhat, _map) + var iarr int = 0 + var sarr string = "[{" + for ikey, ielement := range _map { + s := `%v:[%v]` + jsn, _ := json.Marshal(ielement) + if iarr > 0 { + sarr = sarr + ",\n" + } + sarr = sarr + fmt.Sprintf(s, ikey, strings.ReplaceAll(strings.ReplaceAll(string(jsn), `"\"`, `"`), `\""`, `"`)) + iarr = iarr + 1 + } + rowsql = sarr + `}]` + rowsql = strings.ReplaceAll(rowsql, `","`, `"},{"`) + rowsql = strings.ReplaceAll(rowsql, "'", "'") + //gjson := tol.GetObjectFromStr(rowsql) + // fmt.Printf("grid_getrow_map(sql-%v) > %v", _forwhat, gjson.String()) + default: + rowsql = strings.ReplaceAll(rowsql, "map[", "[{") + rowsql = strings.ReplaceAll(rowsql, "] ", "], ") + rowsql = strings.ReplaceAll(rowsql, "]", "}]") + rowsql = strings.ReplaceAll(rowsql, "\" \"", "\"},{\"") + } + rowsql = "SELECT * FROM html.\"GetGridRows\"('" + rowsql + "'::JSON);" + switch _forwhat { + case "dataset": + // fmt.Printf("grid_getrow_map(sql-%v) > %v", _forwhat, rowsql) + default: + //fmt.Printf("grid_getrow_map(sql-%v) > %v", _forwhat, rowsql) + } + var rows string = "" + switch _forwhat { + case "dataset": + rowstr, err := conn.Query(rowsql) + if err == nil { + defer rowstr.Close() + for rowstr.Next() { + if err := rowstr.Scan(&rows); err == nil { + // fmt.Printf("grid_getrow_map(%v) > %v", _fparam.FP_who, rows) + return rows + } + } + } + default: + rowstr, err := conn.Query(rowsql) + if err == nil { + defer rowstr.Close() + for rowstr.Next() { + if err := rowstr.Scan(&rows); err == nil { + // fmt.Printf("grid_getrow_map(%v) > %v", _fparam.FP_who, rows) + return rows + } + } + } + } + } + rows = rows + "\n]\n" + //Toolbox + return rows +} + +// zeilen für grid einlesen (momentan 20210308) nur userliste +func grid_getrows_user(lines gjs.Result, _withoutarr, _withoutobj bool) string { + rows := `"rows":[` + // userliste auslesen, wenn array.. + if lines.IsArray() { + i := 0 + for _, line := range lines.Array() { + // zeilen auslesen, wenn objekt..tol. + if line.IsObject() { + if i > 0 { + rows = rows + "," + } + rows = rows + "\n\t{\n" + // zeile (spalten) iterieren + j := 0 + line.ForEach(func(key, value gjs.Result) bool { + details := value.String() + if value.IsArray() { + if _withoutarr { + return true + } + details = "" + for k, detail := range value.Array() { + if k > 0 { + details = details + ", " + } + details = details + detail.String() + } + details = details + "" + } + if _withoutobj { + if value.IsObject() { + return true + } + } + if j > 0 { + rows = rows + ",\n" + } + row := "\t\t" + `"` + key.String() + `"` + ":" + `"` + tol.DoFilterByStr(details) + `"` + rows = rows + row + j = j + 1 + return true + }) + rows = rows + "\n\t}" + } + i = i + 1 + } + } + rows = rows + "\n]" + // + return rows +} + +// spalten einlesen (momentan 20210415) +func file_gettranslated_columns(_map tol.ColMap, _prekey, _type string, _dparam tol.TDVParams, _fparam tol.TFVParams) (map[int64]string, int64) { + var rows map[int64]string = make(map[int64]string, 0) + var icount int64 = 0 + var row string = "" + conn, err := tol.CheckConnection(_fparam) + if err == nil { + var istype string = "" + if len(_type) > 0 { + istype = "." + _type + } + var csql string = fmt.Sprintf("%v\n", _map) + csql = strings.ReplaceAll(csql, "map[", "[{") + csql = strings.ReplaceAll(csql, "] ", "], ") + csql = strings.ReplaceAll(csql, "]", "}]") + csql = strings.ReplaceAll(csql, "\" \"", "\"},{\"") + csql = "SELECT * FROM html.\"GetColumnsByType\"('" + csql + "'::JSON, " + csql = csql + fmt.Sprintf("%v", def.DEF_customerid) + ", " + csql = csql + "'" + _fparam.FP_what + "', '" + _prekey + "." + _fparam.FP_who + istype + "', " + csql = csql + "'" + _dparam.DP_localeCode + "', true) AS rowtemplate;" + // log.Printf("file_gettranslated_columns(sql) > %v\n", csql) + labelstr, err := conn.Query(csql) + if err == nil { + defer labelstr.Close() + for labelstr.Next() { + if err := labelstr.Scan(&row); err == nil { + rows[icount] = row + icount = icount + 1 + } else { + log.Printf("file_gettranslated_columns(%v) > %v\n", _fparam.FP_who, err) + } + } + } + } + // + return rows, icount +} + +// zeilen für menu einlesen (momentan 20210810) für "dataverse by alias" +func get_dataverse_ids(_dataverses gjs.Result) ([]string, []string) { + ids_dataverse := []string{} + ids_dataset := []string{} + // + if _dataverses.IsArray() { + for _, line := range _dataverses.Array() { + if line.IsObject() { + // alle zeilen iterieren, wenn object + dvid := tol.GetJsonResult(line, "id") + otyp := tol.GetJsonResult(line, "type").String() + switch otyp { + case "dataverse": + ids_dataverse = append(ids_dataverse, dvid.String()) + case "dataset": + dspid := tol.GetJsonString(line, "protocol") + ":" + + tol.GetJsonString(line, "authority") + "/" + + tol.GetJsonString(line, "identifier") + ids_dataset = append(ids_dataset, dspid) + default: + // log.Println("get_dataverse_ids(", idx, "): ", dvid.String(), "type: ", otyp) + } + } + } + } + // + return ids_dataverse, ids_dataset +} + +func GetMenuFromDatasets(_datasets string, _aliasdv string, _level int) (string, int) { + var idcount int = 0 + var sdjson string = "" + status := gjs.Get(_datasets, "status") + if status.String() == "OK" { + datads := gjs.Get(_datasets, "data") + if datads.IsObject() { + total := gjs.Get(datads.String(), "total_count") + if total.Int() > 0 { + itemsds := gjs.Get(datads.String(), "items") + if itemsds.IsArray() { + for _, dvalue := range itemsds.Array() { + aliasds := gjs.Get(dvalue.String(), "identifier_of_dataverse") + // log.Printf("GetMenuFromDataverse(%v) > menu-set: %v\n", aliasdv, dvalue) + if _aliasdv == aliasds.String() { + ilevel := _level + idcount + 1 + if idcount > 0 { + sdjson = sdjson + "," + } + sdjson += get_menuchild_dataset(dvalue, "dataset", ilevel) + // + ifcount := int(gjs.Get(dvalue.String(), "fileCount").Int()) + sfjson := get_menuchild_file_simple("file", ifcount, (ilevel*10)+1) + sdjson = strings.ReplaceAll(sdjson, "%count%", fmt.Sprintf(`(%v) - `, ifcount)) + sdjson = strings.ReplaceAll(sdjson, "%children%", "["+sfjson+"]") + idcount += 1 + } else { + } + } + // log.Printf("GetSearchSimpleResult(%v) > menu-set: %v\n", _aliasdv, sdjson) + } + } + } + } + // + return sdjson, idcount +} + +// zeilen für menu einlesen (momentan 20210319) für "dataverse by alias" +func get_menuchild_dataverse(_dataverse gjs.Result, _type, _alias string, _level int) string { + schildren := "" + if _dataverse.IsObject() { + var resbool bool + var value gjs.Result + // ohne direktes iterieren, wenn object + switch _type { + case "dataverse": + // fmt.Println("get_menuchild_dataset(dataverse):", _dataverse.String()) + taba, tabb := tol.GetTab10(_level) + schildren = strings.Replace(def.MenuChildDataverse(), "%alias%", _alias, -1) + schildren = strings.Replace(schildren, "%level%", fmt.Sprintf("%v", _level), -1) + schildren = strings.Replace(schildren, "%type%", _type, -1) + value, resbool = tol.JsonSearch(_dataverse, "", "id", 0, value) + def.LogMessage("get_menuchild_dataverse(dataverse)", fmt.Sprintf("%v, %v", resbool, value), def.DEF_logdebg) + if resbool { + schildren = strings.Replace(schildren, "%id%", value.String(), -1) + value, resbool = tol.JsonSearch(_dataverse, "", "name", 0, value) + if resbool { + schildren = strings.Replace(schildren, "%title%", tol.DoFilterByStr(value.String()), -1) + schildren = strings.Replace(schildren, "%name%", tol.DoFilterByStr(value.String()), -1) + schildren = strings.Replace(schildren, "%icon%", "%tabb%"iconCls":"icon-dataverse",\n", -1) + schildren = strings.Replace(schildren, "%taba%", taba, -1) + schildren = strings.Replace(schildren, "%tabb%", tabb, -1) + } + } + // fmt.Printf("%v: %v (%v)\n", taba, _level, _type) + } + } + // + return schildren +} + +// zeilen für menu einlesen (momentan 20210810) benutzt in "dataverse by alias" +func get_menuchild_dataset(_dataset gjs.Result, _type string, _level int) string { + schildren := "" + if _dataset.IsObject() { + var value gjs.Result + // + switch _type { + case "dataset": + // fmt.Println("get_menuchild_dataset(dataset):", _dataset.String()) + taba, tabb := tol.GetTab10(_level) + schildren = strings.Replace(def.MenuChildDataset(), "%type%", _type, -1) + schildren = strings.Replace(schildren, "%level%", fmt.Sprintf("%v", _level), -1) + value = gjs.Get(_dataset.String(), "name") + if value.Type == gjs.String { + schildren = strings.Replace(schildren, "%title%", tol.DoFilterByStr(value.String()), -1) + value = gjs.Get(_dataset.String(), "versionId") + if value.Type == gjs.Number { + schildren = strings.Replace(schildren, "%id%", tol.DoFilterByStr(value.String()), -1) + value = gjs.Get(_dataset.String(), "global_id") + if value.Type == gjs.String { + schildren = strings.Replace(schildren, "%id%", tol.DoFilterByStr(value.String()), -1) + schildren = strings.Replace(schildren, "%datasetPid%", tol.DoFilterByStr(value.String()), -1) + value = gjs.Get(_dataset.String(), "subjects") + if value.IsArray() { + schildren = strings.Replace(schildren, "%subjects%", fmt.Sprintf("%v", value.String()), -1) + } + schildren = strings.Replace(schildren, "%icon%", "%tabb%"iconCls":"icon-dataset",\n", -1) + schildren = strings.Replace(schildren, "%taba%", taba, -1) + schildren = strings.Replace(schildren, "%tabb%", tabb, -1) + } + } + } + // fmt.Printf("%v: %v (%v)\n", taba, _level, _type) + } + } + // + return schildren +} + +// icons nach content-type ermitteln (momentan 20210809) +func get_file_icon(_file gjs.Result) string { + var icon string = "icon-file" + // + var content gjs.Result = gjs.Get(_file.String(), "dataFile.contentType") + if content.Type == gjs.String { + var iconmap []string = strings.Split(content.String(), "/") + if len(iconmap) > 0 { + switch iconmap[0] { + case "text": + icon = "icon-file" + if len(iconmap) > 1 { + switch iconmap[1] { + case "css": + icon = "icon-code" + case "html": + icon = "icon-code" + case "x-go": + icon = "icon-code" + case "x-tex": + icon = "icon-code" + case "javascript": + icon = "icon-code" + default: + icon = "icon-file" + } + } + case "audio": + icon = "icon-audio" + case "image": + icon = "icon-image" + case "video": + icon = "icon-video" + case "application": + icon = "icon-package" + if len(iconmap) > 1 { + switch iconmap[1] { + case "json": + icon = "icon-code" + } + } + } + } + } + // + return icon +} + +// zeilen für menu einlesen (momentan 20210326) für "dataverse by alias" +func get_menuchild_file(_file gjs.Result, _type string, _level int) string { + schildren := "" + var value gjs.Result + var resbool bool = false + // + switch _type { + case "file": + taba, tabb := tol.GetTab10(_level) + //fmt.Println("get_menuchild_file():", _type, iconmap) + schildren = strings.Replace(def.MenuChildFile(), "%type%", _type, -1) + schildren = strings.Replace(schildren, "%level%", fmt.Sprintf("%v", _level), -1) + value, resbool = tol.JsonSearch(_file, "", "label", 0, value) + if resbool { + schildren = strings.Replace(schildren, "%label%", tol.DoFilterByStr(value.String()), -1) + value, resbool = tol.JsonSearch(_file, "", "id", 0, value) + if resbool { + schildren = strings.Replace(schildren, "%id%", value.String(), -1) + schildren = strings.Replace(schildren, "%icon%", "%tabb%"iconCls":""+get_file_icon(_file)+"",\n", -1) + schildren = strings.Replace(schildren, "%taba%", taba, -1) + schildren = strings.Replace(schildren, "%tabb%", tabb, -1) + } + } + } + // + return schildren +} + +// zeilen für menu einlesen (momentan 20210326) für "dataverse by alias" +func get_menuchild_file_simple(_type string, _ifcount int, _level int) string { + var schildren string = "" + if _ifcount > 0 { + var slabel string = "file(s)" + switch _ifcount { + case 1: + slabel = "file" + } + slabel = fmt.Sprintf("%v %v found.", _ifcount, slabel) + // + switch _type { + case "file": + taba, tabb := tol.GetTab10(_level) + //fmt.Println("get_menuchild_file():", _type, iconmap) + schildren = strings.ReplaceAll(def.MenuChildFileSimple(), "%type%", _type) + schildren = strings.ReplaceAll(schildren, "%level%", fmt.Sprintf("%v", _level)) + schildren = strings.ReplaceAll(schildren, "%label%", slabel) + schildren = strings.ReplaceAll(schildren, "%icon%", "%tabb%"iconCls":"icon-file",\n") + schildren = strings.ReplaceAll(schildren, "%taba%", taba) + schildren = strings.ReplaceAll(schildren, "%tabb%", tabb) + // + // fmt.Printf("%v: %v (%v) %v\n", taba, _level, _type, schildren) + } + } + // + return schildren +} + +// ############################################################################# +// ### exportierte funktionen +// ############################################################################# +func CheckUserValidity(_fvp tol.TFVParams, _dvp tol.TDVParams) (bool, bool, string, error) { + valid, super, id, err := usr.IsValidUser(tol.GetSiteUrl(_dvp), tol.GetApiKey(_dvp)) + if err != nil { + def.LogError("CheckUserValidity()", err) + } + // + return valid, super, id, err +} + +func CheckUserSuperuser(_dvp tol.TDVParams) (bool, error) { + valid, err := usr.IsSuperUser(tol.GetSiteUrl(_dvp), tol.GetApiKey(_dvp)) + if err != nil { + def.LogError("CheckUserSuperuser()", err) + } + // + return valid, err +} + +func ToggleSuperUser(_dvp tol.TDVParams, _id string) (string, error) { + response, err := usr.ToggleSuperUser(tol.GetSiteUrl(_dvp), tol.GetApiKey(_dvp), _id) + if err != nil { + def.LogError("ToggleSuperUser()", err) + } + // + return (fmt.Sprintf("%s", response)), err +} + +func GetErrorByDataverse(_dvp tol.TDVParams, _error error, _type, _label string) string { + sjson := "" + sjson = sjson + "> Site-URL: '" + tol.GetSiteUrl(_dvp) + "'
" + sjson = sjson + "> Persistent-ID: '" + _dvp.DP_datasetPid + "'
" + sjson = sjson + "> Api-key: '" + tol.GetApiKey(_dvp) + "'

" + sjson = sjson + "There went something wrong:
" + sjson = sjson + "> '%error%'" + sjson = strings.Replace(sjson, "%error%", fmt.Sprintf("%v", _error), -1) + sjson = "{\n" + def.GetErrorByString(sjson, _type, _label) + "\n}" + // + return sjson +} + +func GetDataverseName(_dvp tol.TDVParams, _alias string) (string, error) { + var name string = _alias + aliasdv, err := dvr.GetDataverseByIdOrAlias(_dvp, _alias) + if err != nil { + def.LogError("GetDataverseByIdOrAlias(error)", err) + } else { + namedv := tol.GetObjectFromStr(aliasdv) + if namedv.IsObject() { + status := gjs.Get(namedv.String(), "status") + if status.String() == "OK" { + name = gjs.Get(namedv.String(), "data.name").String() + } + } + } + // + return name, err +} + +// alle atasets einlesen (momentan 20210810) +func GetDatasetsFromAlias(_dvp tol.TDVParams, _fvp tol.TFVParams, _alias string) (string, error) { + if tol.Ds == nil { + tol.Ds = make(tol.TDatasetEntries, 0) + } + var err error = errors.New("SUID not found.") + var dssets string = "" + if len(_fvp.FP_suid) > 0 { + var ok bool = false + // + dssets, ok = tol.Ds[_fvp.FP_suid] + if ok { + if len(dssets) == 0 { + dssets, _ = sch.SearchSimple(_dvp, "&subtree="+_alias, "&type=dataset", ``) + // + tol.Ds[_fvp.FP_suid] = dssets + } + } else { + dssets, _ = sch.SearchSimple(_dvp, "&subtree="+_alias, "&type=dataset", ``) + // log.Println("GetDatasetsFromAlias:", ok, dssets) + // + tol.Ds[_fvp.FP_suid] = dssets + } + // + return dssets, nil + } + // + return "", err +} + +// menü einlesen (momentan 20210308) +func GetMenuFromDataverse(_dvp tol.TDVParams, _fvp tol.TFVParams, + _alias, _tab string, _level int, _first bool) (string, error) { + res, err := dvr.GetContentByAlias(_dvp, _alias) + if err != nil { + def.LogError("GetContentByAlias(menu)", err) + // + return res, err + } + // + sdatasets, err := GetDatasetsFromAlias(_dvp, _fvp, _alias) + if err != nil { + log.Printf("GetMenuFromDataverse(%v) > menu-set: %v, %v\n", _alias, len(sdatasets), err) + } + // + sjson := "" + smenu := "" + status := gjs.Get(res, "status") + icount := 0 + if status.String() == "OK" { + dataverses := gjs.Get(res, "data") + ids_dv, ids_ds := get_dataverse_ids(dataverses) + // dataverse - ids + if len(ids_dv) > 0 { + // log.Printf("get_dataverse_ids(%v): %v", _alias, ids_dv) + idv := len(ids_dv) + // if idv > 5 { + // idv = 5 + // } + //for i := 0; i < len(ids_dv); i++ { + for i := 0; i < idv; i++ { + resdv, err := dvr.GetDataverseByIdOrAlias(_dvp, ids_dv[i]) + if err != nil { + def.LogError("GetMenuFromDataverse(error)", err) + } + status := gjs.Get(resdv, "status") + if status.String() == "OK" { + aliasdv := gjs.Get(resdv, "data.alias").String() + if len(aliasdv) > 0 { + def.LogMessage("GetMenuFromDataverse(dataverse)", fmt.Sprintf("%v, %v", ids_dv[i], aliasdv), def.DEF_logdebg) + datadv := gjs.Get(resdv, "data") + if icount > 0 { + sjson = sjson + "," + } + icount = icount + 1 + + s := get_menuchild_dataverse(datadv, "dataverse", aliasdv, _level+icount) + sjson = sjson + s + + var sdjson string = `` + var idcount int = 0 + //log.Printf("GetMenuFromDataverse(%v) > menu-set: %v, %v\n", aliasdv, sdatasets, err) + if err == nil { + sdjson, idcount = GetMenuFromDatasets(sdatasets, aliasdv, (_level+icount)*10) + idcount = idcount + } + sjson = strings.ReplaceAll(sjson, "%count%", fmt.Sprintf(`(%v) - `, idcount)) + sdjson = strings.ReplaceAll(sdjson, "%children%", "") + + // log.Printf("GetMenuFromDataverse(%v) > %v : %v\n", _level, icount, idcount) + + /* + smenu, err = GetMenuFromDataverse(_dvp, _fvp, aliasdv, "\t"+_tab, (_level+icount+1)*10, false) + if icount > 0 { + if len(smenu) > 0 { + smenu = smenu + "," + sdjson + } else { + smenu = sdjson + } + } + */ + smenu, err = GetMenuFromDataverse(_dvp, _fvp, aliasdv, "\t"+_tab, (_level+icount+1)*10, false) + if icount > 0 { + if len(smenu) > 0 { + if len(sdjson) > 0 { + smenu = smenu + "," + sdjson + } + } else { + smenu = sdjson + } + } + + if err != nil { + def.LogError("GetMenuFromDataverse()", err) + return sjson, err + } else { + sjson = strings.Replace(sjson, "%children%", "["+smenu+"]", -1) + } + } else { + message := errors.New("Alias does not exist for '" + ids_dv[i] + "'.") + def.LogMessage2Level("GetDataverseByIdOrAlias()", fmt.Sprintf("%v: %v", ids_dv[i], message), def.DEF_logerro) + } + } else { + message := gjs.Get(resdv, "message") + def.LogMessage2Level("GetDataverseByIdOrAlias()", fmt.Sprintf("%v: %v", ids_dv[i], message), def.DEF_logerro) + } + } + sjson = strings.Replace(sjson, "%children%", "[]", -1) + } + // dataset - ids + if len(ids_ds) > 0 { + // ###################################################################### + // => menü einlesen (änderung 20210803) + // . die "children" werden nicht mehr ermittelt und eingetragen. + // das reduziert die datenmenge um fast 50%. + // ###################################################################### + // log.Printf("get_dataverse_ids(%v): %v", _alias, ids_ds) + // for i := 0; i < len(ids_ds); i++ { + // resset, err := dst.GetDatasetByPersistentId(_dvp, ids_ds[i], "") + // log.Println("get_dataset_ids(2):", resset, err) + // if err != nil { + // def.LogError("GetMenuFromDataset(error)", err) + // } + // status := gjs.Get(resset, "status") + // if status.String() == "OK" { + // datads := gjs.Get(resset, "data") + // // log.Println("\t", _tab, ".level(dataset):", ".level:", _level+icount, datads) + // if icount > 0 { + // sjson = sjson + "," + // } + // icount = icount + 1 + // sjson = sjson + get_menuchild_dataset(datads, "dataset", _level+icount) + // // metadata + // idds := gjs.Get(datads.String(), "datasetId") // wichtig! nicht "id" verwenden + // if len(strings.TrimSpace(idds.String())) == 0 { + // idds = gjs.Get(datads.String(), "id") + // } + // version := ":latest" + // //version, _ := dst.GetDatasetLastVersion(_dvp, idds.String()) + // def.LogMessage("GetDatasetLastVersion()", fmt.Sprintf("%v: %v - version: %v", ids_ds[i], idds.String(), version), def.DEF_logdebg) + // metadv, err := dst.GetDatasetMetadata(_dvp, idds.String(), version) + // if err != nil { + // def.LogError("GetDatasetMetadata()", err) + // } else { + // status := gjs.Get(metadv, "status") + // if status.String() == "OK" { + // // files + // citation := gjs.Get(metadv, "data.citation") + // if citation.IsObject() { + // sfiles, err := fls.GetFilesByDatasetId(_dvp, idds.String(), "", citation) + // if err != nil { + // log.Println("\t"+_tab+". getfiles(error)", err) + // } + // status := gjs.Get(sfiles, "status") + // if status.String() == "OK" { + // datafs := gjs.Get(sfiles, "data") + // filejson := "" + // if datafs.IsArray() { + // ifcount := 0 + // for _, file := range datafs.Array() { + // if file.IsObject() { + // // if ifcount > 0 { + // // filejson = filejson + "," + // // } + // ifcount = ifcount + 1 + // //filejson = filejson + get_menuchild_file(file, "file", ((_level+icount)*10)+ifcount) + // } + // } + // if ifcount == 0 { + // // log.Println("\t"+_tab+". GetMenuFromDataverse(", idds.String(), "):", citation) + // // log.Println("\t"+_tab+". GetMenuFromDataverse(", idds.String(), ") . dataset:", ids_ds[i], "has no files") + // } else { + // var sfcount string = "file(s)" + // switch ifcount { + // case 1: + // sfcount = "file" + // } + // filejson = filejson + get_menuchild_file_simple("file", fmt.Sprintf("%v %v found.", ifcount, sfcount), ((_level+icount)*10)+ifcount) + // } + // sjson = strings.Replace(sjson, "%children%", "["+filejson+"]", -1) + // } + // } + // } + // } else { + // message := gjs.Get(metadv, "message") + // def.LogMessage2Level(fmt.Sprintf("GetDatasetMetadata(%v)", ids_ds[i]), message.String(), def.DEF_logerro) + // } + // } + // } else { + // message := gjs.Get(resset, "message") + // def.LogMessage2Level(fmt.Sprintf("GetDatasetByPersistentId(%v)", ids_ds[i]), message.String(), def.DEF_logerro) + // } + // sjson = strings.Replace(sjson, "%children%", "[]", -1) + // } + } + } else { + message := gjs.Get(res, "message") + if message.Type != gjs.String { + message.Str = "No message found in result (API - problem?)." + } + err := errors.New(message.String()) + def.LogError("GetMenuFromDataverse()", err) + // + return "", errors.New(message.String()) + } + var sout string = strings.TrimSpace(sjson) + if len(sout) == 0 { + sout = "No submenu found." + } + def.LogMessage("GetMenuFromDataverse(columns)", fmt.Sprintf("%v", sout), def.DEF_logdebg) + // + return sjson, err +} + +func AddToTable(_fparam tol.TFVParams, _array gjs.Result, _sqladd, _sqlparam, _sorc string) bool { + resbool := false + addmap := make(map[int]string) + if _array.IsArray() { + for key, user := range _array.Array() { + addsql := _sqladd + user.ForEach(func(fkey, fvalue gjs.Result) bool { + for _, param := range strings.Split(_sqlparam, ",") { + if fkey.String() == param { + addsql = strings.Replace(addsql, "%"+param+"%", fvalue.String(), -1) + } + } + return true + }) + resbool = (strings.Index(addsql, "%") == -1) + if resbool { + addmap[key] = addsql + } else { + return resbool + } + } + // falls alle felder in sql erfolgreich ausgetauscht, dann eintragen.. + if resbool { + conn, err := tol.CheckConnection(_fparam) + if err != nil { + def.LogError("AddToTable(open)", err) + return false + } + def.LogMessage("AddToTable(ping):", fmt.Sprintf("%v: %v", _sorc, "Ping was successfull! Connection established."), def.DEF_logdebg) + for _, ssql := range addmap { + rows, err := conn.Query(ssql) + if err != nil { + def.LogError("AddToTable(query)", err) + return false + } + defer rows.Close() + for rows.Next() { + var result bool + err = rows.Scan(&result) + if err != nil { + def.LogError("AddToTable(scan)", err) + } + } + defer rows.Close() + } + } + } + // + return resbool +} + +// userliste einlesen (momentan 20210308) +func GetGridFromUserList(_dvp tol.TDVParams, _fvp tol.TFVParams, _sort bool) (string, error) { + sjson := "{\n" + userlist, err := usr.ListUsers(tol.GetSiteUrl(_dvp), tol.GetApiKey(_dvp), _sort) + if err == nil { + // log.Printf(".userlist(): [%v]\n", userlist) + status := gjs.Get(userlist, "status") + if status.String() == "OK" { + data := gjs.Get(userlist, "data") + if data.IsObject() { + usercount := gjs.Get(userlist, "data.userCount") + switch _fvp.FP_what { + case "datagrid": + labels := gjs.Get(userlist, "data.bundleStrings") + // spalten lesen (direkt über API) + sjson = sjson + grid_getcolumns_user(labels, _dvp, _fvp) + // + // TODO: dataverse - eventuelle krücke für falsch gemeldete felder + sjson = strings.Replace(sjson, "userId", "id", -1) + sjson = strings.Replace(sjson, "identifier", "userIdentifier", -1) + // + // zeilen einlesen + users := gjs.Get(userlist, "data.users") + sjson = sjson + grid_getrows_user(users, true, true) + ",\n" + sjson = sjson + `"success":true,` + "\n" + sjson = sjson + `"total":` + usercount.String() + // log.Printf(".userlist(%s): [%v] %s\n", time.Now(), data.String()) + // + if AddToTable(_fvp, users, def.DEF_sqlUserAdd, def.DEF_sqlUserParam, "User") { + // log.Printf("AddToTable(%s): %s\n", "User", "successfull\n") + } + // + } + } + } else { + message := gjs.Get(userlist, "message") + if message.Type != gjs.String { + message.Str = "No users found in result (API - problem?)." + } + def.LogError("GetGridFromUserList(ListUsers)", errors.New(message.Str)) + // + return "", errors.New(message.String()) + } + sjson = sjson + "\n}" + } + // log.Println("GetGridFromUserList():", sjson, err) + // + return sjson, err +} + +// dataverses einlesen (momentan 20210331) +func GetGridFromDataverse(_dvp tol.TDVParams, _fvp tol.TFVParams, _sort bool) (string, error) { + sjson := "{\n" + res, err := dvr.GetContentByAlias(_dvp, _fvp.FP_alias) + if err != nil { + def.LogError("GetContentByAlias(grid.dataverse)", err) + return res, err + } + status := gjs.Get(res, "status") + icount := 0 + if status.String() == "OK" { + dataverses := gjs.Get(res, "data") + ids_dv, _ := get_dataverse_ids(dataverses) + // liste vorbereiten + var dvColList tol.ColMap + var dvRowList tol.RowMap + dvRowList = make(tol.RowMap) + // dataset - ids + if len(ids_dv) > 0 { + dvColList = make(tol.ColMap) + } + for i := 0; i < len(ids_dv); i++ { + resdv, err := dvr.GetDataverseByIdOrAlias(_dvp, ids_dv[i]) + // log.Println("GetGridFromDataverse():", ids_dv[i], resdv) + if err != nil { + def.LogError("GetDataverseByIdOrAlias(grid.dataverse)", err) + } else { + status := gjs.Get(resdv, "status") + if status.String() == "OK" { + icount = icount + 1 + data := gjs.Get(resdv, "data") + iddv := gjs.Get(data.String(), "id") + data.ForEach(func(fkey, fvalue gjs.Result) bool { + // log.Println("object(type):", _fvp.FP_who, fkey) + dvRowList, dvColList = tol.AddValueToMap(dvRowList, + dvColList, iddv, fkey, fvalue, "", "") + return true + }) + } + } + } + sjson = sjson + grid_getcolumns_map("column.", dvColList, _dvp, _fvp) + sjson = sjson + grid_getrows_map(dvRowList, _fvp, "dataverse") + ",\n" + sjson = sjson + `"success":true,` + "\n" + sjson = sjson + `"total":` + fmt.Sprintf("%v", icount) + } + sjson = sjson + "\n}" + // + return sjson, nil +} + +// dataverses einlesen (momentan 20210325) +func GetGridFromDataset(_dvp tol.TDVParams, _fvp tol.TFVParams, _sort bool, + _exclude, _include string) (string, error) { + sjson := "{\n" + res, err := dvr.GetContentByAlias(_dvp, _fvp.FP_alias) + if err != nil { + def.LogError("GetDataverseByIdOrAlias(grid.dataset)", err) + return res, err + } + status := gjs.Get(res, "status") + icount := 0 + if status.String() == "OK" { + dataverses := gjs.Get(res, "data") + _, ids_ds := get_dataverse_ids(dataverses) + // log.Println("GetGridFromDataset(ids):", ids_ds) + // liste vorbereiten + var dsColList tol.ColMap + var dsRowList tol.RowMap + dsRowList = make(tol.RowMap) + // dataset - ids + if len(ids_ds) > 0 { + dsColList = make(tol.ColMap) + } + // + for i := 0; i < len(ids_ds); i++ { + resset, err := dst.GetDatasetByPersistentId(_dvp, ids_ds[i], "") + // fmt.Println("GetGridFromDataset(resset):", ids_ds[i], resset) + if err != nil { + def.LogError("GetDatasetByPersistentId(grid.dataset)", err) + } + status := gjs.Get(resset, "status") + if status.String() == "OK" { + icount = icount + 1 + datads := gjs.Get(resset, "data") + if datads.IsObject() { + latestds := gjs.Get(datads.String(), "latestVersion") + if latestds.Type == gjs.Null { + latestds = gjs.Get(resset, "data") + } + if latestds.IsObject() { + idds := gjs.Get(latestds.String(), "datasetId") + latestds.ForEach(func(fkey, fvalue gjs.Result) bool { + // fmt.Println("GetGridFromDataset(latest):", ids_ds[i], idds.String(), fkey, fvalue) + if len(_include) > 0 { + if strings.Contains(_include, fkey.String()+";") == true { + dsRowList, dsColList = tol.AddValueToMap(dsRowList, + dsColList, idds, fkey, fvalue, _exclude, _include) + } else { + } + } else { + if len(_exclude) > 0 { + if strings.Contains(_exclude, fkey.String()+";") == false { + dsRowList, dsColList = tol.AddValueToMap(dsRowList, + dsColList, idds, fkey, fvalue, _exclude, _include) + } else { + // log.Println("object(type < exclude):", _fvp.FP_who, fkey.String()) + } + } else { + // log.Println("object(", ids_ds[i], "):", _fvp.FP_who, fkey.String()) + dsRowList, dsColList = tol.AddValueToMap(dsRowList, + dsColList, idds, fkey, fvalue, _exclude, _include) + } + } + return true + }) + } + } + } + } + sjson = sjson + grid_getcolumns_map("column.", dsColList, _dvp, _fvp) + sjson = sjson + grid_getrows_map(dsRowList, _fvp, "dataset") + ",\n" + sjson = sjson + `"success":true,` + "\n" + sjson = sjson + `"total":` + fmt.Sprintf("%v", icount) + } + sjson = sjson + "\n}" + // fmt.Println("GetGridFromDataset(json):", sjson) + // + return sjson, nil +} + +// dataverses einlesen (momentan 20210331) +func GetSearchHeader(_dvp tol.TDVParams, _fvp tol.TFVParams, _sort bool) (string, error) { + sjson := "{\n" + res, err := dvr.GetContentByAlias(_dvp, _fvp.FP_alias) + if err != nil { + def.LogError("GetContentByAlias(search.header)", err) + return res, err + } + status := gjs.Get(res, "status") + icount := 0 + if status.String() == "OK" { + dataverses := gjs.Get(res, "data") + ids_dv, _ := get_dataverse_ids(dataverses) + // liste vorbereiten + var dvColList tol.ColMap + var dvRowList tol.RowMap + dvRowList = make(tol.RowMap) + // dataset - ids + if len(ids_dv) > 0 { + dvColList = make(tol.ColMap) + } + for i := 0; i < len(ids_dv); i++ { + resdv, err := dvr.GetDataverseByIdOrAlias(_dvp, ids_dv[i]) + // log.Println("GetGridFromDataverse():", ids_dv[i], resdv) + if err != nil { + def.LogError("GetDataverseByIdOrAlias(search.header)", err) + } + status := gjs.Get(resdv, "status") + if status.String() == "OK" { + icount = icount + 1 + data := gjs.Get(resdv, "data") + iddv := gjs.Get(data.String(), "id") + data.ForEach(func(fkey, fvalue gjs.Result) bool { + // log.Println("object(type):", _fvp.FP_who, fkey) + dvRowList, dvColList = tol.AddValueToMap(dvRowList, + dvColList, iddv, fkey, fvalue, "", "") + return true + }) + } + } + sjson = sjson + grid_getcolumns_map("column.", dvColList, _dvp, _fvp) + sjson = sjson + grid_getrows_map(dvRowList, _fvp, "datasearch") + ",\n" + sjson = sjson + `"success":true,` + "\n" + sjson = sjson + `"total":` + fmt.Sprintf("%v", icount) + } + sjson = sjson + "\n}" + // + return sjson, nil +} + +func search_getcolumns_map(_fparam tol.TFVParams, _id, _json gjs.Result, _key string, _cols tol.ColMap) tol.ColMap { + var columns string = "" + //var rows string = "" + conn, err := tol.CheckConnection(_fparam) + if err == nil { + csql := strings.ReplaceAll(_json.String(), "'", "'") + csql = "SELECT * FROM html.\"GetJson\"('" + csql + "'::JSON);" + // log.Println("<<< search_getcolumns_map()", csql) + filestr, err := conn.Query(csql) + if err == nil { + defer filestr.Close() + for filestr.Next() { + if err := filestr.Scan(&columns); err == nil { + key := gjs.Get(columns, "key") + value := gjs.ParseBytes([]byte(gjs.Get(columns, "value").String())) + if value.IsObject() { + _cols = search_getcolumns_map(_fparam, _id, value, _key+key.String()+".", _cols) + } else { + _cols = tol.AddColumnToMapAsString(_cols, _key+key.String(), key.String()) + // log.Printf("file(%v) - key: %v, value: %v\n", _id, _key+key.String(), value) + } + } + } + } + } + // + return _cols +} + +// speicher item in map - 20210506 +func add_to_json_map(_map tol.JsnMapInt, _obj gjs.Result) tol.JsnMapInt { + if _obj.IsObject() { + var valb map[string]interface{} + var sobj string = _obj.String() + errb := json.Unmarshal([]byte(sobj), &valb) + if errb == nil { + _map[len(_map)] = valb + } + } + // + return _map +} + +// berechne parametersatz template - 20210526 +func get_params_datasettemplate(_fvp tol.TFVParams) tol.ColMapInt { + var ftmpl tol.ColMapInt = make(tol.ColMapInt, 0) + // aufbereiten der abfrageparameter für "dataset" + for _, ival := range _fvp.FP_parm { + for key, val := range ival { + if key == "search" { + // log.Println("get_params_datasettemplate(key):", key, val) + stmp := val[:strings.IndexByte(val, '=')] + if stmp == "fileDescription" { + continue + } + } + ftmpl[len(ftmpl)] = map[string]string{key: val} + } + } + // log.Println("get_params_datasettemplate(res):", ftmpl) + // + return ftmpl +} + +// berechne parametersatz template - 20210526 +func get_params_filetemplate(_fvp tol.TFVParams) tol.ColMapInt { + var ftmpl tol.ColMapInt = make(tol.ColMapInt, 0) + // aufbereiten der abfrageparameter für "file" + var sval = "*" + for _, ival := range _fvp.FP_parm { + for key, val := range ival { + if key == "search" { + skey := val[:strings.IndexByte(val, '=')] + if skey == "fileDescription" { + sval = tol.GetstringBetween(val, "[", "]") + if len(sval) > 0 { + // log.Println("get_params_filetemplate(key):", key, sval) + var andqry string = "" + arrval := strings.Split(sval, "+") + if len(arrval) > 1 { + andqry = "" + var andcnt int64 = 0 + for _, aval := range arrval { + if andcnt > 0 { + andqry = andqry + " AND " + } + andqry = andqry + skey + `:"` + strings.Replace(strings.Trim(aval, " "), `"`, ``, -1) + `"` + andcnt = andcnt + 1 + } + if andcnt > 0 { + sval = "(" + strings.TrimSpace(andqry) + ")" + } + // log.Println("get_params_filetemplate(key1):", key, sval) + } else { + sval = "(" + skey + ":" + sval + ")" + // log.Println("get_params_filetemplate(key2):", key, sval) + } + } + break + } + } + } + } + ftmpl[len(ftmpl)] = map[string]string{"_q_": sval} + ftmpl[len(ftmpl)] = map[string]string{"type": "file"} + ftmpl[len(ftmpl)] = map[string]string{"per_page": "1000"} + for _, ival := range _fvp.FP_parm { + for key, val := range ival { + if key == "subtree" { + ftmpl[len(ftmpl)] = map[string]string{key: val} + break + } + } + } + // + return ftmpl +} + +// berechne parametersatz mit startposition - 20210506 +func get_params(_parm tol.ColMapInt, _start int64) tol.ColMapInt { + var fparm tol.ColMapInt = make(tol.ColMapInt, 0) + for _, ival := range _parm { + for key, val := range ival { + fparm[len(fparm)] = map[string]string{key: val} + } + } + fparm[len(fparm)] = map[string]string{"start": fmt.Sprintf("%v", _start)} + // + return fparm +} + +// suche nach allen "file" (rekursiv) - 20210506 +func GetSearchFileList(_dvp tol.TDVParams, _fvp tol.TFVParams, jsonItems tol.JsnMapInt) (tol.JsnMapInt, error) { + // vorbereitung für file-suche (template) + ftmpl := get_params_filetemplate(_fvp) + // + var istart int64 = 0 + var itotal int64 = 0 + var ireslt int64 = -1 + var resf string + var errf error + for itotal > ireslt { + fparm := get_params(ftmpl, istart) + // log.Printf("GetSearchFileList(fparm) - string: %v\n", fparm) + // suche nach files, weil "dataset" gefunden + resf, errf = sch.SearchByParams(_dvp, fparm) + // log.Printf("GetSearchFileList(json) - byte: %v, %v\n", resf, errf) + if errf == nil { + var statusf gjs.Result = gjs.Get(resf, "status") + if statusf.String() == "ERROR" { + var err error = errors.New(resf) + return jsonItems, err + } else { + if statusf.String() == "OK" { + dataf := gjs.Get(resf, "data") + if dataf.IsObject() { + // var sdataf string = strings.ReplaceAll(strings.ReplaceAll(dataf.String(), "\n", ""), #13#10, " ") + re := regexp.MustCompile(`\r?\n`) + var sdataf string = re.ReplaceAllString(dataf.String(), " ") + itotal = gjs.Get(sdataf, "total_count").Int() + ireslt = gjs.Get(sdataf, "count_in_response").Int() + itemsf := gjs.Get(sdataf, "items") + // log.Printf("GetSearchFileList(itemsf) - file: %v\n\n", itemsf.String()) + for _, valf := range itemsf.Array() { + if valf.IsObject() { + var iobj int = 0 + var sobject string = "{" + valf.ForEach(func(okey, oval gjs.Result) bool { + skey := okey.String() + switch skey { + case "description", "dataset_citation", "dataset_name": + return true + default: + if iobj > 0 { + sobject += `,` + } + sobject += `"` + okey.String() + `":"` + tol.DoFilterByStr(oval.String()) + `"` + iobj = iobj + 1 + } + return true + }) + if iobj > 0 { + sobject += `}` + rvalf := tol.GetObjectFromStr(sobject) + //log.Printf("GetSearchFileList(itemsf %v) - objects 1: %v\n", kalf, rvalf) + jsonItems = add_to_json_map(jsonItems, rvalf) + } + } + // log.Printf("GetSearchFileList(itemsf %v) - objects 2: %v\n\n", kalf, valf) + // jsonItems = add_to_json_map(jsonItems, valf) + } + if ireslt > 0 { + istart = istart + ireslt + } else { + break + } + } else { + break + } + } + } + } + } + // log.Printf("GetSearchFileList(json) - file: %v\n", jsonItems) + // + return jsonItems, errf +} + +// suche nach "dataset" & "file" - 20210506 +func GetSearchResult(_dvp tol.TDVParams, _fvp tol.TFVParams) (string, error) { + var sjson string = "{"total":%count%,"datasets":%datasets%,"files":%files%,\n"entries":[%entries%],\n%cols%\n"rows":[%rows%]\n}" + var jcount int = 0 + var dcount int64 = 0 + var fcount int64 = 0 + var icount int64 = 0 + var ecount int64 = 0 + var srows string = "" + var sentries string = "" + tol.DataColList = make(tol.ColMap, 0) + tol.FileColList = make(tol.ColMap, 0) + // + // log.Printf("GetSearchResult(fp_parm) - string: %v\n", _fvp.FP_parm) + // + ftmpl := get_params_datasettemplate(_fvp) + res, err := sch.SearchByParams(_dvp, ftmpl) + if err != nil { + def.LogError("SearchByParams(search.result)", err) + return res, err + } else { + // log.Printf("GetSearchResult(search) - all: %v\n", res) + status := gjs.Get(res, "status") + if status.String() == "ERROR" { + var err error = errors.New(res) + return "", err + } else { + if status.String() == "OK" { + var dataJson tol.JsnMapInt = make(tol.JsnMapInt, 0) + var fileJson tol.JsnMapInt = make(tol.JsnMapInt, 0) + data := gjs.Get(res, "data") + if data.IsObject() { + items := gjs.Get(data.String(), "items") + // fmt.Printf("GetSearchResult(search) - items: %v\n", items.String()) + if items.IsArray() { + if len(items.Array()) > 0 { + fileJson, err = GetSearchFileList(_dvp, _fvp, fileJson) + // fmt.Printf("GetSearchResult(search) - fileJson: %v\n\n", fileJson) + // "dataset" iterieren + for _, entry := range items.Array() { + if entry.IsObject() { + // log.Printf("GetSearchResult(entry) - item: %v\n", entry.String()) + var istype gjs.Result = gjs.Get(entry.String(), "type") + switch istype.String() { + case "dataset": + dataJson = add_to_json_map(dataJson, entry) + var doi gjs.Result = gjs.Get(entry.String(), "global_id") + if doi.Type != gjs.Null { + icount = icount + 1 + //var name gjs.Result = gjs.Get(entry.String(), "name") + for _, valj := range fileJson { + bytej, errj := json.Marshal(valj) + if errj == nil { + var entryf gjs.Result = tol.GetObjectFromStr(string(bytej)) + // log.Printf("GetSearchResult(json) - entry: (%v) %v %v %v\n", i, entryf.IsObject(), entryf.Type.String(), entryf.String()) + if entryf.IsObject() { + doif := gjs.Get(entryf.String(), "dataset_persistent_id") + if doif.String() == doi.String() { + var idf gjs.Result = gjs.Get(entry.String(), "file_id") + tol.FileColList = search_getcolumns_map(_fvp, idf, entryf, "", tol.FileColList) + dataJson = add_to_json_map(dataJson, entryf) + icount = icount + 1 + } + } + } + } + // log.Printf("GetSearchResult(json)\n") + } + // log.Printf("GetSearchResult(dataset) - json: %v\n\n", dataJson) + tol.DataColList = search_getcolumns_map(_fvp, doi, entry, "", tol.DataColList) + break + } + } + } + } + //log.Printf("GetSearchResult(fileJson) - string: %v\n", len(fileJson)) + // + var datatempl string = "" + var filetempl string = "" + var colstempl string = "" + var rowstempl string = "" + var rowsarray map[int64]string + var rowsColList tol.ColMap + // + rowstempl = rowstempl + rowsColList = rowsColList + // log.Printf("GetSearchResult(DataColList) - dataset: %v\n", tol.DataColList) + rowsarray, _ = file_gettranslated_columns(tol.DataColList, "column", "dataset", _dvp, _fvp) + for i, row := range rowsarray { + switch i { + case 0: + colstempl = row + case 1: + datatempl = row + } + // log.Printf("datarow(%v) - rows-template: \n%v\n", i, row) + } + // + // log.Printf("GetSearchResult(FileColList) - file: %v\n", tol.FileColList) + rowsarray, _ = file_gettranslated_columns(tol.FileColList, "column", "file", _dvp, _fvp) + for i, row := range rowsarray { + switch i { + case 0: + colstempl = row + case 1: + filetempl = row + // log.Printf("filerow(%v) - rows-template: \n%v\n", i, row) + } + // log.Printf("filerow(%v) - rows-template: \n%v\n", i, row) + } + // + sjson = strings.Replace(sjson, "%cols%", colstempl, -1) + if icount > 0 { + icount = 0 + ecount = 0 + // werte aller teilen ermitteln und eintragen + for i, _ := range dataJson { + i = i + var svalue string + byted, errd := json.Marshal(dataJson[jcount]) + if errd == nil { + var entry gjs.Result = tol.GetObjectFromStr(string(byted)) + if entry.IsObject() { + if ecount > 0 { + sentries = sentries + ",\n" + } + sentries = sentries + entry.String() + ecount = ecount + 1 + // log.Printf("GetSearchResult(object) - entry: %v\n", entry.String()) + var id gjs.Result + var name gjs.Result + //var doi gjs.Result + var istype gjs.Result = gjs.Get(entry.String(), "type") + switch istype.String() { + case "dataset": + name = gjs.Get(entry.String(), "name") // doi > "global_id" + rowstempl = datatempl + rowsColList = tol.DataColList + case "file": + name = gjs.Get(entry.String(), "name") + rowstempl = filetempl + rowsColList = tol.FileColList + default: + continue + } + if name.Type != gjs.Null { + // log.Printf("GetSearchResult(entry) - list: %v\n", rowsColList) + var doi gjs.Result = tol.GetObjectFromStr("") + var fct gjs.Result = tol.GetObjectFromStr("") + var slabel string = "" + var sname string = "" + sname = tol.DoFilterByStr(name.String()) + if icount > 0 { + srows = srows + ",\n" + } + switch istype.String() { + case "dataset": + slabel = sname + `&` + istype.String() + `;` + doi = gjs.Get(entry.String(), "global_id") + if doi.Type != gjs.Null { + slabel = slabel + `&` + doi.String() + `;` + } + dcount = dcount + 1 + case "file": + slabel = sname + id = gjs.Get(entry.String(), "file_id") + if id.Type != gjs.Null { + slabel = slabel + `&(id:` + id.String() + `)` + } + slabel = slabel + `&` + istype.String() + `;` + fct = gjs.Get(entry.String(), "file_content_type") + if fct.Type != gjs.Null { + slabel = slabel + `&` + fct.String() + } + fcount = fcount + 1 + default: + continue + } + // + label := gjs.Get(entry.String(), "label") + if label.Type != gjs.Null { + slabel = slabel + " - " + tol.DoFilterByStr(label.String()) + } + slabel = slabel + `", "type":"` + istype.String() + slabel = slabel + `", "doi":"` + doi.String() + slabel = slabel + `", "label":"` + sname + // log.Printf("group(%v): %v\n", istype.String(), slabel) + srows = srows + rowstempl + sjson = strings.Replace(sjson, "%group%", slabel, -1) + for key, _ := range rowsColList { + skey := strings.Replace(key, `"`, ``, -1) + gvalue := gjs.Get(entry.String(), skey) + // log.Printf("filerow(%v) - type: %v, key: %v, value: %v\n", id, gvalue.Type.String(), skey, gvalue) + switch gvalue.Type { + case gjs.JSON: + if gvalue.IsArray() { + // log.Printf("filerow(%v) - type: %v, key: %v, value: %v\n", id, gvalue.Type.String(), skey, gvalue.String()) + svalue = `" + } + srows = strings.ReplaceAll(srows, "%"+skey+"%", svalue) + continue + } + case gjs.String: + svalue = gvalue.String() + case gjs.Number: + svalue = gvalue.String() + case gjs.True: + svalue = gvalue.String() + case gjs.False: + svalue = gvalue.String() + default: + svalue = "---" + } + // log.Printf("filerow(%v) - type: %v, key: %v, value: %v\n", id, gvalue.Type.String(), key, svalue) + if "%"+skey+"%" == "%url%" { + var url string = strings.ReplaceAll(`%url%`, "%url%", svalue) + //log.Println("url:", url) + srows = strings.ReplaceAll(srows, "%"+skey+"%", tol.DoFilterByStr(url)) + } else { + srows = strings.ReplaceAll(srows, "%"+skey+"%", tol.DoFilterByStr(svalue)) + } + } + icount = icount + 1 + srows = strings.Replace(srows, "%group%", slabel, -1) + } + jcount = jcount + 1 + //fmt.Printf("GetSearchResult(search 2) - items: %v %v\n", jcount, ecount) + } + } + } + } + } + } + } + } + } + + // jcount = 1 + if jcount > 0 { + def.LogMessage("", fmt.Sprintf("GetSearchResult(%v) > rows: %v", "success", jcount), def.DEF_loginfo) + } else { + def.GetErrorByString(fmt.Sprintf("No result for query: %v\n", tol.JsonEscape(string(_fvp.FP_qery))), "alert", "GetSearchResult(0)") + } + sjson = strings.Replace(sjson, "%rows%", srows, -1) + // sjson = strings.Replace(sjson, "%entries%", "", -1) + sjson = strings.Replace(sjson, "%entries%", sentries, -1) + sjson = strings.Replace(sjson, "%count%", fmt.Sprintf("%v", jcount), -1) + sjson = strings.Replace(sjson, "%datasets%", fmt.Sprintf("%v", dcount), -1) + sjson = strings.Replace(sjson, "%files%", fmt.Sprintf("%v", fcount), -1) + // + // korrektur der werte für nicht gefundene felder.. + var between string = tol.GetstringBetween(sjson, ":\"%", "%\",") + for len(between) > 0 { + sjson = strings.Replace(sjson, "%"+between+"%", "---", -1) + between = tol.GetstringBetween(sjson, ":\"%", "%\",") + } + // fmt.Printf("GetSearchResult(search 3) - items fertsch: j:%v e:%v i:%v, len:%v\n", jcount, ecount, icount, len(sjson)) + // fmt.Printf("GetSearchResult(search 4) - items fertsch: j:%v e:%v i:%v, len:%v val:%v\n", jcount, ecount, icount, len(sjson), sjson) + // + return sjson, nil +} + +func file_getcolumns_map(_fparam tol.TFVParams, _id, _json gjs.Result, _key string, _cols tol.ColMap) tol.ColMap { + var columns string = "" + //var rows string = "" + conn, err := tol.CheckConnection(_fparam) + if err == nil { + csql := _json.String() + // log.Println("<<< grid_getcolumns_user()", _fparam.FP_who) + csql = "SELECT * FROM html.\"GetJson\"('" + csql + "'::JSON);" + filestr, err := conn.Query(csql) + if err == nil { + defer filestr.Close() + for filestr.Next() { + if err := filestr.Scan(&columns); err == nil { + key := gjs.Get(columns, "key") + value := gjs.ParseBytes([]byte(gjs.Get(columns, "value").String())) + if value.IsObject() { + _cols = file_getcolumns_map(_fparam, _id, value, _key+key.String()+".", _cols) + } else { + _cols = tol.AddColumnToMapAsString(_cols, _key+key.String(), key.String()) + // log.Printf("file(%v) - key: %v, value: %v\n", _id, _key+key.String(), value) + } + } + } + } + } + // + return _cols +} + +// dataverses einlesen (momentan 20210416) +func GetPropGridFromDatasetFiles(_dvp tol.TDVParams, _fvp tol.TFVParams, + _include string) (string, error) { + var sjson string = "{"total":%count%,\n%cols%\n"rows":[" + var icount int64 = 0 + // + ids_ds := []string{} + var dfColList tol.ColMap + ids_ds = append(ids_ds, _fvp.FP_alias) + for i := 0; i < len(ids_ds); i++ { + resset, err := dst.GetDatasetByPersistentId(_dvp, ids_ds[i], "") + // log.Printf("GetPropGridFromDatasetFiles(%v): %v\n", ids_ds[i], resset) + if err != nil { + def.LogError("GetDatasetByPersistentId(propgrid.files)", err) + } else { + // log.Println("GetGridFromDataset():", ids_ds[i], resset) + status := gjs.Get(resset, "status") + if status.String() == "OK" { + datads := gjs.Get(resset, "data") + if datads.IsObject() { + datalv := gjs.Get(datads.String(), "latestVersion") + if !datalv.IsObject() { // falls nicht gefunden, dann "data" verwenden + datalv = datads + } + if datalv.IsObject() { + // idds := gjs.Get(datalv.String(), "datasetId") + // log.Println("GetPropGridFromDatasetFiles(data):", ids_ds[i], idds, datalv) + fileds := gjs.Get(datalv.String(), _include) + // log.Printf("GetPropGridFromDatasetFiles(%v): %v\n", ids_ds[i], fileds) + if fileds.IsArray() { + var csql string = fmt.Sprintf("%v\n", fileds.String()) + csql = strings.ReplaceAll(csql, "\" \"", "\"},{\"") + // log.Println("GetPropGridFromDatasetFiles(", _include, "):", idds, csql) + for _, file := range fileds.Array() { + var id gjs.Result + id = gjs.Get(file.String(), "dataFile.id") + // zeilen (für alle spalten) auslesen, wenn objekt.. + if file.IsObject() { + dfColList = file_getcolumns_map(_fvp, id, file, "", dfColList) + } + } + var colstempl string = "" + var rowstempl string = "" + var rowsarray map[int64]string + rowsarray, icount = file_gettranslated_columns(dfColList, "column", "", _dvp, _fvp) + // log.Println("GetPropGridFromDatasetFiles("+_include+"):", icount, rowsarray) + for i, row := range rowsarray { + switch i { + case 0: + colstempl = row + case 1: + rowstempl = row + } + } + // log.Println("GetPropGridFromDatasetFiles(rowstempl):", rowstempl) + // log.Printf("filerow(%v) - cols-template: \n%v\n", icount, colstempl) + if icount > 0 { + sjson = strings.Replace(sjson, "%cols%", colstempl, -1) + icount = 0 + // werte aller teilen ermitteln und eintragen + for _, file := range fileds.Array() { + // log.Printf("filerow() - file: %v\n", file.String()) + var id gjs.Result + // zeilen (für alle spalten) auslesen, wenn objekt.. + var svalue string + if file.IsObject() { + // // id als array-key in map[] ermitteln + id = gjs.Get(file.String(), "dataFile.id") + if id.Type != gjs.Null { + var slabel string = "" + if icount > 0 { + sjson = sjson + ",\n" + } + name := gjs.Get(file.String(), "label") + if name.Type != gjs.Null { + slabel = name.String() + id = gjs.Get(file.String(), "dataFile.id") + if id.Type != gjs.Null { + slabel = slabel + `&(id:` + id.String() + `)` + } + slabel = slabel + `&file;` + fct := gjs.Get(file.String(), "dataFile.contentType") + if fct.Type != gjs.Null { + slabel = slabel + `&` + fct.String() + } + // log.Printf("filerow(%v): %v\n", id, slabel) + } + sjson = sjson + rowstempl + sjson = strings.Replace(sjson, "%group%", slabel, -1) + for key, _ := range dfColList { + skey := strings.Replace(key, `"`, ``, -1) + gvalue := gjs.Get(file.String(), skey) + // log.Printf("filerow(%v) - type: %v, key: %v, value: %v\n", id, gvalue.Type.String(), skey, gvalue) + switch gvalue.Type { + case gjs.String: + svalue = gvalue.String() + case gjs.Number: + svalue = gvalue.String() + case gjs.True: + svalue = gvalue.String() + case gjs.False: + svalue = gvalue.String() + default: + svalue = "---" + } + // log.Printf("filerow(%v) - type: %v, key: %v, value: %v\n", id, gvalue.Type.String(), key, svalue) + sjson = strings.ReplaceAll(sjson, "%"+skey+"%", tol.DoFilterByStr(svalue)) + icount = icount + 1 + } + } + } + } + } + } + } + } + } + } + } + sjson = strings.Replace(sjson, "%cols%", `"cols":[[]],`, -1) + sjson = strings.Replace(sjson, "%count%", fmt.Sprintf("%v", icount), -1) + sjson = sjson + "\n],\n"success":true\n}" + // + // korrektur der werte für nicht gefundene felder.. + var between string = tol.GetstringBetween(sjson, ":\"%", "%\",") + for len(between) > 0 { + sjson = strings.Replace(sjson, "%"+between+"%", "---", -1) + between = tol.GetstringBetween(sjson, ":\"%", "%\",") + } + // + // log.Printf("filerows(%v) - json: \n%v\n", icount, sjson) + // + return sjson, nil +} + +func ImportMetaFields(_dvp tol.TDVParams, _fvp tol.TFVParams, _html string) (string, error) { + for _, arrayp := range _fvp.FP_parm { + for keyp, valuep := range arrayp { + var smeta = `,data:[` + if keyp == "meta" { + metadv, err := dst.GetDatasetMetafield(_dvp, valuep) + if err == nil { + status := gjs.Get(metadv, "status") + if status.String() == "OK" { + smeta = smeta + `` + data := gjs.Get(metadv, "data") + if data.IsObject() { + cvv := gjs.Get(data.String(), "controlledVocabularyValues") + if cvv.IsArray() { + var icount int64 = 0 + for _, arrayc := range cvv.Array() { + if icount > 0 { + smeta = smeta + "," + } + smeta = smeta + `{` + var ccount int64 = 0 + arrayc.ForEach(func(keyc, valuec gjs.Result) bool { + if ccount > 0 { + smeta = smeta + "," + } + switch keyc.String() { + case "id": + smeta = smeta + `'id':'` + valuec.String() + `'` + case "strValue": + smeta = smeta + `'value':'` + valuec.String() + `'` + smeta = smeta + `,'text':'` + valuec.String() + `'` + icount = icount + 1 + return false + } + ccount = ccount + 1 + return true + }) + smeta = smeta + `}` + } + } + } + } + } + smeta = smeta + `]` + } + _html = strings.Replace(_html, `%`+valuep+`%`, smeta, -1) + } + } + // + return _html, nil +} + +func init() { + log.Println("Initialize package - Dataverse..") +} diff --git a/goDataverse/search/search.go b/goDataverse/search/search.go new file mode 100644 index 0000000..8c88f1a --- /dev/null +++ b/goDataverse/search/search.go @@ -0,0 +1,76 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package search + +import ( + "fmt" + "strings" + + // + def "Toolbox/defaults" + con "Toolbox/goDataverse/connect" + tol "Toolbox/goDataverse/tools" +) + +// ############################################################################# +// +// der parameter "_q_=xxx" wird vor der abfrage in "q=xxx" umgewandelt. hierbei +// handelt es sich um einen workaround, der garantiert, dass die +// parameterreihenfolge bei der übergabe an die abfrage passt. +// aus diesem grund werden hier auch 2 durchläufe benötigt... +// +func SearchByParams(_dvp tol.TDVParams, _params tol.ColMapInt) (string, error) { + var par tol.ColMapInt = make(tol.ColMapInt, 0) + var url string = tol.GetSiteUrl(_dvp) + "/api/search?" + // 1. durchlauf query parameter anhängen + for _, ival := range _params { + // log.Println("SearchByParams(param1):", ival) + for key, val := range ival { + if key == "_q_" { + url = url + key + "=" + val + break + } + } + } + // 2. durchlauf restliche parameter anhängen + for _, ival := range _params { + // log.Println("SearchByParams(param2):", ival) + for key, val := range ival { + if key != "_q_" { + if key != "search" { + url = url + "&" + key + "=" + val + } + } + } + } + // def.LogMessage("", fmt.Sprintf("GetSearchResult(%v) > url: %v", "params", url), def.DEF_loginfo) + fmt.Printf("GetSearchResult(%v) > url: %v\n", "params", url) + response, err := con.GetRequestMap(url, par, + map[string]string{"X-Dataverse-key": tol.GetApiKey(_dvp)}) + // + return (fmt.Sprintf("%s", response)), err +} + +func SearchSimple(_dvp tol.TDVParams, _alias string, _type string, _advanced string) (string, error) { + var par tol.ColMapInt = make(tol.ColMapInt, 0) + var url string = tol.GetSiteUrl(_dvp) + "/api/search?q=*%type%%alias%&per_page=1000%advanced%" + // + url = strings.ReplaceAll(url, "%alias%", _alias) + url = strings.ReplaceAll(url, "%type%", _type) + url = strings.ReplaceAll(url, "%advanced%", _advanced) + // + def.LogMessage("", fmt.Sprintf("GetSearchResult(%v) > url: %v", "params", url), def.DEF_logdebg) + // log.Printf("GetSearchSimple(%v) > url: %v\n", "params", url) + response, err := con.GetRequestMap(url, par, + map[string]string{"X-Dataverse-key": tol.GetApiKey(_dvp)}) + // + return (fmt.Sprintf("%s", response)), err +} diff --git a/goDataverse/svg/svg.go b/goDataverse/svg/svg.go new file mode 100644 index 0000000..2f5a266 --- /dev/null +++ b/goDataverse/svg/svg.go @@ -0,0 +1,281 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package svg + +import ( + "fmt" + "log" + "reflect" + "strconv" + "strings" + + // + def "Toolbox/defaults" + tol "Toolbox/goDataverse/tools" + pog "Toolbox/postgres" +) + +type TSVGobject struct { + Name string + Class string + Trans string + Width int + Height int + Style string + Anima string + // + Object string + Total string +} + +var SVG_object TSVGobject +var SVGViewbox string = "0 0 32 32" +var SVGIcons tol.SVGMap = make(tol.SVGMap) + +func SVG_gethtml_all(_viewbox string) TSVGobject { + var _svg TSVGobject = SVG_object + if reflect.TypeOf(_svg).Name() == "TSVGobject" { + w := strconv.Itoa(_svg.Width) + h := strconv.Itoa(_svg.Height) + svgs := `{` + var icount int64 = 0 + var namelist string = "" + for key, value := range SVGIcons { + namelist = namelist + key + ";" + var svg string = "" + svg = svg + `` + svg = svg + `` + svg = svg + `` + svg = svg + `` + svg = svg + _svg.Anima + svg = svg + `` + // + if icount > 0 { + svgs = svgs + `,` + } + svgs = svgs + `"` + key + `":"` + strings.ReplaceAll(svg, `"`, `\"`) + `"` + icount = icount + 1 + } + svgs = svgs + `}` + _svg.Object = svgs + _svg.Total = fmt.Sprintf("%v", icount) + // log.Println("SVG_object:", len(_svg.Object), "\n") + log.Println("SVG_keys:", namelist) + } + // + return _svg +} + +func SVG_gethtml_single(_name string, _width, _height int, _matrix, _viewbox string) string { + _svg := SVG_object + var svg string = "" + if reflect.TypeOf(_svg).Name() == "TSVGobject" { + w := strconv.Itoa(_width) + h := strconv.Itoa(_height) + value := SVGIcons[_name] + if reflect.TypeOf(value).Name() == "string" { + svg = svg + "" + svg = svg + "" + svg = svg + "" + svg = svg + "" + svg = svg + _svg.Anima + svg = svg + "" + // + log.Println("SVG("+_name+"):", svg) + } + } + // + return svg +} + +func GetSVG_ByParams(_fvp tol.TFVParams) (string, error) { + var svgs string = `{"total":%total%, "data":[%svgs%]}` + var str string = "" + var icount int = 0 + conn, err := pog.GetConnection() + if err == nil { + defer pog.CloseConnection(conn) + err = pog.PingConnection(conn) + if err == nil { + var svgsql string = def.DEF_sqlgetsvg + svgsql = strings.ReplaceAll(svgsql, "%shadow%", "true") + svgsql = strings.ReplaceAll(svgsql, "%width%", _fvp.FP_widt) + svgsql = strings.ReplaceAll(svgsql, "%height%", _fvp.FP_heit) + svgsql = strings.ReplaceAll(svgsql, "%matrix%", _fvp.FP_matx) + svgsql = strings.ReplaceAll(svgsql, "%viewbox%", _fvp.FP_view) + svgsql = strings.ReplaceAll(svgsql, "%names%", _fvp.FP_who) + // log.Println(" <<< GetSVG_ByParams:", svgsql) + svgrows, err := conn.Query(svgsql) + if err != nil { + def.LogError("GetSVG_ByParams()", err) + return svgs, err + } + defer svgrows.Close() + for svgrows.Next() { + var s string = "" + err := svgrows.Scan(&s) + if err != nil { + svgs = strings.ReplaceAll(svgs, "%total%", fmt.Sprintf("%v", icount)) + svgs = strings.ReplaceAll(svgs, "%svgs%", fmt.Sprintf("%v", str)) + // + return svgs, err + } + if icount > 0 { + str = str + ",\n" + } + str = str + fmt.Sprintf("%v", s) + icount++ + } + svgs = strings.ReplaceAll(svgs, "%total%", fmt.Sprintf("%v", icount)) + svgs = strings.ReplaceAll(svgs, "%svgs%", fmt.Sprintf("%v", str)) + // + return svgs, err + } + } + svgs = strings.ReplaceAll(svgs, "%total%", fmt.Sprintf("%v", icount)) + svgs = strings.ReplaceAll(svgs, "%svgs%", fmt.Sprintf("%v", str)) + // + return svgs, err +} + +func SVG_getsvg_single(_fvp tol.TFVParams) (string, error) { + var svgs string = "" + conn, err := pog.GetConnection() + if err == nil { + defer pog.CloseConnection(conn) + err = pog.PingConnection(conn) + if err == nil { + var svgsql string = def.DEF_sqlgetsvg + svgsql = strings.ReplaceAll(svgsql, "%shadow%", _fvp.FP_shad) + svgsql = strings.ReplaceAll(svgsql, "%width%", _fvp.FP_widt) + svgsql = strings.ReplaceAll(svgsql, "%height%", _fvp.FP_heit) + svgsql = strings.ReplaceAll(svgsql, "%matrix%", _fvp.FP_matx) + svgsql = strings.ReplaceAll(svgsql, "%viewbox%", _fvp.FP_view) + svgsql = strings.ReplaceAll(svgsql, "%names%", _fvp.FP_who) + // log.Println(" <<< SVG_getsvg_single:", svgsql) + svgstr, err := conn.Query(svgsql) + if err != nil { + def.LogError("SVG_getsvg_single()", err) + return svgs, err + } + defer svgstr.Close() + for svgstr.Next() { + if err := svgstr.Scan(&svgs); err == nil { + return svgs, err + } + } + } + } + // + return svgs, err +} + +func init() { + log.Println("Initialize package - SVG..") + // + SVG_object.Width = 30 + SVG_object.Height = 30 + SVG_object.Trans = "matrix(1,0,0,1,0,0)" + SVG_object.Class = "app-tb-btn-svg" + SVG_object.Anima = "" + // + SVGIcons["expand"] = "M25.545,23.328,17.918,15.623,25.534,8.007,27.391,9.864,29.649,1.436,21.222,3.694,23.058,5.53,15.455,13.134,7.942,5.543,9.809,3.696,1.393,1.394,3.608,9.833,5.456,8.005,12.98,15.608,5.465,23.123,3.609,21.268,1.351,29.695,9.779,27.438,7.941,25.6,15.443,18.098,23.057,25.791,21.19,27.638,29.606,29.939,27.393,21.5z" + SVGIcons["excel"] = "m 1.1015873,1.0754623 29.1013657,0 0,28.8740127 -29.1013657,0 z m 16.0853247,3.423355 c -4.528716,0.72951 -7.9678467,1.341398 -12.7886857,2.174829 l 0,17.4608507 12.6750087,2.15564 z M 11.915883,19.049367 10.825402,16.421886 c -0.293425,0.853816 -1.0375117,2.472607 -1.0477737,2.496381 l -1.400699,-0.114834 1.6308287,-3.471425 -1.6078387,-3.798243 1.440576,-0.139368 c 0.2185757,0.593963 0.9467607,2.372657 1.0220807,2.462394 0.07532,0.08974 0.983345,-1.91055 1.272699,-2.656773 l 1.659009,-0.241979 -2.024148,4.295881 c 0.600002,1.309347 1.291587,2.586904 1.835944,3.918055 z m 15.217785,-11.9490127 -9.207854,-0.123092 0,1.373542 3.182962,0 0,2.0461887 -3.159155,0.03484 0,0.909418 3.159155,-0.03484 0,2.04619 -3.133027,0 c -0.0046,0.330941 -0.01704,0.708518 0,0.909418 l 3.133027,0 0,2.04619 -3.124318,0 0,0.909418 3.124318,0 0,2.04619 -3.150446,0 0,0.909417 3.150446,0 0,2.04619 -3.182962,0 0,1.600896 9.207854,-0.123092 z m -5.115475,13.0728797 3.637671,0 0,2.04619 -3.637671,0 z m 0,-2.955607 3.637671,0 0,2.04619 -3.637671,0 z m 0,-2.955608 3.637671,0 0,2.04619 -3.637671,0 z m 0,-2.955608 3.637671,0 0,2.04619 -3.637671,0 z m 0,-2.9556067 3.637671,0 0,2.0461887 -3.637671,0 z" + SVGIcons["order_read"] = "m 8.9643183,21.695662 -6.9341204,0 0,7.122455 6.9341204,0 z m 9.5186557,0 -6.934121,0 0,7.122455 6.934121,0 z m 9.518657,0 -6.934121,0 0,7.122455 6.934121,0 z m -9.833844,-17.6118863 0,3.8849741 -6.303746,0 0,-3.8849741 z m 1.891123,-1.9424879 -10.0859922,0 0,7.7699506 10.0859922,0 z M 21,16 15.268062,11.385612 9,16 l 4,0 0,4 4,0 0,-4 z" + SVGIcons["barcodescanner"] = "M 10.638037,3.5437921 C 7.5301775,3.5477421 5.1899297,3.8687339 4.1731936,4.4305109 l -0.1796875,0.099609 0.033203,0.6035156 c 0.071603,1.3070943 0.3343567,2.3042653 0.9042968,3.4238281 0.5699981,1.1196765 1.4142675,2.105607 2.3359375,2.724609 l 0.21875,0.146485 1.5585938,0 1.5585936,0 0.326172,0.238281 c 0.464688,0.338805 1.118963,1.025822 1.34375,1.410156 0.105294,0.180035 0.216817,0.455198 0.248046,0.613281 0.138862,0.702968 0.273396,0.934118 0.654297,1.115234 0.232196,0.110443 0.798909,0.110039 0.966797,0 0.105622,-0.06921 0.143842,-0.03767 0.75586,0.607422 0.353958,0.373083 0.703832,0.776822 0.779296,0.896485 0.208927,0.331285 0.331668,0.874796 0.419922,1.867187 0.116889,1.314394 0.284562,1.919519 0.6875,2.472656 0.07224,0.09916 0.440319,0.493177 0.816406,0.876953 0.389653,0.397619 0.716675,0.780861 0.761719,0.888672 0.176094,0.421452 0.07805,0.931783 -0.279297,1.451172 -0.349,0.507255 -0.473848,1.067404 -0.40625,1.81836 0.084,0.933132 0.525002,1.460211 1.291016,1.548828 0.542716,0.06278 1.048645,-0.07697 2.003906,-0.5625 1.263383,-0.642144 2.589584,-1.709123 2.720703,-2.185547 0.115937,-0.421276 0.06721,-1.503786 -0.125,-2.824219 -0.642403,-4.413083 -0.922252,-5.491573 -1.886718,-7.271484 -0.96065,-1.772864 -0.97085,-1.797394 -0.970703,-2.150391 1.51e-4,-0.373794 0.195405,-1.157469 0.380859,-1.523437 0.09432,-0.186126 0.22003,-0.318532 0.478515,-0.501953 1.120154,-0.7948383 1.716057,-1.7327299 1.720704,-2.7050781 0.0022,-0.4851071 -0.245779,-0.8651372 -0.871094,-1.3261719 -1.720123,-1.2682223 -5.409728,-2.2763754 -9.462891,-2.5859375 -0.396661,-0.030293 -1.44004,-0.05389 -2.318359,-0.052734 z m -0.09961,0.8496094 c 1.225501,-0.00529 2.450382,0.017915 2.958985,0.072266 4.188561,0.4475892 7.630448,1.4980344 8.777344,2.6796875 0.197242,0.2032173 0.201193,0.2119369 0.173828,0.5136719 -0.112317,1.2386522 -1.735243,2.4501995 -3.740235,2.7929685 -0.552561,0.09447 -0.873403,0.09961 -5.826172,0.09961 l -5.2421865,0 -0.3535156,-0.294922 C 6.2540109,9.3895458 5.4706943,8.1241997 5.1048343,6.7312921 4.9488327,6.1373634 4.8084913,5.2009043 4.8567874,5.0750421 4.9176221,4.9165074 6.1358771,4.6553905 7.5716311,4.4910577 c 0.513547,-0.058778 1.741295,-0.092345 2.9667959,-0.097656 z m 2.576172,7.0351565 2.378907,0 2.380859,0 -0.224609,0.222656 c -0.341509,0.341509 -0.454474,0.697733 -0.449219,1.404296 0.0106,1.429013 0.378403,2.724018 1.240234,4.375 0.694195,1.32985 2.183398,3.977487 2.517578,4.476563 0.3631,0.542265 0.744997,0.990298 1,1.171875 0.165994,0.118199 0.439056,0.135497 0.748047,0.04687 l 0.166016,-0.04883 0,0.613281 c 0,0.604853 -0.0027,0.614621 -0.152344,0.785156 -0.453011,0.51595 -1.972904,1.461618 -2.925781,1.820313 -0.441214,0.166081 -0.828881,0.166639 -1.029297,-0.002 -0.192949,-0.162356 -0.269819,-0.430803 -0.269531,-0.935547 2.8e-4,-0.52781 0.04718,-0.686419 0.357422,-1.177735 0.304584,-0.482348 0.418434,-0.836027 0.419922,-1.30664 0.0011,-0.379702 -0.102015,-0.741769 -0.300782,-1.056641 -0.07135,-0.113023 -0.414387,-0.497028 -0.763672,-0.853516 C 17.495724,20.236398 17.4194,20.148657 17.263037,19.840667 17.097968,19.51554 17.009693,19.06196 16.92124,18.096526 16.76209,16.359462 16.625723,16.030927 15.581396,14.926604 14.568627,13.85564 14.5412,13.823214 14.419287,13.354339 14.255674,12.725095 13.930501,12.196745 13.376318,11.672698 l -0.261719,-0.24414 z m -9.1367179,6.955077 0,4.431641 0,4.429687 0.4003906,0 0.4003907,0 0,-4.429687 0,-4.431641 -0.4003907,0 -0.4003906,0 z m 1.2265625,0 0,4.431641 0,4.429687 0.1875,0 0.1875,0 0,-4.429687 0,-4.431641 -0.1875,0 -0.1875,0 z m 0.8007813,0 0,4.431641 0,4.429687 0.9882812,0 0.9902344,0 0,-4.429687 0,-4.431641 -0.9902344,0 -0.9882812,0 z m 2.4023437,0 0,4.431641 0,4.429687 0.8007813,0 0.8007811,0 0,-4.429687 0,-4.431641 -0.8007811,0 -0.8007813,0 z m 2.0273434,0 0,4.431641 0,4.429687 0.400391,0 0.40039,0 0,-4.429687 0,-4.431641 -0.40039,0 -0.400391,0 z m 1.177734,0 0,4.431641 0,4.429687 0.210938,0 0.21289,0 0,-4.429687 0,-4.431641 -0.21289,0 -0.210938,0 z m 0.800781,0 0,4.431641 0,4.429687 0.800782,0 0.800781,0 0,-4.429687 0,-4.431641 -0.800781,0 -0.800782,0 z" + SVGIcons["leather"] = "M 14.050204,28.953458 C 13.3355,27.606945 12.011089,27.147471 10.867361,27.05813 8.5361678,27.205923 7.9600004,27.817646 6.542961,28.724555 L 3.0869069,24.88374 C 4.9705589,22.855924 6.53581,20.165164 6.7710699,17.709895 6.5342922,14.179461 5.3368386,11.37425 3.3460485,8.9573698 L 6.2846312,5.8100125 c 0.818771,0.6324049 2.9003052,1.3023618 4.4219528,0.9472896 2.025292,-1.0292149 1.610114,-2.1330545 1.93754,-3.851411 l 4.891826,0 c 0.140256,1.3049506 0.334673,2.5276313 1.545412,3.688806 2.222194,0.8910695 3.174296,0.2835914 4.757416,-0.8301509 l 2.830511,3.8082905 c -1.520087,2.3485013 -3.058407,5.2608733 -3.022306,7.7898813 0.305669,3.374029 1.851699,5.410406 3.508014,7.665514 l -3.087715,3.552905 c -1.325501,-0.737453 -2.177952,-1.868903 -4.424786,-1.601714 -1.362486,-0.08382 -2.480383,0.858732 -3.080204,1.984113 z" + SVGIcons["drum"] = "M 24.297387,3.9447261 7.9575798,4.0335348 c -0.6638766,0 -1.2802873,0.3723424 -1.814456,0.9693276 C 5.6089604,5.5998404 5.1354199,6.435398 4.7290282,7.4674707 3.9162476,9.5315976 3.3778145,12.386285 3.3392199,15.664086 c 0.1825983,2.782486 0.5797267,5.714594 1.5660507,8.058533 0.4578931,1.061727 0.9809749,1.938287 1.5403781,2.568001 0.5594059,0.629707 1.1694599,1.038022 1.8262506,1.038022 l 16.2940137,-0.02569 c 0.645592,0 1.230096,-0.409208 1.749229,-1.03316 0.519139,-0.62396 0.991382,-1.489229 1.400914,-2.538164 0.819063,-2.097866 1.3794,-4.930765 1.3794,-7.974583 0,-3.128305 -0.499621,-6.02643 -1.324586,-8.1737184 C 27.358389,6.5096708 26.866158,5.6221001 26.292248,4.9834085 25.718336,4.3447099 25.039991,3.9446935 24.299469,3.9446935 l -0.0019,0 z m 0.0019,0.7105137 c 0.485748,0 0.9754,0.2596813 1.464052,0.803495 0.488655,0.5438197 0.953578,1.3611881 1.344708,2.379259 0.782271,2.0361485 1.276712,4.8669572 1.276712,7.9190732 0,2.956124 -0.550963,5.718304 -1.330831,7.715767 -0.389933,0.998737 -0.838415,1.80638 -1.285035,2.343183 -0.446624,0.536803 -0.725849,0.776437 -1.203162,0.776437 -1.517083,0 -2.827784,-3.848569 -3.371486,-10.48429 0.215567,-6.620935 1.426187,-11.4529242 3.105042,-11.4529242 z m 0.67582,9.2700272 a 0.53381198,1.7270387 0 0 0 -0.534271,1.727031 0.53381198,1.7270387 0 0 0 0.534271,1.727024 0.53381198,1.7270387 0 0 0 0.533586,-1.727024 0.53381198,1.7270387 0 0 0 -0.533586,-1.727031 z" + SVGIcons["drum2"] = "M 24.296875,3.9453125 7.9570312,4.0332031 c -0.6638766,0 -1.2802844,0.3717648 -1.8144531,0.96875 C 5.7554843,5.434567 5.4661037,5.917958 5.1451657,6.5851443 l 17.5275023,0 c 0.478931,-1.2710123 0.976437,-1.9308474 1.62616,-1.9308474 0.485748,0 0.976192,0.2608738 1.464844,0.8046875 0.488655,0.5438197 0.95262,1.3608353 1.34375,2.3789062 0.782271,2.0361485 1.277344,4.8678064 1.277344,7.9199214 0,2.956126 -0.550212,5.717381 -1.330078,7.714844 -0.389933,0.998737 -0.838537,1.806947 -1.285157,2.34375 -0.446624,0.536803 -0.725812,0.775391 -1.203125,0.775391 -0.682654,0 -1.523791,-1.326865 -2.071987,-2.78962 l -17.5262271,0.02232 c 0.3855037,0.785192 1.030912,1.964226 1.4771206,2.466518 0.5594059,0.629707 1.1693812,1.037109 1.8261719,1.037109 l 16.2949216,-0.02539 c 0.645592,0 1.228914,-0.409251 1.748047,-1.033203 0.519139,-0.62396 0.992812,-1.488174 1.402344,-2.537109 0.819063,-2.097866 1.378906,-4.930788 1.378906,-7.97461 0,-3.128302 -0.499254,-6.0265392 -1.324219,-8.1738276 C 27.359003,6.5103266 26.866879,5.6230666 26.292969,4.984375 25.719057,4.3456764 25.03935,3.9453125 24.298828,3.9453125 Z M 22.57179,6.8299195 5.0019531,6.859375 c 0,0 -0.1637022,0.3287381 -0.2734375,0.6074219 C 4.2368159,8.7155111 3.9359501,9.884657 3.6953125,11.630859 L 21.537109,11.65625 C 21.742517,9.7065323 22.121726,8.0677803 22.57179,6.8299195 Z M 3.6230469,12.03125 c -0.1566397,1.138593 -0.2679834,2.340211 -0.2832031,3.632812 0.037724,0.57486 0.1377527,1.558939 0.1969866,2.140068 L 21.301898,17.75949 c -0.04444,-0.429328 -0.07118,-1.19607 -0.108539,-1.652065 0.04967,-1.525628 0.148131,-2.850858 0.275391,-4.076172 z m 21.3515621,1.894531 c -0.294521,0.0011 -0.533122,0.7737 -0.533203,1.726563 8.1e-5,0.952862 0.238682,1.725475 0.533203,1.726562 0.294521,-0.0011 0.533122,-0.7737 0.533203,-1.726562 -8.1e-5,-0.952863 -0.238682,-1.725476 -0.533203,-1.726563 z M 3.6132812,18.402344 c 0.2246978,1.741242 0.5791478,3.441012 1.1523438,4.935547 l 17.599609,0 c -0.376567,-1.29497 -0.698028,-2.950438 -0.939453,-4.935547 z" + SVGIcons["help"] = "m 15.603663,28.164863 c -1.577387,0 -2.856728,-1.279341 -2.856728,-2.857299 0,-1.57713 1.279341,-2.856092 2.856728,-2.856092 1.577765,0 2.856663,1.278898 2.856663,2.856092 0,1.577958 -1.278898,2.857299 -2.856663,2.857299 z m 2.245985,-8.443935 0,0.513868 c 0,0 -4.28306,0 -4.709127,0 l 0,-0.513868 c 0,-1.454181 0.212145,-3.319586 1.900425,-4.941382 1.688342,-1.621984 3.798183,-2.961847 3.798183,-4.9880106 0,-2.2400216 -1.554481,-3.424837 -3.514541,-3.424837 -3.266109,0 -3.47946,3.3872804 -3.559965,4.1330876 l -4.5802798,0 C 7.3063389,6.9677341 8.7992857,2.0273662 15.351931,2.0273662 c 5.678753,0 8.23179,3.8031965 8.23179,7.3696326 0,5.6766602 -5.734073,6.6627152 -5.734073,10.3239292 z" + SVGIcons["disk"] = "m 18.933211,7.3245112 2.997,0 0,4.9999998 -2.997,0 0,-4.9999998 z m 8.997,1 0,19.9999978 -24,0 0,-23.9999978 20,0 4,4 z m -19,4.9999998 14,0 0,-6.9999998 -14,0 0,6.9999998 z m 16,4 -18,0 0,8.999998 18,0 0,-8.999998 z" + SVGIcons["disk2"] = "m 18.934211,7.3245101 2.996,0 0,4.9999999 -2.996,0 0,-4.9999999 z m 8.996,1 0,19.9999999 -24,0 0,-23.9999999 20,0 4,4 z m -19,4.9999999 14,0 0,-6.9999999 -14,0 0,6.9999999 z m 16,4 -18,0 0,9 18,0 0,-9 z m -2,2 -14,0 0,1 14,0 0,-1 z m 0,2 -14,0 0,1 14,0 0,-1 z m 0,2 -14,0 0,1 14,0 0,-1 z" + SVGIcons["disk3"] = "m 16.930211,7.3245101 2.996,0 0,4.9999999 -2.996,0 0,-4.9999999 z m 11,1 0,19.9999999 -24,0 0,-23.9999999 20,0 4,4 z m -17,4.9999999 10,0 0,-6.9999999 -10,0 0,6.9999999 z m 15,-4.1709999 -2.828,-2.829 -0.172,0 0,8.9999999 -14,0 0,-8.9999999 -3,0 0,19.9999999 20,0 0,-17.1709999 z" + SVGIcons["disk4"] = "m 16.930211,7.3245101 2.996,0 0,4.9999999 -2.996,0 0,-4.9999999 z m 11,1 0,19.9999999 -24,0 0,-23.9999999 20,0 4,4 z m -17,4.9999999 10,0 0,-6.9999999 -10,0 0,6.9999999 z m 15,-4.1709999 -2.828,-2.829 -0.172,0 0,8.9999999 -14,0 0,-8.9999999 -3,0 0,19.9999999 20,0 0,-17.1709999 z m -3,10.1709999 -14,0 0,1 14,0 0,-1 z m 0,2 -14,0 0,1 14,0 0,-1 z m 0,2 -14,0 0,1 14,0 0,-1 z" + + SVGIcons["flask"] = "m 10.243881,2.9246691 c 0,-0.72767 0.589855,-1.317526 1.317524,-1.317526 l 8.069851,0 c 0.727671,0 1.317527,0.589856 1.317527,1.317526 0,0.7276698 -0.589856,1.317526 -1.317527,1.317526 l -8.069851,0 c -0.727669,0 -1.317524,-0.5898562 -1.317524,-1.317526 z M 23.103465,28.748181 c 2.033339,0 3.371282,-2.128068 2.490255,-3.960549 L 21.321837,15.903224 C 20.133169,13.431019 19.51597,10.723041 19.51597,7.9799508 l 0,-1.7614664 -2.620227,0 c 0,1.8666054 -0.315217,5.9045606 2.051389,10.8266406 2.374046,4.937428 3.266214,6.829132 3.74566,7.825116 0.533925,1.10929 -0.989264,1.691309 -1.504681,0.613374 l -4.669376,-9.800813 -3.674978,0 c 1.671742,-4.199483 1.449412,-7.5948802 1.449412,-9.4642515 l -2.616476,0 0,1.7614663 c 0,2.7430902 -0.617194,5.4510022 -1.8058688,7.9231412 L 5.59901,24.787697 c -0.8811604,1.832416 0.457052,3.960484 2.490256,3.960484 l 15.014199,0 z" + SVGIcons["flask2"] = "m 11.018211,2.6807418 c 0,-0.6260568 0.508105,-1.1341608 1.134161,-1.1341608 l 6.804966,0 c 0.627191,0 1.134161,0.508104 1.134161,1.1341608 0,0.6260569 -0.50697,1.1341609 -1.134161,1.1341609 l -6.804966,0 c -0.626056,0 -1.134161,-0.508104 -1.134161,-1.1341609 z M 25.762303,25.992284 c 0,1.456263 -1.160247,2.774158 -2.749206,2.774158 l -14.917619,0 c -1.587825,0 -2.748072,-1.317895 -2.748072,-2.773023 0,-0.396957 0.0862,-0.80412 0.274467,-1.198808 l 4.245164,-8.909968 c 1.179528,-2.479276 2.285335,-5.195591 2.285335,-7.9470657 l 0,-1.8543528 2.268322,0 -0.0068,2.2683216 c -0.09868,2.9749039 -1.23624,5.7751469 -2.237704,7.9391259 l 4.17598,0 4.964222,10.207448 1.696705,0 c 0.350456,0 0.589764,-0.387883 0.427579,-0.730399 l -4.245165,-8.9077 C 18.009179,14.36827 16.79109,11.426256 16.689016,8.3515461 l 0,-2.2683216 2.268322,0 0,1.8543528 c 0,2.7514747 1.105806,5.4666557 2.286468,7.9459307 l 4.245164,8.909968 c 0.187137,0.394688 0.273333,0.801852 0.273333,1.198808 z M 12.152372,24.796879 c 0,-0.940219 -0.761022,-1.701241 -1.701241,-1.701241 -0.94022,0 -1.701242,0.761022 -1.701242,1.701241 0,0.940219 0.761022,1.701241 1.701242,1.701241 0.940219,0 1.701241,-0.761022 1.701241,-1.701241 z m 2.268322,-3.969563 c 0,-0.627191 -0.508104,-1.134161 -1.134161,-1.134161 -0.627191,0 -1.134161,0.50697 -1.134161,1.134161 0,0.627191 0.50697,1.134161 1.134161,1.134161 0.626057,0 1.134161,-0.50697 1.134161,-1.134161 z m 3.402483,3.402482 c 0,-0.626056 -0.508104,-1.13416 -1.134161,-1.13416 -0.626057,0 -1.134161,0.508104 -1.134161,1.13416 0,0.626057 0.508104,1.134161 1.134161,1.134161 0.626057,0 1.134161,-0.508104 1.134161,-1.134161 z" + SVGIcons["flask3"] = "m 20.077615,2.7412457 c 0,0.6246047 -0.505794,1.1315303 -1.131531,1.1315303 l -6.789181,0 c -0.625736,0 -1.131534,-0.5069256 -1.131534,-1.1315303 0,-0.6246047 0.505798,-1.1315303 1.131534,-1.1315303 l 6.789181,0 c 0.625737,0 1.131531,0.5069256 1.131531,1.1315303 z M 25.462567,24.803823 21.22725,15.914522 C 20.049326,13.440997 18.946084,10.730981 18.946084,7.985889 l 0,-1.8500525 -2.26306,0 0,2.263061 c 0.101838,3.0675785 1.317101,6.0027685 2.500682,8.4887395 l 4.235317,8.887039 c 0.161809,0.341723 -0.07695,0.728706 -0.426587,0.728706 l -14.883028,0 c -0.339459,0 -0.590659,-0.383588 -0.425455,-0.726443 l 4.234197,-8.890433 c 1.184712,-2.48484 2.393186,-5.421161 2.495024,-8.4876085 l 0.0068,-2.263061 -2.26306,0 0,1.8500525 c 0,2.745092 -1.103245,5.453976 -2.281177,7.927501 L 5.64042,24.802692 c -0.186703,0.393773 -0.272699,0.801123 -0.272699,1.197159 0,1.451754 1.157555,2.766592 2.741698,2.766592 l 14.883028,0 c 1.584143,0 2.74283,-1.314838 2.74283,-2.767724 0,-0.396035 -0.086,-0.802254 -0.272699,-1.194896 z M 14.419963,23.674556 c 0,-0.938038 -0.760388,-1.697295 -1.697295,-1.697295 -0.936907,0 -1.697299,0.759257 -1.697299,1.697295 0,0.938039 0.760392,1.697296 1.697299,1.697296 0.936907,0 1.697295,-0.759257 1.697295,-1.697296 z m 2.263061,-3.960355 c 0,-0.625737 -0.506926,-1.131531 -1.131531,-1.131531 -0.625735,0 -1.13153,0.505794 -1.13153,1.131531 0,0.625735 0.505795,1.131529 1.13153,1.131529 0.624605,0 1.131531,-0.505794 1.131531,-1.131529 z m 3.394591,3.394591 c 0,-0.624606 -0.506926,-1.131531 -1.131531,-1.131531 -0.625736,0 -1.13153,0.506925 -1.13153,1.131531 0,0.624604 0.505794,1.131529 1.13153,1.131529 0.624605,0 1.131531,-0.506925 1.131531,-1.131529 z" + SVGIcons["flask4"] = "m 20.1118,2.6807417 c 0,0.6260569 -0.508105,1.1341609 -1.134161,1.1341609 l -6.804966,0 c -0.626056,0 -1.134161,-0.508104 -1.134161,-1.1341609 0,-0.6260568 0.508105,-1.1341608 1.134161,-1.1341608 l 6.804966,0 c 0.626056,0 1.134161,0.508104 1.134161,1.1341608 z M 25.509271,24.794611 21.264107,15.884643 C 20.083445,13.405367 18.977639,10.689052 18.977639,7.9375773 l 0,-1.8543529 -2.268322,0 0,2.2683217 c 0.102074,3.0747099 1.320163,6.0167239 2.506495,8.5084749 l 4.245165,8.9077 c 0.162185,0.342516 -0.07712,0.730399 -0.426445,0.730399 l -14.918749,0 c -0.339114,0 -0.592032,-0.38448 -0.426445,-0.728131 L 11.9345,16.858887 c 1.186332,-2.490617 2.397616,-5.433765 2.49969,-8.5073409 l 0.0068,-2.2683217 -2.268322,0 0,1.8543529 c 0,2.7514747 -1.105807,5.4666557 -2.286467,7.9459317 l -4.245162,8.909967 c -0.187137,0.394688 -0.273333,0.802986 -0.273333,1.199943 0,1.455128 1.160247,2.773023 2.748072,2.773023 l 14.918749,0 c 1.587825,0 2.748072,-1.317895 2.748072,-2.774158 0,-0.396956 -0.0862,-0.80412 -0.273333,-1.197673 z" + SVGIcons["flask5"] = "m 7.047519,26.440246 -1.826808,0 c -1.576777,0 -2.72895,-1.314838 -2.72895,-2.766591 0,-0.396036 0.0856,-0.802255 0.271431,-1.196028 L 6.978817,14.719855 C 8.151263,12.24633 9.249374,9.536314 9.249374,6.791222 l 0,-0.718521 2.252533,0 -0.0068,1.13153 C 11.393785,10.270679 10.190929,13.207 9.011733,15.69184 l -4.214499,7.758904 c -0.165562,0.342853 0.0856,0.726441 0.423477,0.726441 l 2.12527,0 c -0.396447,1.05685 -0.371669,1.572827 -0.298462,2.263061 z m 2.201855,-22.630607 6.757609,0 c 0.622827,0 1.126269,-0.506925 1.126269,-1.13153 0,-0.624604 -0.503442,-1.13153 -1.126269,-1.13153 l -6.757609,0 c -0.622825,0 -1.126268,0.506926 -1.126268,1.13153 0,0.624605 0.503443,1.13153 1.126268,1.13153 z m 13.515223,1.131532 -6.757614,0 c -0.622827,0 -1.126269,0.506925 -1.126269,1.13153 0,0.624604 0.503442,1.13153 1.126269,1.13153 l 6.757614,0 c 0.622827,0 1.126269,-0.506926 1.126269,-1.13153 0,-0.624605 -0.503442,-1.13153 -1.126269,-1.13153 z m 6.757615,20.994412 c 0,1.452886 -1.152174,2.767724 -2.730077,2.767724 l -14.813817,0 c -1.576776,0 -2.728944,-1.314838 -2.728944,-2.766592 0,-0.396035 0.0856,-0.802255 0.271429,-1.196028 2.686148,-4.222871 6.48618,-9.198209 6.48618,-14.554873 l 0,-0.718522 2.252538,0 -0.0068,1.131531 c -0.117132,3.513401 -1.680393,6.794838 -2.749222,9.052241 l 5.255171,0 4.348525,6.789182 1.684898,0 c 0.348018,0 0.58566,-0.386984 0.424604,-0.728706 -2.749223,-4.319051 -6.509835,-9.215182 -6.70468,-15.112717 l 0,-1.131531 2.252538,0 0,0.718522 c 0,5.354401 3.777507,10.298057 6.486184,14.553742 0.185834,0.393773 0.271431,0.799992 0.271431,1.196027 z" + SVGIcons["flask6"] = "M 25.56987,24.757761 C 22.889022,20.564786 19.18826,16.793055 18.995954,11.596192 l -2.307682,0 c 0.19803,5.96609 4.020128,9.774451 6.8143,14.143707 0.16369,0.345695 -0.07784,0.737176 -0.431546,0.737176 l -1.44688,0 -5.41893,-8.012783 -4.029286,0 c 0.999309,-1.905897 2.117665,-3.907949 2.216107,-6.8681 l -2.300813,0 c -0.193452,5.200297 -3.915958,9.00179 -6.573912,13.161569 -0.188873,0.397205 -0.275869,0.809291 -0.275869,1.20993 0,1.468629 1.171011,2.798751 2.773568,2.798751 l 15.056015,0 c 1.602557,0 2.774713,-1.330122 2.774713,-2.799895 0,-0.40064 -0.087,-0.811581 -0.275869,-1.208786 z M 20.122322,7.0174591 c 0,1.2648751 -1.025636,2.2893667 -2.289367,2.2893667 -1.26373,0 -2.289366,-1.0244916 -2.289366,-2.2893667 0,-1.2648751 1.025636,-2.2893667 2.289366,-2.2893667 1.263731,0 2.289367,1.0244916 2.289367,2.2893667 z m -5.723417,-1.717025 c 0,0.9489425 -0.769227,1.717025 -1.717025,1.717025 -0.947797,0 -1.717024,-0.7680825 -1.717024,-1.717025 0,-0.9489425 0.769227,-1.717025 1.717024,-1.717025 0.947798,0 1.717025,0.7680825 1.717025,1.717025 z m 0,4.0063917 c 0,0.6318652 -0.511673,1.1446832 -1.144683,1.1446832 -0.63301,0 -1.144683,-0.512818 -1.144683,-1.1446832 0,-0.6318652 0.511673,-1.1446833 1.144683,-1.1446833 0.63301,0 1.144683,0.5128181 1.144683,1.1446833 z m 3.43405,-6.8681 c 0,0.6318652 -0.511673,1.1446833 -1.144683,1.1446833 -0.63301,0 -1.144683,-0.5128181 -1.144683,-1.1446833 0,-0.6318652 0.511673,-1.1446833 1.144683,-1.1446833 0.63301,0 1.144683,0.5128181 1.144683,1.1446833 z" + SVGIcons["flask7"] = "m 15.136407,10.619868 -1.367798,0 c -0.0079,-1.2804678 -0.119087,-2.3828722 -0.913,-3.687157 l 1.168186,-0.7099847 c 0.976513,1.6082399 1.103539,2.9612938 1.112612,4.3971417 z m 2.205943,0 -1.363262,0 c 0.01134,-1.500495 0.141771,-2.80478 1.108076,-4.3971417 L 18.255349,6.932711 C 17.462571,8.23813 17.350289,9.3473393 17.34235,10.619868 Z M 11.133952,8.4343398 C 9.623241,7.2015071 9.5665335,5.5875962 10.497683,4.4466303 c 0.547804,-0.6725574 1.288413,-1.0116715 2.186668,-0.9980615 0.5943,-1.2430404 1.737535,-1.9019878 2.871695,-1.9019878 1.170454,0 2.286469,0.6963747 2.862623,1.9019878 0.900523,-0.01361 1.634325,0.3221017 2.186662,0.9980615 0.923207,1.1318926 0.900523,2.7401327 -0.682765,4.0251368 L 18.966468,7.7992097 c 0.440055,-0.5296529 0.860828,-1.0037322 0.860828,-1.5832884 0,-0.9753783 -1.164783,-1.8464139 -2.348847,-1.2010763 -0.0034,-1.2169547 -0.939085,-2.0346847 -1.874768,-2.0607704 -0.982183,-0.026086 -1.972306,0.8063884 -1.975708,2.0607704 -1.233967,-0.6714233 -2.35225,0.2744669 -2.35225,1.2010763 0,0.5727513 0.411701,1.0400256 0.84495,1.5628735 l -0.986721,0.655545 z M 25.486759,24.794611 C 22.830554,20.640179 19.163812,16.903119 18.973273,11.754029 l -2.286468,0 c 0.19621,5.911246 3.983173,9.6846 6.75166,14.013692 0.162185,0.342516 -0.07712,0.730399 -0.427579,0.730399 l -1.433579,0 -5.369118,-7.939126 -3.992246,0 c 0.990122,-1.888378 2.098197,-3.872025 2.195735,-6.804965 l -2.279663,0 c -0.191673,5.152493 -3.879975,8.919041 -6.513496,13.040582 -0.1871365,0.393553 -0.273333,0.801851 -0.273333,1.198808 0,1.455128 1.160247,2.773023 2.7480725,2.773023 l 14.9176275,0 c 1.587825,0 2.749206,-1.317895 2.749206,-2.774158 0,-0.396956 -0.0862,-0.80412 -0.273333,-1.197673 z M 10.448914,26.49812 c -0.939089,0 -1.701245,-0.761022 -1.701245,-1.701241 0,-0.940219 0.762156,-1.701241 1.701245,-1.701241 0.939091,0 1.701247,0.761022 1.701247,1.701241 0,0.940219 -0.762156,1.701241 -1.701247,1.701241 z m 3.969569,-3.402482 c -0.626057,0 -1.134161,-0.508105 -1.134161,-1.134161 0,-0.626057 0.508104,-1.134161 1.134161,-1.134161 0.626057,0 1.134161,0.508104 1.134161,1.134161 0,0.626056 -0.508104,1.134161 -1.134161,1.134161 z m 2.268322,3.402482 c -0.626057,0 -1.134161,-0.508104 -1.134161,-1.134161 0,-0.626056 0.508104,-1.134161 1.134161,-1.134161 0.626057,0 1.134161,0.508105 1.134161,1.134161 0,0.626057 -0.508104,1.134161 -1.134161,1.134161 z" + SVGIcons["flask8"] = "M 25.519262,24.776186 C 22.850735,20.602483 19.166984,16.848087 18.975561,11.675111 l -2.297075,0 c 0.19712,5.938667 4.001651,9.729525 6.782979,14.078699 0.162938,0.344106 -0.07748,0.733788 -0.429561,0.733788 l -1.44023,0 -5.394024,-7.975955 -4.010766,0 c 0.994715,-1.897138 2.107931,-3.889987 2.205921,-6.836532 l -2.290238,0 c -0.192563,5.176394 -3.8979565,8.960415 -6.5436955,13.101075 -0.188004,0.39538 -0.2746,0.805571 -0.2746,1.204369 0,1.461879 1.165629,2.785887 2.76082,2.785887 l 14.9868125,0 c 1.595191,0 2.761959,-1.324008 2.761959,-2.787026 0,-0.398798 -0.0866,-0.80785 -0.274601,-1.20323 z m -15.107598,1.711412 c -0.9434365,0 -1.7091255,-0.764552 -1.7091255,-1.709133 0,-0.944581 0.765689,-1.709134 1.7091255,-1.709134 0.943442,0 1.709133,0.764553 1.709133,1.709134 0,0.944581 -0.765691,1.709133 -1.709133,1.709133 z m 3.987977,-3.418267 c -0.62896,0 -1.139421,-0.510461 -1.139421,-1.139421 0,-0.628961 0.510461,-1.139423 1.139421,-1.139423 0.628962,0 1.139423,0.510462 1.139423,1.139423 0,0.62896 -0.510461,1.139421 -1.139423,1.139421 z m 2.278845,3.418267 c -0.628961,0 -1.139422,-0.510461 -1.139422,-1.139423 0,-0.62896 0.510461,-1.139421 1.139422,-1.139421 0.628961,0 1.139422,0.510461 1.139422,1.139421 0,0.628962 -0.510461,1.139423 -1.139422,1.139423 z m 2.519262,-18.9941666 1.610004,3.0422566 -4.365127,0 0.680236,-1.3559116 1.357051,0 -0.893306,-1.686345 0.893306,-1.6874839 -1.919926,0 -1.020922,-1.6920418 -1.016364,1.7034361 -1.918788,0 0.895586,1.6760896 -0.895586,1.6760897 1.335403,0 0.680235,1.3467969 -4.349174,0 1.614561,-3.0228866 -1.614561,-3.0228866 3.443333,0 1.819658,-3.050233 1.829911,3.0308628 3.443334,0 -1.608864,3.0422568 z" + SVGIcons["flask9"] = "M 19.303508,7.1675212 C 18.66784,6.5318534 19.12905,5.4560308 20.012368,5.4560308 c 0.256673,0 0.513346,0.098258 0.708859,0.2937707 l 4.254162,4.2531575 c 0.392029,0.392029 0.392029,1.025692 0,1.41772 -0.392028,0.392029 -1.025691,0.392029 -1.41772,0 L 19.303508,7.1675212 Z m -1.815764,9.3174448 -11.4500413,0 -0.4461706,-0.44617 C 5.3789744,15.825235 5.4621928,15.428194 5.7800267,15.315899 11.96726,13.955329 15.179688,14.051582 19.388731,9.8876574 L 17.971012,8.4699381 C 14.177057,12.273918 10.72099,12.191702 5.1102694,13.426943 c -1.0317069,0.366963 -1.6423089,1.320464 -1.6423089,2.328108 0,0.606592 0.2245893,1.220202 0.7068546,1.701464 l 9.3254669,9.325468 c 0.481263,0.481262 1.09387,0.73192 1.700461,0.73192 1.002631,0 1.960143,-0.630655 2.329111,-1.668377 1.238249,-5.631776 0.886326,-9.312433 4.695319,-13.120424 l -1.417719,-1.41772 c -1.736557,1.736556 -2.696074,3.406939 -3.31971,5.177584 z m 10.043351,1.520991 c 0,1.366585 -1.10891,2.489532 -2.476498,2.489532 -2.998868,0 -4.07068,-4.231101 0.914399,-8.021045 -0.05815,2.371221 1.562099,3.310686 1.562099,5.531513 z m -2.377238,-3.475118 c -0.34691,0.189497 -0.858251,0.699836 -0.936457,1.336507 -0.115302,0.952499 0.869281,1.233236 0.955507,-0.04412 0.04011,-0.538412 0,-0.796089 -0.01905,-1.292391 z" + SVGIcons["filter"] = "M26.834,6.958c0-2.094-4.852-3.791-10.834-3.791c-5.983,0-10.833,1.697-10.833,3.791c0,0.429,0.213,0.84,0.588,1.224l8.662,15.002v4.899c0,0.414,0.709,0.75,1.583,0.75c0.875,0,1.584-0.336,1.584-0.75v-4.816l8.715-15.093h-0.045C26.625,7.792,26.834,7.384,26.834,6.958zM16,9.75c-6.363,0-9.833-1.845-9.833-2.792S9.637,4.167,16,4.167c6.363,0,9.834,1.844,9.834,2.791S22.363,9.75,16,9.75z" + SVGIcons["search"] = "M29.772,26.433l-7.126-7.126c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127L29.772,26.433zM7.203,13.885c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486c-0.007,3.58-2.905,6.476-6.484,6.484C10.106,20.361,7.209,17.465,7.203,13.885z" + + SVGIcons["reset_sett"] = "m 6.27412,13.646205 c -0.297,0.947 -0.458,1.955 -0.458,3 0,5.52 4.481,10 10,10 5.52,0 10,-4.48 10,-10 0,-5.519 -4.48,-10 -10,-10 -2.121,0 -4.083,0.668 -5.703,1.7960001 l 1.703,2.2039999 -6.58,0 1.935,-6.012 1.718,2.223 c 1.958,-1.389 4.346,-2.211 6.927,-2.211 6.623,0 12,5.377 12,12 0,6.623 -5.377,11.988 -12,11.988 -6.623,0 -12,-5.365 -12,-11.988 0,-1.036 0.132,-2.041 0.379,-3 l 2.079,0 z m 10.35,-3.012 c 0.292,0.821 0.375,1.346 1.01,1.609 0.637,0.264 1.073,-0.052 1.854,-0.423 l 1.142,1.142 c -0.373,0.787 -0.687,1.218 -0.423,1.854 0.262,0.634 0.784,0.716 1.609,1.009 l 0,1.617 c -0.816,0.29 -1.347,0.375 -1.61,1.01 -0.264,0.636 0.052,1.071 0.424,1.853 l -1.142,1.142 c -0.79,-0.375 -1.219,-0.687 -1.85,-0.424 -0.639,0.265 -0.723,0.793 -1.014,1.611 l -1.616,0 c -0.292,-0.821 -0.375,-1.347 -1.01,-1.61 -0.637,-0.264 -1.072,0.052 -1.854,0.423 l -1.142,-1.142 c 0.366,-0.771 0.689,-1.212 0.423,-1.854 -0.263,-0.635 -0.793,-0.719 -1.609,-1.009 l 0,-1.617 c 0.817,-0.29 1.346,-0.373 1.609,-1.009 0.264,-0.637 -0.051,-1.07 -0.423,-1.854 l 1.142,-1.142 c 0.788,0.374 1.218,0.687 1.854,0.423 0.635,-0.263 0.719,-0.792 1.01,-1.609 l 1.616,0 z m -0.808,8 c -1.105,0 -2,-0.896 -2,-2 0,-1.105 0.895,-2.001 2,-2.001 1.104,0 2,0.896 2,2.001 0,1.104 -0.896,2 -2,2 z" + SVGIcons["reset_time"] = "m 27.81612,16.634205 c 0,6.627 -5.373,12 -12,12 -6.627,0 -12,-5.373 -12,-12 l 2,0 c 0,5.514 4.486,10 10,10 5.514,0 10,-4.486 10,-10 0,-5.514 -4.486,-9.9999997 -10,-9.9999997 -2.777,0 -5.287,1.141 -7.099,2.9769995 l 2.061,2.0610002 -6.962,1.354 1.305,-7.0129997 2.179,2.18 c 2.172,-2.196 5.182,-3.559 8.516,-3.559 6.627,0 12,5.3729997 12,11.9999997 z m -13,-6 0,8 7,0 0,-2 -5,0 0,-6 -2,0 z" + + SVGIcons["sheep1"] = "m 13.405424,28.670839 c -1.35431,-0.2139 -2.5818,-1.02856 -3.23644,-2.14793 l -0.2111799,-0.36111 -0.35207,0.11442 c -0.2417,0.0786 -0.56906,0.12302 -1.0442497,0.14188 -0.89836,0.0356 -1.38029,-0.065 -2.17993,-0.45525 -0.52619,-0.2568 -0.66221,-0.35625 -1.14441,-0.83667 -0.48783,-0.48603 -0.57843,-0.60993 -0.83437,-1.14101 -0.15793,-0.32767 -0.32941,-0.78772 -0.38107,-1.02232 -0.11931,-0.54179 -0.12194,-1.39533 -0.006,-1.89299 l 0.09,-0.38586 -0.31656,-0.38194 c -0.39958,-0.48208 -0.72403,-1.14599 -0.88149,-1.80378 -0.22656,-0.94642 -0.0861,-2.13735 0.35415,-3.00324 0.36577,-0.71937 1.11713,-1.51507 1.74827,-1.85147 0.19117,-0.10189 0.34758,-0.20622 0.34758,-0.23185 0,-0.0256 -0.0382,-0.1381 -0.085,-0.24995 -0.0937,-0.22425 -0.0627,-0.21384 -0.96719,-0.32446 -0.70168,-0.0858 -1.22283,-0.19635 -1.77724,-0.377 -0.87122,-0.28386 -1.03134,-0.58917 -0.46941,-0.89502 0.38033,-0.20699 1.38292,-0.45531 2.33474,-0.5782501 l 0.77056,-0.0995 0.21005,-0.43405 c 0.11553,-0.23873 0.34377,-0.58407 0.50718,-0.76742 l 0.29714,-0.33338 0.006,-0.74486 c 0.007,-0.83388 0.0942,-1.17925 0.44823,-1.78115 0.54783,-0.93127 1.67483,-1.60832 2.6771697,-1.60832 h 0.36383 l 0.17034,-0.35546 c 0.7568499,-1.57946 2.6708999,-2.32521 4.2426699,-1.65303 0.42468,0.18163 0.48659,0.18146 0.91718,-0.003 0.19138,-0.0818 0.54328,-0.17771 0.78201,-0.21321 0.53906,-0.0802 1.14738,-0.002 1.65013,0.21321 0.43302,0.185 0.49097,0.18468 0.9363,-0.005 1.10029,-0.46916 2.3861,-0.25673 3.37001,0.55678 0.3017,0.24945 0.44119,0.32396 0.71092,0.37975 1.39422,0.28834 2.43168,1.35874 2.67263,2.75744 0.0241,0.14 0.11449,0.3116 0.23498,0.44617 0.46181,0.51577 0.78854,1.18041 0.89702,1.82468 0.0263,0.15626 0.12303,0.31864 0.32182,0.5403 0.1563,0.17429 0.37823,0.51124 0.49317,0.74877 l 0.20897,0.43189 0.76778,0.0993 c 0.94973,0.1228601 1.95221,0.3713701 2.33197,0.5780501 0.56193,0.30585 0.40181,0.61116 -0.46941,0.89502 -0.55441,0.18065 -1.07556,0.29119 -1.77724,0.37701 -0.90453,0.11061 -0.8735,0.1002 -0.96719,0.32445 -0.0467,0.11185 -0.085,0.22433 -0.085,0.24995 0,0.0256 0.15641,0.12996 0.34758,0.23185 0.63114,0.3364 1.3825,1.13211 1.74827,1.85147 0.44028,0.86589 0.58071,2.05682 0.35415,3.00324 -0.15746,0.65779 -0.48191,1.3217 -0.88149,1.80378 l -0.31656,0.38194 0.09,0.38586 c 0.11611,0.49766 0.11348,1.3512 -0.006,1.893 -0.0517,0.23459 -0.22314,0.69464 -0.38107,1.02231 -0.25594,0.53108 -0.34654,0.65498 -0.83437,1.14101 -0.4822,0.48042 -0.61822,0.57987 -1.14441,0.83668 -0.79964,0.39024 -1.28157,0.49088 -2.17993,0.45524 -0.47519,-0.0189 -0.80255,-0.0633 -1.04425,-0.14188 l -0.35207,-0.11442 -0.21118,0.36111 c -0.56559,0.9671 -1.51078,1.68231 -2.66771,2.0186 -0.36371,0.10572 -0.59189,0.13229 -1.13747,0.13243 -0.76671,2.3e-4 -1.30628,-0.11949 -1.90805,-0.42327 l -0.33755,-0.17056 -0.33677,0.17 c -0.51219,0.25856 -1.09745,0.40205 -1.73911,0.42639 -0.31281,0.0119 -0.64551,0.009 -0.73936,-0.005 z m 1.43514,-2.41174 c 0.195,-0.0888 0.45378,-0.24113 0.57509,-0.33861 0.28493,-0.22898 0.65987,-0.34258 0.95125,-0.28822 0.24082,0.0449 0.67626,0.24936 0.73558,0.34534 0.0753,0.12188 0.7419,0.4107 1.04757,0.45391 0.64111,0.0906 1.32152,-0.13182 1.81491,-0.59332 0.30972,-0.2897 0.60384,-0.79333 0.66619,-1.1407 0.1015,-0.56546 0.46697,-0.96221 1.04936,-1.1392 0.31471,-0.0956 0.69907,-0.004 1.17505,0.27883 0.2349,0.13979 0.55572,0.28503 0.71294,0.32275 0.83347,0.19994 1.83768,-0.18035 2.3147,-0.87655 0.4459,-0.65079 0.52658,-1.48872 0.20894,-2.16999 -0.20494,-0.43955 -0.25007,-0.99113 -0.10436,-1.27536 0.0552,-0.10774 0.25586,-0.32528 0.44586,-0.48342 0.4756,-0.39588 0.74288,-0.77041 0.88593,-1.24139 0.31329,-1.03141 -0.19658,-2.16205 -1.18784,-2.63404 -0.42314,-0.20148 -1.03434,-0.24743 -1.55659,-0.11702 -0.20007,0.05 -0.47893,0.088 -0.61969,0.0845 -0.14077,-0.004 -0.42229,0.0351 -0.62561,0.0858 -0.20332,0.0507 -0.46172,0.10574 -0.57423,0.12236 -0.18039,0.0266 -0.21264,0.0572 -0.27295,0.25849 -0.0376,0.12555 -0.23493,0.56101 -0.43848,0.96768 -1.4411,2.87909 -3.94992,5.05824 -5.82352,5.05824 -1.85731,0 -4.35552,-2.15583 -5.79305,-4.99912 -0.18346,-0.36289 -0.4019,-0.84161 -0.4854099,-1.06383 l -0.15185,-0.40405 -0.4674,-0.0434 c -0.25707,-0.0239 -0.5313797,-0.0371 -0.6095797,-0.0293 -0.35107,0.0347 -0.62046,0.0193 -0.91892,-0.0526 -1.3439,-0.32376 -2.64538,0.60673 -2.75994,1.97323 -0.0641,0.76404 0.26028,1.44777 0.95758,2.01867 0.44616,0.36527 0.58302,0.63945 0.54426,1.09029 -0.0174,0.20233 -0.0948,0.48442 -0.18767,0.68434 -0.31699,0.68205 -0.23615,1.51964 0.20944,2.16999 0.47702,0.6962 1.48123,1.07649 2.3147,0.87655 0.1572197,-0.0377 0.4836997,-0.18633 0.7254997,-0.33023 0.33639,-0.20018 0.5115299,-0.2676 0.7456699,-0.28701 0.70883,-0.0588 1.33675,0.43583 1.46609,1.15486 0.10568,0.58748 0.66346,1.27249 1.25765,1.54451 0.60574,0.27733 1.18875,0.28294 1.77283,0.0171 z m -0.71043,-8.91963 c 0.30718,-0.1487 0.63694,-0.46738 0.80182,-0.77488 0.17553,-0.32734 0.17567,-1.15089 2.9e-4,-1.47871 -0.41365,-0.77308 -1.29187,-1.12047 -2.08369,-0.82422 -1.18227,0.44235 -1.48173,2.0059 -0.53875,2.81305 0.5058,0.43296 1.24948,0.54112 1.82036,0.26476 z m 5.46267,0.0493 c 0.66663,-0.24942 1.08511,-0.83814 1.0876,-1.53003 0.002,-0.51491 -0.10247,-0.77319 -0.46643,-1.15478 -0.50767,-0.53224 -1.13599,-0.68771 -1.79014,-0.44296 -0.34155,0.1278 -0.72842,0.47664 -0.91473,0.82485 -0.17803,0.33274 -0.17551,1.15431 0.005,1.47871 0.43895,0.79086 1.27862,1.12372 2.07915,0.82421 z m 3.59866,-4.17974 c 0.33395,-0.16063 0.48096,-0.19907 0.76138,-0.19907 0.19112,0 0.43983,-0.0386 0.55269,-0.0857 l 0.20518,-0.0857 -0.23222,-0.16823 c -0.33344,-0.24154 -0.45055,-0.7372 -0.274,-1.15974 0.073,-0.17464 0.29591,-0.3979 0.44791,-0.44857 0.0361,-0.012 -0.0434,-0.1204001 -0.17668,-0.2408101 -0.30281,-0.27356 -0.40583,-0.51547 -0.40902,-0.9604 -0.004,-0.53962 -0.10758,-0.7533 -0.56635,-1.16687 -0.47005,-0.42373 -0.56862,-0.62112 -0.56862,-1.13867 0,-0.47889 -0.15944,-0.81809 -0.49366,-1.05025 -0.2061,-0.14318 -0.30823,-0.17002 -0.76779,-0.20177 -0.29238,-0.0202 -0.59678,-0.074 -0.67885,-0.11999 -0.0818,-0.0459 -0.294,-0.25543 -0.47147,-0.46574 -0.26442,-0.31332 -0.3719,-0.39697 -0.59526,-0.4633 -0.41495,-0.12323 -0.89965,0.003 -1.17331,0.3056 -0.42751,0.4727 -1.27873,0.47259 -1.70607,-2.2e-4 -0.18244,-0.20186 -0.53735,-0.35436 -0.82466,-0.35436 -0.28731,0 -0.64222,0.1525 -0.82466,0.35436 -0.33789,0.37383 -1.01129,0.47618 -1.42301,0.21627 -0.1254,-0.0792 -0.2643,-0.18767 -0.30866,-0.24113 -0.23046,-0.27768 -0.8413,-0.40756 -1.22575,-0.26061 -0.20854,0.0797 -0.46472,0.31551 -0.57758,0.53163 -0.0469,0.0899 -0.094,0.37141 -0.10657,0.638 -0.0233,0.49298 -0.13461,0.81294 -0.34774,1.00002 -0.35274,0.30962 -0.80421,0.35544 -1.32836,0.13482 -0.7602699,-0.31999 -1.4360096,-0.0371 -1.6511496,0.69122 -0.0807,0.27324 -0.0449,0.53142 0.11517,0.83006 0.3839597,0.71637 0.20028,1.3708 -0.48528,1.72901 -0.17066,0.0892 -0.31018,0.1749201 -0.31006,0.1905601 1.1e-4,0.0156 0.0746,0.0708 0.1656,0.12251 0.33778,0.19217 0.47754,0.63931 0.34902,1.11661 -0.0485,0.18 -0.12545,0.2862 -0.29818,0.41132 l -0.23284,0.16867 0.20518,0.0857 c 0.11286,0.0472 0.34449,0.0857 0.51475,0.0857 0.17026,0 0.4717997,0.0508 0.6700897,0.11302 0.45578,0.14287 0.59445,0.14239 0.9841199,-0.003 0.39555,-0.148 0.8016,-0.46617 1.08144,-0.84737 0.41458,-0.56479 0.81557,-0.70213 1.50831,-0.51663 0.90241,0.24167 2.27737,0.0467 2.75766,-0.39107 0.43197,-0.3937101 0.92142,-0.3833601 1.76379,0.0373 0.76841,0.38371 1.1167,0.49179 1.59245,0.49412 0.33157,0.002 0.46875,-0.0298 0.82072,-0.18793 0.88271,-0.39659 1.53986,-0.12695 1.787,0.73323 0.10479,0.36477 0.35923,0.69646 0.65353,0.85192 0.32195,0.17009 0.6434,0.14598 1.12181,-0.0841 z" + SVGIcons["goat"] = "m 25.59315,0.5811 c -3.45756,1.11883 -6.81761,3.16115 -8.2234,6.36807 -0.37149,0.6011 -0.87255,3.18898 -1.66197,1.5909 -0.93564,-3.86612 -4.65859,-6.74709 -8.71538,-7.85984 1.91057,2.57567 3.88314,5.2564 4.52215,8.36445 -0.62435,1.42594 -2.52857,-0.30416 -3.74019,0.27419 -1.73184,0.14705 -3.37285,0.86244 -4.66927,1.90315 1.10968,2.13076 3.825,3.2564 6.33988,3.11714 1.31713,0.92209 -0.21767,2.63855 0.28447,3.90767 -0.007,2.07259 0.72818,4.08521 1.84499,5.86891 0.53326,1.44365 0.16072,3.40529 1.8158,4.31221 1.09685,1.11396 3.21341,1.96583 4.60182,0.78994 1.48211,-0.80027 2.81967,-2.2155 2.60437,-3.87561 0.41431,-2.09644 2.12272,-3.84477 2.08912,-6.04389 0.14584,-1.65381 0.0395,-3.32104 -0.24598,-4.95809 2.68336,0.23573 5.75407,-0.78315 6.94353,-3.1182 -2.08971,-1.76923 -5.27004,-2.39848 -7.97287,-1.54619 -1.02473,-1.30279 0.46813,-2.81934 0.84656,-4.12578 0.91633,-1.75813 2.13072,-3.36791 3.33637,-4.96903 z m -4.23542,3.63561 c -0.96958,1.25221 -0.9866,2.91554 -2.01959,4.12969 -1.99164,-0.27206 0.35949,-2.2509 0.85187,-3.05803 0.3584,-0.3836 0.75006,-0.74132 1.16772,-1.07166 z m -10.2251,0.005 c 1.35804,1.07295 2.44056,2.45953 2.98536,4.02539 -2.1235,0.57483 -1.55091,-2.24838 -2.54239,-3.2022 -0.14142,-0.27712 -0.2894,-0.55147 -0.44297,-0.82319 z m 7.47212,5.2867 c 1.78384,-0.43399 0.76968,2.39786 2.33264,1.77605 1.43702,-0.62165 3.16074,-0.85972 4.7153,-0.46689 -0.0893,0.22379 -2.06117,0.35577 -2.82742,0.74232 -1.40552,0.21503 -2.85059,1.44511 -1.81659,2.75031 0.0507,1.53925 -2.52447,1.6417 -2.51325,3.28279 -0.75473,0.85833 -0.31533,3.17945 1.14454,2.03373 0.0798,-0.73015 2.30392,-0.64221 1.4878,0.42087 -0.36189,2.01774 -2.13419,3.6667 -2.00001,5.78783 -0.31426,1.57286 -2.63556,3.43084 -4.23774,2.04668 -1.66643,-0.8304 -1.44565,-2.585 -1.884,-3.99356 -0.54222,-1.41527 -1.60753,-2.691 -1.68838,-4.23185 -0.15132,-1.144 1.81417,-0.14391 2.17244,0.31063 1.88516,-0.0952 0.61247,-2.26558 0.25035,-3.1991 -0.76888,-1.19006 -3.08978,-1.58467 -2.00345,-3.34656 0.23595,-1.80517 -2.62295,-1.88456 -3.9968,-2.34277 -1.7113,-0.4789 1.14108,-0.56295 1.78241,-0.35523 0.93129,0.0332 2.12608,0.75884 2.82336,0.60517 0.162,-0.54336 0.324,-1.08672 0.486,-1.6301 1.34377,-0.56966 2.57706,0.32841 2.85727,1.51853 1.00906,1.7406 1.20773,-1.23902 2.29033,-1.55029 0.18883,-0.1025 0.40658,-0.15566 0.6252,-0.15856 z m 7.6619,2.67555 c -0.4,0.77687 -2.9877,1.01334 -2.96046,0.66857 0.89806,-0.45486 1.96642,-0.51152 2.96046,-0.66857 z m -20.00311,3.1e-4 c 0.95349,0.12487 2.87166,0.40439 3.14705,0.84829 -0.98838,-0.0173 -2.57617,-0.0515 -3.14705,-0.84829 z m 5.53765,4.90309 c 1.38793,0.4695 -0.3547,1.33658 -0.26626,0.0612 z m 9.13856,0.0175 c 0.65249,0.78217 -1.45893,0.89339 -0.429,0.0615 l 0.18714,-0.0454 z m -3.0314,8.30708 c -1.30295,-0.29819 -1.83794,2.64307 -0.31107,1.30643 0.41209,-0.20315 1.37714,-1.31263 0.31107,-1.30643 z m -3.14595,0.0128 c -2.06054,0.40752 2.25846,2.85345 0.89907,0.65083 -0.15921,-0.33003 -0.4893,-0.61776 -0.89907,-0.65083 z" + SVGIcons["shelf"] = "M 6.5820312 4.5820312 L 6.5839844 26.136719 L 9 26.136719 L 9 22.966797 L 22.998047 22.96875 L 22.998047 26.136719 L 25.416016 26.136719 L 25.416016 4.5820312 L 6.5820312 4.5820312 z M 7.5800781 5.5820312 L 11.029297 5.5820312 L 11.029297 9.0214844 L 7.5800781 9.0214844 L 7.5800781 5.5820312 z M 12.029297 5.5820312 L 15.498047 5.5820312 L 15.498047 9.0214844 L 12.029297 9.0214844 L 12.029297 5.5820312 z M 16.498047 5.5820312 L 19.964844 5.5820312 L 19.964844 9.0214844 L 16.498047 9.0214844 L 16.498047 5.5820312 z M 20.964844 5.5820312 L 24.414062 5.5820312 L 24.414062 9.0214844 L 20.964844 9.0214844 L 20.964844 5.5820312 z M 7.5800781 10.023438 L 11.029297 10.023438 L 11.029297 13.457031 L 7.5800781 13.457031 L 7.5800781 10.023438 z M 12.029297 10.023438 L 15.498047 10.023438 L 15.498047 13.457031 L 12.029297 13.457031 L 12.029297 10.023438 z M 16.498047 10.023438 L 19.964844 10.023438 L 19.966797 13.457031 L 16.498047 13.457031 L 16.498047 10.023438 z M 20.964844 10.023438 L 24.414062 10.023438 L 24.414062 13.457031 L 20.966797 13.457031 L 20.964844 10.023438 z M 15.498047 14.455078 L 15.498047 17.896484 L 12.029297 17.896484 L 12.029297 14.457031 L 15.498047 14.455078 z M 16.498047 14.455078 L 19.966797 14.455078 L 19.966797 17.896484 L 16.498047 17.896484 L 16.498047 14.455078 z M 20.966797 14.455078 L 24.414062 14.455078 L 24.416016 17.896484 L 20.966797 17.896484 L 20.966797 14.455078 z M 7.5800781 14.457031 L 11.029297 14.457031 L 11.029297 17.896484 L 7.5820312 17.896484 L 7.5800781 14.457031 z M 7.6171875 18.792969 L 11.064453 18.792969 L 11.064453 22.234375 L 7.6171875 22.234375 L 7.6171875 18.792969 z M 12.064453 18.792969 L 15.533203 18.792969 L 15.533203 22.234375 L 12.064453 22.234375 L 12.064453 18.792969 z M 16.533203 18.792969 L 20.001953 18.792969 L 20.001953 22.234375 L 16.533203 22.234375 L 16.533203 18.792969 z M 21.001953 18.792969 L 24.451172 18.792969 L 24.451172 22.234375 L 21.001953 22.234375 L 21.001953 18.792969 z" + SVGIcons["shelf2"] = "M 6.5820312 4.5820312 L 6.5839844 26.136719 L 9 26.136719 L 9 22.966797 L 22.998047 22.96875 L 22.998047 26.136719 L 25.416016 26.136719 L 25.416016 4.5820312 L 6.5820312 4.5820312 z M 8.9492188 5.3925781 L 12.396484 5.3925781 L 12.396484 8.8320312 L 8.9492188 8.8320312 L 8.9492188 5.3925781 z M 14.21875 5.3925781 L 17.6875 5.3925781 L 17.6875 8.8320312 L 14.21875 8.8320312 L 14.21875 5.3925781 z M 19.445312 5.3925781 L 22.912109 5.3925781 L 22.912109 8.8320312 L 19.445312 8.8320312 L 19.445312 5.3925781 z M 8.9492188 9.8339844 L 12.396484 9.8339844 L 12.398438 13.267578 L 8.9492188 13.267578 L 8.9492188 9.8339844 z M 14.21875 9.8339844 L 17.6875 9.8339844 L 17.6875 13.267578 L 14.21875 13.267578 L 14.21875 9.8339844 z M 19.445312 9.8339844 L 22.912109 9.8339844 L 22.912109 13.267578 L 19.445312 13.267578 L 19.445312 9.8339844 z M 19.445312 14.265625 L 22.912109 14.265625 L 22.914062 17.707031 L 19.445312 17.707031 L 19.445312 14.265625 z M 8.9492188 14.267578 L 12.398438 14.267578 L 12.398438 17.707031 L 8.9492188 17.707031 L 8.9492188 14.267578 z M 14.21875 14.267578 L 17.6875 14.267578 L 17.6875 17.707031 L 14.21875 17.707031 L 14.21875 14.267578 z M 8.9863281 18.603516 L 12.433594 18.603516 L 12.433594 22.044922 L 8.9863281 22.044922 L 8.9863281 18.603516 z M 14.253906 18.603516 L 17.722656 18.603516 L 17.722656 22.044922 L 14.253906 22.044922 L 14.253906 18.603516 z M 19.480469 18.603516 L 22.949219 18.603516 L 22.949219 22.044922 L 19.480469 22.044922 L 19.480469 18.603516 z" + SVGIcons["shelf3"] = "M 6.5820312 4.5820312 L 6.5839844 26.136719 L 9 26.136719 L 9 22.966797 L 22.998047 22.96875 L 22.998047 26.136719 L 25.416016 26.136719 L 25.416016 4.5820312 L 6.5820312 4.5820312 z M 8.9492188 5.3925781 L 15.443359 5.3925781 L 15.443359 8.8320312 L 8.9492188 8.8320312 L 8.9492188 5.3925781 z M 16.230469 5.3925781 L 22.878906 5.3925781 L 22.878906 8.8320312 L 16.230469 8.8320312 L 16.230469 5.3925781 z M 8.9492188 9.8339844 L 15.443359 9.8339844 L 15.447266 13.267578 L 8.9492188 13.267578 L 8.9492188 9.8339844 z M 16.230469 9.8339844 L 22.878906 9.8339844 L 22.878906 13.267578 L 16.230469 13.267578 L 16.230469 9.8339844 z M 16.230469 14.265625 L 22.878906 14.265625 L 22.882812 17.707031 L 16.230469 17.707031 L 16.230469 14.265625 z M 8.9492188 14.267578 L 15.447266 14.267578 L 15.447266 17.707031 L 8.9492188 17.707031 L 8.9492188 14.267578 z M 9.0195312 18.603516 L 15.513672 18.603516 L 15.513672 22.044922 L 9.0195312 22.044922 L 9.0195312 18.603516 z M 16.298828 18.603516 L 22.949219 18.603516 L 22.949219 22.044922 L 16.298828 22.044922 L 16.298828 18.603516 z" + SVGIcons["shelf4"] = "M 6.5820312 4.5820312 L 6.5839844 26.136719 L 9 26.136719 L 9 22.966797 L 22.998047 22.96875 L 22.998047 26.136719 L 25.416016 26.136719 L 25.416016 4.5820312 L 22.878906 4.5820312 L 22.878906 8.0292969 L 16.230469 8.0292969 L 16.230469 4.5820312 L 15.443359 4.5820312 L 15.443359 8.0292969 L 8.9492188 8.0292969 L 8.9492188 4.5820312 L 6.5820312 4.5820312 z M 8.9492188 9.03125 L 15.443359 9.03125 L 15.447266 12.464844 L 8.9492188 12.464844 L 8.9492188 9.03125 z M 16.230469 9.03125 L 22.878906 9.03125 L 22.878906 12.464844 L 16.230469 12.464844 L 16.230469 9.03125 z M 16.230469 13.462891 L 22.878906 13.462891 L 22.882812 16.904297 L 16.230469 16.904297 L 16.230469 13.462891 z M 8.9492188 13.464844 L 15.447266 13.464844 L 15.447266 16.904297 L 8.9492188 16.904297 L 8.9492188 13.464844 z M 9.0195312 17.800781 L 15.513672 17.800781 L 15.513672 21.242188 L 9.0195312 21.242188 L 9.0195312 17.800781 z M 16.298828 17.800781 L 22.949219 17.800781 L 22.949219 21.242188 L 16.298828 21.242188 L 16.298828 17.800781 z" + SVGIcons["sorting1"] = "m 22.519115,30.708898 c -0.123849,-0.12385 -0.16975,-1.22841 -0.16975,-4.08498 0,-4.1475 0.02879,-4.32962 0.665133,-4.20723 0.235786,0.0454 0.257104,0.31462 0.292101,3.68961 l 0.03775,3.64068 h 3.460961 3.460961 l 0.03775,-3.64068 c 0.035,-3.37499 0.05631,-3.64426 0.292101,-3.68961 0.636342,-0.12239 0.665133,0.0597 0.665133,4.20723 0,2.85657 -0.0459,3.96113 -0.16975,4.08498 -0.242378,0.24238 -8.330015,0.24238 -8.572394,0 z M 1.3003209,30.567438 c -0.1238506,-0.12385 -0.1697504,-1.22841 -0.1697504,-4.08498 0,-4.1475 0.028791,-4.32962 0.665133,-4.20723 0.2357855,0.0454 0.2571033,0.31462 0.2921009,3.68961 l 0.037753,3.64068 h 3.4609601 3.4609604 l 0.03775,-3.64068 c 0.035,-3.37499 0.05632,-3.64426 0.2921,-3.68961 0.6363421,-0.12239 0.6651331,0.0597 0.6651331,4.20723 0,2.85657 -0.0459,3.96113 -0.1697501,4.08498 -0.242379,0.24238 -8.3300143,0.24238 -8.5723929,0 z m 10.6093971,0 c -0.12385,-0.12385 -0.16975,-1.22841 -0.16975,-4.08498 0,-4.1475 0.02879,-4.32962 0.665133,-4.20723 0.235786,0.0454 0.257104,0.31462 0.292101,3.68961 l 0.03775,3.64068 h 3.460961 3.46096 l 0.03775,-3.64068 c 0.035,-3.37499 0.05631,-3.64426 0.292101,-3.68961 0.636341,-0.12239 0.665133,0.0597 0.665133,4.20723 0,2.85657 -0.0459,3.96113 -0.169751,4.08498 -0.242378,0.24238 -8.330015,0.24238 -8.572393,0 z m 1.386295,-3.86182 v -2.47552 h 2.899902 2.899902 v 2.47552 2.47553 h -2.899902 -2.899902 z m 10.467938,1.34386 v -1.13167 h 2.970632 2.970631 v 1.13167 1.13167 H 26.734583 23.763951 Z M 2.5451568,27.200728 v -1.69751 h 2.9706313 2.9706318 v 1.69751 1.6975 H 5.5157881 2.5451568 Z m 12.2682172,-5.90903 -1.092985,-1.09943 v -0.81026 c 0,-0.44564 0.04533,-0.81026 0.100739,-0.81026 0.05541,0 0.373689,0.26788 0.707293,0.59529 l 0.606554,0.59529 v -3.42447 -3.42445 h 0.848752 0.848751 v 3.42445 3.42447 l 0.606554,-0.59529 c 0.333605,-0.32741 0.651886,-0.59529 0.707293,-0.59529 0.05541,0 0.10074,0.40161 0.10074,0.89247 v 0.89248 l -1.121088,1.01722 c -0.6166,0.55947 -1.143258,1.01721 -1.170353,1.01721 -0.0271,0 -0.541107,-0.49474 -1.14225,-1.09943 z m -4.487992,-6.18569 v -0.77802 H 9.5473589 8.7693369 v -0.63656 -0.63657 h 0.778022 0.7780231 v -0.77802 -0.77802 h 0.636564 0.636563 v 0.77802 0.77802 h 0.778023 0.778022 v 0.63657 0.63656 h -0.778022 -0.778023 v 0.77802 0.77803 h -0.636563 -0.636564 z m 4.243758,-4.73886 V 9.0940178 H 7.8357099 1.1022788 l -0.48095926,-0.48096 c -0.3433708,-0.34337 -0.4809594,-0.60841 -0.4809594,-0.9265 0,-0.60389 0.3252339,-1.18967 0.7740698,-1.39417 0.53542076,-0.24395 29.74463106,-0.24395 30.28005206,0 0.448837,0.2045 0.77407,0.79028 0.77407,1.39417 0,0.31809 -0.137588,0.58313 -0.480959,0.9265 l -0.48096,0.48096 h -6.73343 -6.733431 v 1.2731302 c 0,1.03736 -0.0393,1.27313 -0.212188,1.27313 -0.172894,0 -0.212188,-0.23577 -0.212188,-1.27313 V 9.0940178 h -1.06094 -1.06094 v 1.2731302 c 0,1.03736 -0.03929,1.27313 -0.212188,1.27313 -0.172893,0 -0.212188,-0.23577 -0.212188,-1.27313 z M 2.2177578,8.3620678 c 0.580767,-0.5456 0.3915949,-1.49474 -0.3599613,-1.80605 -0.7602084,-0.31489 -1.61520846,0.43013 -1.45159426,1.26487 0.1525661,0.77838 1.21972426,1.09718 1.81155556,0.54118 z m -1.1343401,-0.35256 c -0.19513336,-0.19514 -0.083982,-0.75002 0.1783639,-0.89042 0.5227947,-0.2798 0.9871336,0.22509 0.6920142,0.75244 -0.1289125,0.23036 -0.6891832,0.31917 -0.8703781,0.13798 z m 10.4485233,0.56824 c 0.131718,-0.0506 0.320592,-0.28479 0.419718,-0.52055 0.241562,-0.5745 0.02719,-1.16887 -0.524471,-1.45415 -1.140962,-0.59001 -2.1657981,1.11015 -1.139129,1.88977 0.251692,0.19113 0.859058,0.2326 1.243882,0.0849 z m -1.039574,-0.70622 c -0.280438,-0.50111 0.180611,-1.02854 0.718628,-0.82208 0.531051,0.20378 0.330137,1.05436 -0.249049,1.05436 -0.186774,0 -0.398084,-0.10452 -0.469579,-0.23228 z m 11.64897,0.70622 c 0.13172,-0.0506 0.320592,-0.28479 0.41972,-0.52055 0.241561,-0.5745 0.02719,-1.16887 -0.524472,-1.45415 -1.140962,-0.59001 -2.165799,1.11015 -1.139129,1.88977 0.251692,0.19113 0.859059,0.2326 1.243881,0.0849 z m -1.039573,-0.70622 c -0.280438,-0.50111 0.180611,-1.02854 0.718628,-0.82208 0.531051,0.20378 0.330136,1.05436 -0.249049,1.05436 -0.186774,0 -0.398085,-0.10452 -0.469579,-0.23228 z m 10.264039,0.47983 c 0.547351,-0.58991 0.427531,-1.38457 -0.262579,-1.74144 -1.086756,-0.56198 -2.0779,0.83179 -1.231894,1.73233 0.405359,0.43148 1.098656,0.43571 1.494473,0.009 z m -1.206058,-0.47156 c -0.301904,-0.53947 0.160956,-1.04245 0.695863,-0.75618 0.434876,0.23274 0.306839,0.89635 -0.183891,0.9531 -0.242116,0.028 -0.425598,-0.0426 -0.511972,-0.19692 z" + SVGIcons["store1"] = "M 10.85826,18.866847 10.337739,18.533198 V 16.328707 14.124215 H 8.5243116 6.7108847 v 1.665123 1.665125 L 6.2575283,17.416726 C 6.0081819,17.396016 5.7361678,17.378857 5.6530525,17.378593 L 5.5019336,17.37817 v -1.956272 c 0,-1.235371 0.025621,-1.998442 0.069527,-2.07071 0.067062,-0.110374 0.170552,-0.114431 2.9192694,-0.114431 2.748717,0 2.852206,0.004 2.919268,0.114431 0.08096,0.133247 0.0997,5.86456 0.01916,5.85516 -0.0277,-0.0033 -0.284606,-0.156016 -0.570892,-0.339515 z m 11.061062,4.538636 v -2.216408 h 3.055959 3.055961 v 2.216408 2.216415 h -3.055961 -3.055959 z m -10.960341,3.610359 c -0.04619,-0.02936 -0.113281,-0.28443 -0.149093,-0.566891 -0.08955,-0.706266 -0.121788,-0.8212 -0.381868,-1.361288 -0.5343282,-1.109592 -1.5096828,-1.925602 -2.6610036,-2.226278 -0.54296,-0.141799 -1.5053787,-0.140938 -2.0522246,0.0015 -0.2338597,0.06104 -0.4529821,0.111011 -0.4869387,0.111011 -0.036488,0 -0.061739,-1.071343 -0.061739,-2.619397 v -2.619398 h 0.7028401 c 2.6396471,0 5.2916518,1.446293 6.7929628,3.704582 l 0.305531,0.459589 h 2.412745 2.412744 v 1.544766 1.544774 h -1.028851 c -1.117475,0 -1.459908,0.06434 -2.035784,0.382723 -0.473997,0.262031 -1.042034,0.86661 -1.236907,1.316478 l -0.164861,0.380589 -1.141787,1.34e-4 c -0.627983,6.8e-5 -1.179577,-0.02389 -1.225766,-0.05318 z m 9.309964,-3.860911 v -3.941889 h 0.305826 c 0.232735,0 0.361149,0.04351 0.53731,0.182187 l 0.231483,0.182188 2e-6,3.329075 2e-6,3.329074 h 2.88805 2.888051 v 0.430627 0.43062 h -3.425363 -3.425361 z m -1.239407,3.758911 C 18.963098,26.74985 18.778637,26.449045 18.61961,26.245394 l -0.289141,-0.370277 v -6.29995 -6.299953 h 0.671936 0.671936 l -0.01708,6.949139 -0.01708,6.949138 -0.244921,0.01928 c -0.235793,0.01857 -0.249419,0.0081 -0.365708,-0.278911 z M 7.3813093,28.0793 c 0.4523978,-0.230799 0.7592082,-0.732119 0.7592082,-1.240533 0,-0.849915 -0.7790525,-1.539313 -1.6003259,-1.416155 -0.8011376,0.120139 -1.3832519,1.000581 -1.1743854,1.776252 0.089026,0.33062 0.4003947,0.704147 0.733909,0.880421 0.3321564,0.175562 0.9374849,0.175569 1.2815941,1.5e-5 z M 5.821765,29.631084 C 4.0436147,29.04546 3.231809,27.113506 4.0546713,25.425704 5.0735329,23.335886 8.0087036,23.168636 9.2664945,25.128737 10.278928,26.706472 9.586047,28.896178 7.862917,29.564441 7.3251451,29.773003 6.3494087,29.804856 5.821765,29.631091 Z m 10.831112,-1.073651 c 0.528734,-0.528733 0.213739,-1.351888 -0.517326,-1.351888 -0.255949,0 -0.339772,0.03595 -0.532159,0.228365 -0.19151,0.191507 -0.228358,0.276745 -0.228358,0.528253 0,0.494333 0.296532,0.775101 0.827925,0.783902 0.196894,0.003 0.302162,-0.04089 0.449918,-0.188632 z m -1.163799,1.174565 c -0.961796,-0.358248 -1.473121,-1.317376 -1.220131,-2.288674 0.274279,-1.053024 1.227832,-1.642251 2.300092,-1.421286 0.497897,0.102607 0.887303,0.361252 1.157081,0.76854 0.269338,0.406624 0.356938,0.759869 0.319432,1.2881 -0.04891,0.688784 -0.415864,1.249684 -1.021447,1.561288 -0.348717,0.179435 -1.168427,0.228574 -1.535027,0.09203 z" + SVGIcons["stock1"] = "M 3.0770447,24.788513 V 18.619492 L 9.479796,12.206494 c 5.129599,-5.1378039 6.448961,-6.4129887 6.635139,-6.4129887 0.186177,0 1.50554,1.2751848 6.635138,6.4129887 l 6.402751,6.412998 v 6.169021 6.16903 H 28.104323 27.055821 V 25.236085 19.514627 L 21.585378,14.044756 16.114935,8.5748846 10.644491,14.044756 5.1740478,19.514627 v 5.721458 5.721458 H 4.1255467 3.0770447 Z m 6.491593,6.059618 c -0.1521919,-0.152192 -0.1521919,-2.546555 0,-2.698748 0.152191,-0.152193 2.5465603,-0.152193 2.6987523,0 0.152191,0.152193 0.152191,2.546556 0,2.698748 -0.152192,0.152193 -2.5465613,0.152193 -2.6987523,0 z m 3.4646133,0 c -0.07437,-0.07435 -0.109409,-0.506519 -0.109409,-1.349378 0,-0.842851 0.03504,-1.275001 0.109409,-1.34937 0.152191,-0.152193 2.546561,-0.152193 2.698752,0 0.152191,0.152193 0.152191,2.546556 0,2.698748 -0.152191,0.152193 -2.546561,0.152193 -2.698752,0 z m 6.929229,0 c -0.07437,-0.07435 -0.109409,-0.506519 -0.109409,-1.349378 0,-0.842851 0.03504,-1.275001 0.109409,-1.34937 0.152191,-0.152193 2.54656,-0.152193 2.698752,0 0.152191,0.152193 0.152191,2.546556 0,2.698748 -0.152192,0.152193 -2.546561,0.152193 -2.698752,0 z m 3.464614,0 c -0.07437,-0.07435 -0.109409,-0.506519 -0.109409,-1.349378 0,-0.842851 0.03504,-1.275001 0.109409,-1.34937 0.152192,-0.152193 2.546561,-0.152193 2.698752,0 0.152192,0.152193 0.152192,2.546556 0,2.698748 -0.152191,0.152193 -2.54656,0.152193 -2.698752,0 z M 6.1040233,27.38352 c -0.152191,-0.152193 -0.152191,-2.546565 0,-2.698757 0.1521919,-0.152184 2.5465607,-0.152184 2.6987517,0 0.1521919,0.152192 0.1521919,2.546564 0,2.698757 -0.152191,0.152193 -2.5465598,0.152193 -2.6987517,0 z m 3.4646144,0 c -0.1521919,-0.152193 -0.1521919,-2.546565 0,-2.698757 0.152191,-0.152184 2.5465603,-0.152184 2.6987523,0 0.152191,0.152192 0.152191,2.546564 0,2.698757 -0.152192,0.152193 -2.5465613,0.152193 -2.6987523,0 z m 3.4646133,0 c -0.07437,-0.07435 -0.109409,-0.506528 -0.109409,-1.349379 0,-0.84285 0.03504,-1.275001 0.109409,-1.349378 0.152191,-0.152184 2.546561,-0.152184 2.698752,0 0.152191,0.152192 0.152191,2.546564 0,2.698757 -0.152191,0.152193 -2.546561,0.152193 -2.698752,0 z m 3.464614,0 c -0.07437,-0.07435 -0.109409,-0.506528 -0.109409,-1.349379 0,-0.84285 0.03504,-1.275001 0.109409,-1.349378 0.152192,-0.152184 2.546561,-0.152184 2.698752,0 0.152192,0.152192 0.152192,2.546564 0,2.698757 -0.152191,0.152193 -2.54656,0.152193 -2.698752,0 z m 3.464615,0 c -0.07437,-0.07435 -0.109409,-0.506528 -0.109409,-1.349379 0,-0.84285 0.03504,-1.275001 0.109409,-1.349378 0.152191,-0.152184 2.54656,-0.152184 2.698752,0 0.152191,0.152192 0.152191,2.546564 0,2.698757 -0.152192,0.152193 -2.546561,0.152193 -2.698752,0 z m 3.464614,0 c -0.07437,-0.07435 -0.109409,-0.506528 -0.109409,-1.349379 0,-0.84285 0.03504,-1.275001 0.109409,-1.349378 0.152192,-0.152184 2.546561,-0.152184 2.698752,0 0.152192,0.152192 0.152192,2.546564 0,2.698757 -0.152191,0.152193 -2.54656,0.152193 -2.698752,0 z M 6.1040233,24.010078 c -0.152191,-0.152193 -0.152191,-2.546565 0,-2.698749 0.1521919,-0.152192 2.5465607,-0.152192 2.6987517,0 0.1521919,0.152184 0.1521919,2.546556 0,2.698749 -0.074369,0.07435 -0.5065227,0.109411 -1.349376,0.109411 -0.8428533,0 -1.2750062,-0.03501 -1.3493757,-0.109411 z m 3.4646144,0 c -0.1521919,-0.152193 -0.1521919,-2.546565 0,-2.698749 0.152191,-0.152192 2.5465603,-0.152192 2.6987523,0 0.152191,0.152184 0.152191,2.546556 0,2.698749 -0.07437,0.07435 -0.506524,0.109411 -1.349377,0.109411 -0.842853,0 -1.2750067,-0.03501 -1.3493753,-0.109411 z m 6.9292273,0 c -0.07437,-0.07435 -0.109409,-0.506519 -0.109409,-1.349379 0,-0.842851 0.03504,-1.275001 0.109409,-1.34937 0.152192,-0.152192 2.546561,-0.152192 2.698752,0 0.152192,0.152184 0.152192,2.546556 0,2.698749 -0.07437,0.07435 -0.506523,0.109411 -1.349376,0.109411 -0.842852,0 -1.275005,-0.03501 -1.349376,-0.109411 z m 3.464615,0 c -0.07437,-0.07435 -0.109409,-0.506519 -0.109409,-1.349379 0,-0.842851 0.03504,-1.275001 0.109409,-1.34937 0.152191,-0.152192 2.54656,-0.152192 2.698752,0 0.152191,0.152184 0.152191,2.546556 0,2.698749 -0.07437,0.07435 -0.506523,0.109411 -1.349376,0.109411 -0.842853,0 -1.275007,-0.03501 -1.349376,-0.109411 z m 3.464614,0 c -0.07437,-0.07435 -0.109409,-0.506519 -0.109409,-1.349379 0,-0.842851 0.03504,-1.275001 0.109409,-1.34937 0.152192,-0.152192 2.546561,-0.152192 2.698752,0 0.152192,0.152184 0.152192,2.546556 0,2.698749 -0.07437,0.07435 -0.506523,0.109411 -1.349376,0.109411 -0.842854,0 -1.275007,-0.03501 -1.349376,-0.109411 z M 9.5686377,20.636635 c -0.1521919,-0.152192 -0.1521919,-2.546555 0,-2.698748 0.152191,-0.152193 2.5465603,-0.152193 2.6987523,0 0.152191,0.152193 0.152191,2.546556 0,2.698748 -0.07437,0.07435 -0.506524,0.109412 -1.349377,0.109412 -0.842853,0 -1.2750067,-0.03501 -1.3493753,-0.109412 z m 3.4646133,0 c -0.07437,-0.07435 -0.109409,-0.506519 -0.109409,-1.349369 0,-0.84286 0.03504,-1.27501 0.109409,-1.349379 0.152191,-0.152193 2.546561,-0.152193 2.698752,0 0.152191,0.152193 0.152191,2.546556 0,2.698748 -0.07437,0.07435 -0.506522,0.109412 -1.349376,0.109412 -0.842853,0 -1.275006,-0.03501 -1.349376,-0.109412 z m 3.464614,0 c -0.07437,-0.07435 -0.109409,-0.506519 -0.109409,-1.349369 0,-0.84286 0.03504,-1.27501 0.109409,-1.349379 0.152192,-0.152193 2.546561,-0.152193 2.698752,0 0.152192,0.152193 0.152192,2.546556 0,2.698748 -0.07437,0.07435 -0.506523,0.109412 -1.349376,0.109412 -0.842852,0 -1.275005,-0.03501 -1.349376,-0.109412 z m 3.464615,0 c -0.07437,-0.07435 -0.109409,-0.506519 -0.109409,-1.349369 0,-0.84286 0.03504,-1.27501 0.109409,-1.349379 0.152191,-0.152193 2.54656,-0.152193 2.698752,0 0.152191,0.152193 0.152191,2.546556 0,2.698748 -0.07437,0.07435 -0.506523,0.109412 -1.349376,0.109412 -0.842853,0 -1.275007,-0.03501 -1.349376,-0.109412 z" + + SVGIcons["trend"] = "m 27.81612,7.6892051 -6,1.221 1.716,1.7079999 -5.351,5.358 -3.001,-3.002 -7.336,7.242 1.41,1.418 5.922,-5.834 2.991,2.993 6.781,-6.762 1.667,1.66 1.201,-6.0019999 z m -16.69,6.4769999 -3.282,-3.239 1.41,-1.4179999 3.298,3.2489999 -1.426,1.408 z m 15.49,3.287 1.2,6.001 -6,-1.221 1.716,-1.708 -2.13,-2.133 1.411,-1.408 2.136,2.129 1.667,-1.66 z m 1.2,8.181 0,2 -24,0 0,-21.9999999 2,0 0,19.9999999 22,0 z" + SVGIcons["trend_up"] = "m 27.81612,8.5092052 -6,1.221 1.716,1.7079998 -5.351,5.358 -3.001,-3.002 -7.336,7.242 1.41,1.418 5.922,-5.834 2.991,2.993 6.781,-6.762 1.667,1.66 1.201,-6.0019998 z m 0,17.1249998 0,2 -24,0 0,-21.9999998 2,0 0,19.9999998 22,0 z" + SVGIcons["trend_down"] = "m 26.61612,16.435105 -1.667,1.826 -6.781,-7.4382 -2.992,3.2923 -5.922,-6.4184999 -1.41,1.5598 7.336,7.9661999 3.001,-3.3022 5.351,5.8938 -1.716,1.8788 6,1.3431 -1.2,-6.6011 z m 1.2,8.9991 0,2.2 -24,0 0,-21.9999999 2,0 0,19.7999999 22,0 z" + SVGIcons["truck"] = "m 6.8161139,22.634205 -2,0 c -0.552,0 -1,-0.448 -1,-1 l 0,-2 15.0000061,0 0,-9 4.667,0 c 1.117,0 1.6,0.576 1.936,1.107 0.594,0.94 1.536,2.432 2.109,3.378 0.188,0.312 0.288,0.67 0.288,1.035 l 0,4.48 c 0,1.121 -0.728,2 -2,2 l -1,0 c 0,1.656 -1.344,3 -3,3 -1.656,0 -3,-1.344 -3,-3 l -6,0 c 0,1.656 -1.344,3 -3.000006,3 -1.6560001,0 -3.0000001,-1.344 -3.0000001,-3 z m 3.0000001,-1.2 c 0.662004,0 1.200006,0.538 1.200006,1.2 0,0.662 -0.538002,1.2 -1.200006,1.2 -0.662,0 -1.2000001,-0.538 -1.2000001,-1.2 0,-0.662 0.5380001,-1.2 1.2000001,-1.2 z m 12.000006,0 c 0.662,0 1.2,0.538 1.2,1.2 0,0.662 -0.538,1.2 -1.2,1.2 -0.662,0 -1.2,-0.538 -1.2,-1.2 0,-0.662 0.538,-1.2 1.2,-1.2 z m -4,-2.8 -14.0000061,0 0,-10.0000003 c 0,-0.552 0.448,-1 1,-1 l 12.0000061,0 c 0.552,0 1,0.448 1,1 l 0,10.0000003 z m 3,-6 0,3 4.715,0 -1.427,-2.496 c -0.178,-0.312 -0.509,-0.504 -0.868,-0.504 l -2.42,0 z" + SVGIcons["truck2"] = "m 6.81612,22.634205 -2,0 c -0.552,0 -1,-0.448 -1,-1 l 0,-13 c 0,-0.552 0.448,-1 1,-1 l 13,0 c 0.552,0 1,0.448 1,1 l 0,2 4.667,0 c 1.117,0 1.6,0.576 1.936,1.107 0.594,0.94 1.536,2.432 2.109,3.378 0.188,0.312 0.288,0.67 0.288,1.035 l 0,4.48 c 0,1.089 -0.743,2 -2,2 l -1,0 c 0,1.656 -1.344,3 -3,3 -1.656,0 -3,-1.344 -3,-3 l -6,0 c 0,1.656 -1.344,3 -3,3 -1.656,0 -3,-1.344 -3,-3 z m 3,-1.2 c 0.662,0 1.2,0.538 1.2,1.2 0,0.662 -0.538,1.2 -1.2,1.2 -0.662,0 -1.2,-0.538 -1.2,-1.2 0,-0.662 0.538,-1.2 1.2,-1.2 z m 12,0 c 0.662,0 1.2,0.538 1.2,1.2 0,0.662 -0.538,1.2 -1.2,1.2 -0.662,0 -1.2,-0.538 -1.2,-1.2 0,-0.662 0.538,-1.2 1.2,-1.2 z m -3,-2.8 -13,0 0,2 1.765,0 c 0.549,-0.614 1.347,-1 2.235,-1 0.888,0 1.686,0.386 2.235,1 l 7.53,0 c 0.549,-0.614 1.347,-1 2.235,-1 0.888,0 1.686,0.386 2.235,1 l 1.765,0 0,-4.575 -1.711,-2.929 c -0.179,-0.307 -0.508,-0.496 -0.863,-0.496 l -4.426,0 0,6 z m -2,-9 -11,0 0,7 11,0 0,-7 z m 3,4 0,3 5,0 -1.427,-2.496 c -0.178,-0.312 -0.509,-0.504 -0.868,-0.504 l -2.705,0 z" + SVGIcons["tube"] = "m 17.033668,8.6589983 2.010522,0 0,16.0841837 c 0,2.220622 -1.800422,4.021045 -4.021044,4.021045 -2.220622,0 -4.021045,-1.800423 -4.021045,-4.021045 l 0,-16.0841837 2.010523,0 0,3.0157877 3.015783,0 0,12.890465 c 0,0.978119 -0.329725,1.700901 -1.019335,2.186443 l 0.01407,0.0021 c 1.108804,0 2.010523,-0.901719 2.010523,-2.010522 l 0,-16.084184 z m 2.010522,-4.0210449 -8.042089,0 c -0.554904,0 -1.0052645,0.4503571 -1.0052645,1.0052612 0,0.5549043 0.4503605,1.0052613 1.0052645,1.0052613 l 8.042089,0 c 0.55591,0 1.005262,-0.450357 1.005262,-1.0052613 0,-0.5549041 -0.449352,-1.0052612 -1.005262,-1.0052612 z" + SVGIcons["tube2"] = "m 17.07461,24.791346 c 0,1.111704 -0.904079,2.015783 -2.015784,2.015783 l -0.01411,-0.001 c 0.691413,-0.486811 1.022002,-1.212493 1.022002,-2.193172 l 0,-12.924197 -3.023676,0 0,-3.023669 -2.015783,0 0,16.126263 c 0,2.226433 1.805134,4.031567 4.031567,4.031567 2.226433,0 4.031567,-1.805134 4.031567,-4.031567 l 0,-16.126263 -2.015783,0 0,16.126263 z M 13.043042,14.712428 c 0.557365,0 1.007892,0.451535 1.007892,1.007891 0,0.556357 -0.450527,1.007892 -1.007892,1.007892 -0.557364,0 -1.007891,-0.451535 -1.007891,-1.007892 0,-0.556356 0.450527,-1.007891 1.007891,-1.007891 z m 0,10.078918 c -0.557364,0 -1.007891,-0.451536 -1.007891,-1.007892 0,-0.556356 0.450527,-1.007892 1.007891,-1.007892 0.557365,0 1.007892,0.451536 1.007892,1.007892 0,0.556356 -0.450527,1.007892 -1.007892,1.007892 z m 1.007892,-4.031568 c -0.557364,0 -1.007892,-0.451535 -1.007892,-1.007891 0,-0.556357 0.450528,-1.007892 1.007892,-1.007892 0.557364,0 1.007892,0.451535 1.007892,1.007892 0,0.556356 -0.450528,1.007891 -1.007892,1.007891 z M 20.098285,5.6414077 c 0,0.5563563 -0.450527,1.0078918 -1.007892,1.0078918 l -8.063134,0 c -0.556358,0 -1.007898,-0.4515355 -1.007898,-1.0078918 0,-0.5563563 0.45154,-1.0078918 1.007898,-1.0078918 l 8.063134,0 c 0.557365,0 1.007892,0.4515355 1.007892,1.0078918 z" + SVGIcons["tube3"] = "m 20.098,5.6420797 c 0,0.556347 -0.450531,1.007875 -1.0079,1.007875 l -8.0632,0 c -0.556361,0 -1.0079,-0.451528 -1.0079,-1.007875 0,-0.556347 0.451539,-1.007875 1.0079,-1.007875 l 8.0632,0 c 0.557369,0 1.0079,0.451528 1.0079,1.007875 z M 17.0743,24.791705 c 0,1.111686 -0.904086,2.01575 -2.0158,2.01575 -1.111714,0 -2.0158,-0.904064 -2.0158,-2.01575 l 0,-3.023625 2.0158,0 0,-1.007875 -2.0158,0 0,-2.01575 2.0158,0 0,-1.007875 -2.0158,0 0,-2.01575 2.0158,0 0,-1.007875 -2.0158,0 0,-2.01575 2.0158,0 0,-1.007875 -2.0158,0 0,-2.0157503 2.0158,0 0,-1.007875 -4.0316,0 0,16.1260003 c 0,2.226396 1.805149,4.0315 4.0316,4.0315 2.226451,0 4.0316,-1.805104 4.0316,-4.0315 l 0,-16.1260003 -2.0158,0 0,16.1260003 z" + SVGIcons["tube4"] = "m 18.953646,12.634205 1.558058,0 0,12 c 0,2.209 -1.395241,4 -3.116117,4 -1.720875,0 -3.116116,-1.791 -3.116116,-4 l 0,-12 1.558058,0 0,3 2.337088,0 0,8.823 c 0,0.973 -0.255522,1.692 -0.789936,2.175 l 0.01091,0.002 c 0.85927,0 1.558059,-0.897 1.558059,-2 l 0,-12 z m 1.558058,-4.0000003 -6.232233,0 c -0.430024,0 -0.779029,0.448 -0.779029,1 0,0.5520003 0.349005,1.0000003 0.779029,1.0000003 l 6.232233,0 c 0.430803,0 0.779029,-0.448 0.779029,-1.0000003 0,-0.552 -0.348226,-1 -0.779029,-1 z m -9.34835,12.0000003 0,-3 1.558059,0 0,-1 -1.558059,0 0,-1 1.558059,0 0,-1 -1.558059,0 0,-1 1.558059,0 0,-1 -1.558059,0 0,-1 1.558059,0 0,-1 -1.558059,0 0,-1.0000003 1.558059,0 0,-1 -3.1161169,0 0,12.0000003 c 0,2.209 1.3952409,4 3.1161169,4 l 0,-2 c -0.85927,0 -1.558059,-0.897 -1.558059,-2 z m 3.116117,-14.0000003 1.558058,0 c 0.430803,0 0.779029,-0.448 0.779029,-1 0,-0.552 -0.348226,-1 -0.779029,-1 l -6.2322329,0 c -0.4300241,0 -0.7790291,0.448 -0.7790291,1 0,0.552 0.349005,1 0.7790291,1 l 4.6741749,0 z" + + SVGIcons["hand_w"] = "m 22.35212,12.189205 c -1.188,-0.252 -4.606,-0.904 -5.536,-1.088 l 0,-3.5119999 c 0,-1.629 -1.346,-2.955 -3,-2.955 -1.654,0 -3,1.326 -3,2.955 l 0,7.4569999 c -0.554,-0.336 -1.188,-0.621 -1.838,-0.715 -1.822,-0.262 -3.162,0.94 -3.162,2.498 0,0.805 0.363,1.613 1.022,2.271 3.972,3.972 5.688,5.125 6.059,9.534 l 9.919,0 0,-1.748 c 0,-5.154 3,-6.031 3,-10.029 0,-2.448 -1.061,-4.157 -3.464,-4.668 z m 0.357,8.022 c -0.821,1.483 -1.838,3.319 -1.891,6.423 l -6.13,0 c -0.726,-3.82 -3.81,-6.318 -6.436,-8.949 -0.688,-0.686 -0.393,-1.37 0.442,-1.373 1.263,-0.006 3.06,1.884 4.122,3.205 l 0,-11.9279999 c 0,-0.517 0.458,-0.955 1,-0.955 0.542,0 1,0.438 1,0.955 l 0,6.9479999 c 0,0.315 0.256,0.571 0.572,0.571 0.314,0 0.57,-0.256 0.57,-0.571 l 0,-0.575 c 0,-0.534 0.49,-0.938 1.014,-0.833 0.398,0.079 0.686,0.428 0.686,0.833 l 0,1.273 c 0,0.315 0.256,0.571 0.571,0.571 0.315,0 0.571,-0.256 0.571,-0.571 l 0,-0.83 c 0,-0.531 0.487,-0.932 1.008,-0.828 0.396,0.078 0.682,0.424 0.682,0.828 l 0,1.533 c 0,0.315 0.256,0.571 0.571,0.571 0.315,0 0.571,-0.256 0.571,-0.571 l 0,-0.912 c 0,-0.523 0.545,-0.867 1.018,-0.646 0.645,0.305 1.166,0.932 1.166,2.477 0,1.355 -0.465,2.193 -1.107,3.354 z" + SVGIcons["hand_b"] = "m 7.83712,15.322205 c 1.208,0.172 2.51,1.312 2.979,1.781 l 0,-10.5140002 c 0,-1.08 0.92,-1.955 2,-1.955 1.08,0 2,0.875 2,1.955 l 0,6.0580002 c 0,0.784 0.814,0.885 0.919,0.103 0.216,-1.604 2.519,-1.817 2.693,0.399 0.043,0.546 0.726,0.655 0.866,0.027 0.326,-1.444 2.501,-1.458 2.758,0.758 0.066,0.579 0.796,0.696 0.848,0.034 0.051,-0.67 0.281,-0.934 0.607,-0.934 1.098,0 2.309,2.019 2.309,4.41 0,4.295 -3,4.306 -3,11.19 l -10,0 c -0.332,-3.942 -3.462,-7.431 -6.271,-10.241 -0.488,-0.488 -0.729,-1.052 -0.729,-1.564 0,-0.93 0.759,-1.688 2.021,-1.507 z" + + SVGIcons["view2"] = "m 16.81612,16.634205 c 0,1.657 -1.343,3 -3,3 -1.657,0 -3,-1.343 -3,-3 0,-0.199 0.02,-0.393 0.057,-0.581 1.474,0.541 2.927,-0.882 2.405,-2.371 0.174,-0.03 0.354,-0.048 0.538,-0.048 1.657,0 3,1.344 3,3 z m -2.985,-6.9999998 c -7.569,0 -12.015,6.5509998 -12.015,6.5509998 0,0 4.835,7.449 12.015,7.449 7.733,0 11.985,-7.449 11.985,-7.449 0,0 -4.291,-6.5509998 -11.985,-6.5509998 z m -0.015,11.9999998 c -2.761,0 -5,-2.238 -5,-5 0,-2.761 2.239,-5 5,-5 2.762,0 5,2.239 5,5 0,2.762 -2.238,5 -5,5 z" + SVGIcons["view3"] = "m 15.83112,11.634205 c 4.751,0 8.063,3.012 9.504,4.636 -1.401,1.837 -4.713,5.364 -9.504,5.364 -4.42,0 -7.93,-3.536 -9.478,-5.407 1.493,-1.647 4.817,-4.593 9.478,-4.593 z m 0,-1.9999999 c -7.569,0 -12.015,6.5509999 -12.015,6.5509999 0,0 4.835,7.449 12.015,7.449 7.733,0 11.985,-7.449 11.985,-7.449 0,0 -4.291,-6.5509999 -11.985,-6.5509999 z m -0.015,2.9999999 c -2.21,0 -4,1.791 -4,4 0,2.209 1.79,4 4,4 2.209,0 4,-1.791 4,-4 0,-2.209 -1.791,-4 -4,-4 z m -0.004,3.999 c -0.564,0.564 -1.479,0.564 -2.044,0 -0.565,-0.564 -0.565,-1.48 0,-2.044 0.564,-0.564 1.479,-0.564 2.044,0 0.565,0.564 0.565,1.479 0,2.044 z" + SVGIcons["view4"] = "m 14.23112,11.634205 c 4.751,0 8.063,3.012 9.504,4.636 -1.401,1.837 -4.713,5.364 -9.504,5.364 -4.42,0 -7.93,-3.536 -9.478,-5.407 1.493,-1.647 4.817,-4.593 9.478,-4.593 z m 0,-2 c -7.569,0 -12.015,6.551 -12.015,6.551 0,0 4.835,7.449 12.015,7.449 7.733,0 11.985,-7.449 11.985,-7.449 0,0 -4.291,-6.551 -11.985,-6.551 z m -0.015,7 -3.36,-2.171 c -0.405,0.625 -0.64,1.371 -0.64,2.171 0,2.209 1.791,4 4,4 2.209,0 4,-1.791 4,-4 0,-2.209 -1.791,-4 -4,-4 -0.742,0 -1.438,0.202 -2.033,0.554 l 2.033,3.446 z" + + SVGIcons["stock"] = "M 3.8029972,21.033894 3.9177538,12.694907 9.7556105,9.1284873 15.593467,5.562068 l 5.837857,3.5664193 5.837857,3.5664197 0.114757,8.338987 0.114757,8.338988 h -1.282329 -1.282328 l -0.0045,-7.556436 -0.0045,-7.556422 -4.665763,-2.998154 -4.665763,-2.9981425 -4.665764,2.9981425 -4.6657626,2.998154 -0.00452,7.556422 -0.00452,7.556436 H 4.9705711 3.6882432 Z m 3.299042,5.920926 v -2.41805 h 2.5474285 2.5474283 v 2.41805 2.418062 H 9.6494677 7.1020392 Z m 5.9439998,0 v -2.41805 h 2.547428 2.547429 v 2.41805 2.418062 h -2.547429 -2.547428 z m 5.944,0 v -2.41805 h 2.547428 2.547428 v 2.41805 2.418062 H 21.537467 18.990039 Z M 7.1020392,21.312688 v -2.418061 h 2.5474285 2.5474283 v 2.418061 2.418062 H 9.6494677 7.1020392 Z m 5.9439998,0 v -2.418061 h 2.547428 2.547429 v 2.418061 2.418062 h -2.547429 -2.547428 z m 0,-5.642131 v -2.418062 h 2.547428 2.547429 v 2.418062 2.418049 h -2.547429 -2.547428 z" + SVGIcons["deliver"] = "M 6.4718389,29.765572 C 5.5987968,29.444295 4.9364481,28.766538 4.6854844,27.937661 4.5034731,27.336519 4.5654572,26.499805 4.8326558,25.951018 c 0.3974755,-0.816359 1.166866,-1.395507 2.1027481,-1.582816 0.3655071,-0.07315 0.4980368,-0.06864 0.9005065,0.03069 0.9778424,0.241306 1.5926578,0.718966 2.0010366,1.554631 0.222594,0.455496 0.238118,0.532975 0.238118,1.188456 0,0.651266 -0.01637,0.734438 -0.2298672,1.168052 -0.4877754,0.990668 -1.3138949,1.534422 -2.3926306,1.574834 -0.4657078,0.01745 -0.6800003,-0.0087 -0.9807283,-0.119286 z m 1.3824593,-1.680227 c 0.710145,-0.432982 0.651251,-1.46157 -0.1046371,-1.82749 -0.3456529,-0.167327 -0.5998358,-0.14646 -0.9649952,0.07922 -0.4189536,0.258929 -0.5903202,0.968686 -0.3373004,1.397015 0.2648617,0.448375 0.9621302,0.622455 1.4069327,0.351255 z m 15.8290658,1.680227 c -0.873042,-0.321277 -1.535391,-0.999034 -1.786354,-1.827911 -0.182012,-0.601142 -0.120028,-1.437856 0.14717,-1.986643 0.397476,-0.816359 1.166866,-1.395507 2.102748,-1.582816 0.365507,-0.07315 0.498037,-0.06864 0.900507,0.03069 0.977842,0.241306 1.592658,0.718966 2.001036,1.554631 0.222594,0.455496 0.238119,0.532975 0.238119,1.188456 0,0.651266 -0.01637,0.734438 -0.229868,1.168052 -0.487776,0.990668 -1.313895,1.534422 -2.39263,1.574834 -0.465708,0.01745 -0.680001,-0.0087 -0.980728,-0.119286 z m 1.382459,-1.680227 c 0.710144,-0.432982 0.651251,-1.46157 -0.104638,-1.82749 -0.345652,-0.167327 -0.599835,-0.14646 -0.964994,0.07922 -0.418954,0.258929 -0.590321,0.968686 -0.337302,1.397015 0.264863,0.448375 0.962131,0.622455 1.406934,0.351255 z M 20.534914,27.462644 20.36,27.413984 20.34208,21.94233 20.32416,16.470676 h 2.5857 2.5857 l 1.595167,1.130857 c 0.877343,0.621972 2.019236,1.432697 2.537539,1.801613 0.518301,0.368916 1.00631,0.703148 1.084465,0.74274 0.137122,0.06946 0.143322,0.149073 0.17708,2.273878 l 0.03498,2.201898 0.244599,0.02321 c 0.134529,0.01276 0.28408,0.05597 0.332336,0.09603 0.121814,0.1011 0.125274,2.50892 0.0038,2.630415 -0.06067,0.06068 -0.552903,0.08396 -1.774416,0.08396 h -1.690458 l -0.03625,-0.635743 c -0.03216,-0.564174 -0.0683,-0.700424 -0.320968,-1.21033 -0.671874,-1.355898 -2.127335,-2.137925 -3.592584,-1.930317 -1.117199,0.158295 -1.940339,0.712773 -2.601741,1.752571 -0.204403,0.321343 -0.464421,1.198842 -0.464421,1.567305 0,0.486524 -0.09269,0.57432 -0.489759,0.463881 z m 7.06652,-6.193896 V 20.399601 L 27.003875,20.026859 C 26.675218,19.821853 26.084884,19.458328 25.692021,19.21903 l -0.714295,-0.435089 -1.031992,-0.0022 -1.031992,-0.0022 v 1.679174 1.679172 h 2.343847 2.343845 z M 0.3942902,27.361719 c -0.0557924,-0.06723 -0.0784076,-2.226216 -0.0803534,-7.671067 -0.001489,-4.167631 0.0119795,-7.592197 0.029931,-7.610148 0.0430602,-0.04306 1.6487482,-0.0424 1.6918439,7e-4 0.018336,0.01834 0.032374,2.422401 0.031197,5.342368 -0.00117,2.919967 0.023246,5.348526 0.054274,5.396799 0.044791,0.06968 1.6343147,0.0841 7.7133233,0.06997 l 7.656906,-0.01781 0.01793,-5.404839 0.01793,-5.404838 0.156991,-0.0048 c 0.577012,-0.01756 1.607069,-0.0028 1.633307,0.02348 0.01737,0.01737 0.03037,3.441465 0.02887,7.609095 -0.0019,5.444852 -0.02456,7.603843 -0.08036,7.671068 -0.06323,0.07619 -0.85359,0.09356 -4.257308,0.09356 h -4.179661 l -0.03625,-0.635743 c -0.03217,-0.564173 -0.0683,-0.700423 -0.32097,-1.210329 -0.6718742,-1.355898 -2.1273352,-2.137926 -3.5925848,-1.930317 -1.1171986,0.158294 -1.940338,0.712773 -2.6017407,1.752571 -0.2191699,0.34456 -0.4644217,1.198085 -0.4644217,1.61628 v 0.407539 H 2.1425417 c -1.30922384,0 -1.68740225,-0.02024 -1.7482515,-0.09356 z m 2.4533332,-5.237816 c -0.1194499,-0.11945 -0.1194499,-3.560738 0,-3.680188 0.1197338,-0.119734 3.9102814,-0.119734 4.0300157,0 0.11945,0.11945 0.11945,3.560738 0,3.680188 -0.1197343,0.119734 -3.9102819,0.119734 -4.0300157,0 z m 4.8975886,0 c -0.11945,-0.11945 -0.11945,-3.560738 0,-3.680188 0.1197343,-0.119734 3.910281,-0.119734 4.030015,0 0.11945,0.11945 0.11945,3.560738 0,3.680188 -0.119734,0.119734 -3.9102807,0.119734 -4.030015,0 z m 4.897588,0 c -0.11945,-0.11945 -0.11945,-3.560738 0,-3.680188 0.119734,-0.119734 3.910281,-0.119734 4.030015,0 0.11945,0.11945 0.11945,3.560738 0,3.680188 -0.119734,0.119734 -3.910281,0.119734 -4.030015,0 z M 2.8476234,17.576142 c -0.1194499,-0.11945 -0.1194499,-3.560738 0,-3.680188 0.1197338,-0.119734 3.9102814,-0.119734 4.0300157,0 0.11945,0.11945 0.11945,3.560738 0,3.680188 -0.1197343,0.119734 -3.9102819,0.119734 -4.0300157,0 z m 4.8975886,0 c -0.11945,-0.11945 -0.11945,-3.560738 0,-3.680188 0.1197343,-0.119734 3.910281,-0.119734 4.030015,0 0.11945,0.11945 0.11945,3.560738 0,3.680188 -0.119734,0.119734 -3.9102807,0.119734 -4.030015,0 z m 4.897588,0 c -0.11945,-0.11945 -0.11945,-3.560738 0,-3.680188 0.119734,-0.119734 3.910281,-0.119734 4.030015,0 0.11945,0.11945 0.11945,3.560738 0,3.680188 -0.119734,0.119734 -3.910281,0.119734 -4.030015,0 z" + SVGIcons["female"] = "m 15.993191,1.74425 c -4.444127,0.0574 -8.0226427,3.73034 -7.9634743,8.17363 0.051997,3.92147 2.9721333,7.01558 6.7003793,7.68476 v 4.41529 h -3.725137 a 1.1559165,1.1559165 0 0 0 -1.1547035,1.15471 v 0.40703 a 1.1559165,1.1559165 0 0 0 1.1547035,1.1547 h 3.725137 v 2.931 a 1.1559165,1.1559165 0 0 0 1.154703,1.1547 h 0.407022 a 1.1559165,1.1559165 0 0 0 1.154704,-1.1547 v -2.931 h 3.928647 a 1.1559165,1.1559165 0 0 0 1.15028,-1.27416 l -0.04203,-0.40701 a 1.1559165,1.1559165 0 0 0 -1.15028,-1.03527 h -3.886618 v -4.40424 c 3.825396,-0.67182 6.778022,-3.90262 6.724711,-7.90596 -0.05892,-4.44322 -3.733989,-8.02112 -8.178044,-7.96348 z m 0.03096,2.30941 c 3.195235,-0.0414 5.795321,2.49141 5.837668,5.68505 0.04253,3.19366 -2.489749,5.79197 -5.685035,5.83324 -3.195234,0.0414 -5.7953194,-2.49141 -5.8376689,-5.68503 -0.042528,-3.19369 2.4897499,-5.79199 5.6850359,-5.83326 z" + SVGIcons["male"] = "m 21.664275,1.91813 c -0.255266,0.0118 -0.435636,0.0851 -0.635157,0.24478 l -6.672617,5.34925 c -0.407447,0.32673 -0.558448,0.87852 -0.374165,1.36726 l 0.06005,0.15941 c 0.445885,0.7275 1.24199,0.93717 1.882374,0.51736 l 2.060221,-1.64456 -2.362786,4.6817 c -0.865655,-0.3161 -1.763353,-0.57637 -2.734641,-0.58891 -4.640107,-0.0603 -8.4773009,3.67547 -8.5388206,8.31473 -0.061776,4.63937 3.6746026,8.47437 8.3147836,8.5342 4.640108,0.0603 8.477305,-3.67548 8.538824,-8.31472 0.0362,-2.71833 -1.315184,-5.05078 -3.305128,-6.61955 l 2.591441,-5.05586 v 2.41595 c 7.2e-4,0.66553 0.540075,1.20489 1.205645,1.2056 h 0.297946 c 0.665568,-6.5e-4 1.204945,-0.54007 1.205643,-1.2056 v -8.08839 c 3.4e-4,-0.41105 -0.250119,-0.7709 -0.595892,-0.99323 l 0.309494,0.27944 c -0.115346,-0.20103 -0.364658,-0.33218 -0.570484,-0.43884 -0.113028,-0.0342 -0.304442,-0.0947 -0.422668,-0.0947 l 0.415739,0.0969 c -0.158384,-0.0639 -0.499332,-0.1295 -0.669802,-0.12239 z m -8.809054,12.4975 c 3.336247,0.0426 5.980238,2.75605 5.935833,6.09059 -0.04421,3.33456 -2.759007,5.9792 -6.095199,5.93591 -3.336245,-0.0426 -5.9802358,-2.75603 -5.9358309,-6.09059 0.044215,-3.33453 2.7590049,-5.97918 6.0951969,-5.93591 z" + SVGIcons["arrowleftalt"] = "M16,30.534c8.027,0,14.534-6.507,14.534-14.534c0-8.027-6.507-14.534-14.534-14.534C7.973,1.466,1.466,7.973,1.466,16C1.466,24.027,7.973,30.534,16,30.534zM18.335,6.276l3.536,3.538l-6.187,6.187l6.187,6.187l-3.536,3.537l-9.723-9.724L18.335,6.276z" + + SVGIcons["question"] = "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M17.328,24.371h-2.707v-2.596h2.707V24.371zM17.328,19.003v0.858h-2.707v-1.057c0-3.19,3.63-3.696,3.63-5.963c0-1.034-0.924-1.826-2.134-1.826c-1.254,0-2.354,0.924-2.354,0.924l-1.541-1.915c0,0,1.519-1.584,4.137-1.584c2.487,0,4.796,1.54,4.796,4.136C21.156,16.208,17.328,16.627,17.328,19.003z" + SVGIcons["i"] = "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M14.757,8h2.42v2.574h-2.42V8z M18.762,23.622H16.1c-1.034,0-1.475-0.44-1.475-1.496v-6.865c0-0.33-0.176-0.484-0.484-0.484h-0.88V12.4h2.662c1.035,0,1.474,0.462,1.474,1.496v6.887c0,0.309,0.176,0.484,0.484,0.484h0.88V23.622z" + SVGIcons["$"] = "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M17.255,23.88v2.047h-1.958v-2.024c-3.213-0.44-4.621-3.08-4.621-3.08l2.002-1.673c0,0,1.276,2.223,3.586,2.223c1.276,0,2.244-0.683,2.244-1.849c0-2.729-7.349-2.398-7.349-7.459c0-2.2,1.738-3.785,4.137-4.159V5.859h1.958v2.046c1.672,0.22,3.652,1.1,3.652,2.993v1.452h-2.596v-0.704c0-0.726-0.925-1.21-1.959-1.21c-1.32,0-2.288,0.66-2.288,1.584c0,2.794,7.349,2.112,7.349,7.415C21.413,21.614,19.785,23.506,17.255,23.88z" + SVGIcons["!"] = "M26.711,14.086L16.914,4.29c-0.778-0.778-2.051-0.778-2.829,0L4.29,14.086c-0.778,0.778-0.778,2.05,0,2.829l9.796,9.796c0.778,0.777,2.051,0.777,2.829,0l9.797-9.797C27.488,16.136,27.488,14.864,26.711,14.086zM14.702,8.981c0.22-0.238,0.501-0.357,0.844-0.357s0.624,0.118,0.844,0.353c0.221,0.235,0.33,0.531,0.33,0.885c0,0.306-0.101,1.333-0.303,3.082c-0.201,1.749-0.379,3.439-0.531,5.072H15.17c-0.135-1.633-0.301-3.323-0.5-5.072c-0.198-1.749-0.298-2.776-0.298-3.082C14.372,9.513,14.482,9.22,14.702,8.981zM16.431,21.799c-0.247,0.241-0.542,0.362-0.885,0.362s-0.638-0.121-0.885-0.362c-0.248-0.241-0.372-0.533-0.372-0.876s0.124-0.638,0.372-0.885c0.247-0.248,0.542-0.372,0.885-0.372s0.638,0.124,0.885,0.372c0.248,0.247,0.372,0.542,0.372,0.885S16.679,21.558,16.431,21.799z" + SVGIcons["arrowalt"] = "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM13.665,25.725l-3.536-3.539l6.187-6.187l-6.187-6.187l3.536-3.536l9.724,9.723L13.665,25.725z" + SVGIcons["question2"] = "M26.711,14.086L16.914,4.29c-0.778-0.778-2.051-0.778-2.829,0L4.29,14.086c-0.778,0.778-0.778,2.05,0,2.829l9.796,9.796c0.778,0.777,2.051,0.777,2.829,0l9.797-9.797C27.488,16.136,27.488,14.864,26.711,14.086zM16.431,21.799c-0.248,0.241-0.543,0.362-0.885,0.362c-0.343,0-0.638-0.121-0.886-0.362c-0.247-0.241-0.371-0.533-0.371-0.876s0.124-0.638,0.371-0.885c0.248-0.248,0.543-0.372,0.886-0.372c0.342,0,0.637,0.124,0.885,0.372c0.248,0.247,0.371,0.542,0.371,0.885S16.679,21.558,16.431,21.799zM18.911,15.198c-0.721,0.716-1.712,1.147-2.972,1.294v2.027h-0.844v-3.476c0.386-0.03,0.768-0.093,1.146-0.188c0.38-0.095,0.719-0.25,1.019-0.464c0.312-0.227,0.555-0.5,0.729-0.822c0.174-0.322,0.261-0.77,0.261-1.346c0-0.918-0.194-1.623-0.582-2.113c-0.389-0.49-0.956-0.735-1.701-0.735c-0.281,0-0.527,0.042-0.738,0.124s-0.366,0.16-0.464,0.234c0.031,0.146,0.072,0.357,0.124,0.633c0.052,0.275,0.078,0.486,0.078,0.633c0,0.226-0.098,0.433-0.294,0.619c-0.195,0.187-0.479,0.28-0.853,0.28c-0.33,0-0.565-0.113-0.706-0.339s-0.211-0.489-0.211-0.789c0-0.244,0.067-0.484,0.201-0.72c0.135-0.235,0.346-0.463,0.633-0.684c0.245-0.195,0.577-0.364,0.995-0.504c0.419-0.141,0.854-0.211,1.308-0.211c0.647,0,1.223,0.103,1.724,0.308c0.502,0.205,0.914,0.479,1.238,0.822c0.337,0.355,0.586,0.755,0.748,1.198c0.162,0.444,0.243,0.926,0.243,1.446C19.994,13.558,19.633,14.482,18.911,15.198z" + SVGIcons["stopsign"] = "M20.833,2.625H10.167l-7.542,7.542v10.666l7.542,7.542h10.666l7.542-7.542V10.167L20.833,2.625zM23.76,17.145c-0.461,0.432-0.496-0.021-1.151,0.385c-0.655,0.404-1.067,0.844-1.067,0.844l-0.578,0.564c0,0-1.199,1.422-1.59,1.717c-0.392,0.291-0.572,0.166-0.572,0.166c-0.133,0.23-0.641,0.656-1.193,1.025c-0.549,0.371-0.99,1.354-0.99,1.354l-0.208,1.465c0,0-1.597,0.021-3.096-0.293c-1.499-0.314-2.699-0.982-2.699-0.982l0.655-1.451c0,0-0.58-2.225-0.636-3.926c-0.056-1.703,0.572-2.958,0.481-3.37c-0.09-0.412-0.438-1.109-0.523-1.569c-0.083-0.46-0.307-2.036-0.327-2.238c-0.021-0.202-0.28-2.232,0.614-2.204c0.891,0.027,0.648,1.388,0.725,2.246c0.077,0.857,1.13,3.249,1.297,3.123c0.167-0.125-0.056-2.398,0.006-2.838c0.063-0.439,0.182-2.315,0.293-2.747c0.112-0.433,0.105-1.778,0.935-1.66c0.83,0.118,0.606,1.332,0.488,1.813c-0.118,0.48,0.021,1.597,0.07,2.302c0.048,0.704,0.112,2.356,0.112,2.356l0.404-0.042c0,0,0.913-5,0.976-5.439c0.062-0.439,0.182-1.618,0.858-1.472c1.117,0.242,0.516,1.967,0.516,1.967l-0.486,5.509c0,0,0.166,0.224,0.492,0.021c0.33-0.202,1.312-3.25,1.459-3.927c0.146-0.676,0.084-2.678,1.145-2.428c1.059,0.252,0.453,2.755,0.124,4.353c-0.327,1.597-1.03,3.39-1.03,3.39l-0.433,1.631l0.376,0.852l0.412-0.092l0.898-0.717c0,0,0,0,0.614-0.461c0.613-0.46,1.764-0.495,2.044-0.355C23.453,16.154,24.221,16.713,23.76,17.145z" + SVGIcons["temp"] = "M17.5,19.508V8.626h-3.999v10.881c-1.404,0.727-2.375,2.178-2.375,3.869c0,2.416,1.959,4.375,4.375,4.375s4.375-1.959,4.375-4.375C19.876,21.686,18.905,20.234,17.5,19.508zM20.5,5.249c0-2.757-2.244-5-5.001-5s-4.998,2.244-4.998,5v12.726c-1.497,1.373-2.376,3.314-2.376,5.4c0,4.066,3.31,7.377,7.376,7.377s7.374-3.311,7.374-7.377c0-2.086-0.878-4.029-2.375-5.402V5.249zM20.875,23.377c0,2.963-2.41,5.373-5.375,5.373c-2.962,0-5.373-2.41-5.373-5.373c0-1.795,0.896-3.443,2.376-4.438V5.251c0-1.654,1.343-3,2.997-3s3,1.345,3,3v13.688C19.979,19.934,20.875,21.582,20.875,23.377zM22.084,8.626l4.5,2.598V6.029L22.084,8.626z" + SVGIcons["thunder"] = "M25.371,7.306c-0.092-3.924-3.301-7.077-7.248-7.079c-2.638,0.001-4.942,1.412-6.208,3.517c-0.595-0.327-1.28-0.517-2.01-0.517C7.626,3.229,5.772,5.033,5.689,7.293c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h5.271l-2.166,3.398l1.977-0.411L10,30.875l9.138-10.102L17,21l2.167-2.023h4.269c3.312,0,6-2.688,6-6C29.434,10.34,27.732,8.11,25.371,7.306zM23.436,16.979H7.561c-2.209-0.006-3.997-1.792-4.001-4.001c-0.002-1.982,1.45-3.618,3.35-3.931c0.265-0.043,0.502-0.191,0.657-0.414C7.722,8.41,7.779,8.136,7.73,7.87C7.702,7.722,7.685,7.582,7.685,7.446C7.689,6.221,8.68,5.23,9.905,5.228c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.309c0.342-0.066,0.626-0.307,0.748-0.63c0.749-1.992,2.662-3.412,4.911-3.41c2.899,0.004,5.244,2.35,5.251,5.249c0,0.161-0.009,0.326-0.027,0.497c-0.049,0.517,0.305,0.984,0.815,1.079c1.86,0.344,3.274,1.966,3.271,3.923C27.43,15.186,25.645,16.973,23.436,16.979z" + SVGIcons["snow"] = "M25.372,6.912c-0.093-3.925-3.302-7.078-7.248-7.08c-2.638,0.002-4.942,1.412-6.208,3.518c-0.595-0.327-1.28-0.518-2.01-0.518C7.627,2.834,5.773,4.639,5.69,6.898c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h15.875c3.312,0,6-2.688,6-6C29.434,9.944,27.732,7.715,25.372,6.912zM23.436,16.584H7.562c-2.209-0.006-3.997-1.793-4.001-4c-0.002-1.983,1.45-3.619,3.35-3.933c0.265-0.043,0.502-0.19,0.657-0.414C7.723,8.015,7.78,7.74,7.731,7.475C7.703,7.326,7.686,7.187,7.686,7.051c0.004-1.225,0.995-2.217,2.22-2.219c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.31c0.342-0.066,0.626-0.308,0.748-0.631c0.749-1.992,2.662-3.412,4.911-3.41c2.898,0.004,5.244,2.351,5.251,5.25c0,0.16-0.009,0.325-0.026,0.496c-0.05,0.518,0.305,0.984,0.814,1.079c1.859,0.345,3.273,1.966,3.271,3.923C27.43,14.791,25.645,16.578,23.436,16.584zM16.667,24.09l1.119-1.119c0.389-0.391,0.389-1.025,0-1.416c-0.392-0.391-1.025-0.391-1.415,0l-1.119,1.119l-1.119-1.119c-0.391-0.391-1.025-0.391-1.415,0c-0.391,0.391-0.391,1.025,0,1.416l1.118,1.117l-1.12,1.121c-0.389,0.393-0.389,1.021,0,1.414c0.195,0.188,0.451,0.293,0.707,0.293c0.256,0,0.512-0.104,0.708-0.293l1.12-1.119l1.12,1.119c0.195,0.188,0.451,0.293,0.708,0.293c0.256,0,0.512-0.104,0.707-0.293c0.391-0.396,0.391-1.021,0-1.414L16.667,24.09zM25.119,21.817c-0.393-0.392-1.025-0.392-1.415,0l-1.12,1.121l-1.12-1.121c-0.391-0.392-1.022-0.392-1.414,0c-0.39,0.392-0.39,1.022,0,1.416l1.119,1.119l-1.119,1.119c-0.39,0.391-0.39,1.022,0,1.413c0.195,0.195,0.451,0.294,0.707,0.294c0.257,0,0.513-0.099,0.707-0.294l1.12-1.118l1.12,1.118c0.194,0.195,0.45,0.294,0.707,0.294c0.256,0,0.513-0.099,0.708-0.294c0.389-0.391,0.389-1.022,0-1.413l-1.12-1.119l1.12-1.119C25.507,22.842,25.507,22.209,25.119,21.817zM9.334,23.953l1.119-1.119c0.389-0.394,0.389-1.021,0-1.414c-0.391-0.394-1.025-0.394-1.415,0l-1.119,1.119l-1.12-1.121c-0.391-0.39-1.023-0.39-1.415,0c-0.391,0.396-0.391,1.024,0,1.418l1.119,1.117l-1.12,1.118c-0.391,0.394-0.391,1.025,0,1.414c0.196,0.195,0.452,0.293,0.708,0.293c0.256,0,0.511-0.098,0.707-0.293l1.12-1.119l1.121,1.121c0.195,0.195,0.451,0.293,0.707,0.293s0.513-0.098,0.708-0.293c0.389-0.391,0.389-1.022,0-1.416L9.334,23.953z" + SVGIcons["hail"] = "M25.372,6.912c-0.093-3.925-3.302-7.078-7.248-7.08c-2.638,0.002-4.942,1.412-6.208,3.518c-0.595-0.327-1.28-0.518-2.01-0.518C7.627,2.834,5.773,4.639,5.69,6.898c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h15.875c3.312,0,6-2.688,6-6C29.434,9.944,27.732,7.715,25.372,6.912zM23.436,16.584H7.562c-2.209-0.006-3.997-1.793-4.001-4c-0.002-1.983,1.45-3.619,3.35-3.933c0.265-0.043,0.502-0.19,0.657-0.414C7.723,8.015,7.78,7.74,7.731,7.475C7.703,7.326,7.686,7.187,7.686,7.051c0.004-1.225,0.995-2.217,2.22-2.219c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.31c0.342-0.066,0.626-0.308,0.748-0.631c0.749-1.992,2.662-3.412,4.911-3.41c2.898,0.004,5.244,2.351,5.251,5.25c0,0.16-0.009,0.325-0.026,0.496c-0.05,0.518,0.305,0.984,0.814,1.079c1.859,0.345,3.273,1.966,3.271,3.923C27.43,14.791,25.645,16.578,23.436,16.584zM11.503,23.709c-0.784-0.002-1.418-0.636-1.418-1.416c0-0.785,0.634-1.416,1.418-1.418c0.78,0.002,1.413,0.633,1.416,1.418C12.917,23.073,12.284,23.707,11.503,23.709zM19.002,23.709c-0.783-0.002-1.418-0.636-1.418-1.416c0-0.785,0.635-1.416,1.418-1.418c0.779,0.002,1.414,0.633,1.414,1.418C20.417,23.073,19.784,23.707,19.002,23.709zM7.503,28.771c-0.783-0.002-1.417-0.637-1.417-1.418s0.634-1.414,1.417-1.416c0.78,0.002,1.415,0.635,1.415,1.416C8.917,28.135,8.284,28.77,7.503,28.771zM15.001,28.771c-0.782-0.002-1.417-0.637-1.417-1.418s0.634-1.414,1.417-1.416c0.78,0.002,1.413,0.635,1.415,1.416C16.415,28.135,15.784,28.77,15.001,28.771zM22.5,28.771c-0.782-0.002-1.416-0.634-1.416-1.416c0-0.785,0.634-1.418,1.416-1.42c0.781,0.002,1.414,0.635,1.418,1.42C23.915,28.138,23.282,28.77,22.5,28.771z" + SVGIcons["rain"] = "M25.371,7.306c-0.092-3.924-3.301-7.077-7.248-7.079c-2.638,0.001-4.942,1.412-6.208,3.517c-0.595-0.327-1.28-0.517-2.01-0.517C7.626,3.229,5.772,5.033,5.689,7.293c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h15.874c3.312,0,6-2.688,6-6C29.434,10.34,27.732,8.11,25.371,7.306zM23.436,16.979H7.561c-2.209-0.006-3.997-1.792-4.001-4.001c-0.002-1.982,1.45-3.618,3.35-3.931c0.265-0.043,0.502-0.191,0.657-0.414C7.722,8.41,7.779,8.136,7.73,7.87C7.702,7.722,7.685,7.582,7.685,7.446C7.689,6.221,8.68,5.23,9.905,5.228c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.309c0.342-0.066,0.626-0.307,0.748-0.63c0.749-1.992,2.662-3.412,4.911-3.41c2.899,0.004,5.244,2.35,5.251,5.249c0,0.161-0.009,0.326-0.027,0.497c-0.049,0.517,0.305,0.984,0.815,1.079c1.86,0.344,3.274,1.966,3.271,3.923C27.43,15.186,25.645,16.973,23.436,16.979zM9.029,26.682c0-1.115,0.021-5.425,0.021-5.432c0.002-0.409-0.247-0.779-0.628-0.932c-0.38-0.152-0.815-0.059-1.099,0.24c-0.006,0.008-1.037,1.098-2.081,2.342c-0.523,0.627-1.048,1.287-1.463,1.896c-0.399,0.648-0.753,1.066-0.811,1.885C2.971,28.355,4.324,29.711,6,29.714C7.672,29.71,9.029,28.354,9.029,26.682zM4.971,26.727c0.091-0.349,1.081-1.719,1.993-2.764c0.025-0.029,0.051-0.061,0.076-0.089c-0.005,1.124-0.01,2.294-0.01,2.808c0,0.567-0.461,1.028-1.029,1.03C5.447,27.71,4.997,27.273,4.971,26.727zM16.425,26.682c0-1.115,0.021-5.424,0.021-5.43c0.002-0.41-0.247-0.779-0.628-0.934c-0.381-0.152-0.814-0.058-1.1,0.242c-0.006,0.008-1.035,1.094-2.08,2.342c-0.522,0.623-1.047,1.285-1.463,1.894c-0.399,0.649-0.753,1.068-0.809,1.888c0,1.672,1.354,3.028,3.029,3.028C15.068,29.711,16.425,28.354,16.425,26.682zM12.365,26.729c0.092-0.349,1.081-1.72,1.993-2.765c0.025-0.03,0.05-0.06,0.075-0.089c-0.005,1.123-0.011,2.294-0.011,2.807c-0.002,0.568-0.461,1.027-1.028,1.029C12.84,27.709,12.392,27.273,12.365,26.729zM23.271,20.317c-0.38-0.153-0.816-0.06-1.099,0.24c-0.009,0.008-1.037,1.097-2.08,2.342c-0.523,0.625-1.049,1.285-1.462,1.896c-0.402,0.649-0.754,1.067-0.812,1.886c0,1.672,1.354,3.029,3.03,3.029c1.673,0,3.027-1.357,3.027-3.029c0-1.115,0.022-5.425,0.022-5.431C23.9,20.84,23.651,20.47,23.271,20.317zM21.879,26.681c-0.004,0.568-0.463,1.027-1.031,1.029c-0.553-0.002-1.002-0.438-1.028-0.982c0.092-0.349,1.081-1.72,1.993-2.765c0.025-0.028,0.05-0.059,0.074-0.088C21.883,24.998,21.879,26.167,21.879,26.681z" + SVGIcons["cloudy"] = "M14.378,6.781c0.41,0.988,1.938,0.346,1.524-0.648C15.708,5.667,15.515,5.2,15.32,4.734c-0.289-0.695-0.875-3.233-2.042-2.747c-1.03,0.433-0.128,1.846,0.142,2.494C13.739,5.248,14.059,6.015,14.378,6.781M20.8,7.223c1.094,0.453,1.538-1.551,1.813-2.216c0.281-0.677,1.478-2.565,0.357-3.029c-1.092-0.453-1.537,1.548-1.813,2.216C20.876,4.872,19.68,6.757,20.8,7.223M18.137,6.692c1.183,0,0.829-2.019,0.829-2.742c0-0.732,0.383-2.935-0.829-2.935c-1.183,0-0.828,2.019-0.828,2.742C17.309,4.49,16.926,6.692,18.137,6.692M23.058,8.729c0.852,0.85,2.142-0.972,2.659-1.49c0.512-0.513,2.187-1.687,1.352-2.524c-0.834-0.836-2.013,0.843-2.522,1.353C24.028,6.585,22.198,7.874,23.058,8.729M24.565,10.986c0.448,1.091,2.183-0.01,2.849-0.286c0.676-0.28,2.858-0.771,2.394-1.89c-0.455-1.091-2.181,0.008-2.849,0.285C26.281,9.377,24.102,9.866,24.565,10.986M12.036,8.742c0.752,0.75,1.932-0.415,1.17-1.173c-0.253-0.347-0.646-0.645-0.949-0.946c-0.541-0.539-2.162-2.799-3.068-1.889c-0.79,0.791,0.586,1.755,1.083,2.25C10.859,7.57,11.447,8.156,12.036,8.742M29.365,17.397c-0.768-0.317-1.534-0.635-2.302-0.952c-0.646-0.268-2.07-1.169-2.495-0.135c-0.481,1.168,2.054,1.747,2.751,2.035c0.455,0.188,0.911,0.377,1.367,0.565C29.7,19.331,30.379,17.816,29.365,17.397M29.942,12.817c-0.83,0-1.66,0-2.49,0c-0.701,0-2.357-0.288-2.355,0.83c0,1.262,2.567,0.827,3.319,0.827c0.493,0,0.986,0,1.479-0.001C30.99,14.473,31.043,12.815,29.942,12.817M24.234,18.568c-0.673-0.673-1.773,0.189-1.281,1.007c-0.295-0.264-0.614-0.499-0.961-0.69c3.894-2.866,3.328-9.006-1.021-11.107c-2.024-0.978-4.481-0.828-6.368,0.394c-0.871,0.564-1.603,1.336-2.119,2.236c-0.262,0.456-0.468,0.943-0.612,1.449c-0.074,0.258-0.131,0.521-0.172,0.786c-0.083,0.534-0.109,0.553-0.553,0.871c-0.182-0.957-1.64-0.675-2.326-0.674c-0.815,0.001-1.963-0.217-2.752,0.046c-0.867,0.289-0.652,1.615,0.263,1.613c0.324,0.052,0.701-0.001,1.028-0.001c0.904-0.001,1.809-0.002,2.713-0.003c-0.308,0.352-0.496,0.969-0.94,0.77c-0.467-0.209-0.978-0.319-1.49-0.319c-0.951,0-1.877,0.375-2.561,1.036c-0.681,0.658-1.088,1.569-1.123,2.516c-0.944,0.31-1.791,0.891-2.421,1.658c-2.756,3.354-0.265,8.554,4.058,8.554v-0.002c3.597,0,7.194,0,10.792,0c1.341,0,2.843,0.167,4.168-0.113c3.652-0.772,5.361-5.21,3.133-8.229c0.548,0.547,1.096,1.094,1.644,1.641c0.183,0.183,0.364,0.424,0.575,0.574c0.552,0.552,1.524,0.066,1.403-0.713c-0.097-0.622-1.042-1.267-1.448-1.673C25.319,19.652,24.776,19.11,24.234,18.568M18.137,8.787c4.559,0.009,6.576,5.979,2.912,8.734c-0.637-3.505-4.161-5.824-7.629-5.03C13.943,10.367,15.852,8.792,18.137,8.787M22.895,24.08c-0.633,3.346-4.149,2.879-6.68,2.879c-3.017,0-6.033,0-9.049,0c-0.767,0-1.62,0.084-2.373-0.095c-2.274-0.538-3.416-3.242-2.172-5.235c0.678-1.087,1.568-1.19,2.626-1.67c0.604-0.273,0.456-0.807,0.456-1.331c0.002-0.597,0.284-1.169,0.756-1.533c0.787-0.608,1.943-0.497,2.611,0.234c1.098,1.205,1.96-1.346,2.507-1.893c2.025-2.025,5.475-1.708,7.068,0.684c0.344,0.516,0.581,1.102,0.693,1.712c0.097,0.529-0.115,1.341,0.188,1.796c0.291,0.47,0.943,0.463,1.397,0.68c0.508,0.23,0.963,0.591,1.304,1.034C22.834,22.125,23.064,23.107,22.895,24.08M6.906,9.917c0.881,0.364,1.763,0.727,2.644,1.091c0.353,0.146,0.707,0.292,1.06,0.437c0.997,0.412,1.637-1.119,0.642-1.526C10.47,9.441,9.456,9.177,8.609,8.828c-0.354-0.146-0.707-0.292-1.06-0.437C6.554,7.98,5.912,9.505,6.906,9.917" + SVGIcons["sun"] = "M15.502,7.504c-4.35,0-7.873,3.523-7.873,7.873c0,4.347,3.523,7.872,7.873,7.872c4.346,0,7.871-3.525,7.871-7.872C23.374,11.027,19.85,7.504,15.502,7.504zM15.502,21.25c-3.244-0.008-5.866-2.63-5.874-5.872c0.007-3.243,2.63-5.866,5.874-5.874c3.242,0.008,5.864,2.631,5.871,5.874C21.366,18.62,18.744,21.242,15.502,21.25zM15.502,6.977c0.553,0,1-0.448,1-1.001V1.125c-0.002-0.553-0.448-1-1-1c-0.553,0-1.001,0.449-1,1.002v4.85C14.502,6.528,14.949,6.977,15.502,6.977zM18.715,7.615c0.125,0.053,0.255,0.076,0.382,0.077c0.394,0,0.765-0.233,0.925-0.618l1.856-4.483c0.21-0.511-0.031-1.095-0.541-1.306c-0.511-0.211-1.096,0.031-1.308,0.541L18.174,6.31C17.963,6.82,18.205,7.405,18.715,7.615zM21.44,9.436c0.195,0.194,0.451,0.293,0.707,0.293s0.512-0.098,0.707-0.293l3.43-3.433c0.391-0.39,0.39-1.023,0-1.415c-0.392-0.39-1.025-0.39-1.415,0.002L21.44,8.021C21.049,8.412,21.049,9.045,21.44,9.436zM23.263,12.16c0.158,0.385,0.531,0.617,0.923,0.617c0.127,0,0.257-0.025,0.383-0.078l4.48-1.857c0.511-0.211,0.753-0.797,0.541-1.307s-0.796-0.752-1.307-0.54l-4.481,1.857C23.292,11.064,23.051,11.65,23.263,12.16zM29.752,14.371l-4.851,0.001c-0.552,0-1,0.448-0.998,1.001c0,0.553,0.447,0.999,0.998,0.999l4.852-0.002c0.553,0,0.999-0.449,0.999-1C30.752,14.817,30.304,14.369,29.752,14.371zM29.054,19.899l-4.482-1.854c-0.512-0.212-1.097,0.03-1.307,0.541c-0.211,0.511,0.031,1.096,0.541,1.308l4.482,1.854c0.126,0.051,0.256,0.075,0.383,0.075c0.393,0,0.765-0.232,0.925-0.617C29.806,20.695,29.563,20.109,29.054,19.899zM22.86,21.312c-0.391-0.391-1.023-0.391-1.414,0.001c-0.391,0.39-0.39,1.022,0,1.413l3.434,3.429c0.195,0.195,0.45,0.293,0.706,0.293s0.513-0.098,0.708-0.293c0.391-0.392,0.389-1.025,0-1.415L22.86,21.312zM20.029,23.675c-0.211-0.511-0.796-0.752-1.307-0.541c-0.51,0.212-0.752,0.797-0.54,1.308l1.86,4.48c0.159,0.385,0.531,0.617,0.925,0.617c0.128,0,0.258-0.024,0.383-0.076c0.511-0.211,0.752-0.797,0.54-1.309L20.029,23.675zM15.512,23.778c-0.553,0-1,0.448-1,1l0.004,4.851c0,0.553,0.449,0.999,1,0.999c0.553,0,1-0.448,0.998-1l-0.003-4.852C16.511,24.226,16.062,23.777,15.512,23.778zM12.296,23.142c-0.51-0.21-1.094,0.031-1.306,0.543l-1.852,4.483c-0.21,0.511,0.033,1.096,0.543,1.307c0.125,0.052,0.254,0.076,0.382,0.076c0.392,0,0.765-0.234,0.924-0.619l1.853-4.485C13.051,23.937,12.807,23.353,12.296,23.142zM9.57,21.325c-0.392-0.391-1.025-0.389-1.415,0.002L4.729,24.76c-0.391,0.392-0.389,1.023,0.002,1.415c0.195,0.194,0.45,0.292,0.706,0.292c0.257,0,0.513-0.098,0.708-0.293l3.427-3.434C9.961,22.349,9.961,21.716,9.57,21.325zM7.746,18.604c-0.213-0.509-0.797-0.751-1.307-0.54L1.96,19.925c-0.511,0.212-0.752,0.798-0.54,1.308c0.16,0.385,0.531,0.616,0.924,0.616c0.127,0,0.258-0.024,0.383-0.076l4.479-1.861C7.715,19.698,7.957,19.113,7.746,18.604zM7.1,15.392c0-0.553-0.447-0.999-1-0.999l-4.851,0.006c-0.553,0-1.001,0.448-0.999,1.001c0.001,0.551,0.449,1,1,0.998l4.852-0.006C6.654,16.392,7.102,15.942,7.1,15.392zM1.944,10.869l4.485,1.85c0.125,0.053,0.254,0.076,0.381,0.076c0.393,0,0.766-0.232,0.925-0.618c0.212-0.511-0.032-1.097-0.544-1.306L2.708,9.021c-0.511-0.21-1.095,0.032-1.306,0.542C1.19,10.074,1.435,10.657,1.944,10.869zM8.137,9.451c0.195,0.193,0.449,0.291,0.705,0.291s0.513-0.098,0.709-0.295c0.391-0.389,0.389-1.023-0.004-1.414L6.113,4.609C5.723,4.219,5.088,4.221,4.699,4.612c-0.391,0.39-0.389,1.024,0.002,1.414L8.137,9.451zM10.964,7.084c0.16,0.384,0.532,0.615,0.923,0.615c0.128,0,0.258-0.025,0.384-0.077c0.51-0.212,0.753-0.798,0.54-1.307l-1.864-4.479c-0.212-0.51-0.798-0.751-1.308-0.539C9.129,1.51,8.888,2.096,9.1,2.605L10.964,7.084z" + SVGIcons["undo"] = "M12.981,9.073V6.817l-12.106,6.99l12.106,6.99v-2.422c3.285-0.002,9.052,0.28,9.052,2.269c0,2.78-6.023,4.263-6.023,4.263v2.132c0,0,13.53,0.463,13.53-9.823C29.54,9.134,17.952,8.831,12.981,9.073z" + SVGIcons["detour"] = "M29.342,15.5l-7.556-4.363v2.614H18.75c-1.441-0.004-2.423,1.002-2.875,1.784c-0.735,1.222-1.056,2.561-1.441,3.522c-0.135,0.361-0.278,0.655-0.376,0.817c-1.626,0-0.998,0-2.768,0c-0.213-0.398-0.571-1.557-0.923-2.692c-0.237-0.676-0.5-1.381-1.013-2.071C8.878,14.43,7.89,13.726,6.75,13.75H2.812v3.499c0,0,0.358,0,1.031,0h2.741c0.008,0.013,0.018,0.028,0.029,0.046c0.291,0.401,0.634,1.663,1.031,2.888c0.218,0.623,0.455,1.262,0.92,1.897c0.417,0.614,1.319,1.293,2.383,1.293H11c2.25,0,1.249,0,3.374,0c0.696,0.01,1.371-0.286,1.809-0.657c1.439-1.338,1.608-2.886,2.13-4.127c0.218-0.608,0.453-1.115,0.605-1.314c0.006-0.01,0.012-0.018,0.018-0.025h2.85v2.614L29.342,15.5zM10.173,14.539c0.568,0.76,0.874,1.559,1.137,2.311c0.04,0.128,0.082,0.264,0.125,0.399h2.58c0.246-0.697,0.553-1.479,1.005-2.228c0.252-0.438,0.621-0.887,1.08-1.272H9.43C9.735,14.003,9.99,14.277,10.173,14.539z" + SVGIcons["merge"] = "M29.342,15.5l-7.556-4.363v2.613h-1.411c-0.788-0.01-1.331-0.241-2.019-0.743c-1.021-0.745-2.094-2.181-3.551-3.568C13.367,8.06,11.291,6.73,8.5,6.749H2.812v3.5H8.5c2.231,0.012,3.441,1.185,5.07,2.934c0.697,0.753,1.428,1.58,2.324,2.323c-1.396,1.165-2.412,2.516-3.484,3.501c-1.183,1.081-2.202,1.723-3.912,1.741H2.813v3.5h5.716c3.752,0.001,6.035-2.319,7.619-4.066c0.817-0.895,1.537-1.691,2.209-2.191c0.686-0.502,1.23-0.732,2.017-0.742h1.412v2.614L29.342,15.5z" + SVGIcons["split"] = "M21.786,20.698c-1.792-0.237-2.912-1.331-4.358-2.886c-0.697-0.751-1.428-1.577-2.324-2.319c1.396-1.165,2.411-2.519,3.483-3.503c1.01-0.92,1.901-1.519,3.199-1.688v2.574l7.556-4.363L21.786,4.15v2.652c-3.34,0.266-5.45,2.378-6.934,4.013c-0.819,0.896-1.537,1.692-2.212,2.192c-0.685,0.501-1.227,0.731-2.013,0.742c-0.001,0-0.002,0-0.003,0H2.812v3.5h0.001v0.001c0,0,0.046-0.001,0.136-0.001h7.677c0.786,0.011,1.33,0.241,2.017,0.743c1.021,0.743,2.095,2.181,3.552,3.568c1.312,1.258,3.162,2.46,5.592,2.649v2.664l7.556-4.36l-7.556-4.361V20.698z" + SVGIcons["fork"] = "M13.741,10.249h8.045v2.627l7.556-4.363l-7.556-4.363v2.598H9.826C11.369,7.612,12.616,8.922,13.741,10.249zM21.786,20.654c-0.618-0.195-1.407-0.703-2.291-1.587c-1.79-1.756-3.712-4.675-5.731-7.227c-2.049-2.486-4.159-4.972-7.451-5.091h-3.5v3.5h3.5c0.656-0.027,1.683,0.486,2.879,1.683c1.788,1.753,3.712,4.674,5.731,7.226c1.921,2.331,3.907,4.639,6.863,5.016v2.702l7.556-4.362l-7.556-4.362V20.654z" + SVGIcons["exchange"] = "M21.786,12.876l7.556-4.363l-7.556-4.363v2.598H2.813v3.5h18.973V12.876zM10.368,18.124l-7.556,4.362l7.556,4.362V24.25h18.974v-3.501H10.368V18.124z" + SVGIcons["shuffle"] = "M21.786,20.654c-0.618-0.195-1.407-0.703-2.291-1.587c-0.757-0.742-1.539-1.698-2.34-2.741c-0.191,0.256-0.382,0.51-0.574,0.77c-0.524,0.709-1.059,1.424-1.604,2.127c1.904,2.31,3.88,4.578,6.809,4.952v2.701l7.556-4.362l-7.556-4.362V20.654zM9.192,11.933c0.756,0.741,1.538,1.697,2.339,2.739c0.195-0.262,0.39-0.521,0.587-0.788c0.52-0.703,1.051-1.412,1.592-2.11c-2.032-2.463-4.133-4.907-7.396-5.025h-3.5v3.5h3.5C6.969,10.223,7.996,10.735,9.192,11.933zM21.786,10.341v2.535l7.556-4.363l-7.556-4.363v2.647c-1.904,0.219-3.425,1.348-4.751,2.644c-2.196,2.183-4.116,5.167-6.011,7.538c-1.867,2.438-3.741,3.888-4.712,3.771h-3.5v3.5h3.5c2.185-0.029,3.879-1.266,5.34-2.693c2.194-2.184,4.116-5.167,6.009-7.538C19.205,12.003,20.746,10.679,21.786,10.341z" + SVGIcons["refresh"] = "M24.083,15.5c-0.009,4.739-3.844,8.574-8.583,8.583c-4.741-0.009-8.577-3.844-8.585-8.583c0.008-4.741,3.844-8.577,8.585-8.585c1.913,0,3.665,0.629,5.09,1.686l-1.782,1.783l8.429,2.256l-2.26-8.427l-1.89,1.89c-2.072-1.677-4.717-2.688-7.587-2.688C8.826,3.418,3.418,8.826,3.416,15.5C3.418,22.175,8.826,27.583,15.5,27.583S27.583,22.175,27.583,15.5H24.083z" + SVGIcons["ccw"] = "M24.249,15.499c-0.009,4.832-3.918,8.741-8.75,8.75c-2.515,0-4.768-1.064-6.365-2.763l2.068-1.442l-7.901-3.703l0.744,8.694l2.193-1.529c2.244,2.594,5.562,4.242,9.26,4.242c6.767,0,12.249-5.482,12.249-12.249H24.249zM15.499,6.75c2.516,0,4.769,1.065,6.367,2.764l-2.068,1.443l7.901,3.701l-0.746-8.693l-2.192,1.529c-2.245-2.594-5.562-4.245-9.262-4.245C8.734,3.25,3.25,8.734,3.249,15.499H6.75C6.758,10.668,10.668,6.758,15.499,6.75z" + SVGIcons["acw"] = "M19.275,3.849l1.695,8.56l1.875-1.642c2.311,3.59,1.72,8.415-1.584,11.317c-2.24,1.96-5.186,2.57-7.875,1.908l-0.84,3.396c3.75,0.931,7.891,0.066,11.02-2.672c4.768-4.173,5.521-11.219,1.94-16.279l2.028-1.775L19.275,3.849zM8.154,20.232c-2.312-3.589-1.721-8.416,1.582-11.317c2.239-1.959,5.186-2.572,7.875-1.909l0.842-3.398c-3.752-0.93-7.893-0.067-11.022,2.672c-4.765,4.174-5.519,11.223-1.939,16.283l-2.026,1.772l8.26,2.812l-1.693-8.559L8.154,20.232z" + SVGIcons["contract"] = "M25.083,18.895l-8.428-2.259l2.258,8.428l1.838-1.837l7.053,7.053l2.476-2.476l-7.053-7.053L25.083,18.895zM5.542,11.731l8.428,2.258l-2.258-8.428L9.874,7.398L3.196,0.72L0.72,3.196l6.678,6.678L5.542,11.731zM7.589,20.935l-6.87,6.869l2.476,2.476l6.869-6.869l1.858,1.857l2.258-8.428l-8.428,2.258L7.589,20.935zM23.412,10.064l6.867-6.87l-2.476-2.476l-6.868,6.869l-1.856-1.856l-2.258,8.428l8.428-2.259L23.412,10.064z" + // + SVGIcons["home"] = "M27.812,16l-3.062-3.062V5.625h-2.625v4.688L16,4.188L4.188,16L7,15.933v11.942h17.875V16H27.812zM16,26.167h-5.833v-7H16V26.167zM21.667,23.167h-3.833v-4.042h3.833V23.167z" + SVGIcons["user"] = "M20.771,12.364c0,0,0.849-3.51,0-4.699c-0.85-1.189-1.189-1.981-3.058-2.548s-1.188-0.454-2.547-0.396c-1.359,0.057-2.492,0.792-2.492,1.188c0,0-0.849,0.057-1.188,0.397c-0.34,0.34-0.906,1.924-0.906,2.321s0.283,3.058,0.566,3.624l-0.337,0.113c-0.283,3.283,1.132,3.68,1.132,3.68c0.509,3.058,1.019,1.756,1.019,2.548s-0.51,0.51-0.51,0.51s-0.452,1.245-1.584,1.698c-1.132,0.452-7.416,2.886-7.927,3.396c-0.511,0.511-0.453,2.888-0.453,2.888h26.947c0,0,0.059-2.377-0.452-2.888c-0.512-0.511-6.796-2.944-7.928-3.396c-1.132-0.453-1.584-1.698-1.584-1.698s-0.51,0.282-0.51-0.51s0.51,0.51,1.02-2.548c0,0,1.414-0.397,1.132-3.68H20.771z" + // + SVG_object.Total = "0" +} diff --git a/goDataverse/tools/tools.go b/goDataverse/tools/tools.go new file mode 100644 index 0000000..32a6620 --- /dev/null +++ b/goDataverse/tools/tools.go @@ -0,0 +1,641 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package tools + +import ( + "encoding/json" + "log" + + "errors" + // "fmt" + "html" + "net/http" + + "reflect" + "regexp" + "strings" + "time" + + def "Toolbox/defaults" + pog "Toolbox/postgres" + sql "database/sql" + + gjs "github.com/tidwall/gjson" +) + +type TJson []map[string]interface{} + +type TDVParams struct { + DP_datasetId string // + DP_datasetPid string // + DP_datasetVersion string // + DP_localeCode string // + DP_fileId string // + DP_filePid string // + DP_apiKey string // + DP_siteUrl string // + DP_alias string // + DP_routeUrl string // +} + +type TFVParams struct { + FP_suid string // generierte suid (js) + FP_type string // 'json', 'html'.. + FP_info string // optionale info (bsp.: 'read json grid') + FP_func string // 'getHtml', 'getValues'.. + FP_modl string // 'app.active_module' (js) + FP_what string // 'menu', 'datagrid', 'propgrid', 'login'.. + FP_suff string // 'login' + FP_extn string // '.txt'. '.json'.. + FP_from string // 'db', 'file', 'dataverse'.. + FP_user string // + FP_proj string // 'projektname aus tabelle' + FP_who string // art der daten - 'user', 'data'... + FP_time string // übergabe zeitpunkt. + FP_alias string // alias für dataverse grid + FP_dois string // liste der "dois" für sicherung + FP_rout string // umleitung beim ausloggen + FP_refr bool // refresh der session möglich + // für svg + FP_shad string // svg-schatten + FP_widt string // svg-breite + FP_heit string // svg-höhe + FP_matx string // svg-transfor.matrix + FP_view string // svg-viewbox + // + FP_qery string // abfrage-string + // + FP_parm ColMapInt +} + +type TFileColumns struct { + FC_sequence string + FC_field string + FC_title string + FC_isvisible bool +} + +type TValueRow struct { + VR_key string + VR_value string +} + +type TUserEntry struct { + UE_Done bool + UE_IpAddress string + UE_IpPort string + UE_IdleTime time.Time + UE_Released time.Time + UE_DVParams TDVParams + UE_FVParams TFVParams + UE_DBConn *sql.DB + UE_Datasets string +} + +type SVGMap map[string]string +type ColMap map[string]string +type JsnColMap map[string]interface{} +type ColMapInt map[int]map[string]string +type RowMap map[string]map[string]string +type JsnMapInt map[int]map[string]interface{} +type TUserEntries map[string]TUserEntry +type TDatasetEntries map[string]string + +type TDataverse JsnColMap + +// dataverse +var Dp TDVParams +var Fp TFVParams +var Ue TUserEntries +var Ds TDatasetEntries + +var icnt int = 0 +var Col = "" +var Val = "" + +var Source string = "head;menu;grid;propgrid;content;login;" + +// +var DataColList ColMap = make(ColMap, 0) +var FileColList ColMap = make(ColMap, 0) + +func CheckConnection(_fparam TFVParams) (*sql.DB, error) { + var err error = errors.New("SUID not found.") + if len(_fparam.FP_suid) > 0 { + var ok bool = false + var ue TUserEntry + // + ue, ok = Ue[_fparam.FP_suid] + if ok { + // fmt.Println("CheckConnection(entry):", _fparam.FP_suid, ue.UE_DBConn) + if ue.UE_DBConn == nil { + ue.UE_DBConn, err = pog.GetConnection() + if err == nil { + //fmt.Println("CheckConnection(created 1):", _fparam.FP_suid, ue.UE_DBConn) + Ue[_fparam.FP_suid] = ue + return ue.UE_DBConn, nil + } + } else { + return ue.UE_DBConn, nil + } + } + } + // + return nil, err +} + +func CloseConnection(_fparam TFVParams) error { + // var err error = errors.New("SUID not found.") + var ue TUserEntry = Ue[_fparam.FP_suid] + pog.CloseConnection(ue.UE_DBConn) + // + return nil +} + +func RemoveLBR(text string, repl string) string { + re := regexp.MustCompile(`\x{000D}\x{000A}|[\x{000A}\x{000B}\x{000C}\x{000D}\x{0085}\x{2028}\x{2029}]`) + return re.ReplaceAllString(text, repl) +} + +func PrintMap(_map map[string][]string) { + for key, value := range _map { + for fkey, fvalue := range value { + log.Println(key, " has ", fkey, ":", fvalue) + } + } +} + +func GetIP(_r *http.Request) string { + forwarded := _r.Header.Get("X-FORWARDED-FOR") + if forwarded != "" { + return forwarded + } + return _r.RemoteAddr +} + +func GetApiKey(_dp TDVParams) string { + var apikey string = def.DEF_apikey + if len(_dp.DP_apiKey) > 0 { + apikey = _dp.DP_apiKey + } + // + return apikey +} + +func GetSiteUrl(_dp TDVParams) string { + var siteurl string = def.DEF_siteurl + if len(_dp.DP_siteUrl) > 0 { + siteurl = _dp.DP_siteUrl + } + // + return siteurl +} + +func GetRouteUrl(_dp TDVParams) string { + var siteurl string = def.DEF_routeurl + if len(_dp.DP_routeUrl) > 0 { + siteurl = _dp.DP_routeUrl + } + // + return siteurl +} + +// get string between (tools) +func GetstringBetween(_string string, _start string, _end string) string { + var str = "" + _string + var s = strings.Index(str, _start) + if s == -1 { + return "" + } + s += len(_start) + e := strings.Index(str, _end) + if e == -1 { + return "" + } + return str[s:e] +} + +func AddStrings(_sum, _val string, _sep string) string { + if len(_sum) > 0 { + return _sum + _sep + _val + } + return _val +} + +func UniqueStrings(_str, _sep string) string { + m := make(map[string]bool) + keys := make([]string, 0) + for _, c := range strings.Split(_str, _sep) { + if _, ok := m[c]; !ok { + m[c] = true + keys = append(keys, c) + } + } + // + return strings.Join(keys, _sep) +} + +func JsonEscape(i string) string { + b, err := json.Marshal(i) + if err != nil { + def.LogError("JsonEscape()", err) + panic(err) + } + s := string(b) + // + return s[1 : len(s)-1] +} + +func GetTabLevel(_level int64) string { + var tab string = "" + for i := 0; i < int(_level); i++ { + tab = tab + "\t" + } + // + return tab +} + +func GetTab10(_level int) (string, string) { + var taba string = "\t" + var tabb string = "\t\t" + var level int = _level + for { + if level < 10 { + break + } + taba = taba + "\t" + tabb = tabb + "\t" + level = level / 10 + } + // + return taba, tabb +} + +func GetJsonResult(_base gjs.Result, _key string) gjs.Result { + return gjs.Get(_base.String(), _key) +} + +func GetJsonString(_base gjs.Result, _key string) string { + return GetJsonResult(_base, _key).String() +} + +func GetJsonInt(_base gjs.Result, _key string) int64 { + return GetJsonResult(_base, _key).Int() +} + +func GetObjectFromStr(_objstr string) gjs.Result { + var resobj gjs.Result = gjs.Get(`{"data":`+_objstr+`}`, "data") + // + return resobj +} + +func DoFilterByJsonStr(_objstr gjs.Result) gjs.Result { + if _objstr.Type == gjs.String { + _objstr = GetObjectFromStr(string(`"` + DoFilterByStr(_objstr.String()) + `"`)) + } + // + return _objstr +} + +func DoFilterByStr(_str string) string { + var svalue string = strings.ReplaceAll(_str, "\n", " ") + if reflect.TypeOf(_str).Name() == "string" { + if strings.Contains(_str, `"`) { + evalarr := strings.Split(_str, `"`) + if len(evalarr) > 0 { + smarshall, err := json.Marshal(_str) + if err != nil { + svalue = "Wrong count of double quoted sign." + } else { + svalue = strings.Trim(string(smarshall), `"`) + } + } else { + svalue = html.EscapeString(svalue) + // svalue = strings.ReplaceAll(svalue, `"`, """) + } + } + } + svalue = strings.ReplaceAll(svalue, "\t", " ") + // + return svalue +} + +func JsonSearch(_json gjs.Result, _key, _value string, _level int64, _caption gjs.Result) (gjs.Result, bool) { + if _level == 0 { + _caption.Type = gjs.Null + } else { + if _caption.Type != gjs.Null { + _caption = DoFilterByJsonStr(_caption) + // + return _caption, true + } + } + var result bool = false + if _json.IsObject() { + var keysearch bool = (len(_key) > 0) + _json.ForEach(func(jkey, jvalue gjs.Result) bool { + if jvalue.IsArray() { + _caption, result = JsonSearch(jvalue, _key, _value, _level+1, _caption) + // fmt.Println(GetTabLevel(_level), "(oa)", jkey, "=", _caption) + } else { + if jvalue.IsObject() { + _caption, result = JsonSearch(jvalue, _key, _value, _level+1, _caption) + // fmt.Println(GetTabLevel(_level), "(oo)", jkey, "=", _caption) + } else { + // fmt.Println(GetTabLevel(_level), "(ov)", _key, _value, jkey, "=", jvalue) + if keysearch { + if jkey.String() == _key { + if jvalue.String() == _value { + _caption = gjs.Get(_json.String(), "value") + result = (_caption.Type != gjs.Null) + // fmt.Println(GetTabLevel(_level), "(< [", _level, "] ov >)", _key, ".", _value, "=", _caption, _value) + } + } + } else { + if jkey.String() == _value { + _caption = jvalue + result = (_caption.Type != gjs.Null) + // fmt.Println(GetTabLevel(_level), "(< [", _level, "] ov >)", _key, ".", _value, "=", _caption, _value) + } + } + } + } + if _caption.Type != gjs.Null { + return false + } + return true + }) + } else { + if _json.IsArray() { + for jkey, jvalue := range _json.Array() { + jkey = jkey + if jvalue.IsArray() { + // log.Println(GetTabLevel(_level), "(aa)", jkey, "=") + _caption, result = JsonSearch(jvalue, _key, _value, _level+1, _caption) + } else { + if jvalue.IsObject() { + // log.Println(GetTabLevel(_level), "(ao)", jkey, "=") + _caption, result = JsonSearch(jvalue, _key, _value, _level+1, _caption) + } else { + // log.Println(GetTabLevel(_level), "(av)", jkey, "=", jvalue) + if jvalue.String() == _value { + _caption = gjs.Get(_json.String(), "value") + // log.Println(GetTabLevel(_level), "(< [", _level, "] av >)", _key, ".", _value, "=", _caption, _value) + break + } + } + } + } + } + } + if _caption.Type != gjs.Null { + _caption = DoFilterByJsonStr(_caption) + } + // + // fmt.Println(GetTabLevel(_level), "(res)", _key, _value, "=", _caption) + return _caption, result +} + +func AddValues(_col, _val string, _caption, _value gjs.Result) (string, string) { + _col = AddStrings(_col, `"`+_caption.String(), `",`) + _val = AddStrings(_val, `"`+_caption.String()+`":"`+DoFilterByStr(_value.String())+`",`, `,`) + // + return _col, _val +} + +func AddColumnToMap(_col ColMap, _key, _value gjs.Result) ColMap { + if len(_key.String()) > 0 { + if _value.IsObject() { + return _col + } + if len(_col) == 0 { + _col = make(ColMap) + } + _value = DoFilterByJsonStr(_value) + _col[`"`+_key.String()+`"`] = `"` + _value.String() + `"` + } + // + return _col +} + +func AddColumnToMapAsString(_col ColMap, _key, _value string) ColMap { + if len(_key) > 0 { + if len(_col) == 0 { + _col = make(ColMap) + } + // _col[_key] = _value + _value = DoFilterByStr(_value) + _col[`"`+_key+`"`] = `"` + _value + `"` + } + // + return _col +} + +func AddValueToMap(_row RowMap, _col ColMap, + _index, _key, _value gjs.Result, _exclude, _include string) (RowMap, ColMap) { + if len(_key.String()) > 0 { + if _value.IsObject() { + // log.Println("object:", _key, ",", _value) + _value.ForEach(func(fkey, fvalue gjs.Result) bool { + if fkey.String() == "typeName" { + var typevalue gjs.Result + typevalue, _ = JsonSearch(_value, "", "value", 0, typevalue) + // log.Println("type(1):", fvalue, ",", typevalue) + if typevalue.IsObject() || typevalue.IsArray() { + return true + } + _row, _col = AddValueToMap(_row, _col, _index, fvalue, typevalue, _exclude, _include) + return false + } + // log.Println("type(2):", fkey, ",", fvalue) + _row, _col = AddValueToMap(_row, _col, _index, fkey, fvalue, _exclude, _include) + return true + }) + return _row, _col + } else { + if _value.IsArray() { + for _, avalue := range _value.Array() { + // log.Println("array(3):", _key, ",", avalue) + _row, _col = AddValueToMap(_row, _col, _index, _key, avalue, _exclude, _include) + } + return _row, _col + } else { + var typevalue gjs.Result = DoFilterByJsonStr(_value) + // fmt.Println("AddValueToMap()", _key, ":", typevalue) + if len(_row) == 0 { + _row = make(RowMap) + } + if len(_row[`"`+_index.String()+`"`]) == 0 { + _row[`"`+_index.String()+`"`] = make(ColMap) + } + _row[`"`+_index.String()+`"`][`"`+_key.String()+`"`] = `"` + typevalue.String() + `"` + _col = AddColumnToMap(_col, _key, _key) + } + } + } + // + return _row, _col +} + +func JsonSearchSet(_json gjs.Result, _key, _val string, _level int64, _caption, _value gjs.Result) (gjs.Result, gjs.Result, bool) { + if _level == 0 { + _value.Type = gjs.Null + } else { + if _value.Type != gjs.Null { + return _caption, _value, true + } + } + + var result bool = false + if _json.IsObject() { + _json.ForEach(func(jkey, jvalue gjs.Result) bool { + // log.Println(GetTabLevel(_level), "(oo)", _key, _val, jkey, jvalue) + if jvalue.IsArray() { + // log.Println(GetTabLevel(_level), "(oa)", _key, _val, jkey, "=", jvalue, _caption, _value) + _caption, _value, result = JsonSearchSet(jvalue, _key, _val, _level+1, _caption, _value) + } else { + if jvalue.IsObject() { + var oocaption gjs.Result + var oovalue gjs.Result + _caption, _value, result = JsonSearchSet(jvalue, _key, _val, _level+1, oocaption, oovalue) + if result { + // log.Println(GetTabLevel(_level), "(ooo)", jkey, "=", jvalue, _caption, _value) + icnt = icnt + 1 + Col, Val = AddValues(Col, Val, _caption, _value) + return false + } + // log.Println(GetTabLevel(_level), "(oo)", jkey, "=", jvalue, _caption, _value) + } else { + // log.Println(GetTabLevel(_level), "(ov)", _key, _val, jkey, "=", jvalue) + if jkey.String() == _key { + _caption = gjs.Get(_json.String(), _key) + return true + } + if jkey.String() == _val { + // log.Println(GetTabLevel(_level), "(< [", _level, "] ov >)", _key, ".", _val, "=", _caption, ".", _value) + _value = gjs.Get(_json.String(), _val) + icnt = icnt + 1 + Col, Val = AddValues(Col, Val, _caption, _value) + return false + } + } + } + // log.Println(GetTabLevel(_level), "(< [", _level, "] ov >)", _key, ".", _val, "=", _caption, ".", _value) + if _value.Type != gjs.Null { + return false + } + return true + }) + if _value.Type != gjs.Null { + // log.Println("JsonSearchSet(fo):", _level, _caption, _value) + return _caption, _value, true + } + } else { + if _json.IsArray() { + for _, jvalue := range _json.Array() { + // log.Println(GetTabLevel(_level), "(aa)", _key, _val, jkey, "=", jvalue, _caption, _value) + if jvalue.IsArray() { + // log.Println(GetTabLevel(_level), "(aa)", jkey, "=") + _caption, _value, result = JsonSearchSet(jvalue, _key, _val, _level+1, _caption, _value) + if result { + // log.Println(GetTabLevel(_level), "(ooo)", jkey, "=", jvalue, _caption, _value) + icnt = icnt + 1 + Col, Val = AddValues(Col, Val, _caption, _value) + } + } else { + if jvalue.IsObject() { + jvalue.ForEach(func(jjkey, jjvalue gjs.Result) bool { + // log.Println(GetTabLevel(_level), "(ooo)", jjkey, jjvalue) + if jjvalue.IsObject() { + var oocaption gjs.Result + var oovalue gjs.Result + oocaption, oovalue, result = JsonSearchSet(jjvalue, _key, _val, _level+1, oocaption, oovalue) + if result { + if oovalue.Type != gjs.Null { + icnt = icnt + 1 + Col, Val = AddValues(Col, Val, _caption, _value) + } + } + } + return true + }) + } else { + // log.Println(GetTabLevel(_level), "(av)", jkey, "=", jvalue) + if jvalue.String() == _val { + _value = gjs.Get(_json.String(), "value") + icnt = icnt + 1 + Col, Val = AddValues(Col, Val, _caption, _value) + } + } + } + if _value.Type != gjs.Null { + // log.Println("JsonSearchSet(fa):", _level, _caption, _value) + return _caption, _value, true + } + } + } + } + // log.Println("JsonSearchSet(end):", _level, _caption, _value) + return _caption, _value, result +} + +func CreateLogin(r *http.Request) string { + _prefix := r.FormValue("pref") + _middle := r.FormValue("midl") + _suffix := r.FormValue("suff") + // + var html []string + html = append(html, "
") + html = append(html, "
 
") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "") + html = append(html, "
Anmeldename:") + html = append(html, "") + html = append(html, "
Passwort:") + html = append(html, "") + html = append(html, "
") + html = append(html, " ") + html = append(html, "") + html = append(html, "") + html = append(html, "Anmelden") + html = append(html, "
") + html = append(html, "
") + html = append(html, "
") + html = append(html, "
Copyright © 2010 archium GmbH
") + html = append(html, "
") + // + // log.Println("HTML:", strings.Join(html, "")) + return strings.Join(html, "") +} diff --git a/goDataverse/user/user.go b/goDataverse/user/user.go new file mode 100644 index 0000000..5c82d2a --- /dev/null +++ b/goDataverse/user/user.go @@ -0,0 +1,134 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package user + +import ( + "errors" + "fmt" + "strings" + + // "log" + // "reflect" + + "Toolbox/goDataverse/connect" + tol "Toolbox/goDataverse/tools" + + gjs "github.com/tidwall/gjson" + // "log" +) + +func ListUsers(_serverurl, _apitoken string, _sorted bool) (string, error) { + response, err := connect.GetRequest(_serverurl+"/api/admin/list-users"+ + func(s bool) string { + if s { + return "?sortKey=createdtime" + } else { + return "" + } + }(_sorted), tol.ColMap{}, tol.ColMap{"X-Dataverse-key": _apitoken}) + // + return (fmt.Sprintf("%s", response)), err +} + +func ListUser(_serverurl, _apitoken, _id string) (string, error) { + response, err := connect.GetRequest(_serverurl+"/api/admin/authenticatedUsers/"+_id, + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": _apitoken}) + // + return (fmt.Sprintf("%s", response)), err +} + +func IsValidUser(_serverurl, _apitoken string) (bool, bool, string, error) { + var ident string = "" + var super bool = false + var valid bool = false + // + response, err := connect.GetRequest(_serverurl+"/api/users/:me", + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": _apitoken}) + // + message := tol.GetObjectFromStr("") + me := fmt.Sprintf("%v", string(response)) + status := gjs.Get(me, "status") + if status.String() == "OK" { + data := gjs.Get(me, "data") + if data.IsObject() { + ident = strings.ReplaceAll(gjs.Get(data.String(), "identifier").String(), "@", "") + super = gjs.Get(data.String(), "superuser").Bool() + valid = true + } + } else { + if status.String() == "ERROR" { + message = gjs.Get(me, "message") + err = errors.New(message.String()) + } + } + // log.Println("IsValidUser:", message.String(), valid, super, ident, me) + // + return valid, super, ident, err +} + +func IsSuperUser(_serverurl, _apitoken string) (bool, error) { + var super bool = false + // + response, err := connect.GetRequest(_serverurl+"/api/users/:me", + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": _apitoken}) + // + me := fmt.Sprintf("%s", response) + status := gjs.Get(me, "status") + if status.String() == "OK" { + data := gjs.Get(me, "data") + if data.IsObject() { + super = gjs.Get("superuser", data.String()).Bool() + } + } else { + if status.String() == "ERROR" { + message := gjs.Get(me, "message") + err = errors.New(message.String()) + } + } + // + return super, err +} + +func ToggleSuperUser(_serverurl, _apitoken, _id string) (string, error) { + response, err := connect.PostRequest(_serverurl+"/api/admin/superuser/"+_id+"", + tol.ColMap{}, tol.ColMap{"X-Dataverse-key": _apitoken}) + // + return (fmt.Sprintf("%s", response)), err +} + +func SearchData(_serverurl, _apitoken string, _sorted bool) (string, error) { + response, err := connect.GetRequest(_serverurl+"/api/search?q=*"+ + func(s bool) string { + if s { + return "?sortKey=createdtime" + } else { + return "" + } + }(_sorted), tol.ColMap{}, tol.ColMap{"X-Dataverse-key": _apitoken}) + // + return (fmt.Sprintf("%s", response)), err + // + // curl -H "X-Dataverse-key:$API_TOKEN" $SERVER_URL/api/admin/list-users + // # sort it by createdtime (the creation time of the account) + // # curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/admin/list-users?sortKey=createdtime" +} + +/* +func CreateAuthenticatedUser(server_url, api_token, params string) string { + response, err := connect.PostRequestB(server_url+"/api/admin/authenticatedUsers", []byte(params), tol.ColMap{"X-Dataverse-key": api_token}) + + if err != nil { + log.Fatal(err) + } + + return (fmt.Sprintf("%s", response)) +} +*/ diff --git a/goDataverseStrict/connect/connect.go b/goDataverseStrict/connect/connect.go new file mode 100644 index 0000000..67f9850 --- /dev/null +++ b/goDataverseStrict/connect/connect.go @@ -0,0 +1,173 @@ +package connect + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "log" + "net/http" +) + +func GetRequest(url string, params, header map[string]string) (b []byte, err error, debug string) { + client := &http.Client{} + req, _ := http.NewRequest("GET", url, nil) + + for k, v := range header { + req.Header.Add(k, v) + } + + query := req.URL.Query() + for k, v := range params { + query.Add(k, v) + } + req.URL.RawQuery = query.Encode() + + //DEBUG + //fmt.Println(req.URL.String()) + debug = req.URL.String() + //def.LogMessage("GetRequest(req.URL.String())", req.URL.String(), def.DEF_logdebg) + + res, _ := client.Do(req) + + //DEBUG + //fmt.Println(res.Request.Header) + //def.LogMessage("GetRequest(req.URL.String())", req.URL.String(), def.DEF_logdebg) + + b, err = ioutil.ReadAll(res.Body) + res.Body.Close() + + return +} + +func PostRequest(url string, params, header map[string]string) (b []byte, err error, debug string) { + client := &http.Client{} + + postData, err := json.Marshal(params) + //fmt.Println(postData) + req, _ := http.NewRequest("POST", url, bytes.NewReader(postData)) + if err != nil { + log.Fatal(err) + } + + for k, v := range header { + req.Header.Add(k, v) + } + + //DEBUG + //fmt.Println(req.URL.String()) + debug = req.URL.String() + + res, _ := client.Do(req) + + //DEBUG + //fmt.Println(res.Request.Header) + + b, err = ioutil.ReadAll(res.Body) + res.Body.Close() + + return +} + +func PostRequestB(url string, postData []byte, header map[string]string) (b []byte, err error, debug string) { + client := &http.Client{} + + req, err := http.NewRequest("POST", url, bytes.NewReader(postData)) + if err != nil { + log.Fatal(err) + } + + for k, v := range header { + req.Header.Add(k, v) + } + + //DEBUG + //fmt.Println(req.URL.String()) + debug = req.URL.String() + + res, _ := client.Do(req) + + //DEBUG + //fmt.Println(res.Request.Header) + + b, err = ioutil.ReadAll(res.Body) + res.Body.Close() + + return +} + +func PutRequest(url, body string, header map[string]string) (b []byte, err error, debug string) { + client := &http.Client{} + + req, _ := http.NewRequest("PUT", url, bytes.NewReader([]byte(body))) + if err != nil { + log.Fatal(err) + } + + for k, v := range header { + req.Header.Add(k, v) + } + + //DEBUG + //fmt.Println(req.URL.String()) + debug = req.URL.String() + + res, _ := client.Do(req) + + //DEBUG + //fmt.Println(res.Request.Header) + + b, err = ioutil.ReadAll(res.Body) + res.Body.Close() + + return +} + +func PutRequestB(url string, body []byte, header map[string]string) (b []byte, err error, debug string) { + client := &http.Client{} + + req, err := http.NewRequest("PUT", url, bytes.NewReader(body)) + if err != nil { + log.Fatal(err) + } + + for k, v := range header { + req.Header.Add(k, v) + } + + //DEBUG + //fmt.Println(req.URL.String()) + debug = req.URL.String() + + res, _ := client.Do(req) + + //DEBUG + //fmt.Println(res.Request.Header) + + b, err = ioutil.ReadAll(res.Body) + res.Body.Close() + + return +} + +func DeleteRequest(url string, header map[string]string) (b []byte, err error, debug string) { + client := &http.Client{} + req, _ := http.NewRequest("DELETE", url, nil) + + for k, v := range header { + req.Header.Add(k, v) + } + + //DEBUG + //fmt.Println(req.URL.String()) + debug = req.URL.String() + + res, _ := client.Do(req) + + //DEBUG + //fmt.Println(res.Request.Header) + + b, err = ioutil.ReadAll(res.Body) + res.Body.Close() + + return +} diff --git a/goDataverseStrict/metrics/metrics.go b/goDataverseStrict/metrics/metrics.go new file mode 100644 index 0000000..4731b75 --- /dev/null +++ b/goDataverseStrict/metrics/metrics.go @@ -0,0 +1,656 @@ +package metrics + +import ( + "Toolbox/goDataverseStrict/connect" + "encoding/json" + "log" + "sort" + "strconv" + "strings" + "time" + + "golang.org/x/exp/slices" +) + +type ( + MetricsType string // To ensure, that the set of constants is limited (a kind of enumeration) + MetricsDataCountType string + ReturnformatType string + SearchType string +) + +const PDPURL = "https://pdp.archium.org" + +// const IDRequestCriteriaPrefix = "input_" +const ( + IDRequestCriteriaPrefix = "get_input_" + IDRequestTextPrefix = "text_input_" + IDRequestHideDisplayPrefix = "span_input_" + IDFormSubmit = "input_form_submit" +) + +const StaticMetricsAPIbody = "/api/info/metrics/" + +const ( + //Level0 + MT0unset MetricsType = "" //TODO: Platzhalter für unbelegt, eventuell unnötig + MT1dataverses MetricsType = "dataverses" + MT2datasets MetricsType = "datasets" + MT3files MetricsType = "files" + MT4downloads MetricsType = "downloads" + MT5filedownloads MetricsType = "filedownloads" + MT6uniquefiledownloads MetricsType = "uniquefiledownloads" + MT7makeDataCount MetricsType = "makeDataCount" + + //Level1 + MDCT0unset MetricsDataCountType = "" //TODO: Platzhalter für unbelegt, eventuell unnötig + MDCT1viewsTotal MetricsDataCountType = "viewsTotal" + MDCT2viewsTotalRegular MetricsDataCountType = "viewsTotalRegular" + MDCT3viewsTotalMachine MetricsDataCountType = "viewsTotalMachine" + MDCT4viewsUnique MetricsDataCountType = "viewsUnique" + MDCT5viewsUniqueRegular MetricsDataCountType = "viewsUniqueRegular" + MDCT6viewsUniqueMachine MetricsDataCountType = "viewsUniqueMachine" + MDCT7downloadsTotal MetricsDataCountType = "downloadsTotal" + MDCT8downloadsTotalRegular MetricsDataCountType = "downloadsTotalRegular" + MDCT9downloadsTotalMachine MetricsDataCountType = "downloadsTotalMachine" + MDCT10downloadsUnique MetricsDataCountType = "downloadsUnique" + MDCT11downloadsUniqueRegular MetricsDataCountType = "downloadsUniqueRegular" + MDCT12downloadsUniqueMachine MetricsDataCountType = "downloadsUniqueMachine" + MDCT13citations MetricsDataCountType = "citations" + + //Level2 + ST0unset SearchType = "" //TODO: Platzhalter für unbelegt, eventuell unnötig + ST1total SearchType = "total" // ISt eigentlich ein Platzhalter. "total" gibt es nicht und wirkt dann, wenn der SearchType weggelassen wird. + ST2tomonth SearchType = "toMonth" + ST3pastdays SearchType = "pastDays" + ST4monthly SearchType = "monthly" + ST5tree SearchType = "tree" + + //Level3 + RT0unset ReturnformatType = "" //TODO: Platzhalter für unbelegt, eventuell unnötig + RT1json ReturnformatType = "application/json" + RT2csv ReturnformatType = "text/csv" +) + +type InputLevel3 = map[ReturnformatType]bool + +var OneJumpPointResultformat = map[ReturnformatType]bool{ + RT0unset: false, + RT1json: false, + RT2csv: false, +} + +type InputLevel2 = map[SearchType]InputLevel3 + +var OneJumpPointSearchType = InputLevel2{ + ST0unset: OneJumpPointResultformat, + ST1total: OneJumpPointResultformat, + ST2tomonth: OneJumpPointResultformat, + ST3pastdays: OneJumpPointResultformat, + ST4monthly: OneJumpPointResultformat, + ST5tree: OneJumpPointResultformat, +} + +type InputLevel1 = map[MetricsDataCountType]InputLevel2 + +var OneJumpPointMetricsDataCountType = InputLevel1{ + MDCT0unset: OneJumpPointSearchType, + MDCT1viewsTotal: OneJumpPointSearchType, + MDCT2viewsTotalRegular: OneJumpPointSearchType, + MDCT3viewsTotalMachine: OneJumpPointSearchType, + MDCT4viewsUnique: OneJumpPointSearchType, + MDCT5viewsUniqueRegular: OneJumpPointSearchType, + MDCT6viewsUniqueMachine: OneJumpPointSearchType, + MDCT7downloadsTotal: OneJumpPointSearchType, + MDCT8downloadsTotalRegular: OneJumpPointSearchType, + MDCT9downloadsTotalMachine: OneJumpPointSearchType, + MDCT10downloadsUnique: OneJumpPointSearchType, + MDCT11downloadsUniqueRegular: OneJumpPointSearchType, + MDCT12downloadsUniqueMachine: OneJumpPointSearchType, + MDCT13citations: OneJumpPointSearchType, +} + +type InputLevel0 = map[MetricsType]InputLevel1 + +var OldOneJumpPointSet = InputLevel0{ + MT0unset: OneJumpPointMetricsDataCountType, + MT1dataverses: OneJumpPointMetricsDataCountType, + MT2datasets: OneJumpPointMetricsDataCountType, + MT3files: OneJumpPointMetricsDataCountType, + MT4downloads: OneJumpPointMetricsDataCountType, + MT5filedownloads: OneJumpPointMetricsDataCountType, + MT6uniquefiledownloads: OneJumpPointMetricsDataCountType, + MT7makeDataCount: OneJumpPointMetricsDataCountType, +} + +type OneJumpPointSet struct { + Level0 MetricsType + Level1 MetricsDataCountType + Level2 SearchType + Level3 ReturnformatType + Active bool +} + +var OneJumpPoints []OneJumpPointSet + +// Presets +func init() { + //OneJumpPoints = make([]OneJumpPointSet, 910, 910) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT1dataverses, Level1: MDCT0unset, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT1dataverses, Level1: MDCT0unset, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT1dataverses, Level1: MDCT0unset, Level2: ST3pastdays, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT1dataverses, Level1: MDCT0unset, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT1dataverses, Level1: MDCT0unset, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT2datasets, Level1: MDCT0unset, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT2datasets, Level1: MDCT0unset, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT2datasets, Level1: MDCT0unset, Level2: ST3pastdays, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT2datasets, Level1: MDCT0unset, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT2datasets, Level1: MDCT0unset, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT3files, Level1: MDCT0unset, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT3files, Level1: MDCT0unset, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT3files, Level1: MDCT0unset, Level2: ST3pastdays, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT3files, Level1: MDCT0unset, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT3files, Level1: MDCT0unset, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT4downloads, Level1: MDCT0unset, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT4downloads, Level1: MDCT0unset, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT4downloads, Level1: MDCT0unset, Level2: ST3pastdays, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT4downloads, Level1: MDCT0unset, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT4downloads, Level1: MDCT0unset, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT5filedownloads, Level1: MDCT0unset, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT5filedownloads, Level1: MDCT0unset, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT5filedownloads, Level1: MDCT0unset, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT5filedownloads, Level1: MDCT0unset, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT5filedownloads, Level1: MDCT0unset, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT6uniquefiledownloads, Level1: MDCT0unset, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT6uniquefiledownloads, Level1: MDCT0unset, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT6uniquefiledownloads, Level1: MDCT0unset, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT6uniquefiledownloads, Level1: MDCT0unset, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT6uniquefiledownloads, Level1: MDCT0unset, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT1viewsTotal, Level2: ST0unset, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT1viewsTotal, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT1viewsTotal, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT1viewsTotal, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT1viewsTotal, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT1viewsTotal, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT2viewsTotalRegular, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT2viewsTotalRegular, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT2viewsTotalRegular, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT2viewsTotalRegular, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT2viewsTotalRegular, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT3viewsTotalMachine, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT3viewsTotalMachine, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT3viewsTotalMachine, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT3viewsTotalMachine, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT3viewsTotalMachine, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT4viewsUnique, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT4viewsUnique, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT4viewsUnique, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT4viewsUnique, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT4viewsUnique, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT5viewsUniqueRegular, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT5viewsUniqueRegular, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT5viewsUniqueRegular, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT5viewsUniqueRegular, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT5viewsUniqueRegular, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT6viewsUniqueMachine, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT6viewsUniqueMachine, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT6viewsUniqueMachine, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT6viewsUniqueMachine, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT6viewsUniqueMachine, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT7downloadsTotal, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT7downloadsTotal, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT7downloadsTotal, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT7downloadsTotal, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT7downloadsTotal, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT8downloadsTotalRegular, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT8downloadsTotalRegular, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT8downloadsTotalRegular, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT8downloadsTotalRegular, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT8downloadsTotalRegular, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT9downloadsTotalMachine, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT9downloadsTotalMachine, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT9downloadsTotalMachine, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT9downloadsTotalMachine, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT9downloadsTotalMachine, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT10downloadsUnique, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT10downloadsUnique, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT10downloadsUnique, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT10downloadsUnique, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT10downloadsUnique, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT11downloadsUniqueRegular, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT11downloadsUniqueRegular, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT11downloadsUniqueRegular, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT11downloadsUniqueRegular, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT11downloadsUniqueRegular, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT12downloadsUniqueMachine, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT12downloadsUniqueMachine, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT12downloadsUniqueMachine, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT12downloadsUniqueMachine, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT12downloadsUniqueMachine, Level2: ST5tree, Level3: RT1json, Active: true}) + + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT13citations, Level2: ST1total, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT13citations, Level2: ST2tomonth, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT13citations, Level2: ST3pastdays, Level3: RT1json, Active: false}) // Nicht valide + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT13citations, Level2: ST4monthly, Level3: RT1json, Active: true}) + OneJumpPoints = append(OneJumpPoints, OneJumpPointSet{Level0: MT7makeDataCount, Level1: MDCT13citations, Level2: ST5tree, Level3: RT1json, Active: true}) + + //OldOneJumpPointSet[MT1dataverses][MDCT1viewsTotal][ST2_tomonth][RT1json] = true + //OldOneJumpPointSet[MT1dataverses][MDCT2viewsTotalRegular][ST3_pastdays][RT2csv] = true + //fmt.Println(OneJumpPointSet) + +} + +func FilterStacklist(meisleisz []OneJumpPointSet, index int8) (deisleisz []string, activity []bool) { + switch index { + case 0: + for _, v := range meisleisz { + if !slices.Contains(deisleisz, string(v.Level0)) { + deisleisz = append(deisleisz, string(v.Level0)) + activity = append(activity, v.Active) + } + } + case 1: + for _, v := range meisleisz { + if !slices.Contains(deisleisz, string(v.Level1)) { + deisleisz = append(deisleisz, string(v.Level1)) + activity = append(activity, v.Active) + } + } + case 2: + for _, v := range meisleisz { + if !slices.Contains(deisleisz, string(v.Level2)) { + deisleisz = append(deisleisz, string(v.Level2)) + activity = append(activity, v.Active) + } + } + case 3: + for _, v := range meisleisz { + if !slices.Contains(deisleisz, string(v.Level3)) { + deisleisz = append(deisleisz, string(v.Level3)) + activity = append(activity, v.Active) + } + } + } + + return +} + +type RequestComponentsType struct { + Level0MetricsType, Level1MetricsDataCountType, Level2SearchType, Level21UserInput, Level3ReturnformatType string +} + +/* +func JsonStructSelector[resulttype MonthlyJsonData | TotalJsonData | TreeJsonData | struct{}](bjson []byte) (result resulttype) { + switch { + case json.Unmarshal(bjson, &result) == nil: + case json.Unmarshal(bjson, &result) == nil: + case json.Unmarshal(bjson, &result) == nil: + } + return +} +*/ + +/* +func MetricsUniversal(server_url, api_token string, rcs RequestComponentsType) { + var err error + //var header map[string]string + header := make(map[string]string) + + if len(api_token) > 0 { + header["X-Dataverse-key"] = api_token + } + if len(rcs.Level3ReturnformatType) > 0 { + header["Accept"] = string(rcs.Level3ReturnformatType) + } + + stest := func(s ...string) string { + + if (len(s) > 1 && len(s[0]) > 0) || len(s) == 1 { + if s[0] == string(ST1total) { + return "" + } else { + return "/" + s[0] + } + } else if (len(s) == 2 && len(s[1]) > 0) || (len(s) == 3 && len(s[1]) > 0 && len(s[2]) == 0) { + return "/" + s[1] + } else if len(s) == 3 && len(s[1]) > 0 && len(s[2]) > 0 { + if s[0] == string(ST1total) { + return "" + } else if s[1] == string(ST4monthly) { + return "/" + s[1] // bei Monthly werden erstmal ALLE Datensätze gezogen + } else { + return "/" + s[1] + "/" + s[2] + } + } else { + return "" + } + + } + + log.Println("DEBUG:", server_url+"/api/info/metrics"+ + "/"+rcs.Level0MetricsType+ + stest(rcs.Level1MetricsDataCountType, rcs.Level2SearchType, rcs.Level21UserInput)) + + + + if err != nil { + log.Fatal(err) + } + + return +}*/ + +//func MetricsDataCountType() (response []byte, debug string) + +func MetricsTotal(server_url, api_token string, return_format ReturnformatType, mtypeOrMdctypeCombi string) (response []byte, debug string) { + var err error + //var header map[string]string + header := make(map[string]string) + + if len(api_token) > 0 { + header["X-Dataverse-key"] = api_token + } + if len(return_format) > 0 { + header["Accept"] = string(return_format) + } + + //log.Println(header) + + response, err, debug = connect.GetRequest(server_url+StaticMetricsAPIbody+mtypeOrMdctypeCombi, map[string]string{}, header) + + if err != nil { + log.Fatal(err) + } + + return +} + +func MetricsToMonth(server_url, api_token string, return_format ReturnformatType, mtypeOrMdctypeCombi string, timerange time.Time) (response []byte, debug string) { + var err error + //var header map[string]string + header := make(map[string]string) + + if len(api_token) > 0 { + header["X-Dataverse-key"] = api_token + } + if len(return_format) > 0 { + header["Accept"] = string(return_format) + } + + //log.Println(header) + + response, err, debug = connect.GetRequest(server_url+StaticMetricsAPIbody+mtypeOrMdctypeCombi+"/toMonth/"+timerange.Format("2006-01"), map[string]string{}, header) + + if err != nil { + log.Fatal(err) + } + + return +} + +func MetricsPastDays(server_url, api_token string, return_format ReturnformatType, mtypeOrMdctypeCombi string, days int) (response []byte, debug string) { + var err error + //var header map[string]string + header := make(map[string]string) + + if len(api_token) > 0 { + header["X-Dataverse-key"] = api_token + } + if len(return_format) > 0 { + header["Accept"] = string(return_format) + } + + //log.Println(header) + + response, err, debug = connect.GetRequest(server_url+StaticMetricsAPIbody+mtypeOrMdctypeCombi+"/pastDays/"+strconv.Itoa(days), map[string]string{}, header) + + if err != nil { + log.Fatal(err) + } + + return +} + +func MetricsMonthly(server_url, api_token string, return_format ReturnformatType, mtypeOrMdctypeCombi string) (response []byte, debug string) { + var err error + //var header map[string]string + header := make(map[string]string) + + if len(api_token) > 0 { + header["X-Dataverse-key"] = api_token + } + if len(return_format) > 0 { + header["Accept"] = string(return_format) + } + + //log.Println(header) + response, err, debug = connect.GetRequest(server_url+StaticMetricsAPIbody+mtypeOrMdctypeCombi+"/monthly/", map[string]string{}, header) + + if err != nil { + log.Fatal(err) + } + + return +} + +type MonthlyJsonData struct { + Status string `json:"status"` + Data []struct { + Date string `json:"date"` + Id int `json:"id"` + Pid string `json:"pid"` + Counttotal int `json:"count"` + Countmonth int `json:"mount"` //Month Count + //Intex int `json:"intex"` //Integer Index instead of Date + DoiDoi string `json:"doidoi"` //Added to beautify links + } `json:"data"` +} + +type TotalJsonData struct { + Status string `json:"status"` + Data struct { + Counttotal int `json:"count"` + } `json:"data"` +} + +type TreeJsonData struct { + Status string `json:"status"` + Data struct { + Id int `json:"id"` + Ownerid int `json:"ownerId"` + Alias string `json:"alias"` + Depth int `json:"depth"` + Name string `json:"name"` + Children []struct { + Id int `json:"id"` + Ownerid int `json:"ownerId"` + Alias string `json:"alias"` + Depth int `json:"depth"` + Name string `json:"name"` + } `json:"children"` + } `json:"data"` +} + +func MetricsReallyMonthly(server_url, api_token string, return_format ReturnformatType, mtypeOrMdctypeCombi string) (response []byte, debug string) { + response, debug = MetricsMonthly(server_url, api_token, return_format, mtypeOrMdctypeCombi) + + // var newData map[string] + + res := MonthlyJsonData{} + json.Unmarshal(response, &res) + + intexmaker := func(s string) (i int) { + i, _ = strconv.Atoi(s[0:4] + s[5:7]) + return + } + + //for i, _ := range res.Data { + // res.Data[i].Intex = intexmaker(res.Data[i].Date) //Filtere den Bindestrich heraus + //} + + //sort.Slice(res.Data, func(i, j int) bool { return res.Data[i].Intex > res.Data[j].Intex }) // Sortiere rückwärts + sort.Slice(res.Data, func(i, j int) bool { return intexmaker(res.Data[i].Date) > intexmaker(res.Data[j].Date) }) // Sortiere rückwärts + + for i, _ := range res.Data { + if i+1 < len(res.Data) { // Finde heraus, wieviele Werte für speziell diesen Monat gelten + res.Data[i].Countmonth = res.Data[i].Counttotal - res.Data[i+1].Counttotal + } else { + res.Data[i].Countmonth = res.Data[i].Counttotal + } + + if _, f := strings.CutPrefix(res.Data[i].Pid, "doi:"); f { // Erzeuge gleich einen Link zum Doi + res.Data[i].DoiDoi = PDPURL + "/file.xhtml?persistentId=" + res.Data[i].Pid + } else { + res.Data[i].DoiDoi = "" + } + } + + //sort.Slice(res.Data, func(i, j int) bool { return res.Data[i].Intex < res.Data[j].Intex }) // Sortiere wieder vorwärts + sort.Slice(res.Data, func(i, j int) bool { return intexmaker(res.Data[i].Date) < intexmaker(res.Data[j].Date) }) // Sortiere wieder vorwärts + + //log.Println(res) + + debug += " #enhanced by monthly count (mount)" + response, _ = json.Marshal(res) + return +} + +func MetricsReallyMonthlySpan(server_url, api_token string, return_format ReturnformatType, mtypeOrMdctypeCombi string, timerange_span [2]time.Time) (response []byte, debug string) { + + response, debug = MetricsReallyMonthly(server_url, api_token, return_format, mtypeOrMdctypeCombi) + + //timerange_span[0].Format("2006-01") + //timerange_span[1].Format("2006-01") + + //res := monthlyJsonData{} + var res, res2 MonthlyJsonData + res2.Status = res.Status + + json.Unmarshal(response, &res) + + for _, v := range res.Data { // Finde heraus, wieviele Werte für speziell diesen Monat gelten + if func() bool { + ts, _ := time.Parse("2006-01", v.Date) + + if !ts.Before(timerange_span[0]) && !ts.After(timerange_span[1]) { + return true + } else { + return false + } + }() { + //debug += fmt.Sprintf("gefunden %s", v.Date) + res2.Data = append(res2.Data, v) + } + } + + //debug += fmt.Sprintln(res2) + //debug += fmt.Sprintln("T E S T") + + response, _ = json.Marshal(res2) + return +} + +func MetricsTree(server_url, api_token string, return_format ReturnformatType, timerange time.Time) (response []byte, debug string) { + var err error + var header map[string]string + header = make(map[string]string) + + if len(api_token) > 0 { + header["X-Dataverse-key"] = api_token + } + if len(return_format) > 0 { + header["Accept"] = string(return_format) + } + + //log.Println(header) + + response, err, debug = connect.GetRequest(server_url+"/api/info/metrics/tree"+func() string { + if !timerange.IsZero() { + return "/toMonth/" + timerange.Format("2006-01") + } else { + return "" + } + }(), map[string]string{}, header) + + if err != nil { + log.Fatal(err) + } + + return +} + +/* +func ListUsers(server_url, api_token string, sorted bool) string { + response, err, _ := connect.GetRequest(server_url+"/api/admin/list-users"+func(s bool) string { + if s { + return "?sortKey=createdtime" + } else { + return "" + } + }(sorted), map[string]string{}, map[string]string{"X-Dataverse-key": api_token}) + + if err != nil { + log.Fatal(err) + } + + return (fmt.Sprintf("%s", response)) + + //curl -H "X-Dataverse-key:$API_TOKEN" $SERVER_URL/api/admin/list-users + + //# sort by createdtime (the creation time of the account) + //#curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/admin/list-users?sortKey=createdtime" +} + +func ListUser(server_url, api_token, id string) string { + response, err, _ := connect.GetRequest(server_url+"/api/admin/authenticatedUsers/"+id, map[string]string{}, map[string]string{"X-Dataverse-key": api_token}) + + if err != nil { + log.Fatal(err) + } + + return (fmt.Sprintf("%s", response)) +} +*/ + +/* +func ToggleSuperuser(server_url, api_token, id string) string { + response, err := connect.PostRequest(server_url+"/api/admin/superuser/"+id+"", map[string]string{}, map[string]string{"X-Dataverse-key": api_token}) + + if err != nil { + log.Fatal(err) + } + + return (fmt.Sprintf("%s", response)) +} +*/ + +/* +func CreateAuthenticatedUser(server_url, api_token, params string) string { + response, err := connect.PostRequestB(server_url+"/api/admin/authenticatedUsers", []byte(params), map[string]string{"X-Dataverse-key": api_token}) + + if err != nil { + log.Fatal(err) + } + + return (fmt.Sprintf("%s", response)) +} +*/ diff --git a/goMetrix/app.wasm/Makefile b/goMetrix/app.wasm/Makefile new file mode 100644 index 0000000..afd2380 --- /dev/null +++ b/goMetrix/app.wasm/Makefile @@ -0,0 +1,22 @@ +# Basic Go makefile + +GOCMD=GOOS=js GOARCH=wasm go +GOBUILD=$(GOCMD) build +GOCLEAN=$(GOCMD) clean +GOTEST=$(GOCMD) test +GOGET=$(GOCMD) get + +all: build transmit + +build: + $(GOBUILD) -o app.wasm -v +dbg-build: + $(GOBUILD) -v -gcflags=all="-N -l" -tags debug +test: + $(GOTEST) -v ./... +clean: + $(GOCLEAN) +transmit: + scp -r app.wasm root@10.23.45.27:/srv/Data/ArchiumToolbox/Toolbox/static/wasm/ +# scp -r app.wasm root@10.23.45.26:/srv/Data/ArchiumToolbox/Toolbox/static/wasm/ + diff --git a/goMetrix/app.wasm/app.wasm b/goMetrix/app.wasm/app.wasm new file mode 100755 index 0000000..c241003 Binary files /dev/null and b/goMetrix/app.wasm/app.wasm differ diff --git a/goMetrix/app.wasm/aux.go b/goMetrix/app.wasm/aux.go new file mode 100644 index 0000000..60e353c --- /dev/null +++ b/goMetrix/app.wasm/aux.go @@ -0,0 +1,174 @@ +package main + +// Tux +const imageByteArrayAsBase64 = ` +iVBORw0KGgoAAAANSUhEUgAAAJgAAAC0CAMAAABfch +VeAAAC/VBMVEUGAwkBAg8ABgkEAAYLBAIIBQsCCQwICwYMCQ4GDA8QCggTCgEVDg +ULERMPEQ0SDxMUDw4aEgMQFBYTFBIWGBUgFwYbGBcaGBsaHBknGwUgHiEeIB0iHh +0tHgMiJCEvIgkoJCMnJSg1JQYmKCU8KgcrLSovKyo+KBMrLS87LBBBLgU3LxtHLg +gwMzUyNDE3MzJMMgVJNwk4OTdMOQJSNgM4Oz0+Ojk8PDVYNwdVOQdSPAg+QD1ePA +RDPz9YQgVTQRpBQ0JeQAZlQgJGR0VuRAdrRgdKS0loSwl0SQNUTz5yTAJTTk1NUV +NPUU5uUQV7TwBVV1RaV0qAUwV9VwaFVgCLVgNhXlFdXlxsXUNdYGOLWwWBXhGGYQ +aPXgCTXABlZmSZYQSWZASPaQqVaA6baAxsbmyhaAGMayuWbgCPcBKbbQKfawN0cW +SYbCGkbwlzdXKbdQmscACocwCidA2GeGJ6e3ilewOhfQSeeSezdgF4fX+veAmsew +qyewCKf1x+gH2ifDiygAW3fgSthQO1fhOZgVKEhYOygiC8gw2+hQC4hRK7hwDDiQ +WMjou4kQSli1u/kAPCjQ3HjA3KjgC7jyrHkQC5jjnNkQKUlpO1k0/UkQrJmAfRlA +rOlwvWmADFoQDKngXTmwCvmm7GmjDRngCdn5zXngTbnAWinZyunYC3nmTaoQ3Vni +7OqA7VpQzepADApGXUrQDipwOnqKXbrQTZpyvgqwfmqw3qrQDisgDnsACur6y7rZ +TZtxHrtAPfuwHwsgbkugW9sp+7s6bquQrVt071twDvuA7ztg/pvgDuvADzugC2uL +S8trPxvgDpwwD2vQDLuonuwgDuvSb0wQO7vbrBvLruyAjDv7HwxB3rywvqv1nAwr +/Gwb/1zgHtzSTFx8TKxcTx0Rr10wXsx2bMybrJy8j02A/x1yD01zDO0M312DvV0c +P22EbT1dHl17Hc2MnY2tfk4NHe4d3x4rnj5eLo6ubr7ur18eLw8u/19/P5+/f6/P +n7/fr8//sGU4jmAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx +MAAAsTAQCanBgAAAAHdElNRQfUChwRIgJBXOpUAAAcEUlEQVR42u2cfVzT953A2y +SQEDUqoCCxKMV0zmlKc7ZXDV2t1IezUjkfxs2paFtYW1ao6bAPyFhpx0grtoWu0h +pZ6QS6ccoVLGBoU6gcwQbR4xrYPGxTvbFKb9xlGUmT38PrPt+HXx4oIJaH+Ee/rR +ESye+dz/Pn8/3+uOmm79Z368ZfYv91Y1LdOHDiUdYNihVstLG4JEFEGxVKJBHBQ9 +CkNipXqCJCESoKmj5H5ZIqlCqVMkKCvr75RrIvabRqzeYktVIqCQrZGGBKdXJa2m +aNUhEMbY7hj2FKbWp2dmqSKloaBLKxwGIBLD01SR0bKZ12sLEimBTA0lOTtWpVtE +Iy3WRjcIkUsdrk5CSNKlYZKRdNM9hYAhMrlGqNWgVUirBpz05jgkkjlbHzFdKgpM +2xuEQSqUIuCXjq5htCYEAWtFJDfN3rO7AbHUwi+YY9wVMSuTQ0JChkFEEqV0RGyi +UjBYx4dVRIsMAk0hBJmHJpfIQowB1DZGGyEFGE9h6lKDhgqHgODZXNilPN9yvzZb +Pj71q/fkVU6Oylt0cESWIh4bcnaeNnzYpXyb2Xn61OTs8vLi5O14bNWhwTGhyJxa +YUVlbmr4maFaMQ5BWlTcsvrqyv7zz3rnaWfL40KGBRKcX11r7mws1REqmIgIUnZQ +NW87ke2xfWfA04pygIYDJ1TuU5W19Pff4aeQgBCFWll527NDBotzsGrGVp0SJRMC +Q2J6Xs3OCQy+n4olIpGFh6/aDLwzIehvE4Owu1sumPF2Bhiwu/cDqHnB6OcW6mko +mrdzA85+yrbB70MG5bekwwwMTqTpejOC2n2c2x7yLRSEQibZ+L453ZMbNvS2l285 +7OO0VBAAtNHnQWxyxcn1rv5m0xEkkINJGbbW7eVRYVEpeamtLMcI7U0CCAyX48ZL +tHFJudktLPOdRSqSJSKnkAwGx3isXh63MeeABElh8eDLA0Z2WMWJaSqqn0OLQRkX +Ga25UAxhTOBvuLSU6OHeCYypjggBWDQFTJmhyXXatQRCpV8Vqr2/PjUDy7UEc3s0 +x9XBDAwn48VBwtFs1ZEZPq6FwokUqg0I/MtrtTSE0RFlrJMM3BAJOlOupjwQeiIl +L6f7bkjtU/XP0Pdyz6kdWVKgQvJLH4IICFJA323YOkI/mndx579SRab7/w2Dv/lz ++bYIQ7OE9ZMGxMvMLqKIwSiWYs+cmBo8a2ttOnTx49/PaJf//DD3DmnpXGsM6ccF +EQwGLKnPbk0JmrHj740nFTa1tr64nDT/+2te3E06vnIgsc4Jn+zcEIsCCTQU//P2 +/SvVbRYDQD10cfffjeh+d7u1tPvPDgvT8bAIGVxQUlJYnubHb+7c28Q1VNJnNbW+ +v58xc///zzq5cvX+49e+rt3/3H/wzZHgidfrCbUd2T9vEbBSVIXiCws+cvXv7yy6 +tffXX1L1c+6+1qO3X89ceWSYMiMbH03mee1xtqGoymtk/Onu+9eOXLqwD25V+uwP +rss+62mgPLJMEAk966TVdUWlFrNAEYKPLilatf/RUERteV3j+demiBJAj12LxNug +IQWJ0RTAwJ7PLlr/76V4HrypWPPvxT24FbgyAyybLMPH1JeZ0RwM52g8AuX/Xjun +jihVcbGp5cFAQw+X1IYFVegV0BgV2l0rry0eHDr1bUHN81LwiBTLEht6CkvAZiBQ +LDAgOHxFggrpePVNRUVeyaK5p2vxRLVz988DdVtQD2SdfZ3l6wsKtXsENe+fDw86 +Xl5TVV1YZtc3FfHDKtYJK5CdsOHK9rMZu7upBLfknixMWPfvt8AXBVVZUbXlqNTC +wsbml4yDSCiSULEoHMZLZ0dYMiL2Pjuvjh4QMH9Yby6qqqilL9T+bhnm59+gPxsm +nbikON5R0Pbnv0aENbd+/FzwEMCeuFA0/lHjKAvCoMr73x5s9VSFJhmvTn0pKWhk +0bmEj+j7/46bZdTx4+8SHK3ycOv3BQp8vVlxoM5RW/Kfndv31wpjkNNSOhypTn8p +9LjZsmkSGw1ObfP7Tv4YeffBqtAwcL9PqS0iMGQ2npodf/8PEfe3qsZWokslB1+n +PP5STNnzawOdnWzncezsw6ePS9904eP2aAVfpWaWmJ/qU3P7Da+m191vokVGeLol +Py8/PT1LJpIYMooMyxWs+98vAjT7108lQDOOFbb71Vckivf+mNP5yx9vTZBmyXOt +PmoOmeRJX+XHpS9LTsKqFaf2F2p9V65pUnHtG9XGo4AqI6VFRQUPDSGx+c+2OP1T +bgcNj7370NBQxRpDZlfZxsWkIGuhwG6znzzhP7MnOBqCBPl5Gh+/WbH/TAszb7kN +vjcQ6k4lmjSBYVJZuWIIuvFplt/aKvp+fc718BtMzMjIxHHnnmzXfOAFffFw43w3 +Ic46y/LTApiUMkUw4WEp0/MGgD3wO0X/3yiSeeeOaX73xw5lxPp7VvwOFieLQYR9 +rwcb9kqrnEYSn9TsdAnxWtznNnPv74DESInnNW6xdeLp5n+5XDwEJCp3r3Ia4ejM +hOwITVg7zR7nB5OArGu9NnS4Zt/0qnDEyO9kJmpzk5Fsy7z9rjR9bXP+hwun1cPE +vadb8lnzJlyiMipSKx1gqXZzyOfiwpynVpwD7k8jA+Lp53Fs4ftpkpmiLPFEsUEX +Lx7DInC5fl3P7KtA2CFj2cPxfP2LSS6dmJQ/YbIlvvIPbtGRoQyCBIOFGU4AMW58 +yZMy17hOSdF1ZSv2PdQwM2hNaDxcWw/PDFNA+PZVNCRo+iZA95JcK4nfbBQWTzDM +ePtFxpoVMPRt93hZXxu7LHNQSeOIKwKHpx1JRv+NJ3Dc9xBlzaA1j8qIvrVE/5Vj +R9U22nx19rHDOKEunLgw9IppiMvuWsdIeHDQAbk4t1ps2Z2u17IQ2rK4cCwMYk4x +iPuzh8Sg8WeI8UpXQOA+NH1yXj8bjd1hjJFJJ5U0pkWieUW34yQVf/pk+yHMswHp +fT5XI6/PamJ53Ml+uis5sHnB4a4uHqIBO4vIeBZ6A4RH9YQIKn0fNDDodjaChJLp +l6MMniwnqr3QnXZdDyuJ1DaDldEDPQU/DoBinBs1D12wcHBiCx50RIpkpkfmc91G +WVzX0DhASBubBU4FuGxaiQChwA1N/fb7N9Yeu7BIVj3wOyqTpZ43urSG1lZX2nzY +7qLqQ8hnE50NcMg8wNbIvxOB2OQegr8erpuXRpwNG5AuVLUXjYZIP5lcbKJMSFCx +zqAZ4hp8e/qEARggjNBnSXLvXZBofql6KMobkzRja5ZH4FqDK1vqffAdYPRs4jNM +7jdLOCJ6IHZP5g+6BixIbEBv++EGJZSIxWs3j2ZA7zqD/i0xbqskuDICEcuRigYB +EYeCPHwLfob6xQ7J0QLYbsAzbbpb5Bpz1tFvKcKLVaOYn7EoRLrhCLQ6PTkUuyLE +iHAMD1kbEBD/mfQa+guIG/IWiXbHaXVUPMbKlGKZtUMJEyPjJEHKY5Z0dNECYBzb +E4jiK5wddYi5iI53j6FYvQ+m39DlcO2TCULb5LOVnDbMy1UBMFOojJB6sn8qF0JF +MSFZIvkMBYIkD0N3gpkA04++4k/ZIk/vYI0eSByTXx8L6SpD5UqIKUeEIhMHLCol +mKI9LD/4jFZHZnPj6eIRGHxd8mnxyRoZ+O1iJNzCoGO8cSYjiGKA4esVIFvwQf4P +xqHvQyz7js/f3OwcXk5ogwhWqSDnDh80RIYKH39DP4asTueWr/DA0VHA1siJbwUv +/kGZCZ3Z0uEYcoomOVCuWKSMkkgOG2SI1qqphKt6A4bO3IhGglAQ88eZ4htk+wsP +RQ5HAPOVzWKLE0UqVVx0aoVLJJEBk+SLcU3km2eRAZNUvgqOn7LeoCLE+sH8dbYo +TgsJAohpLEYdHqNVpVRKQ6SjQpYAu1UXgb3CMgkFCPoxlojaiVoR5J/vD4AT9yNO +h58qWKWM0aTXyEVKWWTxgMxZ7bkMDCUga5YQvhQPnKCt7JUfkIXwgP9LXOiAilSh +0fKRWFa2MnrEuUfdVUYDy5kt9C1StP3QAD0SIDf0MjHEQXwjyoUkRERqJblkI02o +maPwqu8Wpw75C77BxtO+Aa9FI863Z6cM3K0UyJDB5nApzgWQqNjZId2iwSThovvG +cSwMI06MjJnHwGAfHE7CkFwzgRGL44iWtCxEDf00iGIwf6xv2c1xnl9ygmqEtUUd +wFwTVUY/M5HieUEVBaOBleICLZCHsBkhtCw17CYMVCHfKud1og0ign5pdo0qZeCu ++hSHcJSdAvBbGeIRfDe1O3gOv9gmRRXqhDOr1nRETqCfolZDdFUjjq2jpZGu1JJc +ETJ3CjmZj3yn6LRjPsD96P03+nl2XpXWET0SXacVFqIRuJtEM4QvE879UoXJh1gc +RIuPAGMPLPSJRgacSlIc2+3gemDp0YmFisug2l7xwSXBksLJIxUU3jRLNzqjbshw +zOULiqIFJDLkKyOcc5Un1gKyZS++DKToPSZHwzQ4Ilqb9YoQlHYCxeWDBC4Y9qDK +El9jUqnDPdBzah43jISudrQOaipAGGVK2kXmBxOmIJGIVkKTkvkCAHJbGWIb7Ju7 +K90WvpRE69kdL1dniz0LQhv4xNY6YXjKXmzuL6mhdsn+YCIb7Av/IUCvqTqSdwFp +X4tfIuAFMUu3nW3/VYkrahuYUWwD9J0aDmq9a81g9/PMWCxcs0E2iWSImu1MKnVN +Z7hLKCxeGJ+B/rcRAwlvNBEzLGh0vUjzVfLMSIWZpv3/jSSKhMgmih6mSoy/OCKr +EVITCGhg6O98Z/jmZyocmkjRPPlAk5ab5GMkEwWUxyKBQDaE6N8x1DjJshRi6A8Y +QEtQK0mhZc1VeHw1dMGT30KY5Vf2sw732v6wFsjY2hiQgbNcPjcM5gVeJwgZXH+H +I5683l6AmBj60UTF6lFE8MLCRSlTJLLEseEPprnhcuii7kcQzh6SInVNuckB5pHi +KRT4h6jAAmWzpngmCKeE1alDgsddDPvIWmA6VKDMZyrPd51uuznM/sWJqnmEpaXk +TFhU4UTJWUvlgcnu7gaGlP+gshqLkIGKkdAuoOb8zwCySgSgImiosO+bZgwt3789 +Vpt2MwkpNJvUDbEF6QGCvELZrl+UDF4qiL4j/zLjH+WfHh4gmCoVMTWnFEtsNbvH +DeOYUXjCiQ9JmC/Lx1tjeWweueYhIulPGyCYOJQ6DsicLbbbThpx0HEgLrdjjJzF +/wQ5IjfRsTRO0sKYA4d6GM3EiulIVIJZKJgYlDlSpluoNWyXg6R6plXFkjidH6AS +dxrDV4meX90ipt03kWVRei8Di1KlIeqYyNjZxFD5Zdp+1L5i66ddFcKbSV2nQ7S6 +dOdC5HOn+QGN4loTMDGipw98F48xN1YKRkR4pYFqlSRigk4jBFhDI2Pj52/nUfRp +LOW73r1aOvPnaHVCxfmj5AClSGJZenvSSyMQ/jl7xZau8kLxDDopU4UrHtztDIaO +HAg0gSFhWnTdYorhMsYdvLdWaLxXh0w0zx7HveddL8yPpPKDAYG9ics976InCyAR +r3VMZERIX6V66hMcmp6jnXd7Ag97UG8wVYluMPSkWK9fVummpw/hOCLQITQggv5H +YqO9arSogUX/8d1v/+Yl70sFG/VLNeO//6wEpqmlouULKZoghNpYujhSpNMixVJR +2QMXiITbthGoGF2pb9+3/9J1rvP/b9wCPr4gg1mmVcD5jeUGvqsAhkM0RhQMYIOZ +LHWRlMDoORKpoXGih4iYyLOU5oxj3/bepGh9a7374jECwkVhU7Z8EPr4cLnaM2E7 +ALlrfBzsJUhXa0xYYLGooHKQnN1lnS2WEx+jI89VCE/PVJ46efoXOyhwOP0osUyu +gI+Ya3z18H2JHqRkFiFy6YX10tFUtVOQN45wGXfFgcOPKz3okdyadC+mY5Wldy/N +c1deau7s8+630h8Fy4eHakVLroydYrV8bLVVRiqG00WSyUrKvt6SUSsSQ21eqmEY +H2RO4haHj9jD+w8vfmVAAzWS582tv65IJAMIlIPPPBE71XrlwcryLRSX1Bk4js1G +NzxSJp5Pp3XSznN5pg0IiApmvvhhLrq44o5NfvI7Cus8PuPcBoyw63dvd+NrYyi4 +peLkInIIGrug4J7IKP7PgGeMsQubrSKYwHsMEzHkYoCPHIwDsLYoWZNcL8+v1aeL +dP2o4/futwsHm7TnV3d33adnRUqgJQ37FjBkNpSYmhoqquqcUPC9bZV5fgiLg4fc +C7CchhYZF2VtjdYv2CBM0SHtff3q9tsVjMDVUHV84YFscePNra2vaJxfTaaFzP6w +3lNbW1tTVVVVW1dY3GAHnB6m59lBzPD0+1erCvsST8g8GTighPEqmQyIAAq5dxOf +r/DBIzm011VUXbbvEvKiQzVr/W0NpmNlsaRgUrMlQDT1NTXWNdXZPJZA7AAsju3p +MPzsQ3g4etqXeSRttrVzwntEp09E83wBCy226z/fH9WqPZZKwt1+s2LJCIvFi3bC +qqajgNzO2NJaNwvagvr200tphMJmMTWL3FMhysq7f1BRqEZmuKB8n4i+YcYYPSO0 +eneQFXGY5+DAYftqmuvKQgc9Mtc2fI5RL5zHlL7ttVYKhFNzZZLC0Vo4GVoPs/Ot +rBEszDqASRnT+1ay79qMq0AY9vHMBw3pqCZFOMxpJw6wGBAVgNGEdTXVWpviB336 +b7Vq1cuWrDtsdzC0prQD3oguaG0cBKqxpN5naLxSesYTLr6v3osJBQQiJTOz0BG2 +64ria9LS9MY/GLBOxfqwGgqbGmHMgKcnWZmZlZuXnP60ur6lpM5JrGUcEgZ3cgJv +hD0ALkZkHx8b2H5gnmEZ7U6abbRwwxfroHQIYWtJQGh3UPIrDfldc2GY2NtRWG0k +N6PQ5J+kOlx4DLTERhaRlFZC++VgUm9g0V+pN92n3+7R96c3BYUqeHZ/z3/1hfNq +djAVT0UzADAmuqqylH58UhIsEDRIG6FuHTm83GmhHBfo1szGyxjAFm6epuPbBIcC +mRPBXsDOMwFJCEC2GuT1IX47Ej438dlGZEIqupLi834FUBUanJ7Hv7UazsIICBGV +4Ya3V1nz+5yzsEFy0sdFEDJ5pjhLkwJ4QObGPYK18vQbo0GRvqIFBWl1dUVFTV1P +oHcQAzjUhWcKgc3WQ0hi6xMluP+m5OlCc7yGiK9kBCee81OLw8QwMIDN7eaESxqK +6WrroGo9/1QCEdppFCRgGKYy0dY4OByE4/usAbt1cMcv7CoS2a0KrT/M24Bm2X6n +/9MlQrLRAmW4wQwNGCWG4MEATIbEQzQ3f+XQsMQsb5ow96RaYaIDWXcMqCZ/2ada +FIY1x227kfPaXHYB3mjhYwNSNAGdHtfJZAMLO5oWaEyjCw0BmRDBLT6eeXCMluhZ +2kbs67l0RHjkJHggd9AJbzg8cBDCofFCfNKL2A6Fpa0LfDPvkIQisqrR5bYhYUcb +u6e089uoiOkgpdgvsRj2ToZgNHWkoWj1FYV3/+4iVZyFJMLThmteMwbvaP5T4yi6 +Xh+DfBxpQYjruW7t6zRzfMEIlFsphsO8Mx3szN0bpCaJGE0sgzmLNYvuRxDCYkOx +xRR7WXtpo3AsHAb8YGQ3+6ui+2Hlg2P0aT3uwku6QkXPCM/+Yz560WGXt2FLpLVF +9R22CyWMY0FeFC5sYAG3sL4kXH6B9FcEyw/5MP/UuZbYgRqmnWe1SA8wsaWIispz +89SiSWr0RgTSbzeMig0ggEK62uNVpoorSMQXb2fOvRZ/7si6Uke/uqC1/RD9HVuh +lN6mbcl/lyBWluLNfEGg52qLS8rkWwR8uFkd8Cvdx1/vypl15xCzuB3uztd7yHap +R1V5JNyblrEZjR1D4eLrO5sc6PKw+D+VWII7+HhYjs+FNnGI4O7+jQHz+SkQVLn3 +MWx5FJ67wNmUVUldcEM7c01tUERH4ULtqvJWz0+icgst/81OZt0lhe4ON8Z4941t +m8Xhig3LLpkYKKOuO1jd9iMTXWVRsCc+WR2qYWyzWtAIGdPX/6+FO/sjO+0bQQHz +i6PQmJyJYT5x1MI7BjUCNc81O3tzTWlhv0ga13eZ1pPFgg7LbW0xXP/+Tng4wQLv +zOtBFGt61wsW8MJlmyaR+AGVvaxy6r2s0tdTWG0hcDc/iRGqNlfGAW0+lTx4t23f +uzTifjOxslbIFBBTbUV7zGf1wOYCCx2rEkhoqLFhBXxZGSEYc710TD7mpsaDj+cu +baRZqcPrdv9w8fLmA9LltZ2l2BU3zp8k2PFx3DljJa4Aabh4Ko2lDyjaIHfLKRtg +WjBDILxYI409BQ9Zpua8LMcHVqcXO/3ely4/PedltzWXby0hhZ4K6HZObyTZkAZm +wxj9B9kf4HhFVtKC158ZtlYikqx8wdQps00mejz4MqmxqqSnQ7E+dJxLLZcZr1qe +k52WmpKclJ6phwecg3f4/0vJVbsqC6GMErkV11tLebm8AVS4oKRioTS6ARh4KpxQ +z/dXSMqVIAq60oyd297lbpuH6FouSWu7fq0G/GMFlGiFq4dKw2FOWOPFCBXqocmp +a6xkZUwplaoOs1+xQ7PNY01Fbodbs3LZ8xTrDE7boi1I20BxaGFlQ1NmLTyhulq8 +zDbZ6hvAqNVVDd29gI5Zy5o8Pc7rM5mkbB+OuqDAVZOzfePU80TrCtWQWoG/Ere3 +BwQFQ11YZDBVmjz87z8qAHPYRv9C4vr66pwXhQlZtAdu3U7Ohqaaw5VpKXuXNj4g +LJeMCkAJaRh0t3rxYs7R0Yq7rcUKrXjTWz02Vl6nS5zxbg29AJXhUSHsC1CJMDEl +7NTbXlpQX7920fL5jkllVb9u5H9R4aQrTjGrbdbGpqRO1vqf7ZzGsOOPdlZGRm6P +Y/ixSrR+IzYOUCXAuGa4fP2W5GitTnZuzZuu7u8Ups5cY9+/MOgXvBp4RSvwNiqd +FYi2xLX6Ab51R4377MTN3+/bm5uaDbgiIQn6GiGiTXBLEEUgqKg1WGkoKsvTs2rk +0Yr40lbNyRuR/93g5sHdDFNUE0RdLK02Vex4h/547dgJeRkZGl268DPgglBjC7Wu +QSSPyl+oL9e3dsuf/uZdf0ypsx2ILla7fv3Z9XVIpmg3gR2yrQZW693tNGW3du37 +lz9x4iP8QGZgdqra4uP1KifxZxbUxMuEUynq2Wm6ULlidu2ZOxP09fcgT9io6qqo +pjpaDE3Mx9277VsclNGzdu2YrEh9wiD6kV1qEiEP8e4Fq7asnM8d4nvGzVxh17s/ +YTv4d1CA3Jsh7Z+e24CByi274bS04Hhper02Xs3bEVuEBg8vG+y5KEtSCyLGq36N +cD7Ndl7tyyboJ3siSuBbadu3fvfSRz7969e3aAuNYl3p2wfPzv8P1lq+7fuicjM0 +uHrBY+XFbGvp2bEifhPi7EtnXr1u3bd2zdumXLxvsTVy7/3vX8/LLlq9Zu2b4nMy +MT/Z+ZuW/nlk2TdK/gqsS1a9dtROv++9cmrky49fp+fNmyhMR1SO579+3ZvXP7ln +WJCZN2e2VCwt2JeN29MmHZ9677x5ctT0gEwW/cuGnd2vtWLb9pUlcCXsuXfbufXg +Y/u3LlqpXw103fre/WjbD+HzRGTE72Fay5AAAAAElFTkSuQmCC +` diff --git a/goMetrix/app.wasm/echarts.go b/goMetrix/app.wasm/echarts.go new file mode 100644 index 0000000..6fa55b9 --- /dev/null +++ b/goMetrix/app.wasm/echarts.go @@ -0,0 +1,162 @@ +package main + +import ( + "Toolbox/goDataverseStrict/metrics" + "errors" + "syscall/js" + + "git.archium.org/archium_public/ebkTools/wasm" + archiumwasm "git.archium.org/archium_public/ebkTools/wasm" +) + +const ca0 = `` + +const insebody0 = ` const ctx = document.getElementById('barChart'); + + //var labelsa = ['A','B','C','D','E','F','G','H']; + //var dataaa = [860,1140,1060,1060,1070,1110,1330,2210,7830,2478]; + //var dataab = [1600,1700,1700,1900,2000,2700,4000,5000,6000,7000]; + + var dataa = { + labels: [], //labelsa, + datasets: [{ + label: "Gesamtanzahl", + data: [], //[1,11,10,60,10,70,111,13], + borderColor: "red", + backgroundColor: "red", + borderWidth: 1, + fill: true + },{ + label: "Differenz", + data: [], //[16,17,17,19,20,27,40,50], + borderColor: "blue", + backgroundColor: "blue", + borderWidth: 1, + fill: false + }] + }; + + + var fubagchart = new Chart(ctx, { + type: 'bar', + data: dataa, + options: { + scales: { + y: { + beginAtZero: true + } + } + } + }); +` + +func helpTpGetLevelStatus(injectpoint js.Value, meisleisz *[]metrics.OneJumpPointSet, level int8) (result0 []wasm.Checkerboard, result1 string) { + a, _ := metrics.FilterStacklist(*meisleisz, level) + var b []string + for _, v := range a { + b = append(b, metrics.IDRequestCriteriaPrefix+v) + } + + result0 = wasm.GetStatusFromBulkOfIds(injectpoint, b) + + for _, v := range wasm.GetStatusFromBulkOfIds(injectpoint, b) { + if v.Checked { + result1 = v.Value + break + } + } + + return +} + +func (gothis *lokalRequestType) changeTicker(s string, l int8) { + dombase := js.Global().Get("document") + + //closureGetIdWhichJustChanged := getIdWhichJustChanged() + //log.Println("DIE BACK:", s, l) + //s, l := closureGetIdWhichJustChanged(dombase, metrics.OneJumpPoints) + + //FIXME: Aktivierung und Deaktivierung von Datensätzen pro Level funktioniert nicht mehr!? Neu machen, im Moment ignoriere ich das, damit Elfrun arbeiten kann. + actualizeForms(dombase, metrics.OneJumpPoints, int8(l), s) + //actualizeForms(dombase, metrics.OneJumpPoints, 2, s) + +} + +func (gothis *lokalRequestType) pseudoSubmit(jsthis js.Value, args []js.Value) any { + dombase := js.Global().Get("document") + + gothis.Level0MetricsType, gothis.Level1MetricsDataCountType, gothis.Level2SearchType, gothis.Level21UserInput, gothis.Level3ReturnformatType = func() string { + _, b := helpTpGetLevelStatus(dombase, &metrics.OneJumpPoints, 0) + return b + }(), + func() string { + _, b := helpTpGetLevelStatus(dombase, &metrics.OneJumpPoints, 1) + return b + }(), + func() string { + _, b := helpTpGetLevelStatus(dombase, &metrics.OneJumpPoints, 2) + return b + }(), + func() string { + _, b := helpTpGetLevelStatus(dombase, &metrics.OneJumpPoints, 2) + switch b { + case string(metrics.ST1total): + return "" + default: + //case string(metrics.ST2_tomonth): + //case string(metrics.ST3_pastdays): + //case string(metrics.ST4_monthly): + //case string(metrics.ST5_tree): + return dombase.Call(archiumwasm.DOCUMENTS_METHOD_getElementById, metrics.IDRequestTextPrefix+b).Get("value").String() + } + }(), + func() string { + _, b := helpTpGetLevelStatus(dombase, &metrics.OneJumpPoints, 3) + return b + }() + + //triggerResultprintation(metrics.MetricsType(checked_type), metrics.ReturnformatType(checked_result), newcheckers, bodyInject) + + return nil +} + +func removeAllDataGo(this js.Value, args []js.Value) interface{} { + chart := args[0] + //log.Println(len(args)) + //log.Printf("%v\n", args) + //_ = js.Global().Call("alert", countDatasets) + + for datasetCounter, countDatasets, countDatas := 0, chart.Get("data").Get("datasets").Index(0).Get("data").Get("length").Int(), chart.Get("data").Get("datasets").Get("length").Int(); datasetCounter < countDatasets; datasetCounter++ { + + chart.Get("data").Get("labels").Call("pop") + + for i := 0; i < countDatas; i++ { + chart.Get("data").Get("datasets").Index(i).Get("data").Call("pop") + } + } + + chart.Call("update") + return nil +} + +func addAllDataGo(this js.Value, args []js.Value) any { + chart, newdata := args[0], args[1] + + var numberOfValues int + + if numberOfValues = newdata.Index(0).Get("length").Int(); numberOfValues != newdata.Index(0).Get("length").Int() || numberOfValues != newdata.Index(2).Get("length").Int() { + return errors.New("Inconsistent input data array!") + } else { + for i := 0; i < numberOfValues; i++ { + chart.Get("data").Get("labels").Call("push", newdata.Index(0).Index(i)) + chart.Get("data").Get("datasets").Index(0).Get("data").Call("push", newdata.Index(1).Index(i)) + chart.Get("data").Get("datasets").Index(1).Get("data").Call("push", newdata.Index(2).Index(i)) + } + + //log.Println(chart, newdata) + //log.Println(newdata.Index(0), newdata.Index(0).Index(0)) + + chart.Call("update") + return nil + } +} diff --git a/goMetrix/app.wasm/main.go b/goMetrix/app.wasm/main.go new file mode 100644 index 0000000..29399df --- /dev/null +++ b/goMetrix/app.wasm/main.go @@ -0,0 +1,252 @@ +package main + +import ( + "reflect" + "strings" + "syscall/js" + "time" + + "Toolbox/goDataverseStrict/metrics" + + "git.archium.org/archium_public/ebkTools/wasm" + archiumwasm "git.archium.org/archium_public/ebkTools/wasm" + //_ nwa "git.archium.org/archium_public/ebkTools/nhooyrioWebsocketAddons" + //"Toolbox/goDataverseStrict/metrics" +) + +// Setze und lese aus ID +const ( + //ENHANCErecords = false + //ENHANCEebenen = false + DEBUG = true + LOOPTAKT = "0.6s" //Kontschi sagt "0.7s" + PDPURL = "https://pdp.archium.org" //"http://localhost:8080" + SPANSEPARATOR = "bis" +) + +/* +var signal = make(chan int) + +func keepAlive() { + for { + <-signal + } +} +*/ + +func getIdWhichJustChanged() func(js.Value, []metrics.OneJumpPointSet) (string, int8) { + var oldIds, newIds []wasm.Checkerboard + + internalClosureFunction := func(injectpoint js.Value, ojpsdata []metrics.OneJumpPointSet) (string, int8) { + var founditS string + var founditI int8 = -1 //Default + + var tmpIdsS []string + var tmpIdsI []int8 + + for l := int8(0); l <= 3; l++ { + a, _ := metrics.FilterStacklist(ojpsdata, l) + + for _, v := range a { + tmpIdsS = append(tmpIdsS, metrics.IDRequestCriteriaPrefix+v) + tmpIdsI = append(tmpIdsI, l) + } + } + + //log.Println(tmpIdsS) + newIds = wasm.GetStatusFromBulkOfIds(injectpoint, tmpIdsS) + + if len(oldIds) > 0 && !reflect.DeepEqual(oldIds, newIds) { + for i, n := range newIds { + if oldIds[i].Checked != n.Checked && !oldIds[i].Checked && n.Checked { //newIds[i].Checked + founditS = strings.TrimPrefix(n.Id, metrics.IDRequestCriteriaPrefix) + founditI = tmpIdsI[i] + break + } + } + + } + oldIds = newIds + + return founditS, founditI + + } + return internalClosureFunction +} + +func barseTuration(s string) time.Duration { + d, err := time.ParseDuration(s) + if err != nil { + panic(err) + } + return d +} + +func main() { + + var ( + dombase, bodyInject, scriptarea, chartarea, submitbutton js.Value + //dombase, body, body2, butt, , bodyDatabase, bodyTectonics, js.Value + + /*TODO: WICHTIG nicht löschen + oldcheckers, newcheckers []archiumwasm.Checkerboard + checked_type, oldchecked_type, checked_result string + */ + ) + + closureGetIdWhichJustChanged := getIdWhichJustChanged() + + //log.Println("started") + + //connectionReceive, _, errReceive := websocket.Dial(ctx, "ws://"+configs["websockeIp"]+":"+configs["websocketPort0S"], nil) + //connectionSend, _, errSend := websocket.Dial(ctx, "ws://"+configs["websockeIp"]+":"+configs["websocketPort1R"], nil) + + dombase = js.Global().Get("document") + + //bodyDatabase = dombase.Call("getElementById", vectorIdDatabase) //.Index(0) + //bodyTectonics = dombase.Call("getElementById", vectorIdDescription) + bodyInject = dombase.Call(wasm.DOCUMENTS_METHOD_getElementById, "injectarea") + scriptarea = dombase.Call(wasm.DOCUMENTS_METHOD_getElementById, "scriptarea") + //formarea = dombase.Call("getElementById", "formarea") + //testarea = dombase.Call(wasm.DOCUMENTS_METHOD_getElementById, "testarea") + + chartarea = dombase.Call(archiumwasm.DOCUMENTS_METHOD_getElementById, "chartarea") + submitbutton = dombase.Call(archiumwasm.DOCUMENTS_METHOD_getElementById, metrics.IDFormSubmit) + + var oldPseudoSubmitData, pseudoSubmitData lokalRequestType + + //butt = dombase.Call("getElementById", "runButton") + //lmog.Println(butt) + + // tmpRohtext := bodyDatabase.Get("innerText").String() + //tmpRohtextTectonics := bodyTectonics.Get("innerText").String() + + //bodyInject.Set("innerText", fmt.Sprintf("%v", os.Args)) + + if DEBUG { // Zeige Pinguin als Zeichen dafür, daß das Programm vollständig durchlaufen wurde + image := dombase.Call("createElement", "img") + image.Set("src", "data:image/png;base64,"+imageByteArrayAsBase64) + bodyInject.Call("appendChild", image) + } + + //image2 := dombase.Call("createElement", "img") + //image2.Set("src", "data:image/png;base64,"+imageByteArrayAsBase64) + //body2.Call("appendChild", image) + + //js.Global().Get("console").Call("log", "Just another way to send a string to console-log!") + //js.Global().Get("document").Call("getElementsByTagName", "body").Index(0).Set("innerText", time.Now().String()) + + //keepAlive() + /* + fmt.Println("HIER") + fmt.Println(js.Global().Get("dataaa").Index(1)) + fmt.Println("BIER") + fmt.Println(windowbase.Get("dataaa")) + + dataaaJS := windowbase.Get("dataaa") + var bb []byte + fmt.Println(dataaaJS) + fmt.Println(bb) + + // windowbase.Set("dataaa", js.ValueOf([]interface{}{1, 2, 3, 4, 5, 6, 7, 9})) + fmt.Println("GIER") + */ + //chartarea.Set("innerHTML", "") + chartarea.Set("innerHTML", ca0) + scriptarea.Set("innerHTML", insebody0) + + js.Global().Set("removeAllData", js.FuncOf(removeAllDataGo)) + js.Global().Set("addAllData", js.FuncOf(addAllDataGo)) + js.Global().Set("pseudoSubmit", js.FuncOf(pseudoSubmitData.pseudoSubmit)) + //log.Println( submitbutton Set("onclick", "pseudoSubmit")) + submitbutton.Call(archiumwasm.ELEMENTS_METHOD_setAttribute, "onclick", "pseudoSubmit()") + + /*TODO: WICHTIG nicht löschen + _, _, checked_result = archiumwasm.GetCheckedRadioOrCheckbox(dombase.Call(archiumwasm.DOCUMENTS_METHOD_getElementsByName, "form_results_radio")) //Ändert sich nach neuer Arbeitsweise ja nicht mehr. + var firstTimeEqual bool + */ + + for ; true; time.Sleep(barseTuration(LOOPTAKT)) { + s, l := closureGetIdWhichJustChanged(dombase, metrics.OneJumpPoints) + + //log.Println("Websocket loop started") + + //botz := dombase.Call("getElementById", "input_"+string(metrics.MT1dataverses)) + //botz := dombase.Call("getElementById", "form_types") //.Get("innerHTML") + //dombase.Call("getElementById", "form_types") + //botz.Call("createAttribute", "checked") + //botz.Call("setAttribute", "checked", "true") + //fmt.Println(botz.Call("getAttribute", "checked").String()) + + // log.Println(botz.Index(0).Get("checked")) + // log.Println(botz.Index(1).Get("checked")) + // log.Println(botz.Index(2).IsUndefined()) + + //log.Println(dombase.Call(archiumwasm.DOCUMENTS_METHOD_getElementById, "input_"+string(metrics.ST1_total)).Get("value").String()) + + /*FIXME: Wichtig Nicht löschen + + _, _, checked_type = archiumwasm.GetCheckedRadioOrCheckbox(dombase.Call(archiumwasm.DOCUMENTS_METHOD_getElementsByName, "form_types_radio")) + newcheckers = archiumwasm.GetStatusFromBulkOfIds(dombase, []string{ + //"input_" + string(metrics.MT1dataverses), + //"input_" + string(metrics.MT2datasets), + //"input_" + string(metrics.MT3files), + //"input_" + string(metrics.MT4downloads), + //"input_" + string(metrics.MT5filedownloads), + //"input_" + string(metrics.MT6uniquefiledownloads), + //"input_" + string(metrics.RT1json), + //"input_" + string(metrics.RT2csv), + "input_" + string(metrics.ST1_total), + "input_" + string(metrics.ST2_tomonth), + "input_" + string(metrics.ST3_pastdays), + "input_" + string(metrics.ST4_monthly), + "input_" + string(metrics.ST5_tree), + }) + */ + + //dombase.Call("getElementById", metrics.IDRequestCriteriaPrefix+metrics.MT1dataverses).Call("setAttribute", "checked", "true") + //wasm.GetStatusFromBulkOfIds(dombase, metrics.FilterStacklist(metrics.OneJumpPoints, 0)) + + //testarea.Set("innerHTML", fmt.Sprintf("OneJumpPointSet: %v

", "TEST")) + + //log.Println(oldcheckers) + //log.Println(newcheckers) + //log.Println(reflect.DeepEqual(oldcheckers, newcheckers)) + + /*TODO: Wichtig nicht löschen + if reflect.DeepEqual(oldcheckers, newcheckers) && oldchecked_type == checked_type { + if !firstTimeEqual { + firstTimeEqual = true + + //_, _, checked_type = archiumwasm.GetCheckedRadioOrCheckbox(dombase.Call(archiumwasm.DOCUMENTS_METHOD_getElementsByName, "form_types_radio")) + //_, _, checked_result = archiumwasm.GetCheckedRadioOrCheckbox(dombase.Call(archiumwasm.DOCUMENTS_METHOD_getElementsByName, "form_results_radio")) + + triggerResultprintation(metrics.MetricsType(checked_type), metrics.ReturnformatType(checked_result), newcheckers, bodyInject) + + } + //windowbase.Set("dataaa", js.ValueOf([]interface{}{9, 2, 3, 8, 5, 6, 2, 1})) + // _ = windowbase.Get("fubagchart").Call("update", "") + } else { + oldcheckers = newcheckers + oldchecked_type = checked_type + firstTimeEqual = false + //scriptarea.Set("innerHTML", insebody0) + + //dataaaJS := windowbase.Get("fubagchart") + //_ = dataaaJS.Call("update", "") + + //_ =js.Global().Call("alert", 123) + //windowbase.Set("dataaa", js.ValueOf([]interface{}{1, 2, 3, 4, 5, 6, 7, 9})) + //_ = windowbase.Get("fubagchart").Call("update", "") + } + */ + + pseudoSubmitData.changeTicker(s, l) + + if !reflect.DeepEqual(oldPseudoSubmitData, pseudoSubmitData) { + pseudoSubmitData.triggerResultprintationGedöhnz(bodyInject) + } + oldPseudoSubmitData = pseudoSubmitData + } + +} diff --git a/goMetrix/app.wasm/output.go b/goMetrix/app.wasm/output.go new file mode 100644 index 0000000..a8b77e8 --- /dev/null +++ b/goMetrix/app.wasm/output.go @@ -0,0 +1,267 @@ +package main + +import ( + "Toolbox/goDataverseStrict/metrics" + "fmt" + "log" + "strconv" + "strings" + "syscall/js" + "time" + + "git.archium.org/archium_public/ebkTools/wasm" +) + +type lokalRequestType metrics.RequestComponentsType + +func metricsSelectDispatcher(server_url, api_token string, rcs metrics.RequestComponentsType) (mdat []byte, mres string) { + var err error + var mtypeOrMdctypeCombi string + + //var header map[string]string + header := make(map[string]string) + + if len(api_token) > 0 { + header["X-Dataverse-key"] = api_token + } + if len(rcs.Level3ReturnformatType) > 0 { + header["Accept"] = string(rcs.Level3ReturnformatType) + } + + switch rcs.Level0MetricsType { + case string(metrics.MT7makeDataCount): + mtypeOrMdctypeCombi = rcs.Level0MetricsType + "/" + rcs.Level1MetricsDataCountType + default: + mtypeOrMdctypeCombi = rcs.Level0MetricsType + } + + switch rcs.Level2SearchType { + case string(metrics.ST1total): + mdat, mres = metrics.MetricsTotal(PDPURL, "", metrics.ReturnformatType(rcs.Level3ReturnformatType), mtypeOrMdctypeCombi) + case string(metrics.ST2tomonth): + ts, _ := time.Parse("2006-01", rcs.Level21UserInput) + mdat, mres = metrics.MetricsToMonth(PDPURL, "", metrics.ReturnformatType(rcs.Level3ReturnformatType), mtypeOrMdctypeCombi, ts) + case string(metrics.ST3pastdays): + mdat, mres = metrics.MetricsPastDays(PDPURL, "", metrics.ReturnformatType(rcs.Level3ReturnformatType), mtypeOrMdctypeCombi, func() int { + r, _ := strconv.Atoi(rcs.Level21UserInput) + return r + }()) + case string(metrics.ST4monthly): + if len(rcs.Level21UserInput) >= 17 && strings.ContainsAny(strings.ToLower(rcs.Level21UserInput), strings.ToLower(SPANSEPARATOR)) { + ts := func(s string) [2]time.Time { + defer recover() + rowvalues := make([]string, 2, 2) + rowvalues = strings.SplitN(s, strings.ToLower(SPANSEPARATOR), 2) + + return [2]time.Time{func() (r time.Time) { + r, _ = time.Parse("2006-01", strings.TrimSpace(rowvalues[0])) + return + }(), func() (r time.Time) { + r, _ = time.Parse("2006-01", strings.TrimSpace(rowvalues[1])) + return + }()} + }(strings.ToLower(rcs.Level21UserInput)) + + mdat, mres = metrics.MetricsReallyMonthlySpan(PDPURL, "", metrics.ReturnformatType(rcs.Level3ReturnformatType), mtypeOrMdctypeCombi, ts) + } else { + mdat, mres = metrics.MetricsReallyMonthly(PDPURL, "", metrics.ReturnformatType(rcs.Level3ReturnformatType), mtypeOrMdctypeCombi) + } + case string(metrics.ST5tree): + ts, _ := time.Parse("2006-01", rcs.Level21UserInput) + mdat, mres = metrics.MetricsTree(PDPURL, "", metrics.ReturnformatType(rcs.Level3ReturnformatType), ts) + } + + //log.Println("DEBUG:", mtypeOrMdctypeCombi) + + //res := metrics.MonthlyJsonData{} + //json.Unmarshal([]byte(data), &res) + //log.Println("TIE BREAK", metrics.JsonStructSelector(mdat)) + + if err != nil { + log.Fatal(err) + } + return +} + +func (this *lokalRequestType) triggerResultprintationGedöhnz(injectpoint js.Value) { + + injectpoint.Set("innerHTML", fmt.Sprintf("%v
%v
%v %v
%v

", this.Level0MetricsType, this.Level1MetricsDataCountType, this.Level2SearchType, this.Level21UserInput, this.Level3ReturnformatType)) + + data, request := metricsSelectDispatcher(PDPURL, "", metrics.RequestComponentsType(*this)) + + //res := metrics.MonthlyJsonData{} + //log.Println(json.Unmarshal(data, &res)) + //fmt.Println(res) + + htmlstring := fmt.Sprintf("DIE BAQUE %s
%s

", request, data) + //log.Println("DIE BAQUE", htmlstring) + + //res := metrics.MonthlyJsonData{} + //json.Unmarshal([]byte(data), &res) + //log.Println("TIE BREAK", metrics.LinkifyDoiDoi(data)) + + //https://planetary-data-portal.org/file.xhtml?persistentId= + + //var htmlstring string + //windowbase := js.Global().Get("window") + + injectpoint.Set("innerHTML", time.Now().String()+"
"+htmlstring) + //res := metrics.MonthlyJsonData{} + /* + + json.Unmarshal(md, &res) + + label := make([]interface{}, len(res.Data), len(res.Data)) + bar0 := make([]any, len(res.Data), len(res.Data)) + bar1 := make([]any, len(res.Data), len(res.Data)) + for i := 0; i < len(res.Data); i++ { + label[i] = res.Data[i].Date + bar0[i] = res.Data[i].Counttotal + bar1[i] = res.Data[i].Countmonth + } + //log.Println(res.Data[0].) + + _ = windowbase.Call("removeAllData", windowbase.Get("fubagchart")) + //_ = windowbase.Call("addAllData", windowbase.Get("fubagchart"), js.ValueOf([]interface{}{[]interface{}{"Aa", "Bb"}, []interface{}{9, 2}, []interface{}{2, 9}})) + + _ = windowbase.Call("addAllData", windowbase.Get("fubagchart"), js.ValueOf([]interface{}{label, bar0, bar1})) + */ + +} + +/* +func triggerResultprintation(teip metrics.MetricsType, riesaltformat metrics.ReturnformatType, deineCheckers []archiumwasm.Checkerboard, injectpoint js.Value) { + + var htmlstring string + var windowbase js.Value + + windowbase = js.Global().Get("window") + + for _, v := range deineCheckers { + if v.Disabled == false { //= the single one, that is enabled + switch v.Id { + case "input_" + string(metrics.ST1total): + md, me := metrics.MetricsTotal(PDPURL, "", riesaltformat, teip) + htmlstring = fmt.Sprintf("%s
%s

", me, md) + case "input_" + string(metrics.ST2tomonth): + ts, _ := time.Parse("2006-01", v.Value) + md, me := metrics.MetricsToMonth(PDPURL, "", riesaltformat, teip, ts) + htmlstring = fmt.Sprintf("%s
%s

", me, md) + case "input_" + string(metrics.ST3pastdays): + md, me := metrics.MetricsPastDays(PDPURL, "", riesaltformat, teip, func() int { + r, _ := strconv.Atoi(v.Value) + return r + }()) + htmlstring = fmt.Sprintf("%s
%s

", me, md) + case "input_" + string(metrics.ST4monthly): + var me string + var md []byte + + if len(v.Value) >= 17 && strings.ContainsAny(strings.ToLower(v.Value), strings.ToLower(SPANSEPARATOR)) { + ts := func(s string) [2]time.Time { + defer recover() + rowvalues := make([]string, 2, 2) + rowvalues = strings.SplitN(s, strings.ToLower(SPANSEPARATOR), 2) + + return [2]time.Time{func() (r time.Time) { + r, _ = time.Parse("2006-01", strings.TrimSpace(rowvalues[0])) + return + }(), func() (r time.Time) { + r, _ = time.Parse("2006-01", strings.TrimSpace(rowvalues[1])) + return + }()} + }(strings.ToLower(v.Value)) + + md, me = metrics.MetricsReallyMonthlySpan(PDPURL, "", riesaltformat, teip, ts) + } else { + md, me = metrics.MetricsReallyMonthly(PDPURL, "", riesaltformat, teip) + } + + res := metrics.MonthlyJsonData{} + json.Unmarshal(md, &res) + + label := make([]interface{}, len(res.Data), len(res.Data)) + bar0 := make([]any, len(res.Data), len(res.Data)) + bar1 := make([]any, len(res.Data), len(res.Data)) + for i := 0; i < len(res.Data); i++ { + label[i] = res.Data[i].Date + bar0[i] = res.Data[i].Counttotal + bar1[i] = res.Data[i].Countmonth + } + //log.Println(res.Data[0].) + + _ = windowbase.Call("removeAllData", windowbase.Get("fubagchart")) + //_ = windowbase.Call("addAllData", windowbase.Get("fubagchart"), js.ValueOf([]interface{}{[]interface{}{"Aa", "Bb"}, []interface{}{9, 2}, []interface{}{2, 9}})) + + _ = windowbase.Call("addAllData", windowbase.Get("fubagchart"), js.ValueOf([]interface{}{label, bar0, bar1})) + + htmlstring = fmt.Sprintf("%s
%s

", me, md) + case "input_" + string(metrics.ST5tree): + ts, _ := time.Parse("2006-01", v.Value) + md, me := metrics.MetricsTree(PDPURL, "", riesaltformat, ts) + htmlstring = fmt.Sprintf("%s
%s

", me, md) + } + + //md, me := metrics.MetricsTree("https://pdp.archium.org", "", metrics.RT1json, time.Time{}) + injectpoint.Set("innerHTML", time.Now().String()+"
"+htmlstring) + //log.Printf("WASM: %s
%s

", me, md) + } + } +} +*/ + +func actualizeForms[dings metrics.MetricsType | metrics.MetricsDataCountType | metrics.SearchType | metrics.ReturnformatType | string](injectpoint js.Value, ojpsdata []metrics.OneJumpPointSet, startlevel int8, startindex dings) { + //disable all + //log.Println(startlevel) + //log.Println("HIER") + if startlevel >= 0 { + for i := int8(startlevel) + 1; i <= 3; i++ { + list, _ := metrics.FilterStacklist(ojpsdata, i) + for _, idmark := range list { + injectpoint.Call(wasm.DOCUMENTS_METHOD_getElementById, metrics.IDRequestCriteriaPrefix+idmark).Call(wasm.ELEMENTS_METHOD_setAttribute, "disabled", "") + + } + } + + /* + for i := 0; i < len(ojpsdata); i++ { + log.Println(startlevel, ojpsdata[i], startindex) + } + */ + + //enable any + for i := 0; i < len(ojpsdata); i++ { + if ojpsdata[i].Active { + switch startlevel { + case 0: + injectpoint.Call(wasm.DOCUMENTS_METHOD_getElementById, metrics.IDRequestCriteriaPrefix+string(ojpsdata[i].Level0)).Call(wasm.ELEMENTS_METHOD_removeAttribute, "disabled", "") + fallthrough + case 1: + if startindex == dings(ojpsdata[i].Level0) { + injectpoint.Call(wasm.DOCUMENTS_METHOD_getElementById, metrics.IDRequestCriteriaPrefix+string(ojpsdata[i].Level1)).Call(wasm.ELEMENTS_METHOD_removeAttribute, "disabled", "") + } + fallthrough + case 2: + if startindex == dings(ojpsdata[i].Level0) || startindex == dings(ojpsdata[i].Level1) { + injectpoint.Call(wasm.DOCUMENTS_METHOD_getElementById, metrics.IDRequestCriteriaPrefix+string(ojpsdata[i].Level2)).Call(wasm.ELEMENTS_METHOD_removeAttribute, "disabled", "") + } + fallthrough + default: // ist in diesem Fall identisch mit case 3: + if startindex == dings(ojpsdata[i].Level0) || startindex == dings(ojpsdata[i].Level1) || startindex == dings(ojpsdata[i].Level2) { + injectpoint.Call(wasm.DOCUMENTS_METHOD_getElementById, metrics.IDRequestCriteriaPrefix+string(ojpsdata[i].Level3)).Call(wasm.ELEMENTS_METHOD_removeAttribute, "disabled", "") + } + } + } + // for idindex, idmark := range list { + // if activity[idindex] { + // injectpoint.Call(wasm.DOCUMENTS_METHOD_getElementById, metrics.IDRequestCriteriaPrefix+idmark).Call(wasm.ELEMENTS_METHOD_removeAttribute, "disabled", "") + // } + // } + } + } + + /* + injectpoint.Call(wasm.DOCUMENTS_METHOD_getElementById, metrics.IDRequestCriteriaPrefix+string(metrics.MDCT2viewsTotalRegular)).Call(wasm.ELEMENTS_METHOD_setAttribute, "disabled", "") + injectpoint.Call(wasm.DOCUMENTS_METHOD_getElementById, metrics.IDRequestCriteriaPrefix+string(metrics.MDCT2viewsTotalRegular)).Call(wasm.ELEMENTS_METHOD_removeAttribute, "disabled", "") + */ +} diff --git a/goMetrix/app.wasm/wasm_exec.js b/goMetrix/app.wasm/wasm_exec.js new file mode 100644 index 0000000..82041e6 --- /dev/null +++ b/goMetrix/app.wasm/wasm_exec.js @@ -0,0 +1,626 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +(() => { + // Map multiple JavaScript environments to a single common API, + // preferring web standards over Node.js API. + // + // Environments considered: + // - Browsers + // - Node.js + // - Electron + // - Parcel + // - Webpack + + if (typeof global !== "undefined") { + // global already exists + } else if (typeof window !== "undefined") { + window.global = window; + } else if (typeof self !== "undefined") { + self.global = self; + } else { + throw new Error("cannot export Go (neither global, window nor self is defined)"); + } + + if (!global.require && typeof require !== "undefined") { + global.require = require; + } + + if (!global.fs && global.require) { + const fs = require("fs"); + if (typeof fs === "object" && fs !== null && Object.keys(fs).length !== 0) { + global.fs = fs; + } + } + + const enosys = () => { + const err = new Error("not implemented"); + err.code = "ENOSYS"; + return err; + }; + + if (!global.fs) { + let outputBuf = ""; + global.fs = { + constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused + writeSync(fd, buf) { + outputBuf += decoder.decode(buf); + const nl = outputBuf.lastIndexOf("\n"); + if (nl != -1) { + console.log(outputBuf.substr(0, nl)); + outputBuf = outputBuf.substr(nl + 1); + } + return buf.length; + }, + write(fd, buf, offset, length, position, callback) { + if (offset !== 0 || length !== buf.length || position !== null) { + callback(enosys()); + return; + } + const n = this.writeSync(fd, buf); + callback(null, n); + }, + chmod(path, mode, callback) { callback(enosys()); }, + chown(path, uid, gid, callback) { callback(enosys()); }, + close(fd, callback) { callback(enosys()); }, + fchmod(fd, mode, callback) { callback(enosys()); }, + fchown(fd, uid, gid, callback) { callback(enosys()); }, + fstat(fd, callback) { callback(enosys()); }, + fsync(fd, callback) { callback(null); }, + ftruncate(fd, length, callback) { callback(enosys()); }, + lchown(path, uid, gid, callback) { callback(enosys()); }, + link(path, link, callback) { callback(enosys()); }, + lstat(path, callback) { callback(enosys()); }, + mkdir(path, perm, callback) { callback(enosys()); }, + open(path, flags, mode, callback) { callback(enosys()); }, + read(fd, buffer, offset, length, position, callback) { callback(enosys()); }, + readdir(path, callback) { callback(enosys()); }, + readlink(path, callback) { callback(enosys()); }, + rename(from, to, callback) { callback(enosys()); }, + rmdir(path, callback) { callback(enosys()); }, + stat(path, callback) { callback(enosys()); }, + symlink(path, link, callback) { callback(enosys()); }, + truncate(path, length, callback) { callback(enosys()); }, + unlink(path, callback) { callback(enosys()); }, + utimes(path, atime, mtime, callback) { callback(enosys()); }, + }; + } + + if (!global.process) { + global.process = { + getuid() { return -1; }, + getgid() { return -1; }, + geteuid() { return -1; }, + getegid() { return -1; }, + getgroups() { throw enosys(); }, + pid: -1, + ppid: -1, + umask() { throw enosys(); }, + cwd() { throw enosys(); }, + chdir() { throw enosys(); }, + } + } + + if (!global.crypto && global.require) { + const nodeCrypto = require("crypto"); + global.crypto = { + getRandomValues(b) { + nodeCrypto.randomFillSync(b); + }, + }; + } + if (!global.crypto) { + throw new Error("global.crypto is not available, polyfill required (getRandomValues only)"); + } + + if (!global.performance) { + global.performance = { + now() { + const [sec, nsec] = process.hrtime(); + return sec * 1000 + nsec / 1000000; + }, + }; + } + + if (!global.TextEncoder && global.require) { + global.TextEncoder = require("util").TextEncoder; + } + if (!global.TextEncoder) { + throw new Error("global.TextEncoder is not available, polyfill required"); + } + + if (!global.TextDecoder && global.require) { + global.TextDecoder = require("util").TextDecoder; + } + if (!global.TextDecoder) { + throw new Error("global.TextDecoder is not available, polyfill required"); + } + + // End of polyfills for common API. + + const encoder = new TextEncoder("utf-8"); + const decoder = new TextDecoder("utf-8"); + + global.Go = class { + constructor() { + this.argv = ["js"]; + this.env = {}; + this.exit = (code) => { + if (code !== 0) { + console.warn("exit code:", code); + } + }; + this._exitPromise = new Promise((resolve) => { + this._resolveExitPromise = resolve; + }); + this._pendingEvent = null; + this._scheduledTimeouts = new Map(); + this._nextCallbackTimeoutID = 1; + + const setInt64 = (addr, v) => { + this.mem.setUint32(addr + 0, v, true); + this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true); + } + + const getInt64 = (addr) => { + const low = this.mem.getUint32(addr + 0, true); + const high = this.mem.getInt32(addr + 4, true); + return low + high * 4294967296; + } + + const loadValue = (addr) => { + const f = this.mem.getFloat64(addr, true); + if (f === 0) { + return undefined; + } + if (!isNaN(f)) { + return f; + } + + const id = this.mem.getUint32(addr, true); + return this._values[id]; + } + + const storeValue = (addr, v) => { + const nanHead = 0x7FF80000; + + if (typeof v === "number" && v !== 0) { + if (isNaN(v)) { + this.mem.setUint32(addr + 4, nanHead, true); + this.mem.setUint32(addr, 0, true); + return; + } + this.mem.setFloat64(addr, v, true); + return; + } + + if (v === undefined) { + this.mem.setFloat64(addr, 0, true); + return; + } + + let id = this._ids.get(v); + if (id === undefined) { + id = this._idPool.pop(); + if (id === undefined) { + id = this._values.length; + } + this._values[id] = v; + this._goRefCounts[id] = 0; + this._ids.set(v, id); + } + this._goRefCounts[id]++; + let typeFlag = 0; + switch (typeof v) { + case "object": + if (v !== null) { + typeFlag = 1; + } + break; + case "string": + typeFlag = 2; + break; + case "symbol": + typeFlag = 3; + break; + case "function": + typeFlag = 4; + break; + } + this.mem.setUint32(addr + 4, nanHead | typeFlag, true); + this.mem.setUint32(addr, id, true); + } + + const loadSlice = (addr) => { + const array = getInt64(addr + 0); + const len = getInt64(addr + 8); + return new Uint8Array(this._inst.exports.mem.buffer, array, len); + } + + const loadSliceOfValues = (addr) => { + const array = getInt64(addr + 0); + const len = getInt64(addr + 8); + const a = new Array(len); + for (let i = 0; i < len; i++) { + a[i] = loadValue(array + i * 8); + } + return a; + } + + const loadString = (addr) => { + const saddr = getInt64(addr + 0); + const len = getInt64(addr + 8); + return decoder.decode(new DataView(this._inst.exports.mem.buffer, saddr, len)); + } + + const timeOrigin = Date.now() - performance.now(); + this.importObject = { + go: { + // Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters) + // may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported + // function. A goroutine can switch to a new stack if the current stack is too small (see morestack function). + // This changes the SP, thus we have to update the SP used by the imported function. + + // func wasmExit(code int32) + "runtime.wasmExit": (sp) => { + sp >>>= 0; + const code = this.mem.getInt32(sp + 8, true); + this.exited = true; + delete this._inst; + delete this._values; + delete this._goRefCounts; + delete this._ids; + delete this._idPool; + this.exit(code); + }, + + // func wasmWrite(fd uintptr, p unsafe.Pointer, n int32) + "runtime.wasmWrite": (sp) => { + sp >>>= 0; + const fd = getInt64(sp + 8); + const p = getInt64(sp + 16); + const n = this.mem.getInt32(sp + 24, true); + fs.writeSync(fd, new Uint8Array(this._inst.exports.mem.buffer, p, n)); + }, + + // func resetMemoryDataView() + "runtime.resetMemoryDataView": (sp) => { + sp >>>= 0; + this.mem = new DataView(this._inst.exports.mem.buffer); + }, + + // func nanotime1() int64 + "runtime.nanotime1": (sp) => { + sp >>>= 0; + setInt64(sp + 8, (timeOrigin + performance.now()) * 1000000); + }, + + // func walltime1() (sec int64, nsec int32) + "runtime.walltime1": (sp) => { + sp >>>= 0; + const msec = (new Date).getTime(); + setInt64(sp + 8, msec / 1000); + this.mem.setInt32(sp + 16, (msec % 1000) * 1000000, true); + }, + + // func scheduleTimeoutEvent(delay int64) int32 + "runtime.scheduleTimeoutEvent": (sp) => { + sp >>>= 0; + const id = this._nextCallbackTimeoutID; + this._nextCallbackTimeoutID++; + this._scheduledTimeouts.set(id, setTimeout( + () => { + this._resume(); + while (this._scheduledTimeouts.has(id)) { + // for some reason Go failed to register the timeout event, log and try again + // (temporary workaround for https://github.com/golang/go/issues/28975) + console.warn("scheduleTimeoutEvent: missed timeout event"); + this._resume(); + } + }, + getInt64(sp + 8) + 1, // setTimeout has been seen to fire up to 1 millisecond early + )); + this.mem.setInt32(sp + 16, id, true); + }, + + // func clearTimeoutEvent(id int32) + "runtime.clearTimeoutEvent": (sp) => { + sp >>>= 0; + const id = this.mem.getInt32(sp + 8, true); + clearTimeout(this._scheduledTimeouts.get(id)); + this._scheduledTimeouts.delete(id); + }, + + // func getRandomData(r []byte) + "runtime.getRandomData": (sp) => { + sp >>>= 0; + crypto.getRandomValues(loadSlice(sp + 8)); + }, + + // func finalizeRef(v ref) + "syscall/js.finalizeRef": (sp) => { + sp >>>= 0; + const id = this.mem.getUint32(sp + 8, true); + this._goRefCounts[id]--; + if (this._goRefCounts[id] === 0) { + const v = this._values[id]; + this._values[id] = null; + this._ids.delete(v); + this._idPool.push(id); + } + }, + + // func stringVal(value string) ref + "syscall/js.stringVal": (sp) => { + sp >>>= 0; + storeValue(sp + 24, loadString(sp + 8)); + }, + + // func valueGet(v ref, p string) ref + "syscall/js.valueGet": (sp) => { + sp >>>= 0; + const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16)); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 32, result); + }, + + // func valueSet(v ref, p string, x ref) + "syscall/js.valueSet": (sp) => { + sp >>>= 0; + Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32)); + }, + + // func valueDelete(v ref, p string) + "syscall/js.valueDelete": (sp) => { + sp >>>= 0; + Reflect.deleteProperty(loadValue(sp + 8), loadString(sp + 16)); + }, + + // func valueIndex(v ref, i int) ref + "syscall/js.valueIndex": (sp) => { + sp >>>= 0; + storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16))); + }, + + // valueSetIndex(v ref, i int, x ref) + "syscall/js.valueSetIndex": (sp) => { + sp >>>= 0; + Reflect.set(loadValue(sp + 8), getInt64(sp + 16), loadValue(sp + 24)); + }, + + // func valueCall(v ref, m string, args []ref) (ref, bool) + "syscall/js.valueCall": (sp) => { + sp >>>= 0; + try { + const v = loadValue(sp + 8); + const m = Reflect.get(v, loadString(sp + 16)); + const args = loadSliceOfValues(sp + 32); + const result = Reflect.apply(m, v, args); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 56, result); + this.mem.setUint8(sp + 64, 1); + } catch (err) { + storeValue(sp + 56, err); + this.mem.setUint8(sp + 64, 0); + } + }, + + // func valueInvoke(v ref, args []ref) (ref, bool) + "syscall/js.valueInvoke": (sp) => { + sp >>>= 0; + try { + const v = loadValue(sp + 8); + const args = loadSliceOfValues(sp + 16); + const result = Reflect.apply(v, undefined, args); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 40, result); + this.mem.setUint8(sp + 48, 1); + } catch (err) { + storeValue(sp + 40, err); + this.mem.setUint8(sp + 48, 0); + } + }, + + // func valueNew(v ref, args []ref) (ref, bool) + "syscall/js.valueNew": (sp) => { + sp >>>= 0; + try { + const v = loadValue(sp + 8); + const args = loadSliceOfValues(sp + 16); + const result = Reflect.construct(v, args); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 40, result); + this.mem.setUint8(sp + 48, 1); + } catch (err) { + storeValue(sp + 40, err); + this.mem.setUint8(sp + 48, 0); + } + }, + + // func valueLength(v ref) int + "syscall/js.valueLength": (sp) => { + sp >>>= 0; + setInt64(sp + 16, parseInt(loadValue(sp + 8).length)); + }, + + // valuePrepareString(v ref) (ref, int) + "syscall/js.valuePrepareString": (sp) => { + sp >>>= 0; + const str = encoder.encode(String(loadValue(sp + 8))); + storeValue(sp + 16, str); + setInt64(sp + 24, str.length); + }, + + // valueLoadString(v ref, b []byte) + "syscall/js.valueLoadString": (sp) => { + sp >>>= 0; + const str = loadValue(sp + 8); + loadSlice(sp + 16).set(str); + }, + + // func valueInstanceOf(v ref, t ref) bool + "syscall/js.valueInstanceOf": (sp) => { + sp >>>= 0; + this.mem.setUint8(sp + 24, (loadValue(sp + 8) instanceof loadValue(sp + 16)) ? 1 : 0); + }, + + // func copyBytesToGo(dst []byte, src ref) (int, bool) + "syscall/js.copyBytesToGo": (sp) => { + sp >>>= 0; + const dst = loadSlice(sp + 8); + const src = loadValue(sp + 32); + if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) { + this.mem.setUint8(sp + 48, 0); + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(sp + 40, toCopy.length); + this.mem.setUint8(sp + 48, 1); + }, + + // func copyBytesToJS(dst ref, src []byte) (int, bool) + "syscall/js.copyBytesToJS": (sp) => { + sp >>>= 0; + const dst = loadValue(sp + 8); + const src = loadSlice(sp + 16); + if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) { + this.mem.setUint8(sp + 48, 0); + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(sp + 40, toCopy.length); + this.mem.setUint8(sp + 48, 1); + }, + + "debug": (value) => { + console.log(value); + }, + } + }; + } + + async run(instance) { + if (!(instance instanceof WebAssembly.Instance)) { + throw new Error("Go.run: WebAssembly.Instance expected"); + } + this._inst = instance; + this.mem = new DataView(this._inst.exports.mem.buffer); + this._values = [ // JS values that Go currently has references to, indexed by reference id + NaN, + 0, + null, + true, + false, + global, + this, + ]; + this._goRefCounts = new Array(this._values.length).fill(Infinity); // number of references that Go has to a JS value, indexed by reference id + this._ids = new Map([ // mapping from JS values to reference ids + [0, 1], + [null, 2], + [true, 3], + [false, 4], + [global, 5], + [this, 6], + ]); + this._idPool = []; // unused ids that have been garbage collected + this.exited = false; // whether the Go program has exited + + // Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory. + let offset = 4096; + + const strPtr = (str) => { + const ptr = offset; + const bytes = encoder.encode(str + "\0"); + new Uint8Array(this.mem.buffer, offset, bytes.length).set(bytes); + offset += bytes.length; + if (offset % 8 !== 0) { + offset += 8 - (offset % 8); + } + return ptr; + }; + + const argc = this.argv.length; + + const argvPtrs = []; + this.argv.forEach((arg) => { + argvPtrs.push(strPtr(arg)); + }); + argvPtrs.push(0); + + const keys = Object.keys(this.env).sort(); + keys.forEach((key) => { + argvPtrs.push(strPtr(`${key}=${this.env[key]}`)); + }); + argvPtrs.push(0); + + const argv = offset; + argvPtrs.forEach((ptr) => { + this.mem.setUint32(offset, ptr, true); + this.mem.setUint32(offset + 4, 0, true); + offset += 8; + }); + + this._inst.exports.run(argc, argv); + if (this.exited) { + this._resolveExitPromise(); + } + await this._exitPromise; + } + + _resume() { + if (this.exited) { + throw new Error("Go program has already exited"); + } + this._inst.exports.resume(); + if (this.exited) { + this._resolveExitPromise(); + } + } + + _makeFuncWrapper(id) { + const go = this; + return function () { + const event = { id: id, this: this, args: arguments }; + go._pendingEvent = event; + go._resume(); + return event.result; + }; + } + } + + if ( + typeof module !== "undefined" && + global.require && + global.require.main === module && + global.process && + global.process.versions && + !global.process.versions.electron + ) { + if (process.argv.length < 3) { + console.error("usage: go_js_wasm_exec [wasm binary] [arguments]"); + process.exit(1); + } + + const go = new Go(); + go.argv = process.argv.slice(2); + go.env = Object.assign({ TMPDIR: require("os").tmpdir() }, process.env); + go.exit = process.exit; + WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject).then((result) => { + process.on("exit", (code) => { // Node.js exits if no event handler is pending + if (code === 0 && !go.exited) { + // deadlock, make Go print error and stack traces + go._pendingEvent = { id: 0 }; + go._resume(); + } + }); + return go.run(result.instance); + }).catch((err) => { + console.error(err); + process.exit(1); + }); + } +})(); diff --git a/goMetrix/goMetrix.go b/goMetrix/goMetrix.go new file mode 100644 index 0000000..5b800a6 --- /dev/null +++ b/goMetrix/goMetrix.go @@ -0,0 +1,282 @@ +package goMetrix + +import ( + "Toolbox/goDataverseStrict/metrics" + "fmt" + "log" + "net/http" + "sort" +) + +const ( + addr = "localhost:8008" + dir = "" + //PLATZHALTER = "Þłæŧ←ħæłŧ€¶" +) + +func sortMyDingse[dings metrics.MetricsType | metrics.MetricsDataCountType | metrics.SearchType | metrics.ReturnformatType, bums metrics.InputLevel0 | metrics.InputLevel1 | metrics.InputLevel2 | metrics.InputLevel3 | bool](dstring map[dings]bums) (raus []dings) { + var klaus []string + + for i, _ := range dstring { + klaus = append(klaus, string(i)) + } + + sort.Strings(klaus) + + return +} + +func Handler(w http.ResponseWriter, r *http.Request) { + + var a [4]string + + for i := int8(0); i <= 3; i++ { + tmp, _ := metrics.FilterStacklist(metrics.OneJumpPoints, i) + for j, v := range tmp { + if i == 3 || (i < 3 && len(v) > 0) { + log.Println("Hallo", j, v, len(v)) + } + + a[i] += fmt.Sprintf("", metrics.IDRequestHideDisplayPrefix+string(v), func() string { + if i < 3 && len(v) > 0 { + return "" + } else { // i == 3 Resolve-Format ist vorerst nicht verhandelbar, nur zu DEBUG-Zwecken sichtbar machen. + return "class=\"element-hide\"" + } + }()) + + a[i] += fmt.Sprintf("", + metrics.IDRequestCriteriaPrefix+string(v), + string(v), + func() string { + if j == 0 && v != "" { + return "checked" + } else { + return "" + } + }(), + metrics.IDRequestCriteriaPrefix+string(v), + string(v)) + if i == 2 { + switch v { + default: //Total ist default //case string(metrics.ST1_tota + //a[i] += "" + case string(metrics.ST2tomonth): + a[i] += ` + ` + case string(metrics.ST3pastdays): + a[i] += ` + ` + case string(metrics.ST4monthly): + a[i] += ` + + ` + case string(metrics.ST5tree): + a[i] += ` + ` + } + } + a[i] += `
` + } + + } + + /* + + + + + + + + + + + */ + + /* + //for i1, v1 := range metrics.OneJumpPointSet { + for _, i1 := range sortMyDingse(metrics.OldOneJumpPointSet) { + v1 := metrics.OldOneJumpPointSet[i1] + + s1 += fmt.Sprintf("
", string(i1), string(i1), string(i1), string(i1)) + if !done2 { + done2 = true + //for i2, v2 := range v1 { + for _, i2 := range sortMyDingse(v1) { + v2 := v1[i2] + + s2 += fmt.Sprintf("
", string(i2), string(i2), string(i2), string(i2)) + if !done3 { + done3 = true + //for i3, v3 := range v2 { + for _, i3 := range sortMyDingse(v2) { + v3 := v2[i3] + + s3 += fmt.Sprintf("
", string(i3), string(i3), string(i3), string(i3)) + if !done4 { + done4 = true + //for i4, _ := range v3 { + for _, i4 := range sortMyDingse(v3) { + //v4 := v3[i4] + + s4 += fmt.Sprintf("
", string(i4), string(i4), string(i4), string(i4)) + } + } + } + } + } + } + } + */ + + fmt.Fprintf(w, ` + + + + goMetrix + + + + + + + +
+

+ + + + + + +
`+a[0]+`
`+a[1]+`
`+a[2]+`
`+a[3]+`
+ + + +

+ + +
+ +
🐧
+
+ + +`) + + /* + DEBUG: + + fmt.Fprintf(w, "😱
") + + md, me := metrics.MetricsTotal("http://localhost:8080", "f6933c5d-8e97-4e7a-b21a-c57447cca421", metrics.RT1json, metrics.MT1dataverses) + fmt.Fprintf(w, "%s
%s

", me, md) + + md, me = metrics.MetricsTotal("http://localhost:8080", "f6933c5d-8e97-4e7a-b21a-c57447cca421", metrics.RT2csv, metrics.MT4downloads) + fmt.Fprintf(w, "%s
%s

", me, md) + + md, me = metrics.MetricsTotal("http://localhost:8080", "f6933c5d-8e97-4e7a-b21a-c57447cca421", metrics.RT1json, metrics.MT2datasets) + fmt.Fprintf(w, "%s
%s

", me, md) + + md, me = metrics.MetricsTotal("http://localhost:8080", "f6933c5d-8e97-4e7a-b21a-c57447cca421", metrics.RT2csv, metrics.MT3files) + fmt.Fprintf(w, "%s
%s

", me, md) + + ts, _ := time.Parse("2006-01", "2021-06") + md, me = metrics.MetricsToMonth("http://localhost:8080", "", metrics.RT2csv, metrics.MT2datasets, ts) + fmt.Fprintf(w, "%s
%s

", me, md) + + md, me = metrics.MetricsToMonth("http://localhost:8080", "", metrics.RT2csv, metrics.MT4downloads, ts) + fmt.Fprintf(w, "%s
%s

", me, md) + + md, me = metrics.MetricsPastDays("http://localhost:8080", "", metrics.RT2csv, metrics.MT2datasets, 30) + fmt.Fprintf(w, "%s
%s

", me, md) + + md, me = metrics.MetricsMonthly("http://localhost:8080", "", metrics.RT2csv, metrics.MT4downloads) + fmt.Fprintf(w, "%s
%s

", me, md) + + md, me = metrics.MetricsMonthly("http://localhost:8080", "", metrics.RT1json, metrics.MT4downloads) + fmt.Fprintf(w, "%s
%s

", me, md) + + md, me = metrics.MetricsReallyMonthly("http://localhost:8080", "", metrics.RT1json, metrics.MT4downloads) + fmt.Fprintf(w, "%s
%s

", me, md) + + //fmt.Println(metrics.ListUsers("http://localhost:8080", "f6933c5d-8e97-4e7a-b21a-c57447cca421", true)) + + ts, _ = time.Parse("2006-01", "2020-12") + md, me = metrics.MetricsTree("http://localhost:8080", "", metrics.RT1json, ts) + fmt.Fprintf(w, "%s
%s

", me, md) + + md, me = metrics.MetricsTree("http://localhost:8080", "", metrics.RT1json, time.Time{}) + fmt.Fprintf(w, "%s
%s

", me, md) + + //fmt.Fprintf(w, "%v", time.Now().Format("2006-02")) + */ +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..b119019 --- /dev/null +++ b/main.go @@ -0,0 +1,1466 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package main // import "Toolbox" + +import ( + "errors" + "fmt" + "html" + "io/ioutil" + "log" + "net/http" + "net/url" + "os" + "path/filepath" + "reflect" + "strconv" + "strings" + "time" + + json "encoding/json" + // + _ "github.com/lib/pq" + gjs "github.com/tidwall/gjson" + + // + def "Toolbox/defaults" + god "Toolbox/goDataverse" + svg "Toolbox/goDataverse/svg" + tol "Toolbox/goDataverse/tools" + pog "Toolbox/postgres" + + // sch "Toolbox/goDataverse/search" + // dst "Toolbox/goDataverse/dataset" + // dvr "Toolbox/goDataverse/dataverse" + // usr "Toolbox/goDataverse/user" + // + "Toolbox/goMetrix" +) + +const ( + addr = "pdp.archium.org" + token = "f6933c5d-8e97-4e7a-b21a-c57447cca421" +) + +// ############################################################################# +// newFileSystem - handling +// ############################################################################# +type newFileSystem struct { + fs http.FileSystem +} + +func (nfs newFileSystem) Open(path string) (http.File, error) { + //log.Println("path ( load ):", path) + f, err := nfs.fs.Open(path) + if err != nil { + log.Println("path ( error ):", path, err) + return nil, err + } + // + s, err := f.Stat() + if s.IsDir() { + if path == "/" { + index := filepath.Join(path, "index.html") + log.Println("path ( not opened ):", path, index, err) + if _, err := nfs.fs.Open(index); err != nil { + closeErr := f.Close() + if closeErr != nil { + return nil, closeErr + } + // + return nil, err + } + } + } + // + return f, nil +} + +// ############################################################################# +// get generic templates as TJson +// ############################################################################# +func getEmpty() { + if err := recover(); err != nil { + def.LogError("getEmpty(recover)", errors.New("Cannot recover().")) + } + return +} + +func getProject(_r *http.Request, _fvp tol.TFVParams, _what, _sql, _project string) (string, error) { + // leeres ergebnis bei fehler + defer getEmpty() + var empty string = def.DEF_project + // + conn, err := pog.GetConnection() + if err != nil { + def.LogError("GetConnection()", err) + return empty, err + } + defer pog.CloseConnection(conn) + err = pog.PingConnection(conn) + if err != nil { + def.LogError("PingConnection()", err) + return empty, err + } + if _fvp.FP_what == "" { + _fvp.FP_what = _what + } + psqlSql := strings.ReplaceAll(_sql, "%schema%", def.DEF_schema) + psqlSql = strings.ReplaceAll(psqlSql, "%tablecustomer%", def.DEF_tablecustomer) + psqlSql = strings.ReplaceAll(psqlSql, "%tablelayout%", def.DEF_tablelayout) + psqlSql = strings.ReplaceAll(psqlSql, "%tablecontent%", def.DEF_tablecontent) + psqlSql = strings.ReplaceAll(psqlSql, "%customerid%", strconv.Itoa(def.DEF_customerid)) + psqlSql = strings.ReplaceAll(psqlSql, "%type%", _fvp.FP_what) + rows, err := conn.Query(psqlSql) + if err != nil { + def.LogError("Query()", err) + return empty, err + } + defer rows.Close() + cols, err := rows.Columns() + if err != nil { + def.LogError("Columns(rows)", err) + return empty, err + } + // we"ll need to pass an interface to sql.Ro_w.Scan + colvals := make([]interface{}, len(cols)) + var k = 0 + for rows.Next() { + colassoc := make(map[string]interface{}, len(cols)) + for i, _ := range colvals { + colvals[i] = new(interface{}) + } + if err := rows.Scan(colvals...); err != nil { + def.LogError("Scan(rows)", err) + return empty, err + } + k += 1 + for i, col := range cols { + colassoc[col] = *colvals[i].(*interface{}) + } + if colassoc[_project] != nil { + empty = colassoc[_project].(string) + } + // + return empty, nil + } + // + return def.DEF_project, nil +} + +func getTemplate(_method string, _fvp tol.TFVParams, _sql string, _fieldlist []string) (tol.ColMap, error) { + var resultlist tol.ColMap = make(tol.ColMap, 0) + // leeres ergebnis bei fehler + defer getEmpty() + // + conn, err := pog.GetConnection() + if err != nil { + def.LogError("getTemplate(sql.Open)", err) + return resultlist, err + } + defer pog.CloseConnection(conn) + err = pog.PingConnection(conn) + if err != nil { + def.LogError("getTemplate(sql.Ping)", err) + // + return resultlist, err + } + psqlSql := strings.ReplaceAll(_sql, "%schema%", def.DEF_schema) + psqlSql = strings.ReplaceAll(psqlSql, "%tablecustomer%", def.DEF_tablecustomer) + psqlSql = strings.ReplaceAll(psqlSql, "%tablelayout%", def.DEF_tablelayout) + psqlSql = strings.ReplaceAll(psqlSql, "%tablecontent%", def.DEF_tablecontent) + psqlSql = strings.ReplaceAll(psqlSql, "%customerid%", strconv.Itoa(def.DEF_customerid)) + psqlSql = strings.ReplaceAll(psqlSql, "%type%", _fvp.FP_what) + rows, err := conn.Query(psqlSql) + // log.Println("getTemplate(", _method, _fvp.FP_what, ") > "+psqlSql) + if err != nil { + // log.Println("(", _r.Method, ") > "+psqlSql) + def.LogError("getTemplate(db.Query)", err) + return resultlist, err + } + defer rows.Close() + cols, err := rows.Columns() + if err != nil { + def.LogError("getTemplate(db.Columns)", err) + return resultlist, err + } + // we"ll need to pass an interface to sql.Ro_w.Scan + colvals := make([]interface{}, len(cols)) + var k = 0 + for rows.Next() { + colassoc := make(map[string]interface{}, len(cols)) + for i, _ := range colvals { + colvals[i] = new(interface{}) + } + if err := rows.Scan(colvals...); err != nil { + def.LogError("Scan(rows)", err) + return resultlist, err + } + k += 1 + for i, col := range cols { + colassoc[col] = *colvals[i].(*interface{}) + } + for _, value := range _fieldlist { + if len(value) > 0 { + if colassoc[value] != nil { + // log.Println("(", _method, ") > : ", key, value, colassoc[value].(string)) + resultlist[value] = colassoc[value].(string) + } + } + } + // + return resultlist, nil + } + // + return resultlist, nil +} + +var DParamold string = "" +var DParam string = "" + +func getDataParams(_r *http.Request) tol.TDVParams { + dvp := new(tol.TDVParams) + // + DParam = _r.RequestURI + // if DParam != DParamold { + u, err := url.Parse(_r.RequestURI) + if err != nil { + def.LogError("getDataParams(parse)", err) + } + // log.Println("(", _r.Method, ") > Dataparams:", dvp) + t := reflect.TypeOf(dvp).Elem() + v := reflect.ValueOf(dvp).Elem() + queries := u.Query() + if len(queries) > 0 { + for i := 0; i < v.NumField(); i++ { + n := t.Field(i) + f := v.Field(i) + //log.Println("(", _r.Method, ") > Dataparams: type: ", t, n) + f.SetString("") + for key, values := range queries { + if n.Name == "DP_"+key { + // log.Println("(", _r.Method, ") > Dataparams: search > Values: ", key, "==", n.Name) + for _, value := range values { + f.SetString(value) + break + } + break + } + } + } + if len(dvp.DP_localeCode) == 0 { + dvp.DP_localeCode = "en" + } + DParamold = DParam + } + //log.Println("(", _r.Method, ") > Dataparams: success > Values: ", *dvp) + // } + return *dvp +} + +func getFormparams(_r *http.Request) tol.TFVParams { + fvp := new(tol.TFVParams) + // log.Println("(", _r.Method, ") > Formparams:", fvp) + // + t := reflect.TypeOf(fvp).Elem() + v := reflect.ValueOf(fvp).Elem() + for i := 0; i < v.NumField(); i++ { + n := t.Field(i) + s := strings.Replace(n.Name, "FP_", "", -1) + switch n.Type.String() { + case "string": + f := v.Field(i) + f.SetString(_r.FormValue(s)) + // + //log.Println("(", _r.Method, ") > Formparams: > field: ", strings.Replace(n.Name, "FP_", "", -1), f) + break + case "bool": + // log.Println("(", _r.Method, ") > Formparams: > field: ", strings.Replace(n.Name, "FP_", "", -1), f) + f := v.Field(i) + f.SetBool((_r.FormValue(s) == "true")) + // log.Println("(", _r.Method, ") > Formparams: > field: ", f, n, reflect.TypeOf(_r.FormValue(s))) + } + } + fvp.FP_qery = "" + //log.Println("(", _r.Method, ") > Formparams: ", fvp) + // + var params tol.ColMapInt = make(tol.ColMapInt, 0) + // + var strqry string = "" + var strcnt int64 = 0 + var sumcnt int64 = 0 + // parm := _r.URL.Query() + for keys, values := range _r.Form { // range over map + if strings.Contains(keys, "parm") { + if strings.Contains(keys, "search") { + for _, ival := range values { + def.LogMessage("getFormparams()", fmt.Sprintf("> %v: Formsearch: success > parm: %v", _r.Method, ival), def.DEF_logdebg) + skey := ival[:strings.IndexByte(ival, '=')] + sval := tol.GetstringBetween(ival, `{`, `}`) + var andqry string = "" + var andcnt int64 = 0 + if len(sval) > 0 { + arrval := strings.Split(sval, ";") + def.LogMessage("getFormparams({})", fmt.Sprintf("> %v: Formsearch: success > parm: %v", _r.Method, ival), def.DEF_logdebg) + if len(arrval) > 0 { + for _, aval := range arrval { + if andcnt > 0 { + andqry = andqry + ` OR ` + } + andqry = andqry + skey + `:"` + strings.Replace(strings.Trim(aval, " "), `"`, ``, -1) + `"` + andcnt = andcnt + 1 + } + if andcnt > 0 { + if andcnt > 1 { + andqry = "(" + strings.TrimSpace(andqry) + ")" + } + if strcnt > 0 { + strqry = strqry + ` AND ` + } + strqry = strqry + andqry + strcnt = strcnt + 1 + } + } + } else { + stmp := ival[:strings.IndexByte(ival, '=')] + if stmp == "fileDescription" { + continue + } + sval := tol.GetstringBetween(ival, "[", "]") + // erst nach "+" schauen ( AND ) + if len(sval) > 0 { + arrval := strings.Split(sval, "+") + if len(arrval) > 1 { + for _, aval := range arrval { + if andcnt > 0 { + andqry = andqry + ` AND ` + } + andqry = andqry + skey + `:"` + strings.Replace(strings.Trim(aval, " "), `"`, ``, -1) + `"` + andcnt = andcnt + 1 + } + if andcnt > 0 { + if andcnt > 1 { + andqry = "(" + andqry + ")" + } + if strcnt > 0 { + strqry = strqry + ` AND ` + } + strqry = strqry + andqry + strcnt = strcnt + 1 + } + def.LogMessage("getFormparams(and)", fmt.Sprintf("> %v: Formsearch: success > parm: %v, %v", _r.Method, andcnt, andqry), def.DEF_logdebg) + } else { + // wenn nicht, dann nach " " schauen ( OR ) + arrval := strings.Split(sval, " ") + if len(arrval) > 0 { + for _, aval := range arrval { + if andcnt > 0 { + // andqry = andqry + ` OR ` + andqry = andqry + ` ` + } + andqry = andqry + skey + `:` + strings.Replace(strings.Trim(aval, " "), `"`, ``, -1) + andcnt = andcnt + 1 + } + if andcnt > 0 { + if andcnt > 1 { + andqry = "(" + strings.TrimSpace(andqry) + ")" + } + if strcnt > 0 { + strqry = strqry + ` AND ` + } + strqry = strqry + andqry + strcnt = strcnt + 1 + } + def.LogMessage("getFormparams(or)", fmt.Sprintf("> %v: Formsearch: success > parm: %v, %v", _r.Method, andcnt, andqry), def.DEF_logdebg) + } + } + } + } + sumcnt += andcnt + } + if sumcnt > 0 { + def.LogMessage("getFormparams(and)", fmt.Sprintf("> %v: Formsearch: success > query: %v", _r.Method, strqry), def.DEF_logdebg) + } + } + } + } + if strcnt > 0 { + strqry = "(" + strings.TrimSpace(strqry) + ")" + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): > Formsearch: success > Query(%v): %v", + _r.Method, "getFormparams", strcnt, tol.JsonEscape(string(strqry))), def.DEF_loginfo) + } + // + for key, values := range _r.Form { // range over map + kix := tol.GetstringBetween(key, "[", "]") + if len(kix) > 0 { // nur map[] beachten + i, err := strconv.Atoi(kix) + if err == nil { // nur numerische werte beachten > map[] + for _, value := range values { // range over []string + // log.Println("(", _r.Method, ") > Formparams: success > key[", i, "]: ", key, value) + kst := strings.Replace(key, "[", ";", -1) + kst = strings.Replace(kst, "]", "", -1) + keyslice := strings.Split(kst, ";") + var p tol.ColMap = make(tol.ColMap, 0) + var sval = value + if sval == "*" { + if strcnt > 0 { + fvp.FP_qery = strqry + sval = strings.Replace(sval, "*", strqry, -1) + } + } + p[keyslice[len(keyslice)-1]] = sval + params[i] = p + } + } + } + } + fvp.FP_parm = params + if len(fvp.FP_parm) > 0 { + // log.Println("(", _r.Method, ") > Formparams: success > Map: ", _fvp.FP_parm) + } + // + return *fvp +} + +func readFile(_fvp tol.TFVParams) (string, error) { + // + sname := "wwwgo/module/" + _fvp.FP_modl + if _fvp.FP_suff != "" { + sname = sname + "_" + _fvp.FP_suff + } + sname = sname + _fvp.FP_extn + // + file, err := os.Open(sname) + defer file.Close() + if err == nil { + data, err := ioutil.ReadAll(file) + if err == nil { + return string(data), nil + } + } + // + return "", err +} + +func readFilejson(_fvp tol.TFVParams, _r *http.Request) ([]byte, error) { + var html string + var err error = nil + if _fvp.FP_suff != "" { + switch _fvp.FP_suff { + case "login": + html = string(tol.CreateLogin(_r)) + log.Println("readFilejson(login):", html) + default: + html, err = readFile(_fvp) + } + html = strings.ReplaceAll(html, "%project%", fmt.Sprintf("_%v_", _fvp.FP_modl)) + html = tol.JsonEscape(string(html)) + } else { + html = "Fehlender Suffix: " + _fvp.FP_suff + } + html = `{"success":true,"suid":"` + _fvp.FP_suid + `","html":"` + html + `"}` + // + return []byte(html), err +} + +func getHome(_w http.ResponseWriter, _r *http.Request, _fvp tol.TFVParams, _dvp tol.TDVParams) (int, error) { + _fvp.FP_what = "project" + var fieldlist []string = make([]string, 0) + var resultlist tol.ColMap + fieldlist = append(fieldlist, def.DEF_fieldlayout) + fieldlist = append(fieldlist, def.DEF_fieldproject) + fieldlist = append(fieldlist, def.DEF_fieldsource) + fieldlist = append(fieldlist, def.DEF_fieldapikey) + fieldlist = append(fieldlist, def.DEF_fieldalias) + fieldlist = append(fieldlist, def.DEF_fieldsiteurl) + fieldlist = append(fieldlist, def.DEF_fieldidletime) + fieldlist = append(fieldlist, def.DEF_fieldrouteurl) + resultlist, err := getTemplate(_r.Method, _fvp, def.DEF_sqllayout, fieldlist) + var project string = def.DEF_project + var source string = "" + var html string = "" + if err != nil { + _fvp.FP_modl = "index_layout" + _fvp.FP_extn = ".txt" + html, err = readFile(_fvp) + if err != nil { + def.LogError("getHome("+_fvp.FP_modl+_fvp.FP_extn+")", err) + } + } else { + project = resultlist[def.DEF_fieldproject] + source = resultlist[def.DEF_fieldsource] + html = resultlist[def.DEF_fieldlayout] + var siteurl string = resultlist[def.DEF_fieldsiteurl] + if len(siteurl) > 0 { + def.DEF_siteurl = siteurl + } + idletime, err := strconv.ParseFloat(resultlist[def.DEF_fieldidletime], 64) + if err != nil { + def.LogError("getHome(parsefloat)", err) + idletime = 1800 + } + if idletime > 0 { + def.DEF_idletime = idletime + } + var routeurl string = resultlist[def.DEF_fieldrouteurl] + if len(routeurl) > 0 { + def.DEF_routeurl = routeurl + } + } + tol.Source = source + html = strings.ReplaceAll(html, "%project%", fmt.Sprintf("%s", project)) + html = replaceAny(_r, _fvp, html, "script") + // + return _w.Write([]byte(html)) +} + +func receiveAjax(_w http.ResponseWriter, _r *http.Request, _fvp tol.TFVParams, _dvp tol.TDVParams) { + if _r.Method == "POST" { + s := "

" + _fvp.FP_func + ":" + _fvp.FP_what + " was successfull.

" + _w.Write([]byte(s)) + } +} + +// ################################################## +// fehlerbehandlung für webseite +func unknownParam(_w http.ResponseWriter, _fvp tol.TFVParams, _str string, _param string) []byte { + sUnknownFrom := "> Function: '%s'
> What: '%s'
> Who: '%s'
> From: '%s'
> Info: '%s'

There is no '%s' or '%s'" + smsg := fmt.Sprintf(sUnknownFrom, _fvp.FP_func, _fvp.FP_what, _fvp.FP_who, _fvp.FP_from, _fvp.FP_info, _param, _str) + msg := def.GetErrorByString(smsg, "alert", "> unknown"+_param+"()") + "," + msg = `{"success":false,"suid":"` + _fvp.FP_suid + `",` + msg + `"html":""}` + // + return []byte(msg) +} + +// ################################################## +func replaceSvg(_html string) string { + var html string = _html + var index int = strings.Index(html, `<%"`) + for index > -1 { + betw := tol.GetstringBetween(html, `<%"`, `;"%>`) + beta := strings.Split(betw, ";") + // svg-parameter vorbereiten + var fvp tol.TFVParams + fvp.FP_who = beta[0] // svg-name + fvp.FP_matx = beta[1] // svg-transfor.matrix + fvp.FP_widt = beta[2] // svg-breite + fvp.FP_heit = beta[3] // svg-höhe + fvp.FP_view = beta[4] // svg-viewbox + fvp.FP_shad = "true" // svg-schatten + // log.Println(" >>> SVG: @", index, betw, beta, fvp) + jsvgarr, err := svg.SVG_getsvg_single(fvp) + var jsvg gjs.Result = gjs.Get(`{"data":""}`, "data") + jsvg.Str = fvp.FP_who + if err == nil { + if len(jsvgarr) > 1 { + jsvg = gjs.Get(jsvgarr, fvp.FP_who) + } + } + // log.Println(" >>> SVG: > result: ", len(jsvgarr), jsvg) + html = strings.Replace(html, `<%"`+betw+`;"%>`, jsvg.String(), -1) + index = strings.Index(html, `<%"`) + } + // + return html +} + +func replaceAny(_r *http.Request, _fvp tol.TFVParams, _html, _what string) string { + // return _html + // + var fvp tol.TFVParams = _fvp + var html string = _html + var index int = strings.Index(html, `<%"`+_what+`;"%>`) + for index > -1 { + betw := tol.GetstringBetween(html, `<%"`, `;"%>`) + if betw == _what { + fvp.FP_what = _what + var fieldlist []string = make([]string, 0) + fieldlist = append(fieldlist, def.DEF_fieldcontent) + resultlist, err := getTemplate(_r.Method, fvp, def.DEF_sqlcontent, fieldlist) + if err != nil { + def.LogError("replaceAny(template)", err) + html = strings.Replace(html, `<%"`+betw+`;"%>`, "", -1) + } else { + html = strings.Replace(html, `<%"`+betw+`;"%>`, resultlist[def.DEF_fieldcontent], -1) + } + } else { + break + } + index = strings.Index(html, `<%"`+_what+`;"%>`) + } + // + return html +} + +func getHtml(_w http.ResponseWriter, _r *http.Request, _fvp tol.TFVParams, _dvp tol.TDVParams) (int, error) { + if _r.Method == "POST" { // POST zulassen + // standard-rückgabe + htby := []byte(`{"success":false,"suid":"` + _fvp.FP_suid + `"}`) + if _fvp.FP_modl != "" { + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from), def.DEF_loginfo) + switch strings.Contains(tol.Source, _fvp.FP_what+";") { + case true: + msg := "" + switch _fvp.FP_type { + case "html": + { // html + switch _fvp.FP_from { + case "file": //..aus datei + html, err := readFile(_fvp) + html = replaceSvg(html) + if err != nil { + def.LogError("getHtml(file)", err) + msg = def.GetErrorByString(fmt.Sprintf("%v", err), "alert", "> getHtml(html)") + "," + } + htby = []byte(`{"success":true,"suid":"` + _fvp.FP_suid + `",` + msg + `"html":"` + tol.JsonEscape(string(html)) + `"}`) + case "db": + { //..aus db + var fieldlist []string = make([]string, 0) + var resultlist tol.ColMap + fieldlist = append(fieldlist, def.DEF_fieldcontent) + fieldlist = append(fieldlist, def.DEF_fieldproject) + fieldlist = append(fieldlist, def.DEF_fieldsource) + var project string = def.DEF_project + var alias string = def.DEF_alias + var html string = "" + resultlist, err := getTemplate(_r.Method, _fvp, def.DEF_sqlcontent, fieldlist) + if err != nil { + def.LogError("getHtml(db)", err) + html = def.GetError(err, "alert", "getHtml(db)") + htby = []byte(html) + } else { + project = resultlist[def.DEF_fieldproject] + html = resultlist[def.DEF_fieldcontent] + html = strings.ReplaceAll(html, "%project%", fmt.Sprintf("%s", project)) + html = strings.ReplaceAll(html, "%alias%", fmt.Sprintf("%s - ", alias)) + html = replaceAny(_r, _fvp, html, "script") + html = replaceSvg(html) + switch _fvp.FP_suff { + case "login": + html = string(tol.CreateLogin(_r)) + html = replaceSvg(html) + log.Println("(", _r.Method, ") > login - Html1:", html) + html = tol.JsonEscape(html) + log.Println("(", _r.Method, ") > login - Html2:", html) + htby = []byte([]byte(`{"success":true,"suid":"` + _fvp.FP_suid + `","html":"` + html + `"}`)) + default: + if err != nil { + msg = def.GetErrorByString(fmt.Sprintf("%v", err), "alert", "getHtml(db)") + "," + } + htby = []byte(`{"success":true,"suid":"` + _fvp.FP_suid + `",` + msg + `"html":"` + tol.JsonEscape(string(html)) + `"}`) + } + } + } + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "from")) + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > unknown from: ?", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from), def.DEF_logwarn) + } + } + case "json": + { // json + switch _fvp.FP_from { + case "db": + var fieldlist []string = make([]string, 0) + var resultlist tol.ColMap + var project string = def.DEF_project + var html = "" + fieldlist = append(fieldlist, def.DEF_fieldcontent) + fieldlist = append(fieldlist, def.DEF_fieldproject) + fieldlist = append(fieldlist, def.DEF_fieldsource) + resultlist, err := getTemplate(_r.Method, _fvp, def.DEF_sqlcontent, fieldlist) + if err != nil { + def.LogError("getHtml(json.db)", err) + msg = def.GetErrorByString(fmt.Sprintf("%v", err), "alert", "> getTemplate(json.db)") + "," + } else { + html = resultlist[def.DEF_fieldcontent] + project = resultlist[def.DEF_fieldproject] + } + html = strings.ReplaceAll(html, "%project%", fmt.Sprintf(`"%s"`, project)) + html = replaceSvg(html) + switch _fvp.FP_suff { + case "login": + // log.Println("(", _r.Method, ") > login - html:", html) + html = tol.JsonEscape(html) + // log.Println("(", _r.Method, ") > login - html2:", html) + case "search": + // log.Println("(", _r.Method, ") > search - form:", _fvp.FP_parm) + html, err = god.ImportMetaFields(_dvp, _fvp, html) + // log.Println("(", _r.Method, ") > search - html2:", html) + html = strings.Replace(html, "%data%", ",data:[]", -1) + html = strings.Replace(html, "%mousedown%", `onmousedown="return false"`, -1) + html = tol.JsonEscape(html) + } + htby = []byte(`{"success":true,"suid":"` + _fvp.FP_suid + `",` + msg + `"project":"` + project + `","html":"` + html + `"}`) + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "from")) + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > unknown from: ?", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from), def.DEF_logwarn) + } + } + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "type")) + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > unknown type: ?", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from), def.DEF_logwarn) + } + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "what")) + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > unknown modul: ?", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from), def.DEF_logwarn) + } + return _w.Write(htby) + } else { + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > unknown what: ?", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from), def.DEF_logwarn) + } + } + return 0, errors.New(fmt.Sprintf("( ERROR ) > Wrong method found ( %v ) in %s.", _r.Method, "getHtml()")) +} + +func getThemes() string { + var json string = `{` + json = json + `"valueField": "label",` + json = json + `"textField": "value",` + json = json + `"data":[` + json = json + `{"value":"default", "text":"Default", "selected":true},` + json = json + `{"value":"black", "text":"Black"},` + json = json + `{"value":"orange", "text":"Orange"},` + json = json + `{"value":"green", "text":"Green"},` + json = json + `{"value":"gray", "text":"Gray"}` + json = json + `]}` + // + return json +} + +func getValues(_w http.ResponseWriter, _r *http.Request, _fvp tol.TFVParams, _dvp tol.TDVParams) (int, error) { + if _r.Method == "POST" { + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > who: %v > sid: %v", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from, _fvp.FP_who, _fvp.FP_suid), def.DEF_loginfo) + // standard-rückgabe + htby := []byte(`{"success":false,"suid":"` + _fvp.FP_suid + `"}`) + switch strings.Contains(tol.Source, _fvp.FP_what+";") { + case true: + { + var project string = def.DEF_project + switch _fvp.FP_what { + case "menu": + switch _fvp.FP_from { + case "db": + var fieldlist []string = make([]string, 0) + var resultlist tol.ColMap + var html string = "" + fieldlist = append(fieldlist, def.DEF_fieldcontent) + fieldlist = append(fieldlist, def.DEF_fieldproject) + resultlist, err := getTemplate(_r.Method, _fvp, def.DEF_sqlcontent, fieldlist) + if err != nil { + def.LogError("getValues(menu.db)", err) + html = def.GetError(err, "alert", "getTemplate(menu.db)") + } else { + project = resultlist[def.DEF_fieldproject] + html = strings.ReplaceAll(html, "%project%", fmt.Sprintf(`"%s"`, project)) + } + htby = []byte(strings.ReplaceAll(replaceSvg(html), `"`, `"`)) + case "dataverse": + var html string = "" + var err error = errors.New("getValues(menu.dataverse)") + // root-dataverse + rootname, err := god.GetDataverseName(_dvp, def.DEF_alias) + if err != nil { + def.LogError("getValues(menu.dataverse.1)", err) + html = def.GetError(err, "alert", "getValues(dataverse."+def.DEF_alias+".menu)") + //html = def.GetError(errors.New("Error while creating json for 'dataverse.menu'."), "alert") + } else { + // start - dataverse iteration + log.Println("GetMenuFromDataverse(start)") + html, err = god.GetMenuFromDataverse(_dvp, _fvp, def.DEF_alias, "", 10, true) + if err != nil { + def.LogError("getValues(menu.dataverse.2)", err) + html = def.GetError(err, "alert", "getValues(dataverse."+def.DEF_alias+".menu)") + } else { + if len(html) == 0 { + log.Println("\t . GetMenuFromDataverse(html):", html) + } + var sdjson string = `` + //log.Printf("GetMenuFromDataverse(%v) > menu-set: %v, %v\n", aliasdv, sdatasets, err) + if err == nil { + sdatasets, err := god.GetDatasetsFromAlias(_dvp, _fvp, def.DEF_alias) + if err == nil { + sdjson, _ = god.GetMenuFromDatasets(sdatasets, def.DEF_alias, 10) + if len(sdjson) > 0 { + html = html + "," + sdjson + } + } + } + html = strings.Replace(def.MenuRoot(def.DEF_alias, rootname), "%children%", "["+html+"]", -1) + html = strings.Replace(html, "%datasetPid%", _dvp.DP_datasetPid, -1) + log.Println("GetMenuFromDataverse(done)") + // log.Println("GetMenuFromDataverse(done):", html) + } + } + htby = []byte(strings.ReplaceAll(html, `"`, `"`)) + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "menu.from")) + } + case "datagrid": + switch _fvp.FP_from { + case "db": + var fieldlist []string = make([]string, 0) + var html string = "" + fieldlist = append(fieldlist, def.DEF_fieldcontent) + fieldlist = append(fieldlist, def.DEF_fieldproject) + fieldlist = append(fieldlist, def.DEF_fieldsource) + resultlist, err := getTemplate(_r.Method, _fvp, def.DEF_sqlcontent, fieldlist) + if err != nil { + def.LogError("getValues(datagrid.db)", err) + html = def.GetError(err, "alert", "getValues(datagrid.db)") + } else { + project = resultlist[def.DEF_fieldproject] + html = resultlist[def.DEF_fieldcontent] + html = strings.ReplaceAll(html, "%project%", fmt.Sprintf(`"%s"`, project)) + } + htby = []byte(strings.ReplaceAll(replaceSvg(html), `"`, `"`)) + case "dataverse": + html := "" + // validity, superuser, id, err := god.CheckUserValidity(_dvp) + // if validity { + var err error = errors.New("( ERROR ) > Wrong 'kind' found.") + switch _fvp.FP_who { + case "user": + // nothing to do.. + err = nil + html = `{"success":false,"suid":"` + _fvp.FP_suid + `", "html":""}` + case "dataverse": // dataverse - grid + html, err = god.GetGridFromDataverse(_dvp, _fvp, true) + if err != nil { + def.LogError("getValues(datagrid.dataverse)", err) + } + case "dataset": // dataverse - grid + html, err = god.GetGridFromDataset(_dvp, _fvp, true, "files;", "") + if err != nil { + def.LogError("getValues(datagrid.dataset)", err) + } + default: + err = nil + htby = []byte(unknownParam(_w, _fvp, "unknown", "datagrid."+_fvp.FP_who+"")) + } + if err != nil { + html = god.GetErrorByDataverse(_dvp, err, "alert", "getValues(datagrid.dataverse."+_fvp.FP_who+")") + } + htby = []byte(strings.ReplaceAll(replaceSvg(html), `"`, `"`)) + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "datagrid.from")) + } + case "propgrid": + switch _fvp.FP_from { + case "db": + var fieldlist []string = make([]string, 0) + var html string = "" + fieldlist = append(fieldlist, def.DEF_fieldcontent) + fieldlist = append(fieldlist, def.DEF_fieldproject) + fieldlist = append(fieldlist, def.DEF_fieldsource) + resultlist, err := getTemplate(_r.Method, _fvp, def.DEF_sqlcontent, fieldlist) + if err != nil { + if err != nil { + def.LogError("getValues(propgrid.db)", err) + } + html = def.GetError(err, "alert", "getValues(propgrid.db)") + } else { + project = resultlist[def.DEF_fieldproject] + html = resultlist[def.DEF_fieldcontent] + html = strings.ReplaceAll(html, "%project%", fmt.Sprintf(`"%s"`, project)) + } + htby = []byte(strings.ReplaceAll(replaceSvg(html), `"`, `"`)) + case "dataverse": + html := "" + err := errors.New("( ERROR ) > Wrong 'kind' found.") + switch _fvp.FP_who { + case "file": // dataverse - property-grid + html, err = god.GetPropGridFromDatasetFiles(_dvp, _fvp, "files") + default: + err = nil + htby = []byte(unknownParam(_w, _fvp, "unknown", "propgrid."+_fvp.FP_who+"")) + } + if err != nil { + def.LogError("getValues(propgrid.dataverse)", err) + html = god.GetErrorByDataverse(_dvp, err, "alert", "getValues(propgrid.dataverse."+_fvp.FP_who+")") + } + htby = []byte(strings.ReplaceAll(replaceSvg(html), `"`, `"`)) + case "search": + html, err := god.GetSearchResult(_dvp, _fvp) + if err != nil { + def.LogError("getValues(propgrid.search)", err) + html = def.GetError(err, "alert", "getValues(propgrid.search)") + } else { + html = (`{"success":true,"suid":"` + _fvp.FP_suid + `","query":"` + + tol.JsonEscape(string(_fvp.FP_qery)) + `","search":` + html + `}`) + } + html = strings.ReplaceAll(replaceSvg(html), `"`, `"`) + // fmt.Printf("GetSearchResult(result): (%v) %v, %v\n", len(html), html, err) + htby = []byte(html) + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "propgrid.from")) + } + case "event": + switch _fvp.FP_from { + case "db": + var fieldlist []string = make([]string, 0) + var html string = "" + fieldlist = append(fieldlist, def.DEF_fieldcontent) + fieldlist = append(fieldlist, def.DEF_fieldproject) + fieldlist = append(fieldlist, def.DEF_fieldsource) + resultlist, err := getTemplate(_r.Method, _fvp, def.DEF_sqlcontent, fieldlist) + if err != nil { + def.LogError("getValues(event.db)", err) + html = def.GetError(err, "alert", "getValues(event.db)") + } else { + project = resultlist[def.DEF_fieldproject] + html = resultlist[def.DEF_fieldcontent] + html = strings.ReplaceAll(html, "%project%", fmt.Sprintf(`"%s"`, project)) + } + htby = []byte(strings.ReplaceAll(replaceSvg(html), `"`, `"`)) + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "event.from")) + } + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "event.what")) + } + } + default: + log.Println(" >>> getValues(): ", _fvp) + htby = []byte(unknownParam(_w, _fvp, "empty", "table.what: "+_fvp.FP_what)) + } + return _w.Write([]byte(htby)) + } + return 0, errors.New(fmt.Sprintf("Wrong method found ( %v ) in %s.", _r.Method, "getValues()")) +} + +func getParams(_w http.ResponseWriter, _r *http.Request, _fvp tol.TFVParams, _dvp tol.TDVParams) (int, error) { + if _r.Method == "POST" { + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > who: %v > sid: %v", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from, _fvp.FP_who, _fvp.FP_suid), def.DEF_loginfo) + // standard-rückgabe + htby := []byte(`{"success":false,"suid":"` + _fvp.FP_suid + `"}`) + switch strings.Contains(tol.Source, _fvp.FP_what+";") { + case true: + { + switch _fvp.FP_what { + case "project": + switch _fvp.FP_from { + case "db": + var html string = "" + var fieldlist []string = make([]string, 0) + var resultlist tol.ColMap + fieldlist = append(fieldlist, def.DEF_fieldproject) + fieldlist = append(fieldlist, def.DEF_fieldsource) + fieldlist = append(fieldlist, def.DEF_fieldsiteurl) + fieldlist = append(fieldlist, def.DEF_fieldrouteurl) + fieldlist = append(fieldlist, def.DEF_fieldalias) + fieldlist = append(fieldlist, def.DEF_fieldapikey) + fieldlist = append(fieldlist, def.DEF_fieldidletime) + resultlist, err := getTemplate(_r.Method, _fvp, def.DEF_sqlproject, fieldlist) + if err != nil { + def.LogError("getParams(project.db)", err) + html = def.GetError(err, "alert", "getParams(project.db)") + } else { + var project string = resultlist[def.DEF_fieldproject] + var source string = resultlist[def.DEF_fieldsource] + var siteurl string = resultlist[def.DEF_fieldsiteurl] + var alias string = resultlist[def.DEF_fieldalias] + var apikey string = resultlist[def.DEF_fieldapikey] + var routeurl string = resultlist[def.DEF_fieldrouteurl] + if len(siteurl) > 0 { + def.DEF_siteurl = siteurl + } + if len(apikey) > 0 { + def.DEF_apikey = apikey + } + if len(alias) > 0 { + def.DEF_alias = alias + } + idletime, err := strconv.ParseFloat(resultlist[def.DEF_fieldidletime], 64) + if err != nil { + def.LogError("getParams(project.db.parsefloat)", err) + idletime = 1800 + } + if idletime > 0 { + def.DEF_idletime = idletime + } + if len(routeurl) > 0 { + def.DEF_routeurl = routeurl + } + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): fields: %v, result: %v", + _r.Method, _fvp.FP_func, fieldlist, resultlist), def.DEF_loginfo) + var ipmap = strings.Split(tol.GetIP(_r), ":") + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): ip: %v", + _r.Method, _fvp.FP_func, ipmap), def.DEF_loginfo) + html = `{` + + `"success":true` + + `,"suid":"` + _fvp.FP_suid + + `","project":"` + project + + `","source":"` + source + + `","alias":"` + alias + + `","apikey":"` + apikey + + `","idletime":"` + fmt.Sprintf("%f1.0", idletime) + if len(ipmap) == 2 { + html += `","localip":"` + ipmap[0] + html += `","localport":"` + ipmap[1] + } else { + html += `","localip":"Can not resolve client ip` + } + html += `"}` + } + htby = []byte(html) + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "project.from."+_fvp.FP_from+"")) + } + case "params": + var html string = "" + // var err error + switch _fvp.FP_from { + case "db": + switch _fvp.FP_who { + case "get.themes": + html = getThemes() + html = `{"success":true, "suid":"` + _fvp.FP_suid + + `", "themes":` + html + `}` + case "search.file": + html = (`{"success":false, "suid":"` + _fvp.FP_suid + `"}`) + case "search.load": + html = (`{"success":false, "suid":"` + _fvp.FP_suid + `"}`) + case "search.save": + html = (`{"success":false, "suid":"` + _fvp.FP_suid + `"}`) + case "search.header": + // html, err = + var columns tol.JsnColMap = make(tol.JsnColMap, 0) + data, err := json.Marshal(tol.DataColList) + if err == nil { + var sdata string = strings.ReplaceAll(string(data), `\"`, ``) + // log.Printf("GetSearchResult(data): %v\n", sdata) + columns["dataset"] = sdata + file, err := json.Marshal(tol.FileColList) + if err == nil { + var sfile string = strings.ReplaceAll(string(file), `\"`, ``) + // log.Printf("GetSearchResult(file): %v\n", sfile) + columns["file"] = sfile + } + } + // log.Printf("GetSearchResult(cols): %v\n", columns) + cols, err := json.Marshal(columns) + var scols string = strings.ReplaceAll(string(cols), `\"`, `"`) + scols = strings.ReplaceAll(scols, `"{`, `{`) + scols = strings.ReplaceAll(scols, `}"`, `}`) + def.LogMessage("", fmt.Sprintf("GetSearchResult(%v) > cols: %v", "all", string(cols)), def.DEF_logdebg) + html = `{"success":true, "suid":"` + _fvp.FP_suid + + `", "columns":` + scols + `}` + default: + html = string(unknownParam(_w, _fvp, "unknown", "params.who."+_fvp.FP_who+"")) + } + default: + html = string(unknownParam(_w, _fvp, "unknown", "params.from."+_fvp.FP_from+"")) + } + htby = []byte(html) + case "svg": + switch _fvp.FP_from { + case "modul": + svg.SVG_object.Class = "app-tb-btn-svg" + svg.SVG_object.Width = 30 + svg.SVG_object.Height = 30 + svg.SVG_object.Trans = "matrix(1,0,0,1,0,0)" + svg.SVG_object.Anima = "" + svg.SVG_object = svg.SVG_gethtml_all(svg.SVGViewbox) + htby = []byte((`{"success":true,"total":` + svg.SVG_object.Total + `,"suid":"` + _fvp.FP_suid + `","svgobject":` + string(svg.SVG_object.Object) + `}`)) + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "svg.from")) + } + case "getsvg": + switch _fvp.FP_from { + case "modul": + // log.Println(" >>> getsvg: ", _fvp.FP_who) + html, err := svg.GetSVG_ByParams(_fvp) + if err != nil { + def.LogError("getParams(getsvg.modul)", err) + html = def.GetError(err, "alert", "getTemplate(getsvg.modul)") + } + htby = []byte(html) + } + default: + htby = []byte(unknownParam(_w, _fvp, "unknown", "event.what")) + } + } + default: + log.Println(" >>> getParams(): ", _fvp) + htby = []byte(unknownParam(_w, _fvp, "empty", "table.what: "+_fvp.FP_what)) + } + return _w.Write([]byte(htby)) + } + return 0, errors.New(fmt.Sprintf("Wrong method found ( %v ) in %s.", _r.Method, "getParams()")) +} + +// ############################################################################# +// ### redirect url and destroy session +// ############################################################################# +func routeToURL(_w http.ResponseWriter, _r *http.Request, _fvp tol.TFVParams, _dvp tol.TDVParams) { + if _r.Method == "POST" { + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > who: %v > sid: %v", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from, _fvp.FP_who, _fvp.FP_suid), def.DEF_loginfo) + // + if len(_fvp.FP_suid) > 63 { + delete(tol.Ue, _fvp.FP_suid) + def.LogMessage2Level("", fmt.Sprintf("( %v ) > Multiplexer(): Session( %v ) session is finally terminated.", + _r.Method, _fvp.FP_suid), def.DEF_loginfo) + } + // standard-rückgabe + htby := []byte(`{"success":true,"suid":"` + _fvp.FP_suid + `","route":"` + tol.GetRouteUrl(_dvp) + `"}`) + _w.Write([]byte(htby)) + // + } +} + +// ############################################################################# +// ### handler for get-request +// ############################################################################# +func handlerGet(_w http.ResponseWriter, _r *http.Request, _fvp tol.TFVParams, _dvp tol.TDVParams) (int, error) { + // log.Printf("\n( %v ) > request: %v\n", _r.Method, _fvp) + if _fvp.FP_func != "" { + var i int = 0 + var err error = nil + switch _fvp.FP_func { + case "getHome": // geht lt. jquery wegen synchronem request nicht + i, err = getHome(_w, _r, _fvp, _dvp) // anschlessend ist die seite blockiert + case "getValues": + return getValues(_w, _r, _fvp, _dvp) + case "getParams": + // log.Printf("\n( %v ) > result: %v\n", _r.Method, _dvp) + i, err = getParams(_w, _r, _fvp, _dvp) + case "receiveAjax": + receiveAjax(_w, _r, _fvp, _dvp) + default: + html := unknownParam(_w, _fvp, "unknown", "function") + def.LogError("", errors.New(fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > unknown function: ?", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from))) + i, err = _w.Write([]byte(html)) + } + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > who: %v was written!", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from, _fvp.FP_who), def.DEF_loginfo) + // + return i, err + } else { + i, err := getHome(_w, _r, _fvp, _dvp) + if err != nil { + def.LogError("handlerGet(getHome)", err) + _, err := _w.Write([]byte(def.GetError(err, "alert", "getHome()"))) + if err != nil { + // alles zu spät + } + } + def.LogMessage("", fmt.Sprintf("( %v ) > getHome(): %v bytes written!", + _r.Method, i), def.DEF_loginfo) + // + return i, err + } + // + return 0, errors.New(fmt.Sprintf("( ERROR ) > Wrong function found ( %v ) in %s.", _fvp.FP_func, "handlerGet()")) +} + +// ############################################################################# +// ### handler for post-request +// ############################################################################# +func handlerPost(_w http.ResponseWriter, _r *http.Request, _fvp tol.TFVParams, _dvp tol.TDVParams) (int, error) { + // log.Printf("\n( %v ) > request: %v\n", _r.Method, _fvp) + var i int = 0 + var err error = nil + if _fvp.FP_func != "" { + // + switch _fvp.FP_func { + case "getHtml": + i, err = getHtml(_w, _r, _fvp, _dvp) + case "getValues": + i, err = getValues(_w, _r, _fvp, _dvp) + case "getParams": + i, err = getParams(_w, _r, _fvp, _dvp) + case "routeToURL": + routeToURL(_w, _r, _fvp, _dvp) + case "receiveAjax": + receiveAjax(_w, _r, _fvp, _dvp) + default: + html := unknownParam(_w, _fvp, "unknown", "function") + def.LogError("", errors.New(fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > unknown function: ?", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from))) + i, err = _w.Write([]byte(html)) + // + } + def.LogMessage("", fmt.Sprintf("( %v ) > %v(): what: %v > modul: %v > type: %v > from: %v > who: %v was written!", + _r.Method, _fvp.FP_func, _fvp.FP_what, _fvp.FP_modl, _fvp.FP_type, _fvp.FP_from, _fvp.FP_who), def.DEF_loginfo) + } else { + i = 0 + err = errors.New(fmt.Sprintf("( ERROR ) > Wrong function found ( %v ) in %s.", _fvp.FP_func, "getHtml()")) + } + // + return i, err +} + +// ############################################################################# +// ### read all get/post and form-parameter +// ############################################################################# +func getparamlist(_w http.ResponseWriter, _r *http.Request) string { + _dvp := getDataParams(_r) + _fvp := getFormparams(_r) + // + var ue tol.TUserEntry + var uechange bool = false + if len(_fvp.FP_suid) > 0 { + if tol.Ue == nil { + tol.Ue = make(tol.TUserEntries, 0) + } + var ok bool = false + ue, ok = tol.Ue[_fvp.FP_suid] + if ok { + def.LogMessage("", fmt.Sprintf("( %v ) > Multiplexer(): Idle since (%vs ), Session( %v )", + _r.Method, time.Since(ue.UE_IdleTime).Seconds(), _fvp.FP_suid), def.DEF_logdebg) + ue.UE_FVParams = _fvp + ue.UE_DVParams = _dvp + tol.Ue[_fvp.FP_suid] = ue + if ue.UE_Done { + def.LogMessage2Level("", fmt.Sprintf("( %v ) > Multiplexer(): Session( %v ) session becomes completed.", + _r.Method, _fvp.FP_suid), def.DEF_loginfo) + msg := def.GetErrorByString( + _fvp.FP_func+`(`+_fvp.FP_info+`).


Session will be reloaded after this message.`, `alert`, + `Completed at `+ue.UE_Released.Format(def.DEF_stampISO)) + var html string = `{"released":true,"suid":"` + _fvp.FP_suid + `",` + msg + `}` + _w.Write([]byte(html)) + delete(tol.Ue, _fvp.FP_suid) + // + return _fvp.FP_suid + } else { + ue.UE_IdleTime = time.Now() + } + } else { + def.LogMessage2Level("", fmt.Sprintf("( %v ) > Multiplexer(): Session was NOT found, will be (re)created ( %v )", + _r.Method, _fvp.FP_suid), def.DEF_loginfo) + ue.UE_Done = false + ue.UE_FVParams = _fvp + ue.UE_DVParams = _dvp + ue.UE_IdleTime = time.Now() + var ipmap = strings.Split(tol.GetIP(_r), ":") + if len(ipmap) == 2 { + ue.UE_IpAddress = ipmap[0] + ue.UE_IpPort = ipmap[1] + } + } + // + uechange = (tol.Ue[_fvp.FP_suid].UE_DVParams != ue.UE_DVParams) + if uechange { + def.LogMessage("", fmt.Sprintf("( %v ) > Multiplexer(): UserEntry( %v ): %v", + _r.Method, _fvp.FP_suid, ue.UE_DVParams), def.DEF_logdebg) + } + // + tol.Ue[_fvp.FP_suid] = ue + } + // + return _fvp.FP_suid +} + +// ############################################################################# +// ### handlefunc to process the inquiries +// ############################################################################# +func multiplexer(_w http.ResponseWriter, _r *http.Request) { + suid := getparamlist(_w, _r) + ue := tol.Ue[suid] + //log.Println("(", _r.Method, ") > Multiplexer():", suid, ue.UE_FVParams, ue.UE_DVParams) + if ue.UE_Done == false { + switch _r.Method { + case "GET": + handlerGet(_w, _r, ue.UE_FVParams, ue.UE_DVParams) + case "POST": + handlerPost(_w, _r, ue.UE_FVParams, ue.UE_DVParams) + default: + getHome(_w, _r, ue.UE_FVParams, ue.UE_DVParams) + } + } else { + def.LogMessage2Level("", fmt.Sprintf("( %v ) > Multiplexer(): Session already terminated.", + _r.Method), def.DEF_loginfo) + // standard-rückgabe + var html string = "" + if _r.Method == "POST" { + html = `{"success":false,"suid":""}` + } + _w.Write([]byte(html)) + } +} + +// ############################################################################# +// ### handlefunc for folders ( denying access ) +// ############################################################################# + +func httpErr(_w http.ResponseWriter, _r *http.Request, _err string, _path string, _code int) string { + serror := fmt.Sprintf("(%v) File or directory not found - %v", _code, _err) + def.LogMessage2Level("", fmt.Sprintf("( %v ) > %v path: %v.", _r.Method, serror, _path), def.DEF_logwarn) + // + http.Error(_w, serror, _code) + // + return serror +} + +func servefiles(_w http.ResponseWriter, _r *http.Request) { + var path string = html.EscapeString(_r.URL.Path) + // fmt.Println("servefiles(1):", filepath.Join("./", def.DEF_codebase)) + nfs := newFileSystem{http.Dir(filepath.Join("./", def.DEF_codebase))} + // + // bewertung, ob von ausserhalb aufgerufen + if strings.Index(def.DEF_toolboxdirs, ";"+path+";") > -1 { + _fvp := getFormparams(_r) // unter anderem die "SUID" ermitteln + _, ok := tol.Ue[_fvp.FP_suid] + if !ok && (_r.Method == "GET") { + def.LogMessage2Level("", fmt.Sprintf(`( %v ) > external path: "%v" will be used as: "%v".`, _r.Method, path, "/"), def.DEF_loginfo) + } + path = "/" // neue basis + } + // + serror := fmt.Sprintf("cannot open") + if strings.Index(path, "/"+def.DEF_codebase) == -1 { //gar nicht erst versuchen + f, err := nfs.fs.Open(path) + // fmt.Println("servefiles(2):", path, "in", "/"+def.DEF_codebase, err) + if err != nil { + httpErr(_w, _r, serror, path, http.StatusNotFound) + } else { + defer f.Close() + s, err := f.Stat() + if err == nil { + if s.IsDir() { + switch path { + case "/": // normale abarbeitung + multiplexer(_w, _r) + return + default: // anforderung abweisen + httpErr(_w, _r, serror, path, http.StatusNotFound) + } + } else { // angeforderte datei schreiben + http.ServeContent(_w, _r, s.Name(), s.ModTime(), f) + def.LogMessage2Level("", fmt.Sprintf("( %v ) > %v was written.", _r.Method, path), def.DEF_loginfo) + return + } + } + } + } else { // anforderung abweisen + httpErr(_w, _r, serror, path, http.StatusNotFound) + } +} + +func init() { + log.Println("Initialize Package - Main..") +} + +// ############################################################################# +// ### try, catch, finally - interface +// ############################################################################# +type Exception interface{} +type Block struct { + InUse bool + Try func() + Catch func(Exception) + Finally func() +} + +func (tcf Block) Do() { + if tcf.Finally != nil { + defer tcf.Finally() + } + if tcf.Catch != nil { + defer func() { + if r := recover(); r != nil { + tcf.Catch(r) + } + }() + } + tcf.Try() +} + +// ############################################################################# +// ### check the session validity ( one time per second ) +// ############################################################################# +func checkcompletion() { + var inuse bool = false + for now := range time.Tick(time.Second) { + Block{ + Try: func() { + if inuse { + panic("Oh sh.., already in use.") + } + inuse = true + // log.Println("( RUN ) > Session running (", tol.Ue, ") at ", now.Format(def.DEF_stampISO), ")") + for key, ue := range tol.Ue { + //log.Println("( RUN ) > Session running (", ue.UE_IpAddress+":"+ue.UE_IpPort, ") at ", now.Format(def.DEF_stampISO), "> session:", key) + if !ue.UE_Done { + if time.Until(ue.UE_IdleTime).Seconds() < (def.DEF_idletime * -1) { + ue.UE_Done = true + ue.UE_Released = now + // + tol.Ue[key] = ue + // + log.Println("( DONE ) > Session is scheduled to end (", ue.UE_IpAddress+":"+ue.UE_IpPort, ") at ", now.Format(def.DEF_stampISO), "> session:", key) + } + } + } + }, + Catch: func(e Exception) { + fmt.Printf("caught: %v\n", e) + }, + Finally: func() { + inuse = false + }, + }.Do() + } +} + +func main() { + def.GetArguments() // + // validation check + go checkcompletion() + // + httpmux := http.NewServeMux() + httpmux.HandleFunc("/", servefiles) + httpmux.HandleFunc(def.DEF_metrixdirs, goMetrix.Handler) + httpmux.Handle(def.DEF_wasmdirs_www, http.StripPrefix(def.DEF_wasmdirs_www, func(next http.Handler) http.Handler { //Prevent indexing + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == "" { + http.NotFound(w, r) + return + } + next.ServeHTTP(w, r) + }) + }(http.FileServer(http.Dir(def.DEF_wasmdirs_fs))))) + + /* DEBUG HILFE + httpmux.Handle("/css/", http.StripPrefix("/css/", func(next http.Handler) http.Handler { //Prevent indexing + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == "" { + http.NotFound(w, r) + return + } + next.ServeHTTP(w, r) + }) + }(http.FileServer(http.Dir("static/css/"))))) + + httpmux.Handle("/images/", http.StripPrefix("/images/", func(next http.Handler) http.Handler { //Prevent indexing + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == "" { + http.NotFound(w, r) + return + } + next.ServeHTTP(w, r) + }) + }(http.FileServer(http.Dir("static/images/"))))) + */ + // + log.Println("Initialize HTTP-Server @ " + fmt.Sprintf("%s:%v", def.DEF_httphost, def.DEF_httpport) + "..") + http.ListenAndServe(fmt.Sprintf("%s%v", ":", def.DEF_httpport), httpmux) +} diff --git a/postgres/postgres.go b/postgres/postgres.go new file mode 100644 index 0000000..8875ebd --- /dev/null +++ b/postgres/postgres.go @@ -0,0 +1,58 @@ +/** += Creative Commons Lizenzvertrag = +Diese Software ist von der archium GmbH, Gera ist lizenziert unter einer Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitungen 4.0 International Lizenz. (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) +Individuelle über diese Lizenz hinausgehende Berechtigungen können Sie unter https://archium.org erhalten. + += Creative Commons License = +Software by archium GmbH, Gera is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. (http://creativecommons.org/licenses/by-nc-nd/4.0/) +Individual permissions beyond the scope of this license may be available at https://archium.org. +**/ + +package postgres + +import ( + "fmt" + // "log" + // "strings" + + def "Toolbox/defaults" + sql "database/sql" +) + +var expdb *sql.DB + +// ############################################################################# +// get - sql connection +// ############################################################################# +func GetConnection() (*sql.DB, error) { + psqlInfo := fmt.Sprintf(def.DEF_coninfo, def.DEF_dbhost, def.DEF_dbport, def.DEF_dbuser, def.DEF_dbpassword, def.DEF_dbname) + conn, err := sql.Open("postgres", psqlInfo) + //log.Println("GetConnection:", psqlInfo, conn, err) + if err != nil { + def.LogError("GetConnection()", err) + return nil, err + } + return conn, nil +} + +// ############################################################################# +// close - sql connection +// ############################################################################# +func CloseConnection(_conn *sql.DB) error { + var err error = nil + if _conn != nil { + err = _conn.Close() + } + return err +} + +// ############################################################################# +// ping - sql connection +// ############################################################################# +func PingConnection(_conn *sql.DB) error { + var err error = nil + if _conn != nil { + err = _conn.Ping() + } + return err +} diff --git a/static/.module_archium_events.txt.kate-swp b/static/.module_archium_events.txt.kate-swp new file mode 100644 index 0000000..4e18d75 Binary files /dev/null and b/static/.module_archium_events.txt.kate-swp differ diff --git a/static/Toolbox b/static/Toolbox new file mode 100755 index 0000000..34a5120 Binary files /dev/null and b/static/Toolbox differ diff --git a/static/css/cloud.css b/static/css/cloud.css new file mode 100644 index 0000000..b4e001c --- /dev/null +++ b/static/css/cloud.css @@ -0,0 +1,99 @@ +/* cloud style */ + +html,body { + height:100%; + overflow:hidden; + margin:0; +} +tr.dialog-line td{ + color:#dddddd; + font-size:110%; + font-weight:500; + height:5px; + padding: 0px 0px 5px 10px; + margin: 5px 0px 10px 0px; + border-bottom: 1px solid #dddddd +} +.extitem-caption{ + font-weight:bold; + padding-left:5px; +} +.extitem-unit, +.extitem-value{ + margin:0; + padding: 2px 5px 2px 2px; + font-size:18px; +} +.extitem-value{ + text-align:right; + width:1%; + font-size:18px; +} +.extitem-combo{ + text-align:left; + /* width: 100%; */ + width: 80px; + font-size:18px; +} +.extitem-number{ + text-align:right; + width: 100%; + font-size:18px; +} +.extitem-text{ + text-align:left; + width: 100%; +} +.mod-tb-btn{ + min-width: 40px; + max-width: 4vW; +} +.mod-tb-btn-hide{ + display: none; +} +.mod-tb-btn-show{ + display: inline-block; +} +.mod-tb-btn-disable{ + display: none; +} +.mod-tb-btn-enable{ + display: inline-block; +} + +.tree-file, +.tree-folder, +.tree-folder-open{ + background-image: none; +} + +.icon-package{ + color: #404080; +} +.icon-dataverse{ + color: #c55b28; +} +.icon-dataset{ + color: #337ab7; +} +.icon-astro, +.icon-audio, +.icon-code, +.icon-document, +.icon-image, +.icon-file, +.icon-network, +.icon-other, +.icon-tabular, +.icon-unlock, +.icon-video +{ + color: #444; +} +.icon-package +{ + color: #000; +} + + +/* end pps-cloud style */ diff --git a/static/css/codemirror.css b/static/css/codemirror.css new file mode 100644 index 0000000..18b0bf7 --- /dev/null +++ b/static/css/codemirror.css @@ -0,0 +1,347 @@ +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} + +.cm-animate-fat-cursor { + width: auto; + border: 0; + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; + background-color: #7e7; +} +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-rulers { + position: absolute; + left: 0; right: 0; top: -50px; bottom: -20px; + overflow: hidden; +} +.CodeMirror-ruler { + border-left: 1px solid #ccc; + top: 0; bottom: 0; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #00f;} +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3 {color: #085;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #00c;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 30px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -30px; margin-right: -30px; + padding-bottom: 30px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; +} +.CodeMirror-sizer { + position: relative; + border-right: 30px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + min-height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -30px; + /* Hack to make IE7 behave */ + *zoom:1; + *display:inline; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: none; + font-variant-ligatures: none; +} +.CodeMirror-wrap pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + overflow: auto; +} + +.CodeMirror-widget {} + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { + position: absolute; + pointer-events: none; +} +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background: #ffa; + background: rgba(255, 255, 0, .4); +} + +/* IE7 hack to prevent it from returning funny offsetTops on the spans */ +.CodeMirror span { *vertical-align: text-bottom; } + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/static/css/fontcustom.css b/static/css/fontcustom.css new file mode 100644 index 0000000..cf311b9 --- /dev/null +++ b/static/css/fontcustom.css @@ -0,0 +1,68 @@ +/* + Icon Font: fontcustom +*/ + +@font-face { + font-family: "fontcustom"; + src: url("/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.eot"); + src: url("/css/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.eot?#iefix") format("embedded-opentype"), + url("/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.woff2") format("woff2"), + url("/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.woff") format("woff"), + url("/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.ttf") format("truetype"), + url("/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.svg#fontcustom") format("svg"); + font-weight: normal; + font-style: normal; +} + +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: "fontcustom"; + src: url("/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.svg#fontcustom") format("svg"); + } +} + +[data-icon]::before { content: attr(data-icon); } + +[data-icon]::before, +.icon-astro::before, +.icon-audio::before, +.icon-code::before, +.icon-dataset::before, +.icon-dataverse::before, +.icon-document::before, +.icon-file::before, +.icon-geodata::before, +.icon-image::before, +.icon-network::before, +.icon-other::before, +.icon-package::before, +.icon-tabular::before, +.icon-unlock::before, +.icon-video::before { + display: inline-block; + font-family: "fontcustom"; + font-style: normal; + font-weight: normal; + font-variant: normal; + line-height: 1; + text-decoration: inherit; + text-rendering: optimizeLegibility; + text-transform: none; + -webkit-font-smoothing: antialiased; +} + +.icon-astro::before { content: "\f104"; } +.icon-audio::before { content: "\f105"; } +.icon-code::before { content: "\f10b"; } +.icon-dataset::before { content: "\f102"; } +.icon-dataverse::before { content: "\f100"; } +.icon-document::before { content: "\f106"; } +.icon-file::before { content: "\f10a"; } +.icon-geodata::before { content: "\f107"; } +.icon-image::before { content: "\f103"; } +.icon-network::before { content: "\f10c"; } +.icon-other::before { content: "\f10d"; } +.icon-package::before { content: "\f10f"; } +.icon-tabular::before { content: "\f108"; } +.icon-unlock::before { content: "\f10e"; } +.icon-video::before { content: "\f109"; } diff --git a/static/css/metrics.css b/static/css/metrics.css new file mode 100644 index 0000000..f85c18d --- /dev/null +++ b/static/css/metrics.css @@ -0,0 +1,3 @@ +.element-hide{ + display: none; + } \ No newline at end of file diff --git a/static/css/module.css b/static/css/module.css new file mode 100644 index 0000000..3b4d33e --- /dev/null +++ b/static/css/module.css @@ -0,0 +1,269 @@ +body{ + /* text-size-adjust:auto; */ + -moz-text-size-adjust:auto; + -webkit-text-size-adjust:auto; + -ms-text-size-adjust:auto; +} +label.textbox-label-before{ + vertical-align:middle; + font-size:90%; +} +tr.wrongcontent{ + display:none; +} +td.wrongcontent{ + visibility:hidden; +} +a.tooltip { + position:relative; + text-decoration:none; +} +a.tooltip:after { + content:attr(data-tooltip); + position:absolute; + bottom:130%; + left:20%; + background:#ffcb66; + padding:5px 15px; + color:black; + -webkit-border-radius:10px; + -moz-border-radius :10px; + border-radius :10px; + white-space:nowrap; + opacity:0; + /* At time of this creation, only Fx4 doing pseduo transitions */ + -webkit-transition:all 0.4s ease; + -moz-transition :all 0.4s ease; +} +a.tooltip:before { + content:""; + position:absolute; + width:0; + height:0; + border-top:20px solid #ffcb66; + border-left:20px solid transparent; + border-right:20px solid transparent; + /* At time of this creation, only Fx4 doing pseduo transitions */ + -webkit-transition:all 0.4s ease; + -moz-transition :all 0.4s ease; + opacity:0; + left:30%; + bottom:90%; +} +a.tooltip:hover:after { + bottom:100%; +} +a.tooltip:hover:before { + bottom:70%; +} +a.tooltip:hover:after, a:hover:before { + opacity:1; +} + +.svgdelivery1, .svgstore1, .svgmale1, .svgfemale1{ + fill:white; + }.svgdelivery1blur, .svgstore1blur, .svgmale1blur, .svgfemale1blur{ + fill:black; +} +.svgsplit{ + fill:#4040FF; !important; + stroke-width:0; !important +} + +.footerstatus { + float:left; + /* font-family:Helvetica,Tahoma,Arial,sans-serif; */ + font-size:130%; + margin-left:10px; +} +.footerstatuserror { + color:#FFFFFF; + background-color:#FF0000; +} + +fieldset { + border:none; + /* float:left; */ + height:auto; + width:auto; +} +.toollabel{ + display:block; + margin:auto; + margin-left:-5px; + margin-top:-6px; + margin-bottom:-7px; + font-size:1.3vh; + display:none; +} +table caption{ + background:rgba(222, 128, 51, 0.75); + color:#444; + border:1px solid #d4a375; + padding:0.25%; + padding-left:0.5%; + text-align:left; + font-size:0.8em; +} +#tablebox { + width:100%; + height:100%; + margin:0px; + clear:both; + border-collapse:collapse; + border-color:black; + table-layout:fixed; + /* font-family:Arial,Helvetica,Tahoma,sans-serif; */ + text-shadow:1px 1px 10px #000, 1px 1px 5px #000; + white-space:nowrap; + border:1px solid transparent; +} +#table_shelflist { + /* width:100%; */ + margin-top:5px; + table-layout:fixed; + white-space:nowrap; + border-collapse:collapse; +} +#table_boxlist { + /* width:100%; */ + table-layout:fixed; + /* font-family:Arial,Helvetica,Tahoma,sans-serif; */ + white-space:nowrap; + border-collapse:collapse; +} +#table_place{ + table-layout:fixed; + width:100%; + height:100%; + margin:auto; + border:0px solid rgb(160,160,160); + white-space:nowrap; + /* font-family:Arial,Helvetica,Tahoma,sans-serif; */ +} + +tr.noborder{ + font-size:110%; +} +td.noborder{ + padding:0px; +} +td.shelfplace{ + width:10vw; + height:9vh; + margin:1px; + background:transparent; + vertical-align:middle; +} +td.droppable{ + /* border:1px solid #FFF; */ +} +td.noshelfplace{ + width:10vw; + height:9vh; + margin:1px; + /* border:4px solid transparent; */ +} +div.contentpanel{ + width:auto; + padding:0.3%; + margin:0.5%; + border:1px solid #d4a375; +} +div.contentscroll{ + width:auto; + overflow:auto; +} +div.contentcaption{ + width:auto; + height:20px; + background:rgba(222, 128, 51, 0.75); + color:#444; + border:1px solid #d4a375; + padding:0.25%; + font-size:1em; + overflow:auto; +} +div.content{ + border:0px; + font-size:0.6em; +} +div.dragbox{ + /* width:96%; */ + height:100%; + border:4px solid transparent; + margin:auto; +} +/* Nur Firefox */ +@-moz-document url-prefix() { + div.dragbox{ + width:95%; + height:100%; + } +} +div.nodragbox{ + width:96%; + height:100%; + /* border:2px solid #F0F0F0 */ + border:2px solid inherit; + /* margin:auto; */ +} +tspan.place{ + text-align:left; + font-size:1.5vh; + position:relative; + left:5%; + width:25%; + float:left; +} +tspan.placeshelf{ + width:95%; + text-align:center; + opacity:0.5; +} +tspan.number{ + width:100%; + text-align:center; + font-size:2.5vh; + position:relative; + float:left; +} +tspan.weight{ + text-align:right; + font-size:1.5vh; + position:relative; + left:8%; + width:90%; + float:left; +} +div.sl{ + border:4px solid #f00; +} + +table.legend{ + width:100%; + height:auto; + border-spacing:0px; +} +td.legend{ + width:10vw; + font-size:1.5vh; + text-align:center; + text-shadow:1px 1px 2px #444; +} +/************************************************/ + +.dontmove{ + opacity: 0.6; +} +.deliverybox{ + /* display:inline-block; */ + text-decoration:none; + border:4px solid transparent; +} +.warehousebox{ + /* display:inline-block; */ + text-decoration:none; + /* padding-right:1em; */ +} + diff --git a/static/css/prism.css b/static/css/prism.css new file mode 100644 index 0000000..d7fca16 --- /dev/null +++ b/static/css/prism.css @@ -0,0 +1,139 @@ +/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+sql */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + diff --git a/static/css/reports/StandardOrderHTML.css b/static/css/reports/StandardOrderHTML.css new file mode 100644 index 0000000..ea91c83 --- /dev/null +++ b/static/css/reports/StandardOrderHTML.css @@ -0,0 +1,235 @@ +html {BORDER-STYLE:_none; HEIGHT:100%;} +body {MARGIN: 5px; FONT-COLOR: black; FONT-FAMILY: Arial; HEIGHT:100%;} + +@media print{ +body {ZOOM: 87%; BACKGROUND-COLOR: #FFFFFF;} +#pagebreak {PAGE-BREAK-AFTER: always;} + +/* popup-menu */ +#menu {DISPLAY: none; FILTER:blendTrans(Duration=0.3);} +input {DISPLAY: none;} +#menucaption {DISPLAY: none;} +#menuitems {DISPLAY: none;} +} +@media screen{ +body {ZOOM: 120%; BACKGROUND-COLOR: #ECE9D8;} +#pagebreak {DISPLAY: none;} + +/* popup-menu */ +#menu, +.submenu {BACKGROUND-COLOR: buttonface; POSITION: absolute; WIDTH: 180px; BORDER-STYLE: outset; BORDER-WIDTH: 2px; Z-INDEX: 200; VISIBILITY: hidden; FILTER:blendTrans(Duration=0.3); FONT-SIZE: 70%;} +input {CURSOR: hand;} +#menucaption {BACKGROUND-COLOR: blue; COLOR: white; TEXT-ALIGN:center;} +#menuitems {PADDING: 5px;} +#menuitemcaption {WIDTH: 79%;} +#menuitemsub {WIDTH: 6%; POSITION: relative; TOP:-3px; CURSOR: hand;} +} + +#reporthead {WIDTH: 800px; HEIGHT: 35px; BACKGROUND-COLOR: white; BORDER-BOTTOM: 1px solid black; FONT-SIZE: 100%;} + +#recipehead, #orderhead {WIDTH: 800px; BACKGROUND-COLOR: silver; FONT-SIZE: 70%;} + +#headcaption {FONT-WEIGHT: bolder; TEXT-DECORATION: underline; CLEAR:both;} + +#headline, +#recipeheadline, +#orderheadline, +#runprogsummaryline {LINE-HEIGHT: 90%;} + +#headitem, +#recipeheaditem {FLOAT: left; WIDTH: 33%;} +#headitemcaption, +#recipeheaditemcaption {FLOAT: left; WIDTH: 40%;} +#headitemvalue, +#recipeheaditemvalue {FLOAT: left; WIDTH: 40%;} +#headitemunit, +#recipeheaditemunit {WIDTH: 20%;} + +#steps {WIDTH: 800px; BORDER-TOP: 1px solid black; BORDER-BOTTOM: 1px solid black; BACKGROUND-COLOR:white;} +#step {CLEAR: both; BORDER-TOP: 1px solid silver; OVERFLOW:hidden;} + +#stepno {FLOAT: left; WIDTH: 4%; PADDING-RIGHT: 2px; CLEAR: both; TEXT-ALIGN: right; FONT-WEIGHT:bold;} + +#stepsubno {FLOAT: left; WIDTH: 2%; FONT-SIZE: 60%} +.stepjump {COLOR:yellow; BACKGROUND-COLOR:blue;} + +#time {FLOAT: left; WIDTH: 10%; LETTER-SPACING: 0px; WORD-SPACING: 0px; FONT: 53%; OVERFLOW: visible;} + +#limitsoll, +#timesoll {FLOAT: left; WIDTH: 49%; OVERFLOW: hidden; COLOR:blue;} +#limitist, +#timeist {FLOAT: left; WIDTH: 49%; OVERFLOW: hidden; COLOR:green; FONT: italic;} + +#werte {WIDTH: 100%; FONT: 70%; OVERFLOW: hidden; LINE-HEIGHT:90%} + + +#value_caption {FLOAT: left; WIDTH: 30%; FONT-WEIGHT: _bolder; } +#value_recipe, +#value_default, +#value_setvalue, +#value_current {FLOAT: left; WIDTH: 10%; TEXT-ALIGN:right; MARGIN-RIGHT:1%;} + +#unit_recipe, +#unit_default, +#unit_setvalue, +#unit_current {FLOAT: left; WIDTH: 5%; OVERFLOW:hidden;} + +#value_recipe, +#unit_recipe {COLOR:blue;} +#value_default, +#unit_default {COLOR:gray;} +#value_setvalue, +#unit_setvalue {} +#value_current, +#unit_current {COLOR:green; FONT: italic;} + +#steptype016w1i,#steptype017w1i,#steptype018w1i, +#steptype019w1i,#steptype020w1i,#steptype021w1i,#steptype022w1i,#steptype023w1i, +#steptype024w1i,#steptype027w1i,#steptype029w1i,#steptype030w1i,#steptype031w1i, +#steptype032w1i,#steptype033w1i,#steptype050w1i,#steptype051w1i, +#steptype016w2i,#steptype017w2i,#steptype018w2i, +#steptype019w2i,#steptype020w2i,#steptype021w2i,#steptype022w2i,#steptype023w2i, +#steptype024w2i,#steptype027w2i,#steptype029w2i,#steptype030w2i,#steptype031w2i, +#steptype032w2i,#steptype033w2i,#steptype050w2i,#steptype051w2i, +#steptype016w3i,#steptype017w3i,#steptype018w3i, +#steptype019w3i,#steptype020w3i,#steptype021w3i,#steptype022w3i,#steptype023w3i, +#steptype024w3i,#steptype027w3i,#steptype029w3i,#steptype030w3i,#steptype031w3i, +#steptype032w3i,#steptype033w3i,#steptype050w3i,#steptype051w3i, +#steptype016w4i,#steptype017w4i,#steptype018w4i, +#steptype019w4i,#steptype020w4i,#steptype021w4i,#steptype022w4i,#steptype023w4i, +#steptype024w4i,#steptype027w4i,#steptype029w4i,#steptype030w4i,#steptype031w4i, +#steptype032w4i,#steptype033w4i,#steptype050w4i,#steptype051w4i, +#steptype016w5i,#steptype017w5i,#steptype018w5i, +#steptype019w5i,#steptype020w5i,#steptype021w5i,#steptype022w5i,#steptype023w5i, +#steptype024w5i,#steptype027w5i,#steptype029w5i,#steptype030w5i,#steptype031w5i, +#steptype032w5i,#steptype033w5i,#steptype050w5i,#steptype051w5i, +#steptype016w6i,#steptype017w6i,#steptype018w6i, +#steptype019w6i,#steptype020w6i,#steptype021w6i,#steptype022w6i,#steptype023w6i, +#steptype024w6i,#steptype027w6i,#steptype029w6i,#steptype030w6i,#steptype031w6i, +#steptype032w6i,#steptype033w6i,#steptype050w6i,#steptype051w6i, + {DISPLAY:none; FLOAT: left; WIDTH: 21%; TEXT-ALIGN: right; FONT: italic 70%; COLOR: blue; OVERFLOW: hidden} + +#steptype016w1s,#steptype017w1s,#steptype018w1s, +#steptype019w1s,#steptype020w1s,#steptype021w1s,#steptype022w1s,#steptype023w1s, +#steptype024w1s,#steptype027w1s,#steptype029w1s,#steptype030w1s,#steptype031w1s, +#steptype032w1s,#steptype033w1s,#steptype050w1s,#steptype051w1s, +#steptype016w2s,#steptype017w2s,#steptype018w2s, +#steptype019w2s,#steptype020w2s,#steptype021w2s,#steptype022w2s,#steptype023w2s, +#steptype024w2s,#steptype027w2s,#steptype029w2s,#steptype030w2s,#steptype031w2s, +#steptype032w2s,#steptype033w2s,#steptype050w2s,#steptype051w2s, +#steptype016w3s,#steptype017w3s,#steptype018w3s, +#steptype019w3s,#steptype020w3s,#steptype021w3s,#steptype022w3s,#steptype023w3s, +#steptype024w3s,#steptype027w3s,#steptype029w3s,#steptype030w3s,#steptype031w3s, +#steptype032w3s,#steptype033w3s,#steptype050w3s,#steptype051w3s, +#steptype016w4s,#steptype017w4s,#steptype018w4s, +#steptype019w4s,#steptype020w4s,#steptype021w4s,#steptype022w4s,#steptype023w4s, +#steptype024w4s,#steptype027w4s,#steptype029w4s,#steptype030w4s,#steptype031w4s, +#steptype032w4s,#steptype033w4s,#steptype050w4s,#steptype051w4s, +#steptype016w5s,#steptype017w5s,#steptype018w5s, +#steptype019w5s,#steptype020w5s,#steptype021w5s,#steptype022w5s,#steptype023w5s, +#steptype024w5s,#steptype027w5s,#steptype029w5s,#steptype030w5s,#steptype031w5s, +#steptype032w5s,#steptype033w5s,#steptype050w5s,#steptype051w5s, +#steptype016w6s,#steptype017w6s,#steptype018w6s, +#steptype019w6s,#steptype020w6s,#steptype021w6s,#steptype022w6s,#steptype023w6s, +#steptype024w6s,#steptype027w6s,#steptype029w6s,#steptype030w6s,#steptype031w6s, +#steptype032w6s,#steptype033w6s,#steptype050w6s,#steptype051w6s + {FLOAT: left; WIDTH: 31%; TEXT-ALIGN: right; FONT: 70%; OVERFLOW: hidden} + +#steptype016w1m,#steptype017w1m,#steptype018w1m, +#steptype019w1m,#steptype020w1m,#steptype021w1m,#steptype022w1m,#steptype023w1m, +#steptype024w1m,#steptype027w1m,#steptype029w1m,#steptype030w1m,#steptype031w1m, +#steptype032w1m,#steptype033w1m,#steptype050w1m,#steptype051w1m, +#steptype016w2m,#steptype017w2m,#steptype018w2m, +#steptype019w2m,#steptype020w2m,#steptype021w2m,#steptype022w2m,#steptype023w2m, +#steptype024w2m,#steptype027w2m,#steptype029w2m,#steptype030w2m,#steptype031w2m, +#steptype032w2m,#steptype033w2m,#steptype050w2m,#steptype051w2m, +#steptype016w3m,#steptype017w3m,#steptype018w3m, +#steptype019w3m,#steptype020w3m,#steptype021w3m,#steptype022w3m,#steptype023w3m, +#steptype024w3m,#steptype027w3m,#steptype029w3m,#steptype030w3m,#steptype031w3m, +#steptype032w3m,#steptype033w3m,#steptype050w3m,#steptype051w3m, +#steptype016w4m,#steptype017w4m,#steptype018w4m, +#steptype019w4m,#steptype020w4m,#steptype021w4m,#steptype022w4m,#steptype023w4m, +#steptype024w4m,#steptype027w4m,#steptype029w4m,#steptype030w4m,#steptype031w4m, +#steptype032w4m,#steptype033w4m,#steptype050w4m,#steptype051w4m, +#steptype016w5m,#steptype017w5m,#steptype018w5m, +#steptype019w5m,#steptype020w5m,#steptype021w5m,#steptype022w5m,#steptype023w5m, +#steptype024w5m,#steptype027w5m,#steptype029w5m,#steptype030w5m,#steptype031w5m, +#steptype032w5m,#steptype033w5m,#steptype050w5m,#steptype051w5m, +#steptype016w6m,#steptype017w6m,#steptype018w6m, +#steptype019w6m,#steptype020w6m,#steptype021w6m,#steptype022w6m,#steptype023w6m, +#steptype024w6m,#steptype027w6m,#steptype029w6m,#steptype030w6m,#steptype031w6m, +#steptype032w6m,#steptype033w6m,#steptype050w6m,#steptype051w6m, + {WIDTH:90%; FONT: 70%; OVERFLOW: hidden} + +#name + {FLOAT: left; WIDTH: 20%; OVERFLOW: hidden; FONT: bold;} + + +#runprog + {FLOAT: left; WIDTH: 5%; OVERFLOW: hidden; FONT: 90%; FONT: bold} + +/* technologischer block */ +#steptype027 {PADDING-BOTTOM: 0.3%; BACKGROUND-COLOR: #E0FFFF; CLEAR: both} +#text {FLOAT: left; WIDTH:50%; FONT-SIZE:17px; OVERFLOW:_hidden; HEIGHT:20px; TEXT-ALIGN:center; PADDING-TOP:3px;} + +/* rezeptende */ +#steptype050 {PADDING-BOTTOM: 0.3%; BACKGROUND-COLOR: #FFD0A0; CLEAR: both; HEIGHT: 20px;} +#steptype050stepno {DISPLAY: _none;} +#steptype050stepsubno {DISPLAY: none;} +#steptype050text {FLOAT: left; WIDTH: 25%; OVERFLOW: hidden; FONT: 90%;} + +/* bewegungsprogramm im schritt */ +#runprog {POSITION: relative; LEFT: 48%; WIDTH: 52%; BACKGROUND-COLOR: #E6E6F0; FONT: 70%; PADDING-LEFT: 1.5%; CLEAR: both} +#runcaption {WIDTH: 19%; FLOAT: left;} +#runvalue {WIDTH: 30%; FLOAT: left;} + +/* farbe fr kommentar #FFE6E6 */ +#steptext {FONT: 80%; CLEAR: both; LINE-HEIGHT: 90%;} +#name_pk {FLOAT: left; PADDING-RIGHT: 2%;} +#action_pk {FLOAT: left; PADDING-RIGHT: 2%;} +#metric_pk {} + +/* schalter im schritt */ +#flags {POSITION: relative; LEFT: 48%; WIDTH: 52%; BACKGROUND-COLOR: #F0E6B6; FONT: 70%; PADDING-LEFT: 0.5%; CLEAR: both} + +/* kommentar */ +#comment {WIDTH: 100%; BACKGROUND-COLOR: #D5BEDE; MARGIN-LEFT: 10%; CLEAR: both; TEXT-ALIGN:center; FONT-SIZE: 90%;} +/* chemikalien */ +#component {WIDTH: 90%; POSITION: relative; LEFT: 10%; BACKGROUND-COLOR: #FFFFE4; LINE-HEIGHT: 90%; CLEAR: both;} +#componentname {WIDTH: 30%; FLOAT: left; PADDING-LEFT:15%; OVERFLOW: hidden; FONT: 90%; CLEAR: both;} +#componentphysicalclose {WIDTH: 10%; FLOAT: left; FONT-SIZE: 75%; COLOR:gray;} +#componentpercent {WIDTH: 8%; FLOAT: left; TEXT-ALIGN: right; FONT-SIZE: 90%; COLOR:blue;} +#componentunitpercent {WIDTH: 4%; FLOAT: left; FONT-SIZE: 90%; COLOR:blue;} +#componentdefault {WIDTH: 8%; FLOAT: left; TEXT-ALIGN: right; FONT-SIZE: 90%; COLOR:gray;} +#componentunitdefault {WIDTH: 4%; FLOAT: left; FONT-SIZE: 90%; COLOR:gray;} +#componentsetvalue {WIDTH: 8%; FLOAT: left; TEXT-ALIGN: right; FONT-SIZE: 90%;} +#componentunitsetvalue {WIDTH: 4%; FLOAT: left; FONT-SIZE: 90%;} +#componentcurrent {WIDTH: 8%; FLOAT: left; TEXT-ALIGN: right; FONT-SIZE: 90%; COLOR:green;} +#componentunitcurrent {WIDTH: 4%; FLOAT: left; FONT-SIZE: 90%; COLOR:green;} +#componentnumber {TEXT-ALIGN: right; FONT-SIZE: 90%; OVERFLOW: hidden} + +.editable {CURSOR:hand; BACKGROUND-COLOR:black; COLOR:white !important; BORDER:1px solid white;} + +#aep_ovrl { +background-color: black; +-moz-opacity: 0.7; opacity: 0.7; +top: 0; left: 0; position: fixed; +width: 100%; height:100%; z-index: 99; +} +#aep_ww { position: fixed; z-index: 100; top: 0; left: 0; width: 100%; height: 100%; text-align: center;} +#aep_win { margin: 20% auto 0 auto; width: 400px; text-align: left;} +#aep_w {background-color: white; padding: 3px; border: 1px solid black; background-color: #EEE;} +#aep_t {color: white; margin: 0 0 2px 3px; font-family: Arial, sans-serif; font-size: 10pt;} +#aep_text {width: 100%;} +#aep_w span {font-family: Arial, sans-serif; font-size: 10pt;} +#aep_w div {text-align: right; margin-top: 5px;} +#aep_ovrl { +position: absolute; +filter:alpha(opacity=70); +top: expression(eval(document.body.scrollTop)); +width: expression(eval(document.body.clientWidth)); +} +#aep_ww { +position: absolute; +top: expression(eval(document.body.scrollTop)); +} \ No newline at end of file diff --git a/static/css/reports/report_work_order.js b/static/css/reports/report_work_order.js new file mode 100644 index 0000000..e69de29 diff --git a/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.eot b/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.eot new file mode 100644 index 0000000..e092c9b Binary files /dev/null and b/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.eot differ diff --git a/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.svg b/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.svg new file mode 100644 index 0000000..a935291 --- /dev/null +++ b/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.svg @@ -0,0 +1,168 @@ + + + + + +Created by FontForge 20141215 at Tue Aug 29 11:31:31 2017 + By Michael Heppler + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.ttf b/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.ttf new file mode 100644 index 0000000..ffb69c4 Binary files /dev/null and b/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.ttf differ diff --git a/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.woff b/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.woff new file mode 100644 index 0000000..715a3d6 Binary files /dev/null and b/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.woff differ diff --git a/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.woff2 b/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.woff2 new file mode 100644 index 0000000..5a84475 Binary files /dev/null and b/static/css/resources/fontcustom/fontcustom_47254e4da4fa5ad5e2bb7c085027ce43.woff2 differ diff --git a/static/images/accordion_arrows.png b/static/images/accordion_arrows.png new file mode 100755 index 0000000..720835f Binary files /dev/null and b/static/images/accordion_arrows.png differ diff --git a/static/images/blank.gif b/static/images/blank.gif new file mode 100755 index 0000000..1d11fa9 Binary files /dev/null and b/static/images/blank.gif differ diff --git a/static/images/calendar_arrows.png b/static/images/calendar_arrows.png new file mode 100755 index 0000000..430c4ad Binary files /dev/null and b/static/images/calendar_arrows.png differ diff --git a/static/images/combo_arrow.png b/static/images/combo_arrow.png new file mode 100755 index 0000000..2e59fb9 Binary files /dev/null and b/static/images/combo_arrow.png differ diff --git a/static/images/datagrid_icons.png b/static/images/datagrid_icons.png new file mode 100755 index 0000000..762d0ce Binary files /dev/null and b/static/images/datagrid_icons.png differ diff --git a/static/images/datebox_arrow.png b/static/images/datebox_arrow.png new file mode 100755 index 0000000..783c833 Binary files /dev/null and b/static/images/datebox_arrow.png differ diff --git a/static/images/layout_arrows.png b/static/images/layout_arrows.png new file mode 100755 index 0000000..6f41654 Binary files /dev/null and b/static/images/layout_arrows.png differ diff --git a/static/images/linkbutton_bg.png b/static/images/linkbutton_bg.png new file mode 100755 index 0000000..fc66bd2 Binary files /dev/null and b/static/images/linkbutton_bg.png differ diff --git a/static/images/loading.gif b/static/images/loading.gif new file mode 100755 index 0000000..68f01d0 Binary files /dev/null and b/static/images/loading.gif differ diff --git a/static/images/menu_arrows.png b/static/images/menu_arrows.png new file mode 100755 index 0000000..b986842 Binary files /dev/null and b/static/images/menu_arrows.png differ diff --git a/static/images/messager_icons.png b/static/images/messager_icons.png new file mode 100644 index 0000000..86b0b0e Binary files /dev/null and b/static/images/messager_icons.png differ diff --git a/static/images/pagination_icons.png b/static/images/pagination_icons.png new file mode 100755 index 0000000..616f0bd Binary files /dev/null and b/static/images/pagination_icons.png differ diff --git a/static/images/panel_tools.png b/static/images/panel_tools.png new file mode 100755 index 0000000..19ecc94 Binary files /dev/null and b/static/images/panel_tools.png differ diff --git a/static/images/passwordbox_close.png b/static/images/passwordbox_close.png new file mode 100644 index 0000000..643c09d Binary files /dev/null and b/static/images/passwordbox_close.png differ diff --git a/static/images/passwordbox_open.png b/static/images/passwordbox_open.png new file mode 100644 index 0000000..d328891 Binary files /dev/null and b/static/images/passwordbox_open.png differ diff --git a/static/images/searchbox_button.png b/static/images/searchbox_button.png new file mode 100755 index 0000000..6dd1931 Binary files /dev/null and b/static/images/searchbox_button.png differ diff --git a/static/images/slider_handle.png b/static/images/slider_handle.png new file mode 100755 index 0000000..b9802ba Binary files /dev/null and b/static/images/slider_handle.png differ diff --git a/static/images/spinner_arrows.png b/static/images/spinner_arrows.png new file mode 100755 index 0000000..7c2df48 Binary files /dev/null and b/static/images/spinner_arrows.png differ diff --git a/static/images/tabs_icons.png b/static/images/tabs_icons.png new file mode 100755 index 0000000..4d29966 Binary files /dev/null and b/static/images/tabs_icons.png differ diff --git a/static/images/tagbox_icons.png b/static/images/tagbox_icons.png new file mode 100644 index 0000000..bd02e2d Binary files /dev/null and b/static/images/tagbox_icons.png differ diff --git a/static/images/tree_icons.png b/static/images/tree_icons.png new file mode 100755 index 0000000..e9be4f3 Binary files /dev/null and b/static/images/tree_icons.png differ diff --git a/static/images/validatebox_warning.png b/static/images/validatebox_warning.png new file mode 100755 index 0000000..2b3d4f0 Binary files /dev/null and b/static/images/validatebox_warning.png differ diff --git a/static/jeasyui/changelog.txt b/static/jeasyui/changelog.txt new file mode 100755 index 0000000..f56b9a2 --- /dev/null +++ b/static/jeasyui/changelog.txt @@ -0,0 +1,692 @@ +Version 1.9.x +------------- +* Bug + * layout: The icon on the collapsed panel is overlaped by title. fixed. + * propertygrid: The css style of the row expander will affact that in the detailview. fixed. + * combogrid: The 'getValues' method returns incorrect values sometimes. fixed. +* Improvement + * datagrid: The 'sorter' function on the column accepts the entire row as the sorting parameters. + * datagrid: Add 'hformatter' and 'hstyler' properties for the colomns. + * datebox: Add 'getDate' and 'setDate' methods. + * pagination: Add 'onBeforeSelectPage' event. + * combo: Prevent from conflicting with svg. + * window: Add 'fixed' property. + * timepicker: Add 'hour24' property. + * layout: Add 'stopCollapsing' method. + +Version 1.9.0 +------------- +* Bug + * datagrid: Slow scrolling with mousewheel on frozen columns. fixed. + * datagrid: The 'rowStyler' function is called on empty row. fixed. + * linkbutton: Calling 'disable' method still can submit the form. fixed. + * combotree: The 'onBeforeSelect' event fires twice while selecting a node. fixed. + * combotreegrid: The 'onSelect' event fires twice while selecting a row. fixed. +* Improvement + * checkbox: Add 'readonly' property. + * radiobutton: Add 'readonly' property. + * Compatible with jQuery 3.x. +* New Plugins + * timepicker: Allow the user to choose time on a clock. + +Version 1.8.0 +------------- +* Bug + * treegrid: The 'pageNumber' can't be initialized with the specified value. fixed. + * checkbox: The disabled checkbox has no disabled label. fixed. +* Improvement + * switchbutton: Add the 'label','labelAlign','labelPosition','labelWidth' properties. + * switchbutton: Accept 'tabindex' attribute to get focus when the user press TAB key. + * form: The 'onChange' event is available for all the form component. + * calendar: The 'Date' property is available to support the hijri date. + * textbox: The floating label is available. + +Version 1.7.0 +------------- +* Bug + * sidemenu: The tooltip has a wrong position when the 'floatMenuPosition' is set to 'left'. fixed. + * datagrid: The horizontal scrollbar has a wrong state when the 'showHeader' is set to true. fixed. + * combo: The initialized value will trigger the form's 'onChange' event when the 'multiple' is set to true. fixed. + * panel: The horizontal panel doesn't work normally when 'noheader' property is set to true. fixed. + * pagination: The extended buttons may lose in IE when rebuild the component. fixed. +* Improvement + * tree: Add 'findBy' method to find a node by any fields. + * tree: The 'find' method is enhanced to find a node easily. + * combo: Add 'panelValign' property. + * datagrid: The sorting parameters will be ignored when the 'remoteSort' is set to false. + * timespinner: Add 'hour12' property to display in 12 hour format. + +Version 1.6.0 +------------- +* Bug + * maskedbox: The component does not accept numeric keypad. fixed. + * combogrid: When selecting multiple records, the datagrid will scroll to the last checked record. fixed. +* Improvement + * Compatible with jQuery 3.x. + * tabs: The 'toolPosition' property can accept 'top' and 'bottom' values. + * textbox: The textbox label has the animating feature when focus or blur on it. + * tooltip: Add 'valign' property. + * tree: The node class can be initialized by setting the 'nodeCls' in the data. +* New Plugins + * sidemenu: The sidemenu is created from accordion and tree plugins. It builds a collapsible menu with some categories. + * radiobutton: This plugin provides a round interface to select one option from a number of options. + * checkbox: This plugin allows a user to select a value from a small set of options. + +Version 1.5.5 +------------- +* Bug + * tabs: The selecting history has wrong order when the title contains complex elements. fixed. + * combo: The drop-down panel may not be hidden if a bigger 'delay' value is set. fixed. + * layout: The expanding panel does not collapse when move mouse quickly away from it. fixed. + * tagbox: The tagbox and the label don't stay in the same line. fixed. +* Improvement + * combo: The 'blur' event handler is attached to the 'inputEvents' property. + * numberbox: The 'cloneFrom' method is available. + * slider: The 'step' property can be set with a floating number. + * menu: The 'findItem' method allows the user to find menu item by any parameters. + * menubutton: Add 'showEvent' and 'hideEvent' properties. +* New Plugins + * maskedbox: The maskedbox enforces its structure as the user types. + +Version 1.5.4 +------------- +* Bug + * combotreegrid: The 'onChange' event does not fire when entering values on the inputing box. fixed. + * combobox: Clicking on the drop-down panel will jump to the bottom of body on win10 IE11. fixed. + * datebox: Clicking on the 'Today' button doesn't trigger the 'onSelect' event. fixed. + * propertygrid: The 'getChanges' method doesn't work after editing the only one row. fixed. +* Improvement + * combo: Add the 'panelEvents' property. + * combo: Attach the default 'mousedown' event handler. + * combobox: The 'setValues' method can be called to initialize the displaying text. + * combotreegrid: Press ENTER key to select the highlighted rows. + * panel: Improve the resizing performance. + * filebox: The 'files' method allows the user to get the selected file list. + * searchbox: Improvent the 'selectName' method. + +Version 1.5.3 +------------- +* Bug + * combobox: The 'iconCls' property can not be parsed from the