diff --git a/ui/frontend/package-lock.json b/ui/frontend/package-lock.json index 7ddb7429..5d7de718 100644 --- a/ui/frontend/package-lock.json +++ b/ui/frontend/package-lock.json @@ -17,8 +17,10 @@ "vue": "^2.6.11", "vue-codemirror": "^4.0.6", "vue-json-pretty": "^1.8.3", + "vue-json-viewer": "2", "vue-router": "^3.5.1", "vue-tmx": "^0.1.12", + "vue-tour": "^2.0.0", "vuex": "^3.6.2" }, "devDependencies": { @@ -2019,6 +2021,15 @@ "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", "dev": true }, + "node_modules/@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -4019,6 +4030,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "node_modules/clipboardy": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", @@ -4803,6 +4824,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -6217,6 +6243,14 @@ "node": ">= 4" } }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "dependencies": { + "delegate": "^3.1.2" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -6292,8 +6326,7 @@ "node_modules/hash-sum": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "dev": true + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" }, "node_modules/he": { "version": "1.2.0", @@ -6955,6 +6988,11 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jump.js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jump.js/-/jump.js-1.0.2.tgz", + "integrity": "sha512-oUkJJ/Y4ATU5qjkXBntCZSKctbSyS3ewe2jrLaUu/cc9jsQiAn0fnTUxQnZz3mJdDdem1Q279zrD6h3n+Cgxtg==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -9368,6 +9406,11 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -10202,6 +10245,11 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -10548,6 +10596,17 @@ "npm": ">= 5.0.0" } }, + "node_modules/vue-json-viewer": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/vue-json-viewer/-/vue-json-viewer-2.2.22.tgz", + "integrity": "sha512-3oPH5BxoUWva/qp7wNJj+15FBXyi9Yu5VDW4mCWivjHR1pUpMv34fjqqxML7jh2uOqm1S/3Xks5nQ5JjC5+OWw==", + "dependencies": { + "clipboard": "^2.0.4" + }, + "peerDependencies": { + "vue": "^2.6.9" + } + }, "node_modules/vue-limit": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/vue-limit/-/vue-limit-0.0.3.tgz", @@ -10721,6 +10780,17 @@ "vue-transform": "0.0.9" } }, + "node_modules/vue-tour": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vue-tour/-/vue-tour-2.0.0.tgz", + "integrity": "sha512-vhKzqdhunQ3EoO1733UxhOB389u3EKv2X8JqYhX4tIq4ilqlZtnY3azPFBYPFmnAqHn5RyZBrP2CpqSaxTs8og==", + "dependencies": { + "@popperjs/core": "^2.9.1", + "hash-sum": "^2.0.0", + "jump.js": "^1.0.2", + "vue": "^2.6.12" + } + }, "node_modules/vue-transform": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/vue-transform/-/vue-transform-0.0.9.tgz", @@ -12910,6 +12980,11 @@ "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", "dev": true }, + "@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" + }, "@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -14475,6 +14550,16 @@ "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true }, + "clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "clipboardy": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", @@ -15044,6 +15129,11 @@ "object-keys": "^1.1.1" } }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -16115,6 +16205,14 @@ } } }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "requires": { + "delegate": "^3.1.2" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -16169,8 +16267,7 @@ "hash-sum": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "dev": true + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" }, "he": { "version": "1.2.0", @@ -16655,6 +16752,11 @@ "universalify": "^2.0.0" } }, + "jump.js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jump.js/-/jump.js-1.0.2.tgz", + "integrity": "sha512-oUkJJ/Y4ATU5qjkXBntCZSKctbSyS3ewe2jrLaUu/cc9jsQiAn0fnTUxQnZz3mJdDdem1Q279zrD6h3n+Cgxtg==" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -18403,6 +18505,11 @@ "ajv-keywords": "^3.5.2" } }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -19058,6 +19165,11 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -19312,6 +19424,14 @@ "resolved": "https://registry.npmjs.org/vue-json-pretty/-/vue-json-pretty-1.8.3.tgz", "integrity": "sha512-rpsop8LMy6EybkjmlT8a2fB2mHe0EMvxoCuw6lXcNBDsVkRuD4+eDwzqjshfe5qEki8EVLqr1o6n+lSLkR/tgQ==" }, + "vue-json-viewer": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/vue-json-viewer/-/vue-json-viewer-2.2.22.tgz", + "integrity": "sha512-3oPH5BxoUWva/qp7wNJj+15FBXyi9Yu5VDW4mCWivjHR1pUpMv34fjqqxML7jh2uOqm1S/3Xks5nQ5JjC5+OWw==", + "requires": { + "clipboard": "^2.0.4" + } + }, "vue-limit": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/vue-limit/-/vue-limit-0.0.3.tgz", @@ -19462,6 +19582,17 @@ "vue-transform": "0.0.9" } }, + "vue-tour": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vue-tour/-/vue-tour-2.0.0.tgz", + "integrity": "sha512-vhKzqdhunQ3EoO1733UxhOB389u3EKv2X8JqYhX4tIq4ilqlZtnY3azPFBYPFmnAqHn5RyZBrP2CpqSaxTs8og==", + "requires": { + "@popperjs/core": "^2.9.1", + "hash-sum": "^2.0.0", + "jump.js": "^1.0.2", + "vue": "^2.6.12" + } + }, "vue-transform": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/vue-transform/-/vue-transform-0.0.9.tgz", diff --git a/ui/frontend/package.json b/ui/frontend/package.json index 9bb966f1..c4387d29 100644 --- a/ui/frontend/package.json +++ b/ui/frontend/package.json @@ -20,6 +20,7 @@ "vue-json-viewer": "2", "vue-router": "^3.5.1", "vue-tmx": "^0.1.12", + "vue-tour": "^2.0.0", "vuex": "^3.6.2" }, "devDependencies": { diff --git a/ui/frontend/src/App.vue b/ui/frontend/src/App.vue index 4e783eee..57bc6aa2 100644 --- a/ui/frontend/src/App.vue +++ b/ui/frontend/src/App.vue @@ -5,6 +5,10 @@ Postee +
+ +
+
@@ -14,6 +18,7 @@ active-class="active" :to="{ name: 'routes' }" class="nav-link" + id="routes" >Routes @@ -46,6 +51,7 @@ active-class="active" :to="{ name: 'events' }" class="nav-link" + id="events" >Events @@ -86,6 +92,71 @@ export default { }, data() { return { + tourCallbacks: { + onStop: this.stopTour, + }, + steps: [ + { + target: '#routes', + content: "Routes are scenarios that can occur based on input events", + params: { + enableScrolling: false, + }, + }, + { + target: "#add-route", + content: "Let's begin by adding a new route", + params: { + enableScrolling: false, + }, + }, + { + target: "#name", + content: "Start by giving it a name", + params: { + enableScrolling: false, + placement: 'left', + } + }, + { + target: "#select-input-policies", + content: "Policies define when a route will be triggered", + params: { + enableScrolling: false, + placement: 'left', + } + }, + { + target: "#actions", + content: "When a policy is triggered, Actions are taken", + params: { + enableScrolling: false, + placement: 'left', + } + }, + { + target: "#submit", + content: "Go ahead and save this route", + params: { + enableScrolling: false, + }, + }, + { + target: "#events", + content: "Let's check some incoming events", + params: { + placement: "right", + } + }, + { + target: "#event-list", + content: "Expand to see details" + }, + { + target: "", + content: `You did it! Browse full docs at: Postee Docs` + } + ] }; }, computed: { @@ -106,7 +177,20 @@ export default { this.$store.dispatch("load"); this.$store.dispatch("stats/load"); this.$store.dispatch("events/load"); + this.startTour(); }, + startTour(){ + if (!localStorage.getItem('disable-tour')){ + this.$tours['myTour'].start() + }else { + this.$tours['myTour'].finish() + } + }, + stopTour(){ + if (!localStorage.getItem('disable-tour')) { + localStorage.setItem('disable-tour', 'true'); + } + } }, mounted() { if (this.$store.state.account.authenticated) { diff --git a/ui/frontend/src/components/EventDetails.vue b/ui/frontend/src/components/EventDetails.vue index 8f4173d9..94a4f674 100644 --- a/ui/frontend/src/components/EventDetails.vue +++ b/ui/frontend/src/components/EventDetails.vue @@ -1,5 +1,5 @@