diff --git a/README.md b/README.md
index e55fa5880..517a88b55 100644
--- a/README.md
+++ b/README.md
@@ -90,8 +90,7 @@ To get your hands on Traefik, you can use the [5-Minute Quickstart](http://docs.
You can access the simple HTML frontend of Traefik.
-![Web UI Providers](docs/content/assets/img/dashboard-main.png)
-![Web UI Health](docs/content/assets/img/dashboard-health.png)
+![Web UI Providers](docs/content/assets/img/webui-dashboard.png)
## Documentation
diff --git a/docs/content/assets/img/dashboard-health.png b/docs/content/assets/img/dashboard-health.png
deleted file mode 100644
index cf3160975..000000000
Binary files a/docs/content/assets/img/dashboard-health.png and /dev/null differ
diff --git a/docs/content/assets/img/dashboard-main.png b/docs/content/assets/img/dashboard-main.png
deleted file mode 100644
index 62a90e5e9..000000000
Binary files a/docs/content/assets/img/dashboard-main.png and /dev/null differ
diff --git a/docs/content/assets/img/webui-dashboard.png b/docs/content/assets/img/webui-dashboard.png
new file mode 100644
index 000000000..80a5178b0
Binary files /dev/null and b/docs/content/assets/img/webui-dashboard.png differ
diff --git a/docs/content/middlewares/passtlsclientcert.md b/docs/content/middlewares/passtlsclientcert.md
index 6498000e3..ff53b05cc 100644
--- a/docs/content/middlewares/passtlsclientcert.md
+++ b/docs/content/middlewares/passtlsclientcert.md
@@ -3,7 +3,9 @@
Adding Client Certificates in a Header
{: .subtitle }
-`TODO add schema`
+
PassTLSClientCert adds in header the selected data from the passed client tls certificate.
diff --git a/docs/content/middlewares/redirectregex.md b/docs/content/middlewares/redirectregex.md
index c34da5133..6dd1ae3cf 100644
--- a/docs/content/middlewares/redirectregex.md
+++ b/docs/content/middlewares/redirectregex.md
@@ -3,7 +3,9 @@
Redirecting the Client to a Different Location
{: .subtitle }
-`TODO: add schema`
+
RegexRedirect redirect a request from an url to another with regex matching and replacement.
diff --git a/docs/content/middlewares/redirectscheme.md b/docs/content/middlewares/redirectscheme.md
index 65a01c823..f4af47a16 100644
--- a/docs/content/middlewares/redirectscheme.md
+++ b/docs/content/middlewares/redirectscheme.md
@@ -3,7 +3,9 @@
Redirecting the Client to a Different Scheme/Port
{: .subtitle }
-`TODO: add schema`
+
RegexRedirect redirect request from a scheme to another.
diff --git a/docs/content/middlewares/replacepath.md b/docs/content/middlewares/replacepath.md
index b491c8033..f2e03d552 100644
--- a/docs/content/middlewares/replacepath.md
+++ b/docs/content/middlewares/replacepath.md
@@ -3,7 +3,9 @@
Updating the Path Before Forwarding the Request
{: .subtitle }
-`TODO: add schema`
+
Replace the path of the request url.
diff --git a/docs/content/middlewares/replacepathregex.md b/docs/content/middlewares/replacepathregex.md
index fbdb47f0d..a58e302a9 100644
--- a/docs/content/middlewares/replacepathregex.md
+++ b/docs/content/middlewares/replacepathregex.md
@@ -3,7 +3,9 @@
Updating the Path Before Forwarding the Request (Using a Regex)
{: .subtitle }
-`TODO: add schema`
+
The ReplaceRegex replace a path from an url to another with regex matching and replacement.
diff --git a/docs/content/middlewares/retry.md b/docs/content/middlewares/retry.md
index e7704c862..b61b362f2 100644
--- a/docs/content/middlewares/retry.md
+++ b/docs/content/middlewares/retry.md
@@ -3,7 +3,9 @@
Retrying until it Succeeds
{: .subtitle }
-`TODO: add schema`
+
The Retry middleware is in charge of reissuing a request a given number of times to a backend server if that server does not reply.
To be clear, as soon as the server answers, the middleware stops retrying, regardless of the response status.
diff --git a/docs/content/middlewares/stripprefix.md b/docs/content/middlewares/stripprefix.md
index 14e1df748..2b3515ccb 100644
--- a/docs/content/middlewares/stripprefix.md
+++ b/docs/content/middlewares/stripprefix.md
@@ -3,7 +3,9 @@
Removing Prefixes From the Path Before Forwarding the Request
{: .subtitle }
-`TODO: add schema`
+
Remove the specified prefixes from the URL path.
diff --git a/docs/content/operations/dashboard.md b/docs/content/operations/dashboard.md
index c0443c199..a73a52ee2 100644
--- a/docs/content/operations/dashboard.md
+++ b/docs/content/operations/dashboard.md
@@ -5,25 +5,16 @@ See What's Going On
The dashboard is the central place that shows you the current active routes handled by Traefik.
-!!! warning "Dashboard WIP"
- Currently, the dashboard is in a Work In Progress State while being reconstructed for v2.
- Therefore, the dashboard is currently not working.
-
-
-
By default, the dashboard is available on `/` on port `:8080`.
!!! tip "Did You Know?"
It is possible to customize the dashboard endpoint.
- To learn how, refer to the `Traefik's API documentation`(TODO: add doc and link).
+ To learn how, refer to the [API documentation](./api.md)
## Enabling the Dashboard
@@ -64,4 +55,4 @@ api:
!!! tip "Did You Know?"
The API provides more features than the Dashboard.
- To learn more about it, refer to the `Traefik's API documentation`(TODO: add doc and link).
+ To learn more about it, refer to the [API documentation](./api.md)
diff --git a/webui/package-lock.json b/webui/package-lock.json
index ce0c1d3aa..881323f68 100644
--- a/webui/package-lock.json
+++ b/webui/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "traefik-ui",
- "version": "0.1.0",
+ "version": "2.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -1465,6 +1465,7 @@
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "dev": true,
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
@@ -1619,7 +1620,8 @@
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
},
"array-includes": {
"version": "3.0.3",
@@ -2091,6 +2093,7 @@
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "dev": true,
"requires": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
@@ -2108,6 +2111,7 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"requires": {
"ms": "2.0.0"
}
@@ -2115,7 +2119,8 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
}
}
},
@@ -2297,7 +2302,8 @@
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "dev": true
},
"cacache": {
"version": "11.3.3",
@@ -2929,7 +2935,8 @@
"connect-history-api-fallback": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
- "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg=="
+ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+ "dev": true
},
"console-browserify": {
"version": "1.1.0",
@@ -2971,6 +2978,7 @@
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "dev": true,
"requires": {
"safe-buffer": "5.1.2"
}
@@ -2978,7 +2986,8 @@
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
},
"convert-source-map": {
"version": "1.6.0",
@@ -2992,12 +3001,14 @@
"cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+ "dev": true
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
},
"copy-concurrently": {
"version": "1.0.5",
@@ -3575,7 +3586,8 @@
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
},
"des.js": {
"version": "1.0.0",
@@ -3590,7 +3602,8 @@
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
},
"detect-node": {
"version": "2.0.4",
@@ -3751,7 +3764,8 @@
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
},
"ejs": {
"version": "2.6.2",
@@ -3812,7 +3826,8 @@
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
},
"end-of-stream": {
"version": "1.4.1",
@@ -3895,7 +3910,8 @@
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
@@ -4296,7 +4312,8 @@
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
},
"eventemitter3": {
"version": "3.1.2",
@@ -4398,6 +4415,7 @@
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "dev": true,
"requires": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
@@ -4435,6 +4453,7 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"requires": {
"ms": "2.0.0"
}
@@ -4442,7 +4461,8 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
}
}
},
@@ -4681,6 +4701,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
@@ -4695,6 +4716,7 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"requires": {
"ms": "2.0.0"
}
@@ -4702,7 +4724,8 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
}
}
},
@@ -4844,7 +4867,8 @@
"forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
- "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
},
"fragment-cache": {
"version": "0.2.1",
@@ -4858,7 +4882,8 @@
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
},
"friendly-errors-webpack-plugin": {
"version": "1.7.0",
@@ -5515,6 +5540,7 @@
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "dev": true,
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
@@ -5526,7 +5552,8 @@
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
}
}
},
@@ -5700,6 +5727,7 @@
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
@@ -5873,7 +5901,8 @@
"ipaddr.js": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
- "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
+ "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
+ "dev": true
},
"is-absolute-url": {
"version": "2.1.0",
@@ -6704,7 +6733,8 @@
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
},
"mem": {
"version": "4.3.0",
@@ -6846,7 +6876,8 @@
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
},
"merge-source-map": {
"version": "1.1.0",
@@ -6874,7 +6905,8 @@
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
},
"micromatch": {
"version": "4.0.2",
@@ -6899,17 +6931,20 @@
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true
},
"mime-db": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
- "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
+ "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
+ "dev": true
},
"mime-types": {
"version": "2.1.24",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
"integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+ "dev": true,
"requires": {
"mime-db": "1.40.0"
}
@@ -7128,7 +7163,8 @@
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+ "dev": true
},
"neo-async": {
"version": "2.6.1",
@@ -7540,6 +7576,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
"requires": {
"ee-first": "1.1.1"
}
@@ -7803,7 +7840,8 @@
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true
},
"pascalcase": {
"version": "0.1.1",
@@ -7856,7 +7894,8 @@
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
},
"path-type": {
"version": "3.0.0",
@@ -8719,6 +8758,7 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
"integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
+ "dev": true,
"requires": {
"forwarded": "~0.1.2",
"ipaddr.js": "1.9.0"
@@ -8804,7 +8844,8 @@
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "dev": true
},
"quasar": {
"version": "1.0.5",
@@ -8861,12 +8902,14 @@
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "dev": true,
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
@@ -9382,7 +9425,8 @@
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
},
"safe-regex": {
"version": "1.1.0",
@@ -9396,7 +9440,8 @@
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
},
"sass-graph": {
"version": "2.2.4",
@@ -9713,6 +9758,7 @@
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "dev": true,
"requires": {
"debug": "2.6.9",
"depd": "~1.1.2",
@@ -9733,6 +9779,7 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"requires": {
"ms": "2.0.0"
},
@@ -9740,14 +9787,16 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
}
}
},
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
}
}
},
@@ -9817,6 +9866,7 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "dev": true,
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
@@ -9862,7 +9912,8 @@
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "dev": true
},
"sha.js": {
"version": "2.4.11",
@@ -10321,7 +10372,8 @@
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "dev": true
},
"stdout-stream": {
"version": "1.4.1",
@@ -10792,7 +10844,8 @@
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+ "dev": true
},
"toposort": {
"version": "1.0.7",
@@ -10885,6 +10938,7 @@
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
@@ -10993,7 +11047,8 @@
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
},
"unquote": {
"version": "1.1.1",
@@ -11163,7 +11218,8 @@
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
},
"uuid": {
"version": "3.3.2",
@@ -11184,7 +11240,8 @@
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
},
"vendors": {
"version": "1.0.3",
diff --git a/webui/package.json b/webui/package.json
index 7553c88db..544f6748c 100644
--- a/webui/package.json
+++ b/webui/package.json
@@ -20,8 +20,6 @@
"axios": "^0.19.0",
"bowser": "^2.5.2",
"chart.js": "^2.8.0",
- "connect-history-api-fallback": "^1.6.0",
- "express": "^4.17.1",
"lodash": "^4.17.15",
"moment": "^2.24.0",
"quasar": "^1.0.0",
diff --git a/webui/quasar.conf.js b/webui/quasar.conf.js
index 7fb3c3cfd..109fa6130 100644
--- a/webui/quasar.conf.js
+++ b/webui/quasar.conf.js
@@ -85,7 +85,8 @@ module.exports = function (ctx) {
'QDialog',
'QUploader',
'QTree',
- 'QChip'
+ 'QChip',
+ 'QBtnToggle'
],
directives: [
diff --git a/webui/src/_middleware/Boot.js b/webui/src/_middleware/Boot.js
index 8f0a5349f..9fccf11df 100644
--- a/webui/src/_middleware/Boot.js
+++ b/webui/src/_middleware/Boot.js
@@ -1,4 +1,5 @@
import { APP } from '../_helpers/APP'
+import Helps from '../_helpers/Helps'
const Boot = {
install (Vue, options) {
@@ -13,11 +14,23 @@ const Boot = {
},
env () {
return APP.config.env
+ },
+ appThumbStyle () {
+ return {
+ right: '2px',
+ borderRadius: '2px',
+ backgroundColor: '#dcdcdc',
+ width: '6px',
+ opacity: 0.75
+ }
}
},
methods: {
},
filters: {
+ capFirstLetter (value) {
+ return Helps.capFirstLetter(value)
+ }
},
created () {
}
diff --git a/webui/src/_services/EntrypointsService.js b/webui/src/_services/EntrypointsService.js
index 71d564759..8dfaffaed 100644
--- a/webui/src/_services/EntrypointsService.js
+++ b/webui/src/_services/EntrypointsService.js
@@ -10,6 +10,15 @@ function getAll () {
})
}
-export default {
- getAll
+function getByName (name) {
+ return APP.api.get(`${apiBase}/${name}`)
+ .then(body => {
+ console.log('Success -> EntrypointsService -> getByName', body.data)
+ return body.data
+ })
+}
+
+export default {
+ getAll,
+ getByName
}
diff --git a/webui/src/_services/HttpService.js b/webui/src/_services/HttpService.js
new file mode 100644
index 000000000..19deca0b6
--- /dev/null
+++ b/webui/src/_services/HttpService.js
@@ -0,0 +1,75 @@
+import { APP } from '../_helpers/APP'
+
+const apiBase = '/http'
+
+function getAllRouters (params) {
+ return APP.api.get(`${apiBase}/routers?search=${params.query}&status=${params.status}`)
+ .then(body => {
+ const total = body.data ? body.data.length : 0
+ return APP.api.get(`${apiBase}/routers?search=${params.query}&status=${params.status}&per_page=${params.limit}&page=${params.page}`)
+ .then(body => {
+ console.log('Success -> HttpService -> getAllRouters', body.data)
+ // TODO - suggestion: add the total-pages in api response to optimize the query
+ return { data: body.data || [], total }
+ })
+ })
+}
+
+function getRouterByName (name) {
+ return APP.api.get(`${apiBase}/routers/${name}`)
+ .then(body => {
+ console.log('Success -> HttpService -> getRouterByName', body.data)
+ return body.data
+ })
+}
+
+function getAllServices (params) {
+ return APP.api.get(`${apiBase}/services?search=${params.query}&status=${params.status}`)
+ .then(body => {
+ const total = body.data ? body.data.length : 0
+ return APP.api.get(`${apiBase}/services?search=${params.query}&status=${params.status}&per_page=${params.limit}&page=${params.page}`)
+ .then(body => {
+ console.log('Success -> HttpService -> getAllServices', body.data)
+ // TODO - suggestion: add the total-pages in api response to optimize the query
+ return { data: body.data || [], total }
+ })
+ })
+}
+
+function getServiceByName (name) {
+ return APP.api.get(`${apiBase}/services/${name}`)
+ .then(body => {
+ console.log('Success -> HttpService -> getServiceByName', body.data)
+ return body.data
+ })
+}
+
+function getAllMiddlewares (params) {
+ return APP.api.get(`${apiBase}/middlewares?search=${params.query}&status=${params.status}`)
+ .then(body => {
+ const total = body.data ? body.data.length : 0
+ return APP.api.get(`${apiBase}/middlewares?search=${params.query}&status=${params.status}&per_page=${params.limit}&page=${params.page}`)
+ .then(body => {
+ console.log('Success -> HttpService -> getAllMiddlewares', body.data)
+ // TODO - suggestion: add the total-pages in api response to optimize the query
+ return { data: body.data || [], total }
+ })
+ })
+}
+
+function getMiddlewareByName (name) {
+ return APP.api.get(`${apiBase}/middlewares/${name}`)
+ .then(body => {
+ console.log('Success -> HttpService -> getMiddlewareByName', body.data)
+ return body.data
+ })
+}
+
+export default {
+ getAllRouters,
+ getRouterByName,
+ getAllServices,
+ getServiceByName,
+ getAllMiddlewares,
+ getMiddlewareByName
+}
diff --git a/webui/src/_services/TcpService.js b/webui/src/_services/TcpService.js
new file mode 100644
index 000000000..08f1b6131
--- /dev/null
+++ b/webui/src/_services/TcpService.js
@@ -0,0 +1,52 @@
+import { APP } from '../_helpers/APP'
+
+const apiBase = '/tcp'
+
+function getAllRouters (params) {
+ return APP.api.get(`${apiBase}/routers?search=${params.query}&status=${params.status}`)
+ .then(body => {
+ const total = body.data ? body.data.length : 0
+ return APP.api.get(`${apiBase}/routers?search=${params.query}&status=${params.status}&per_page=${params.limit}&page=${params.page}`)
+ .then(body => {
+ console.log('Success -> HttpService -> getAllRouters', body.data)
+ // TODO - suggestion: add the total-pages in api response to optimize the query
+ return { data: body.data || [], total }
+ })
+ })
+}
+
+function getRouterByName (name) {
+ return APP.api.get(`${apiBase}/routers/${name}`)
+ .then(body => {
+ console.log('Success -> HttpService -> getRouterByName', body.data)
+ return body.data
+ })
+}
+
+function getAllServices (params) {
+ return APP.api.get(`${apiBase}/services?search=${params.query}&status=${params.status}`)
+ .then(body => {
+ const total = body.data ? body.data.length : 0
+ return APP.api.get(`${apiBase}/services?search=${params.query}&status=${params.status}&per_page=${params.limit}&page=${params.page}`)
+ .then(body => {
+ console.log('Success -> HttpService -> getAllServices', body.data)
+ // TODO - suggestion: add the total-pages in api response to optimize the query
+ return { data: body.data || [], total }
+ })
+ })
+}
+
+function getServiceByName (name) {
+ return APP.api.get(`${apiBase}/services/${name}`)
+ .then(body => {
+ console.log('Success -> HttpService -> getServiceByName', body.data)
+ return body.data
+ })
+}
+
+export default {
+ getAllRouters,
+ getRouterByName,
+ getAllServices,
+ getServiceByName
+}
diff --git a/webui/src/assets/middlewares-empty.svg b/webui/src/assets/middlewares-empty.svg
new file mode 100644
index 000000000..172ad3225
--- /dev/null
+++ b/webui/src/assets/middlewares-empty.svg
@@ -0,0 +1,7 @@
+
diff --git a/webui/src/components/_commons/BooleanState.vue b/webui/src/components/_commons/BooleanState.vue
new file mode 100644
index 000000000..7091b099c
--- /dev/null
+++ b/webui/src/components/_commons/BooleanState.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
{{value ? 'True' : 'False'}}
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/MainTable.vue b/webui/src/components/_commons/MainTable.vue
new file mode 100644
index 000000000..40ac29e40
--- /dev/null
+++ b/webui/src/components/_commons/MainTable.vue
@@ -0,0 +1,249 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.row.rule }}
+
+
+
+
+
+ {{ entryPoints }}
+
+
+
+
+
+ {{ props.row.name }}
+
+
+
+
+ {{ props.row.type }}
+
+
+
+ {{ props.row | servers }}
+
+
+
+ {{ props.row.service }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/NavBar.vue b/webui/src/components/_commons/NavBar.vue
index 2e1e92d1e..0818f6135 100644
--- a/webui/src/components/_commons/NavBar.vue
+++ b/webui/src/components/_commons/NavBar.vue
@@ -8,6 +8,8 @@
+
+
diff --git a/webui/src/components/_commons/PanelHealthCheck.vue b/webui/src/components/_commons/PanelHealthCheck.vue
new file mode 100644
index 000000000..7b385d820
--- /dev/null
+++ b/webui/src/components/_commons/PanelHealthCheck.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
SCHEME
+
+ {{ data.scheme }}
+
+
+
+
INTERVAL
+
+ {{ data.interval }}
+
+
+
+
+
+
+
+
PATH
+
+ {{ data.path }}
+
+
+
+
TIMEOUT
+
+ {{ data.timeout }}
+
+
+
+
+
+
+
+
PORT
+
+ {{ data.port }}
+
+
+
+
HOSTNAME
+
+ {{ data.hostname }}
+
+
+
+
+
+
+
+
+
+ {{ index }}: {{ header }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/PanelMiddlewares.vue b/webui/src/components/_commons/PanelMiddlewares.vue
new file mode 100644
index 000000000..a961e2871
--- /dev/null
+++ b/webui/src/components/_commons/PanelMiddlewares.vue
@@ -0,0 +1,1204 @@
+
+
+
+
+
+ {{ middleware.name }}
+
+
+
+
+
+
Type
+
+ {{ middleware.type }}
+
+
+
+
PROVIDER
+
+
+
+
+
{{middleware.provider}}
+
+
+
+
+
+
+
+
STATUS
+
+
+
{{middleware.status | statusLabel}}
+
+
+
+
+
+
+
+
+
ERRORS
+
+ {{ errorMsg }}
+
+
+
+
+
+
+
+
+
+
PREFIX
+
+ {{ exData(middleware).prefix }}
+
+
+
+
+
+
+
+
+
+
USERS
+
+ {{ user }}
+
+
+
+
+
+
+
+
+
Users File
+
+ {{ exData(middleware).usersFile }}
+
+
+
+
+
+
+
+
+
Realm
+
+ {{ exData(middleware).realm }}
+
+
+
+
+
+
+
+
+
+
+
+
+
Header Field
+
+ {{ exData(middleware).headerField }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Max Request Body Bytes
+
+ {{ exData(middleware).maxRequestBodyBytes }}
+
+
+
+
Mem Request Body Bytes
+
+ {{ exData(middleware).memRequestBodyBytes }}
+
+
+
+
+
+
+
+
+
Max Response Body Bytes
+
+ {{ exData(middleware).maxResponseBodyBytes }}
+
+
+
+
Mem Response Body Bytes
+
+ {{ exData(middleware).memResponseBodyBytes }}
+
+
+
+
+
+
+
+
+
Retry Expression
+
+ {{ exData(middleware).retryExpression }}
+
+
+
+
+
+
+
+
+
+
Expression
+
+ {{ exData(middleware).expression }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Service
+
+ {{ exData(middleware).service }}
+
+
+
+
+
+
+
+
+
Query
+
+ {{ exData(middleware).query }}
+
+
+
+
+
+
+
+
+
Status
+
+ {{ st }}
+
+
+
+
+
+
+
+
+
+
Address
+
+ {{ exData(middleware).address }}
+
+
+
+
+
+
+
+
+
+
Trust Forward Headers
+
+
+
+
+
+
+
+
+
Auth Response Headers
+
+ {{ respHeader }}
+
+
+
+
+
+
+
+
+
+
Custom Request Headers
+
+ {{ val }}
+
+
+
+
+
+
+
+
+
Custom Response Headers
+
+ {{ val }}
+
+
+
+
+
+
+
+
+
Access Control Allow Credentials
+
+
+
+
+
+
+
+
+
Access Control Allow Headers
+
+ {{ val }}
+
+
+
+
+
+
+
+
+
Access Control Allow Methods
+
+ {{ val }}
+
+
+
+
+
+
+
+
+
Access Control Allow Origin
+
+ {{ exData(middleware).accessControlAllowOrigin }}
+
+
+
+
+
+
+
+
+
Access Control Expose Headers
+
+ {{ val }}
+
+
+
+
+
+
+
+
+
Access Control Max Age
+
+ {{ exData(middleware).accessControlMaxAge }}
+
+
+
+
+
+
+
+
+
+
+
+
+
Allowed Hosts
+
+ {{ val }}
+
+
+
+
+
+
+
+
+
Hosts Proxy Headers
+
+ {{ val }}
+
+
+
+
+
+
+
+
+
+
+
+
+
SSL Temporary Redirect
+
+
+
+
+
+
+
+
+
SSL Host
+
+ {{ exData(middleware).sslHost }}
+
+
+
+
+
+
+
+
+
SSL Proxy Headers
+
+ {{ val }}
+
+
+
+
+
+
+
+
+
+
+
+
+
STS Seconds
+
+ {{ exData(middleware).stsSeconds }}
+
+
+
+
+
+
+
+
+
STS Include Subdomains
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Custom Frame Options Value
+
+ {{ exData(middleware).customFrameOptionsValue }}
+
+
+
+
+
+
+
+
+
Content Type Nosniff
+
+
+
+
+
+
+
+
+
+
+
+
+
Custom Browser XSS Value
+
+ {{ exData(middleware).customBrowserXSSValue }}
+
+
+
+
+
+
+
+
+
Content Security Policy
+
+ {{ exData(middleware).contentSecurityPolicy }}
+
+
+
+
+
+
+
+
+
Public Key
+
+ {{ exData(middleware).publicKey }}
+
+
+
+
+
+
+
+
+
Referrer Policy
+
+ {{ exData(middleware).referrerPolicy }}
+
+
+
+
+
+
+
+
+
Feature Policy
+
+ {{ exData(middleware).featurePolicy }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source Range
+
+ {{ range }}
+
+
+
+
+
+
+
+
+
+ Depth :
+
+ {{ exData(middleware).ipStrategy.depth }}
+
+
+
+
+
+ Excluded IPs:
+
+
+ {{ excludedIPs }}
+
+
+
+
+
+
+
+
+
+
+
Average
+
+ {{ exData(middleware).average }}
+
+
+
+
Burst
+
+ {{ exData(middleware).burst }}
+
+
+
+
+
+
+
+
+
+
AMOUNT
+
+ {{ exData(middleware).amount }}
+
+
+
+
+
+
+
+
+
+
+ Depth :
+
+ {{ exData(middleware).sourceCriterion.ipStrategy.depth }}
+
+
+
+
+
+ Excluded IPs:
+
+
+ {{ excludedIPs }}
+
+
+
+
+
+
+
+
+
+
REQUEST HEADER NAME
+
+ {{ exData(middleware).sourceCriterion.requestHeaderName }}
+
+
+
+
+
+
+
+
+
+
+
+
+ Info:
+
+
+
+
+ Info Subject:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Info Issuer:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Regex
+
+ {{ exData(middleware).regex }}
+
+
+
+
+
+
+
+
+
Replacement
+
+ {{ exData(middleware).replacement }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Scheme
+
+ {{ exData(middleware).scheme }}
+
+
+
+
+
+
+
+
+
+
Path
+
+ {{ exData(middleware).path }}
+
+
+
+
+
+
+
+
+
+
Regex
+
+ {{ exData(middleware).regex }}
+
+
+
+
+
+
+
+
+
Replacement
+
+ {{ exData(middleware).replacement }}
+
+
+
+
+
+
+
+
+
+
Attempts
+
+ {{ exData(middleware).attempts }}
+
+
+
+
+
+
+
+
+
+
Prefixes
+
+ {{ prefix }}
+
+
+
+
+
+
+
+
+
+
Regex
+
+ {{ exp }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
There are no
Middlewares configured
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/PanelMirroringServices.vue b/webui/src/components/_commons/PanelMirroringServices.vue
new file mode 100644
index 000000000..defa0eb74
--- /dev/null
+++ b/webui/src/components/_commons/PanelMirroringServices.vue
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ service.name }}
+
+
+
+ {{ service.percent }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/PanelRouterDetails.vue b/webui/src/components/_commons/PanelRouterDetails.vue
new file mode 100644
index 000000000..b5c2aec2a
--- /dev/null
+++ b/webui/src/components/_commons/PanelRouterDetails.vue
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
STATUS
+
+
+
{{data.status | statusLabel}}
+
+
+
+
PROVIDER
+
+
+
+
+
{{data.provider}}
+
+
+
+
+
+
+
+
RULE
+
+ {{ data.rule }}
+
+
+
+
+
+
+
+
NAME
+
+ {{ data.name }}
+
+
+
+
+
+
+
+
ENTRYPOINTS
+
+ {{ entryPoint }}
+
+
+
+
+
+
+
+
SERVICE
+
+ {{ data.service }}
+
+
+
+
+
+
+
+
ERRORS
+
+ {{ errorMsg }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/PanelServers.vue b/webui/src/components/_commons/PanelServers.vue
new file mode 100644
index 000000000..36968b476
--- /dev/null
+++ b/webui/src/components/_commons/PanelServers.vue
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ server.url || server.address}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/PanelServiceDetails.vue b/webui/src/components/_commons/PanelServiceDetails.vue
new file mode 100644
index 000000000..f173c9b69
--- /dev/null
+++ b/webui/src/components/_commons/PanelServiceDetails.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
TYPE
+
+ {{ data.type }}
+
+
+
+
PROVIDER
+
+
+
+
+
{{data.provider}}
+
+
+
+
+
+
+
+
STATUS
+
+
+
{{data.status | statusLabel}}
+
+
+
+
+
+
+
+
Main Service
+
+ {{ data.mirroring.service }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
NAME
+
+ {{ data.weighted.sticky.cookie.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/PanelTLS.vue b/webui/src/components/_commons/PanelTLS.vue
new file mode 100644
index 000000000..e79ffd52c
--- /dev/null
+++ b/webui/src/components/_commons/PanelTLS.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
OPTIONS
+
+ {{ data.options }}
+
+
+
+
+
+
+
+
+
+
+
CERTIFICATE RESOLVER
+
+ {{ data.certResolver }}
+
+
+
+
+
+
+
+
DOMAINS
+
+
+ {{ domain.main }}
+
+
+ {{ domain }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
There are no
TLS configured
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/PanelWeightedServices.vue b/webui/src/components/_commons/PanelWeightedServices.vue
new file mode 100644
index 000000000..fb9147913
--- /dev/null
+++ b/webui/src/components/_commons/PanelWeightedServices.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ service.name }}
+
+
+
+ {{ service.weight }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/TLSState.vue b/webui/src/components/_commons/TLSState.vue
new file mode 100644
index 000000000..7f5f76138
--- /dev/null
+++ b/webui/src/components/_commons/TLSState.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/ToolBar.vue b/webui/src/components/_commons/ToolBar.vue
new file mode 100644
index 000000000..c69f3465f
--- /dev/null
+++ b/webui/src/components/_commons/ToolBar.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/_commons/ToolBarTable.vue b/webui/src/components/_commons/ToolBarTable.vue
new file mode 100644
index 000000000..0d7bb4f16
--- /dev/null
+++ b/webui/src/components/_commons/ToolBarTable.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/components/dashboard/PanelChart.vue b/webui/src/components/dashboard/PanelChart.vue
index f0eb524db..7f72d71d6 100644
--- a/webui/src/components/dashboard/PanelChart.vue
+++ b/webui/src/components/dashboard/PanelChart.vue
@@ -5,6 +5,9 @@
+
+
+
@@ -104,7 +107,7 @@ export default {
} else {
result = num
}
- return isNaN(result) ? 0 : result
+ return isNaN(result) || result < 0 ? 0 : result
},
getWarnings (inPercent = false) {
const num = this.data.warnings
@@ -114,7 +117,7 @@ export default {
} else {
result = num
}
- return isNaN(result) ? 0 : result
+ return isNaN(result) || result < 0 ? 0 : result
},
getErrors (inPercent = false) {
const num = this.data.errors
@@ -124,7 +127,7 @@ export default {
} else {
result = num
}
- return isNaN(result) ? 0 : result
+ return isNaN(result) || result < 0 ? 0 : result
},
getData () {
return [this.getSuccess(), this.getWarnings(), this.getErrors()]
diff --git a/webui/src/components/dashboard/PanelEntry.vue b/webui/src/components/dashboard/PanelEntry.vue
index b4d6767fb..2ae06af45 100644
--- a/webui/src/components/dashboard/PanelEntry.vue
+++ b/webui/src/components/dashboard/PanelEntry.vue
@@ -1,9 +1,9 @@
-
+
@@ -16,10 +16,41 @@
-
diff --git a/webui/src/components/dashboard/PanelFeature.vue b/webui/src/components/dashboard/PanelFeature.vue
index 85d80c9e9..d9c3c488a 100644
--- a/webui/src/components/dashboard/PanelFeature.vue
+++ b/webui/src/components/dashboard/PanelFeature.vue
@@ -1,18 +1,15 @@
-
+
-
{{featureKey}}
+
{{featureKey}}
{{getVal}}
@@ -51,26 +48,37 @@ export default {
diff --git a/webui/src/components/tcp/ToolBar.vue b/webui/src/components/tcp/ToolBar.vue
deleted file mode 100644
index 275d671bd..000000000
--- a/webui/src/components/tcp/ToolBar.vue
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/webui/src/css/sass/_variables.scss b/webui/src/css/sass/_variables.scss
index a4c13ac51..1a25552f6 100644
--- a/webui/src/css/sass/_variables.scss
+++ b/webui/src/css/sass/_variables.scss
@@ -12,6 +12,10 @@ $app-text-caption-dark: rgba(255,255,255,0.7);
// Custom colors
$app-text-white: #ffffff;
$app-text-grey: #737373;
+$app-text-purple: #9d0fb0;
+$app-text-green: #24a1c1;
+$app-text-green-2: #06a21d;
+$app-text-marine: #06102a;
// Quasar
$primary: #06102a;
diff --git a/webui/src/css/sass/app.scss b/webui/src/css/sass/app.scss
index a6495a21c..002da20c5 100644
--- a/webui/src/css/sass/app.scss
+++ b/webui/src/css/sass/app.scss
@@ -39,6 +39,10 @@ body {
color: $app-text-grey;
}
+.bg-app-toggle {
+ background-color: rgba( $accent, .1 );
+}
+
// Helps
.xs-text-center {
@include respond-to(sm, max) {
@@ -60,6 +64,10 @@ body {
&-label {
font-size: inherit;
font-weight: inherit;
+ &-sub {
+ font-size: 16px;
+ font-weight: 600;
+ }
}
.q-icon + &-label {
margin-left: 8px;
@@ -107,3 +115,45 @@ body {
.q-card {
border-radius: 8px;
}
+
+// Chips
+.app-chip {
+ border-radius: 8px;
+ font-weight: 600;
+ font-size: 14px;
+ &-wrap {
+ height: 100%;
+ flex-wrap: wrap;
+ .q-chip__content{
+ white-space: normal;
+ }
+ }
+ &-accent, &-rule {
+ color: $accent;
+ background-color: rgba($accent, 0.1);
+ }
+ &-green, &-entry-points {
+ color: $app-text-green;
+ background-color: rgba($app-text-green, 0.1);
+ }
+ &-purple, &-name {
+ color: $app-text-purple;
+ background-color: rgba($app-text-purple, 0.1);
+ }
+ &-warning, &-service {
+ color: $warning;
+ background-color: rgba($warning, 0.1);
+ }
+ &-negative, &-error {
+ color: $negative;
+ background-color: rgba($negative, 0.1);
+ }
+ &-green-2, &-options {
+ color: $app-text-green-2;
+ background-color: rgba($app-text-green-2, 0.1);
+ }
+ &-marine, &-interval {
+ color: $app-text-marine;
+ background-color: rgba($app-text-grey, 0.1);
+ }
+}
diff --git a/webui/src/pages/_commons/MiddlewareDetail.vue b/webui/src/pages/_commons/MiddlewareDetail.vue
new file mode 100644
index 000000000..2cc7876cf
--- /dev/null
+++ b/webui/src/pages/_commons/MiddlewareDetail.vue
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
{{ middlewareByName.item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/pages/_commons/RouterDetail.vue b/webui/src/pages/_commons/RouterDetail.vue
new file mode 100644
index 000000000..0d3097156
--- /dev/null
+++ b/webui/src/pages/_commons/RouterDetail.vue
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/pages/_commons/ServiceDetail.vue b/webui/src/pages/_commons/ServiceDetail.vue
new file mode 100644
index 000000000..d4decb2fc
--- /dev/null
+++ b/webui/src/pages/_commons/ServiceDetail.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
{{ serviceByName.item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/src/pages/http/Middlewares.vue b/webui/src/pages/http/Middlewares.vue
index f8438e980..1415ba962 100644
--- a/webui/src/pages/http/Middlewares.vue
+++ b/webui/src/pages/http/Middlewares.vue
@@ -1,14 +1,108 @@
-
- HTTP Middlewares
-
+
+
+
+
+
-
-
+
+
diff --git a/webui/src/pages/http/Routers.vue b/webui/src/pages/http/Routers.vue
index 7995b0c1a..08330bd6d 100644
--- a/webui/src/pages/http/Routers.vue
+++ b/webui/src/pages/http/Routers.vue
@@ -1,14 +1,108 @@
-
- HTTP Routers
-
+
+
+
+
+
-
-
+
+
diff --git a/webui/src/pages/http/Services.vue b/webui/src/pages/http/Services.vue
index fbedfcb8b..c41ebb8a1 100644
--- a/webui/src/pages/http/Services.vue
+++ b/webui/src/pages/http/Services.vue
@@ -1,14 +1,108 @@
-
- HTTP Services
-
+
+
+
+
+
-
-
+
+
diff --git a/webui/src/pages/tcp/Routers.vue b/webui/src/pages/tcp/Routers.vue
index 17331131d..8e120b143 100644
--- a/webui/src/pages/tcp/Routers.vue
+++ b/webui/src/pages/tcp/Routers.vue
@@ -1,14 +1,108 @@
-
- TCP Routers
-
+
+
+
+
+
-
-
+
+
diff --git a/webui/src/pages/tcp/Services.vue b/webui/src/pages/tcp/Services.vue
index 2cfb7311e..698ef19b4 100644
--- a/webui/src/pages/tcp/Services.vue
+++ b/webui/src/pages/tcp/Services.vue
@@ -1,14 +1,108 @@
-
- TCP Services
-
+
+
+
+
+
-
-
+
+
diff --git a/webui/src/router/routes.js b/webui/src/router/routes.js
index 1e46a65c0..28ac34a0b 100644
--- a/webui/src/router/routes.js
+++ b/webui/src/router/routes.js
@@ -14,6 +14,150 @@ const routes = [
}
}
]
+ },
+ {
+ path: '/http',
+ redirect: '/http/routers',
+ component: LayoutDefault,
+ children: [
+ {
+ path: 'routers',
+ name: 'httpRouters',
+ components: {
+ default: () => import('pages/http/Routers.vue'),
+ NavBar: () => import('components/_commons/ToolBar.vue')
+ },
+ props: { default: true, NavBar: true },
+ meta: {
+ protocol: 'http',
+ title: 'HTTP Routers'
+ }
+ },
+ {
+ path: 'routers/:name',
+ name: 'httpRouterDetail',
+ components: {
+ default: () => import('pages/_commons/RouterDetail.vue'),
+ NavBar: () => import('components/_commons/ToolBar.vue')
+ },
+ props: { default: true, NavBar: true },
+ meta: {
+ protocol: 'http',
+ title: 'HTTP Router Detail'
+ }
+ },
+ {
+ path: 'services',
+ name: 'httpServices',
+ components: {
+ default: () => import('pages/http/Services.vue'),
+ NavBar: () => import('components/_commons/ToolBar.vue')
+ },
+ props: { default: true, NavBar: true },
+ meta: {
+ protocol: 'http',
+ title: 'HTTP Services'
+ }
+ },
+ {
+ path: 'services/:name',
+ name: 'httpServiceDetail',
+ components: {
+ default: () => import('pages/_commons/ServiceDetail.vue'),
+ NavBar: () => import('components/_commons/ToolBar.vue')
+ },
+ props: { default: true, NavBar: true },
+ meta: {
+ protocol: 'http',
+ title: 'HTTP Service Detail'
+ }
+ },
+ {
+ path: 'middlewares',
+ name: 'httpMiddlewares',
+ components: {
+ default: () => import('pages/http/Middlewares.vue'),
+ NavBar: () => import('components/_commons/ToolBar.vue')
+ },
+ props: { default: true, NavBar: true },
+ meta: {
+ protocol: 'http',
+ title: 'HTTP Middlewares'
+ }
+ },
+ {
+ path: 'middlewares/:name',
+ name: 'httpMiddlewareDetail',
+ components: {
+ default: () => import('pages/_commons/MiddlewareDetail.vue'),
+ NavBar: () => import('components/_commons/ToolBar.vue')
+ },
+ props: { default: true, NavBar: true },
+ meta: {
+ protocol: 'http',
+ title: 'HTTP Middleware Detail'
+ }
+ }
+ ]
+ },
+ {
+ path: '/tcp',
+ redirect: '/tcp/routers',
+ component: LayoutDefault,
+ children: [
+ {
+ path: 'routers',
+ name: 'tcpRouters',
+ components: {
+ default: () => import('pages/tcp/Routers.vue'),
+ NavBar: () => import('components/_commons/ToolBar.vue')
+ },
+ props: { default: true, NavBar: true },
+ meta: {
+ protocol: 'tcp',
+ title: 'TCP Routers'
+ }
+ },
+ {
+ path: 'routers/:name',
+ name: 'tcpRouterDetail',
+ components: {
+ default: () => import('pages/_commons/RouterDetail.vue'),
+ NavBar: () => import('components/_commons/ToolBar.vue')
+ },
+ props: { default: true, NavBar: true },
+ meta: {
+ protocol: 'tcp',
+ title: 'TCP Router Detail'
+ }
+ },
+ {
+ path: 'services',
+ name: 'tcpServices',
+ components: {
+ default: () => import('pages/tcp/Services.vue'),
+ NavBar: () => import('components/_commons/ToolBar.vue')
+ },
+ props: { default: true, NavBar: true },
+ meta: {
+ protocol: 'tcp',
+ title: 'TCP Services'
+ }
+ },
+ {
+ path: 'services/:name',
+ name: 'tcpServiceDetail',
+ components: {
+ default: () => import('pages/_commons/ServiceDetail.vue'),
+ NavBar: () => import('components/_commons/ToolBar.vue')
+ },
+ props: { default: true, NavBar: true },
+ meta: {
+ protocol: 'tcp',
+ title: 'TCP Service Detail'
+ }
+ }
+ ]
}
]
diff --git a/webui/src/statics/app-logo-128x128.png b/webui/src/statics/app-logo-128x128.png
old mode 100644
new mode 100755
index 0a3012a9e..af9348b10
Binary files a/webui/src/statics/app-logo-128x128.png and b/webui/src/statics/app-logo-128x128.png differ
diff --git a/webui/src/statics/icons/apple-icon-120x120.png b/webui/src/statics/icons/apple-icon-120x120.png
old mode 100644
new mode 100755
index 387499a81..2f400b009
Binary files a/webui/src/statics/icons/apple-icon-120x120.png and b/webui/src/statics/icons/apple-icon-120x120.png differ
diff --git a/webui/src/statics/icons/apple-icon-152x152.png b/webui/src/statics/icons/apple-icon-152x152.png
old mode 100644
new mode 100755
index 5b76f91cd..a2e9cdff8
Binary files a/webui/src/statics/icons/apple-icon-152x152.png and b/webui/src/statics/icons/apple-icon-152x152.png differ
diff --git a/webui/src/statics/icons/apple-icon-167x167.png b/webui/src/statics/icons/apple-icon-167x167.png
old mode 100644
new mode 100755
index 0d743a659..c24bd69a9
Binary files a/webui/src/statics/icons/apple-icon-167x167.png and b/webui/src/statics/icons/apple-icon-167x167.png differ
diff --git a/webui/src/statics/icons/apple-icon-180x180.png b/webui/src/statics/icons/apple-icon-180x180.png
old mode 100644
new mode 100755
index f91040da4..e3c67b1ec
Binary files a/webui/src/statics/icons/apple-icon-180x180.png and b/webui/src/statics/icons/apple-icon-180x180.png differ
diff --git a/webui/src/statics/icons/favicon-16x16.png b/webui/src/statics/icons/favicon-16x16.png
old mode 100644
new mode 100755
index 55e18225e..36020af3e
Binary files a/webui/src/statics/icons/favicon-16x16.png and b/webui/src/statics/icons/favicon-16x16.png differ
diff --git a/webui/src/statics/icons/favicon-32x32.png b/webui/src/statics/icons/favicon-32x32.png
old mode 100644
new mode 100755
index 886724313..4c42d44ef
Binary files a/webui/src/statics/icons/favicon-32x32.png and b/webui/src/statics/icons/favicon-32x32.png differ
diff --git a/webui/src/statics/icons/favicon-96x96.png b/webui/src/statics/icons/favicon-96x96.png
old mode 100644
new mode 100755
index c0c651b2e..003f02915
Binary files a/webui/src/statics/icons/favicon-96x96.png and b/webui/src/statics/icons/favicon-96x96.png differ
diff --git a/webui/src/statics/icons/favicon.ico b/webui/src/statics/icons/favicon.ico
index 5c1b67817..b5b93f32d 100644
Binary files a/webui/src/statics/icons/favicon.ico and b/webui/src/statics/icons/favicon.ico differ
diff --git a/webui/src/statics/icons/icon-128x128.png b/webui/src/statics/icons/icon-128x128.png
old mode 100644
new mode 100755
index 0a3012a9e..af9348b10
Binary files a/webui/src/statics/icons/icon-128x128.png and b/webui/src/statics/icons/icon-128x128.png differ
diff --git a/webui/src/statics/icons/icon-192x192.png b/webui/src/statics/icons/icon-192x192.png
old mode 100644
new mode 100755
index 144d47494..8a4decd77
Binary files a/webui/src/statics/icons/icon-192x192.png and b/webui/src/statics/icons/icon-192x192.png differ
diff --git a/webui/src/statics/icons/icon-256x256.png b/webui/src/statics/icons/icon-256x256.png
old mode 100644
new mode 100755
index 9ab309bbc..25ef0429d
Binary files a/webui/src/statics/icons/icon-256x256.png and b/webui/src/statics/icons/icon-256x256.png differ
diff --git a/webui/src/statics/icons/icon-384x384.png b/webui/src/statics/icons/icon-384x384.png
old mode 100644
new mode 100755
index 8bb494e1a..6bfa9990f
Binary files a/webui/src/statics/icons/icon-384x384.png and b/webui/src/statics/icons/icon-384x384.png differ
diff --git a/webui/src/statics/icons/icon-512x512.png b/webui/src/statics/icons/icon-512x512.png
old mode 100644
new mode 100755
index 9b9ff56cb..be87a7a6b
Binary files a/webui/src/statics/icons/icon-512x512.png and b/webui/src/statics/icons/icon-512x512.png differ
diff --git a/webui/src/statics/icons/ms-icon-144x144.png b/webui/src/statics/icons/ms-icon-144x144.png
old mode 100644
new mode 100755
index 29fd72a34..654ac3223
Binary files a/webui/src/statics/icons/ms-icon-144x144.png and b/webui/src/statics/icons/ms-icon-144x144.png differ
diff --git a/webui/src/statics/icons/safari-pinned-tab.svg b/webui/src/statics/icons/safari-pinned-tab.svg
old mode 100644
new mode 100755
index 1473927c3..8bd46a154
--- a/webui/src/statics/icons/safari-pinned-tab.svg
+++ b/webui/src/statics/icons/safari-pinned-tab.svg
@@ -1 +1,3 @@
-
\ No newline at end of file
+
diff --git a/webui/src/statics/providers/kubernetescrd.svg b/webui/src/statics/providers/kubernetescrd.svg
new file mode 100644
index 000000000..b6670fe5d
--- /dev/null
+++ b/webui/src/statics/providers/kubernetescrd.svg
@@ -0,0 +1,6 @@
+
diff --git a/webui/src/statics/providers/kubernetesingress.svg b/webui/src/statics/providers/kubernetesingress.svg
new file mode 100644
index 000000000..b6670fe5d
--- /dev/null
+++ b/webui/src/statics/providers/kubernetesingress.svg
@@ -0,0 +1,6 @@
+
diff --git a/webui/src/store/entrypoints/actions.js b/webui/src/store/entrypoints/actions.js
index 79b009bf3..5b67b8ae1 100644
--- a/webui/src/store/entrypoints/actions.js
+++ b/webui/src/store/entrypoints/actions.js
@@ -1,8 +1,8 @@
-import entrypointsService from '../../_services/EntrypointsService'
+import EntrypointsService from '../../_services/EntrypointsService'
export function getAll ({ commit }) {
commit('getAllRequest')
- return entrypointsService.getAll()
+ return EntrypointsService.getAll()
.then(body => {
commit('getAllSuccess', body)
return body
@@ -12,3 +12,16 @@ export function getAll ({ commit }) {
return Promise.reject(error)
})
}
+
+export function getByName ({ commit }, name) {
+ commit('getByNameRequest')
+ return EntrypointsService.getByName(name)
+ .then(body => {
+ commit('getByNameSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getByNameFailure', error)
+ return Promise.reject(error)
+ })
+}
diff --git a/webui/src/store/entrypoints/getters.js b/webui/src/store/entrypoints/getters.js
index b906a35e8..52431bc75 100644
--- a/webui/src/store/entrypoints/getters.js
+++ b/webui/src/store/entrypoints/getters.js
@@ -4,3 +4,10 @@
export function all (state) {
return state.all
}
+
+// ----------------------------
+// byName
+// ----------------------------
+export function byName (state) {
+ return state.byName
+}
diff --git a/webui/src/store/entrypoints/mutations.js b/webui/src/store/entrypoints/mutations.js
index 5d6d48329..5a80fb35e 100644
--- a/webui/src/store/entrypoints/mutations.js
+++ b/webui/src/store/entrypoints/mutations.js
@@ -16,3 +16,22 @@ export function getAllFailure (state, error) {
export function getAllClear (state) {
state.all = {}
}
+
+// ----------------------------
+// Get By Name
+// ----------------------------
+export function getByNameRequest (state) {
+ state.byName.loading = true
+}
+
+export function getByNameSuccess (state, body) {
+ state.byName = { item: body, loading: false }
+}
+
+export function getByNameFailure (state, error) {
+ state.byName = { error }
+}
+
+export function getByNameClear (state) {
+ state.byName = {}
+}
diff --git a/webui/src/store/http/actions.js b/webui/src/store/http/actions.js
new file mode 100644
index 000000000..e2deed265
--- /dev/null
+++ b/webui/src/store/http/actions.js
@@ -0,0 +1,79 @@
+import HttpService from '../../_services/HttpService'
+
+export function getAllRouters ({ commit }, params) {
+ commit('getAllRoutersRequest')
+ return HttpService.getAllRouters(params)
+ .then(body => {
+ commit('getAllRoutersSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getAllRoutersFailure', error)
+ return Promise.reject(error)
+ })
+}
+
+export function getRouterByName ({ commit }, name) {
+ commit('getRouterByNameRequest')
+ return HttpService.getRouterByName(name)
+ .then(body => {
+ commit('getRouterByNameSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getRouterByNameFailure', error)
+ return Promise.reject(error)
+ })
+}
+
+export function getAllServices ({ commit }, params) {
+ commit('getAllServicesRequest')
+ return HttpService.getAllServices(params)
+ .then(body => {
+ commit('getAllServicesSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getAllServicesFailure', error)
+ return Promise.reject(error)
+ })
+}
+
+export function getServiceByName ({ commit }, name) {
+ commit('getServiceByNameRequest')
+ return HttpService.getServiceByName(name)
+ .then(body => {
+ commit('getServiceByNameSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getServiceByNameFailure', error)
+ return Promise.reject(error)
+ })
+}
+
+export function getAllMiddlewares ({ commit }, params) {
+ commit('getAllMiddlewaresRequest')
+ return HttpService.getAllMiddlewares(params)
+ .then(body => {
+ commit('getAllMiddlewaresSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getAllMiddlewaresFailure', error)
+ return Promise.reject(error)
+ })
+}
+
+export function getMiddlewareByName ({ commit }, name) {
+ commit('getMiddlewareByNameRequest')
+ return HttpService.getMiddlewareByName(name)
+ .then(body => {
+ commit('getMiddlewareByNameSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getMiddlewareByNameFailure', error)
+ return Promise.reject(error)
+ })
+}
diff --git a/webui/src/store/http/getters.js b/webui/src/store/http/getters.js
new file mode 100644
index 000000000..2f822b452
--- /dev/null
+++ b/webui/src/store/http/getters.js
@@ -0,0 +1,41 @@
+// ----------------------------
+// all Routers
+// ----------------------------
+export function allRouters (state) {
+ return state.allRouters
+}
+
+// ----------------------------
+// Router by Name
+// ----------------------------
+export function routerByName (state) {
+ return state.routerByName
+}
+
+// ----------------------------
+// all Services
+// ----------------------------
+export function allServices (state) {
+ return state.allServices
+}
+
+// ----------------------------
+// Service by Name
+// ----------------------------
+export function serviceByName (state) {
+ return state.serviceByName
+}
+
+// ----------------------------
+// all Middlewares
+// ----------------------------
+export function allMiddlewares (state) {
+ return state.allMiddlewares
+}
+
+// ----------------------------
+// Middleware by Name
+// ----------------------------
+export function middlewareByName (state) {
+ return state.middlewareByName
+}
diff --git a/webui/src/store/http/index.js b/webui/src/store/http/index.js
new file mode 100644
index 000000000..babab8ec5
--- /dev/null
+++ b/webui/src/store/http/index.js
@@ -0,0 +1,12 @@
+import state from './state'
+import * as getters from './getters'
+import * as mutations from './mutations'
+import * as actions from './actions'
+
+export default {
+ namespaced: true,
+ getters,
+ mutations,
+ actions,
+ state
+}
diff --git a/webui/src/store/http/mutations.js b/webui/src/store/http/mutations.js
new file mode 100644
index 000000000..064b753c2
--- /dev/null
+++ b/webui/src/store/http/mutations.js
@@ -0,0 +1,113 @@
+// ----------------------------
+// Get All Routers
+// ----------------------------
+export function getAllRoutersRequest (state) {
+ state.allRouters.loading = true
+}
+
+export function getAllRoutersSuccess (state, body) {
+ state.allRouters = { items: body.data, total: body.total, loading: false }
+}
+
+export function getAllRoutersFailure (state, error) {
+ state.allRouters = { error }
+}
+
+export function getAllRoutersClear (state) {
+ state.allRouters = {}
+}
+
+// ----------------------------
+// Get Router By Name
+// ----------------------------
+export function getRouterByNameRequest (state) {
+ state.routerByName.loading = true
+}
+
+export function getRouterByNameSuccess (state, body) {
+ state.routerByName = { item: body, loading: false }
+}
+
+export function getRouterByNameFailure (state, error) {
+ state.routerByName = { error }
+}
+
+export function getRouterByNameClear (state) {
+ state.routerByName = {}
+}
+
+// ----------------------------
+// Get All Services
+// ----------------------------
+export function getAllServicesRequest (state) {
+ state.allServices.loading = true
+}
+
+export function getAllServicesSuccess (state, body) {
+ state.allServices = { items: body.data, total: body.total, loading: false }
+}
+
+export function getAllServicesFailure (state, error) {
+ state.allServices = { error }
+}
+
+export function getAllServicesClear (state) {
+ state.allServices = {}
+}
+
+// ----------------------------
+// Get Service By Name
+// ----------------------------
+export function getServiceByNameRequest (state) {
+ state.serviceByName.loading = true
+}
+
+export function getServiceByNameSuccess (state, body) {
+ state.serviceByName = { item: body, loading: false }
+}
+
+export function getServiceByNameFailure (state, error) {
+ state.serviceByName = { error }
+}
+
+export function getServiceByNameClear (state) {
+ state.serviceByName = {}
+}
+
+// ----------------------------
+// Get All Middlewares
+// ----------------------------
+export function getAllMiddlewaresRequest (state) {
+ state.allMiddlewares.loading = true
+}
+
+export function getAllMiddlewaresSuccess (state, body) {
+ state.allMiddlewares = { items: body.data, total: body.total, loading: false }
+}
+
+export function getAllMiddlewaresFailure (state, error) {
+ state.allMiddlewares = { error }
+}
+
+export function getAllMiddlewaresClear (state) {
+ state.allMiddlewares = {}
+}
+
+// ----------------------------
+// Get Middleware By Name
+// ----------------------------
+export function getMiddlewareByNameRequest (state) {
+ state.middlewareByName.loading = true
+}
+
+export function getMiddlewareByNameSuccess (state, body) {
+ state.middlewareByName = { item: body, loading: false }
+}
+
+export function getMiddlewareByNameFailure (state, error) {
+ state.middlewareByName = { error }
+}
+
+export function getMiddlewareByNameClear (state) {
+ state.middlewareByName = {}
+}
diff --git a/webui/src/store/http/state.js b/webui/src/store/http/state.js
new file mode 100644
index 000000000..0557a4fdd
--- /dev/null
+++ b/webui/src/store/http/state.js
@@ -0,0 +1,8 @@
+export default {
+ allRouters: {},
+ routerByName: {},
+ allServices: {},
+ serviceByName: {},
+ allMiddlewares: {},
+ middlewareByName: {}
+}
diff --git a/webui/src/store/index.js b/webui/src/store/index.js
index 5d5fb3278..190ad6594 100644
--- a/webui/src/store/index.js
+++ b/webui/src/store/index.js
@@ -3,6 +3,8 @@ import Vuex from 'vuex'
import core from './core'
import entrypoints from './entrypoints'
+import http from './http'
+import tcp from './tcp'
Vue.use(Vuex)
@@ -15,7 +17,9 @@ export default function (/* { ssrContext } */) {
const Store = new Vuex.Store({
modules: {
core,
- entrypoints
+ entrypoints,
+ http,
+ tcp
},
// enable strict mode (adds overhead!)
diff --git a/webui/src/store/tcp/actions.js b/webui/src/store/tcp/actions.js
new file mode 100644
index 000000000..196723fed
--- /dev/null
+++ b/webui/src/store/tcp/actions.js
@@ -0,0 +1,53 @@
+import TcpService from '../../_services/TcpService'
+
+export function getAllRouters ({ commit }, params) {
+ commit('getAllRoutersRequest')
+ return TcpService.getAllRouters(params)
+ .then(body => {
+ commit('getAllRoutersSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getAllRoutersFailure', error)
+ return Promise.reject(error)
+ })
+}
+
+export function getRouterByName ({ commit }, name) {
+ commit('getRouterByNameRequest')
+ return TcpService.getRouterByName(name)
+ .then(body => {
+ commit('getRouterByNameSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getRouterByNameFailure', error)
+ return Promise.reject(error)
+ })
+}
+
+export function getAllServices ({ commit }, params) {
+ commit('getAllServicesRequest')
+ return TcpService.getAllServices(params)
+ .then(body => {
+ commit('getAllServicesSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getAllServicesFailure', error)
+ return Promise.reject(error)
+ })
+}
+
+export function getServiceByName ({ commit }, name) {
+ commit('getServiceByNameRequest')
+ return TcpService.getServiceByName(name)
+ .then(body => {
+ commit('getServiceByNameSuccess', body)
+ return body
+ })
+ .catch(error => {
+ commit('getServiceByNameFailure', error)
+ return Promise.reject(error)
+ })
+}
diff --git a/webui/src/store/tcp/getters.js b/webui/src/store/tcp/getters.js
new file mode 100644
index 000000000..2b9611e94
--- /dev/null
+++ b/webui/src/store/tcp/getters.js
@@ -0,0 +1,27 @@
+// ----------------------------
+// all Routers
+// ----------------------------
+export function allRouters (state) {
+ return state.allRouters
+}
+
+// ----------------------------
+// Router by Name
+// ----------------------------
+export function routerByName (state) {
+ return state.routerByName
+}
+
+// ----------------------------
+// all Services
+// ----------------------------
+export function allServices (state) {
+ return state.allServices
+}
+
+// ----------------------------
+// Service by Name
+// ----------------------------
+export function serviceByName (state) {
+ return state.serviceByName
+}
diff --git a/webui/src/store/tcp/index.js b/webui/src/store/tcp/index.js
new file mode 100644
index 000000000..babab8ec5
--- /dev/null
+++ b/webui/src/store/tcp/index.js
@@ -0,0 +1,12 @@
+import state from './state'
+import * as getters from './getters'
+import * as mutations from './mutations'
+import * as actions from './actions'
+
+export default {
+ namespaced: true,
+ getters,
+ mutations,
+ actions,
+ state
+}
diff --git a/webui/src/store/tcp/mutations.js b/webui/src/store/tcp/mutations.js
new file mode 100644
index 000000000..bb6042f90
--- /dev/null
+++ b/webui/src/store/tcp/mutations.js
@@ -0,0 +1,75 @@
+// ----------------------------
+// Get All Routers
+// ----------------------------
+export function getAllRoutersRequest (state) {
+ state.allRouters.loading = true
+}
+
+export function getAllRoutersSuccess (state, body) {
+ state.allRouters = { items: body.data, total: body.total, loading: false }
+}
+
+export function getAllRoutersFailure (state, error) {
+ state.allRouters = { error }
+}
+
+export function getAllRoutersClear (state) {
+ state.allRouters = {}
+}
+
+// ----------------------------
+// Get Router By Name
+// ----------------------------
+export function getRouterByNameRequest (state) {
+ state.routerByName.loading = true
+}
+
+export function getRouterByNameSuccess (state, body) {
+ state.routerByName = { item: body, loading: false }
+}
+
+export function getRouterByNameFailure (state, error) {
+ state.routerByName = { error }
+}
+
+export function getRouterByNameClear (state) {
+ state.routerByName = {}
+}
+
+// ----------------------------
+// Get All Services
+// ----------------------------
+export function getAllServicesRequest (state) {
+ state.allServices.loading = true
+}
+
+export function getAllServicesSuccess (state, body) {
+ state.allServices = { items: body.data, total: body.total, loading: false }
+}
+
+export function getAllServicesFailure (state, error) {
+ state.allServices = { error }
+}
+
+export function getAllServicesClear (state) {
+ state.allServices = {}
+}
+
+// ----------------------------
+// Get Service By Name
+// ----------------------------
+export function getServiceByNameRequest (state) {
+ state.serviceByName.loading = true
+}
+
+export function getServiceByNameSuccess (state, body) {
+ state.serviceByName = { item: body, loading: false }
+}
+
+export function getServiceByNameFailure (state, error) {
+ state.serviceByName = { error }
+}
+
+export function getServiceByNameClear (state) {
+ state.serviceByName = {}
+}
diff --git a/webui/src/store/tcp/state.js b/webui/src/store/tcp/state.js
new file mode 100644
index 000000000..0eb429a34
--- /dev/null
+++ b/webui/src/store/tcp/state.js
@@ -0,0 +1,6 @@
+export default {
+ allRouters: {},
+ routerByName: {},
+ allServices: {},
+ serviceByName: {}
+}