mapcomplete/Logic/Web/QueryParameters.ts

102 lines
3.3 KiB
TypeScript
Raw Normal View History

2020-07-22 23:47:04 +02:00
/**
* Wraps the query parameters into UIEventSources
*/
import {UIEventSource} from "../UIEventSource";
2020-11-17 02:22:48 +01:00
import Hash from "./Hash";
2020-07-22 23:47:04 +02:00
export class QueryParameters {
2020-11-13 23:58:11 +01:00
private static order: string [] = ["layout", "test", "z", "lat", "lon"];
2020-07-31 17:11:44 +02:00
private static knownSources = {};
private static initialized = false;
2020-07-29 15:05:19 +02:00
private static defaults = {}
2020-11-13 23:58:11 +01:00
private static documentation = {}
private static addOrder(key) {
if (this.order.indexOf(key) < 0) {
2020-07-22 23:47:04 +02:00
this.order.push(key)
}
}
private static init() {
2020-11-13 23:58:11 +01:00
if (this.initialized) {
2020-07-25 18:00:08 +02:00
return;
}
2020-07-31 17:11:44 +02:00
this.initialized = true;
if (window?.location?.search) {
2020-07-22 23:47:04 +02:00
const params = window.location.search.substr(1).split("&");
for (const param of params) {
const kv = param.split("=");
2020-10-17 03:56:08 +02:00
const key = decodeURIComponent(kv[0]);
2020-07-22 23:47:04 +02:00
QueryParameters.addOrder(key)
2020-10-17 03:56:08 +02:00
const v = decodeURIComponent(kv[1]);
2020-07-22 23:47:04 +02:00
const source = new UIEventSource<string>(v);
source.addCallback(() => QueryParameters.Serialize())
2020-07-31 17:11:44 +02:00
QueryParameters.knownSources[key] = source;
2020-07-22 23:47:04 +02:00
}
}
2021-04-06 18:34:45 +02:00
window["mapcomplete_query_parameter_overview"] = () => {
console.log(QueryParameters.GenerateQueryParameterDocs())
}
2020-07-22 23:47:04 +02:00
}
private static Serialize() {
const parts = []
for (const key of QueryParameters.order) {
2021-01-08 18:02:07 +01:00
if (QueryParameters.knownSources[key]?.data === undefined) {
2020-07-22 23:47:04 +02:00
continue;
}
2020-11-02 20:15:55 +01:00
2020-12-04 21:30:35 +01:00
if (QueryParameters.knownSources[key].data === "undefined") {
continue;
}
2021-01-08 18:02:07 +01:00
if (QueryParameters.knownSources[key].data === QueryParameters.defaults[key]) {
2020-07-29 15:05:19 +02:00
continue;
}
2020-11-02 20:15:55 +01:00
2020-07-22 23:47:04 +02:00
parts.push(encodeURIComponent(key) + "=" + encodeURIComponent(QueryParameters.knownSources[key].data))
}
2021-01-08 16:49:42 +01:00
// Don't pollute the history every time a parameter changes
2021-01-08 18:02:07 +01:00
history.replaceState(null, "", "?" + parts.join("&") + Hash.Current());
2020-07-22 23:47:04 +02:00
}
public static GetQueryParameter(key: string, deflt: string, documentation?: string): UIEventSource<string> {
2020-07-31 17:11:44 +02:00
if(!this.initialized){
this.init();
}
2020-11-13 23:58:11 +01:00
QueryParameters.documentation[key] = documentation;
if (deflt !== undefined) {
QueryParameters.defaults[key] = deflt;
}
2020-07-22 23:47:04 +02:00
if (QueryParameters.knownSources[key] !== undefined) {
return QueryParameters.knownSources[key];
}
QueryParameters.addOrder(key);
2021-04-23 20:09:27 +02:00
const source = new UIEventSource<string>(deflt, "&"+key);
2020-07-22 23:47:04 +02:00
QueryParameters.knownSources[key] = source;
source.addCallback(() => QueryParameters.Serialize())
return source;
}
2020-11-13 23:58:11 +01:00
public static GenerateQueryParameterDocs(): string {
const docs = [];
for (const key in QueryParameters.documentation) {
2021-04-06 18:34:45 +02:00
docs.push([
" "+key+" ",
"-".repeat(key.length + 2),
QueryParameters.documentation[key],
QueryParameters.defaults[key] === undefined ? "No default value set" : `The default value is _${QueryParameters.defaults[key]}_`
].join("\n"))
2020-11-13 23:58:11 +01:00
}
return docs.join("\n\n");
}
2020-07-22 23:47:04 +02:00
}