From 415d35f6e2598571ba2bbbc5b39fab16dfd8927f Mon Sep 17 00:00:00 2001 From: Kirill Khrychikov Date: Thu, 12 Jun 2025 00:47:38 +0300 Subject: [PATCH] . --- auth.go | 71 + echo.go | 98 + frontend/.env.development | 1 + frontend/.env.production | 1 + frontend/.gitignore | 29 + frontend/README.md | 40 +- frontend/components.d.ts | 115 + frontend/env.d.ts | 1 + frontend/index.html | 20 +- frontend/package-lock.json | 2107 ++++++++++---- frontend/package.json | 35 +- frontend/package.json.md5 | 2 +- frontend/public/favicon.ico | Bin 0 -> 1897 bytes frontend/src/App.vue | 95 +- frontend/src/assets/base.css | 36 + frontend/src/assets/fonts/OFL.txt | 93 - .../fonts/nunito-v16-latin-regular.woff2 | Bin 18972 -> 0 bytes frontend/src/assets/g69.png | Bin 0 -> 13456 bytes frontend/src/assets/images/logo-universal.png | Bin 139695 -> 0 bytes frontend/src/assets/logo-200x200.png | Bin 0 -> 16375 bytes frontend/src/assets/main.css | 47 + frontend/src/components/HelloWorld.vue | 71 - frontend/src/components/Logo.vue | 35 + frontend/src/components/NotImplemented.vue | 53 + frontend/src/components/PageNotFound.vue | 44 + frontend/src/components/admin/Dashboard.vue | 465 +++ frontend/src/components/admin/domains/Add.vue | 120 + .../src/components/admin/domains/DKIM.vue | 156 + .../admin/domains/IncomingRules.vue | 61 + .../admin/domains/MailsPermDeletion.vue | 344 +++ .../components/admin/domains/Migration.vue | 151 + .../admin/domains/OutgoingRules.vue | 68 + .../admin/domains/SharedAddressBooks.vue | 25 + .../admin/domains/SharedCalendars.vue | 21 + .../admin/domains/SharedFolders.vue | 25 + .../admin/domains/cidr_access/Policy.vue | 471 +++ .../admin/domains/cidr_access/Pools.vue | 397 +++ .../admin/domains/mailstorage/Export.vue | 158 + .../admin/domains/mailstorage/Mailboxes.vue | 747 +++++ .../admin/domains/mailstorage/Settings.vue | 1071 +++++++ .../admin/domains/resources/Categories.vue | 328 +++ .../admin/domains/resources/Offices.vue | 352 +++ .../admin/domains/resources/Resources.vue | 608 ++++ .../components/admin/domains/userdb/Add.vue | 115 + .../admin/domains/userdb/Groups.vue | 434 +++ .../admin/domains/userdb/Redirects.vue | 245 ++ .../admin/domains/userdb/Settings.vue | 812 ++++++ .../components/admin/domains/userdb/Users.vue | 294 ++ .../components/admin/security/BlockedIPs.vue | 164 ++ .../admin/security/black_list/Email.vue | 215 ++ .../admin/security/black_list/IP.vue | 213 ++ .../admin/security/white_list/Email.vue | 215 ++ .../admin/security/white_list/IP.vue | 213 ++ .../admin/settings/AddressRules.vue | 50 + .../components/admin/settings/Calendars.vue | 110 + .../src/components/admin/settings/License.vue | 272 ++ .../src/components/admin/settings/Main.vue | 1010 +++++++ .../components/admin/settings/SettingsDB.vue | 257 ++ .../admin/settings/smtp_queue/Manage.vue | 388 +++ .../admin/settings/smtp_queue/Settings.vue | 304 ++ .../src/components/common/AddressBooks.vue | 815 ++++++ frontend/src/components/common/Calendars.vue | 475 +++ .../src/components/common/CalendarsAccess.vue | 504 ++++ .../src/components/common/SharedFolders.vue | 755 +++++ .../src/components/common/TimezoneSelect.vue | 40 + .../src/components/common/WorkDaysSelect.vue | 36 + .../common/WorkHoursRangePicker.vue | 6 + .../src/components/common/approval/Day.vue | 118 + .../components/common/approval/Interval.vue | 66 + .../src/components/common/rules/Actions.vue | 74 + .../components/common/rules/Conditions.vue | 91 + .../src/components/common/rules/Rules.vue | 588 ++++ .../common/rules/address/Actions.vue | 61 + .../common/rules/address/Conditions.vue | 192 ++ .../common/rules/incoming/Actions.vue | 210 ++ .../common/rules/incoming/Conditions.vue | 503 ++++ .../common/rules/outgoing/Actions.vue | 381 +++ .../common/rules/outgoing/Conditions.vue | 300 ++ .../user/AddressBooks/AvaliableToMe.vue | 176 ++ .../components/user/AddressBooks/MyBooks.vue | 23 + .../user/Calendars/AvaliableToMe.vue | 176 ++ .../user/Calendars/EventsPlanner/List.vue | 360 +++ .../Calendars/EventsPlanner/NewOrEdit.vue | 1430 +++++++++ .../EventsPlanner/ScriptErrorNotify.vue | 90 + .../components/user/Calendars/MyCalendars.vue | 23 + .../user/Calendars/ShareFreeTime.vue | 255 ++ .../src/components/user/IncomingRules.vue | 55 + .../components/user/MailboxSharedAccess.vue | 345 +++ frontend/src/components/user/Profile.vue | 277 ++ .../src/components/user/RecoveryFolder.vue | 84 + .../src/components/user/SharedFolders.vue | 23 + frontend/src/composables/alert.ts | 27 + frontend/src/composables/apiFetch.ts | 47 + frontend/src/composables/misc.ts | 79 + frontend/src/composables/restart.ts | 31 + frontend/src/locale/index.ts | 32 + frontend/src/locale/translations.ts | 2593 +++++++++++++++++ frontend/src/main.ts | 52 +- frontend/src/router/consts.ts | 98 + frontend/src/router/index.ts | 105 + frontend/src/router/middleware/log.ts | 7 + frontend/src/router/middleware/pipeline.ts | 13 + frontend/src/router/routes.ts | 275 ++ frontend/src/stores/auth.ts | 28 + frontend/src/stores/returnToPage.ts | 33 + frontend/src/style.css | 26 - frontend/src/views/Admin.vue | 1546 ++++++++++ frontend/src/views/Login.vue | 168 ++ frontend/src/views/User.vue | 445 +++ .../views/shared/EventsExternalApproval.vue | 271 ++ frontend/src/views/shared/FreeTime.vue | 265 ++ frontend/src/vite-env.d.ts | 7 - frontend/tsconfig.app.json | 14 + frontend/tsconfig.json | 27 +- frontend/tsconfig.node.json | 20 +- frontend/vite.config.ts | 16 +- go.mod | 10 +- go.sum | 10 + handlers.go | 20 + main.go | 46 +- tools/auth.go | 30 + tools/consts.go | 12 + tools/responses.go | 130 + 123 files changed, 28022 insertions(+), 866 deletions(-) create mode 100644 auth.go create mode 100644 echo.go create mode 100644 frontend/.env.development create mode 100644 frontend/.env.production create mode 100644 frontend/.gitignore create mode 100644 frontend/components.d.ts create mode 100644 frontend/env.d.ts create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/src/assets/base.css delete mode 100644 frontend/src/assets/fonts/OFL.txt delete mode 100644 frontend/src/assets/fonts/nunito-v16-latin-regular.woff2 create mode 100644 frontend/src/assets/g69.png delete mode 100644 frontend/src/assets/images/logo-universal.png create mode 100644 frontend/src/assets/logo-200x200.png create mode 100644 frontend/src/assets/main.css delete mode 100644 frontend/src/components/HelloWorld.vue create mode 100644 frontend/src/components/Logo.vue create mode 100644 frontend/src/components/NotImplemented.vue create mode 100644 frontend/src/components/PageNotFound.vue create mode 100644 frontend/src/components/admin/Dashboard.vue create mode 100644 frontend/src/components/admin/domains/Add.vue create mode 100644 frontend/src/components/admin/domains/DKIM.vue create mode 100644 frontend/src/components/admin/domains/IncomingRules.vue create mode 100644 frontend/src/components/admin/domains/MailsPermDeletion.vue create mode 100644 frontend/src/components/admin/domains/Migration.vue create mode 100644 frontend/src/components/admin/domains/OutgoingRules.vue create mode 100644 frontend/src/components/admin/domains/SharedAddressBooks.vue create mode 100644 frontend/src/components/admin/domains/SharedCalendars.vue create mode 100644 frontend/src/components/admin/domains/SharedFolders.vue create mode 100644 frontend/src/components/admin/domains/cidr_access/Policy.vue create mode 100644 frontend/src/components/admin/domains/cidr_access/Pools.vue create mode 100644 frontend/src/components/admin/domains/mailstorage/Export.vue create mode 100644 frontend/src/components/admin/domains/mailstorage/Mailboxes.vue create mode 100644 frontend/src/components/admin/domains/mailstorage/Settings.vue create mode 100644 frontend/src/components/admin/domains/resources/Categories.vue create mode 100644 frontend/src/components/admin/domains/resources/Offices.vue create mode 100644 frontend/src/components/admin/domains/resources/Resources.vue create mode 100644 frontend/src/components/admin/domains/userdb/Add.vue create mode 100644 frontend/src/components/admin/domains/userdb/Groups.vue create mode 100644 frontend/src/components/admin/domains/userdb/Redirects.vue create mode 100644 frontend/src/components/admin/domains/userdb/Settings.vue create mode 100644 frontend/src/components/admin/domains/userdb/Users.vue create mode 100644 frontend/src/components/admin/security/BlockedIPs.vue create mode 100644 frontend/src/components/admin/security/black_list/Email.vue create mode 100644 frontend/src/components/admin/security/black_list/IP.vue create mode 100644 frontend/src/components/admin/security/white_list/Email.vue create mode 100644 frontend/src/components/admin/security/white_list/IP.vue create mode 100644 frontend/src/components/admin/settings/AddressRules.vue create mode 100644 frontend/src/components/admin/settings/Calendars.vue create mode 100644 frontend/src/components/admin/settings/License.vue create mode 100644 frontend/src/components/admin/settings/Main.vue create mode 100644 frontend/src/components/admin/settings/SettingsDB.vue create mode 100644 frontend/src/components/admin/settings/smtp_queue/Manage.vue create mode 100644 frontend/src/components/admin/settings/smtp_queue/Settings.vue create mode 100644 frontend/src/components/common/AddressBooks.vue create mode 100644 frontend/src/components/common/Calendars.vue create mode 100644 frontend/src/components/common/CalendarsAccess.vue create mode 100644 frontend/src/components/common/SharedFolders.vue create mode 100644 frontend/src/components/common/TimezoneSelect.vue create mode 100644 frontend/src/components/common/WorkDaysSelect.vue create mode 100644 frontend/src/components/common/WorkHoursRangePicker.vue create mode 100644 frontend/src/components/common/approval/Day.vue create mode 100644 frontend/src/components/common/approval/Interval.vue create mode 100644 frontend/src/components/common/rules/Actions.vue create mode 100644 frontend/src/components/common/rules/Conditions.vue create mode 100644 frontend/src/components/common/rules/Rules.vue create mode 100644 frontend/src/components/common/rules/address/Actions.vue create mode 100644 frontend/src/components/common/rules/address/Conditions.vue create mode 100644 frontend/src/components/common/rules/incoming/Actions.vue create mode 100644 frontend/src/components/common/rules/incoming/Conditions.vue create mode 100644 frontend/src/components/common/rules/outgoing/Actions.vue create mode 100644 frontend/src/components/common/rules/outgoing/Conditions.vue create mode 100644 frontend/src/components/user/AddressBooks/AvaliableToMe.vue create mode 100644 frontend/src/components/user/AddressBooks/MyBooks.vue create mode 100644 frontend/src/components/user/Calendars/AvaliableToMe.vue create mode 100644 frontend/src/components/user/Calendars/EventsPlanner/List.vue create mode 100644 frontend/src/components/user/Calendars/EventsPlanner/NewOrEdit.vue create mode 100644 frontend/src/components/user/Calendars/EventsPlanner/ScriptErrorNotify.vue create mode 100644 frontend/src/components/user/Calendars/MyCalendars.vue create mode 100644 frontend/src/components/user/Calendars/ShareFreeTime.vue create mode 100644 frontend/src/components/user/IncomingRules.vue create mode 100644 frontend/src/components/user/MailboxSharedAccess.vue create mode 100644 frontend/src/components/user/Profile.vue create mode 100644 frontend/src/components/user/RecoveryFolder.vue create mode 100644 frontend/src/components/user/SharedFolders.vue create mode 100644 frontend/src/composables/alert.ts create mode 100644 frontend/src/composables/apiFetch.ts create mode 100644 frontend/src/composables/misc.ts create mode 100644 frontend/src/composables/restart.ts create mode 100644 frontend/src/locale/index.ts create mode 100644 frontend/src/locale/translations.ts create mode 100644 frontend/src/router/consts.ts create mode 100644 frontend/src/router/index.ts create mode 100644 frontend/src/router/middleware/log.ts create mode 100644 frontend/src/router/middleware/pipeline.ts create mode 100644 frontend/src/router/routes.ts create mode 100644 frontend/src/stores/auth.ts create mode 100644 frontend/src/stores/returnToPage.ts delete mode 100644 frontend/src/style.css create mode 100644 frontend/src/views/Admin.vue create mode 100644 frontend/src/views/Login.vue create mode 100644 frontend/src/views/User.vue create mode 100644 frontend/src/views/shared/EventsExternalApproval.vue create mode 100644 frontend/src/views/shared/FreeTime.vue delete mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/tsconfig.app.json create mode 100644 handlers.go create mode 100644 tools/auth.go create mode 100644 tools/consts.go create mode 100644 tools/responses.go diff --git a/auth.go b/auth.go new file mode 100644 index 0000000..5591381 --- /dev/null +++ b/auth.go @@ -0,0 +1,71 @@ +package main + +import ( + "crypto/rand" + "myproject/tools" + "net/http" + "strings" + + "github.com/gorilla/sessions" + "github.com/labstack/echo/v4" +) + +func NewAuthStore() *sessions.CookieStore { + auth := make([]byte, 32) + _, _ = rand.Read(auth) + enc := make([]byte, 16) + _, _ = rand.Read(enc) + s := sessions.NewCookieStore(auth, enc) + s.Options.Secure = false + s.Options.SameSite = http.SameSiteDefaultMode + s.MaxAge(3600) + return s +} + +func setAuth(onlyAdmin bool, g *echo.Group) *echo.Group { + g.Use( + func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + sess, err := c.Get("authStore").(*sessions.CookieStore).New(c.Request(), tools.SessionName) + if err != nil { + // journal.Debug(ctx, commerr.Trace(err).Error()) + } + + userName := sess.Values[tools.UserNameSessionKey] + if userName == nil { + return echo.ErrUnauthorized + } + + email, lp, domain := SplitEmail(userName.(string)) + c.Set(tools.UserCtxKey, email) + c.Set(tools.LpCtxKey, lp) + c.Set(tools.DomainCtxKey, domain) + + return next(c) + } + }, + func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + if onlyAdmin && tools.GetUser(c) != "admin" { + return echo.ErrUnauthorized + } + + return next(c) + } + }, + ) + + return g +} + +func SplitEmail(toSplit string) (email, user, domain string) { + email = strings.TrimSpace(toSplit) + email = strings.ToLower(email) + parts := strings.Split(email, "@") + user = parts[0] + if len(parts) > 1 { + domain = parts[1] + } + + return +} diff --git a/echo.go b/echo.go new file mode 100644 index 0000000..ecfccde --- /dev/null +++ b/echo.go @@ -0,0 +1,98 @@ +package main + +import ( + "context" + "fmt" + "myproject/tools" + "net" + "net/http" + "strings" + "time" + + "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" +) + +func NewEcho(ctx context.Context, restartMode *bool) *echo.Echo { + timeout := 5 * time.Minute + e := echo.New() + e.HideBanner = true + e.Server.ReadTimeout = timeout + e.Server.WriteTimeout = timeout + e.Server.BaseContext = func(listener net.Listener) context.Context { + return ctx + } + e.HTTPErrorHandler = func(err error, c echo.Context) { + httpError, ok := err.(*echo.HTTPError) + if ok { + errorCode := httpError.Code + switch errorCode { + case http.StatusServiceUnavailable: + tools.Serve503(c) + case http.StatusTooManyRequests: + tools.Serve429(c) + case http.StatusForbidden: + tools.Serve403(c) + case http.StatusUnauthorized: + tools.Serve401(c) + case http.StatusNotFound, http.StatusMethodNotAllowed: + if strings.HasPrefix(c.Request().RequestURI, "/backend") { + switch errorCode { + case http.StatusNotFound: + tools.Serve404(c) + case http.StatusMethodNotAllowed: + tools.Serve405(c) + } + return + } + c.Redirect(http.StatusTemporaryRedirect, fmt.Sprintf("/?redirect=%s", c.Request().RequestURI)) + default: + tools.Serve500(c) + } + } + } + + authStore := NewAuthStore() + + e.Use( + middleware.CORSWithConfig(middleware.CORSConfig{ + AllowOrigins: []string{"http://localhost:7777", "http://localhost:8808"}, + AllowHeaders: []string{ + echo.HeaderOrigin, + echo.HeaderContentType, + echo.HeaderAccept, + echo.HeaderAccessControlAllowOrigin, + echo.HeaderAccessControlAllowCredentials, + echo.HeaderAccessControlAllowHeaders, + echo.HeaderAccessControlRequestHeaders, + echo.HeaderAuthorization, + }, + AllowCredentials: true, + }), + middleware.GzipWithConfig(middleware.GzipConfig{ + Level: 6, + }), + func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + c.Set("authStore", authStore) + + return next(c) + } + }, + func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + + return next(c) + } + }, + func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + c.Set(tools.RootCtxKey, ctx) + + return next(c) + } + }, + ) + + return e +} diff --git a/frontend/.env.development b/frontend/.env.development new file mode 100644 index 0000000..1bb4252 --- /dev/null +++ b/frontend/.env.development @@ -0,0 +1 @@ +VITE_API_URL=http://localhost:8888 \ No newline at end of file diff --git a/frontend/.env.production b/frontend/.env.production new file mode 100644 index 0000000..3452b5c --- /dev/null +++ b/frontend/.env.production @@ -0,0 +1 @@ +VITE_API_URL= \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..a52d458 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/frontend/README.md b/frontend/README.md index 98f4a52..74e1fcc 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,23 +1,33 @@ -# Vue 3 + TypeScript + Vite +# js -This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue -3 ` - + + + + + Tegu + + +
+ + - diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 68c0354..ae0b5d5 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,46 +1,63 @@ { - "name": "frontend", + "name": "js", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "frontend", + "name": "js", "version": "0.0.0", "dependencies": { - "vue": "^3.2.37" + "@ant-design/icons-vue": "^7.0.1", + "ant-design-vue": "^4.2.3", + "pinia": "^2.1.7", + "pinia-plugin-persistedstate": "^3.2.1", + "vue": "^3.4.21", + "vue-i18n": "^9.13.1", + "vue-router": "^4.3.0" }, "devDependencies": { - "@babel/types": "^7.18.10", - "@vitejs/plugin-vue": "^3.0.3", - "typescript": "^4.6.4", - "vite": "^3.0.7", - "vue-tsc": "^1.8.27" + "@tsconfig/node20": "^20.1.4", + "@types/node": "^20.12.5", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/tsconfig": "^0.5.1", + "less": "^4.3.0", + "less-loader": "^12.2.0", + "npm-run-all2": "^6.1.2", + "typescript": "~5.4.0", + "vite": "^5.2.8", + "vue-tsc": "^2.0.11" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "engines": { - "node": ">=6.9.0" + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "engines": { - "node": ">=6.9.0" + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" + }, + "node_modules/@ant-design/icons-vue": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz", + "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" } }, "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", - "dependencies": { - "@babel/types": "^7.27.3" - }, + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -48,22 +65,55 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "node_modules/@babel/runtime": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -76,10 +126,154 @@ "node": ">=12" } }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -92,111 +286,570 @@ "node": ">=12" } }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@intlify/core-base": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.13.1.tgz", + "integrity": "sha512-+bcQRkJO9pcX8d0gel9ZNfrzU22sZFSA0WVhfXrf5jdJOS24a+Bp8pozuS9sBI9Hk/tGz83pgKfmqcn/Ci7/8w==", + "dependencies": { + "@intlify/message-compiler": "9.13.1", + "@intlify/shared": "9.13.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.13.1.tgz", + "integrity": "sha512-SKsVa4ajYGBVm7sHMXd5qX70O2XXjm55zdZB3VeMFCvQyvLew/dLvq3MqnaIsTMF1VkkOb9Ttr6tHcMlyPDL9w==", + "dependencies": { + "@intlify/shared": "9.13.1", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.13.1.tgz", + "integrity": "sha512-u3b6BKGhE6j/JeRU6C/RL2FgyJfy6LakbtfeVF8fJXURpZZTzfh3e05J0bu0XPw447Q6/WUp3C4ajv4TMS4YsQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@tsconfig/node20": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz", + "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@vitejs/plugin-vue": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", - "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", + "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", "dev": true, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^3.0.0", + "vite": "^5.0.0", "vue": "^3.2.25" } }, "node_modules/@volar/language-core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", - "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.0.tgz", + "integrity": "sha512-pvhL24WUh3VDnv7Yw5N1sjhPtdx7q9g+Wl3tggmnkMcyK8GcCNElF2zHiKznryn0DiUGk+eez/p2qQhz+puuHw==", "dev": true, "dependencies": { - "@volar/source-map": "1.11.1" + "@volar/source-map": "2.3.0" } }, "node_modules/@volar/source-map": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", - "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.0.tgz", + "integrity": "sha512-G/228aZjAOGhDjhlyZ++nDbKrS9uk+5DMaEstjvzglaAw7nqtDyhnQAsYzUg6BMP9BtwZ59RIw5HGePrutn00Q==", "dev": true, "dependencies": { - "muggle-string": "^0.3.1" + "muggle-string": "^0.4.0" } }, "node_modules/@volar/typescript": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz", - "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.0.tgz", + "integrity": "sha512-PtUwMM87WsKVeLJN33GSTUjBexlKfKgouWlOUIv7pjrOnTwhXHZNSmpc312xgXdTjQPpToK6KXSIcKu9sBQ5LQ==", "dev": true, "dependencies": { - "@volar/language-core": "1.11.1", - "path-browserify": "^1.0.1" + "@volar/language-core": "2.3.0", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", - "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", + "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/shared": "3.5.16", + "@babel/parser": "^7.24.4", + "@vue/shared": "3.4.27", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" + "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", - "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", + "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", "dependencies": { - "@vue/compiler-core": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-core": "3.4.27", + "@vue/shared": "3.4.27" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz", - "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz", + "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==", "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/compiler-core": "3.5.16", - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16", + "@babel/parser": "^7.24.4", + "@vue/compiler-core": "3.4.27", + "@vue/compiler-dom": "3.4.27", + "@vue/compiler-ssr": "3.4.27", + "@vue/shared": "3.4.27", "estree-walker": "^2.0.2", - "magic-string": "^0.30.17", - "postcss": "^8.5.3", - "source-map-js": "^1.2.1" + "magic-string": "^0.30.10", + "postcss": "^8.4.38", + "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", - "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz", + "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==", "dependencies": { - "@vue/compiler-dom": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-dom": "3.4.27", + "@vue/shared": "3.4.27" } }, + "node_modules/@vue/devtools-api": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", + "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" + }, "node_modules/@vue/language-core": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz", - "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.21.tgz", + "integrity": "sha512-vjs6KwnCK++kIXT+eI63BGpJHfHNVJcUCr3RnvJsccT3vbJnZV5IhHR2puEkoOkIbDdp0Gqi1wEnv3hEd3WsxQ==", "dev": true, "dependencies": { - "@volar/language-core": "~1.11.1", - "@volar/source-map": "~1.11.1", - "@vue/compiler-dom": "^3.3.0", - "@vue/shared": "^3.3.0", + "@volar/language-core": "~2.3.0-alpha.15", + "@vue/compiler-dom": "^3.4.0", + "@vue/shared": "^3.4.0", "computeds": "^0.0.1", "minimatch": "^9.0.3", - "muggle-string": "^0.3.1", "path-browserify": "^1.0.1", "vue-template-compiler": "^2.7.14" }, @@ -210,49 +863,115 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", - "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz", + "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==", "dependencies": { - "@vue/shared": "3.5.16" + "@vue/shared": "3.4.27" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz", - "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz", + "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==", "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/reactivity": "3.4.27", + "@vue/shared": "3.4.27" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz", - "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz", + "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==", "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/runtime-core": "3.5.16", - "@vue/shared": "3.5.16", + "@vue/runtime-core": "3.4.27", + "@vue/shared": "3.4.27", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz", - "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz", + "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==", "dependencies": { - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-ssr": "3.4.27", + "@vue/shared": "3.4.27" }, "peerDependencies": { - "vue": "3.5.16" + "vue": "3.4.27" } }, "node_modules/@vue/shared": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", - "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==" + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", + "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" + }, + "node_modules/@vue/tsconfig": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.5.1.tgz", + "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", + "dev": true + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ant-design-vue": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-4.2.3.tgz", + "integrity": "sha512-kqGyWvZtFlSInFP93Ow6wS8LzEsxxUgpI+ZY5jQQkuX8WAcqdwXCA7IcHMpECW6JB89DZMo2Bw85jUg2SjlgQA==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^7.0.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.5.0", + "@emotion/hash": "^0.9.0", + "@emotion/unitless": "^0.8.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "csstype": "^3.1.1", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "stylis": "^4.1.3", + "throttle-debounce": "^5.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-vue" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" }, "node_modules/balanced-match": { "version": "1.0.2", @@ -269,23 +988,79 @@ "balanced-match": "^1.0.0" } }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, "node_modules/computeds": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", "dev": true }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/core-js": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/dayjs": { + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", "dev": true }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==" + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -297,10 +1072,23 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, "bin": { @@ -310,348 +1098,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/estree-walker": { @@ -673,26 +1142,12 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } + "optional": true }, "node_modules/he": { "version": "1.2.0", @@ -703,33 +1158,197 @@ "he": "bin/he" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "optional": true, "dependencies": { - "hasown": "^2.0.2" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/less": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.3.0.tgz", + "integrity": "sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", + "dev": true, + "engines": { + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -742,15 +1361,15 @@ } }, "node_modules/muggle-string": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", - "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "dev": true }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -764,27 +1383,175 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/nanopop": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.4.2.tgz", + "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==" + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-all2": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.0.tgz", + "integrity": "sha512-wA7yVIkthe6qJBfiJ2g6aweaaRlw72itsFGF6HuwCHKwtwAx/4BY1vVpk6bw6lS8RLMsexoasOkd0aYOmsFG7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.3", + "memorystream": "^0.3.1", + "minimatch": "^9.0.0", + "pidtree": "^0.6.0", + "read-package-json-fast": "^3.0.2", + "shell-quote": "^1.7.3" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0", + "npm": ">= 8" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persistedstate": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.1.tgz", + "integrity": "sha512-MK++8LRUsGF7r45PjBFES82ISnPzyO6IZx3CH5vyPseFLZCk1g2kgx6l/nW8pEBKxxd4do0P6bJw+mUSZIEZUQ==", + "peerDependencies": { + "pinia": "^2.0.0" + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } }, "node_modules/postcss": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", - "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -800,53 +1567,105 @@ } ], "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "fsevents": "~2.3.2" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "optional": true + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -855,62 +1674,123 @@ "node": ">=10" } }, - "node_modules/source-map-js": { + "node_modules/shallow-equal": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { - "node": ">= 0.4" - }, + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/vite": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.11.tgz", - "integrity": "sha512-K/jGKL/PgbIgKCiJo5QbASQhFiV02X9Jh+Qq0AKCRCRKZtOTVi4t6wh75FDpGf2N9rYOnzH87OEFQNaFy6pdxQ==", + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.13.tgz", + "integrity": "sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==", "dev": true, "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -923,6 +1803,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -937,16 +1820,22 @@ } } }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, "node_modules/vue": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz", - "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", + "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", "dependencies": { - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-sfc": "3.5.16", - "@vue/runtime-dom": "3.5.16", - "@vue/server-renderer": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-dom": "3.4.27", + "@vue/compiler-sfc": "3.4.27", + "@vue/runtime-dom": "3.4.27", + "@vue/server-renderer": "3.4.27", + "@vue/shared": "3.4.27" }, "peerDependencies": { "typescript": "*" @@ -957,6 +1846,39 @@ } } }, + "node_modules/vue-i18n": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.13.1.tgz", + "integrity": "sha512-mh0GIxx0wPtPlcB1q4k277y0iKgo25xmDPWioVVYanjPufDBpvu5ySTjP5wOrSvlYQ2m1xI+CFhGdauv/61uQg==", + "dependencies": { + "@intlify/core-base": "9.13.1", + "@intlify/shared": "9.13.1", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.3.tgz", + "integrity": "sha512-8Q+u+WP4N2SXY38FDcF2H1dUEbYVHVPtPCPZj/GTZx8RCbiB8AtJP9+YIxn4Vs0svMTNQcLIzka4GH7Utkx9xQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.1" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/vue-template-compiler": { "version": "2.7.16", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", @@ -968,13 +1890,13 @@ } }, "node_modules/vue-tsc": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz", - "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.21.tgz", + "integrity": "sha512-E6x1p1HaHES6Doy8pqtm7kQern79zRtIewkf9fiv7Y43Zo4AFDS5hKi+iHi2RwEhqRmuiwliB1LCEFEGwvxQnw==", "dev": true, "dependencies": { - "@volar/typescript": "~1.11.1", - "@vue/language-core": "1.8.27", + "@volar/typescript": "~2.3.0-alpha.15", + "@vue/language-core": "2.0.21", "semver": "^7.5.4" }, "bin": { @@ -983,6 +1905,43 @@ "peerDependencies": { "typescript": "*" } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } } } } diff --git a/frontend/package.json b/frontend/package.json index e65d0ef..4a162c9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,21 +1,34 @@ { - "name": "frontend", - "private": true, + "name": "js", "version": "0.0.0", + "private": true, "type": "module", "scripts": { - "dev": "vite", - "build": "vue-tsc --noEmit && vite build", - "preview": "vite preview" + "dev": "vite --port 7777", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build --force" }, "dependencies": { - "vue": "^3.2.37" + "@ant-design/icons-vue": "^7.0.1", + "ant-design-vue": "^4.2.3", + "pinia": "^2.1.7", + "pinia-plugin-persistedstate": "^3.2.1", + "vue": "^3.4.21", + "vue-i18n": "^9.13.1", + "vue-router": "^4.3.0" }, "devDependencies": { - "@vitejs/plugin-vue": "^3.0.3", - "typescript": "^4.6.4", - "vite": "^3.0.7", - "vue-tsc": "^1.8.27", - "@babel/types": "^7.18.10" + "@tsconfig/node20": "^20.1.4", + "@types/node": "^20.12.5", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/tsconfig": "^0.5.1", + "less": "^4.3.0", + "less-loader": "^12.2.0", + "npm-run-all2": "^6.1.2", + "typescript": "~5.4.0", + "vite": "^5.2.8", + "vue-tsc": "^2.0.11" } } diff --git a/frontend/package.json.md5 b/frontend/package.json.md5 index 706e5db..e8f60bf 100755 --- a/frontend/package.json.md5 +++ b/frontend/package.json.md5 @@ -1 +1 @@ -bb7ffb87329c9ad4990374471d4ce9a4 \ No newline at end of file +5b1aa7f7c882c7e08d0d390c73602d71 \ No newline at end of file diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d2c771edb1b37bc3b665d2ea1615ab7fb7ac07bf GIT binary patch literal 1897 zcmV-v2bTDWP)o?2ouN~3 zP{h_UQ=phFKRVby=-8sLP!$RCQ-MtXSbhv(2?mpp#QZRu?CyK_^pCuy%VQx_@64Nh zyL<0B-}B?1^F4|?SS1xzK428^AaFl06)12YfEJ($H~}06J_0U9!Xdjq+3F4yPXv|# zmB1Ll-;c}$a0U1WuoE~H35T5j8$d}#RRK^9{0tb$S6iP0A(VatF-?(hsDA(@6;-%a zuLb4;KEB?vfdjyEK%EzaFOBkPz?;DL0G&>tf@?~t^Gd0UN~wCKRExVekmigA#sbrU zv%%uB|6IFJcl}Sxvw0%$C!j2i;x4V#VZUYV%FYTL4-OgBICSuU_?4@T1KT^hM<*OJ z+P3W}0wp4p1A{&1Cj);376WxRg}{w@4KUwx&}gNOW@curE1xj#z~DnX ztM=8bt@r!;9Cq;FLH)+Ynn7h#?~ATn@$F+0wb~z$Vidt z0IvZrM#3RG31Bj?+mr1^Yqg`Kc+}H>`@?TKQ$5zv(ShIZCp$aa8zun=*PhV7er3~- z9b@uQzOjxmKlK>a1UwoEhmQJO>z@TGZpa*^js)`tFMntAnr82<2?PT8{r+2C>*7&G z^1-2_^(`IU3$wGcwk2$*7#N+hFBeDzi_7+Dx58C=6D~6|W8J=*we@#ev|Q^=@=Ivl zOC3OcEEXRX$nd`cw0ZW=1IBB&ypFlSdaVwZPZ)O~8S{RWiyK!v<sZ1*S^z|5*2(spx>iFJ+C-%k@iA5>8G%&+*8%wI6TXV7k$J1Et0H$Q_Qoqu^ z*@)Z=5qegNdzwtWPU!h*bJrBs7QZjp5p0EiA7 zGAIVH`LBPsPM@pyH#D_$@7}z+&u^ALCP=M9IijRf!C|HJ&PX`a-lu$NKq>Wo;056K zDBS>%o0Dw=agVMXD_vHdyL36fwDO5rj**8&=>icsR8mp30cZy)Q0NiB7Yen^b!o7q zqUwU%3uXcph-?=z+t2LZCQzgLD#Xppa>+z6CC>)6b$q$T2#b{7^?TI1`_eR@tIo#qDODx-Q=1ng7##`@fsoq~%_3T{@&2962meu6fY%nMh z)HM+^NJP3ood?dDL`;;=dRb{-705-cRe```BC2z3@R8*b$SbMU&={Gu z@6abRRg4gpEmSu=RgcZ@Hu32G1rJTHJ$vEPw%(p-dq!sV)wpez2z<)}U>C5}ckM!*2^N>N z0SkZu|EotTmKDg@84kVDboRoh4V5#ewXAsZ@r0}Vmb~&iWs^+FxG^%lw503f$fcI% z_O4$TBR}*IlUCq`NH}yUSqDx5e{qSU&uz!27cH380`p6%MFby z9mhQBp?(I~0UYyEvf;pXU^ZYf{MPa*lkVMiss8G)u4wPwh}e%j@a>bUpQ(=Dt|z~^ zz9!@SBd4Zy_w+nxjLc5MJC6fDiiAU#y#N48T~AEXTGhIB;T{ng2E?>hdn})|H#a+Q zy09Rxd0=ji4bamQ^Id7YmfzJKElt>VrJHbhY4BYHo&ai-^jxK(PqMKj zz2OHbbnp4CCZ~(QQ^4LxI3)cICZ)hS7tGfkObqa`n_q`gmG?KA-32TMmZs^Lce+~L zgnJ#hd`F|12Sk#vEO9y9$XiTHUW*%me*s&8W07zu{*|U<50LS|9AJj~UIgSMyPB)? joLgD<0OxL}IJy1{5G(Oson|qV00000NkvXXu0mjf!p)&4 literal 0 HcmV?d00001 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 86cde97..4e65980 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,22 +1,83 @@ - - + diff --git a/frontend/src/assets/base.css b/frontend/src/assets/base.css new file mode 100644 index 0000000..dfa90a4 --- /dev/null +++ b/frontend/src/assets/base.css @@ -0,0 +1,36 @@ +/* color palette from */ + + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/frontend/src/assets/fonts/OFL.txt b/frontend/src/assets/fonts/OFL.txt deleted file mode 100644 index 9cac04c..0000000 --- a/frontend/src/assets/fonts/OFL.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2016 The Nunito Project Authors (contact@sansoxygen.com), - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/src/assets/fonts/nunito-v16-latin-regular.woff2 b/frontend/src/assets/fonts/nunito-v16-latin-regular.woff2 deleted file mode 100644 index 2f9cc5964455b8f5ca989db989250dbebb1a5f66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18972 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

``Cl35~rb|Fd`a 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�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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css new file mode 100644 index 0000000..f0f4472 --- /dev/null +++ b/frontend/src/assets/main.css @@ -0,0 +1,47 @@ +@import './base.css'; + + +#nav.ant-menu-horizontal>.ant-menu-item:after,#nav.ant-menu-horizontal { + bottom: auto; +} + +.root-view { + padding: 8px; +} + +.form-input-number { + width: 50%; + min-width: 80px; +} + +.disabled-router-link { + pointer-events: none; +} + +.main-view { + padding-right: 8px; + padding-left: 8px; + max-height: calc(100vh - 70px); + overflow: auto; + margin: auto; +} + +.bw-list-panel-content { + min-width: 600px; + max-width: 60%; + margin: auto; +} + +.disabled-div { + pointer-events: none; + opacity: 0.4; +} + +.middle-of-screen { + margin: 0; + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} \ No newline at end of file diff --git a/frontend/src/components/HelloWorld.vue b/frontend/src/components/HelloWorld.vue deleted file mode 100644 index 3ab3df7..0000000 --- a/frontend/src/components/HelloWorld.vue +++ /dev/null @@ -1,71 +0,0 @@ - - - - - diff --git a/frontend/src/components/Logo.vue b/frontend/src/components/Logo.vue new file mode 100644 index 0000000..2c5cde6 --- /dev/null +++ b/frontend/src/components/Logo.vue @@ -0,0 +1,35 @@ + + + diff --git a/frontend/src/components/NotImplemented.vue b/frontend/src/components/NotImplemented.vue new file mode 100644 index 0000000..87c23e5 --- /dev/null +++ b/frontend/src/components/NotImplemented.vue @@ -0,0 +1,53 @@ + + + diff --git a/frontend/src/components/PageNotFound.vue b/frontend/src/components/PageNotFound.vue new file mode 100644 index 0000000..3789eba --- /dev/null +++ b/frontend/src/components/PageNotFound.vue @@ -0,0 +1,44 @@ + + + diff --git a/frontend/src/components/admin/Dashboard.vue b/frontend/src/components/admin/Dashboard.vue new file mode 100644 index 0000000..441daa2 --- /dev/null +++ b/frontend/src/components/admin/Dashboard.vue @@ -0,0 +1,465 @@ + + + + diff --git a/frontend/src/components/admin/domains/Add.vue b/frontend/src/components/admin/domains/Add.vue new file mode 100644 index 0000000..1ca40f9 --- /dev/null +++ b/frontend/src/components/admin/domains/Add.vue @@ -0,0 +1,120 @@ + + + + diff --git a/frontend/src/components/admin/domains/DKIM.vue b/frontend/src/components/admin/domains/DKIM.vue new file mode 100644 index 0000000..89a8ed4 --- /dev/null +++ b/frontend/src/components/admin/domains/DKIM.vue @@ -0,0 +1,156 @@ + + + + diff --git a/frontend/src/components/admin/domains/IncomingRules.vue b/frontend/src/components/admin/domains/IncomingRules.vue new file mode 100644 index 0000000..0a9ab3a --- /dev/null +++ b/frontend/src/components/admin/domains/IncomingRules.vue @@ -0,0 +1,61 @@ + + + diff --git a/frontend/src/components/admin/domains/MailsPermDeletion.vue b/frontend/src/components/admin/domains/MailsPermDeletion.vue new file mode 100644 index 0000000..2f77cdc --- /dev/null +++ b/frontend/src/components/admin/domains/MailsPermDeletion.vue @@ -0,0 +1,344 @@ + + + + diff --git a/frontend/src/components/admin/domains/Migration.vue b/frontend/src/components/admin/domains/Migration.vue new file mode 100644 index 0000000..0d51772 --- /dev/null +++ b/frontend/src/components/admin/domains/Migration.vue @@ -0,0 +1,151 @@ + + + + diff --git a/frontend/src/components/admin/domains/OutgoingRules.vue b/frontend/src/components/admin/domains/OutgoingRules.vue new file mode 100644 index 0000000..8f554f9 --- /dev/null +++ b/frontend/src/components/admin/domains/OutgoingRules.vue @@ -0,0 +1,68 @@ + + + diff --git a/frontend/src/components/admin/domains/SharedAddressBooks.vue b/frontend/src/components/admin/domains/SharedAddressBooks.vue new file mode 100644 index 0000000..3b2821e --- /dev/null +++ b/frontend/src/components/admin/domains/SharedAddressBooks.vue @@ -0,0 +1,25 @@ + + diff --git a/frontend/src/components/admin/domains/SharedCalendars.vue b/frontend/src/components/admin/domains/SharedCalendars.vue new file mode 100644 index 0000000..d034d52 --- /dev/null +++ b/frontend/src/components/admin/domains/SharedCalendars.vue @@ -0,0 +1,21 @@ + + diff --git a/frontend/src/components/admin/domains/SharedFolders.vue b/frontend/src/components/admin/domains/SharedFolders.vue new file mode 100644 index 0000000..e9101b4 --- /dev/null +++ b/frontend/src/components/admin/domains/SharedFolders.vue @@ -0,0 +1,25 @@ + + diff --git a/frontend/src/components/admin/domains/cidr_access/Policy.vue b/frontend/src/components/admin/domains/cidr_access/Policy.vue new file mode 100644 index 0000000..defacae --- /dev/null +++ b/frontend/src/components/admin/domains/cidr_access/Policy.vue @@ -0,0 +1,471 @@ + + + diff --git a/frontend/src/components/admin/domains/cidr_access/Pools.vue b/frontend/src/components/admin/domains/cidr_access/Pools.vue new file mode 100644 index 0000000..aca6637 --- /dev/null +++ b/frontend/src/components/admin/domains/cidr_access/Pools.vue @@ -0,0 +1,397 @@ + + + diff --git a/frontend/src/components/admin/domains/mailstorage/Export.vue b/frontend/src/components/admin/domains/mailstorage/Export.vue new file mode 100644 index 0000000..858801a --- /dev/null +++ b/frontend/src/components/admin/domains/mailstorage/Export.vue @@ -0,0 +1,158 @@ + + + diff --git a/frontend/src/components/admin/domains/mailstorage/Mailboxes.vue b/frontend/src/components/admin/domains/mailstorage/Mailboxes.vue new file mode 100644 index 0000000..1c2849f --- /dev/null +++ b/frontend/src/components/admin/domains/mailstorage/Mailboxes.vue @@ -0,0 +1,747 @@ + + + diff --git a/frontend/src/components/admin/domains/mailstorage/Settings.vue b/frontend/src/components/admin/domains/mailstorage/Settings.vue new file mode 100644 index 0000000..7f343ac --- /dev/null +++ b/frontend/src/components/admin/domains/mailstorage/Settings.vue @@ -0,0 +1,1071 @@ + + + + diff --git a/frontend/src/components/admin/domains/resources/Categories.vue b/frontend/src/components/admin/domains/resources/Categories.vue new file mode 100644 index 0000000..bf17e3e --- /dev/null +++ b/frontend/src/components/admin/domains/resources/Categories.vue @@ -0,0 +1,328 @@ + + + + diff --git a/frontend/src/components/admin/domains/resources/Offices.vue b/frontend/src/components/admin/domains/resources/Offices.vue new file mode 100644 index 0000000..9266084 --- /dev/null +++ b/frontend/src/components/admin/domains/resources/Offices.vue @@ -0,0 +1,352 @@ + + + + diff --git a/frontend/src/components/admin/domains/resources/Resources.vue b/frontend/src/components/admin/domains/resources/Resources.vue new file mode 100644 index 0000000..3664b35 --- /dev/null +++ b/frontend/src/components/admin/domains/resources/Resources.vue @@ -0,0 +1,608 @@ + + + + diff --git a/frontend/src/components/admin/domains/userdb/Add.vue b/frontend/src/components/admin/domains/userdb/Add.vue new file mode 100644 index 0000000..e795035 --- /dev/null +++ b/frontend/src/components/admin/domains/userdb/Add.vue @@ -0,0 +1,115 @@ + + + + diff --git a/frontend/src/components/admin/domains/userdb/Groups.vue b/frontend/src/components/admin/domains/userdb/Groups.vue new file mode 100644 index 0000000..8583d6f --- /dev/null +++ b/frontend/src/components/admin/domains/userdb/Groups.vue @@ -0,0 +1,434 @@ + + + diff --git a/frontend/src/components/admin/domains/userdb/Redirects.vue b/frontend/src/components/admin/domains/userdb/Redirects.vue new file mode 100644 index 0000000..6dd19e1 --- /dev/null +++ b/frontend/src/components/admin/domains/userdb/Redirects.vue @@ -0,0 +1,245 @@ + + + diff --git a/frontend/src/components/admin/domains/userdb/Settings.vue b/frontend/src/components/admin/domains/userdb/Settings.vue new file mode 100644 index 0000000..a328157 --- /dev/null +++ b/frontend/src/components/admin/domains/userdb/Settings.vue @@ -0,0 +1,812 @@ + + + + diff --git a/frontend/src/components/admin/domains/userdb/Users.vue b/frontend/src/components/admin/domains/userdb/Users.vue new file mode 100644 index 0000000..1573fee --- /dev/null +++ b/frontend/src/components/admin/domains/userdb/Users.vue @@ -0,0 +1,294 @@ + + + diff --git a/frontend/src/components/admin/security/BlockedIPs.vue b/frontend/src/components/admin/security/BlockedIPs.vue new file mode 100644 index 0000000..11238a7 --- /dev/null +++ b/frontend/src/components/admin/security/BlockedIPs.vue @@ -0,0 +1,164 @@ + + + + diff --git a/frontend/src/components/admin/security/black_list/Email.vue b/frontend/src/components/admin/security/black_list/Email.vue new file mode 100644 index 0000000..2f308df --- /dev/null +++ b/frontend/src/components/admin/security/black_list/Email.vue @@ -0,0 +1,215 @@ + + + + diff --git a/frontend/src/components/admin/security/black_list/IP.vue b/frontend/src/components/admin/security/black_list/IP.vue new file mode 100644 index 0000000..d1b91da --- /dev/null +++ b/frontend/src/components/admin/security/black_list/IP.vue @@ -0,0 +1,213 @@ + + + + diff --git a/frontend/src/components/admin/security/white_list/Email.vue b/frontend/src/components/admin/security/white_list/Email.vue new file mode 100644 index 0000000..081181e --- /dev/null +++ b/frontend/src/components/admin/security/white_list/Email.vue @@ -0,0 +1,215 @@ + + + + diff --git a/frontend/src/components/admin/security/white_list/IP.vue b/frontend/src/components/admin/security/white_list/IP.vue new file mode 100644 index 0000000..3acd126 --- /dev/null +++ b/frontend/src/components/admin/security/white_list/IP.vue @@ -0,0 +1,213 @@ + + + + diff --git a/frontend/src/components/admin/settings/AddressRules.vue b/frontend/src/components/admin/settings/AddressRules.vue new file mode 100644 index 0000000..53abca4 --- /dev/null +++ b/frontend/src/components/admin/settings/AddressRules.vue @@ -0,0 +1,50 @@ + + + diff --git a/frontend/src/components/admin/settings/Calendars.vue b/frontend/src/components/admin/settings/Calendars.vue new file mode 100644 index 0000000..5132f4b --- /dev/null +++ b/frontend/src/components/admin/settings/Calendars.vue @@ -0,0 +1,110 @@ + + + + diff --git a/frontend/src/components/admin/settings/License.vue b/frontend/src/components/admin/settings/License.vue new file mode 100644 index 0000000..5f42ca7 --- /dev/null +++ b/frontend/src/components/admin/settings/License.vue @@ -0,0 +1,272 @@ + + + + diff --git a/frontend/src/components/admin/settings/Main.vue b/frontend/src/components/admin/settings/Main.vue new file mode 100644 index 0000000..0c30fa6 --- /dev/null +++ b/frontend/src/components/admin/settings/Main.vue @@ -0,0 +1,1010 @@ + + + diff --git a/frontend/src/components/admin/settings/SettingsDB.vue b/frontend/src/components/admin/settings/SettingsDB.vue new file mode 100644 index 0000000..bd281ec --- /dev/null +++ b/frontend/src/components/admin/settings/SettingsDB.vue @@ -0,0 +1,257 @@ + + + + diff --git a/frontend/src/components/admin/settings/smtp_queue/Manage.vue b/frontend/src/components/admin/settings/smtp_queue/Manage.vue new file mode 100644 index 0000000..7e6ac1d --- /dev/null +++ b/frontend/src/components/admin/settings/smtp_queue/Manage.vue @@ -0,0 +1,388 @@ + + diff --git a/frontend/src/components/admin/settings/smtp_queue/Settings.vue b/frontend/src/components/admin/settings/smtp_queue/Settings.vue new file mode 100644 index 0000000..b4a2451 --- /dev/null +++ b/frontend/src/components/admin/settings/smtp_queue/Settings.vue @@ -0,0 +1,304 @@ + + + + diff --git a/frontend/src/components/common/AddressBooks.vue b/frontend/src/components/common/AddressBooks.vue new file mode 100644 index 0000000..3d72446 --- /dev/null +++ b/frontend/src/components/common/AddressBooks.vue @@ -0,0 +1,815 @@ + + + diff --git a/frontend/src/components/common/Calendars.vue b/frontend/src/components/common/Calendars.vue new file mode 100644 index 0000000..8f58465 --- /dev/null +++ b/frontend/src/components/common/Calendars.vue @@ -0,0 +1,475 @@ + + + diff --git a/frontend/src/components/common/CalendarsAccess.vue b/frontend/src/components/common/CalendarsAccess.vue new file mode 100644 index 0000000..af99748 --- /dev/null +++ b/frontend/src/components/common/CalendarsAccess.vue @@ -0,0 +1,504 @@ + + + diff --git a/frontend/src/components/common/SharedFolders.vue b/frontend/src/components/common/SharedFolders.vue new file mode 100644 index 0000000..76f1728 --- /dev/null +++ b/frontend/src/components/common/SharedFolders.vue @@ -0,0 +1,755 @@ + + + diff --git a/frontend/src/components/common/TimezoneSelect.vue b/frontend/src/components/common/TimezoneSelect.vue new file mode 100644 index 0000000..628ccea --- /dev/null +++ b/frontend/src/components/common/TimezoneSelect.vue @@ -0,0 +1,40 @@ + + diff --git a/frontend/src/components/common/WorkDaysSelect.vue b/frontend/src/components/common/WorkDaysSelect.vue new file mode 100644 index 0000000..2cb5caa --- /dev/null +++ b/frontend/src/components/common/WorkDaysSelect.vue @@ -0,0 +1,36 @@ + + diff --git a/frontend/src/components/common/WorkHoursRangePicker.vue b/frontend/src/components/common/WorkHoursRangePicker.vue new file mode 100644 index 0000000..6afc936 --- /dev/null +++ b/frontend/src/components/common/WorkHoursRangePicker.vue @@ -0,0 +1,6 @@ + + diff --git a/frontend/src/components/common/approval/Day.vue b/frontend/src/components/common/approval/Day.vue new file mode 100644 index 0000000..ef9ba98 --- /dev/null +++ b/frontend/src/components/common/approval/Day.vue @@ -0,0 +1,118 @@ + + diff --git a/frontend/src/components/common/approval/Interval.vue b/frontend/src/components/common/approval/Interval.vue new file mode 100644 index 0000000..d24ca14 --- /dev/null +++ b/frontend/src/components/common/approval/Interval.vue @@ -0,0 +1,66 @@ + + + + diff --git a/frontend/src/components/common/rules/Actions.vue b/frontend/src/components/common/rules/Actions.vue new file mode 100644 index 0000000..4dace56 --- /dev/null +++ b/frontend/src/components/common/rules/Actions.vue @@ -0,0 +1,74 @@ + + + diff --git a/frontend/src/components/common/rules/Conditions.vue b/frontend/src/components/common/rules/Conditions.vue new file mode 100644 index 0000000..7c729b8 --- /dev/null +++ b/frontend/src/components/common/rules/Conditions.vue @@ -0,0 +1,91 @@ + + + diff --git a/frontend/src/components/common/rules/Rules.vue b/frontend/src/components/common/rules/Rules.vue new file mode 100644 index 0000000..9e21905 --- /dev/null +++ b/frontend/src/components/common/rules/Rules.vue @@ -0,0 +1,588 @@ + + + diff --git a/frontend/src/components/common/rules/address/Actions.vue b/frontend/src/components/common/rules/address/Actions.vue new file mode 100644 index 0000000..80fd4d0 --- /dev/null +++ b/frontend/src/components/common/rules/address/Actions.vue @@ -0,0 +1,61 @@ + + + + diff --git a/frontend/src/components/common/rules/address/Conditions.vue b/frontend/src/components/common/rules/address/Conditions.vue new file mode 100644 index 0000000..6867710 --- /dev/null +++ b/frontend/src/components/common/rules/address/Conditions.vue @@ -0,0 +1,192 @@ + + + + diff --git a/frontend/src/components/common/rules/incoming/Actions.vue b/frontend/src/components/common/rules/incoming/Actions.vue new file mode 100644 index 0000000..f7eddcf --- /dev/null +++ b/frontend/src/components/common/rules/incoming/Actions.vue @@ -0,0 +1,210 @@ + + + + diff --git a/frontend/src/components/common/rules/incoming/Conditions.vue b/frontend/src/components/common/rules/incoming/Conditions.vue new file mode 100644 index 0000000..3da96af --- /dev/null +++ b/frontend/src/components/common/rules/incoming/Conditions.vue @@ -0,0 +1,503 @@ + + + + diff --git a/frontend/src/components/common/rules/outgoing/Actions.vue b/frontend/src/components/common/rules/outgoing/Actions.vue new file mode 100644 index 0000000..d14fe12 --- /dev/null +++ b/frontend/src/components/common/rules/outgoing/Actions.vue @@ -0,0 +1,381 @@ + + + + diff --git a/frontend/src/components/common/rules/outgoing/Conditions.vue b/frontend/src/components/common/rules/outgoing/Conditions.vue new file mode 100644 index 0000000..6730c5a --- /dev/null +++ b/frontend/src/components/common/rules/outgoing/Conditions.vue @@ -0,0 +1,300 @@ + + + + diff --git a/frontend/src/components/user/AddressBooks/AvaliableToMe.vue b/frontend/src/components/user/AddressBooks/AvaliableToMe.vue new file mode 100644 index 0000000..b1e944a --- /dev/null +++ b/frontend/src/components/user/AddressBooks/AvaliableToMe.vue @@ -0,0 +1,176 @@ + + + + diff --git a/frontend/src/components/user/AddressBooks/MyBooks.vue b/frontend/src/components/user/AddressBooks/MyBooks.vue new file mode 100644 index 0000000..da1b65a --- /dev/null +++ b/frontend/src/components/user/AddressBooks/MyBooks.vue @@ -0,0 +1,23 @@ + + diff --git a/frontend/src/components/user/Calendars/AvaliableToMe.vue b/frontend/src/components/user/Calendars/AvaliableToMe.vue new file mode 100644 index 0000000..babb382 --- /dev/null +++ b/frontend/src/components/user/Calendars/AvaliableToMe.vue @@ -0,0 +1,176 @@ + + + + diff --git a/frontend/src/components/user/Calendars/EventsPlanner/List.vue b/frontend/src/components/user/Calendars/EventsPlanner/List.vue new file mode 100644 index 0000000..783723a --- /dev/null +++ b/frontend/src/components/user/Calendars/EventsPlanner/List.vue @@ -0,0 +1,360 @@ + + + + diff --git a/frontend/src/components/user/Calendars/EventsPlanner/NewOrEdit.vue b/frontend/src/components/user/Calendars/EventsPlanner/NewOrEdit.vue new file mode 100644 index 0000000..c3b5273 --- /dev/null +++ b/frontend/src/components/user/Calendars/EventsPlanner/NewOrEdit.vue @@ -0,0 +1,1430 @@ + + + + diff --git a/frontend/src/components/user/Calendars/EventsPlanner/ScriptErrorNotify.vue b/frontend/src/components/user/Calendars/EventsPlanner/ScriptErrorNotify.vue new file mode 100644 index 0000000..41f6bf9 --- /dev/null +++ b/frontend/src/components/user/Calendars/EventsPlanner/ScriptErrorNotify.vue @@ -0,0 +1,90 @@ + + diff --git a/frontend/src/components/user/Calendars/MyCalendars.vue b/frontend/src/components/user/Calendars/MyCalendars.vue new file mode 100644 index 0000000..0cf3d84 --- /dev/null +++ b/frontend/src/components/user/Calendars/MyCalendars.vue @@ -0,0 +1,23 @@ + + diff --git a/frontend/src/components/user/Calendars/ShareFreeTime.vue b/frontend/src/components/user/Calendars/ShareFreeTime.vue new file mode 100644 index 0000000..58c640b --- /dev/null +++ b/frontend/src/components/user/Calendars/ShareFreeTime.vue @@ -0,0 +1,255 @@ + + + + diff --git a/frontend/src/components/user/IncomingRules.vue b/frontend/src/components/user/IncomingRules.vue new file mode 100644 index 0000000..a14fdeb --- /dev/null +++ b/frontend/src/components/user/IncomingRules.vue @@ -0,0 +1,55 @@ + + + diff --git a/frontend/src/components/user/MailboxSharedAccess.vue b/frontend/src/components/user/MailboxSharedAccess.vue new file mode 100644 index 0000000..6e2bd58 --- /dev/null +++ b/frontend/src/components/user/MailboxSharedAccess.vue @@ -0,0 +1,345 @@ + + + + diff --git a/frontend/src/components/user/Profile.vue b/frontend/src/components/user/Profile.vue new file mode 100644 index 0000000..a6915fc --- /dev/null +++ b/frontend/src/components/user/Profile.vue @@ -0,0 +1,277 @@ + + + diff --git a/frontend/src/components/user/RecoveryFolder.vue b/frontend/src/components/user/RecoveryFolder.vue new file mode 100644 index 0000000..a123b12 --- /dev/null +++ b/frontend/src/components/user/RecoveryFolder.vue @@ -0,0 +1,84 @@ + + + + diff --git a/frontend/src/components/user/SharedFolders.vue b/frontend/src/components/user/SharedFolders.vue new file mode 100644 index 0000000..1762cbf --- /dev/null +++ b/frontend/src/components/user/SharedFolders.vue @@ -0,0 +1,23 @@ + + diff --git a/frontend/src/composables/alert.ts b/frontend/src/composables/alert.ts new file mode 100644 index 0000000..2f171ad --- /dev/null +++ b/frontend/src/composables/alert.ts @@ -0,0 +1,27 @@ +import { notification } from "ant-design-vue"; +import i18n from "@/locale"; + +notification.config({ + maxCount: 1, +}); + +export function notifyError(msg: string) { + notification["error"]({ + message: i18n.global.t("common.notify.error"), + description: msg, + }); +} + +export function notifySuccess(msg: string) { + notification["success"]({ + message: i18n.global.t("common.notify.success"), + description: msg, + }); +} + +export function notifyWarning(msg: string) { + notification["warning"]({ + message: i18n.global.t("common.notify.warning"), + description: msg, + }); +} diff --git a/frontend/src/composables/apiFetch.ts b/frontend/src/composables/apiFetch.ts new file mode 100644 index 0000000..79c3c2e --- /dev/null +++ b/frontend/src/composables/apiFetch.ts @@ -0,0 +1,47 @@ +import { useAuthStore } from "@/stores/auth"; +import router from "@/router"; +import { RouteLogin } from "@/router/consts"; +import { useReturnToPageStore } from "@/stores/returnToPage"; +import { useRoute } from "vue-router"; + +export const apiFetch = async (request: any, opts?: any): Promise => { + if (opts && opts.body && !opts.isFormData) { + opts.body = JSON.stringify(opts.body); + } + + const headers = new Headers(); + //headers.set("Authorization", "Bearer " + useAuthStore().token); + + if (opts && !opts.isFormData) { + headers.set("Content-Type", "application/json"); + } + const resp = await fetch( + import.meta.env.VITE_API_URL + "/backend" + request, + { + headers, + credentials: "include", + ...opts, + } + ); + + const { result, total, error } = await resp.json(); + + if (resp.status != 200) { + if (resp.status == 401) { + useAuthStore().resetAuth(); + useReturnToPageStore().setPath( + router.currentRoute.value.path, + useRoute().query + ); + router.push(RouteLogin); + } + } + + return { data: result, total, error }; +}; + +export interface Response { + data: any; + total: number; + error: string; +} diff --git a/frontend/src/composables/misc.ts b/frontend/src/composables/misc.ts new file mode 100644 index 0000000..0a439ed --- /dev/null +++ b/frontend/src/composables/misc.ts @@ -0,0 +1,79 @@ +import { message } from "ant-design-vue"; +import i18n from "@/locale"; + +export const timeToDateTime = (time: any) => { + if (time == undefined) { + return; + } + var d = new Date(time); + return ( + ("0" + d.getHours()).slice(-2) + + ":" + + ("0" + d.getMinutes()).slice(-2) + + " " + + ("0" + d.getDate()).slice(-2) + + "/" + + ("0" + (d.getMonth() + 1)).slice(-2) + + "/" + + d.getFullYear() + ); +}; + +export const timeToDate = (time: any) => { + if (time == undefined) { + return; + } + var d = new Date(time); + return ( + ("0" + d.getDate()).slice(-2) + "/" + ("0" + (d.getMonth() + 1)).slice(-2) + ); +}; + +export const timeToFullDate = (time: any) => { + if (time == undefined) { + return; + } + var d = new Date(time); + return ( + ("0" + d.getDate()).slice(-2) + + "." + + ("0" + (d.getMonth() + 1)).slice(-2) + + "." + + d.getFullYear() + ); +}; + +export const copyToClipboard = (text: string) => { + navigator.clipboard.writeText(text); + message.info(i18n.global.t("common.misc.copy")); +}; + +export const genRandomString = (length: number) => { + let result = ""; + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + const charactersLength = characters.length; + let counter = 0; + while (counter < length) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + counter += 1; + } + return result; +}; + +export const getTimezoneString = () => { + let offset = new Date().getTimezoneOffset(); + offset = offset / -60; + let resStr = "UTC"; + if (offset < 0) { + resStr += "-"; + offset *= -1; + } else { + resStr += "+"; + } + if (offset < 10) { + resStr += "0"; + } + resStr += offset; + resStr += ":00"; + return resStr; +}; diff --git a/frontend/src/composables/restart.ts b/frontend/src/composables/restart.ts new file mode 100644 index 0000000..202761d --- /dev/null +++ b/frontend/src/composables/restart.ts @@ -0,0 +1,31 @@ +import { ExclamationCircleOutlined } from "@ant-design/icons-vue"; +import { Modal } from "ant-design-vue"; +import { createVNode } from "vue"; +import router from "@/router"; +import { RouteLogin } from "@/router/consts"; +import i18n from "@/locale"; +import { apiFetch } from "./apiFetch"; +import { notifyError } from "./alert"; + +export function saveAndRestart(callback: () => Promise) { + Modal.confirm({ + title: i18n.global.t("common.save_and_restart.confirm_title"), + icon: createVNode(ExclamationCircleOutlined), + content: i18n.global.t("common.save_and_restart.confirm_content"), + okText: i18n.global.t("common.save_and_restart.ok"), + cancelText: i18n.global.t("common.save_and_restart.cancel"), + async onOk() { + if (await callback()) { + const res = await apiFetch("/admin/restart", { + method: "POST", + }); + + if (res.error) { + notifyError(res.error); + return; + } + router.push(RouteLogin); + } + }, + }); +} diff --git a/frontend/src/locale/index.ts b/frontend/src/locale/index.ts new file mode 100644 index 0000000..33a16dc --- /dev/null +++ b/frontend/src/locale/index.ts @@ -0,0 +1,32 @@ +import { createI18n } from "vue-i18n"; +import { translations } from "./translations"; + +const defaultLocale = "eng"; + +export function getLocale() { + const locale = localStorage.getItem("locale"); + if (!locale) { + return defaultLocale; + } + return locale; +} + +export function setLocale(locale: any) { + localStorage.setItem("locale", locale); + i18n.global.locale.value = locale; +} + +var locale = localStorage.getItem("locale"); +if (!locale) { + locale = defaultLocale; + localStorage.setItem("locale", locale); +} + +const i18n = createI18n({ + legacy: false, + locale: locale, + fallbackLocale: defaultLocale, + messages: translations, +}); + +export default i18n; diff --git a/frontend/src/locale/translations.ts b/frontend/src/locale/translations.ts new file mode 100644 index 0000000..5b455bf --- /dev/null +++ b/frontend/src/locale/translations.ts @@ -0,0 +1,2593 @@ +import type Policy from "@/components/admin/domains/cidr_access/Policy.vue"; + +export const translations = { + eng: { + tegu: "Tegu Mail Server", + common: { + not_found: { + page_not_found: "Page not found", + return: "To home", + }, + save_and_restart: { + confirm_title: "Save settings?", + confirm_content: "Service will be restarted", + ok: "Restart service", + cancel: "Cancel", + }, + notify: { + error: "Error!", + success: "Success!", + warning: "Warning!", + }, + suffixes: { + mb: "MB", + sec: "sec", + min: "min", + hours: "hours", + bits: "bits", + }, + misc: { + copy: "Copied to clipboard", + ok: "Ok", + cancel: "Cancel", + edit: "Edit", + delete: "Delete", + search: "Search", + yes: "Yes", + no: "No", + save_changes: "Save changes", + }, + }, + login: { + title: "Login", + mail: "Email", + empty_mail: "Enter email", + pass: "Password", + empty_pass: "Enter password", + login: "Login", + error: "Auth error", + }, + shared: { + free_time: { + title: "User's free time", + }, + events_external_approval: { + title: "Free time select", + title_event_part: " for event ", + subject: "Subject", + creator: "Creator", + message: "Message", + participants: "Participants", + timezone: "Timezone", + send_button: "Send avaliable free time to creator", + desc: "Using mouse (click or hold), select all the time slots that suits you.", + success: + "Your free time information has been sent to the event creator. You will receive a notification email once the event is confirmed.", + }, + }, + user: { + title: "", + top_menu: { + search: "Search in user control panel", + logout: "Logout", + }, + left_menu: { + profile: "Profile", + rules: "Incoming rules", + recovery: "Recovery folder", + shared_folders: "Shared folders", + mailbox_shared_access: "Mailbox shared access", + address_books: "Address books", + address_books_menu: { + my: "My books", + with_access: "Available to me", + }, + calendars: "Calendars", + calendars_menu: { + my: "My calendars", + with_access: "Available to me", + share_free_time: "Share free time", + events_planner: "Planning assistant", + }, + }, + }, + admin: { + title: "Admin", + top_menu: { + search: "Search in admin control panel", + control_panel: "Control panel", + documentation: "Documentation", + logout: "Logout", + }, + left_menu: { + dashboard: "Dashboard", + dashboard_aliases: "info information status dns", + settings: "Settings", + settings_menu: { + main: "Main", + main_aliases: + "working size inbox name imap imaps smtp smtps lmtp ip port queue concurrent milter antispam antivirus master protect security ban auth ssl certificate tls version fullallowed greylist blacklist dnsbl spf empty sender dav carddav caldav reports migration", + smtp_queue: "SMTP Queue", + smtp_queue_menu: { + manage: "Manage", + manage_aliases: "queue delete message awaiting resend process", + settings: "Settings", + settings_aliases: "queue settings", + }, + settings_db: "Settings DB", + address_change: "Global address change", + address_change_aliases: "rewrite rules", + calendars: "Calendars", + calendars_aliases: "caldav dav", + license: "License", + license_aliases: "eula key", + }, + security: "Security", + security_menu: { + blocked_ips: "Blocked IPs", + blocked_ips_aliases: "unblock", + white_list: "Senders white list", + black_list: "Senders black list", + bw_list_menu: { + ip: "IP", + email: "Email", + }, + }, + domains: "Domains", + domains_menu: { + add: "Add domain", + mail_storage: "Mail storage", + mail_storage_menu: { + mailboxes: "Mailboxes", + settings: "Settings", + other: "More", + other_menu: { + delete: "Delete provider", + }, + }, + users_providers: "User DB providers", + users_providers_menu: { + add: "Add provider", + users: "Users", + groups: "Groups", + redirects: "Redirects", + settings: "Settings", + other: "More", + other_menu: { + delete: "Delete", + delete_success: "Provider deleted", + delete_title: "Delete provider?", + delete_content: "User DB provider will be deleted", + delete_ok: "OK", + delete_cancel: "Cancel", + }, + }, + shared_folders: "Shared folders", + books: "Shared address books", + calendars: "Shared calendars", + resources: "Shared resources", + resources_menu: { + resources: "Resources", + categories: "Categories", + offices: "Offices", + }, + incoming_routing: "Incoming rules", + outgoing_routing: "Outgoing rules", + dkim: "DKIM", + migrate: "Migration", + cidr_access: "Access restrict by CIDR", + cidr_access_menu: { + pools: "Access pools", + policy: "Policy", + }, + other: "More", + other_menu: { + mails_perm_deletion: "Mails permanent deletion", + rename: "Rename domain", + rename_exists: "Domain already exists", + rename_active: "Rename in progress", + delete: "Delete domain", + delete_success: "Domain deleted", + delete_title: "Delete domain?", + delete_content: "Domain and all settings will be deleted", + delete_ok: "OK", + delete_cancel: "Cancel", + }, + }, + }, + }, + components: { + admin: { + dashboard: { + license: { + title: "Tegu Enterprise Mail Server", + developer: "Developer", + version: "Version", + license: "License", + license_empty: "Not installed or empty", + license_mismatch: "Installed key and server edition mismatch", + }, + mailboxes: { + title: "Mailboxes", + license_allowed: "Allowed by license", + used: "Used", + remains: "Remains", + archived: "Archived", + used_last_month: "Used in the last month", + used_current_month: "Used in the current month", + }, + smtp_queue: { + title: "SMTP Queue", + type: "Type", + host: "Host", + }, + antispam: { + title: "Antispam/antivirus", + type: "Type", + status: "Status", + status_enabled: "Enabled", + status_disabled: "Disabled", + host: "Host", + }, + imap: { + title: "IMAP", + server: "Server", + port: "Port", + encryption: "Encryption", + auth: "Authorization", + auth_text: "Plain password / Login", + }, + smtp: { + title: "SMTP", + server: "Server", + port: "Port", + encryption: "Encryption", + auth: "Authorization", + auth_text: "Plain password / Login", + }, + dav: { + title: "DAV Services", + books: "Address books connection URL", + calendars: "Calendars connection URL", + }, + domain: { + mailstorage: "Mail storage", + userdb_providers: "User DB providers", + dns_record: "DNS recommendations", + dns_show: "show", + dns_copy: "Copy to clipboard", + }, + }, + settings: { + main: { + main: "Main", + main_content: { + ServerName: "Server name (used in SMTP hello and HELO/EHLO)", + WebInboxCn: + "A clear alias for the INBOX folder (displayed in the WEB panel)", + MsgSizeLimit: "Max. letter size", + Vardir: "FS directory for server working data", + }, + imap: "IMAP", + imap_content: { + IMAPListenIP: "IP on which to listen to the IMAP port", + IMAPListenPort: "IMAP port", + IMAPSListenPort: "IMAPS port (SSL)", + IMAPMaxClients: + "Max. number of simultaneous incoming IMAP connections", + }, + smtp: "SMTP", + smtp_content: { + SMTPListenIP: "IP on which to listen to the SMTP port", + SMTPListenPort: "SMTP port", + SMTPSListenPort: "SMTPS port (SSL)", + SMTPMaxClients: + "Max. number of simultaneous incoming SMTP connections", + }, + lmtp: "LMTP", + lmtp_content: { + LMTPDelivery: + "Enable email delivery via LMTP (otherwise it will start its own IMAP server)", + LMTPHost: "LMTP host to connect to", + LMTPPort: "LMTP port", + }, + + queue: "Message queue", + queue_content: { + QueueConcurrentJobs: "Number of concurrent SMTP queue processors", + QueueJobTtlMinutes: + "Maximum time for one SMTP queue processing pass (minutes)", + }, + + antispam: "Antispam/antivirus", + antispam_content: { + MilterScan: + "Enable antivirus and/or antispam support (milter protocol)", + MilterHostPort: + "Milter host and port for connecting to antivirus/antispam (host:port)", + MilterNetTimeout: + "Network timeout for antivirus/antispam response (sec)", + SpamScoreMimeHeader: + "Letter header name to indicate the number of spam points (set by antispam)", + }, + + auth: "Authorization", + auth_content: { + MasterUserSep: "Master user login separator", + AllowCrossDomainSharedAccess: + "Allow access to shared resources between domains (including master user)", + AuthNeedTLS: "Require TLS/SSL encryption for authorization", + AuthSecurity: "Enable authorization protection system (ban)", + FailedAuthLookupMinutes: + "Lifetime of a failed authorization attempt record (minutes)", + BanTimeMinutes: "Ban duration (minutes)", + MaxFailedAuthAttempts: + "Max. number of authorization failures before ban", + FailedAuthWhitelist: + "IP exclusion list of the authorization protection system (192.168.0.1 or 192.168.0.0/24)", + }, + + ssl: "SSL", + ssl_content: { + TLSMinVer: "Minimum TLS version for incoming connections", + SslCert: "Path to SSL certificate", + SslKey: "Path to SSL private key", + }, + mail_sending: "Mail sending", + mail_sending_content: { + RemoteTLSMinVer: + "Minimum TLS version for outgoing SMTP connections", + UseOnlySecureCiphers: "Use only secure ciphers", + SmtpAllowPlainForDomains: + "Recipient domains that are allowed to send unencrypted (one per line)", + SettQueueSendTimeoutSec: + "Maximum time to send one letter (seconds)", + }, + smtp_sessions: "SMTP sessions", + smtp_sessions_group: { + access: "Access", + greylist: "Greylist", + dnsdbl: "DNSBL", + spf: "SPF", + }, + smtp_sessions_content: { + access: { + SmtpAcl: "Enable white/black lists of IP/email senders", + FullallowedHosts: "IP list with full access (one per line)", + AllowEmptySenderForFullallowedHosts: + "Allow empty email sender for IP with full access", + }, + greylist: { + CheckGreylist: "Enable Greylist", + GreylistSkipDomains: + "Sender domain exclusion list for greylist (one per line)", + GreylistRecordLifetimeHours: "Greylist entry lifetime (hours)", + WhitelistRecordLifetimeHours: + "Greylist whitelist entry lifetime (hours)", + CleanExpiredGreyrecordsIntervalSec: + "Interval for clearing outdated greylist entries (sec)", + }, + dnsbl: { + CheckDnsbl: "Enable DNSBL checks", + DnsblListedAtThreshold: + "Number of DNSBL lists in which the sender was found to block the letter", + }, + spf: { + BlockSpfFailedSenders: + "Block emails whose senders have not passed SPF verification", + AllowSPFNoneOrNeutral: + "Allow emails for which SPF records are incorrect or missing from senders", + }, + }, + + dav_services: "DAV-services", + dav_services_content: { + DAVPortHTTP: "HTTP port", + DAVPortHTTPS: "HTTPS Port", + }, + reports: "Delivery reports", + reports_content: { + AllowNotifyExternalUsers: + "Allow delivery problem reports to be sent to external senders", + RetryBeforeNotify: + "Number of delivery attempts after which a problem report will be sent to the sender", + }, + logging: "Logging", + logging_content: { + LogConnOpenClose: "Log start and end of sessions (IMAP/SMTP)", + }, + migration: "Migrations", + migration_content: { + MigrationMode: "Enable migration mode from another server", + }, + save: "Save settings", + }, + settings_db: { + Type: "Settings DB type", + ConnParams: { + Host: "Server address", + Port: "Server port", + Db: "Database name", + User: "Username", + Pass: "Password", + MaxConn: "Maximum number of simultaneous connections", + }, + PathParams: { + DatabaseDir: "Path to the directory with the parameters database", + }, + save: "Save settings", + change: "Change type and save settings", + check: "Check connect", + check_error: "Check connect failed: ", + check_success: "Check connect success", + }, + smtp_queue: { + settings: { + Type: "Queue type", + ConnParams: { + Host: "Server address", + Port: "Server port", + Db: "Database name", + User: "Username", + Pass: "Password", + MaxConn: "Maximum number of simultaneous connections", + MaxQueueItems: "Number of emails processed per pass", + }, + PathParams: { + DatabaseDir: "Path to the directory for smtp queue files", + }, + save: "Save settings", + change: "Change type and save settings", + check: "Check connect", + check_error: "Check connect failed: ", + check_success: "Check connect success", + }, + manage: { + total: "Total messages", + new: "New messages", + resend: "Awaiting resend", + + clear_filtered: "Delete filtered messages", + process_filtered: "Proccess filtered", + clear_all: "Delete all messages", + delete_awaiting_resend: "Delete all awaiting resend", + delete_awaiting_resend_filter: "Delete filtered awaiting resend", + process_awaiting_resend: "Proccess all awaiting resend", + + process_now: "Proccess now", + delete: "Delete message", + column_sender: "Sender", + column_receiver: "Receiver", + column_added: "Added in queue", + column_will_resend: "Will be resend", + column_will_resend_now: "Now", + ok: "Ok", + cancel: "Cancel", + search: "Search message", + }, + }, + license: { + no_install: "The license is not installed", + accept: "Accept", + title: "License Info", + id: "License ID", + edition: "Tegu Edition", + valid_till: "Valid till", + valid_forever: "Forever", + max_mailbox_count: "Maximum number of mailboxes", + send_report: "Send report", + send_report_no: "No", + customer_name: "Customer name", + customer_type: "Customer type", + customer_data: "Customer data", + show_eula: "Show EULA", + load: "Load license file", + fiz_type: "Individual", + ur_type: "Legal entity", + }, + calendars: { + freebusy: "Free/Busy access by default", + showfrom: "Don't display events older than N weeks", + showto: "Don't display events newer than N weeks", + localpart: + "Local part (up to {'@'}) of the notification sender address", + success: "Settings saved", + save: "Save settings", + }, + }, + security: { + blocked_ips: { + unblock: "Unblock", + unblock_all: "Unblock all", + search: "Search IP", + unblock_found: "Unblock found IPs", + ip: "IP", + }, + bw_list_email: { + delete: "Delete", + delete_all: "Delete all", + delete_found: "Delete found", + email: "Email", + add_email: "Add email to list", + add: "Add", + add_email_placeholder: "Email", + search: "Search email", + }, + bw_list_ip: { + delete: "Delete", + delete_all: "Delete all", + delete_found: "Delete found", + ip: "IP", + add_ip: "Add IP to list", + add: "Add", + add_ip_placeholder: "IP", + search: "Search IP", + }, + }, + domains: { + add: { + Domain: "New domain", + Type: "Storage type", + create: "Create domain", + success: "Domain created", + }, + mailstorage: { + mailboxes: { + search: "Search mailbox", + storage_filter: "All storages", + clear_recovery_all: "Clear all RECOVERY folders", + clear_recovery_found: "Clear found RECOVERY folders", + change_storage: "Change storage", + change_storage_for: "Change storage for ", + change: "Change", + delete_all: "Delete all mailboxes", + delete_found: "Delete found mailboxes", + delete: "Delete", + clear_recovery: "Clear RECOVERY folder", + archive: "Block", + unarchive: "Unblock", + in_archive: "Mailbox blocked", + deleted: "Mailbox deleted", + export: "Export", + ok: "OK", + cancel: "Cancel", + col_email: "Mailbox Email", + col_msg_count: "Msg. count", + col_size: "Mailbox size", + col_quota: "Quota", + col_quota_used: "Used", + col_recovery_size: "RECOVERY size", + col_table_prefix: "Mailbox table prefix", + col_table_access_key: "Storage", + col_actions: "Actions", + rename: "Rename", + rename_exists: "Mailbox already exists", + }, + export: { + title: "Export mailbox", + catalog: "Export folder", + hostname: "Export hostname", + start_export: "Start export", + success: "Export completed. Duration: ", + }, + settings: { + panel_connect: "Connection settings", + panel_multi: "Multi-storage", + panel_additional: "Additional settings", + + multi_storage: { + conns_nums: "connections", + col_access_key: "Unique connection key", + col_hostport: "Host:port", + mailbox_distribution_pattern: "Mailbox distribution pattern", + add_connect: "Add connection", + edit_access_key: "Edit connection key", + save: "Save", + edit_connect: "Edit connection", + save_connect: "Save", + delete_action: "Delete", + edit_action: "Edit", + }, + + Type: "Mail storage type", + Host: "Server address", + Port: "Server port", + MboxesDb: "Database name", + User: "User", + Pass: "Password", + MaxConn: "Maximum number of simultaneous connections", + MailDirRoot: "Maildir root directory", + IMAPDefaultFolders: { + Archive: "Archive folder", + Drafts: "Drafts folder", + Junk: "Junk folder", + Sent: "Sent folder", + Trash: "Trash folder", + SharedRoot: "Root folder for shared folders", + Recovery: "Recovery folder", + }, + SmartHost: "Smarthost", + SmartHostFormat: `user:pass{'@'}host:port or host:port`, + RecoveryEnabled: "Enable recovery folder", + DefaultUserQuota: "Default quota", + TrashAdditionalQuota: "Additional quota for trash", + QuotaNotifyThreshold: "Notification after filling the mailbox", + + change: "Change type and save settings", + save: "Save settings", + save_success: "Save success", + check: "Check connect", + check_error: "Check connect failed: ", + check_success: "Check connect success", + }, + }, + userdb: { + add: { + Name: "Name", + Type: "Type", + create: "Create provider", + success: "Provider created", + }, + users: { + col_name: "Name", + col_email: "Email", + add: "Add user", + edit: "Edit", + delete: "Delete", + ok: "OK", + cancel: "Cancel", + add_modal: { + display_name: "Display name", + email: "Email", + alt_emails: "Alternate emails", + quota: "Quota", + password: "Password", + password_again: "Repeat password", + cancel: "Cancel", + save: "Save", + }, + }, + redirects: { + col_name: "Name", + col_email: "Email", + add: "Add redirect", + edit: "Edit", + delete: "Delete", + ok: "OK", + cancel: "Cancel", + add_modal: { + name: "Name", + email: "Email", + destinations: "Destinations", + cancel: "Cancel", + save: "Save", + }, + }, + groups: { + col_name: "Name", + col_email: "Email", + col_users_count: "Users count", + col_group_count: "Groups count", + add: "Add group", + edit: "Edit", + members: "Members", + delete: "Delete", + ok: "OK", + cancel: "Cancel", + add_modal: { + name: "Name", + email: "Email", + alt_emails: "Alternate emails", + cancel: "Cancel", + save: "Save", + }, + }, + settings: { + Name: "Name", + UseInGal: "Use in GAL", + Dir: "Directory path of user/group databases", + MasterUsersGroup: "Group name of master users", + CacheTTL: "Cache TTL (seconds)", + + ConnectionGroup: "Connections", + ConnectURIs: "LDAP connection URIs (one per line)", + ConnectBindDN: "BindDN", + ConnectPassword: "Password", + ConnectBaseDN: "Base DN", + ConnectTLSMinVer: "Minimum TLS version for outgoing connections", + + UserGroup: "Users", + UserObjectclass: "objectClass for user", + UserMailAttr: "Attr for mailbox e-mail", + UserQuotaAttr: "Attr for mailbox quota (value in MB)", + MemberofAttr: "User memberOf attr", + UserAddSearchFilter: "Additional user search filter", + + GroupsGroup: "Groups", + EmailGroups: "Use groups", + GroupObjectclass: "objectClass for group", + GroupNameAttr: "Attr for group name", + GroupMailAttr: "Attr for group email", + GroupMemberAttr: "Attr for group members", + GroupMemberDn: "Group member attr contains DN", + UserRDNAttr: "Attr for user RDN", + GroupAddSearchFilter: "Additional group search filter", + + RedirectGroup: "Aliases (redirects)", + EmailRedirect: "Use mailbox alias (redirect list)", + AliasObjectclass: "objectClass for alias", + AliasMailAttr: "Attr for alias email", + AliasRedirectAttr: "Attr for email redirect to", + + AltEmailGroup: "Alternative emails", + EmailAlternate: "Use mailbox alternative email", + AlternateMailAttr: "Attr for mailbox alternative email", + + MasterGroup: "Master users", + MasterUserGroupNameAttr: "Attr for group name of master-users", + MasterUserGroup: "Group name of master-users", + + GALGroup: "Global Address List (GAL)", + GALCacheTTL: "GAL Cache TTL (minutes)", + GALObjectsFilter: "GAL objects filter", + + GALUserGroup: "Users", + GALUserNameAttr: "GAL attr for user name", + GALUserEmailAttr: "GAL attr for user email", + GALUserAltEmailAttr: "GAL attr for alternative user email", + GALUserPhoneAttr: "GAL attr for user phone", + GALUserPhotoAttr: "GAL attr for user photo", + GALUserBirthdayAttr: "GAL attr for user birthday", + GALUserAddressAttr: "GAL attr for user address", + GALUserOrganizationAttr: "GAL attr for user organization", + GALUserRoleAttr: "GAL attr for user role", + + GALGroupsGroup: "Groups", + GALGroupNameAttr: "GAL attr for group name", + GALGroupEmailAttr: "GAL attr for group email", + + GALAliasesGroup: "Aliases", + GALAliasNameAttr: "GAL attr for alias name", + GALAliasEmailAttr: "GAL attr for alias email", + + change: "Change type and save settings", + save: "Save settings", + save_success: "Save success", + check: "Check connect", + check_email: "Email to check", + check_error: "Check connect failed: ", + check_success: "Check connect success", + }, + }, + cidr_access: { + pools: { + col_name: "Name", + delete: "Delete", + delete_found: "Delete found", + delete_all: "Delete all", + properties: "Properties", + update_pool: "Update pool", + add_pool: "Add pool", + add_name: "Name", + add_ips: "CIDR list", + add_ips_placeholder: + "One IP per line (127.0.0.1 or 127.0.0.1/16)", + ok: "Ok", + cancel: "Cancel", + search: "Search pools", + }, + policy: { + enabled: "Enable access restrict by CIDR", + col_name: "Group", + col_count: "Active pools", + delete: "Delete", + delete_found: "Delete found", + delete_all: "Delete all", + properties: "Manage access", + add_policy: "Add access policy for group", + select_group: "Select group", + update_policy: "Update access policy for ", + ok: "Ok", + cancel: "Cancel", + search: "Search group", + }, + }, + resources: { + offices: { + col_name: "Name", + col_timezone: "Timezone", + add_office: "Add office", + edit_office: "Edit office", + create_success: "Office created", + update_success: "Office updated", + delete_success: "Office deleted", + }, + categories: { + col_name: "Name", + col_office_bind: "Office bind", + col_script: "Script", + add_category: "Add category", + edit_category: "Edit category", + create_success: "Category created", + update_success: "Category updated", + delete_success: "Category deleted", + }, + resources: { + col_name: "Name", + col_category: "Category", + col_script: "Script", + col_office: "Office", + col_show_time_as: "Show time as", + time_busy: "Busy", + time_free: "Free", + add_resource: "Add resource", + edit_resource: "Edit resource", + check_script: "Check script", + check_script_good: "No errors found", + any_category: "Any category", + any_office: "Any office", + create_success: "Resource created", + update_success: "Resource updated", + delete_success: "Resource deleted", + }, + }, + dkim: { + title: "TXT record for DNS zone", + delete: "Delete", + delete_success: "DKIM deleted", + selector: "Selector", + key_size: "Key size in bits", + create: "Create DKIM", + success: "DKIM created", + }, + migration: { + enabled: "Enable migration for this domain", + virtual_domain: "Virtual domain", + other_servers: "Other domain servers (host:port - one per line)", + local_emails: "Local emails (one per line)", + save: "Save settings", + success: "Settings saved", + }, + mails_perm_deletion: { + filter: "Mails filter", + found: "Mails found", + find: "Find mails", + delete: "Delete found mails: ", + delete_text: "Mails will be permamently deleted", + success: "Mails have been permamently deleted", + ok: "Delete", + cancel: "Cancel", + }, + }, + }, + user: { + profile: { + mailbox: { + title: "Mailbox", + user: "Email", + size: "Size", + count: "Messages", + }, + imap: { + title: "IMAP", + server: "Server", + port: "Port", + encryption: "Encryption", + auth: "Authorization", + auth_text: "Plain password / Login", + auth_login: "Login/Username", + }, + smtp: { + title: "SMTP", + server: "Server", + port: "Port", + encryption: "Encryption", + auth: "Authorization", + auth_text: "Plain password / Login", + auth_login: "Login/Username", + }, + dav: { + title: "DAV Services", + books: "Address books connection URL", + calendars: "Calendars connection URL", + login: "Login/Username", + }, + }, + recovery: { + show: "Show recovery folder", + save: "Save settings", + success: "Settings saved", + }, + mailbox_shared_access: { + search: "Search", + col_name: "Access to", + type_email: "Users", + type_email_placeholder: "Email", + type_email_add: "Add access to user", + type_group_add: "Add access to group", + add: "Add access", + type_group: "Groups", + delete: "Delete", + delete_found: "Delete found", + delete_all: "Delete all", + ok: "Ok", + cancel: "Cancel", + }, + address_books: { + with_access: { + col_name: "Name", + col_owner: "Owner", + col_permission: "Permissions", + search: "Search address book", + }, + }, + calendars: { + with_access: { + col_name: "Name", + col_owner: "Owner", + col_permission: "Permissions", + search: "Search calendar", + }, + share_free_time: { + timezone: "Timezone", + work_days: "Work days", + work_days_names: { + monday: "Monday", + tuesday: "Tuesday", + wednesday: "Wednesday", + thursday: "Thursday", + friday: "Friday", + saturday: "Saturday", + sunday: "Sunday", + }, + work_hours: "Work hours", + time_between_events: "Time between events", + two_month_restriction: "Share time no more than 2 months", + gen_link: "Generate new access link", + gen_link_success: "New link generated", + }, + events_planner: { + my_events: { + search: "Search event", + col_name: "Name", + col_start: "Start at", + col_finish: "Finish at", + col_participants: "Participants count", + status_under_approval: "Under approval", + status_approval_done: "Approval done", + new_event: "New event", + approval_with_ft: "Participants who indicated free time", + approval_without_ft: + "Participants who did not indicate their free time", + }, + script_error_notify: { + title: "Script execution error", + resource_name: "Resource name", + error: "Error", + output: "Script output", + script: "Script text", + }, + new_edit: { + subject: "Subject", + subject_placeholder: "Subject of event", + message: "Message", + message_placeholder: "Invite message", + participants: "Participants (one per line)", + include_creator: "Include me as participant", + resources: "Resources", + first_avaliable: "First avaliable", + + mandatory: "Mandatory emails", + optional: "Optional emails", + duration: "Duration", + duration_type: { + mins: "minites", + hours: "hours", + days: "days", + weeks: "weeks", + months: "months", + }, + start: "Start time", + time_not_selected: "Time not selected", + find_time: { + title: "Select available time", + start_search: "Start search", + search_from: "Search from", + depth: "Search depth", + selected_day: "Selected day", + selected_time: "Selected time", + not_found: "Free time not found", + depth_values: { + day: "Day", + week: "Week", + month: "Month", + }, + select_and_create_button: "Select time and create event", + select_and_update_button: "Select time and update event", + choose_time_button: "Submit for time approval", + choose_time_desc_part_1: + "Participants include external users. It is possible to send an event for approval and collect information about free time. ", + choose_time_desc_part_2: + "External participants without information about free time: ", + choose_time_desc_part_3: + "For all external participants there is information about free time", + choose_time_text_1: + "Send a request for time coordination to the following participants:", + choose_time_text_2: + "Each participant must respond to the request within this time:", + choose_time_text_3: + "You will receive a notification after all free time has been collected from all participants, or after the time above has expired.", + choose_time_interval: "Wait time", + choose_time_and_create_button: + "Submit for time approval and create event", + choose_time_and_update_button: + "Submit for time approval and update event", + }, + reset_warning: + "The event time has been reset. Please search for free time again", + update_button: "Update event", + update_success: "Event updated", + create_success: "Event created", + }, + }, + }, + }, + common: { + rules: { + col_enabled: "Enabled", + col_name: "Name", + col_action: "Order", + add_rule: "Add rule", + save_rule: "Save rule", + edit_rule: "Edit rule", + delete_rule: "Delete rule", + ok: "Ok", + cancel: "Cancel", + edit_name: "Name", + edit_conditions: "Conditions", + edit_conditions_all: "All", + edit_conditions_any: "Any", + edit_actions: "Actions", + add_condition: "Add condition", + add_action: "Add action", + delete: "Delete", + + incoming: { + conditions: { + op_equal: "equal", + op_less: "less", + op_greater: "greater", + op_not_equal: "not equal", + op_starts: "starts with", + op_ends: "ends with", + op_contains: "contains", + op_not_contains: "not contains", + op_greater_or_equal: "greater or equal", + op_less_or_equal: "less or equal", + + date: "Date", + to: "To", + from: "From", + header_to: "Header 'To'", + header_from: "Header 'From'", + subject: "Subject", + copy_recipient: "Copy recipient", + size: "Size", + spam_score: "Spam score", + body: "Body", + all: "All emails", + }, + actions: { + to_folder: "Put in folder", + copy_to_folder: "Copy to folder", + mark_as_seen: "Mark as read", + mark_as_flagged: "Mark flagged", + redirect_to: "Redirect to", + copy_to: "Send copy to", + reply_msg: "Reply message", + reject: "Reject", + stop: "Stop processing rules", + }, + }, + outgoing: { + conditions: { + op_contains: "contains", + op_not_contains: "not contains", + op_equal: "equal", + op_not_equal: "not equal", + op_starts: "starts with", + op_ends: "ends with", + + from: "Sender", + to: "Recipient", + from_group: "Sender group", + to_group: "Recipient group", + body: "Body", + subject: "Subject", + all: "All emails", + }, + actions: { + transform_from_address: "Transform sender email", + transform_to_address: "Transform recipient email", + transform_from_address_and_header: + "Transform sender email and header 'From'", + transform_to_address_and_header: + "Transform recipient email and header 'To'", + copy_to: "Send copy to", + premoderation: "Send to premoderation", + send_via_smart_host: "Send via smart-host", + add_text_to_start: "Add text to the start of mail body", + add_text_to_end: "Add text to the end of mail body", + + reject_external: "Reject delivery to external recipients", + reject_external_count: + "Reject delivery of more than N emails to external recipients per day", + reject_internal_count: + "Reject delivery of more than N emails to internal recipients per day", + reject_groups: "Reject delivery to group", + reject_in_group: "Reject delivery to group members", + reject_any: "Reject delivery", + allow_external: "Allow delivery to external recipients", + allow_groups: "Allow delivery to group", + allow_in_group: "Allow delivery to group members", + allow_any: "Allow delivery", + send_response: + "Notify sender with message when rule is triggered", + send_response_default: + "Your message has been modified or blocked by your email service.", + add_text_default: "Text to add", + }, + }, + address: { + conditions: { + op_contains: "contains", + op_not_contains: "not contains", + op_equal: "equal", + op_not_equal: "not equal", + op_starts: "starts with", + op_ends: "ends with", + + from: "Sender", + to: "Recipient", + from_group: "Sender group", + to_group: "Recipient group", + all: "All emails", + }, + actions: { + transform_from_address: "Transform sender address", + transform_to_address: "Transform recipient address", + }, + }, + }, + shared_folders: { + root_folder: "Root folder", + col_folder: "Folder", + col_owner: "Owner", + + edit_access: "Access", + delete: "Delete", + delete_found: "Delete found", + delete_all: "Delete all", + add_folder: "Add folder", + add_name: "Name", + ok: "Ok", + cancel: "Cancel", + search: "Search in ", + + access_search: "Search", + access_col_name: "Access to", + access_type_email: "Users", + access_type_email_placeholder: "Email", + access_type_email_add: "Add access to user", + access_type_group_add: "Add access to group", + access_add: "Add access", + access_type_group: "Groups", + }, + shared_address_books: { + col_name: "Name", + edit_access: "Access", + delete: "Delete", + delete_found: "Delete found", + delete_all: "Delete all", + properties: "Properties", + update_book: "Update book", + add_book: "Add address book", + add_name: "Name", + ok: "Ok", + cancel: "Cancel", + search: "Search address book", + + access_search: "Search", + access_col_name: "Access to", + access_col_permissions: "Permissions", + access_perm_all: "Full access", + access_perm_read: "Read only", + access_type_email: "Users", + access_type_email_placeholder: "Email", + access_type_email_add: "Add access to user", + access_type_group_add: "Add access to group", + access_add: "Add access", + access_type_group: "Groups", + }, + shared_calendars: { + col_name: "Name", + edit_access: "Access", + edit_cal_access: "Access", + delete: "Delete", + delete_found: "Delete found", + delete_all: "Delete all", + properties: "Properties", + update_calendar: "Update calendar", + add_calendar: "Add calendar", + add_name: "Name", + add_freebusy: "Provide information about busy time (Free/Busy)", + add_showfrom: "Don't display events older than N weeks", + add_showto: "Don't display events newer than N weeks", + add_color: "Color", + ok: "Ok", + cancel: "Cancel", + search: "Search calendar", + + access_search: "Search", + access_col_name: "Access to", + access_col_permissions: "Permissions", + access_perm_all: "Full access", + access_perm_read: "Read only", + access_type_email: "Users", + access_type_email_placeholder: "Email", + access_type_email_add: "Add access to user", + access_type_group_add: "Add access to group", + access_add: "Add access", + access_type_group: "Groups", + + add_success: "Access added", + update_success: "Access updated", + remove_success: "Access removed", + }, + }, + }, + eula: `ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ С КОНЕЧНЫМ ПОЛЬЗОВАТЕЛЕМ ОБ ИСПОЛЬЗОВАНИИ ПОЧТОВОГО СЕРВЕРА TEGU PROFESSIONAL/ TEGU ENTERPRISE + +Настоящее лицензионное соглашение (далее – «Соглашение») определяет условия, на которых Общество с ограниченной ответственностью «Лаборатория МБК» (далее – «МБК Лаб») предоставляет Вам право использования ПОЧТОВОГО СЕРВЕРА TEGU PROFESSIONAL/ TEGU ENTERPRISE (далее - "Программный продукт") на условиях простой (неисключительной) лицензии. Соглашение заключается в упрощенном порядке и признается надлежащим в той степени, в которой законодательство Российской Федерации допускает такое заключение договора о передаче прав на использование программ для ЭВМ (ст.1286.1 ГК РФ). Соглашение действительно, если Вы являетесь физическим или юридическим лицом, которое приобрело правомерно введенные в гражданский оборот «МБК Лаб» или с его согласия третьими лицами экземпляры Программного продукта. В этом случае Вы и «МБК Лаб» являетесь надлежащими сторонами Соглашения (далее –«Стороны»). + +ФАКТОМ ЗАГРУЗКИ ИЛИ УСТАНОВКИ В ПАМЯТЬ ЭВМ, ВОСПРОИЗВЕДЕНИЯ ИЛИ ЛЮБОЙ ДРУГОЙ ФОРМЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММ ДЛЯ ЭВМ, ОПРЕДЕЛЕННЫХ В СОГЛАШЕНИИ, ВЫ УДОСТОВЕРЯЕТЕ НАЧАЛО ИХ ИСПОЛЬЗОВАНИЯ, ЧТО ОЗНАЧАЕТ ВАШЕ СОГЛАСИЕ СО ВСЕМИ ТЕРМИНАМИ И ОПРЕДЕЛЕНИЯМИ, А ТАКЖЕ УСЛОВИЯМИ СОГЛАШЕНИЯ. + +Если Вы являетесь покупателем экземпляров программ для ЭВМ, определенных в Соглашении, и не согласны с условиями Соглашения, Вы обязуетесь незамедлительно вернуть неиспользованные экземпляры, а также удалить все копии программ для ЭВМ, определенных в Соглашении, из памяти Вашей ЭВМ и других носителей информации. + +Если Вы выражаете согласие с условиями Соглашения, «МБК Лаб» предоставляет Вам права использования Программного продукта в соответствии с нижеследующим: + +1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +1.1. Программный продукт – ПОЧТОВЫЙ СЕРВЕР TEGU PROFESSIONAL/TEGU ENTERPRISE, представляющий собой составное произведение, исключительными правами на использование которого обладает «МБК Лаб». Действие настоящего соглашения распространяется на все компоненты Программного продукта как единого целого. +1.2.Экземпляр Программного продукта - это копия Программного продукта, передаваемая по сети Интернет, право на использование которой Вам предоставляется условиями данного Соглашения. +1.3. Компоненты Программного продукта – программы для ЭВМ, являющиеся неотделимой частью Программного продукта как составного произведения. +1.4. Программный продукт является сложным объектом и содержит компоненты собственной разработки «МБК Лаб» с применением свободных библиотек, распространяемых по открытой лицензии. +1.5. Объектный код – результат обработки исходного кода компилятором. +1.6. Исходный код – текст программы для ЭВМ на языке программирования. +1.7. Модификация – внесение любых изменений в Программный продукт и его Компоненты, которые не охватывают изменения, осуществляемые исключительно в целях обеспечения функционирования Программного продукта на принадлежащих Вам ЭВМ. +1.8. Обновление – программа для ЭВМ, предназначенная для модификации Программного продукта и (или) его Компонентов в целях исправления ошибок и (или) улучшения их функциональных возможностей. +1.9. Техническое средство защиты программы – буквенно-цифровой код, необходимый для начала использования программы после установки. +1.10. Почтовый ящик - сущность (виртуальный объект) почтового сервера, предназначенная для получения, хранения и отправки электронных писем пользователем, определяемая его адресом, состоящим из двух частей: имени пользователя (логина) и имени интернет-домена, которые разделяются специальным символом {'@'} (имя_пользователя{'@'}имя_домена). +1.11. Сайт – совокупность веб-страниц, размещенных в сети Интернет, доступных по адресу www.mbk-lab.ru. + +2. СФЕРА ПРИМЕНЕНИЯ СОГЛАШЕНИЯ + +2.1. Соглашение определяет условия, на которых «МБК Лаб» предоставляет Вам право использования ПОЧТОВОГО СЕРВЕРА TEGU PROFESSIONAL/TEGU ENTERPRISE на условиях простой (неисключительной) лицензии. Данные условия также распространяются на Обновления, которые могут быть предоставлены Вам «МБК Лаб». +2.2. Соглашение устанавливает ограничения на использование Вами Компонентов Программного продукта в части, не противоречащей условиям, определенным обладателями исключительных прав на Компоненты Программного продукта. Если на основании условий, определенных правообладателями, Вы обладаете большими правами на использование Компонентов Программного продукта, то применяются условия, определенные правообладателями. Условия использования Компонентов Программного продукта размещены на сайте правообладателей таких Компонентов. +2.3. Состав и условия оказания «МБК Лаб» технической поддержки определяются отдельными соглашениями между Вами и «МБК Лаб». + +3. УСЛОВИЯ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ПРОДУКТА + +3.1. По данному Соглашению Вы приобретаете право использования Программного продукта на условиях простой (неисключительной) лицензии только для использования в собственной хозяйственной деятельности по функциональному назначению. +3.2. Вам предоставляется право: +3.2.1. Установить и использовать экземпляр Программного продукта на одной или нескольких ЭВМ (виртуальных машинах), при этом число почтовых ящиков не должно превышать указанное в документах на приобретение экземпляра Программного продукта. +3.2.2. Использовать Программный продукт на условиях ограничений авторских прав, установленных действующим российским законодательством, в том числе путем создания резервной копии Программного продукта. +3.2.3.Права, прямо не указанные в Соглашении, считаются не предоставленными. +3.2.4.По окончании периода предоставления прав использования Программного продукта Вам следует удалить установленные экземпляры Программного продукта, архивную копию Программного продукта, в случае ее изготовления, либо приобрести право использования Программного продукта на новый срок. +3.3. Вам не предоставляется право: +3.3.1. Позволять третьим лицам использовать Программный продукт или его компоненты на локальных или подключенных к сети Интернет ЭВМ, за исключением случаев, специально оговоренных документами на приобретение права использования Программного продукта. +3.3.2. Осуществлять действия, направленные на снятие ограничений использования Программного продукта, установленных техническими средствами защиты авторского права. +3.3.3. Удалять или изменять информацию об авторском праве на Программный продукт. +3.3.4. Без письменного согласия «МБК Лаб» передавать третьим лицам право использования Программного продукта, приобретенное по Соглашению. +3.3.5. Осуществлять преобразование объектного кода Программного продукта в исходный код. +3.4. «МБК Лаб» может изменить данное Лицензионного соглашения с конечным пользователем или любые его составляющие, обновив его на сайте www.mbk-lab.ru. Изменения Лицензионного соглашения с конечным пользователем распространяются на все права использования Программного продукта, которые приобретаются или продлеваются после даты изменения. + +4. ГАРАНТИЙНЫЕ ОБЯЗАТЕЛЬСТВА + +4.1. Стороны гарантируют наличие у них прав для заключения и исполнения Соглашения. При исполнении обязательств, возникших из Соглашения, Стороны обязуются не нарушать права третьих лиц. +4.2. «МБК Лаб» гарантирует, что на момент вступления Соглашения в действие является обладателем исключительных прав на Программный продукт и обладает достаточными для заключения и исполнения Соглашения правами на все Компоненты Программного продукта. +4.3. «МБК Лаб» гарантирует работу Программного продукта в соответствии с описанием, изложенным в документации, только при условии использования Вами рекомендованных системной аппаратной архитектуры и операционной системы. Перечень рекомендованных к применению системных архитектур и операционных систем опубликован на сайте www.mbk-lab.ru. +4.4. Программный продукт предоставляется на условиях «как есть» (AS IS): «МБК Лаб» не предоставляет никаких гарантий соответствия Программного продукта конкретным целям и ожиданиям, кроме заявленных функциональных характеристик, а также не предоставляет никаких иных гарантий, прямо не указанных в настоящем Соглашении. Вы принимает на себя ответственность за выбор Программного продукта с целью достижения желаемых результатов и в отношении результатов, получаемых в ходе его использования. +4.5. «МБК Лаб» ни при каких условиях не несет ответственности за какие-либо специальные, случайные, прямые или косвенные убытки, понесенные в результате использования Программного продукта. +4.6. Вы соглашаетесь с тем, что Вы несете риск в связи: +4.6.1. с выбором и использованием Программного продукта в собственной хозяйственной деятельности по функциональному назначению. +4.6.2. с внесением любых изменений, разработанных Вами или по Вашему поручению третьими лицами в Программный продукт и его Компоненты. +4.6.3. с использованием Обновлений, предоставленных третьими лицами. + +5. РАЗМЕР ВОЗНАГРАЖДЕНИЯ И СРОК ПЕРЕДАЧИ ПРАВ +5.1. Размер вознаграждения за право использования Программного продукта содержится в документах на приобретение экземпляра Программного продукта. +5.2. Права на использование Программного продукта передаются Вам на срок, определяемый документами на его приобретение и исчисляемый с момента правомерного приобретения экземпляра, но не превышающий срок действия исключительного права на Программный продукт. + +6. КОНФИДЕНЦИАЛЬНОСТЬ + +6.1. Стороны обязуются принять меры по предотвращению случайного или преднамеренного разглашения третьим лицам информации, о конфиденциальности которой Стороны специально уведомили друг друга. Стороны примут все необходимые меры для того, чтобы предотвратить полное или частичное разглашение указанных сведений или ознакомление с ними третьих лиц без взаимной письменной договоренности. +6.2. Обязательства Сторон относительно конфиденциальности информации не распространяются на общедоступную информацию, а также на случаи, когда раскрытие той или иной информации является обязательным в силу требований законодательства. + +7. ОТВЕТСТВЕННОСТЬ СТОРОН + +7.1. В случае предъявления Вам третьим лицом каких-либо претензий или исков, вызванных нарушением прав этого лица в связи с использованием Программного продукта на условиях Соглашения, Вы обязуетесь незамедлительно информировать об этом «МБК Лаб». +7.2. Если Вам стала известна какая-либо информация, указывающая на нарушение авторских прав «МБК Лаб», просим направлять указанную информацию по адресу: mbk{'@'}mbk-lab.ru. +7.3. Если ответственность за неисполнение или ненадлежащее исполнение Сторонами своих обязательств не определена Соглашением, то она устанавливается в соответствии с действующим законодательством Российской Федерации. +7.4. При возникновении обстоятельств непреодолимой силы, при которых Стороны, действующие с разумной осмотрительностью, по независящим от них причинам не могут исполнить обязательства надлежащим образом, сроки исполнения обязательств продлеваются на то время, в течение которого действуют эти обстоятельства. +7.5. Сторона освобождается от ответственности за неисполнение или ненадлежащее исполнение обязательств, если докажет, что надлежащее исполнение обязательств оказалось невозможным вследствие непреодолимой силы, при условии что она незамедлительно известила другую Сторону о таких обстоятельствах и их влиянии на исполнение обязательств, возникших из Соглашения. + +8. ПРЕКРАЩЕНИЕ СОГЛАШЕНИЯ + +«МБК Лаб» в одностороннем порядке может отказаться от исполнения Соглашения в случае использования Вами Программного продукта в целях и/или способами, не предусмотренными Соглашением. + +9. ПОРЯДОК РАЗРЕШЕНИЯ СПОРОВ + +9.1. Правом, подлежащим применению к правам и обязанностям Сторон по Соглашению, является право Российской Федерации. +9.2. Все споры, разногласия или требования, возникающие из настоящего Соглашения или в связи с ним, подлежат разрешению в процессе переговоров Сторон. +9.3. В том случае если переговоры Сторон оказались безуспешными, рассмотрение спора передается в Арбитражный суд г.Москвы. +9.4. При реорганизации одной из Сторон права и обязанности данной Стороны по Соглашению переходят к ее правопреемникам. При ликвидации одной из Сторон или ее правопреемников, к которым перешли права и обязанности данной Стороны по Соглашению, Соглашение прекращает свое действие. +9.5 В случае если компетентный суд признает какое-либо положение настоящего Соглашения недействительным, Соглашение продолжает действовать в остальной части.`, + }, + rus: { + tegu: "Почтовый сервер Tegu", + common: { + not_found: { + page_not_found: "Страница не найдена", + return: "Домой", + }, + save_and_restart: { + confirm_title: "Сохранить настройки?", + confirm_content: "Сервер будет перезапущен", + ok: "Перезапустить сервер", + cancel: "Отмена", + }, + notify: { + error: "Ошибка!", + success: "Успешно!", + warning: "Внимание!", + }, + suffixes: { + mb: "MБ", + sec: "сек", + min: "мин", + hours: "часов", + bits: "бит", + }, + misc: { + copy: "Скопировано в буфер обмена", + ok: "Ок", + cancel: "Отмена", + delete: "Удалить", + edit: "Редактировать", + search: "Поиск", + yes: "Да", + no: "Нет", + save_changes: "Сохранить изменения", + }, + }, + login: { + title: "Логин", + mail: "Email", + empty_mail: "Введите email", + pass: "Пароль", + empty_pass: "Введите пароль", + login: "Логин", + error: "Ошибка авторизации", + }, + shared: { + free_time: { + title: "Свободное время пользователя", + }, + events_external_approval: { + title: "Выбор свободного времени", + title_event_part: " для события ", + subject: "Название", + creator: "Создатель", + message: "Сообщение", + participants: "Участники", + timezone: "Часовой пояс", + send_button: "Отправить информацию об свободном времени", + desc: "Используя мышь (клик или удержание), выберите все подходящие вам временные интервалы.", + success: + "Информация о вашем свободном времени была отправлена создателю события. Как только событие будет подтверждено, вам придет письмо-уведомление.", + }, + }, + user: { + title: "", + top_menu: { + search: "Поиск в контрольной панели пользователя", + logout: "Выйти", + }, + left_menu: { + profile: "Профиль", + rules: "Правила входящих сообщений", + recovery: "Папка восстановления", + shared_folders: "Общие папки", + mailbox_shared_access: "Общий доступ к почтовому ящику", + address_books: "Адресные книги", + address_books_menu: { + my: "Мои книги", + with_access: "Доступные мне", + }, + calendars: "Календари", + calendars_menu: { + my: "Мои календари", + with_access: "Доступные мне", + share_free_time: "Поделиться свободным временем", + events_planner: "Помощник планирования", + }, + }, + }, + admin: { + title: "Панель администратора", + top_menu: { + search: "Поиск в контрольной панели администратора", + control_panel: "Контрольная панель", + documentation: "Документация", + logout: "Выйти", + }, + left_menu: { + dashboard: "Дашборд", + dashboard_aliases: "панель инфо информация статус dns", + settings: "Настройки", + settings_menu: { + main: "Основные", + main_aliases: + "рабочих размер имя порт очередь параллельных обработчиков антиспам антивирус шифрования шифрование мастер защиты защита авторизации авторизация бан бана провалы провалов исключения сертификат версия полный доступ полным доступом пустой отправитель отчётов отчёты миграция миграции inbox imap imaps smtp smtps lmtp ip milter ssl tls greylist dnsbl spf dav carddav caldav", + smtp_queue: "Очередь SMTP", + smtp_queue_menu: { + manage: "Управление", + manage_aliases: + "очередью очередь удалить письма письмо ожидающие повтора", + settings: "Настройки", + settings_aliases: "параметры очереди", + }, + settings_db: "База параметров", + address_change: "Изменения адресов", + address_change_aliases: "переписывание правила", + calendars: "Календари", + calendars_aliases: "caldav dav", + license: "Лицензия", + license_aliases: "eula ключ", + }, + security: "Безопасность", + security_menu: { + blocked_ips: "Заблокированные IP", + blocked_ips_aliases: "разблокировать", + white_list: "Белый список отправителей", + black_list: "Черный список отправителей", + bw_list_menu: { + ip: "IP", + email: "Email", + }, + }, + domains: "Домены", + domains_menu: { + add: "Добавить домен", + mail_storage: "Хранилища почты", + mail_storage_menu: { + mailboxes: "Почтовые ящики", + settings: "Настройки", + other: "Ещё", + other_menu: { + delete: "Удалить хранилище", + }, + }, + users_providers: "Провайдеры БД пользователей", + users_providers_menu: { + add: "Добавить провайдера", + users: "Пользователи", + groups: "Группы", + redirects: "Перенаправления", + settings: "Настройки", + other: "Ещё", + other_menu: { + delete: "Удалить", + delete_success: "Провайдер удален", + delete_title: "Удалить провайдер?", + delete_content: "Провайдер БД пользователей будет удален", + delete_ok: "OK", + delete_cancel: "Отмена", + }, + }, + shared_folders: "Общие папки", + books: "Общие адресные книги", + calendars: "Общие календари", + resources: "Общие ресурсы", + resources_menu: { + resources: "Ресурсы", + categories: "Категории", + offices: "Офисы", + }, + incoming_routing: "Правила входящих сообщений", + outgoing_routing: "Правила исходящих сообщений", + dkim: "DKIM", + migrate: "Миграции", + cidr_access: "Ограничение доступа по CIDR", + cidr_access_menu: { + pools: "Пулы доступа", + policy: "Политики", + }, + other: "Ещё", + other_menu: { + mails_perm_deletion: "Безвозвратное удаление писем", + rename: "Переименовать домен", + rename_exists: "Домен уже существует", + rename_active: "Переименование запущено", + delete: "Удалить домен", + delete_success: "Домен удален", + delete_title: "Удалить домен?", + delete_content: "Домен и все настройки будут удалены", + delete_ok: "OK", + delete_cancel: "Отмена", + }, + }, + }, + }, + components: { + admin: { + dashboard: { + license: { + title: "Почтовый сервер Tegu", + developer: "Разработчик", + version: "Версия", + license: "Лицензия", + license_empty: "Не установлена или отсутствует", + license_mismatch: + "Установленный ключ не соответствует редакции сервера", + }, + mailboxes: { + title: "Почтовые ящики", + license_allowed: "Всего по лицензии", + used: "Размещено на сервере", + remains: "Осталось", + archived: "В архиве", + used_last_month: "Использовано в предыдущий месяц", + used_current_month: "Использовано в текущем месяце", + }, + smtp_queue: { + title: "Очередь SMTP", + type: "Тип", + host: "Хост", + }, + antispam: { + title: "Антиспам/антивирус", + type: "Тип", + status: "Статус", + status_enabled: "Включен", + status_disabled: "Выключен", + host: "Хост", + }, + imap: { + title: "IMAP", + server: "Server", + port: "Port", + encryption: "Шифрование", + auth: "Проверка подлинности", + auth_text: "Простой пароль / Логин", + }, + smtp: { + title: "SMTP", + server: "Server", + port: "Port", + encryption: "Шифрование", + auth: "Проверка подлинности", + auth_text: "Простой пароль / Логин", + }, + dav: { + title: "DAV сервисы", + books: "Строка подключения адресных книг", + calendars: "Строка подключения календарей", + }, + domain: { + mailstorage: "Хранилище почты", + userdb_providers: "Провайдеры БД пользователей", + dns_record: "Рекомендации для зоны DNS", + dns_show: "показать", + dns_copy: "Скопировать в буфер обмена", + }, + }, + settings: { + main: { + main: "Основные", + main_content: { + ServerName: + "Имя сервера (используется в приветствии SMTP и в HELO/EHLO)", + WebInboxCn: + "Понятный псевдоним для папки INBOX (отображается в WEB-панели)", + MsgSizeLimit: "Макс. размер письма в МБ", + Vardir: "Каталог ФС для рабочих данных сервера", + }, + imap: "IMAP", + imap_content: { + IMAPListenIP: "IP, на котором слушать порт IMAP", + IMAPListenPort: "Порт IMAP", + IMAPSListenPort: "Порт IMAPS (SSL)", + IMAPMaxClients: + "Макс. количество одновременных входящих соединений IMAP", + }, + smtp: "SMTP", + smtp_content: { + SMTPListenIP: "IP, на котором слушать порт SMTP", + SMTPListenPort: "Порт SMTP", + SMTPSListenPort: "Порт SMTPS (SSL)", + SMTPMaxClients: + "Макс. количество одновременных входящих соединений SMTP", + }, + lmtp: "LMTP", + lmtp_content: { + LMTPDelivery: + "Включить доставку писем через LMTP (в противном случае будет запущен собственный сервер IMAP", + LMTPHost: "Хост LMTP, с которым будем соединяться", + LMTPPort: "Порт LMTP", + }, + + queue: "Очередь писем", + queue_content: { + QueueConcurrentJobs: + "Число параллельных обработчиков очереди SMTP", + QueueJobTtlMinutes: + "Максимальное время одного прохода обработки очереди SMTP (минут)", + }, + + antispam: "Антиспам/антивирус", + antispam_content: { + MilterScan: + "Включить поддержку антивируса и/или антиспама (протокол milter)", + MilterHostPort: + "Хост и порт milter для подключения к антивирусу/антиспаму (хост:порт)", + MilterNetTimeout: + "Сетевой таймаут ответа антивируса/антиспама (сек)", + SpamScoreMimeHeader: + "Имя заголовка письма для указания количества очков спама (устанавливается антиспамом)", + }, + + auth: "Авторизация", + auth_content: { + MasterUserSep: "Разделитель логина мастер-пользователя", + AllowCrossDomainSharedAccess: + "Разрешать входить в общие ресурсы между доменами (мастер-пользователю в том числе)", + AuthNeedTLS: "Требовать шифрования TLS/SSL для авторизации", + AuthSecurity: "Включить систему защиты авторизации (бан)", + FailedAuthLookupMinutes: + "Время жизни записи о проваленной попытке авторизации (минуты)", + BanTimeMinutes: "Длительность бана (минуты)", + MaxFailedAuthAttempts: + "Макс. количество провалов авторизации до бана", + FailedAuthWhitelist: + "Список исключения IP системы защиты авторизации (192.168.0.1 или 192.168.0.0/24)", + }, + + ssl: "SSL", + ssl_content: { + TLSMinVer: "Минимальная версия TLS для входящих соединений", + SslCert: "Путь до сертификата SSL", + SslKey: "Путь до закрытого ключа SSL", + }, + mail_sending: "Отправка писем", + mail_sending_content: { + RemoteTLSMinVer: + "Минимальная версия TLS для исходящих соединений SMTP", + UseOnlySecureCiphers: "Использовать только безопасные шифры", + SmtpAllowPlainForDomains: + "Домены получателей, для которых разрешена незашифрованная отправка (один на строку)", + SettQueueSendTimeoutSec: + "Максимальное время отправки одного письма (секунды)", + }, + smtp_sessions: "Сессии SMTP", + smtp_sessions_group: { + access: "Доступ", + greylist: "Greylist", + dnsdbl: "DNSBL", + spf: "SPF", + }, + smtp_sessions_content: { + access: { + SmtpAcl: "Включить белые/чёрный списки IP/email отправителей", + FullallowedHosts: + "Список IP с полным доступом (один на строку)", + AllowEmptySenderForFullallowedHosts: + "Разрешить пустой email отправителя для IP с полным доступом", + }, + greylist: { + CheckGreylist: "Включить Greylist", + GreylistSkipDomains: + "Список исключения доменов отправителей для greylist-а (один на строку)", + GreylistRecordLifetimeHours: + "Срок жизни записи серого списка greylist-а (часы)", + WhitelistRecordLifetimeHours: + "Срок жизни записи белого списка greylist-а (часы)", + CleanExpiredGreyrecordsIntervalSec: + "Интервал очистки устаревших записей greylist-а (сек)", + }, + dnsbl: { + CheckDnsbl: "Включить проверки DNSBL", + DnsblListedAtThreshold: + "Количество списков DNSBL в которых найден отправитель для блокировки письма", + }, + spf: { + BlockSpfFailedSenders: + "Блокировать письма, отправители которых не прошли проверку SPF", + AllowSPFNoneOrNeutral: + "Разрешить письма, для отправителей которых записи SPF неправильные, либо отсутствуют", + }, + }, + + dav_services: "DAV-сервисы (адресные книги, календари, файлы...)", + dav_services_content: { + DAVPortHTTP: "Порт HTTP", + DAVPortHTTPS: "Порт HTTPS", + }, + reports: "Отчёты о доставке", + reports_content: { + AllowNotifyExternalUsers: + "Разрешить отправку внешним отправителям отчётов о проблемах доставки", + RetryBeforeNotify: + "Количество попыток доставки, после которых отправителю будет послан отчёт о проблеме", + }, + logging: "Журналирование", + logging_content: { + LogConnOpenClose: + "Журналировать начало и конец сессий (IMAP/SMTP)", + }, + migration: "Миграция с/на другой сервера", + migration_content: { + MigrationMode: "Включить режим миграции с другого сервера", + }, + save: "Сохранить настройки", + }, + settings_db: { + Type: "Тип БД параметров", + ConnParams: { + Host: "Адрес сервера", + Port: "Порт сервера", + Db: "Имя базы данных", + User: "Имя пользователя", + Pass: "Пароль", + MaxConn: "Максимальное количество одновременных подключений", + }, + PathParams: { + DatabaseDir: "Путь до каталога с БД параметров", + }, + save: "Сохранить настройки", + change: "Сменить тип БД и сохранить настройки", + check: "Проверить соединение", + check_error: "Проверка соединения завершилась с ошибкой: ", + check_success: "Проверка соединения успешно завершена", + }, + smtp_queue: { + settings: { + Type: "Тип очереди", + ConnParams: { + Host: "Адрес сервера", + Port: "Порт сервера", + Db: "Имя базы данных", + User: "Имя пользователя", + Pass: "Пароль", + MaxConn: "Максимальное количество одновременных подключений", + MaxQueueItems: "Количество обрабатываемых писем за проход", + }, + PathParams: { + DatabaseDir: "Путь до каталога с файлами Sqlite", + }, + save: "Сохранить настройки", + change: "Сменить тип очереди и сохранить настройки", + check: "Проверить соединение", + check_error: "Проверка соединения завершилась с ошибкой: ", + check_success: "Проверка соединения успешно завершена", + }, + manage: { + total: "Всего писем", + new: "Новые письма", + resend: "Ожидающие повторную отправку", + + clear_filtered: "Удалить найденные", + process_filtered: "Обработать найденные", + clear_all: "Удалить все", + delete_awaiting_resend: "Удалить все ожидающие повтора", + delete_awaiting_resend_filter: + "Удалить найденные ожидающие повтора", + process_awaiting_resend: "Обработать все ожидающие повтора", + + process_now: "Обработать немедленно", + delete: "Удалить", + column_sender: "Отправитель", + column_receiver: "Получатель", + column_added: "Добавлено в очередь", + column_will_resend: "Будет обработано", + column_will_resend_now: "Сейчас", + ok: "ОК", + cancel: "Отмена", + search: "Найти письмо", + }, + }, + license: { + no_install: "Лицензия не установлена", + accept: "Принять соглашение", + title: "Информация о лицензии", + id: "Идентификатор лицензии", + edition: "Редакция Tegu", + valid_till: "Действие лицензии по времени", + valid_forever: "Не ограничено", + max_mailbox_count: "Максимальное количество почтовых ящиков", + send_report: "Отправлять отчет", + send_report_no: "Нет", + customer_name: "Наименование покупателя", + customer_type: "Тип покупателя", + customer_data: "Данные покупателя", + show_eula: "Показать лицензионное соглашение", + load: "Загрузить файл лицензии", + fiz_type: "Физ. лицо", + ur_type: "Юр. лицо", + }, + calendars: { + freebusy: "Доступ к Free/Busy по умолчанию", + showfrom: "Не отображать события старше N недель", + showto: "Не отображать события новее N недель", + localpart: + "Локальная часть (до {'@'}) адреса отправителя оповещений", + success: "Настройки сохранены", + save: "Сохранить настройки", + }, + }, + security: { + blocked_ips: { + unblock: "Разблокировать", + unblock_all: "Разблокировать все", + search: "Найти IP", + unblock_found: "Разблокировать найденные", + ip: "IP", + }, + bw_list_email: { + delete: "Удалить", + delete_all: "Удалить все", + delete_found: "Удалить найденные", + email: "Email", + add_email: "Добавить email в список", + add: "Добавить", + add_email_placeholder: "Email", + search: "Найти email", + }, + bw_list_ip: { + delete: "Удалить", + delete_all: "Удалить все", + delete_found: "Удалить найденные", + ip: "IP", + add_ip: "Добавить IP в список", + add: "Добавить", + add_ip_placeholder: "IP", + search: "Найти IP", + }, + }, + domains: { + add: { + Domain: "Новый домен", + Type: "Тип хранилища", + create: "Добавить домен", + success: "Домен добавлен", + }, + mailstorage: { + mailboxes: { + search: "Найти почтовый ящик", + storage_filter: "Все хранилища", + clear_recovery_all: "Очистить все RECOVERY", + clear_recovery_found: "Очистить найденные RECOVERY", + delete_all: "Удалить все почтовые ящики", + delete_found: "Удалить найденные почтовые ящики", + delete: "Удалить", + clear_recovery: "Очистить RECOVERY", + change_storage: "Сменить хранилище", + change_storage_for: "Сменить хранилище для ", + change: "Сменить", + archive: "Заблокировать", + unarchive: "Разблокировать", + in_archive: "Ящик заблокирован", + deleted: "Ящик удалён", + export: "Выгрузка", + ok: "OK", + cancel: "Отмена", + col_email: "Email ящика", + col_msg_count: "Кол-во писем", + col_size: "Размер ящика", + col_quota: "Квота", + col_quota_used: "Использовано", + col_recovery_size: "Размер RECOVERY", + col_table_prefix: "Префикс таблиц ящика", + col_table_access_key: "Хранилище", + col_actions: "Действия", + rename: "Переименовать", + rename_exists: "Такой ящик уже существует", + }, + export: { + title: "Выгрузка почтового ящика", + catalog: "Каталог выгрузки", + hostname: "Хост выгрузки", + start_export: "Начать выгрузку", + success: "Выгрузка завершена. Длительность: ", + }, + settings: { + panel_connect: "Настройки подключения", + panel_multi: "Мульти-хранилище", + panel_additional: "Дополнительные настройки", + + multi_storage: { + conns_nums: "подключений", + col_access_key: "Уникальный ключ подключения", + col_hostport: "Адрес:порт", + mailbox_distribution_pattern: "Паттерн распределения ящиков", + add_connect: "Добавить подключение", + edit_access_key: "Редактировать ключ подключения", + save: "Сохранить", + edit_connect: "Редактировать подключение", + save_connect: "Сохранить", + delete_action: "Удалить", + edit_action: "Редактировать", + }, + + Type: "Тип хранилища", + Host: "Адрес сервера", + Port: "Порт сервера", + MboxesDb: "Имя базы данных", + User: "Имя пользователя", + Pass: "Пароль", + MaxConn: "Максимальное количество одновременных подключений", + MailDirRoot: "Корневой каталог почтовых ящиков", + IMAPDefaultFolders: { + Archive: "Архивная папка", + Drafts: "Папка черновиков", + Junk: "Папка спама", + Sent: "Папка отправленных", + Trash: "Папка корзины", + SharedRoot: "Корневая папка общих папок", + Recovery: "Папка восстановления", + }, + SmartHost: "Смартхост", + SmartHostFormat: `user:pass{'@'}host:port или host:port`, + RecoveryEnabled: "Включить папку восстановления", + DefaultUserQuota: "Квота по умолчанию, МБ", + TrashAdditionalQuota: "Дополнительная квота для корзины, МБ", + QuotaNotifyThreshold: "Уведомление после заполнения ящика, %", + + change: "Сменить тип хранилища и сохранить настройки", + save: "Сохранить настройки", + save_success: "Настройки сохранены", + check: "Проверить соединение", + check_error: "Проверка соединения завершилась с ошибкой: ", + check_success: "Проверка соединения успешно завершена", + }, + }, + userdb: { + add: { + Name: "Название", + Type: "Тип провайдера", + create: "Добавить провайдер", + success: "Провайдер добавлен", + }, + users: { + col_name: "Пользователь", + col_email: "Email", + add: "Добавить пользователя", + edit: "Редактировать", + delete: "Удалить", + ok: "OK", + cancel: "Отмена", + add_modal: { + display_name: "Полное имя", + email: "Email", + alt_emails: "Дополнительные адреса email", + quota: "Квота", + password: "Пароль", + password_again: "Повтор пароля", + cancel: "Отмена", + save: "Сохранить", + }, + }, + redirects: { + col_name: "Пользователь", + col_email: "Email", + add: "Добавить перенаправление", + edit: "Редактировать", + delete: "Удалить", + ok: "OK", + cancel: "Отмена", + add_modal: { + name: "Название", + email: "Email", + destinations: "Email'ы назначения", + cancel: "Отмена", + save: "Сохранить", + }, + }, + groups: { + col_name: "Группа", + col_email: "Email", + col_users_count: "Кол-во участников", + col_group_count: "Кол-во групп", + add: "Добавить группу", + edit: "Редактировать", + members: "Участники", + delete: "Удалить", + ok: "OK", + cancel: "Отмена", + add_modal: { + name: "Name", + email: "Email", + alt_emails: "Дополнительные адреса email", + cancel: "Отмена", + save: "Сохранить", + }, + }, + settings: { + Name: "Название провайдера", + UseInGal: "Использовать источник в Глобальной адресной книге ", + Dir: "Путь до каталога БД пользователей", + MasterUsersGroup: "Название группы мастер-пользователей", + CacheTTL: "TTL кэша (секунды)", + + ConnectionGroup: "Подключения", + ConnectURIs: "Строки подключения LDAP (по одной на строку)", + ConnectBindDN: "BindDN", + ConnectPassword: "Пароль", + ConnectBaseDN: "Base DN", + ConnectTLSMinVer: + "Минимальная версия TLS для исходящих соединений", + + UserGroup: "Пользователи", + UserObjectclass: "objectClass for user", + UserMailAttr: "Attr for mailbox e-mail", + UserQuotaAttr: "Attr for mailbox quota (value in MB)", + MemberofAttr: "User memberOf attr", + UserAddSearchFilter: "Additional user search filter", + + GroupsGroup: "Группы", + EmailGroups: "Use groups", + GroupObjectclass: "objectClass for group", + GroupNameAttr: "Attr for group name", + GroupMailAttr: "Attr for group email", + GroupMemberAttr: "Attr for group members", + GroupMemberDn: "Group member attr contains DN", + UserRDNAttr: "Attr for user RDN", + GroupAddSearchFilter: "Additional group search filter", + + RedirectGroup: "Aliases (перенаправления)", + EmailRedirect: "Use mailbox alias (redirect list)", + AliasObjectclass: "objectClass for alias", + AliasMailAttr: "Attr for alias email", + AliasRedirectAttr: "Attr for email redirect to", + + AltEmailGroup: "Дополнительные emails", + EmailAlternate: "Use mailbox alternative email", + AlternateMailAttr: "Attr for mailbox alternative email", + + MasterGroup: "Мастер-пользователи", + MasterUserGroupNameAttr: "Attr for group name of master-users", + MasterUserGroup: "Group name of master-users", + + GALGroup: "Глобальная адресная книга (GAL)", + GALCacheTTL: "GAL Cache TTL (minutes)", + GALObjectsFilter: "GAL objects filter", + + GALUserGroup: "Пользователи", + GALUserNameAttr: "GAL attr for user name", + GALUserEmailAttr: "GAL attr for user email", + GALUserAltEmailAttr: "GAL attr for alternative user email", + GALUserPhoneAttr: "GAL attr for user phone", + GALUserPhotoAttr: "GAL attr for user photo", + GALUserBirthdayAttr: "GAL attr for user birthday", + GALUserAddressAttr: "GAL attr for user address", + GALUserOrganizationAttr: "GAL attr for user organization", + GALUserRoleAttr: "GAL attr for user role", + + GALGroupsGroup: "Группы", + GALGroupNameAttr: "GAL attr for group name", + GALGroupEmailAttr: "GAL attr for group email", + + GALAliasesGroup: "Aliases", + GALAliasNameAttr: "GAL attr for alias name", + GALAliasEmailAttr: "GAL attr for alias email", + + change: "Сменить тип провайдера и сохранить настройки", + save: "Сохранить настройки", + save_success: "Настройки сохранены", + check: "Проверить соединение", + check_email: "Email для проверки", + check_error: "Проверка соединения завершилась с ошибкой: ", + check_success: "Проверка соединения успешно завершена", + }, + }, + cidr_access: { + pools: { + col_name: "Имя", + delete: "Удалить", + delete_found: "Удалить найденные", + delete_all: "Удалить все", + properties: "Свойства", + update_pool: "Обновить пул доступа", + add_pool: "Добавить пул доступа", + add_name: "Имя", + add_ips: "Список CIDR", + add_ips_placeholder: + "Один IP на строку (127.0.0.1 или 127.0.0.1/16)", + ok: "ОК", + cancel: "Отмена", + search: "Поиск пула доступа", + }, + + policy: { + enabled: "Включить ограничение доступа по CIDR", + col_name: "Группа", + col_count: "Активные пулы доступа", + delete: "Удалить", + delete_found: "Удалить найденные", + delete_all: "Удалить все", + properties: "Настроить доступ", + add_policy: "Добавить политику доступа для группы", + select_group: "Выберите группу", + update_policy: "Обновить политику доступа для ", + ok: "ОК", + cancel: "Отмена", + search: "Найти группу", + }, + }, + resources: { + offices: { + col_name: "Название", + col_timezone: "Часовой пояс", + add_office: "Добавить офис", + edit_office: "Редактировать офис", + create_success: "Офис создан", + update_success: "Офис обновлен", + delete_success: "Офис удален", + }, + categories: { + col_name: "Название", + col_office_bind: "Привязка к офису", + col_script: "Скрипт", + add_category: "Добавить категорию", + edit_category: "Редактировать категорию", + create_success: "Категория создана", + update_success: "Категория обновлена", + delete_success: "Категория удалена", + }, + resources: { + col_name: "Название", + col_category: "Категория", + col_script: "Скрипт", + col_office: "Офис", + col_show_time_as: "Показывать время как", + time_busy: "Занятое", + time_free: "Свободное", + add_resource: "Добавить ресурс", + edit_resource: "Редактировать ресурс", + check_script: "Проверить скрипт", + check_script_good: "Ошибок не найдено", + any_category: "Любая категория", + any_office: "Любой офис", + create_success: "Ресурс создан", + update_success: "Ресурс обновлен", + delete_success: "Ресурс удален", + }, + }, + dkim: { + title: "TXT-запись для зоны DNS", + delete: "Удалить", + delete_success: "DKIM удален", + selector: "Селектор", + key_size: "Размер ключа в битах", + create: "Создать DKIM", + success: "DKIM создан", + }, + migration: { + enabled: "Включить режим миграций для этого домена", + virtual_domain: "Виртуальный домен", + other_servers: + "Другие серверы домена (хост:порт - по одному на строку)", + local_emails: "Адреса локальных ящиков (по одному на строку)", + save: "Сохранить настройки", + success: "Настройки сохранены", + }, + mails_perm_deletion: { + filter: "Фильтр писем", + found: "Писем найдено", + find: "Найти письма", + delete: "Удалить найденные письма: ", + delete_text: "Письма будут безвозвратно удалены", + success: "Письма были безвозвратно удалены", + ok: "Удалить", + cancel: "Отмена", + }, + }, + }, + user: { + profile: { + mailbox: { + title: "Почтовый ящик", + user: "Email", + size: "Размер", + count: "Кол-во писем", + }, + imap: { + title: "IMAP", + server: "Server", + port: "Port", + encryption: "Шифрование", + auth: "Проверка подлинности", + auth_text: "Простой пароль / Логин", + auth_login: "Логин/Имя пользователя", + }, + smtp: { + title: "SMTP", + server: "Server", + port: "Port", + encryption: "Шифрование", + auth: "Проверка подлинности", + auth_text: "Простой пароль / Логин", + auth_login: "Логин/Имя пользователя", + }, + dav: { + title: "DAV сервисы", + books: "Строка подключения адресных книг", + calendars: "Строка подключения календарей", + login: "Логин/Имя пользователя", + }, + }, + recovery: { + show: "Отображать папку восстановления", + save: "Сохранить настройки", + success: "Настройки сохранены", + }, + mailbox_shared_access: { + search: "Поиск", + col_name: "Доступ для", + type_email: "Пользователи", + type_email_placeholder: "Email", + type_email_add: "Дать доступ пользователю", + type_group_add: "Дать доступ группе", + add: "Дать доступ", + type_group: "Группы", + delete: "Удалить", + delete_found: "Удалить найденные", + delete_all: "Удалить все", + ok: "ОК", + cancel: "Отмена", + }, + address_books: { + with_access: { + col_name: "Название", + col_owner: "Владелец", + col_permission: "Доступ", + search: "Найти адресные книги", + }, + }, + calendars: { + with_access: { + col_name: "Название", + col_owner: "Владелец", + col_permission: "Доступ", + search: "Найти календари", + }, + share_free_time: { + timezone: "Часовой пояс", + work_days: "Рабочие дни", + work_days_names: { + monday: "Понедельник", + tuesday: "Вторник", + wednesday: "Среда", + thursday: "Четверг", + friday: "Пятница", + saturday: "Суббота", + sunday: "Воскресенье", + }, + work_hours: "Рабочие часы", + time_between_events: "Перерыв между событиями", + two_month_restriction: + "Делиться свободным временем не больше 2ух месяцев", + gen_link: "Сгенерировать новую ссылку доступа", + gen_link_success: "Ссылка обновлена", + }, + events_planner: { + my_events: { + search: "Найти событие", + col_name: "Название", + col_start: "Начало", + col_finish: "Конец", + col_participants: "Кол-во участников", + status_under_approval: "На согласовании", + status_approval_done: "Согласование завершено", + new_event: "Новое событие", + approval_with_ft: "Участники, указавшие свободное время", + approval_without_ft: "Участники, не указавшие свободное время", + }, + script_error_notify: { + title: "Ошибка выполнения скрипта", + resource_name: "Название ресурса", + error: "Ошибка", + output: "Вывод скрипта", + script: "Текст скрипта", + }, + new_edit: { + subject: "Название", + subject_placeholder: "Название события", + message: "Сообщение", + message_placeholder: "Пригласительное сообщение", + participants: "Участники (по одному на строку)", + include_creator: "Добавить меня в качестве участника", + first_avaliable: "Первый свободный", + mandatory: "Обязательные email`ы", + optional: "Опциональные email`ы", + duration: "Длительность", + duration_type: { + mins: "минута", + hours: "час", + days: "день", + weeks: "неделя", + months: "месяц", + }, + resources: "Ресурсы", + start: "Время начала", + time_not_selected: "Время не выбрано", + find_time: { + title: "Выбрать свободное время", + start_search: "Начать поиск", + search_from: "Искать от", + depth: "Глубина поиска", + selected_day: "Выбранный день", + selected_time: "Выбранное время", + not_found: "Свободное время не найдено", + depth_values: { + day: "День", + week: "Неделя", + month: "Месяц", + }, + select_and_create_button: "Выбрать время и создать событие", + select_and_update_button: "Выбрать время и обновить событие", + choose_time_button: "Отправить на согласование времени", + choose_time_desc_part_1: + "В участниках присутствуют внешние пользователи. Доступна возможность отправить событие на согласование и собрать информацию о свободном времени.", + choose_time_desc_part_2: + "Внешние участники без информации о свободном времени: ", + choose_time_desc_part_3: + "Для всех внешних участников есть информация о свободном времени", + choose_time_text_1: + "Отправить запрос на согласование времени следующим участникам:", + choose_time_text_2: + "Каждый участник должен ответить на запрос в течение этого времени:", + choose_time_text_3: + "Вы получите уведомление после полного сбора свободного времени от всех участников, либо по истечению времени выше.", + choose_time_interval: "Время ожидания", + choose_time_and_create_button: + "Отправить на согласование времени и создать событие", + choose_time_and_update_button: + "Отправить на согласование времени и обновить событие", + }, + reset_warning: + "Время события было сброшено. Выполните поиск свободного времени ещё раз", + update_button: "Обновить событие", + update_success: "Событие обновлено", + create_success: "Событие создано", + }, + }, + }, + }, + common: { + rules: { + col_enabled: "Включено", + col_name: "Название", + col_action: "Порядок", + add_rule: "Добавить правило", + save_rule: "Сохранить правило", + edit_rule: "Редактировать правило", + delete_rule: "Удалить правило", + ok: "ОК", + cancel: "Отмена", + edit_name: "Название", + edit_conditions: "Условия", + edit_conditions_all: "Все", + edit_conditions_any: "Любые", + edit_actions: "Действия", + add_condition: "Добавить условие", + add_action: "Добавить действие", + delete: "Удалить", + + incoming: { + conditions: { + op_equal: "равно", + op_less: "меньше", + op_greater: "больше", + op_not_equal: "не равно", + op_starts: "начинается с", + op_ends: "заканчивается на", + op_contains: "содержит", + op_not_contains: "не содержит", + op_greater_or_equal: "больше или равно", + op_less_or_equal: "меньше или равно", + + date: "Дата", + to: "Кому", + from: "От кого", + header_to: "Заголовок 'Кому'", + header_from: "Заголовок 'От кого'", + subject: "Тема", + copy_recipient: "Получатель копии", + size: "Размер", + spam_score: "Кол-во очков спама", + body: "Тело письма", + all: "Все письма", + }, + actions: { + to_folder: "Положить в папку", + copy_to_folder: "Копировать в папку", + mark_as_seen: "Отметить как прочтенное", + mark_as_flagged: "Отметить флагом", + redirect_to: "Перенаправить на", + copy_to: "Отправить копию на", + reply_msg: "Ответить сообщением", + reject: "Отклонить", + stop: "Остановить обработку правил", + }, + }, + outgoing: { + conditions: { + op_contains: "содержит", + op_not_contains: "не содержит", + op_equal: "равно", + op_not_equal: "не равно", + op_starts: "начинается с", + op_ends: "заканчивается на", + + from: "От кого", + to: "Кому", + from_group: "Группа отправителя", + to_group: "Группа получателя", + body: "Тело письма", + subject: "Тема", + all: "Все письма", + }, + actions: { + transform_from_address: "Преобразовать адрес отправителя", + transform_to_address: "Преобразовать адрес получателя", + transform_from_address_and_header: + "Преобразовать адрес отправителя и заголовок 'From'", + transform_to_address_and_header: + "Преобразовать адрес получателя и заголовок 'To'", + copy_to: "Добавить копию сообщения", + premoderation: "Отправить на премодерацию", + send_via_smart_host: "Отправить через смарт-хост", + add_text_to_start: "Добавить текст в начало тела письма", + add_text_to_end: "Добавить текст в конец тела письма", + + reject_external: "Запретить доставку внешним пользователям", + reject_external_count: + "Запретить доставку больше N писем внешним пользователям в день", + reject_internal_count: + "Запретить доставку больше N писем внутренним пользователям в день", + reject_groups: "Запретить доставку группе", + reject_in_group: "Запретить доставку участникам группы", + reject_any: "Запретить доставку", + allow_external: "Разрешить доставку внешним пользователям", + allow_groups: "Разрешить доставку группе", + allow_in_group: "Разрешить доставку участникам группы", + allow_any: "Разрешить доставку", + send_response: + "Уведомить отправителя сообщением при срабатывании правила", + send_response_default: + "Ваше сообщение было изменено или заблокировано почтовым сервисом.", + add_text_default: "Текст для добавления", + }, + }, + address: { + conditions: { + op_contains: "содержит", + op_not_contains: "не содержит", + op_equal: "равно", + op_not_equal: "не равно", + op_starts: "начинается с", + op_ends: "заканчивается на", + + from: "От кого", + to: "Кому", + from_group: "Группа отправителя", + to_group: "Группа получателя", + all: "Все письма", + }, + actions: { + transform_from_address: "Преобразовать адрес отправителя", + transform_to_address: "Преобразовать адрес получателя", + }, + }, + }, + shared_folders: { + root_folder: "Корневая папка", + col_folder: "Название", + col_owner: "Владелец", + + edit_access: "Доступы", + delete: "Удалить", + delete_found: "Удалить найденные", + delete_all: "Удалить все", + add_folder: "Добавить папку", + add_name: "Название", + ok: "ОК", + cancel: "Отмена", + search: "Поиск в ", + + access_search: "Поиск", + access_col_name: "Доступ для", + access_type_email: "Пользователи", + access_type_email_placeholder: "Email", + access_type_email_add: "Дать доступ пользователю", + access_type_group_add: "Дать доступ группе", + access_add: "Дать доступ", + access_type_group: "Группы", + }, + shared_address_books: { + col_name: "Название", + edit_access: "Доступы", + delete: "Удалить", + delete_found: "Удалить найденные", + delete_all: "Удалить все", + properties: "Свойства", + update_book: "Обновить адресную книгу", + add_book: "Добавить адресную книгу", + add_name: "Название", + ok: "ОК", + cancel: "Отмена", + search: "Найти адресные книги", + + access_search: "Поиск", + access_col_name: "Доступ для", + access_col_permissions: "Доступ", + access_perm_all: "Полный доступ", + access_perm_read: "Только чтение", + access_type_email: "Пользователи", + access_type_email_placeholder: "Email", + access_type_email_add: "Дать доступ пользователю", + access_type_group_add: "Дать доступ группе", + access_add: "Дать доступ", + access_type_group: "Группы", + }, + shared_calendars: { + col_name: "Название", + edit_access: "Доступы", + edit_cal_access: "Доступы", + delete: "Удалить", + delete_found: "Удалить найденные", + delete_all: "Удалить все", + properties: "Свойства", + update_calendar: "Обновить календарь", + add_calendar: "Добавить календарь", + add_name: "Название", + add_freebusy: + "Предоставлять информацию о занятом времени (Free/Busy)", + add_showfrom: "Не отображать события старше N недель", + add_showto: "Не отображать события новее N недель", + add_color: "Цвет", + ok: "ОК", + cancel: "Отмена", + search: "Найти календари", + + access_search: "Поиск", + access_col_name: "Доступ для", + access_col_permissions: "Доступ", + access_perm_all: "Полный доступ", + access_perm_read: "Только чтение", + access_type_email: "Пользователи", + access_type_email_placeholder: "Email", + access_type_email_add: "Дать доступ пользователю", + access_type_group_add: "Дать доступ группе", + access_add: "Дать доступ", + access_type_group: "Группы", + + add_success: "Доступ выдан", + update_success: "Доступ обновлен", + remove_success: "Доступ удален", + }, + }, + }, + }, +}; diff --git a/frontend/src/main.ts b/frontend/src/main.ts index f9754fe..05c81d9 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -1,5 +1,49 @@ -import {createApp} from 'vue' -import App from './App.vue' -import './style.css'; +import "./assets/main.css"; -createApp(App).mount('#app') +import { createApp, nextTick } from "vue"; +import { createPinia } from "pinia"; +import i18n from "@/locale"; +import piniaPluginPersistedState from "pinia-plugin-persistedstate"; + +import App from "./App.vue"; +import router from "@/router"; + +const app = createApp(App); + +const pinia = createPinia(); +pinia.use(piniaPluginPersistedState); + +app.use(pinia); +app.use(i18n); +app.use(router); + +app.use({ + install(Vue) { + Vue.mixin({ + mounted() { + this.disableAutoComplete(); + }, + + methods: { + disableAutoComplete() { + let elements = document.querySelectorAll('[autocomplete="off"]'); + + if (!elements) { + return; + } + + elements.forEach((element) => { + element.setAttribute("readonly", "readonly"); + nextTick(() => { + setTimeout(() => { + element.removeAttribute("readonly"); + }, 100); + }); + }); + }, + }, + }); + }, +}); + +app.mount("#app"); diff --git a/frontend/src/router/consts.ts b/frontend/src/router/consts.ts new file mode 100644 index 0000000..5557166 --- /dev/null +++ b/frontend/src/router/consts.ts @@ -0,0 +1,98 @@ +export const RouteLogin = "/"; + +export const RouteShared = "/sh"; +export const TokenPlaceholder = ":token"; +export const RouteSharedFreeTime = `/sh/ft/${TokenPlaceholder}`; +export const RouteEventsExternalApproval = `/sh/ev/ap/${TokenPlaceholder}`; + +export const RouteAdmin = "/admin"; +export const RouteAdminDashboard = "/admin/dashboard"; + +export const RouteAdminSettings = "/admin/settings"; +export const RouteAdminSettingsMain = "/admin/settings/main"; +export const RouteAdminSettingsSMTPQueue = "/admin/settings/smtp_queue"; +export const RouteAdminSettingsSMTPQueueSettings = + "/admin/settings/smtp_queue/settings"; +export const RouteAdminSettingsSMTPQueueManage = + "/admin/settings/smtp_queue/manage"; +export const RouteAdminSettingsSettingsDB = "/admin/settings/settings_db"; +export const RouteAdminSettingsAddressChange = "/admin/settings/address_change"; +export const RouteAdminSettingsCalendars = "/admin/settings/calendars"; +export const RouteAdminSettingsLicense = "/admin/settings/license"; + +export const RouteAdminSecurity = "/admin/security"; +export const RouteAdminSecurityBlockedIps = "/admin/security/blocked_ips"; +export const RouteAdminSecurityWhiteList = "/admin/security/white_list"; +export const RouteAdminSecurityWhiteListIp = "/admin/security/white_list/ip"; +export const RouteAdminSecurityWhiteListEmail = + "/admin/security/white_list/email"; +export const RouteAdminSecurityBlackList = "/admin/security/black_list"; +export const RouteAdminSecurityBlackListIp = "/admin/security/black_list/ip"; +export const RouteAdminSecurityBlackListEmail = + "/admin/security/black_list/email"; + +export const RouteAdminDomains = "/admin/domains"; +export const DomainPlaceholder = ":domain"; +export const UserdbPlaceholder = ":sid"; +export const RouteAdminDomainsAdd = `/admin/domains/add`; +export const RouteAdminDomainsDomain = `/admin/domains/${DomainPlaceholder}`; +export const RouteAdminDomainsDomainMailStorage = `/admin/domains/${DomainPlaceholder}/mailstorage`; +export const RouteAdminDomainsDomainMailStorageMailboxes = `/admin/domains/${DomainPlaceholder}/mailstorage/mailboxes`; +export const MailboxPlaceholder = ":mailbox"; +export const RouteAdminDomainsDomainMailStorageMailboxesExport = `/admin/domains/${DomainPlaceholder}/mailstorage/mailboxes/${MailboxPlaceholder}/export`; +export const RouteAdminDomainsDomainMailStorageSettings = `/admin/domains/${DomainPlaceholder}/mailstorage/settings`; +export const RouteAdminDomainsDomainUserDB = `/admin/domains/${DomainPlaceholder}/userdb`; +export const RouteAdminDomainsDomainUserDBAdd = `/admin/domains/${DomainPlaceholder}/userdb/add`; +export const RouteAdminDomainsDomainUserDBProvider = `/admin/domains/${DomainPlaceholder}/userdb/${UserdbPlaceholder}`; +export const RouteAdminDomainsDomainUserDBProviderUsers = `/admin/domains/${DomainPlaceholder}/userdb/${UserdbPlaceholder}/users`; +export const RouteAdminDomainsDomainUserDBProviderGroups = `/admin/domains/${DomainPlaceholder}/userdb/${UserdbPlaceholder}/groups`; +export const RouteAdminDomainsDomainUserDBProviderRedirects = `/admin/domains/${DomainPlaceholder}/userdb/${UserdbPlaceholder}/redirects`; +export const RouteAdminDomainsDomainUserDBProviderSettings = `/admin/domains/${DomainPlaceholder}/userdb/${UserdbPlaceholder}/settings`; +export const RouteAdminDomainsDomainUserDBProviderOther = `/admin/domains/${DomainPlaceholder}/userdb/${UserdbPlaceholder}/other`; +export const RouteAdminDomainsDomainSharedFolders = `/admin/domains/${DomainPlaceholder}/shared_folders`; +export const RouteAdminDomainsDomainAddressBooks = `/admin/domains/${DomainPlaceholder}/address_books`; +export const RouteAdminDomainsDomainCalendars = `/admin/domains/${DomainPlaceholder}/calendars`; + +export const RouteAdminDomainsDomainResources = `/admin/domains/${DomainPlaceholder}/resources`; +export const RouteAdminDomainsDomainResourcesList = `/admin/domains/${DomainPlaceholder}/resources/list`; +export const RouteAdminDomainsDomainResourcesOffices = `/admin/domains/${DomainPlaceholder}/resources/offices`; +export const RouteAdminDomainsDomainResourcesCategories = `/admin/domains/${DomainPlaceholder}/resources/categories`; + +export const RouteAdminDomainsDomainIncRules = `/admin/domains/${DomainPlaceholder}/incoming_rules`; +export const RouteAdminDomainsDomainOutRules = `/admin/domains/${DomainPlaceholder}/outgoing_rules`; +export const RouteAdminDomainsDomainDKIM = `/admin/domains/${DomainPlaceholder}/dkim`; +export const RouteAdminDomainsDomainMigration = `/admin/domains/${DomainPlaceholder}/migration`; +export const RouteAdminDomainsDomainCIDRAccess = `/admin/domains/${DomainPlaceholder}/cidr_access`; +export const RouteAdminDomainsDomainCIDRAccessPools = `/admin/domains/${DomainPlaceholder}/cidr_access/pools`; +export const RouteAdminDomainsDomainCIDRAccessPolicy = `/admin/domains/${DomainPlaceholder}/cidr_access/policy`; +export const RouteAdminDomainsDomainOther = `/admin/domains/${DomainPlaceholder}/other`; +export const RouteAdminDomainsDomainOtherMailsPermDeletion = `/admin/domains/${DomainPlaceholder}/other/mails_perm_deletion`; + +export const RouteUser = "/user"; +export const RouteUserProfile = "/user/profile"; +export const RouteUserRules = "/user/rules"; +export const RouteUserRecovery = "/user/recovery"; +export const RouteUserMailboxSharedAccess = "/user/mailbox_shared_access"; +export const RouteUserSharedFolders = "/user/shared_folders"; + +export const RouteUserAddressBooks = "/user/address_books"; +export const RouteUserAddressBooksMy = "/user/address_books/my_books"; +export const RouteUserAddressBooksAvaliableToMe = + "/user/address_books/avaliable_to_me"; + +export const RouteUserCalendars = "/user/calendars"; +export const RouteUserCalendarsMy = "/user/calendars/my_calendars"; +export const RouteUserCalendarsAvaliableToMe = + "/user/calendars/avaliable_to_me"; +export const RouteUserCalendarsShareFreeTime = + "/user/calendars/share_free_time"; + +export const RouteUserCalendarsEventsPlanner = "/user/calendars/events_planner"; +export const RouteUserCalendarsEventsPlannerList = + "/user/calendars/events_planner/my_events"; +export const RouteUserCalendarsEventsPlannerNew = + "/user/calendars/events_planner/new"; + +export const EventIdPlaceholder = ":event_id"; + +export const RouteUserCalendarsEventsPlannerEdit = `/user/calendars/events_planner/${EventIdPlaceholder}/edit`; diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts new file mode 100644 index 0000000..63f2b90 --- /dev/null +++ b/frontend/src/router/index.ts @@ -0,0 +1,105 @@ +import { + createRouter, + createWebHistory, + type RouteRecordRaw, +} from "vue-router"; +import { pipeline } from "@/router/middleware/pipeline"; +import { useAuthStore } from "@/stores/auth"; +import { + RouteAdmin, + RouteAdminDashboard, + RouteLogin, + RouteShared, + RouteUser, + RouteUserProfile, +} from "./consts"; +import routes from "@/router/routes"; +import { nextTick } from "vue"; +import i18n from "@/locale"; +import { useReturnToPageStore } from "@/stores/returnToPage"; + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: routes as RouteRecordRaw[], +}); + +router.beforeEach((to, from, next) => { + let path = to.path; + if (!to) { + path = location.pathname; + } + + if (!path.startsWith(RouteShared)) { + if (to.name !== RouteLogin) { + if (!useAuthStore().authed) { + useReturnToPageStore().setPath(path, to.query); + return next({ name: RouteLogin }); + } + if (useAuthStore().isAdmin && !to.path.startsWith(RouteAdmin)) { + return next({ name: RouteAdminDashboard }); + } + if (!useAuthStore().isAdmin && !to.path.startsWith(RouteUser)) { + return next({ name: RouteUserProfile }); + } + } + } + + if (!to.meta.middleware) { + return next(); + } + const middleware = Array.isArray(to.meta.middleware) + ? to.meta.middleware + : [to.meta.middleware]; + + const context = { + to, + from, + next, + }; + + return middleware[0](pipeline(context, middleware, 1), context); +}); + +router.afterEach((to, from) => { + // Use next tick to handle router history correctly + // see: https://github.com/vuejs/vue-router/issues/914#issuecomment-384477609 + nextTick(() => { + let title = to.meta.title as string; + if (!title) { + if (to.path.startsWith("/admin")) { + title = i18n.global.t("admin.title"); + } else if (to.path.startsWith("/user")) { + if (useAuthStore().username) { + title = useAuthStore().username; + } else { + title = i18n.global.t("user.title"); + } + } + } + + if (title) { + title = title + " - " + i18n.global.t("tegu"); + } + document.title = title || "Tegu"; + }); + + if (to.hash === "#refresh") { + router.replace({ hash: "" }).then(() => { + router.go(0); + }); + return; + } + + if (to.query.redirect) { + let redirect = to.query.redirect as string; + let parts = redirect.split("?"); + router.push(parts[0]); + + useReturnToPageStore().setPath( + parts[0], + Object.fromEntries(new URLSearchParams(parts[1])) + ); + } +}); + +export default router; diff --git a/frontend/src/router/middleware/log.ts b/frontend/src/router/middleware/log.ts new file mode 100644 index 0000000..652e243 --- /dev/null +++ b/frontend/src/router/middleware/log.ts @@ -0,0 +1,7 @@ +import { useAuthStore } from "@/stores/auth"; + +export const log = (next: any, context: any) => { + console.log("go to " + context.to.path); + + return next(); +}; diff --git a/frontend/src/router/middleware/pipeline.ts b/frontend/src/router/middleware/pipeline.ts new file mode 100644 index 0000000..4c0865b --- /dev/null +++ b/frontend/src/router/middleware/pipeline.ts @@ -0,0 +1,13 @@ +export const pipeline = (context: any, middleware: any, index: any) => { + const nextMiddleware = middleware[index]; + + if (!nextMiddleware) { + return context.next; + } + + return () => { + const nextPipeline = pipeline(context, middleware, index + 1); + + nextMiddleware(nextPipeline, context); + }; +}; diff --git a/frontend/src/router/routes.ts b/frontend/src/router/routes.ts new file mode 100644 index 0000000..a8e9f6a --- /dev/null +++ b/frontend/src/router/routes.ts @@ -0,0 +1,275 @@ +import Login from "@/views/Login.vue"; +import SharedFreeTime from "@/views/shared/FreeTime.vue"; +import Admin from "@/views/Admin.vue"; +import User from "@/views/User.vue"; +import PageNotFound from "@/components/PageNotFound.vue"; +import NotImplemented from "@/components/NotImplemented.vue"; +import Main from "@/components/admin/settings/Main.vue"; +import License from "@/components/admin/settings/License.vue"; +import SettingsDB from "@/components/admin/settings/SettingsDB.vue"; +import Add from "@/components/admin/domains/Add.vue"; +import DKIM from "@/components/admin/domains/DKIM.vue"; +import MailsPermDeletion from "@/components/admin/domains/MailsPermDeletion.vue"; +import Migration from "@/components/admin/domains/Migration.vue"; +import QueueSettings from "@/components/admin/settings/smtp_queue/Settings.vue"; +import BlockedIPs from "@/components/admin/security/BlockedIPs.vue"; +import WhiteListEmail from "@/components/admin/security/white_list/Email.vue"; +import WhiteListIP from "@/components/admin/security/white_list/IP.vue"; +import BlackListEmail from "@/components/admin/security/black_list/Email.vue"; +import BlackListIP from "@/components/admin/security/black_list/IP.vue"; +import QueueManage from "@/components/admin/settings/smtp_queue/Manage.vue"; +import MailStorageSettings from "@/components/admin/domains/mailstorage/Settings.vue"; +import MailStorageMailboxes from "@/components/admin/domains/mailstorage/Mailboxes.vue"; +import CIDRAccessPools from "@/components/admin/domains/cidr_access/Pools.vue"; +import CIDRAccessPolicy from "@/components/admin/domains/cidr_access/Policy.vue"; +import UserdbSettings from "@/components/admin/domains/userdb/Settings.vue"; +import UserdbUsers from "@/components/admin/domains/userdb/Users.vue"; +import UserdbGroups from "@/components/admin/domains/userdb/Groups.vue"; +import UserdbRedirects from "@/components/admin/domains/userdb/Redirects.vue"; +import UserDBAdd from "@/components/admin/domains/userdb/Add.vue"; +import Dashboard from "@/components/admin/Dashboard.vue"; +import Profile from "@/components/user/Profile.vue"; +import AdminSharedFolders from "@/components/admin/domains/SharedFolders.vue"; +import AdminAddressBooks from "@/components/admin/domains/SharedAddressBooks.vue"; +import IncomingRules from "@/components/admin/domains/IncomingRules.vue"; +import OutgoingRules from "@/components/admin/domains/OutgoingRules.vue"; +import AddressRules from "@/components/admin/settings/AddressRules.vue"; +import UserIncomingRules from "@/components/user/IncomingRules.vue"; +import CalendarsSettings from "@/components/admin/settings/Calendars.vue"; +import AdminCalendarsShared from "@/components/admin/domains/SharedCalendars.vue"; +import AdminResourcesList from "@/components/admin/domains/resources/Resources.vue"; +import AdminResourcesOffices from "@/components/admin/domains/resources/Offices.vue"; +import AdminResourcesCategories from "@/components/admin/domains/resources/Categories.vue"; + +import UserSharedFolders from "@/components/user/SharedFolders.vue"; +import UserMailboxSharedAccess from "@/components/user/MailboxSharedAccess.vue"; +import UserAddressBooksMy from "@/components/user/AddressBooks/MyBooks.vue"; +import UserAddressBooksWithAccess from "@/components/user/AddressBooks/AvaliableToMe.vue"; +import UserCalendarsMy from "@/components/user/Calendars/MyCalendars.vue"; +import UserCalendarsWithAccess from "@/components/user/Calendars/AvaliableToMe.vue"; +import UserCalendarsShareFreeTime from "@/components/user/Calendars/ShareFreeTime.vue"; +import UserEventsPlannerList from "@/components/user/Calendars/EventsPlanner/List.vue"; +import UserEventsPlannerNewOrEdit from "@/components/user/Calendars/EventsPlanner/NewOrEdit.vue"; +import RecoveryFolder from "@/components/user/RecoveryFolder.vue"; +import { + RouteAdmin, + RouteAdminDashboard, + RouteAdminDomains, + RouteAdminDomainsAdd, + RouteAdminDomainsDomainAddressBooks, + RouteAdminDomainsDomainCalendars, + RouteAdminDomainsDomainDKIM, + RouteAdminDomainsDomainIncRules, + RouteAdminDomainsDomainMailStorage, + RouteAdminDomainsDomainMailStorageMailboxes, + RouteAdminDomainsDomainMailStorageSettings, + RouteAdminDomainsDomainOutRules, + RouteAdminDomainsDomainSharedFolders, + RouteAdminDomainsDomainUserDB, + RouteAdminDomainsDomainUserDBAdd, + RouteAdminDomainsDomainUserDBProvider, + RouteAdminDomainsDomainUserDBProviderUsers, + RouteAdminDomainsDomainUserDBProviderSettings, + RouteAdminSecurity, + RouteAdminSecurityBlockedIps, + RouteAdminSettings, + RouteAdminSettingsAddressChange, + RouteAdminSettingsLicense, + RouteAdminSettingsMain, + RouteAdminSettingsSMTPQueue, + RouteAdminSettingsSMTPQueueManage, + RouteAdminSettingsSMTPQueueSettings, + RouteAdminSettingsSettingsDB, + RouteLogin, + RouteUser, + RouteUserProfile, + RouteAdminDomainsDomain, + RouteAdminSecurityWhiteList, + RouteAdminSecurityBlackList, + RouteAdminSecurityWhiteListIp, + RouteAdminSecurityWhiteListEmail, + RouteAdminSecurityBlackListIp, + RouteAdminSecurityBlackListEmail, + RouteAdminDomainsDomainMigration, + RouteAdminDomainsDomainUserDBProviderGroups, + RouteAdminDomainsDomainUserDBProviderRedirects, + RouteUserRules, + RouteUserRecovery, + RouteUserSharedFolders, + RouteUserCalendars, + RouteUserAddressBooks, + RouteUserAddressBooksMy, + RouteUserAddressBooksAvaliableToMe, + RouteUserCalendarsMy, + RouteUserCalendarsAvaliableToMe, + RouteAdminSettingsCalendars, + RouteUserMailboxSharedAccess, + RouteAdminDomainsDomainCIDRAccess, + RouteAdminDomainsDomainCIDRAccessPools, + RouteAdminDomainsDomainCIDRAccessPolicy, + RouteAdminDomainsDomainOther, + RouteAdminDomainsDomainOtherMailsPermDeletion, + RouteUserCalendarsShareFreeTime, + RouteSharedFreeTime, + RouteUserCalendarsEventsPlanner, + RouteUserCalendarsEventsPlannerList, + RouteUserCalendarsEventsPlannerNew, + RouteUserCalendarsEventsPlannerEdit, + RouteAdminDomainsDomainResources, + RouteAdminDomainsDomainResourcesList, + RouteAdminDomainsDomainResourcesCategories, + RouteAdminDomainsDomainResourcesOffices, + RouteEventsExternalApproval as RouteEventsExternalApproval, + RouteShared, +} from "./consts"; +import i18n from "@/locale"; +import { useAuthStore } from "@/stores/auth"; +import EventsExternalApproval from "@/views/shared/EventsExternalApproval.vue"; + +function route( + path: string, + component?: any, + children?: any[], + title?: string +) { + return { + path: path, + name: path, + component, + children, + meta: { + title, + }, + }; +} + +const routes = [ + route(RouteLogin, Login, undefined, i18n.global.t("login.title")), + route(RouteShared, undefined, [ + route( + RouteSharedFreeTime, + SharedFreeTime, + undefined, + i18n.global.t("shared.free_time.title") + ), + route( + RouteEventsExternalApproval, + EventsExternalApproval, + undefined, + i18n.global.t("shared.events_external_approval.title") + ), + ]), + + route( + RouteAdmin, + Admin, + [ + route(RouteAdminDashboard, Dashboard), + route(RouteAdminSettings, undefined, [ + route(RouteAdminSettingsMain, Main), + route(RouteAdminSettingsSMTPQueue, undefined, [ + route(RouteAdminSettingsSMTPQueueManage, QueueManage), + route(RouteAdminSettingsSMTPQueueSettings, QueueSettings), + ]), + route(RouteAdminSettingsSettingsDB, SettingsDB), + route(RouteAdminSettingsAddressChange, AddressRules), + route(RouteAdminSettingsLicense, License), + route(RouteAdminSettingsCalendars, CalendarsSettings), + ]), + route(RouteAdminSecurity, undefined, [ + route(RouteAdminSecurityBlockedIps, BlockedIPs), + route(RouteAdminSecurityWhiteList, undefined, [ + route(RouteAdminSecurityWhiteListIp, WhiteListIP), + route(RouteAdminSecurityWhiteListEmail, WhiteListEmail), + ]), + route(RouteAdminSecurityBlackList, undefined, [ + route(RouteAdminSecurityBlackListIp, BlackListIP), + route(RouteAdminSecurityBlackListEmail, BlackListEmail), + ]), + ]), + route(RouteAdminDomains, undefined, [ + route(RouteAdminDomainsAdd, Add), + route(RouteAdminDomainsDomain, undefined, [ + route(RouteAdminDomainsDomainMailStorage, undefined, [ + route( + RouteAdminDomainsDomainMailStorageMailboxes, + MailStorageMailboxes + ), + route( + RouteAdminDomainsDomainMailStorageSettings, + MailStorageSettings + ), + ]), + route(RouteAdminDomainsDomainUserDB, undefined, [ + route(RouteAdminDomainsDomainUserDBAdd, UserDBAdd), + route(RouteAdminDomainsDomainUserDBProvider, undefined, [ + route(RouteAdminDomainsDomainUserDBProviderUsers, UserdbUsers), + route(RouteAdminDomainsDomainUserDBProviderGroups, UserdbGroups), + route( + RouteAdminDomainsDomainUserDBProviderRedirects, + UserdbRedirects + ), + route( + RouteAdminDomainsDomainUserDBProviderSettings, + UserdbSettings + ), + ]), + ]), + ]), + route(RouteAdminDomainsDomainSharedFolders, AdminSharedFolders), + route(RouteAdminDomainsDomainAddressBooks, AdminAddressBooks), + route(RouteAdminDomainsDomainCalendars, AdminCalendarsShared), + route(RouteAdminDomainsDomainResources, undefined, [ + route(RouteAdminDomainsDomainResourcesList, AdminResourcesList), + route( + RouteAdminDomainsDomainResourcesCategories, + AdminResourcesCategories + ), + route(RouteAdminDomainsDomainResourcesOffices, AdminResourcesOffices), + ]), + route(RouteAdminDomainsDomainIncRules, IncomingRules), + route(RouteAdminDomainsDomainOutRules, OutgoingRules), + + route(RouteAdminDomainsDomainCIDRAccess, undefined, [ + route(RouteAdminDomainsDomainCIDRAccessPools, CIDRAccessPools), + route(RouteAdminDomainsDomainCIDRAccessPolicy, CIDRAccessPolicy), + ]), + + route(RouteAdminDomainsDomainDKIM, DKIM), + route(RouteAdminDomainsDomainMigration, Migration), + route(RouteAdminDomainsDomainOther, undefined, [ + route( + RouteAdminDomainsDomainOtherMailsPermDeletion, + MailsPermDeletion + ), + ]), + ]), + ], + i18n.global.t("admin.title") + ), + route(RouteUser, User, [ + route(RouteUserProfile, Profile), + route(RouteUserRules, UserIncomingRules), + route(RouteUserRecovery, RecoveryFolder), + route(RouteUserSharedFolders, UserSharedFolders), + route(RouteUserMailboxSharedAccess, UserMailboxSharedAccess), + route(RouteUserCalendars, undefined, [ + route(RouteUserCalendarsMy, UserCalendarsMy), + route(RouteUserCalendarsAvaliableToMe, UserCalendarsWithAccess), + route(RouteUserCalendarsShareFreeTime, UserCalendarsShareFreeTime), + ]), + route(RouteUserAddressBooks, undefined, [ + route(RouteUserAddressBooksMy, UserAddressBooksMy), + route(RouteUserAddressBooksAvaliableToMe, UserAddressBooksWithAccess), + ]), + route(RouteUserCalendarsEventsPlanner, undefined, [ + route(RouteUserCalendarsEventsPlannerList, UserEventsPlannerList), + route(RouteUserCalendarsEventsPlannerNew, UserEventsPlannerNewOrEdit), + route(RouteUserCalendarsEventsPlannerEdit, UserEventsPlannerNewOrEdit), + ]), + ]), + + { path: "/:pathMatch(.*)*", component: PageNotFound }, +]; + +export default routes; diff --git a/frontend/src/stores/auth.ts b/frontend/src/stores/auth.ts new file mode 100644 index 0000000..6fa9e51 --- /dev/null +++ b/frontend/src/stores/auth.ts @@ -0,0 +1,28 @@ +import { defineStore } from "pinia"; + +export const useAuthStore = defineStore({ + id: "auth", + state: () => ({ + authed: false, + username: "", + isAdmin: false, + token: "", + }), + + actions: { + setAuth(username: string, isAdmin: boolean) { + this.$patch({ + authed: true, + username, + isAdmin, + token: "", + }); + }, + resetAuth() { + this.$reset(); + }, + }, + persist: { + storage: sessionStorage, + }, +}); diff --git a/frontend/src/stores/returnToPage.ts b/frontend/src/stores/returnToPage.ts new file mode 100644 index 0000000..747d655 --- /dev/null +++ b/frontend/src/stores/returnToPage.ts @@ -0,0 +1,33 @@ +import { defineStore } from "pinia"; + +export const useReturnToPageStore = defineStore({ + id: "returnToPage", + state: () => ({ + path: "", + query: null, + }), + + actions: { + setPath(path: string, query: any) { + if (this.path === "") { + this.$patch({ + path: path, + query: query, + }); + } + }, + + getPath() { + const path = this.path.slice(); + const query = this.query; + this.$reset(); + return { + path: path, + query: query, + }; + }, + }, + persist: { + storage: sessionStorage, + }, +}); diff --git a/frontend/src/style.css b/frontend/src/style.css deleted file mode 100644 index 3940d6c..0000000 --- a/frontend/src/style.css +++ /dev/null @@ -1,26 +0,0 @@ -html { - background-color: rgba(27, 38, 54, 1); - text-align: center; - color: white; -} - -body { - margin: 0; - color: white; - font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", - "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", - sans-serif; -} - -@font-face { - font-family: "Nunito"; - font-style: normal; - font-weight: 400; - src: local(""), - url("assets/fonts/nunito-v16-latin-regular.woff2") format("woff2"); -} - -#app { - height: 100vh; - text-align: center; -} diff --git a/frontend/src/views/Admin.vue b/frontend/src/views/Admin.vue new file mode 100644 index 0000000..d3a73c3 --- /dev/null +++ b/frontend/src/views/Admin.vue @@ -0,0 +1,1546 @@ + + + + + diff --git a/frontend/src/views/Login.vue b/frontend/src/views/Login.vue new file mode 100644 index 0000000..9e12957 --- /dev/null +++ b/frontend/src/views/Login.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/frontend/src/views/User.vue b/frontend/src/views/User.vue new file mode 100644 index 0000000..e9508b4 --- /dev/null +++ b/frontend/src/views/User.vue @@ -0,0 +1,445 @@ + + + + + diff --git a/frontend/src/views/shared/EventsExternalApproval.vue b/frontend/src/views/shared/EventsExternalApproval.vue new file mode 100644 index 0000000..b467c15 --- /dev/null +++ b/frontend/src/views/shared/EventsExternalApproval.vue @@ -0,0 +1,271 @@ + + + + diff --git a/frontend/src/views/shared/FreeTime.vue b/frontend/src/views/shared/FreeTime.vue new file mode 100644 index 0000000..d6ef074 --- /dev/null +++ b/frontend/src/views/shared/FreeTime.vue @@ -0,0 +1,265 @@ + + + + diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts deleted file mode 100644 index dcfaef4..0000000 --- a/frontend/src/vite-env.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -/// - -declare module '*.vue' { - import type {DefineComponent} from 'vue' - const component: DefineComponent<{}, {}, any> - export default component -} diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 0000000..e14c754 --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,14 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 3cc844d..66b5e57 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -1,30 +1,11 @@ { - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "moduleResolution": "Node", - "strict": true, - "jsx": "preserve", - "sourceMap": true, - "resolveJsonModule": true, - "isolatedModules": true, - "esModuleInterop": true, - "lib": [ - "ESNext", - "DOM" - ], - "skipLibCheck": true - }, - "include": [ - "src/**/*.ts", - "src/**/*.d.ts", - "src/**/*.tsx", - "src/**/*.vue" - ], + "files": [], "references": [ { "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" } ] } diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json index b8afcc8..f094063 100644 --- a/frontend/tsconfig.node.json +++ b/frontend/tsconfig.node.json @@ -1,11 +1,19 @@ { + "extends": "@tsconfig/node20/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*" + ], "compilerOptions": { "composite": true, + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "module": "ESNext", - "moduleResolution": "Node", - "allowSyntheticDefaultImports": true - }, - "include": [ - "vite.config.ts" - ] + "moduleResolution": "Bundler", + "types": ["node"] + } } diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index a30c338..998f6fa 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,7 +1,15 @@ -import {defineConfig} from 'vite' -import vue from '@vitejs/plugin-vue' +import { fileURLToPath, URL } from "node:url"; + +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [vue()] -}) + // base: 'http://somehost', + plugins: [vue()], + resolve: { + alias: { + "@": fileURLToPath(new URL("./src", import.meta.url)), + }, + }, +}); diff --git a/go.mod b/go.mod index 7cf8fa4..2c6d8e5 100644 --- a/go.mod +++ b/go.mod @@ -2,15 +2,20 @@ module myproject go 1.23 -require github.com/wailsapp/wails/v2 v2.10.1 +require ( + github.com/gorilla/sessions v1.4.0 + github.com/labstack/echo/v4 v4.13.3 + github.com/wailsapp/wails/v2 v2.10.1 + gitlab.com/revoluterra-dev/common/helpers v1.27.8 +) require ( github.com/bep/debounce v1.2.1 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/securecookie v1.1.2 // indirect github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect - github.com/labstack/echo/v4 v4.13.3 // indirect github.com/labstack/gommon v0.4.2 // indirect github.com/leaanthony/go-ansi-parser v1.6.1 // indirect github.com/leaanthony/gosod v1.0.4 // indirect @@ -31,6 +36,7 @@ require ( golang.org/x/net v0.35.0 // indirect golang.org/x/sys v0.30.0 // indirect golang.org/x/text v0.22.0 // indirect + golang.org/x/time v0.8.0 // indirect ) // replace github.com/wailsapp/wails/v2 v2.10.1 => /home/kirill/go/pkg/mod diff --git a/go.sum b/go.sum index 0ad6722..5388d22 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,14 @@ github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= +github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ= +github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik= github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= @@ -57,6 +63,8 @@ github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhw github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= github.com/wailsapp/wails/v2 v2.10.1 h1:QWHvWMXII2nI/nXz77gpPG8P3ehl6zKe+u4su5BWIns= github.com/wailsapp/wails/v2 v2.10.1/go.mod h1:zrebnFV6MQf9kx8HI4iAv63vsR5v67oS7GTEZ7Pz1TY= +gitlab.com/revoluterra-dev/common/helpers v1.27.8 h1:1eqDCSKV99bcoa2UYpEkZX55h78ZB/ZkyuMlDJMT1ak= +gitlab.com/revoluterra-dev/common/helpers v1.27.8/go.mod h1:PHXaECK2VGIGorGsYpeQjFPE9aOrwOhp1E760j+xGMg= golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -74,6 +82,8 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/handlers.go b/handlers.go new file mode 100644 index 0000000..d908ef9 --- /dev/null +++ b/handlers.go @@ -0,0 +1,20 @@ +package main + +import ( + "myproject/tools" + + "github.com/labstack/echo/v4" +) + +func RegisterApi(e *echo.Group) { + e.POST("/login", login) + e.GET("/check", check) +} + +func check(c echo.Context) error { + return tools.ServeData(c, true) +} + +func login(c echo.Context) error { + return tools.ServeErrorMsg(c, "Успешная попытка логина") +} diff --git a/main.go b/main.go index fd19faa..f0a8304 100644 --- a/main.go +++ b/main.go @@ -1,11 +1,17 @@ package main import ( + "context" "embed" + "fmt" + "net" + "net/http" + "time" "github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options/assetserver" + "gitlab.com/revoluterra-dev/common/helpers/trace" ) //go:embed all:frontend/dist @@ -15,15 +21,25 @@ func main() { // Create an instance of the app structure app := NewApp() + echo := NewEcho(context.Background(), nil) + backendGroup := echo.Group("/backend") + + RegisterApi(backendGroup.Group("")) + + go StartServer(context.Background(), + 8888, + echo, + func() {}) + // Create application with options err := wails.Run(&options.App{ - Title: "myproject", + Title: "Timon", Width: 1024, Height: 768, AssetServer: &assetserver.Options{ Assets: assets, }, - BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1}, + BackgroundColour: options.NewRGB(255, 255, 255), OnStartup: app.startup, Bind: []interface{}{ app, @@ -34,3 +50,29 @@ func main() { println("Error:", err.Error()) } } + +func StartServer(ctx context.Context, port int64, router http.Handler, doneCallback func()) { + srv := &http.Server{ + Addr: fmt.Sprintf(":%d", port), + Handler: router, + BaseContext: func(net.Listener) context.Context { return ctx }, + } + + go func() { + var err error + + err = srv.ListenAndServe() + + if err != nil && !trace.Is(err, http.ErrServerClosed) { + println(fmt.Sprintf("listen failed: %s\n", err)) + } + doneCallback() + }() + + <-ctx.Done() + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + if err := srv.Shutdown(ctx); err != nil { + println(fmt.Sprintf("service shutdown failed: %s\n", err)) + } +} diff --git a/tools/auth.go b/tools/auth.go new file mode 100644 index 0000000..a9e2157 --- /dev/null +++ b/tools/auth.go @@ -0,0 +1,30 @@ +package tools + +import ( + "context" + + "github.com/labstack/echo/v4" +) + +const ( + UserCtxKey = "user" + LpCtxKey = "lp" + DomainCtxKey = "domain" + RootCtxKey = "rootCtx" +) + +func GetUser(c echo.Context) string { + return c.Get(UserCtxKey).(string) +} + +func GetDomain(c echo.Context) string { + return c.Get(DomainCtxKey).(string) +} + +func GetLp(c echo.Context) string { + return c.Get(LpCtxKey).(string) +} + +func GetRootCtx(c echo.Context) context.Context { + return c.Get(RootCtxKey).(context.Context) +} diff --git a/tools/consts.go b/tools/consts.go new file mode 100644 index 0000000..49a433a --- /dev/null +++ b/tools/consts.go @@ -0,0 +1,12 @@ +package tools + +const ( + // PageSize = 20 + + UserNameSessionKey = `TeguUserName` + SessionName = `teguCtlSession` +) + +const ( + LicMgrPluginName = `licenseMisc` +) diff --git a/tools/responses.go b/tools/responses.go new file mode 100644 index 0000000..796bbdc --- /dev/null +++ b/tools/responses.go @@ -0,0 +1,130 @@ +package tools + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "gitlab.com/revoluterra-dev/common/helpers/trace" +) + +type Response struct { + Error string `json:"error"` + Result interface{} `json:"result"` + Total int64 `json:"total"` +} + +// // Serve422 generates 422 (wrong entity) error to response json. +func ServeError(c echo.Context, err error) error { + return c.JSON( + http.StatusUnprocessableEntity, + Response{ + Error: trace.UnTrace(err).Error(), + Result: []struct{}{}, + }, + ) +} +func ServeErrorMsg(c echo.Context, errorMessage string) error { + return c.JSON( + http.StatusUnprocessableEntity, + Response{ + Error: errorMessage, + Result: []struct{}{}, + }, + ) +} + +// Serve404 generates 404 (not found) error to response json. +func Serve404(c echo.Context) error { + return c.JSON( + http.StatusNotFound, + Response{ + Error: http.StatusText(http.StatusNotFound), + Result: []struct{}{}, + }, + ) +} + +func Serve405(c echo.Context) error { + return c.JSON( + http.StatusMethodNotAllowed, + Response{ + Error: http.StatusText(http.StatusMethodNotAllowed), + Result: []struct{}{}, + }, + ) +} + +// Serve404 generates 401 (not found) error to response json. +func Serve401(c echo.Context) error { + return c.JSON( + http.StatusUnauthorized, + Response{ + Error: http.StatusText(http.StatusUnauthorized), + Result: []struct{}{}, + }, + ) +} + +func Serve403(c echo.Context) error { + return c.JSON( + http.StatusForbidden, + Response{ + Error: http.StatusText(http.StatusForbidden), + Result: []struct{}{}, + }, + ) +} + +func Serve429(c echo.Context) error { + return c.JSON( + http.StatusTooManyRequests, + Response{ + Error: http.StatusText(http.StatusTooManyRequests), + Result: []struct{}{}, + }, + ) +} + +// Serve500 generates 500 (internal error) error to response json. +func Serve500(c echo.Context) error { + return c.JSON( + http.StatusInternalServerError, + Response{ + Error: http.StatusText(http.StatusInternalServerError), + Result: []struct{}{}, + }, + ) +} + +func Serve503(c echo.Context) error { + return c.JSON( + http.StatusServiceUnavailable, + Response{ + Error: "Server is restarting", + Result: []struct{}{}, + }, + ) +} + +func ServeData(c echo.Context, data interface{}, total ...int64) error { + var t int64 + if len(total) > 0 { + t = total[0] + } + return c.JSON( + http.StatusOK, + Response{ + Result: data, + Total: t, + }, + ) +} + +// func usePath(e *echo.Echo, path string) string { +// e.OPTIONS(path, noContent) +// return path +// } + +// func noContent(c echo.Context) error { +// return c.NoContent(200) +// }