From 675704ca91961bcf6343c0d4d21ea8a6334a7b02 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 8 Oct 2022 00:26:46 +1300 Subject: [PATCH 1/5] Update screenshot path --- README.md | 2 +- screenshot.png => docs/screenshot.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename screenshot.png => docs/screenshot.png (100%) diff --git a/README.md b/README.md index 43b9d05..f03a1ec 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ It acts as both an SMTP server, and provides a web interface to view all capture Mailpit is inspired by [MailHog](#why-rewrite-mailhog), but much, much faster. -![Mailpit](https://raw.githubusercontent.com/axllent/mailpit/develop/screenshot.png) +![Mailpit](https://raw.githubusercontent.com/axllent/mailpit/develop/docs/screenshot.png) ## Features diff --git a/screenshot.png b/docs/screenshot.png similarity index 100% rename from screenshot.png rename to docs/screenshot.png From a31a7c3d2cd3fa2fb1491e5f62732ba087d5592a Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 8 Oct 2022 23:23:30 +1300 Subject: [PATCH 2/5] UI: Add about app modal with version update notification --- .github/workflows/release-build.yml | 2 +- Dockerfile | 2 +- cmd/version.go | 20 ++------ config/config.go | 9 ++++ server/apiv1/api.go | 37 -------------- server/apiv1/info.go | 52 +++++++++++++++++++ server/server.go | 1 + server/ui-src/App.vue | 78 +++++++++++++++++++++++++---- server/ui-src/mixins.js | 10 ++-- storage/database.go | 2 + 10 files changed, 146 insertions(+), 67 deletions(-) create mode 100644 server/apiv1/info.go diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 1a81e21..85b22ba 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -42,4 +42,4 @@ jobs: asset_name: mailpit-${{ matrix.goos }}-${{ matrix.goarch }} extra_files: LICENSE README.md md5sum: false - ldflags: -w -X "github.com/axllent/mailpit/cmd.Version=${{ steps.tag.outputs.tag }}" + ldflags: -w -X "github.com/axllent/mailpit/config.Version=${{ steps.tag.outputs.tag }}" diff --git a/Dockerfile b/Dockerfile index e6b0126..15f3a64 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ WORKDIR /app RUN apk add --no-cache git npm && \ npm install && npm run package && \ -CGO_ENABLED=0 go build -ldflags "-s -w -X github.com/axllent/mailpit/cmd.Version=${VERSION}" -o /mailpit +CGO_ENABLED=0 go build -ldflags "-s -w -X github.com/axllent/mailpit/config.Version=${VERSION}" -o /mailpit FROM alpine:latest diff --git a/cmd/version.go b/cmd/version.go index bcf2abd..c4e7b35 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -5,21 +5,11 @@ import ( "os" "runtime" + "github.com/axllent/mailpit/config" "github.com/axllent/mailpit/updater" "github.com/spf13/cobra" ) -var ( - // Version is the default application version, updated on release - Version = "dev" - - // Repo on Github for updater - Repo = "axllent/mailpit" - - // RepoBinaryName on Github for updater - RepoBinaryName = "mailpit" -) - // versionCmd represents the version command var versionCmd = &cobra.Command{ Use: "version", @@ -36,10 +26,10 @@ var versionCmd = &cobra.Command{ } fmt.Printf("%s %s compiled with %s on %s/%s\n", - os.Args[0], Version, runtime.Version(), runtime.GOOS, runtime.GOARCH) + os.Args[0], config.Version, runtime.Version(), runtime.GOOS, runtime.GOARCH) - latest, _, _, err := updater.GithubLatest(Repo, RepoBinaryName) - if err == nil && updater.GreaterThan(latest, Version) { + latest, _, _, err := updater.GithubLatest(config.Repo, config.RepoBinaryName) + if err == nil && updater.GreaterThan(latest, config.Version) { fmt.Printf( "\nUpdate available: %s\nRun `%s version -u` to update (requires read/write access to install directory).\n", latest, @@ -59,7 +49,7 @@ func init() { } func updateApp() error { - rel, err := updater.GithubUpdate(Repo, RepoBinaryName, Version) + rel, err := updater.GithubUpdate(config.Repo, config.RepoBinaryName, config.Version) if err != nil { return err } diff --git a/config/config.go b/config/config.go index 5fc906f..c4a6c88 100644 --- a/config/config.go +++ b/config/config.go @@ -58,6 +58,15 @@ var ( // ContentSecurityPolicy for HTTP server ContentSecurityPolicy = "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-src 'self'; img-src * data: blob:; font-src 'self' data:; media-src 'self'; connect-src 'self' ws: wss:; object-src 'none'; base-uri 'self';" + + // Version is the default application version, updated on release + Version = "dev" + + // Repo on Github for updater + Repo = "axllent/mailpit" + + // RepoBinaryName on Github for updater + RepoBinaryName = "mailpit" ) // VerifyConfig wil do some basic checking diff --git a/server/apiv1/api.go b/server/apiv1/api.go index 044b7b1..049aba0 100644 --- a/server/apiv1/api.go +++ b/server/apiv1/api.go @@ -22,15 +22,6 @@ type MessagesResult struct { Messages []data.Summary `json:"messages"` } -// // Mailbox returns an message overview (stats) -// func Mailbox(w http.ResponseWriter, _ *http.Request) { -// res := storage.StatsGet() - -// bytes, _ := json.Marshal(res) -// w.Header().Add("Content-Type", "application/json") -// _, _ = w.Write(bytes) -// } - // Messages returns a paginated list of messages func Messages(w http.ResponseWriter, r *http.Request) { start, limit := getStartLimit(r) @@ -171,34 +162,6 @@ func DeleteMessages(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("ok")) } -// // DeleteMessage (method: DELETE) deletes a single message -// func DeleteMessage(w http.ResponseWriter, r *http.Request) { -// vars := mux.Vars(r) - -// id := vars["id"] - -// err := storage.DeleteOneMessage(id) -// if err != nil { -// httpError(w, err.Error()) -// return -// } - -// w.Header().Add("Content-Type", "text/plain") -// _, _ = w.Write([]byte("ok")) -// } - -// SetAllRead (GET) will update all messages as read -// func SetAllRead(w http.ResponseWriter, r *http.Request) { -// err := storage.MarkAllRead() -// if err != nil { -// httpError(w, err.Error()) -// return -// } - -// w.Header().Add("Content-Type", "text/plain") -// _, _ = w.Write([]byte("ok")) -// } - // SetReadStatus (method: PUT) will update the status to Read/Unread for all provided IDs func SetReadStatus(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) diff --git a/server/apiv1/info.go b/server/apiv1/info.go new file mode 100644 index 0000000..430424e --- /dev/null +++ b/server/apiv1/info.go @@ -0,0 +1,52 @@ +package apiv1 + +import ( + "encoding/json" + "net/http" + "os" + "runtime" + + "github.com/axllent/mailpit/config" + "github.com/axllent/mailpit/storage" + "github.com/axllent/mailpit/updater" +) + +type appVersion struct { + Version string + LatestVersion string + Database string + DatabaseSize int64 + Messages int + Memory uint64 +} + +// AppInfo returns some basic details about the running app, and latest release. +func AppInfo(w http.ResponseWriter, r *http.Request) { + + info := appVersion{} + info.Version = config.Version + + latest, _, _, err := updater.GithubLatest(config.Repo, config.RepoBinaryName) + if err == nil { + info.LatestVersion = latest + } + + info.Database = config.DataFile + + db, err := os.Stat(info.Database) + if err == nil { + info.DatabaseSize = db.Size() + } + + info.Messages = storage.CountTotal() + + var m runtime.MemStats + runtime.ReadMemStats(&m) + + info.Memory = m.Sys - m.HeapReleased + + bytes, _ := json.Marshal(info) + + w.Header().Add("Content-Type", "application/json") + _, _ = w.Write(bytes) +} diff --git a/server/server.go b/server/server.go index 192160d..c298967 100644 --- a/server/server.go +++ b/server/server.go @@ -66,6 +66,7 @@ func defaultRoutes() *mux.Router { r.HandleFunc("/api/v1/message/{id}/part/{partID}", middleWareFunc(apiv1.DownloadAttachment)).Methods("GET") r.HandleFunc("/api/v1/message/{id}/part/{partID}/thumb", middleWareFunc(apiv1.Thumbnail)).Methods("GET") r.HandleFunc("/api/v1/message/{id}", middleWareFunc(apiv1.Message)).Methods("GET") + r.HandleFunc("/api/v1/info", middleWareFunc(apiv1.AppInfo)).Methods("GET") return r } diff --git a/server/ui-src/App.vue b/server/ui-src/App.vue index 1a92d2a..0f36bfe 100644 --- a/server/ui-src/App.vue +++ b/server/ui-src/App.vue @@ -28,7 +28,8 @@ export default { notificationsSupported: false, notificationsEnabled: false, selected: [], - tcStatus: 0 + tcStatus: 0, + appInfo : false, } }, watch: { @@ -421,7 +422,7 @@ export default { else if (Notification.permission !== "denied") { let self = this; Notification.requestPermission().then(function (permission) { - // If the user accepts, let's create a notification + // if the user accepts, let's create a notification if (permission === "granted") { self.browserNotify("Notifications enabled", "You will receive notifications when new mails are received."); self.notificationsEnabled = true; @@ -479,6 +480,14 @@ export default { isSelected: function(id) { return this.selected.indexOf(id) != -1; + }, + + loadInfo: function() { + let self = this; + self.get('api/v1/info', false, function(response) { + self.appInfo = response.data; + self.modal('AppInfoModal').show(); + }); } } } @@ -625,13 +634,9 @@ export default {
  • - - - GitHub - - / - - Docs + + + About
  • @@ -756,4 +761,59 @@ export default { + + diff --git a/server/ui-src/mixins.js b/server/ui-src/mixins.js index 7e7976b..5ef88c5 100644 --- a/server/ui-src/mixins.js +++ b/server/ui-src/mixins.js @@ -1,4 +1,6 @@ -import axios from 'axios' +import axios from 'axios'; +import { Modal } from 'bootstrap'; + // FakeModal is used to return a fake Bootstrap modal // if the ID returns nothing @@ -31,7 +33,7 @@ const commonMixins = { // The request was made and the server responded with a status code // that falls out of the range of 2xx if (error.response.data.Error) { - alert(error.response.data.Error) + alert(error.response.data.Error); } else { alert(error.response.data); } @@ -50,7 +52,7 @@ const commonMixins = { modal: function (id) { let e = document.getElementById(id); if (e) { - return bootstrap.Modal.getOrCreateInstance(e); + return Modal.getOrCreateInstance(e); } // in case there are open/close actions return new FakeModal(); @@ -209,4 +211,4 @@ const commonMixins = { } -export default commonMixins +export default commonMixins diff --git a/storage/database.go b/storage/database.go index 3e795f3..b9b2fb9 100644 --- a/storage/database.go +++ b/storage/database.go @@ -95,6 +95,8 @@ func InitDB() error { p = filepath.Clean(p) } + config.DataFile = p + logger.Log().Debugf("[db] opening database %s", p) var err error From 46dbde04ae9ab20c42d194682e46afcc5ee76283 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 8 Oct 2022 23:25:39 +1300 Subject: [PATCH 3/5] UI: Update frontend modules --- package-lock.json | 362 +++++++++++++++++++++++----------------------- 1 file changed, 180 insertions(+), 182 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ada686..6bf2b59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,9 +25,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", + "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -61,36 +61,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.38.tgz", - "integrity": "sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.40.tgz", + "integrity": "sha512-2Dc3Stk0J/VyQ4OUr2yEC53kU28614lZS+bnrCbFSAIftBJ40g/2yQzf4mPBiFuqguMB7hyHaujdgZAQ67kZYA==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.38", + "@vue/shared": "3.2.40", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.38.tgz", - "integrity": "sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz", + "integrity": "sha512-OZCNyYVC2LQJy4H7h0o28rtk+4v+HMQygRTpmibGoG9wZyomQiS5otU7qo3Wlq5UfHDw2RFwxb9BJgKjVpjrQw==", "dependencies": { - "@vue/compiler-core": "3.2.38", - "@vue/shared": "3.2.38" + "@vue/compiler-core": "3.2.40", + "@vue/shared": "3.2.40" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.38.tgz", - "integrity": "sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz", + "integrity": "sha512-tzqwniIN1fu1PDHC3CpqY/dPCfN/RN1thpBC+g69kJcrl7mbGiHKNwbA6kJ3XKKy8R6JLKqcpVugqN4HkeBFFg==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.38", - "@vue/compiler-dom": "3.2.38", - "@vue/compiler-ssr": "3.2.38", - "@vue/reactivity-transform": "3.2.38", - "@vue/shared": "3.2.38", + "@vue/compiler-core": "3.2.40", + "@vue/compiler-dom": "3.2.40", + "@vue/compiler-ssr": "3.2.40", + "@vue/reactivity-transform": "3.2.40", + "@vue/shared": "3.2.40", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -98,69 +98,69 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.38.tgz", - "integrity": "sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz", + "integrity": "sha512-80cQcgasKjrPPuKcxwuCx7feq+wC6oFl5YaKSee9pV3DNq+6fmCVwEEC3vvkf/E2aI76rIJSOYHsWSEIxK74oQ==", "dependencies": { - "@vue/compiler-dom": "3.2.38", - "@vue/shared": "3.2.38" + "@vue/compiler-dom": "3.2.40", + "@vue/shared": "3.2.40" } }, "node_modules/@vue/reactivity": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.38.tgz", - "integrity": "sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.40.tgz", + "integrity": "sha512-N9qgGLlZmtUBMHF9xDT4EkD9RdXde1Xbveb+niWMXuHVWQP5BzgRmE3SFyUBBcyayG4y1lhoz+lphGRRxxK4RA==", "dependencies": { - "@vue/shared": "3.2.38" + "@vue/shared": "3.2.40" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.38.tgz", - "integrity": "sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz", + "integrity": "sha512-HQUCVwEaacq6fGEsg2NUuGKIhUveMCjOk8jGHqLXPI2w6zFoPrlQhwWEaINTv5kkZDXKEnCijAp+4gNEHG03yw==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.38", - "@vue/shared": "3.2.38", + "@vue/compiler-core": "3.2.40", + "@vue/shared": "3.2.40", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.38.tgz", - "integrity": "sha512-kk0qiSiXUU/IKxZw31824rxmFzrLr3TL6ZcbrxWTKivadoKupdlzbQM4SlGo4MU6Zzrqv4fzyUasTU1jDoEnzg==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.40.tgz", + "integrity": "sha512-U1+rWf0H8xK8aBUZhnrN97yoZfHbjgw/bGUzfgKPJl69/mXDuSg8CbdBYBn6VVQdR947vWneQBFzdhasyzMUKg==", "dependencies": { - "@vue/reactivity": "3.2.38", - "@vue/shared": "3.2.38" + "@vue/reactivity": "3.2.40", + "@vue/shared": "3.2.40" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.38.tgz", - "integrity": "sha512-4PKAb/ck2TjxdMSzMsnHViOrrwpudk4/A56uZjhzvusoEU9xqa5dygksbzYepdZeB5NqtRw5fRhWIiQlRVK45A==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.40.tgz", + "integrity": "sha512-AO2HMQ+0s2+MCec8hXAhxMgWhFhOPJ/CyRXnmTJ6XIOnJFLrH5Iq3TNwvVcODGR295jy77I6dWPj+wvFoSYaww==", "dependencies": { - "@vue/runtime-core": "3.2.38", - "@vue/shared": "3.2.38", + "@vue/runtime-core": "3.2.40", + "@vue/shared": "3.2.40", "csstype": "^2.6.8" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.38.tgz", - "integrity": "sha512-pg+JanpbOZ5kEfOZzO2bt02YHd+ELhYP8zPeLU1H0e7lg079NtuuSB8fjLdn58c4Ou8UQ6C1/P+528nXnLPAhA==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.40.tgz", + "integrity": "sha512-gtUcpRwrXOJPJ4qyBpU3EyxQa4EkV8I4f8VrDePcGCPe4O/hd0BPS7v9OgjIQob6Ap8VDz9G+mGTKazE45/95w==", "dependencies": { - "@vue/compiler-ssr": "3.2.38", - "@vue/shared": "3.2.38" + "@vue/compiler-ssr": "3.2.40", + "@vue/shared": "3.2.40" }, "peerDependencies": { - "vue": "3.2.38" + "vue": "3.2.40" } }, "node_modules/@vue/shared": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz", - "integrity": "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==" + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.40.tgz", + "integrity": "sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ==" }, "node_modules/anymatch": { "version": "3.1.2", @@ -199,9 +199,9 @@ } }, "node_modules/bootstrap": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.0.tgz", - "integrity": "sha512-qlnS9GL6YZE6Wnef46GxGv1UpGGzAwO0aPL1yOjzDIJpeApeMvqV24iL+pjr2kU4dduoBA9fINKWKgMToobx9A==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.2.tgz", + "integrity": "sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ==", "funding": [ { "type": "github", @@ -213,7 +213,7 @@ } ], "peerDependencies": { - "@popperjs/core": "^2.11.5" + "@popperjs/core": "^2.11.6" } }, "node_modules/bootstrap-icons": { @@ -281,9 +281,9 @@ } }, "node_modules/csstype": { - "version": "2.6.20", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", - "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" }, "node_modules/delayed-stream": { "version": "1.0.0", @@ -599,9 +599,9 @@ } }, "node_modules/esbuild-sass-plugin": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.3.2.tgz", - "integrity": "sha512-bNIV241S0vpy+F9U9oMbmlAD+GDzKLJp2+Z9rSRP8Rq8Nwmxh9roI0s3iB9d6Eii1A5WYgCK7HZeWPokw2rhSw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.3.3.tgz", + "integrity": "sha512-EegGnUIsP5Y7FbwcGBD524F+cJaIAQU2LSOX9QtjgpqEmwnmfEh5f/aPJ1df5GxD3NgHQJspeRCV7spDHE3N6Q==", "dev": true, "dependencies": { "esbuild": "^0.14.13", @@ -609,23 +609,6 @@ "sass": "^1.49.0" } }, - "node_modules/esbuild-sass-plugin/node_modules/sass": { - "version": "1.54.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.9.tgz", - "integrity": "sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/esbuild-sunos-64": { "version": "0.14.54", "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", @@ -708,9 +691,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -928,9 +911,9 @@ } }, "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", + "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", "funding": [ { "type": "opencollective", @@ -993,6 +976,23 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/sass": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", + "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1044,23 +1044,23 @@ } }, "node_modules/vue": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.38.tgz", - "integrity": "sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.40.tgz", + "integrity": "sha512-1mGHulzUbl2Nk3pfvI5aXYYyJUs1nm4kyvuz38u4xlQkLUn1i2R7nDbI4TufECmY8v1qNBHYy62bCaM+3cHP2A==", "dependencies": { - "@vue/compiler-dom": "3.2.38", - "@vue/compiler-sfc": "3.2.38", - "@vue/runtime-dom": "3.2.38", - "@vue/server-renderer": "3.2.38", - "@vue/shared": "3.2.38" + "@vue/compiler-dom": "3.2.40", + "@vue/compiler-sfc": "3.2.40", + "@vue/runtime-dom": "3.2.40", + "@vue/server-renderer": "3.2.40", + "@vue/shared": "3.2.40" } } }, "dependencies": { "@babel/parser": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==" + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", + "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==" }, "@esbuild/linux-loong64": { "version": "0.14.54", @@ -1075,36 +1075,36 @@ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, "@vue/compiler-core": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.38.tgz", - "integrity": "sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.40.tgz", + "integrity": "sha512-2Dc3Stk0J/VyQ4OUr2yEC53kU28614lZS+bnrCbFSAIftBJ40g/2yQzf4mPBiFuqguMB7hyHaujdgZAQ67kZYA==", "requires": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.38", + "@vue/shared": "3.2.40", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.38.tgz", - "integrity": "sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz", + "integrity": "sha512-OZCNyYVC2LQJy4H7h0o28rtk+4v+HMQygRTpmibGoG9wZyomQiS5otU7qo3Wlq5UfHDw2RFwxb9BJgKjVpjrQw==", "requires": { - "@vue/compiler-core": "3.2.38", - "@vue/shared": "3.2.38" + "@vue/compiler-core": "3.2.40", + "@vue/shared": "3.2.40" } }, "@vue/compiler-sfc": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.38.tgz", - "integrity": "sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz", + "integrity": "sha512-tzqwniIN1fu1PDHC3CpqY/dPCfN/RN1thpBC+g69kJcrl7mbGiHKNwbA6kJ3XKKy8R6JLKqcpVugqN4HkeBFFg==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.38", - "@vue/compiler-dom": "3.2.38", - "@vue/compiler-ssr": "3.2.38", - "@vue/reactivity-transform": "3.2.38", - "@vue/shared": "3.2.38", + "@vue/compiler-core": "3.2.40", + "@vue/compiler-dom": "3.2.40", + "@vue/compiler-ssr": "3.2.40", + "@vue/reactivity-transform": "3.2.40", + "@vue/shared": "3.2.40", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -1112,66 +1112,66 @@ } }, "@vue/compiler-ssr": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.38.tgz", - "integrity": "sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz", + "integrity": "sha512-80cQcgasKjrPPuKcxwuCx7feq+wC6oFl5YaKSee9pV3DNq+6fmCVwEEC3vvkf/E2aI76rIJSOYHsWSEIxK74oQ==", "requires": { - "@vue/compiler-dom": "3.2.38", - "@vue/shared": "3.2.38" + "@vue/compiler-dom": "3.2.40", + "@vue/shared": "3.2.40" } }, "@vue/reactivity": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.38.tgz", - "integrity": "sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.40.tgz", + "integrity": "sha512-N9qgGLlZmtUBMHF9xDT4EkD9RdXde1Xbveb+niWMXuHVWQP5BzgRmE3SFyUBBcyayG4y1lhoz+lphGRRxxK4RA==", "requires": { - "@vue/shared": "3.2.38" + "@vue/shared": "3.2.40" } }, "@vue/reactivity-transform": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.38.tgz", - "integrity": "sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz", + "integrity": "sha512-HQUCVwEaacq6fGEsg2NUuGKIhUveMCjOk8jGHqLXPI2w6zFoPrlQhwWEaINTv5kkZDXKEnCijAp+4gNEHG03yw==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.38", - "@vue/shared": "3.2.38", + "@vue/compiler-core": "3.2.40", + "@vue/shared": "3.2.40", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "@vue/runtime-core": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.38.tgz", - "integrity": "sha512-kk0qiSiXUU/IKxZw31824rxmFzrLr3TL6ZcbrxWTKivadoKupdlzbQM4SlGo4MU6Zzrqv4fzyUasTU1jDoEnzg==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.40.tgz", + "integrity": "sha512-U1+rWf0H8xK8aBUZhnrN97yoZfHbjgw/bGUzfgKPJl69/mXDuSg8CbdBYBn6VVQdR947vWneQBFzdhasyzMUKg==", "requires": { - "@vue/reactivity": "3.2.38", - "@vue/shared": "3.2.38" + "@vue/reactivity": "3.2.40", + "@vue/shared": "3.2.40" } }, "@vue/runtime-dom": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.38.tgz", - "integrity": "sha512-4PKAb/ck2TjxdMSzMsnHViOrrwpudk4/A56uZjhzvusoEU9xqa5dygksbzYepdZeB5NqtRw5fRhWIiQlRVK45A==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.40.tgz", + "integrity": "sha512-AO2HMQ+0s2+MCec8hXAhxMgWhFhOPJ/CyRXnmTJ6XIOnJFLrH5Iq3TNwvVcODGR295jy77I6dWPj+wvFoSYaww==", "requires": { - "@vue/runtime-core": "3.2.38", - "@vue/shared": "3.2.38", + "@vue/runtime-core": "3.2.40", + "@vue/shared": "3.2.40", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.38.tgz", - "integrity": "sha512-pg+JanpbOZ5kEfOZzO2bt02YHd+ELhYP8zPeLU1H0e7lg079NtuuSB8fjLdn58c4Ou8UQ6C1/P+528nXnLPAhA==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.40.tgz", + "integrity": "sha512-gtUcpRwrXOJPJ4qyBpU3EyxQa4EkV8I4f8VrDePcGCPe4O/hd0BPS7v9OgjIQob6Ap8VDz9G+mGTKazE45/95w==", "requires": { - "@vue/compiler-ssr": "3.2.38", - "@vue/shared": "3.2.38" + "@vue/compiler-ssr": "3.2.40", + "@vue/shared": "3.2.40" } }, "@vue/shared": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz", - "integrity": "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==" + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.40.tgz", + "integrity": "sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ==" }, "anymatch": { "version": "3.1.2", @@ -1204,9 +1204,9 @@ "dev": true }, "bootstrap": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.0.tgz", - "integrity": "sha512-qlnS9GL6YZE6Wnef46GxGv1UpGGzAwO0aPL1yOjzDIJpeApeMvqV24iL+pjr2kU4dduoBA9fINKWKgMToobx9A==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.2.tgz", + "integrity": "sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ==", "requires": {} }, "bootstrap-icons": { @@ -1257,9 +1257,9 @@ } }, "csstype": { - "version": "2.6.20", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", - "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" }, "delayed-stream": { "version": "1.0.0", @@ -1418,27 +1418,14 @@ } }, "esbuild-sass-plugin": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.3.2.tgz", - "integrity": "sha512-bNIV241S0vpy+F9U9oMbmlAD+GDzKLJp2+Z9rSRP8Rq8Nwmxh9roI0s3iB9d6Eii1A5WYgCK7HZeWPokw2rhSw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.3.3.tgz", + "integrity": "sha512-EegGnUIsP5Y7FbwcGBD524F+cJaIAQU2LSOX9QtjgpqEmwnmfEh5f/aPJ1df5GxD3NgHQJspeRCV7spDHE3N6Q==", "dev": true, "requires": { "esbuild": "^0.14.13", "resolve": "^1.22.1", "sass": "^1.49.0" - }, - "dependencies": { - "sass": { - "version": "1.54.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.9.tgz", - "integrity": "sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - } } }, "esbuild-sunos-64": { @@ -1484,9 +1471,9 @@ } }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "form-data": { "version": "4.0.0", @@ -1635,9 +1622,9 @@ "dev": true }, "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", + "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -1675,6 +1662,17 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "sass": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", + "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1711,15 +1709,15 @@ } }, "vue": { - "version": "3.2.38", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.38.tgz", - "integrity": "sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q==", + "version": "3.2.40", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.40.tgz", + "integrity": "sha512-1mGHulzUbl2Nk3pfvI5aXYYyJUs1nm4kyvuz38u4xlQkLUn1i2R7nDbI4TufECmY8v1qNBHYy62bCaM+3cHP2A==", "requires": { - "@vue/compiler-dom": "3.2.38", - "@vue/compiler-sfc": "3.2.38", - "@vue/runtime-dom": "3.2.38", - "@vue/server-renderer": "3.2.38", - "@vue/shared": "3.2.38" + "@vue/compiler-dom": "3.2.40", + "@vue/compiler-sfc": "3.2.40", + "@vue/runtime-dom": "3.2.40", + "@vue/server-renderer": "3.2.40", + "@vue/shared": "3.2.40" } } } From 906a697542940839b569a4d4ef150c34c44fa88a Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 8 Oct 2022 23:32:40 +1300 Subject: [PATCH 4/5] Add event.preventDefault() --- server/ui-src/App.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/ui-src/App.vue b/server/ui-src/App.vue index 0f36bfe..b0542a4 100644 --- a/server/ui-src/App.vue +++ b/server/ui-src/App.vue @@ -482,7 +482,8 @@ export default { return this.selected.indexOf(id) != -1; }, - loadInfo: function() { + loadInfo: function(e) { + e.preventDefault(); let self = this; self.get('api/v1/info', false, function(response) { self.appInfo = response.data; From b64a5b799170883dbee516356fb7a97f7a45f3f9 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 8 Oct 2022 23:35:23 +1300 Subject: [PATCH 5/5] Release 1.2.1 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0258d96..c0f0c1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ Notable changes to Mailpit will be documented in this file. +## 1.2.1 + +### UI +- Update frontend modules +- Add about app modal with version update notification + + ## 1.2.0 ### Feature