From 874796c86094e4b4d0cdbf2c7ad817babed9335a Mon Sep 17 00:00:00 2001 From: myoffice-sync Date: Wed, 5 Aug 2026 10:36:17 +0000 Subject: [PATCH] sync public allowlist from private myoffice --- Docker/Dockerfile.api | 39 + Docker/Dockerfile.web | 34 + Docker/README.md | 57 + Docker/build.ps1 | 158 + Docker/build.sh | 133 + Docker/dc-postgres-pgadmin.yml | 27 + Docker/docker-compose.demo.yml | 96 + Docker/nginx.conf | 17 + Docker/pgadmin/entrypoint.sh | 11 + Docker/pgadmin/servers.json | 14 + MyOffice.Core/Error.cs | 23 - MyOffice.Core/Exec.cs | 106 - MyOffice.Core/Extensions/BoolExtensions.cs | 14 - MyOffice.Core/Extensions/ClaimsExtensions.cs | 31 - .../Extensions/DateTimeExtensions.cs | 19 - MyOffice.Core/Extensions/GuidExtensions.cs | 19 - MyOffice.Core/Extensions/StringExtensions.cs | 65 - MyOffice.Core/Helpers/JsonHelper.cs | 31 - MyOffice.Core/Helpers/RandomizationHelper.cs | 18 - .../Identity/IExternalProviderValidator.cs | 47 - MyOffice.Core/Interfaces/IDataModel.cs | 6 - MyOffice.Core/Interfaces/IDataModelDto.cs | 6 - MyOffice.Core/MyOffice.Core.csproj | 13 - MyOffice.Data.Models/Accounts/Account.cs | 51 - .../Accounts/AccountAccess.cs | 28 - .../Accounts/AccountAccessInvite.cs | 17 - .../Accounts/AccountAccountCategory.cs | 10 - .../Accounts/AccountCategory.cs | 12 - .../Accounts/Domain/AccountWithRate.cs | 10 - MyOffice.Data.Models/Accounts/Motion.cs | 22 - MyOffice.Data.Models/Currencies/Currency.cs | 21 - .../Currencies/CurrencyGlobal.cs | 26 - .../Currencies/CurrencyRate.cs | 12 - MyOffice.Data.Models/Items/Item.cs | 20 - MyOffice.Data.Models/Items/ItemCategory.cs | 13 - MyOffice.Data.Models/Items/ItemGlobal.cs | 8 - .../MyOffice.Data.Models.csproj | 13 - .../Notifications/EmailTemplate.cs | 17 - MyOffice.Data.Models/Users/User.cs | 35 - MyOffice.Data.Models/Users/UserExternal.cs | 12 - .../Verifications/VerificationCode.cs | 18 - .../VerificationCodeTemplateEnum.cs | 7 - .../Verifications/VerificationCodeTypeEnum.cs | 7 - .../Account/AccountAccessInviteRepository.cs | 81 - .../Account/AccountAccessRepository.cs | 42 - .../AccountAccountCategoryRepository.cs | 55 - .../Account/AccountCategoryRepository.cs | 73 - .../Account/AccountRepository.cs | 641 ---- .../Account/IAccountAccessInviteRepository.cs | 17 - .../Account/IAccountAccessRepository.cs | 13 - .../IAccountAccountCategoryRepository.cs | 13 - .../Account/IAccountCategoryRepository.cs | 17 - .../Account/IAccountyRepository.cs | 37 - .../Account/IMotionRepository.cs | 12 - .../Account/MotionRepository.cs | 55 - MyOffice.Data.Repositories/AppRepository.cs | 10 - .../Currency/CurrencyGlobalRepository.cs | 22 - .../Currency/CurrencyRateRepository.cs | 115 - .../Currency/CurrencyRepository.cs | 102 - .../Currency/ICurrencyGlobalRepository.cs | 9 - .../Currency/ICurrencyRateRepository.cs | 19 - .../Currency/ICurrencyRepository.cs | 21 - .../Item/IItemCategoryRepository.cs | 17 - .../Item/IItemGlobalRepository.cs | 14 - .../Item/IItemRepository.cs | 19 - .../Item/ItemCategoryRepository.cs | 72 - .../Item/ItemGlobalRepository.cs | 69 - .../Item/ItemRepository.cs | 121 - .../MyOffice.Data.Repositories.csproj | 32 - .../Notifications/EmailTemplateRepository.cs | 17 - .../Notifications/IEmailTemplateRepository.cs | 8 - MyOffice.Data.Repositories/RepositoryBase.cs | 108 - .../Users/IUserExternalRepository.cs | 20 - .../Users/IUserRepository.cs | 15 - .../Users/UserExternalRepository.cs | 108 - .../Users/UserRepository.cs | 43 - .../IVerificationCodeRepository.cs | 11 - .../VerificationCodeRepository.cs | 27 - MyOffice.DbContext/AppDbContext.cs | 335 --- MyOffice.DbContext/AppDbContextFactory.cs | 37 - MyOffice.DbContext/DatabaseBootstrapper.cs | 67 - .../DbContextServiceCollectionExtensions.cs | 50 - MyOffice.DbContext/DemoDataSeeder.cs | 292 -- MyOffice.DbContext/MyOffice.DbContext.csproj | 26 - MyOffice.DbContext/RepositoryInitializer.cs | 23 - .../AppDbContextFactoryPostgres.cs | 27 - .../20230621190024_Init.Designer.cs | 608 ---- .../Migrations/20230621190024_Init.cs | 445 --- .../20230627044606_IsInternal.Designer.cs | 611 ---- .../Migrations/20230627044606_IsInternal.cs | 29 - ...3_PrimaryCurrencyDeletedMotion.Designer.cs | 617 ---- ...0720190103_PrimaryCurrencyDeletedMotion.cs | 40 - .../20230721175243_CurrentRate.Designer.cs | 631 ---- .../Migrations/20230721175243_CurrentRate.cs | 58 - ...230721180304_CurrentRateRemove.Designer.cs | 617 ---- .../20230721180304_CurrentRateRemove.cs | 58 - .../20230721180851_CurrentRateV2.Designer.cs | 633 ---- .../20230721180851_CurrentRateV2.cs | 48 - .../20230721200424_AccountType.Designer.cs | 636 ---- .../Migrations/20230721200424_AccountType.cs | 29 - .../20230722051335_AccountType2.Designer.cs | 637 ---- .../Migrations/20230722051335_AccountType2.cs | 29 - .../20230722052053_AccountOwner.Designer.cs | 650 ----- .../Migrations/20230722052053_AccountOwner.cs | 49 - .../20230725054028_Collation.Designer.cs | 652 ----- .../Migrations/20230725054028_Collation.cs | 54 - .../20230725061203_CollationR.Designer.cs | 651 ----- .../Migrations/20230725061203_CollationR.cs | 36 - .../20230725061910_CollationR2.Designer.cs | 650 ----- .../Migrations/20230725061910_CollationR2.cs | 36 - .../20230726160638_AccessOwner.Designer.cs | 663 ----- .../Migrations/20230726160638_AccessOwner.cs | 49 - .../20230726161226_AccessOwner2.Designer.cs | 665 ----- .../Migrations/20230726161226_AccessOwner2.cs | 60 - ...728172249_AccountAccessInvites.Designer.cs | 695 ----- .../20230728172249_AccountAccessInvites.cs | 48 - ...28181916_AccountAccessInvites2.Designer.cs | 713 ----- .../20230728181916_AccountAccessInvites2.cs | 51 - ...28192017_AccountAccessInvites3.Designer.cs | 728 ----- .../20230728192017_AccountAccessInvites3.cs | 51 - ...30804145453_AccountAccesUnique.Designer.cs | 729 ----- .../20230804145453_AccountAccesUnique.cs | 37 - .../20231217163807_acc_cat_unique.Designer.cs | 730 ----- .../20231217163807_acc_cat_unique.cs | 37 - ...231217185452_acc_access_unique.Designer.cs | 733 ----- .../20231217185452_acc_access_unique.cs | 28 - ...0240107073407_VerificationCode.Designer.cs | 790 ----- .../20240107073407_VerificationCode.cs | 55 - ...240107075033_VerificationCode2.Designer.cs | 790 ----- .../20240107075033_VerificationCode2.cs | 22 - .../20260717093113_OpenIddict.Designer.cs | 1067 ------- .../Migrations/20260717093113_OpenIddict.cs | 186 -- .../Migrations/AppDbContextModelSnapshot.cs | 1064 ------- .../MyOffice.Migrations.Postgres.csproj | 26 - .../AppDbContextFactorySqlite.cs | 27 - .../20260717093158_OpenIddict.Designer.cs | 1049 ------- .../Migrations/20260717093158_OpenIddict.cs | 747 ----- .../Migrations/AppDbContextModelSnapshot.cs | 1046 ------- .../MyOffice.Migrations.Sqlite.csproj | 26 - MyOffice.SPA/.editorconfig | 16 - MyOffice.SPA/.eslintrc.json | 46 - MyOffice.SPA/.gitignore | 42 - MyOffice.SPA/.npmrc | 1 - MyOffice.SPA/MyOffice.SPA.esproj | 44 - MyOffice.SPA/README.md | 27 - MyOffice.SPA/angular.json | 158 - MyOffice.SPA/aspnetcore-https.js | 36 - MyOffice.SPA/karma.conf.js | 45 - MyOffice.SPA/nuget.config | 11 - MyOffice.SPA/package.json | 75 - MyOffice.SPA/src/app/api-routes.ts | 46 - MyOffice.SPA/src/app/app-routing.module.ts | 47 - MyOffice.SPA/src/app/app.component.html | 2 - MyOffice.SPA/src/app/app.component.scss | 0 MyOffice.SPA/src/app/app.component.spec.ts | 39 - MyOffice.SPA/src/app/app.component.ts | 30 - MyOffice.SPA/src/app/app.config.ts | 47 - .../authentication-routing.module.ts | 47 - .../authentication/authentication.module.ts | 50 - .../forgot-password.component.html | 45 - .../forgot-password.component.scss | 0 .../forgot-password.component.spec.ts | 23 - .../forgot-password.component.ts | 55 - .../locked/locked.component.html | 58 - .../locked/locked.component.scss | 0 .../locked/locked.component.spec.ts | 23 - .../authentication/locked/locked.component.ts | 55 - .../page404/page404.component.html | 37 - .../page404/page404.component.scss | 0 .../page404/page404.component.spec.ts | 24 - .../page404/page404.component.ts | 12 - .../page500/page500.component.html | 34 - .../page500/page500.component.scss | 0 .../page500/page500.component.spec.ts | 24 - .../page500/page500.component.ts | 12 - .../signin/signin.component.html | 114 - .../signin/signin.component.scss | 0 .../signin/signin.component.spec.ts | 24 - .../authentication/signin/signin.component.ts | 117 - .../signup/signup.component.html | 128 - .../signup/signup.component.scss | 0 .../signup/signup.component.spec.ts | 24 - .../authentication/signup/signup.component.ts | 113 - MyOffice.SPA/src/app/config.external-login.ts | 66 - MyOffice.SPA/src/app/config.oidc.ts | 61 - MyOffice.SPA/src/app/config/config.service.ts | 28 - MyOffice.SPA/src/app/config/ui.config.ts | 7 - MyOffice.SPA/src/app/core/core.module.ts | 63 - .../app/core/extensions/general.extensions.ts | 42 - .../app/core/extensions/router.extensions.ts | 18 - MyOffice.SPA/src/app/core/guard/auth.guard.ts | 24 - .../src/app/core/guard/module-import.guard.ts | 12 - .../app/core/interceptor/error.interceptor.ts | 40 - .../src/app/core/interceptor/fake-backend.ts | 101 - .../update.date.http.interceptor .ts | 42 - .../src/app/core/models/config.interface.ts | 12 - .../app/core/models/general-error.model.ts | 6 - .../app/core/models/general-result.model.ts | 7 - .../src/app/core/models/login.model.ts | 4 - .../src/app/core/models/register.model.ts | 5 - .../app/core/models/selectable.model.spec.ts | 7 - .../src/app/core/models/selectable.model.ts | 4 - .../src/app/core/models/user-profile.model.ts | 9 - .../src/app/core/models/user.model.ts | 9 - .../src/app/core/service/auth.service.spec.ts | 18 - .../src/app/core/service/auth.service.ts | 266 -- .../src/app/core/service/direction.service.ts | 16 - .../src/app/core/service/language.service.ts | 26 - .../app/core/service/oidc-helper.service.ts | 252 -- .../app/core/service/rightsidebar.service.ts | 16 - .../src/app/core/utils/safe-redirect.spec.ts | 22 - .../src/app/core/utils/safe-redirect.ts | 24 - .../core/validators/atleastone.validator.ts | 21 - .../validators/atleastonenumber.validator.ts | 24 - .../app/dashboard/dashboard-routing.module.ts | 37 - .../src/app/dashboard/dashboard.module.ts | 55 - .../dashboard2/dashboard2.component.html | 103 - .../dashboard2/dashboard2.component.scss | 0 .../dashboard2/dashboard2.component.spec.ts | 27 - .../dashboard2/dashboard2.component.ts | 155 - .../dashboard/income/dashboard.component.html | 70 - .../dashboard/income/dashboard.component.scss | 0 .../income/dashboard.component.spec.ts | 27 - .../dashboard/income/dashboard.component.ts | 146 - .../outcome/dashboard.component.html | 72 - .../outcome/dashboard.component.scss | 0 .../outcome/dashboard.component.spec.ts | 27 - .../dashboard/outcome/dashboard.component.ts | 145 - .../auth-layout/auth-layout.component.html | 3 - .../auth-layout/auth-layout.component.ts | 66 - .../main-layout/main-layout.component.html | 6 - .../main-layout/main-layout.component.ts | 55 - .../app/layout/header/header.component.html | 179 -- .../app/layout/header/header.component.scss | 1 - .../layout/header/header.component.spec.ts | 23 - .../src/app/layout/header/header.component.ts | 264 -- .../page-loader/page-loader.component.html | 2 - .../page-loader/page-loader.component.scss | 1 - .../page-loader/page-loader.component.spec.ts | 23 - .../page-loader/page-loader.component.ts | 15 - .../right-sidebar.component.html | 48 - .../right-sidebar.component.scss | 1 - .../right-sidebar.component.spec.ts | 23 - .../right-sidebar/right-sidebar.component.ts | 258 -- .../src/app/layout/sidebar/sidebar-items.ts | 142 - .../app/layout/sidebar/sidebar.component.html | 75 - .../app/layout/sidebar/sidebar.component.scss | 1 - .../layout/sidebar/sidebar.component.spec.ts | 23 - .../app/layout/sidebar/sidebar.component.ts | 208 -- .../app/layout/sidebar/sidebar.metadata.ts | 13 - .../app/model/account.accessRight.model.ts | 10 - .../src/app/model/account.category.model.ts | 5 - .../src/app/model/account.detailed.model.ts | 6 - .../src/app/model/account.invite.model.ts | 5 - MyOffice.SPA/src/app/model/account.model.ts | 15 - MyOffice.SPA/src/app/model/currency.model.ts | 12 - MyOffice.SPA/src/app/model/dashboard.model.ts | 38 - .../src/app/model/item.category.model.ts | 6 - MyOffice.SPA/src/app/model/item.model.ts | 7 - MyOffice.SPA/src/app/model/motion.model.ts | 11 - .../app/pages/accounts/account.component.html | 22 - .../app/pages/accounts/account.component.scss | 15 - .../app/pages/accounts/account.component.ts | 110 - .../accounts/account.list.component.html | 21 - .../accounts/account.list.component.scss | 0 .../pages/accounts/account.list.component.ts | 62 - .../app/pages/accounts/motion.component.html | 84 - .../app/pages/accounts/motion.component.scss | 3 - .../app/pages/accounts/motion.component.ts | 274 -- .../src/app/pages/pages-routing.module.ts | 56 - MyOffice.SPA/src/app/pages/pages.module.ts | 102 - .../account/access.account.component.html | 47 - .../account/access.account.component.scss | 0 .../account/access.account.component.ts | 128 - .../account/account.category.component.html | 47 - .../account/account.category.component.scss | 0 .../account/account.category.component.ts | 129 - .../settings/account/account.component.html | 99 - .../settings/account/account.component.scss | 0 .../settings/account/account.component.ts | 214 -- .../account/add.account.component.html | 62 - .../account/add.account.component.scss | 0 .../settings/account/add.account.component.ts | 101 - .../account/edit.account.component.html | 93 - .../account/edit.account.component.scss | 24 - .../account/edit.account.component.ts | 161 -- .../currency/connect.currency.component.html | 85 - .../currency/connect.currency.component.scss | 0 .../currency/connect.currency.component.ts | 80 - .../settings/currency/currency.component.html | 88 - .../settings/currency/currency.component.scss | 15 - .../settings/currency/currency.component.ts | 133 - .../currency/rate.currency.component.html | 95 - .../currency/rate.currency.component.scss | 0 .../currency/rate.currency.component.ts | 99 - .../item/edit.item.category.component.html | 26 - .../item/edit.item.category.component.scss | 0 .../item/edit.item.category.component.ts | 77 - .../settings/item/edit.item.component.html | 33 - .../settings/item/edit.item.component.scss | 0 .../settings/item/edit.item.component.ts | 78 - .../item/item.category.component.html | 49 - .../item/item.category.component.scss | 0 .../settings/item/item.category.component.ts | 97 - .../pages/settings/item/item.component.html | 77 - .../pages/settings/item/item.component.scss | 11 - .../app/pages/settings/item/item.component.ts | 130 - .../user-profile/user-profile.component.html | 129 - .../user-profile/user-profile.component.scss | 0 .../user-profile.component.spec.ts | 24 - .../user-profile/user-profile.component.ts | 178 -- .../app/services/account.category.service.ts | 29 - .../src/app/services/account.service.ts | 28 - .../src/app/services/currency.service.ts | 24 - MyOffice.SPA/src/app/services/item.service.ts | 34 - MyOffice.SPA/src/app/shared/TableElement.ts | 3 - .../app/shared/UnsubscribeOnDestroyAdapter.ts | 20 - .../breadcrumb/breadcrumb.component.html | 20 - .../breadcrumb/breadcrumb.component.scss | 0 .../breadcrumb/breadcrumb.component.spec.ts | 27 - .../breadcrumb/breadcrumb.component.ts | 19 - .../shared/components/components.module.ts | 33 - .../date-period/date-period.component.css | 0 .../date-period/date-period.component.html | 28 - .../date-period/date-period.component.spec.ts | 23 - .../date-period/date-period.component.ts | 56 - .../dialog-chrome.component.html | 39 - .../dialog-chrome.component.scss | 24 - .../dialog-chrome/dialog-chrome.component.ts | 21 - .../feather-icons.component.html | 1 - .../feather-icons.component.scss | 0 .../feather-icons.component.spec.ts | 27 - .../feather-icons/feather-icons.component.ts | 17 - .../feather-icons/feather-icons.module.ts | 14 - .../file-upload/file-upload.component.html | 5 - .../file-upload/file-upload.component.scss | 27 - .../file-upload/file-upload.component.spec.ts | 26 - .../file-upload/file-upload.component.ts | 44 - .../src/app/shared/feather-icons.module.ts | 13 - .../src/app/shared/material.module.ts | 38 - MyOffice.SPA/src/app/shared/shared.module.ts | 22 - MyOffice.SPA/src/app/shared/sub-sink.ts | 61 - .../src/app/shared/tableExportUtil.ts | 42 - MyOffice.SPA/src/assets/.gitkeep | 0 .../fonts/fontawesome/fa-brands-400.eot | Bin 124904 -> 0 bytes .../fonts/fontawesome/fa-brands-400.svg | 1181 -------- .../fonts/fontawesome/fa-brands-400.ttf | Bin 124668 -> 0 bytes .../fonts/fontawesome/fa-brands-400.woff | Bin 80660 -> 0 bytes .../fonts/fontawesome/fa-brands-400.woff2 | Bin 69020 -> 0 bytes .../fonts/fontawesome/fa-regular-400.eot | Bin 40576 -> 0 bytes .../fonts/fontawesome/fa-regular-400.svg | 467 --- .../fonts/fontawesome/fa-regular-400.ttf | Bin 40348 -> 0 bytes .../fonts/fontawesome/fa-regular-400.woff | Bin 18168 -> 0 bytes .../fonts/fontawesome/fa-regular-400.woff2 | Bin 14872 -> 0 bytes .../assets/fonts/fontawesome/fa-solid-900.eot | Bin 191512 -> 0 bytes .../assets/fonts/fontawesome/fa-solid-900.svg | 2567 ----------------- .../assets/fonts/fontawesome/fa-solid-900.ttf | Bin 191292 -> 0 bytes .../fonts/fontawesome/fa-solid-900.woff | Bin 92800 -> 0 bytes .../fonts/fontawesome/fa-solid-900.woff2 | Bin 71952 -> 0 bytes .../poppins/poppins-v5-latin-regular.eot | Bin 8692 -> 0 bytes .../poppins/poppins-v5-latin-regular.svg | 323 --- .../poppins/poppins-v5-latin-regular.ttf | Bin 15724 -> 0 bytes .../poppins/poppins-v5-latin-regular.woff | Bin 10400 -> 0 bytes .../poppins/poppins-v5-latin-regular.woff2 | Bin 7904 -> 0 bytes MyOffice.SPA/src/assets/i18n/de.json | 82 - MyOffice.SPA/src/assets/i18n/en.json | 106 - MyOffice.SPA/src/assets/i18n/es.json | 82 - MyOffice.SPA/src/assets/i18n/ua.json | 108 - .../src/assets/images/apps/calendar.png | Bin 998 -> 0 bytes MyOffice.SPA/src/assets/images/apps/chat.png | Bin 487 -> 0 bytes .../src/assets/images/apps/contact.png | Bin 979 -> 0 bytes .../src/assets/images/apps/gallery.png | Bin 831 -> 0 bytes MyOffice.SPA/src/assets/images/apps/mail.png | Bin 750 -> 0 bytes .../src/assets/images/apps/support.png | Bin 1180 -> 0 bytes MyOffice.SPA/src/assets/images/apps/table.png | Bin 927 -> 0 bytes MyOffice.SPA/src/assets/images/apps/task.png | Bin 777 -> 0 bytes MyOffice.SPA/src/assets/images/banner/1.png | Bin 373 -> 0 bytes MyOffice.SPA/src/assets/images/banner/2.png | Bin 373 -> 0 bytes MyOffice.SPA/src/assets/images/banner/3.png | Bin 373 -> 0 bytes MyOffice.SPA/src/assets/images/banner/4.png | Bin 373 -> 0 bytes MyOffice.SPA/src/assets/images/dark.png | Bin 217046 -> 0 bytes .../src/assets/images/details_close.png | Bin 686 -> 0 bytes .../src/assets/images/details_open.png | Bin 709 -> 0 bytes MyOffice.SPA/src/assets/images/favicon.ico | Bin 1150 -> 0 bytes .../src/assets/images/flags/germany.jpg | Bin 663 -> 0 bytes .../src/assets/images/flags/spain.jpg | Bin 1039 -> 0 bytes .../src/assets/images/flags/ukraine.png | Bin 324 -> 0 bytes MyOffice.SPA/src/assets/images/flags/us.jpg | Bin 1242 -> 0 bytes MyOffice.SPA/src/assets/images/icons/xlsx.png | Bin 24988 -> 0 bytes .../src/assets/images/image-gallery/1.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/10.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/11.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/12.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/2.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/3.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/4.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/5.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/6.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/7.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/8.jpg | Bin 4471 -> 0 bytes .../src/assets/images/image-gallery/9.jpg | Bin 4471 -> 0 bytes .../src/assets/images/invoice_logo.png | Bin 366 -> 0 bytes MyOffice.SPA/src/assets/images/light.png | Bin 207373 -> 0 bytes MyOffice.SPA/src/assets/images/logo.png | Bin 173 -> 0 bytes MyOffice.SPA/src/assets/images/media.png | Bin 206 -> 0 bytes .../src/assets/images/pages/bg-01.png | Bin 3051 -> 0 bytes .../src/assets/images/pages/bg-02.png | Bin 3051 -> 0 bytes .../src/assets/images/pages/bg-03.png | Bin 3051 -> 0 bytes .../src/assets/images/pages/bg-04.png | Bin 3051 -> 0 bytes .../src/assets/images/pages/bg-05.png | Bin 3051 -> 0 bytes .../src/assets/images/pages/home-1.png | Bin 719 -> 0 bytes .../src/assets/images/posts/post1.jpg | Bin 732 -> 0 bytes .../src/assets/images/posts/post10.jpg | Bin 5184 -> 0 bytes .../src/assets/images/posts/post11.jpg | Bin 5184 -> 0 bytes .../src/assets/images/posts/post12.jpg | Bin 5184 -> 0 bytes .../src/assets/images/posts/post13.jpg | Bin 5184 -> 0 bytes .../src/assets/images/posts/post2.jpg | Bin 732 -> 0 bytes .../src/assets/images/posts/post3.jpg | Bin 732 -> 0 bytes .../src/assets/images/posts/post4.jpg | Bin 5184 -> 0 bytes .../src/assets/images/posts/post5.jpg | Bin 5184 -> 0 bytes .../src/assets/images/posts/post6.jpg | Bin 5184 -> 0 bytes .../src/assets/images/posts/post7.jpg | Bin 5184 -> 0 bytes .../src/assets/images/posts/post8.jpg | Bin 5184 -> 0 bytes .../src/assets/images/posts/post9.jpg | Bin 5184 -> 0 bytes .../src/assets/images/products/p-13.jpg | Bin 337 -> 0 bytes .../src/assets/images/products/p-14.jpg | Bin 337 -> 0 bytes .../src/assets/images/products/p-15.jpg | Bin 337 -> 0 bytes MyOffice.SPA/src/assets/images/test.pdf | Bin 43627 -> 0 bytes MyOffice.SPA/src/assets/images/thumbs-up.png | Bin 1009 -> 0 bytes MyOffice.SPA/src/assets/images/user/admin.jpg | Bin 2642 -> 0 bytes MyOffice.SPA/src/assets/images/user/user1.jpg | Bin 337 -> 0 bytes .../src/assets/images/user/user10.jpg | Bin 337 -> 0 bytes .../src/assets/images/user/user11.jpg | Bin 337 -> 0 bytes MyOffice.SPA/src/assets/images/user/user2.jpg | Bin 337 -> 0 bytes MyOffice.SPA/src/assets/images/user/user3.jpg | Bin 337 -> 0 bytes MyOffice.SPA/src/assets/images/user/user4.jpg | Bin 337 -> 0 bytes MyOffice.SPA/src/assets/images/user/user5.jpg | Bin 337 -> 0 bytes MyOffice.SPA/src/assets/images/user/user6.jpg | Bin 337 -> 0 bytes MyOffice.SPA/src/assets/images/user/user7.jpg | Bin 337 -> 0 bytes MyOffice.SPA/src/assets/images/user/user8.jpg | Bin 337 -> 0 bytes MyOffice.SPA/src/assets/images/user/user9.jpg | Bin 337 -> 0 bytes .../src/assets/images/user/usrbig1.jpg | Bin 2642 -> 0 bytes .../src/assets/images/user/usrbig10.jpg | Bin 2642 -> 0 bytes .../src/assets/images/user/usrbig11.jpg | Bin 2642 -> 0 bytes .../src/assets/images/user/usrbig2.jpg | Bin 2642 -> 0 bytes .../src/assets/images/user/usrbig3.jpg | Bin 2642 -> 0 bytes .../src/assets/images/user/usrbig4.jpg | Bin 2642 -> 0 bytes .../src/assets/images/user/usrbig5.jpg | Bin 2642 -> 0 bytes .../src/assets/images/user/usrbig6.jpg | Bin 2642 -> 0 bytes .../src/assets/images/user/usrbig7.jpg | Bin 2642 -> 0 bytes .../src/assets/images/user/usrbig8.jpg | Bin 2642 -> 0 bytes .../src/assets/images/user/usrbig9.jpg | Bin 2642 -> 0 bytes .../src/assets/scss/apps/_calendar.scss | 340 --- MyOffice.SPA/src/assets/scss/apps/_chat.scss | 218 -- .../src/assets/scss/apps/_contactgrid.scss | 36 - .../src/assets/scss/apps/_contactlist.scss | 127 - .../src/assets/scss/apps/_dragdrop.scss | 153 - MyOffice.SPA/src/assets/scss/apps/_task.scss | 250 -- .../src/assets/scss/browser/_ie10.scss | 60 - .../src/assets/scss/browser/_ie11.scss | 56 - .../src/assets/scss/common/_animation.scss | 1046 ------- .../assets/scss/common/_customanimate.scss | 76 - .../src/assets/scss/common/_demo.scss | 372 --- .../src/assets/scss/common/_general.scss | 374 --- .../src/assets/scss/common/_helpers.scss | 164 -- .../src/assets/scss/common/_media.scss | 367 --- .../src/assets/scss/common/_mixins.scss | 70 - MyOffice.SPA/src/assets/scss/common/_rtl.scss | 816 ------ .../src/assets/scss/common/_variables.scss | 34 - .../assets/scss/components/_breadcrumbs.scss | 159 - .../scss/components/_checkboxradio.scss | 139 - .../assets/scss/components/_dropdownmenu.scss | 338 --- .../src/assets/scss/components/_feed.scss | 189 -- .../scss/components/_formcomponents.scss | 59 - .../src/assets/scss/components/_infobox.scss | 690 ----- .../scss/components/_inputformgroup.scss | 456 --- .../src/assets/scss/components/_labels.scss | 35 - .../scss/components/_leftsidebaroverlay.scss | 952 ------ .../src/assets/scss/components/_navbar.scss | 654 ----- .../src/assets/scss/components/_navtabs.scss | 76 - .../assets/scss/components/_noticeboard.scss | 18 - .../assets/scss/components/_rightsidebar.scss | 30 - .../assets/scss/components/_searchbar.scss | 70 - .../scss/components/_settingSidebar.scss | 197 -- .../src/assets/scss/components/_switch.scss | 40 - .../assets/scss/components/_thumbnails.scss | 18 - .../src/assets/scss/components/_todo.scss | 85 - .../scss/fonts/fontawesome/_animated.scss | 20 - .../fonts/fontawesome/_bordered-pulled.scss | 20 - .../assets/scss/fonts/fontawesome/_core.scss | 21 - .../scss/fonts/fontawesome/_fixed-width.scss | 6 - .../assets/scss/fonts/fontawesome/_icons.scss | 1451 ---------- .../scss/fonts/fontawesome/_larger.scss | 23 - .../assets/scss/fonts/fontawesome/_list.scss | 21 - .../scss/fonts/fontawesome/_mixins.scss | 56 - .../fonts/fontawesome/_rotated-flipped.scss | 24 - .../fonts/fontawesome/_screen-reader.scss | 5 - .../assets/scss/fonts/fontawesome/_shims.scss | 2066 ------------- .../scss/fonts/fontawesome/_stacked.scss | 31 - .../scss/fonts/fontawesome/_variables.scss | 1469 ---------- .../assets/scss/fonts/fontawesome/brands.scss | 23 - .../scss/fonts/fontawesome/fontawesome.scss | 16 - .../scss/fonts/fontawesome/regular.scss | 23 - .../assets/scss/fonts/fontawesome/solid.scss | 24 - .../scss/fonts/fontawesome/v4-shims.scss | 6 - MyOffice.SPA/src/assets/scss/pages/_auth.scss | 211 -- .../src/assets/scss/pages/_dashboard.scss | 47 - .../src/assets/scss/pages/_inbox.scss | 121 - .../src/assets/scss/pages/_pricing.scss | 195 -- .../src/assets/scss/pages/_profile.scss | 26 - .../src/assets/scss/pages/_projects.scss | 539 ---- .../src/assets/scss/pages/_timeline.scss | 744 ----- .../src/assets/scss/plugins/_carousel.scss | 37 - .../src/assets/scss/plugins/_charts.scss | 305 -- .../src/assets/scss/plugins/_formwizard.scss | 368 --- .../assets/scss/plugins/_imagegallery.scss | 22 - .../src/assets/scss/plugins/_maps.scss | 9 - .../src/assets/scss/plugins/_tables.scss | 910 ------ MyOffice.SPA/src/assets/scss/style.scss | 104 - MyOffice.SPA/src/assets/scss/theme/_dark.scss | 1741 ----------- .../src/assets/scss/theme/_theme-black.scss | 235 -- .../scss/theme/_theme-color-variables.scss | 132 - .../src/assets/scss/theme/_theme-white.scss | 231 -- .../src/assets/scss/theme/all-themes.scss | 7 - MyOffice.SPA/src/assets/scss/ui/_alerts.scss | 42 - .../assets/scss/ui/_badgelistgroupitem.scss | 238 -- MyOffice.SPA/src/assets/scss/ui/_buttons.scss | 44 - MyOffice.SPA/src/assets/scss/ui/_card.scss | 320 -- .../src/assets/scss/ui/_ckeditor.scss | 18 - .../src/assets/scss/ui/_collapse.scss | 16 - MyOffice.SPA/src/assets/scss/ui/_dialogs.scss | 29 - .../src/assets/scss/ui/_expansion.scss | 13 - .../src/assets/scss/ui/_listItems.scss | 26 - .../src/assets/scss/ui/_mediaobject.scss | 23 - MyOffice.SPA/src/assets/scss/ui/_modals.scss | 109 - .../src/assets/scss/ui/_pageloader.scss | 30 - .../src/assets/scss/ui/_pagination.scss | 169 -- MyOffice.SPA/src/assets/scss/ui/_panels.scss | 149 - .../src/assets/scss/ui/_preloaders.scss | 378 --- .../src/assets/scss/ui/_progressbars.scss | 126 - MyOffice.SPA/src/assets/scss/ui/_slider.scss | 3 - .../src/assets/scss/ui/_snackbar.scss | 19 - MyOffice.SPA/src/assets/scss/ui/_tabs.scss | 29 - .../src/assets/scss/ui/_tooltippopovers.scss | 30 - .../src/environments/environment.docker.ts | 18 - .../src/environments/environment.proxmox.ts | 18 - .../src/environments/environment.sample.ts | 16 - MyOffice.SPA/src/favicon.ico | Bin 948 -> 0 bytes MyOffice.SPA/src/index.html | 21 - MyOffice.SPA/src/main.ts | 7 - MyOffice.SPA/src/polyfills.ts | 53 - MyOffice.SPA/src/proxy.conf.js | 15 - MyOffice.SPA/src/silent-refresh.html | 31 - MyOffice.SPA/src/styles.scss | 68 - MyOffice.SPA/src/styles/_variables.scss | 0 MyOffice.SPA/src/styles/global.scss | 277 -- MyOffice.SPA/src/styles/reset.scss | 0 MyOffice.SPA/src/styles/styles.scss | 18 - MyOffice.SPA/src/test.ts | 14 - MyOffice.SPA/tsconfig.app.json | 15 - MyOffice.SPA/tsconfig.json | 35 - MyOffice.SPA/tsconfig.spec.json | 18 - MyOffice.Services/Account/AccountAcl.cs | 18 - .../Account/AccountMotionBalancing.cs | 23 - .../Account/AccountService.Access.cs | 214 -- .../Account/AccountService.AccessRights.cs | 15 - .../Account/AccountService.Account.cs | 270 -- .../Account/AccountService.AccountCategory.cs | 147 - .../Account/AccountService.Motion.cs | 212 -- MyOffice.Services/Account/AccountService.cs | 58 - .../Account/Domain/AccessInviteStatus.cs | 10 - .../Account/Domain/AccountAccessDto.cs | 53 - .../Account/Domain/AccountAccessInviteDto.cs | 22 - .../Domain/AccountAccountCategoryDto.cs | 19 - .../Account/Domain/AccountAdd.cs | 10 - .../Account/Domain/AccountAddStatus.cs | 10 - .../Account/Domain/AccountCategoryDto.cs | 24 - .../Domain/AccountCategoryRemoveResult.cs | 10 - .../Account/Domain/AccountDetailedDto.cs | 22 - .../Account/Domain/AccountDto.cs | 79 - .../Account/Domain/AccountEdit.cs | 10 - .../Account/Domain/AccountEditStatus.cs | 11 - .../Account/Domain/InviteAcceptStatus.cs | 10 - .../Account/Domain/ItemCategoryDto.cs | 23 - MyOffice.Services/Account/Domain/ItemDto.cs | 27 - .../Account/Domain/MotionAddStatus.cs | 9 - .../Account/Domain/MotionAddUpdate.cs | 22 - .../Account/Domain/MotionDeleteStatus.cs | 9 - MyOffice.Services/Account/Domain/MotionDto.cs | 27 - .../Account/Domain/MotionUpdateStatus.cs | 9 - MyOffice.Services/Account/Domain/UserDto.cs | 28 - MyOffice.Services/Currency/CurrencyService.cs | 202 -- .../Currency/Domain/CurrencyAddRateStatus.cs | 8 - .../Currency/Domain/CurrencyAddStatus.cs | 9 - .../Currency/Domain/CurrencyDto.cs | 32 - .../Currency/Domain/CurrencyEdit.cs | 8 - .../Currency/Domain/CurrencyEditStatus.cs | 8 - .../Currency/Domain/CurrencyGlobalDto.cs | 21 - .../Currency/Domain/CurrencyRateDto.cs | 24 - .../Currency/Domain/CurrencyWithRateDto.cs | 9 - .../Dashboard/DashboardService.cs | 160 - .../Dashboard/Domain/DashboardData.cs | 43 - .../Identity/IContextProvider.cs | 10 - .../Item/Domain/ItemCategoryRemoveResult.cs | 10 - .../Item/Domain/ItemGetOrAddResult.cs | 10 - MyOffice.Services/Item/ItemService.cs | 264 -- .../Mapper/AutomapperExtensions.cs | 17 - MyOffice.Services/Mapper/BaseMappingAction.cs | 12 - MyOffice.Services/Mapper/BaseProfile.cs | 13 - MyOffice.Services/Mapper/UserIdResolver.cs | 21 - MyOffice.Services/MyOffice.Services.csproj | 17 - .../Notifications/EmailNotificationService.cs | 80 - .../Users/Domain/AddUserExternalStatusEnum.cs | 8 - MyOffice.Services/Users/UserService.cs | 96 - .../Validators/ContextValidator.cs | 6 - .../Verifications/VerificationService.cs | 51 - MyOffice.Shared/Configuration.cs | 48 - MyOffice.Shared/MyOffice.Shared.csproj | 40 - .../appsettings.shared.Docker.json | 5 - MyOffice.Shared/appsettings.shared.json | 7 - MyOffice.Tests/Account/AccountAclTests.cs | 65 - .../Account/AccountMotionBalancingTests.cs | 30 - MyOffice.Tests/Account/MotionAddAclTests.cs | 173 -- .../Auth/OpenIddictRedirectUriTests.cs | 22 - MyOffice.Tests/Auth/PasswordHasherTests.cs | 56 - MyOffice.Tests/Data/DemoDataSeederTests.cs | 54 - MyOffice.Tests/MyOffice.Tests.csproj | 29 - MyOffice.Web/App.Config | 4 - MyOffice.Web/Controllers/AccountController.cs | 187 -- .../Controllers/AuthorizationController.cs | 71 - MyOffice.Web/Controllers/BaseApiController.cs | 80 - .../Controllers/DashboardController.cs | 75 - MyOffice.Web/Controllers/GeneralController.cs | 35 - .../SettingsAccountCategoryController.cs | 122 - .../Controllers/SettingsAccountController.cs | 226 -- .../Controllers/SettingsCurrencyController.cs | 142 - .../Controllers/SettingsItemController.cs | 163 -- MyOffice.Web/Controllers/UserController.cs | 189 -- MyOffice.Web/Identity/ContextProvider.cs | 39 - .../Identity/Domain/ApplicationRole.cs | 5 - .../Identity/Domain/ApplicationUser.cs | 17 - .../Domain/ExternalProvidersConfig.cs | 19 - .../ExternalProviderValidatorAuth0.cs | 69 - .../ExternalProviderValidatorGoogle.cs | 36 - .../ExternalProvidersConst.cs | 7 - .../ExternalProvidersConfigExtensions.cs | 24 - .../OpenIddict/ExternalGrantHandler.cs | 137 - .../OpenIddict/OpenIddictClaimsHelper.cs | 41 - .../OpenIddict/OpenIddictConstants.cs | 10 - .../Identity/OpenIddict/OpenIddictSeeder.cs | 130 - .../OpenIddictServiceCollectionExtensions.cs | 192 -- .../OpenIddict/PasswordGrantHandler.cs | 70 - .../Identity/Repositories/AppUserManager.cs | 133 - .../Identity/Repositories/RoleStore.cs | 62 - .../Identity/Repositories/UserStore.cs | 198 -- .../Attributes/AsGuidAttribute.cs | 35 - .../Attributes/DefaultFromBodyAttribute.cs | 71 - .../GlobalModelStateValidatorAttribute.cs | 28 - .../CustomProblemDetailsFactory.cs | 95 - .../DatabaseInitializerHostedService.cs | 33 - .../Infrastructure/Filters/ResponseFilter.cs | 47 - MyOffice.Web/Infrastructure/GlobalSettings.cs | 6 - MyOffice.Web/Infrastructure/RouteHelper.cs | 50 - .../UnhandledExceptionHandler.cs | 48 - .../Models/Account/AccessRightsViewModel.cs | 41 - .../Account/AccountAccessInviteViewModel.cs | 21 - .../Models/Account/AccountAccessViewModel.cs | 24 - .../Account/AccountCategoryViewModel.cs | 30 - .../Account/AccountDetailedViewModel.cs | 20 - .../Models/Account/AccountEditRequestModel.cs | 14 - .../Account/AccountInviteAcceptRequest.cs | 6 - .../Models/Account/AccountViewModel.cs | 61 - .../Models/Account/AccountViewModelProfile.cs | 48 - .../Models/Account/MotionsGetRequest.cs | 12 - MyOffice.Web/Models/Auth/LoginModel.cs | 7 - MyOffice.Web/Models/Auth/RegisterModel.cs | 18 - MyOffice.Web/Models/BaseViewModel.cs | 6 - .../Models/Currency/CurrencyAddModel.cs | 19 - .../Models/Currency/CurrencyEditModel.cs | 11 - .../Currency/CurrencyGlobalViewModel.cs | 22 - .../Models/Currency/CurrencyRateViewModel.cs | 20 - .../Models/Currency/CurrencyViewModel.cs | 36 - .../Dashboard/DashboardIncomeDataViewModel.cs | 17 - .../Models/Dashboard/DashboardViewModel.cs | 17 - MyOffice.Web/Models/IRequestModel.cs | 5 - MyOffice.Web/Models/IResponseModel.cs | 5 - .../Models/Item/ItemCategoryViewModel.cs | 45 - .../Models/Item/ItemChangeCategoryModel.cs | 7 - MyOffice.Web/Models/Item/ItemEditModel.cs | 7 - MyOffice.Web/Models/Item/ItemViewModel.cs | 29 - .../Models/Motion/AccountControllerProfile.cs | 18 - MyOffice.Web/Models/Motion/MotionRequest.cs | 24 - MyOffice.Web/Models/Motion/MotionViewModel.cs | 27 - MyOffice.Web/Models/User/UserViewModel.cs | 19 - MyOffice.Web/Models/ViewModelProfile.cs | 12 - MyOffice.Web/MyOffice.Web.csproj | 54 - MyOffice.Web/Program.Routes.cs | 56 - MyOffice.Web/Program.cs | 449 --- MyOffice.Web/Properties/launchSettings.json | 56 - MyOffice.Web/appsettings.Docker.json | 31 - MyOffice.Web/appsettings.json | 47 - MyOffice.Web/web.Release.config | 18 - MyOffice.Web/web.config | 16 - MyOffice.Web/wwwroot/index.html | 23 - MyOffice.sln | 196 -- PUBLIC.md | 8 + README.md | 110 + proxmox/README.md | 136 + proxmox/deploy.ps1 | 138 + proxmox/fetch-release.sh | 137 + proxmox/install-in-ct.sh | 194 ++ proxmox/myoffice-api.service | 19 + proxmox/myoffice.sh | 490 ++++ proxmox/publish.ps1 | 166 ++ proxmox/publish.sh | 141 + proxmox/release.ps1 | 154 + proxmox/release.sh | 158 + proxmox/sync-public.ps1 | 161 ++ proxmox/sync-public.sh | 183 ++ proxmox/update.sh | 60 + 720 files changed, 2841 insertions(+), 69563 deletions(-) create mode 100644 Docker/Dockerfile.api create mode 100644 Docker/Dockerfile.web create mode 100644 Docker/README.md create mode 100644 Docker/build.ps1 create mode 100644 Docker/build.sh create mode 100644 Docker/dc-postgres-pgadmin.yml create mode 100644 Docker/docker-compose.demo.yml create mode 100644 Docker/nginx.conf create mode 100644 Docker/pgadmin/entrypoint.sh create mode 100644 Docker/pgadmin/servers.json delete mode 100644 MyOffice.Core/Error.cs delete mode 100644 MyOffice.Core/Exec.cs delete mode 100644 MyOffice.Core/Extensions/BoolExtensions.cs delete mode 100644 MyOffice.Core/Extensions/ClaimsExtensions.cs delete mode 100644 MyOffice.Core/Extensions/DateTimeExtensions.cs delete mode 100644 MyOffice.Core/Extensions/GuidExtensions.cs delete mode 100644 MyOffice.Core/Extensions/StringExtensions.cs delete mode 100644 MyOffice.Core/Helpers/JsonHelper.cs delete mode 100644 MyOffice.Core/Helpers/RandomizationHelper.cs delete mode 100644 MyOffice.Core/Identity/IExternalProviderValidator.cs delete mode 100644 MyOffice.Core/Interfaces/IDataModel.cs delete mode 100644 MyOffice.Core/Interfaces/IDataModelDto.cs delete mode 100644 MyOffice.Core/MyOffice.Core.csproj delete mode 100644 MyOffice.Data.Models/Accounts/Account.cs delete mode 100644 MyOffice.Data.Models/Accounts/AccountAccess.cs delete mode 100644 MyOffice.Data.Models/Accounts/AccountAccessInvite.cs delete mode 100644 MyOffice.Data.Models/Accounts/AccountAccountCategory.cs delete mode 100644 MyOffice.Data.Models/Accounts/AccountCategory.cs delete mode 100644 MyOffice.Data.Models/Accounts/Domain/AccountWithRate.cs delete mode 100644 MyOffice.Data.Models/Accounts/Motion.cs delete mode 100644 MyOffice.Data.Models/Currencies/Currency.cs delete mode 100644 MyOffice.Data.Models/Currencies/CurrencyGlobal.cs delete mode 100644 MyOffice.Data.Models/Currencies/CurrencyRate.cs delete mode 100644 MyOffice.Data.Models/Items/Item.cs delete mode 100644 MyOffice.Data.Models/Items/ItemCategory.cs delete mode 100644 MyOffice.Data.Models/Items/ItemGlobal.cs delete mode 100644 MyOffice.Data.Models/MyOffice.Data.Models.csproj delete mode 100644 MyOffice.Data.Models/Notifications/EmailTemplate.cs delete mode 100644 MyOffice.Data.Models/Users/User.cs delete mode 100644 MyOffice.Data.Models/Users/UserExternal.cs delete mode 100644 MyOffice.Data.Models/Verifications/VerificationCode.cs delete mode 100644 MyOffice.Data.Models/Verifications/VerificationCodeTemplateEnum.cs delete mode 100644 MyOffice.Data.Models/Verifications/VerificationCodeTypeEnum.cs delete mode 100644 MyOffice.Data.Repositories/Account/AccountAccessInviteRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/AccountAccessRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/AccountAccountCategoryRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/AccountCategoryRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/AccountRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/IAccountAccessInviteRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/IAccountAccessRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/IAccountAccountCategoryRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/IAccountCategoryRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/IAccountyRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/IMotionRepository.cs delete mode 100644 MyOffice.Data.Repositories/Account/MotionRepository.cs delete mode 100644 MyOffice.Data.Repositories/AppRepository.cs delete mode 100644 MyOffice.Data.Repositories/Currency/CurrencyGlobalRepository.cs delete mode 100644 MyOffice.Data.Repositories/Currency/CurrencyRateRepository.cs delete mode 100644 MyOffice.Data.Repositories/Currency/CurrencyRepository.cs delete mode 100644 MyOffice.Data.Repositories/Currency/ICurrencyGlobalRepository.cs delete mode 100644 MyOffice.Data.Repositories/Currency/ICurrencyRateRepository.cs delete mode 100644 MyOffice.Data.Repositories/Currency/ICurrencyRepository.cs delete mode 100644 MyOffice.Data.Repositories/Item/IItemCategoryRepository.cs delete mode 100644 MyOffice.Data.Repositories/Item/IItemGlobalRepository.cs delete mode 100644 MyOffice.Data.Repositories/Item/IItemRepository.cs delete mode 100644 MyOffice.Data.Repositories/Item/ItemCategoryRepository.cs delete mode 100644 MyOffice.Data.Repositories/Item/ItemGlobalRepository.cs delete mode 100644 MyOffice.Data.Repositories/Item/ItemRepository.cs delete mode 100644 MyOffice.Data.Repositories/MyOffice.Data.Repositories.csproj delete mode 100644 MyOffice.Data.Repositories/Notifications/EmailTemplateRepository.cs delete mode 100644 MyOffice.Data.Repositories/Notifications/IEmailTemplateRepository.cs delete mode 100644 MyOffice.Data.Repositories/RepositoryBase.cs delete mode 100644 MyOffice.Data.Repositories/Users/IUserExternalRepository.cs delete mode 100644 MyOffice.Data.Repositories/Users/IUserRepository.cs delete mode 100644 MyOffice.Data.Repositories/Users/UserExternalRepository.cs delete mode 100644 MyOffice.Data.Repositories/Users/UserRepository.cs delete mode 100644 MyOffice.Data.Repositories/Verifications/IVerificationCodeRepository.cs delete mode 100644 MyOffice.Data.Repositories/Verifications/VerificationCodeRepository.cs delete mode 100644 MyOffice.DbContext/AppDbContext.cs delete mode 100644 MyOffice.DbContext/AppDbContextFactory.cs delete mode 100644 MyOffice.DbContext/DatabaseBootstrapper.cs delete mode 100644 MyOffice.DbContext/DbContextServiceCollectionExtensions.cs delete mode 100644 MyOffice.DbContext/DemoDataSeeder.cs delete mode 100644 MyOffice.DbContext/MyOffice.DbContext.csproj delete mode 100644 MyOffice.DbContext/RepositoryInitializer.cs delete mode 100644 MyOffice.Migration.Postgres/AppDbContextFactoryPostgres.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230621190024_Init.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230621190024_Init.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230627044606_IsInternal.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230627044606_IsInternal.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230720190103_PrimaryCurrencyDeletedMotion.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230720190103_PrimaryCurrencyDeletedMotion.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230721175243_CurrentRate.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230721175243_CurrentRate.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230721180304_CurrentRateRemove.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230721180304_CurrentRateRemove.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230721180851_CurrentRateV2.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230721180851_CurrentRateV2.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230721200424_AccountType.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230721200424_AccountType.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230722051335_AccountType2.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230722051335_AccountType2.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230722052053_AccountOwner.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230722052053_AccountOwner.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230725054028_Collation.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230725054028_Collation.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230725061203_CollationR.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230725061203_CollationR.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230725061910_CollationR2.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230725061910_CollationR2.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230726160638_AccessOwner.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230726160638_AccessOwner.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230726161226_AccessOwner2.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230726161226_AccessOwner2.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230728172249_AccountAccessInvites.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230728172249_AccountAccessInvites.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230728181916_AccountAccessInvites2.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230728181916_AccountAccessInvites2.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230728192017_AccountAccessInvites3.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230728192017_AccountAccessInvites3.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230804145453_AccountAccesUnique.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20230804145453_AccountAccesUnique.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20231217163807_acc_cat_unique.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20231217163807_acc_cat_unique.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20231217185452_acc_access_unique.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20231217185452_acc_access_unique.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20240107073407_VerificationCode.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20240107073407_VerificationCode.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20240107075033_VerificationCode2.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20240107075033_VerificationCode2.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20260717093113_OpenIddict.Designer.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/20260717093113_OpenIddict.cs delete mode 100644 MyOffice.Migration.Postgres/Migrations/AppDbContextModelSnapshot.cs delete mode 100644 MyOffice.Migration.Postgres/MyOffice.Migrations.Postgres.csproj delete mode 100644 MyOffice.Migration.Sqlite/AppDbContextFactorySqlite.cs delete mode 100644 MyOffice.Migration.Sqlite/Migrations/20260717093158_OpenIddict.Designer.cs delete mode 100644 MyOffice.Migration.Sqlite/Migrations/20260717093158_OpenIddict.cs delete mode 100644 MyOffice.Migration.Sqlite/Migrations/AppDbContextModelSnapshot.cs delete mode 100644 MyOffice.Migration.Sqlite/MyOffice.Migrations.Sqlite.csproj delete mode 100644 MyOffice.SPA/.editorconfig delete mode 100644 MyOffice.SPA/.eslintrc.json delete mode 100644 MyOffice.SPA/.gitignore delete mode 100644 MyOffice.SPA/.npmrc delete mode 100644 MyOffice.SPA/MyOffice.SPA.esproj delete mode 100644 MyOffice.SPA/README.md delete mode 100644 MyOffice.SPA/angular.json delete mode 100644 MyOffice.SPA/aspnetcore-https.js delete mode 100644 MyOffice.SPA/karma.conf.js delete mode 100644 MyOffice.SPA/nuget.config delete mode 100644 MyOffice.SPA/package.json delete mode 100644 MyOffice.SPA/src/app/api-routes.ts delete mode 100644 MyOffice.SPA/src/app/app-routing.module.ts delete mode 100644 MyOffice.SPA/src/app/app.component.html delete mode 100644 MyOffice.SPA/src/app/app.component.scss delete mode 100644 MyOffice.SPA/src/app/app.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/app.component.ts delete mode 100644 MyOffice.SPA/src/app/app.config.ts delete mode 100644 MyOffice.SPA/src/app/authentication/authentication-routing.module.ts delete mode 100644 MyOffice.SPA/src/app/authentication/authentication.module.ts delete mode 100644 MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.html delete mode 100644 MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.scss delete mode 100644 MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.ts delete mode 100644 MyOffice.SPA/src/app/authentication/locked/locked.component.html delete mode 100644 MyOffice.SPA/src/app/authentication/locked/locked.component.scss delete mode 100644 MyOffice.SPA/src/app/authentication/locked/locked.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/authentication/locked/locked.component.ts delete mode 100644 MyOffice.SPA/src/app/authentication/page404/page404.component.html delete mode 100644 MyOffice.SPA/src/app/authentication/page404/page404.component.scss delete mode 100644 MyOffice.SPA/src/app/authentication/page404/page404.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/authentication/page404/page404.component.ts delete mode 100644 MyOffice.SPA/src/app/authentication/page500/page500.component.html delete mode 100644 MyOffice.SPA/src/app/authentication/page500/page500.component.scss delete mode 100644 MyOffice.SPA/src/app/authentication/page500/page500.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/authentication/page500/page500.component.ts delete mode 100644 MyOffice.SPA/src/app/authentication/signin/signin.component.html delete mode 100644 MyOffice.SPA/src/app/authentication/signin/signin.component.scss delete mode 100644 MyOffice.SPA/src/app/authentication/signin/signin.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/authentication/signin/signin.component.ts delete mode 100644 MyOffice.SPA/src/app/authentication/signup/signup.component.html delete mode 100644 MyOffice.SPA/src/app/authentication/signup/signup.component.scss delete mode 100644 MyOffice.SPA/src/app/authentication/signup/signup.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/authentication/signup/signup.component.ts delete mode 100644 MyOffice.SPA/src/app/config.external-login.ts delete mode 100644 MyOffice.SPA/src/app/config.oidc.ts delete mode 100644 MyOffice.SPA/src/app/config/config.service.ts delete mode 100644 MyOffice.SPA/src/app/config/ui.config.ts delete mode 100644 MyOffice.SPA/src/app/core/core.module.ts delete mode 100644 MyOffice.SPA/src/app/core/extensions/general.extensions.ts delete mode 100644 MyOffice.SPA/src/app/core/extensions/router.extensions.ts delete mode 100644 MyOffice.SPA/src/app/core/guard/auth.guard.ts delete mode 100644 MyOffice.SPA/src/app/core/guard/module-import.guard.ts delete mode 100644 MyOffice.SPA/src/app/core/interceptor/error.interceptor.ts delete mode 100644 MyOffice.SPA/src/app/core/interceptor/fake-backend.ts delete mode 100644 MyOffice.SPA/src/app/core/interceptor/update.date.http.interceptor .ts delete mode 100644 MyOffice.SPA/src/app/core/models/config.interface.ts delete mode 100644 MyOffice.SPA/src/app/core/models/general-error.model.ts delete mode 100644 MyOffice.SPA/src/app/core/models/general-result.model.ts delete mode 100644 MyOffice.SPA/src/app/core/models/login.model.ts delete mode 100644 MyOffice.SPA/src/app/core/models/register.model.ts delete mode 100644 MyOffice.SPA/src/app/core/models/selectable.model.spec.ts delete mode 100644 MyOffice.SPA/src/app/core/models/selectable.model.ts delete mode 100644 MyOffice.SPA/src/app/core/models/user-profile.model.ts delete mode 100644 MyOffice.SPA/src/app/core/models/user.model.ts delete mode 100644 MyOffice.SPA/src/app/core/service/auth.service.spec.ts delete mode 100644 MyOffice.SPA/src/app/core/service/auth.service.ts delete mode 100644 MyOffice.SPA/src/app/core/service/direction.service.ts delete mode 100644 MyOffice.SPA/src/app/core/service/language.service.ts delete mode 100644 MyOffice.SPA/src/app/core/service/oidc-helper.service.ts delete mode 100644 MyOffice.SPA/src/app/core/service/rightsidebar.service.ts delete mode 100644 MyOffice.SPA/src/app/core/utils/safe-redirect.spec.ts delete mode 100644 MyOffice.SPA/src/app/core/utils/safe-redirect.ts delete mode 100644 MyOffice.SPA/src/app/core/validators/atleastone.validator.ts delete mode 100644 MyOffice.SPA/src/app/core/validators/atleastonenumber.validator.ts delete mode 100644 MyOffice.SPA/src/app/dashboard/dashboard-routing.module.ts delete mode 100644 MyOffice.SPA/src/app/dashboard/dashboard.module.ts delete mode 100644 MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.html delete mode 100644 MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.scss delete mode 100644 MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.ts delete mode 100644 MyOffice.SPA/src/app/dashboard/income/dashboard.component.html delete mode 100644 MyOffice.SPA/src/app/dashboard/income/dashboard.component.scss delete mode 100644 MyOffice.SPA/src/app/dashboard/income/dashboard.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/dashboard/income/dashboard.component.ts delete mode 100644 MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.html delete mode 100644 MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.scss delete mode 100644 MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.ts delete mode 100644 MyOffice.SPA/src/app/layout/app-layout/auth-layout/auth-layout.component.html delete mode 100644 MyOffice.SPA/src/app/layout/app-layout/auth-layout/auth-layout.component.ts delete mode 100644 MyOffice.SPA/src/app/layout/app-layout/main-layout/main-layout.component.html delete mode 100644 MyOffice.SPA/src/app/layout/app-layout/main-layout/main-layout.component.ts delete mode 100644 MyOffice.SPA/src/app/layout/header/header.component.html delete mode 100644 MyOffice.SPA/src/app/layout/header/header.component.scss delete mode 100644 MyOffice.SPA/src/app/layout/header/header.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/layout/header/header.component.ts delete mode 100644 MyOffice.SPA/src/app/layout/page-loader/page-loader.component.html delete mode 100644 MyOffice.SPA/src/app/layout/page-loader/page-loader.component.scss delete mode 100644 MyOffice.SPA/src/app/layout/page-loader/page-loader.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/layout/page-loader/page-loader.component.ts delete mode 100644 MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.html delete mode 100644 MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.scss delete mode 100644 MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.ts delete mode 100644 MyOffice.SPA/src/app/layout/sidebar/sidebar-items.ts delete mode 100644 MyOffice.SPA/src/app/layout/sidebar/sidebar.component.html delete mode 100644 MyOffice.SPA/src/app/layout/sidebar/sidebar.component.scss delete mode 100644 MyOffice.SPA/src/app/layout/sidebar/sidebar.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/layout/sidebar/sidebar.component.ts delete mode 100644 MyOffice.SPA/src/app/layout/sidebar/sidebar.metadata.ts delete mode 100644 MyOffice.SPA/src/app/model/account.accessRight.model.ts delete mode 100644 MyOffice.SPA/src/app/model/account.category.model.ts delete mode 100644 MyOffice.SPA/src/app/model/account.detailed.model.ts delete mode 100644 MyOffice.SPA/src/app/model/account.invite.model.ts delete mode 100644 MyOffice.SPA/src/app/model/account.model.ts delete mode 100644 MyOffice.SPA/src/app/model/currency.model.ts delete mode 100644 MyOffice.SPA/src/app/model/dashboard.model.ts delete mode 100644 MyOffice.SPA/src/app/model/item.category.model.ts delete mode 100644 MyOffice.SPA/src/app/model/item.model.ts delete mode 100644 MyOffice.SPA/src/app/model/motion.model.ts delete mode 100644 MyOffice.SPA/src/app/pages/accounts/account.component.html delete mode 100644 MyOffice.SPA/src/app/pages/accounts/account.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/accounts/account.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/accounts/account.list.component.html delete mode 100644 MyOffice.SPA/src/app/pages/accounts/account.list.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/accounts/account.list.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/accounts/motion.component.html delete mode 100644 MyOffice.SPA/src/app/pages/accounts/motion.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/accounts/motion.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/pages-routing.module.ts delete mode 100644 MyOffice.SPA/src/app/pages/pages.module.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/access.account.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/access.account.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/access.account.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/account.category.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/account.category.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/account.category.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/account.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/account.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/account.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/add.account.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/add.account.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/add.account.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/edit.account.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/edit.account.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/account/edit.account.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/currency/currency.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/currency/currency.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/currency/currency.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/edit.item.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/edit.item.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/edit.item.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/item.category.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/item.category.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/item.category.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/item.component.html delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/item.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/settings/item/item.component.ts delete mode 100644 MyOffice.SPA/src/app/pages/user-profile/user-profile.component.html delete mode 100644 MyOffice.SPA/src/app/pages/user-profile/user-profile.component.scss delete mode 100644 MyOffice.SPA/src/app/pages/user-profile/user-profile.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/pages/user-profile/user-profile.component.ts delete mode 100644 MyOffice.SPA/src/app/services/account.category.service.ts delete mode 100644 MyOffice.SPA/src/app/services/account.service.ts delete mode 100644 MyOffice.SPA/src/app/services/currency.service.ts delete mode 100644 MyOffice.SPA/src/app/services/item.service.ts delete mode 100644 MyOffice.SPA/src/app/shared/TableElement.ts delete mode 100644 MyOffice.SPA/src/app/shared/UnsubscribeOnDestroyAdapter.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.html delete mode 100644 MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.scss delete mode 100644 MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/components.module.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/date-period/date-period.component.css delete mode 100644 MyOffice.SPA/src/app/shared/components/date-period/date-period.component.html delete mode 100644 MyOffice.SPA/src/app/shared/components/date-period/date-period.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/date-period/date-period.component.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.html delete mode 100644 MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.scss delete mode 100644 MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.html delete mode 100644 MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.scss delete mode 100644 MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.module.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.html delete mode 100644 MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.scss delete mode 100644 MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.spec.ts delete mode 100644 MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.ts delete mode 100644 MyOffice.SPA/src/app/shared/feather-icons.module.ts delete mode 100644 MyOffice.SPA/src/app/shared/material.module.ts delete mode 100644 MyOffice.SPA/src/app/shared/shared.module.ts delete mode 100644 MyOffice.SPA/src/app/shared/sub-sink.ts delete mode 100644 MyOffice.SPA/src/app/shared/tableExportUtil.ts delete mode 100644 MyOffice.SPA/src/assets/.gitkeep delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.eot delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.svg delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.ttf delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.woff delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.woff2 delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-regular-400.eot delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-regular-400.svg delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-regular-400.ttf delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-regular-400.woff delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-regular-400.woff2 delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.eot delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.svg delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.ttf delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.woff delete mode 100644 MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.woff2 delete mode 100644 MyOffice.SPA/src/assets/fonts/poppins/poppins-v5-latin-regular.eot delete mode 100644 MyOffice.SPA/src/assets/fonts/poppins/poppins-v5-latin-regular.svg delete mode 100644 MyOffice.SPA/src/assets/fonts/poppins/poppins-v5-latin-regular.ttf delete mode 100644 MyOffice.SPA/src/assets/fonts/poppins/poppins-v5-latin-regular.woff delete mode 100644 MyOffice.SPA/src/assets/fonts/poppins/poppins-v5-latin-regular.woff2 delete mode 100644 MyOffice.SPA/src/assets/i18n/de.json delete mode 100644 MyOffice.SPA/src/assets/i18n/en.json delete mode 100644 MyOffice.SPA/src/assets/i18n/es.json delete mode 100644 MyOffice.SPA/src/assets/i18n/ua.json delete mode 100644 MyOffice.SPA/src/assets/images/apps/calendar.png delete mode 100644 MyOffice.SPA/src/assets/images/apps/chat.png delete mode 100644 MyOffice.SPA/src/assets/images/apps/contact.png delete mode 100644 MyOffice.SPA/src/assets/images/apps/gallery.png delete mode 100644 MyOffice.SPA/src/assets/images/apps/mail.png delete mode 100644 MyOffice.SPA/src/assets/images/apps/support.png delete mode 100644 MyOffice.SPA/src/assets/images/apps/table.png delete mode 100644 MyOffice.SPA/src/assets/images/apps/task.png delete mode 100644 MyOffice.SPA/src/assets/images/banner/1.png delete mode 100644 MyOffice.SPA/src/assets/images/banner/2.png delete mode 100644 MyOffice.SPA/src/assets/images/banner/3.png delete mode 100644 MyOffice.SPA/src/assets/images/banner/4.png delete mode 100644 MyOffice.SPA/src/assets/images/dark.png delete mode 100644 MyOffice.SPA/src/assets/images/details_close.png delete mode 100644 MyOffice.SPA/src/assets/images/details_open.png delete mode 100644 MyOffice.SPA/src/assets/images/favicon.ico delete mode 100644 MyOffice.SPA/src/assets/images/flags/germany.jpg delete mode 100644 MyOffice.SPA/src/assets/images/flags/spain.jpg delete mode 100644 MyOffice.SPA/src/assets/images/flags/ukraine.png delete mode 100644 MyOffice.SPA/src/assets/images/flags/us.jpg delete mode 100644 MyOffice.SPA/src/assets/images/icons/xlsx.png delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/1.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/10.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/11.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/12.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/2.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/3.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/4.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/5.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/6.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/7.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/8.jpg delete mode 100644 MyOffice.SPA/src/assets/images/image-gallery/9.jpg delete mode 100644 MyOffice.SPA/src/assets/images/invoice_logo.png delete mode 100644 MyOffice.SPA/src/assets/images/light.png delete mode 100644 MyOffice.SPA/src/assets/images/logo.png delete mode 100644 MyOffice.SPA/src/assets/images/media.png delete mode 100644 MyOffice.SPA/src/assets/images/pages/bg-01.png delete mode 100644 MyOffice.SPA/src/assets/images/pages/bg-02.png delete mode 100644 MyOffice.SPA/src/assets/images/pages/bg-03.png delete mode 100644 MyOffice.SPA/src/assets/images/pages/bg-04.png delete mode 100644 MyOffice.SPA/src/assets/images/pages/bg-05.png delete mode 100644 MyOffice.SPA/src/assets/images/pages/home-1.png delete mode 100644 MyOffice.SPA/src/assets/images/posts/post1.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post10.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post11.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post12.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post13.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post2.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post3.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post4.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post5.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post6.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post7.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post8.jpg delete mode 100644 MyOffice.SPA/src/assets/images/posts/post9.jpg delete mode 100644 MyOffice.SPA/src/assets/images/products/p-13.jpg delete mode 100644 MyOffice.SPA/src/assets/images/products/p-14.jpg delete mode 100644 MyOffice.SPA/src/assets/images/products/p-15.jpg delete mode 100644 MyOffice.SPA/src/assets/images/test.pdf delete mode 100644 MyOffice.SPA/src/assets/images/thumbs-up.png delete mode 100644 MyOffice.SPA/src/assets/images/user/admin.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user1.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user10.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user11.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user2.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user3.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user4.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user5.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user6.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user7.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user8.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/user9.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig1.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig10.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig11.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig2.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig3.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig4.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig5.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig6.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig7.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig8.jpg delete mode 100644 MyOffice.SPA/src/assets/images/user/usrbig9.jpg delete mode 100644 MyOffice.SPA/src/assets/scss/apps/_calendar.scss delete mode 100644 MyOffice.SPA/src/assets/scss/apps/_chat.scss delete mode 100644 MyOffice.SPA/src/assets/scss/apps/_contactgrid.scss delete mode 100644 MyOffice.SPA/src/assets/scss/apps/_contactlist.scss delete mode 100644 MyOffice.SPA/src/assets/scss/apps/_dragdrop.scss delete mode 100644 MyOffice.SPA/src/assets/scss/apps/_task.scss delete mode 100644 MyOffice.SPA/src/assets/scss/browser/_ie10.scss delete mode 100644 MyOffice.SPA/src/assets/scss/browser/_ie11.scss delete mode 100644 MyOffice.SPA/src/assets/scss/common/_animation.scss delete mode 100644 MyOffice.SPA/src/assets/scss/common/_customanimate.scss delete mode 100644 MyOffice.SPA/src/assets/scss/common/_demo.scss delete mode 100644 MyOffice.SPA/src/assets/scss/common/_general.scss delete mode 100644 MyOffice.SPA/src/assets/scss/common/_helpers.scss delete mode 100644 MyOffice.SPA/src/assets/scss/common/_media.scss delete mode 100644 MyOffice.SPA/src/assets/scss/common/_mixins.scss delete mode 100644 MyOffice.SPA/src/assets/scss/common/_rtl.scss delete mode 100644 MyOffice.SPA/src/assets/scss/common/_variables.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_breadcrumbs.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_checkboxradio.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_dropdownmenu.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_feed.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_formcomponents.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_infobox.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_inputformgroup.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_labels.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_leftsidebaroverlay.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_navbar.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_navtabs.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_noticeboard.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_rightsidebar.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_searchbar.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_settingSidebar.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_switch.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_thumbnails.scss delete mode 100644 MyOffice.SPA/src/assets/scss/components/_todo.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_animated.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_bordered-pulled.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_core.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_fixed-width.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_icons.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_larger.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_list.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_mixins.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_rotated-flipped.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_screen-reader.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_shims.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_stacked.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/_variables.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/brands.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/fontawesome.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/regular.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/solid.scss delete mode 100644 MyOffice.SPA/src/assets/scss/fonts/fontawesome/v4-shims.scss delete mode 100644 MyOffice.SPA/src/assets/scss/pages/_auth.scss delete mode 100644 MyOffice.SPA/src/assets/scss/pages/_dashboard.scss delete mode 100644 MyOffice.SPA/src/assets/scss/pages/_inbox.scss delete mode 100644 MyOffice.SPA/src/assets/scss/pages/_pricing.scss delete mode 100644 MyOffice.SPA/src/assets/scss/pages/_profile.scss delete mode 100644 MyOffice.SPA/src/assets/scss/pages/_projects.scss delete mode 100644 MyOffice.SPA/src/assets/scss/pages/_timeline.scss delete mode 100644 MyOffice.SPA/src/assets/scss/plugins/_carousel.scss delete mode 100644 MyOffice.SPA/src/assets/scss/plugins/_charts.scss delete mode 100644 MyOffice.SPA/src/assets/scss/plugins/_formwizard.scss delete mode 100644 MyOffice.SPA/src/assets/scss/plugins/_imagegallery.scss delete mode 100644 MyOffice.SPA/src/assets/scss/plugins/_maps.scss delete mode 100644 MyOffice.SPA/src/assets/scss/plugins/_tables.scss delete mode 100644 MyOffice.SPA/src/assets/scss/style.scss delete mode 100644 MyOffice.SPA/src/assets/scss/theme/_dark.scss delete mode 100644 MyOffice.SPA/src/assets/scss/theme/_theme-black.scss delete mode 100644 MyOffice.SPA/src/assets/scss/theme/_theme-color-variables.scss delete mode 100644 MyOffice.SPA/src/assets/scss/theme/_theme-white.scss delete mode 100644 MyOffice.SPA/src/assets/scss/theme/all-themes.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_alerts.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_badgelistgroupitem.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_buttons.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_card.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_ckeditor.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_collapse.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_dialogs.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_expansion.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_listItems.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_mediaobject.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_modals.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_pageloader.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_pagination.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_panels.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_preloaders.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_progressbars.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_slider.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_snackbar.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_tabs.scss delete mode 100644 MyOffice.SPA/src/assets/scss/ui/_tooltippopovers.scss delete mode 100644 MyOffice.SPA/src/environments/environment.docker.ts delete mode 100644 MyOffice.SPA/src/environments/environment.proxmox.ts delete mode 100644 MyOffice.SPA/src/environments/environment.sample.ts delete mode 100644 MyOffice.SPA/src/favicon.ico delete mode 100644 MyOffice.SPA/src/index.html delete mode 100644 MyOffice.SPA/src/main.ts delete mode 100644 MyOffice.SPA/src/polyfills.ts delete mode 100644 MyOffice.SPA/src/proxy.conf.js delete mode 100644 MyOffice.SPA/src/silent-refresh.html delete mode 100644 MyOffice.SPA/src/styles.scss delete mode 100644 MyOffice.SPA/src/styles/_variables.scss delete mode 100644 MyOffice.SPA/src/styles/global.scss delete mode 100644 MyOffice.SPA/src/styles/reset.scss delete mode 100644 MyOffice.SPA/src/styles/styles.scss delete mode 100644 MyOffice.SPA/src/test.ts delete mode 100644 MyOffice.SPA/tsconfig.app.json delete mode 100644 MyOffice.SPA/tsconfig.json delete mode 100644 MyOffice.SPA/tsconfig.spec.json delete mode 100644 MyOffice.Services/Account/AccountAcl.cs delete mode 100644 MyOffice.Services/Account/AccountMotionBalancing.cs delete mode 100644 MyOffice.Services/Account/AccountService.Access.cs delete mode 100644 MyOffice.Services/Account/AccountService.AccessRights.cs delete mode 100644 MyOffice.Services/Account/AccountService.Account.cs delete mode 100644 MyOffice.Services/Account/AccountService.AccountCategory.cs delete mode 100644 MyOffice.Services/Account/AccountService.Motion.cs delete mode 100644 MyOffice.Services/Account/AccountService.cs delete mode 100644 MyOffice.Services/Account/Domain/AccessInviteStatus.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountAccessDto.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountAccessInviteDto.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountAccountCategoryDto.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountAdd.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountAddStatus.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountCategoryDto.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountCategoryRemoveResult.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountDetailedDto.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountDto.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountEdit.cs delete mode 100644 MyOffice.Services/Account/Domain/AccountEditStatus.cs delete mode 100644 MyOffice.Services/Account/Domain/InviteAcceptStatus.cs delete mode 100644 MyOffice.Services/Account/Domain/ItemCategoryDto.cs delete mode 100644 MyOffice.Services/Account/Domain/ItemDto.cs delete mode 100644 MyOffice.Services/Account/Domain/MotionAddStatus.cs delete mode 100644 MyOffice.Services/Account/Domain/MotionAddUpdate.cs delete mode 100644 MyOffice.Services/Account/Domain/MotionDeleteStatus.cs delete mode 100644 MyOffice.Services/Account/Domain/MotionDto.cs delete mode 100644 MyOffice.Services/Account/Domain/MotionUpdateStatus.cs delete mode 100644 MyOffice.Services/Account/Domain/UserDto.cs delete mode 100644 MyOffice.Services/Currency/CurrencyService.cs delete mode 100644 MyOffice.Services/Currency/Domain/CurrencyAddRateStatus.cs delete mode 100644 MyOffice.Services/Currency/Domain/CurrencyAddStatus.cs delete mode 100644 MyOffice.Services/Currency/Domain/CurrencyDto.cs delete mode 100644 MyOffice.Services/Currency/Domain/CurrencyEdit.cs delete mode 100644 MyOffice.Services/Currency/Domain/CurrencyEditStatus.cs delete mode 100644 MyOffice.Services/Currency/Domain/CurrencyGlobalDto.cs delete mode 100644 MyOffice.Services/Currency/Domain/CurrencyRateDto.cs delete mode 100644 MyOffice.Services/Currency/Domain/CurrencyWithRateDto.cs delete mode 100644 MyOffice.Services/Dashboard/DashboardService.cs delete mode 100644 MyOffice.Services/Dashboard/Domain/DashboardData.cs delete mode 100644 MyOffice.Services/Identity/IContextProvider.cs delete mode 100644 MyOffice.Services/Item/Domain/ItemCategoryRemoveResult.cs delete mode 100644 MyOffice.Services/Item/Domain/ItemGetOrAddResult.cs delete mode 100644 MyOffice.Services/Item/ItemService.cs delete mode 100644 MyOffice.Services/Mapper/AutomapperExtensions.cs delete mode 100644 MyOffice.Services/Mapper/BaseMappingAction.cs delete mode 100644 MyOffice.Services/Mapper/BaseProfile.cs delete mode 100644 MyOffice.Services/Mapper/UserIdResolver.cs delete mode 100644 MyOffice.Services/MyOffice.Services.csproj delete mode 100644 MyOffice.Services/Notifications/EmailNotificationService.cs delete mode 100644 MyOffice.Services/Users/Domain/AddUserExternalStatusEnum.cs delete mode 100644 MyOffice.Services/Users/UserService.cs delete mode 100644 MyOffice.Services/Validators/ContextValidator.cs delete mode 100644 MyOffice.Services/Verifications/VerificationService.cs delete mode 100644 MyOffice.Shared/Configuration.cs delete mode 100644 MyOffice.Shared/MyOffice.Shared.csproj delete mode 100644 MyOffice.Shared/appsettings.shared.Docker.json delete mode 100644 MyOffice.Shared/appsettings.shared.json delete mode 100644 MyOffice.Tests/Account/AccountAclTests.cs delete mode 100644 MyOffice.Tests/Account/AccountMotionBalancingTests.cs delete mode 100644 MyOffice.Tests/Account/MotionAddAclTests.cs delete mode 100644 MyOffice.Tests/Auth/OpenIddictRedirectUriTests.cs delete mode 100644 MyOffice.Tests/Auth/PasswordHasherTests.cs delete mode 100644 MyOffice.Tests/Data/DemoDataSeederTests.cs delete mode 100644 MyOffice.Tests/MyOffice.Tests.csproj delete mode 100644 MyOffice.Web/App.Config delete mode 100644 MyOffice.Web/Controllers/AccountController.cs delete mode 100644 MyOffice.Web/Controllers/AuthorizationController.cs delete mode 100644 MyOffice.Web/Controllers/BaseApiController.cs delete mode 100644 MyOffice.Web/Controllers/DashboardController.cs delete mode 100644 MyOffice.Web/Controllers/GeneralController.cs delete mode 100644 MyOffice.Web/Controllers/SettingsAccountCategoryController.cs delete mode 100644 MyOffice.Web/Controllers/SettingsAccountController.cs delete mode 100644 MyOffice.Web/Controllers/SettingsCurrencyController.cs delete mode 100644 MyOffice.Web/Controllers/SettingsItemController.cs delete mode 100644 MyOffice.Web/Controllers/UserController.cs delete mode 100644 MyOffice.Web/Identity/ContextProvider.cs delete mode 100644 MyOffice.Web/Identity/Domain/ApplicationRole.cs delete mode 100644 MyOffice.Web/Identity/Domain/ApplicationUser.cs delete mode 100644 MyOffice.Web/Identity/Domain/ExternalProvidersConfig.cs delete mode 100644 MyOffice.Web/Identity/ExternalProviders/ExternalProviderValidatorAuth0.cs delete mode 100644 MyOffice.Web/Identity/ExternalProviders/ExternalProviderValidatorGoogle.cs delete mode 100644 MyOffice.Web/Identity/ExternalProviders/ExternalProvidersConst.cs delete mode 100644 MyOffice.Web/Identity/ExternalProvidersConfigExtensions.cs delete mode 100644 MyOffice.Web/Identity/OpenIddict/ExternalGrantHandler.cs delete mode 100644 MyOffice.Web/Identity/OpenIddict/OpenIddictClaimsHelper.cs delete mode 100644 MyOffice.Web/Identity/OpenIddict/OpenIddictConstants.cs delete mode 100644 MyOffice.Web/Identity/OpenIddict/OpenIddictSeeder.cs delete mode 100644 MyOffice.Web/Identity/OpenIddict/OpenIddictServiceCollectionExtensions.cs delete mode 100644 MyOffice.Web/Identity/OpenIddict/PasswordGrantHandler.cs delete mode 100644 MyOffice.Web/Identity/Repositories/AppUserManager.cs delete mode 100644 MyOffice.Web/Identity/Repositories/RoleStore.cs delete mode 100644 MyOffice.Web/Identity/Repositories/UserStore.cs delete mode 100644 MyOffice.Web/Infrastructure/Attributes/AsGuidAttribute.cs delete mode 100644 MyOffice.Web/Infrastructure/Attributes/DefaultFromBodyAttribute.cs delete mode 100644 MyOffice.Web/Infrastructure/Attributes/GlobalModelStateValidatorAttribute.cs delete mode 100644 MyOffice.Web/Infrastructure/CustomProblemDetailsFactory.cs delete mode 100644 MyOffice.Web/Infrastructure/DatabaseInitializerHostedService.cs delete mode 100644 MyOffice.Web/Infrastructure/Filters/ResponseFilter.cs delete mode 100644 MyOffice.Web/Infrastructure/GlobalSettings.cs delete mode 100644 MyOffice.Web/Infrastructure/RouteHelper.cs delete mode 100644 MyOffice.Web/Infrastructure/UnhandledExceptionHandler.cs delete mode 100644 MyOffice.Web/Models/Account/AccessRightsViewModel.cs delete mode 100644 MyOffice.Web/Models/Account/AccountAccessInviteViewModel.cs delete mode 100644 MyOffice.Web/Models/Account/AccountAccessViewModel.cs delete mode 100644 MyOffice.Web/Models/Account/AccountCategoryViewModel.cs delete mode 100644 MyOffice.Web/Models/Account/AccountDetailedViewModel.cs delete mode 100644 MyOffice.Web/Models/Account/AccountEditRequestModel.cs delete mode 100644 MyOffice.Web/Models/Account/AccountInviteAcceptRequest.cs delete mode 100644 MyOffice.Web/Models/Account/AccountViewModel.cs delete mode 100644 MyOffice.Web/Models/Account/AccountViewModelProfile.cs delete mode 100644 MyOffice.Web/Models/Account/MotionsGetRequest.cs delete mode 100644 MyOffice.Web/Models/Auth/LoginModel.cs delete mode 100644 MyOffice.Web/Models/Auth/RegisterModel.cs delete mode 100644 MyOffice.Web/Models/BaseViewModel.cs delete mode 100644 MyOffice.Web/Models/Currency/CurrencyAddModel.cs delete mode 100644 MyOffice.Web/Models/Currency/CurrencyEditModel.cs delete mode 100644 MyOffice.Web/Models/Currency/CurrencyGlobalViewModel.cs delete mode 100644 MyOffice.Web/Models/Currency/CurrencyRateViewModel.cs delete mode 100644 MyOffice.Web/Models/Currency/CurrencyViewModel.cs delete mode 100644 MyOffice.Web/Models/Dashboard/DashboardIncomeDataViewModel.cs delete mode 100644 MyOffice.Web/Models/Dashboard/DashboardViewModel.cs delete mode 100644 MyOffice.Web/Models/IRequestModel.cs delete mode 100644 MyOffice.Web/Models/IResponseModel.cs delete mode 100644 MyOffice.Web/Models/Item/ItemCategoryViewModel.cs delete mode 100644 MyOffice.Web/Models/Item/ItemChangeCategoryModel.cs delete mode 100644 MyOffice.Web/Models/Item/ItemEditModel.cs delete mode 100644 MyOffice.Web/Models/Item/ItemViewModel.cs delete mode 100644 MyOffice.Web/Models/Motion/AccountControllerProfile.cs delete mode 100644 MyOffice.Web/Models/Motion/MotionRequest.cs delete mode 100644 MyOffice.Web/Models/Motion/MotionViewModel.cs delete mode 100644 MyOffice.Web/Models/User/UserViewModel.cs delete mode 100644 MyOffice.Web/Models/ViewModelProfile.cs delete mode 100644 MyOffice.Web/MyOffice.Web.csproj delete mode 100644 MyOffice.Web/Program.Routes.cs delete mode 100644 MyOffice.Web/Program.cs delete mode 100644 MyOffice.Web/Properties/launchSettings.json delete mode 100644 MyOffice.Web/appsettings.Docker.json delete mode 100644 MyOffice.Web/appsettings.json delete mode 100644 MyOffice.Web/web.Release.config delete mode 100644 MyOffice.Web/web.config delete mode 100644 MyOffice.Web/wwwroot/index.html delete mode 100644 MyOffice.sln create mode 100644 PUBLIC.md create mode 100644 README.md create mode 100644 proxmox/README.md create mode 100644 proxmox/deploy.ps1 create mode 100644 proxmox/fetch-release.sh create mode 100644 proxmox/install-in-ct.sh create mode 100644 proxmox/myoffice-api.service create mode 100644 proxmox/myoffice.sh create mode 100644 proxmox/publish.ps1 create mode 100755 proxmox/publish.sh create mode 100644 proxmox/release.ps1 create mode 100755 proxmox/release.sh create mode 100644 proxmox/sync-public.ps1 create mode 100755 proxmox/sync-public.sh create mode 100644 proxmox/update.sh diff --git a/Docker/Dockerfile.api b/Docker/Dockerfile.api new file mode 100644 index 0000000..36b667d --- /dev/null +++ b/Docker/Dockerfile.api @@ -0,0 +1,39 @@ +# MyOffice API (Kestrel :8080) — build from repo root: +# docker build -f Docker/Dockerfile.api -t myoffice-api . +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build +WORKDIR /src + +COPY MyOffice.sln ./ +COPY MyOffice.Core/MyOffice.Core.csproj MyOffice.Core/ +COPY MyOffice.Shared/MyOffice.Shared.csproj MyOffice.Shared/ +COPY MyOffice.Data.Models/MyOffice.Data.Models.csproj MyOffice.Data.Models/ +COPY MyOffice.DbContext/MyOffice.DbContext.csproj MyOffice.DbContext/ +COPY MyOffice.Data.Repositories/MyOffice.Data.Repositories.csproj MyOffice.Data.Repositories/ +COPY MyOffice.Services/MyOffice.Services.csproj MyOffice.Services/ +COPY MyOffice.Migration.Sqlite/MyOffice.Migrations.Sqlite.csproj MyOffice.Migration.Sqlite/ +COPY MyOffice.Migration.Postgres/MyOffice.Migrations.Postgres.csproj MyOffice.Migration.Postgres/ +COPY MyOffice.Web/MyOffice.Web.csproj MyOffice.Web/ + +RUN dotnet restore MyOffice.Web/MyOffice.Web.csproj + +COPY MyOffice.Core/ MyOffice.Core/ +COPY MyOffice.Shared/ MyOffice.Shared/ +COPY MyOffice.Data.Models/ MyOffice.Data.Models/ +COPY MyOffice.DbContext/ MyOffice.DbContext/ +COPY MyOffice.Data.Repositories/ MyOffice.Data.Repositories/ +COPY MyOffice.Services/ MyOffice.Services/ +COPY MyOffice.Migration.Sqlite/ MyOffice.Migration.Sqlite/ +COPY MyOffice.Migration.Postgres/ MyOffice.Migration.Postgres/ +COPY MyOffice.Web/ MyOffice.Web/ + +RUN dotnet publish MyOffice.Web/MyOffice.Web.csproj -c Release -o /app/publish --no-restore + +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final +WORKDIR /app +COPY --from=build /app/publish . + +ENV ASPNETCORE_ENVIRONMENT=Docker +ENV ASPNETCORE_URLS=http://+:8080 +EXPOSE 8080 + +ENTRYPOINT ["dotnet", "MyOffice.Web.dll"] diff --git a/Docker/Dockerfile.web b/Docker/Dockerfile.web new file mode 100644 index 0000000..01c4231 --- /dev/null +++ b/Docker/Dockerfile.web @@ -0,0 +1,34 @@ +# MyOffice SPA (nginx :80) — build from repo root: +# docker build -f Docker/Dockerfile.web --build-arg API_PUBLIC_URL=http://localhost:32081 -t myoffice-web . +FROM node:20-alpine AS build +WORKDIR /src + +ARG API_PUBLIC_URL=http://localhost:32081 + +COPY MyOffice.SPA/package.json MyOffice.SPA/package-lock.json MyOffice.SPA/.npmrc ./ +RUN npm ci + +COPY MyOffice.SPA/ ./ + +# environment.ts is gitignored locally — stub + docker env with public API URL (host port). +RUN cp src/environments/environment.sample.ts src/environments/environment.ts \ + && printf '%s\n' \ + 'export const environment = {' \ + ' production: true,' \ + " apiUrl: '${API_PUBLIC_URL}'," \ + " identityServer: '${API_PUBLIC_URL}/'," \ + " allowedUrls: ['${API_PUBLIC_URL}']," \ + ' requireHttps: false,' \ + ' externalLogins: {' \ + " google: { clientId: '' }," \ + " auth0: { clientId: '', domain: '' }" \ + ' }' \ + '};' \ + > src/environments/environment.docker.ts \ + && npm run build -- --configuration docker --output-path /out \ + && if [ -d /out/browser ]; then cp -a /out/browser/. /out/ && rm -rf /out/browser; fi + +FROM nginx:1.27-alpine AS final +COPY Docker/nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /out /usr/share/nginx/html +EXPOSE 80 diff --git a/Docker/README.md b/Docker/README.md new file mode 100644 index 0000000..194e667 --- /dev/null +++ b/Docker/README.md @@ -0,0 +1,57 @@ +# MyOffice Docker demo + +| Service | Default host port | Notes | +|------------|-------------------|--------------------------------| +| `web` | **32080** | Angular SPA (nginx) | +| `api` | **32081** | ASP.NET Core + OpenIddict | +| `pgadmin` | **32082** | pgAdmin 4 | +| `postgres` | *(none)* | Internal only (`postgres:5432`) | + +Empty Postgres is migrated and filled with demo users on API startup. + +## Commands + +```powershell +.\build.ps1 # defaults :32080 / :32081 / :32082 +.\build.ps1 32080 32081 32082 # override front, back, pgAdmin +.\build.ps1 up # build + recreate containers +.\build.ps1 rebuild # --no-cache images + recreate (picks up API/CORS code) +.\build.ps1 reset # wipe DB volumes + rebuild (new seed / password user_UAH) +.\build.ps1 down +.\build.ps1 logs +``` + +Linux/macOS: `./build.sh` (same commands) + +**Important:** demo users are seeded only into an empty DB. Changing password in code does nothing until you run `.\build.ps1 reset` (clears `data/demo/postgres`). + +Custom ports rebuild the SPA so `apiUrl` / OIDC point at the chosen backend host port, and set `FrontEnd:Host` + CORS for the frontend origin. + +## URLs & logins + +Defaults (`.\build.ps1`): + +| App | URL | Login | +|-----|-----|--------| +| Frontend | http://localhost:32080 | `user_UAH@user_UAH.userUAH` / `user_UAH` | +| Backend | http://localhost:32081 | — | +| pgAdmin | http://localhost:32082 | `admin@example.com` / `admin` | + +Postgres is auto-registered in pgAdmin as server **myoffice** (host `postgres`, user/db/password `myoffice`) — no manual setup. +If the server is missing after an older run: `.\build.ps1 reset` (or delete `data/demo/pgadmin`). + +## Data folders + +Bind mounts next to the compose file (gitignored under `Docker/data/`): + +| Host path | Container | +|-----------|-----------| +| `Docker/data/demo/postgres` | `/var/lib/postgresql/data` | +| `Docker/data/demo/pgadmin` | `/var/lib/pgadmin` | + +Stop/start keeps these folders. Wipe with `.\build.ps1 reset` or delete the folders manually. + +## Notes + +- API uses `ASPNETCORE_ENVIRONMENT=Docker`, ephemeral OpenIddict keys, HTTP allowed. +- Changing front/back ports rebuilds the SPA so API/OIDC URLs match. diff --git a/Docker/build.ps1 b/Docker/build.ps1 new file mode 100644 index 0000000..f7103c6 --- /dev/null +++ b/Docker/build.ps1 @@ -0,0 +1,158 @@ +# Build and start the MyOffice demo stack (SPA + API + Postgres + pgAdmin). +# Usage: +# .\build.ps1 # front 32080, back 32081, pgAdmin 32082 +# .\build.ps1 32080 32081 32082 # override ports +# .\build.ps1 build | up | down | logs +# .\build.ps1 rebuild # --no-cache images + recreate containers +# .\build.ps1 reset # wipe ./data/demo/*, rebuild, start (new demo passwords) + +$ErrorActionPreference = 'Stop' +$here = Split-Path -Parent $MyInvocation.MyCommand.Path +Set-Location $here + +$composeFile = 'docker-compose.demo.yml' +$knownActions = @('build', 'up', 'down', 'logs', 'all', 'rebuild', 'reset') + +function Test-Port([string]$value) { + return $value -match '^\d{1,5}$' -and [int]$value -ge 1 -and [int]$value -le 65535 +} + +function Format-Origin([string]$port) { + if ($port -eq '80') { return 'http://localhost' } + return "http://localhost:$port" +} + +function Show-UpInfo { + param([string]$FrontOrigin, [string]$ApiPublicUrl, [string]$PgAdminUrl) + Write-Host '' + Write-Host 'Demo is up:' + Write-Host " Frontend $FrontOrigin" + Write-Host " Backend $ApiPublicUrl" + Write-Host " pgAdmin $PgAdminUrl (admin@example.com / admin; DB auto-connected)" + Write-Host ' Postgres internal host=postgres user/pass/db=myoffice' + Write-Host '' + Write-Host 'Demo logins: user_UAH@user_UAH.userUAH / user_UAH (also USD, EUR)' +} + +function Invoke-DockerCompose { + param([Parameter(ValueFromRemainingArguments = $true)][string[]]$ComposeArgs) + # Docker writes progress to stderr; with ErrorAction Stop that aborts the script. + $prev = $ErrorActionPreference + $ErrorActionPreference = 'Continue' + try { + & docker compose -f $composeFile @ComposeArgs + if ($LASTEXITCODE -ne 0) { + throw "docker compose failed with exit code $LASTEXITCODE" + } + } + finally { + $ErrorActionPreference = $prev + } +} + +# Parse: [action] [frontPort] [backPort] [pgAdminPort] +# Numeric args arrive as Int32 — always normalize to string first. +$action = 'all' +$frontPort = '32080' +$backPort = '32081' +$pgAdminPort = '32082' +$rest = @($args | ForEach-Object { "$_" }) + +if ($rest.Count -gt 0 -and $knownActions -contains $rest[0].ToLowerInvariant()) { + $action = $rest[0].ToLowerInvariant() + $rest = @($rest | Select-Object -Skip 1) +} +elseif ($rest.Count -gt 0 -and (Test-Port $rest[0])) { + $action = 'all' +} + +if ($rest.Count -ge 1) { + if (-not (Test-Port $rest[0])) { + Write-Error "Invalid front port '$($rest[0])'. Example: .\build.ps1 32080 32081 32082" + } + $frontPort = [string]$rest[0] +} +if ($rest.Count -ge 2) { + if (-not (Test-Port $rest[1])) { + Write-Error "Invalid back port '$($rest[1])'. Example: .\build.ps1 32080 32081 32082" + } + $backPort = [string]$rest[1] +} +if ($rest.Count -ge 3) { + if (-not (Test-Port $rest[2])) { + Write-Error "Invalid pgAdmin port '$($rest[2])'. Example: .\build.ps1 32080 32081 32082" + } + $pgAdminPort = [string]$rest[2] +} +if ($rest.Count -gt 3 -and $action -ne 'down' -and $action -ne 'logs') { + Write-Error 'Too many arguments. Usage: .\build.ps1 [build|up|down|logs|rebuild|reset] [frontPort] [backPort] [pgAdminPort]' +} + +$frontOrigin = Format-Origin $frontPort +$apiPublicUrl = "http://localhost:$backPort" +$pgAdminUrl = Format-Origin $pgAdminPort + +$env:MYOFFICE_WEB_PORT = $frontPort +$env:MYOFFICE_API_PORT = $backPort +$env:MYOFFICE_PGADMIN_PORT = $pgAdminPort +$env:MYOFFICE_FRONTEND_HOST = $frontOrigin +$env:MYOFFICE_API_PUBLIC_URL = $apiPublicUrl +$env:MYOFFICE_CORS_0 = $frontOrigin +$env:MYOFFICE_CORS_1 = if ($frontPort -eq '80') { 'http://127.0.0.1' } else { "http://127.0.0.1:$frontPort" } + +# Avoid stale compose env / cached layers leaving old API code running. +$env:COMPOSE_DOCKER_CLI_BUILD = '1' +$env:DOCKER_BUILDKIT = '1' + +switch ($action) { + 'build' { + Invoke-DockerCompose build + } + 'up' { + New-Item -ItemType Directory -Path (Join-Path $here 'data\demo\postgres') -Force | Out-Null + New-Item -ItemType Directory -Path (Join-Path $here 'data\demo\pgadmin') -Force | Out-Null + Invoke-DockerCompose up -d --build --force-recreate --remove-orphans + Show-UpInfo $frontOrigin $apiPublicUrl $pgAdminUrl + } + 'down' { + Invoke-DockerCompose down + } + 'logs' { + Invoke-DockerCompose logs -f + } + 'rebuild' { + Write-Host 'Rebuilding images with --no-cache (api + web)...' + Invoke-DockerCompose build --no-cache --pull + Invoke-DockerCompose up -d --force-recreate --remove-orphans + Show-UpInfo $frontOrigin $apiPublicUrl $pgAdminUrl + } + 'reset' { + Write-Host 'Stopping stack and wiping ./data/demo/postgres and ./data/demo/pgadmin...' + Invoke-DockerCompose down + foreach ($dir in @('data\demo\postgres', 'data\demo\pgadmin')) { + $path = Join-Path $here $dir + if (Test-Path $path) { + Remove-Item -LiteralPath $path -Recurse -Force + } + New-Item -ItemType Directory -Path $path -Force | Out-Null + } + # Drop old named volumes if they still exist from earlier setups. + docker volume rm myoffice-demo_myoffice_pgdata myoffice-demo_myoffice_pgadmin 2>$null | Out-Null + Write-Host 'Rebuilding images with --no-cache...' + Invoke-DockerCompose build --no-cache --pull + Invoke-DockerCompose up -d --force-recreate --remove-orphans + Show-UpInfo $frontOrigin $apiPublicUrl $pgAdminUrl + Write-Host '' + Write-Host 'DB was reset. Login with password user_UAH (not user1_UAH).' + Write-Host 'Data folders: Docker\data\demo\postgres , Docker\data\demo\pgadmin' + } + 'all' { + New-Item -ItemType Directory -Path (Join-Path $here 'data\demo\postgres') -Force | Out-Null + New-Item -ItemType Directory -Path (Join-Path $here 'data\demo\pgadmin') -Force | Out-Null + Invoke-DockerCompose up -d --build --force-recreate --remove-orphans + Show-UpInfo $frontOrigin $apiPublicUrl $pgAdminUrl + } + default { + Write-Error "Unknown action '$action'. Use: build, up, down, logs, rebuild, reset, or no args." + } +} diff --git a/Docker/build.sh b/Docker/build.sh new file mode 100644 index 0000000..5d5ed25 --- /dev/null +++ b/Docker/build.sh @@ -0,0 +1,133 @@ +#!/usr/bin/env sh +# Build and start the MyOffice demo stack (SPA + API + Postgres + pgAdmin). +# Usage: +# ./build.sh # front 32080, back 32081, pgAdmin 32082 +# ./build.sh 32080 32081 32082 # override ports +# ./build.sh build | up | down | logs +# ./build.sh rebuild # --no-cache images + recreate containers +# ./build.sh reset # wipe DB volumes, rebuild, start + +set -eu +cd "$(dirname "$0")" + +COMPOSE_FILE=docker-compose.demo.yml +ACTION=all +FRONT_PORT=32080 +BACK_PORT=32081 +PGADMIN_PORT=32082 + +is_port() { + echo "$1" | grep -Eq '^[0-9]{1,5}$' && [ "$1" -ge 1 ] && [ "$1" -le 65535 ] +} + +origin_for() { + if [ "$1" = "80" ]; then + echo "http://localhost" + else + echo "http://localhost:$1" + fi +} + +show_up_info() { + echo "" + echo "Demo is up:" + echo " Frontend $1" + echo " Backend $2" + echo " pgAdmin $3 (admin@example.com / admin; DB auto-connected)" + echo " Postgres internal host=postgres user/pass/db=myoffice" + echo "" + echo "Demo logins: user_UAH@user_UAH.userUAH / user_UAH (also USD, EUR)" +} + +if [ "${1:-}" = "build" ] || [ "${1:-}" = "up" ] || [ "${1:-}" = "down" ] || [ "${1:-}" = "logs" ] || [ "${1:-}" = "all" ] || [ "${1:-}" = "rebuild" ] || [ "${1:-}" = "reset" ]; then + ACTION=$1 + shift +fi + +if [ "${1:-}" != "" ]; then + is_port "$1" || { echo "Invalid front port '$1'. Example: ./build.sh 32080 32081 32082" >&2; exit 1; } + FRONT_PORT=$1 + shift +fi + +if [ "${1:-}" != "" ]; then + is_port "$1" || { echo "Invalid back port '$1'. Example: ./build.sh 32080 32081 32082" >&2; exit 1; } + BACK_PORT=$1 + shift +fi + +if [ "${1:-}" != "" ]; then + is_port "$1" || { echo "Invalid pgAdmin port '$1'. Example: ./build.sh 32080 32081 32082" >&2; exit 1; } + PGADMIN_PORT=$1 + shift +fi + +if [ "${1:-}" != "" ] && [ "$ACTION" != "down" ] && [ "$ACTION" != "logs" ]; then + echo "Too many arguments. Usage: ./build.sh [build|up|down|logs|rebuild|reset] [frontPort] [backPort] [pgAdminPort]" >&2 + exit 1 +fi + +FRONT_ORIGIN=$(origin_for "$FRONT_PORT") +API_PUBLIC_URL="http://localhost:$BACK_PORT" +PGADMIN_URL=$(origin_for "$PGADMIN_PORT") + +export MYOFFICE_WEB_PORT=$FRONT_PORT +export MYOFFICE_API_PORT=$BACK_PORT +export MYOFFICE_PGADMIN_PORT=$PGADMIN_PORT +export MYOFFICE_FRONTEND_HOST=$FRONT_ORIGIN +export MYOFFICE_API_PUBLIC_URL=$API_PUBLIC_URL +export MYOFFICE_CORS_0=$FRONT_ORIGIN +if [ "$FRONT_PORT" = "80" ]; then + export MYOFFICE_CORS_1=http://127.0.0.1 +else + export MYOFFICE_CORS_1="http://127.0.0.1:$FRONT_PORT" +fi + +export COMPOSE_DOCKER_CLI_BUILD=1 +export DOCKER_BUILDKIT=1 + +case "$ACTION" in + build) + docker compose -f "$COMPOSE_FILE" build + ;; + up) + mkdir -p data/demo/postgres data/demo/pgadmin + docker compose -f "$COMPOSE_FILE" up -d --build --force-recreate --remove-orphans + show_up_info "$FRONT_ORIGIN" "$API_PUBLIC_URL" "$PGADMIN_URL" + ;; + down) + docker compose -f "$COMPOSE_FILE" down + ;; + logs) + docker compose -f "$COMPOSE_FILE" logs -f + ;; + rebuild) + echo "Rebuilding images with --no-cache (api + web)..." + docker compose -f "$COMPOSE_FILE" build --no-cache --pull + docker compose -f "$COMPOSE_FILE" up -d --force-recreate --remove-orphans + show_up_info "$FRONT_ORIGIN" "$API_PUBLIC_URL" "$PGADMIN_URL" + ;; + reset) + echo "Stopping stack and wiping ./data/demo/postgres and ./data/demo/pgadmin..." + docker compose -f "$COMPOSE_FILE" down + rm -rf data/demo/postgres data/demo/pgadmin + mkdir -p data/demo/postgres data/demo/pgadmin + docker volume rm myoffice-demo_myoffice_pgdata myoffice-demo_myoffice_pgadmin 2>/dev/null || true + echo "Rebuilding images with --no-cache..." + docker compose -f "$COMPOSE_FILE" build --no-cache --pull + docker compose -f "$COMPOSE_FILE" up -d --force-recreate --remove-orphans + show_up_info "$FRONT_ORIGIN" "$API_PUBLIC_URL" "$PGADMIN_URL" + echo "" + echo "DB was reset. Login with password user_UAH (not user1_UAH)." + echo "Data folders: Docker/data/demo/postgres , Docker/data/demo/pgadmin" + ;; + all) + mkdir -p data/demo/postgres data/demo/pgadmin + docker compose -f "$COMPOSE_FILE" up -d --build --force-recreate --remove-orphans + show_up_info "$FRONT_ORIGIN" "$API_PUBLIC_URL" "$PGADMIN_URL" + ;; + *) + echo "Unknown action '$ACTION'. Use: build, up, down, logs, rebuild, reset, or no args." >&2 + exit 1 + ;; +esac diff --git a/Docker/dc-postgres-pgadmin.yml b/Docker/dc-postgres-pgadmin.yml new file mode 100644 index 0000000..e841c27 --- /dev/null +++ b/Docker/dc-postgres-pgadmin.yml @@ -0,0 +1,27 @@ +services: + postgres: + image: postgres:17 + container_name: postgres + restart: unless-stopped + environment: + POSTGRES_DB: appdb + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + - "5432:5432" + volumes: + - ./data/postgres:/var/lib/postgresql/data + + pgadmin: + image: dpage/pgadmin4:latest + container_name: pgadmin + restart: unless-stopped + environment: + PGADMIN_DEFAULT_EMAIL: admin@example.com + PGADMIN_DEFAULT_PASSWORD: admin + ports: + - "5433:80" + volumes: + - ./data/pgadmin:/var/lib/pgadmin + depends_on: + - postgres diff --git a/Docker/docker-compose.demo.yml b/Docker/docker-compose.demo.yml new file mode 100644 index 0000000..615990b --- /dev/null +++ b/Docker/docker-compose.demo.yml @@ -0,0 +1,96 @@ +# Demo stack: SPA + API + Postgres (internal) + pgAdmin. +# Ports from env / build.ps1: +# MYOFFICE_WEB_PORT (32080), MYOFFICE_API_PORT (32081), MYOFFICE_PGADMIN_PORT (32082) +name: myoffice-demo + +services: + postgres: + image: postgres:17 + container_name: myoffice-postgres + restart: unless-stopped + environment: + POSTGRES_DB: myoffice + POSTGRES_USER: myoffice + POSTGRES_PASSWORD: myoffice + volumes: + # Host path (next to this compose file): ./data/demo/postgres + - ./data/demo/postgres:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U myoffice -d myoffice"] + interval: 5s + timeout: 5s + retries: 12 + networks: + - myoffice + + pgadmin: + image: dpage/pgadmin4:9 + container_name: myoffice-pgadmin + restart: unless-stopped + # Strip CRLF (Windows checkouts) then create pgpass (0600) and run image entrypoint. + entrypoint: + - /bin/sh + - -c + - sed 's/\r$//' /pgadmin-entrypoint.sh > /tmp/pgadmin-entrypoint.sh && exec /bin/sh /tmp/pgadmin-entrypoint.sh + environment: + PGADMIN_DEFAULT_EMAIL: admin@example.com + PGADMIN_DEFAULT_PASSWORD: admin + PGADMIN_CONFIG_SERVER_MODE: "False" + PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED: "False" + ports: + - "${MYOFFICE_PGADMIN_PORT:-32082}:80" + volumes: + # Host path: ./data/demo/pgadmin + - ./data/demo/pgadmin:/var/lib/pgadmin + - ./pgadmin/servers.json:/pgadmin4/servers.json:ro + - ./pgadmin/entrypoint.sh:/pgadmin-entrypoint.sh:ro + depends_on: + postgres: + condition: service_healthy + networks: + - myoffice + + api: + build: + context: .. + dockerfile: Docker/Dockerfile.api + image: myoffice-api:demo + container_name: myoffice-api + restart: unless-stopped + ports: + - "${MYOFFICE_API_PORT:-32081}:8080" + environment: + ASPNETCORE_ENVIRONMENT: Docker + ASPNETCORE_URLS: http://+:8080 + DatabaseProvider: npgsql + ConnectionStrings__npgsql: Host=postgres;Port=5432;Database=myoffice;Username=myoffice;Password=myoffice + FrontEnd__Host: ${MYOFFICE_FRONTEND_HOST:-http://localhost:32080} + Cors__AllowedOrigins__0: ${MYOFFICE_CORS_0:-http://localhost:32080} + Cors__AllowedOrigins__1: ${MYOFFICE_CORS_1:-http://127.0.0.1:32080} + OpenIddict__UseEphemeralKeys: "true" + OpenIddict__AllowHttp: "true" + depends_on: + postgres: + condition: service_healthy + networks: + - myoffice + + web: + build: + context: .. + dockerfile: Docker/Dockerfile.web + args: + API_PUBLIC_URL: ${MYOFFICE_API_PUBLIC_URL:-http://localhost:32081} + image: myoffice-web:demo + container_name: myoffice-web + restart: unless-stopped + ports: + - "${MYOFFICE_WEB_PORT:-32080}:80" + depends_on: + - api + networks: + - myoffice + +networks: + myoffice: + driver: bridge diff --git a/Docker/nginx.conf b/Docker/nginx.conf new file mode 100644 index 0000000..7f03e5f --- /dev/null +++ b/Docker/nginx.conf @@ -0,0 +1,17 @@ +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + + gzip on; + gzip_types text/plain text/css application/javascript application/json image/svg+xml; + + location / { + try_files $uri $uri/ /index.html; + } + + location = /index.html { + add_header Cache-Control "no-cache"; + } +} diff --git a/Docker/pgadmin/entrypoint.sh b/Docker/pgadmin/entrypoint.sh new file mode 100644 index 0000000..74df87e --- /dev/null +++ b/Docker/pgadmin/entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# Create pgpass inside the container (mode 0600). Bind-mounted files from Windows +# cannot satisfy pgAdmin's permission check. +set -eu + +PASSFILE=/var/lib/pgadmin/pgpass +printf '%s\n' 'postgres:5432:*:myoffice:myoffice' > "$PASSFILE" +chown 5050:0 "$PASSFILE" 2>/dev/null || true +chmod 600 "$PASSFILE" + +exec /entrypoint.sh "$@" diff --git a/Docker/pgadmin/servers.json b/Docker/pgadmin/servers.json new file mode 100644 index 0000000..6107165 --- /dev/null +++ b/Docker/pgadmin/servers.json @@ -0,0 +1,14 @@ +{ + "Servers": { + "1": { + "Name": "myoffice", + "Group": "Servers", + "Host": "postgres", + "Port": 5432, + "MaintenanceDB": "myoffice", + "Username": "myoffice", + "SSLMode": "prefer", + "PassFile": "/var/lib/pgadmin/pgpass" + } + } +} diff --git a/MyOffice.Core/Error.cs b/MyOffice.Core/Error.cs deleted file mode 100644 index 48cf996..0000000 --- a/MyOffice.Core/Error.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace MyOffice.Core; - -public class Error -{ - private Exception? _exception; - - public Error(string message) - { - Message = message; - } - - public Error(Exception exception): this(exception.GetType().Name) - { - _exception = exception; - } - - public Error(string message, Exception exception): this(message) - { - _exception = exception; - } - - public string Message { get; private set;} -} \ No newline at end of file diff --git a/MyOffice.Core/Exec.cs b/MyOffice.Core/Exec.cs deleted file mode 100644 index 3f929c3..0000000 --- a/MyOffice.Core/Exec.cs +++ /dev/null @@ -1,106 +0,0 @@ -namespace MyOffice.Core; - -public enum GeneralExecStatus -{ - success, - failure, - not_found, - forbidden -} - -public class Exec : Exec - where TResult : class -{ - public Exec(TResult result, GeneralExecStatus status) : base(result, status) - { - } - - public Exec(GeneralExecStatus status) : base(status) - { - } - - public Exec() : base(GeneralExecStatus.success) - { - } - - public new Exec Set(GeneralExecStatus status) - { - Status = status; - - return this; - } - - public new Exec Set(TResult? result) - { - Result = result; - Status = result == null ? GeneralExecStatus.failure : GeneralExecStatus.success; - - return this; - } -} - -public class Exec - where TResult : class - where TStatus : Enum -{ - public static Exec Start(TResult result, TStatus status) - { - return new Exec(result, status); - } - - public static Exec Start(TStatus status) - { - return new Exec(status); - } - - public static Exec StartSuccess() - { - return new Exec(GeneralExecStatus.success); - } - - public static Exec StartFailure() - { - return new Exec(GeneralExecStatus.failure); - } - - public static Exec StartNotFound() - { - return new Exec(GeneralExecStatus.not_found); - } - - public Exec(TResult result, TStatus status) - { - Result = result; - Status = status; - } - - public Exec(TStatus status) - { - Status = status; - } - - public TResult? Result { get; internal set; } - public TStatus Status { get; internal set; } - - public Exec Set(TResult result, TStatus status) - { - Result = result; - Status = status; - - return this; - } - - public Exec Set(TStatus status) - { - Status = status; - - return this; - } - - public Exec Set(TResult result) - { - Result = result; - - return this; - } -} \ No newline at end of file diff --git a/MyOffice.Core/Extensions/BoolExtensions.cs b/MyOffice.Core/Extensions/BoolExtensions.cs deleted file mode 100644 index 8639085..0000000 --- a/MyOffice.Core/Extensions/BoolExtensions.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace MyOffice.Core.Extensions; - -public static class BoolExtensions -{ - public static string ToLowerCase(this bool value) - { - return value.ToString().ToLower(); - } - - public static string? ToLowerCase(this bool? value) - { - return value == null ? null : value.ToString()?.ToLower(); - } -} \ No newline at end of file diff --git a/MyOffice.Core/Extensions/ClaimsExtensions.cs b/MyOffice.Core/Extensions/ClaimsExtensions.cs deleted file mode 100644 index af77327..0000000 --- a/MyOffice.Core/Extensions/ClaimsExtensions.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace MyOffice.Core.Extensions; - -using System.Security.Claims; - -public static class ClaimsExtensions -{ - public static string? GetValue(this IEnumerable claims, string type) - { - return claims.FirstOrDefault(x => x.Type.Equals(type, StringComparison.OrdinalIgnoreCase))?.Value; - } - - public static string? GetValue(this IEnumerable claims, string[] types) - { - return claims.FirstOrDefault(x => types.Any(z => x.Type.Equals(z, StringComparison.OrdinalIgnoreCase)))?.Value; - } - - public static string? GetEmail(this IEnumerable claims) - { - return GetValue(claims, new[] { ClaimTypes.Email, "email" }); - } - - public static string? GetNameIdentifier(this IEnumerable claims) - { - return GetValue(claims, ClaimTypes.NameIdentifier); - } - - public static string? GetSID(this IEnumerable claims) - { - return GetValue(claims, "sid"); - } -} \ No newline at end of file diff --git a/MyOffice.Core/Extensions/DateTimeExtensions.cs b/MyOffice.Core/Extensions/DateTimeExtensions.cs deleted file mode 100644 index 8b22231..0000000 --- a/MyOffice.Core/Extensions/DateTimeExtensions.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyOffice.Core.Extensions; - -public static class DateTimeExtensions -{ - public static DateTime StartOfDay(this DateTime dateTime) - { - return dateTime.Date; - } - - public static DateTime EndOfDay(this DateTime dateTime) - { - return dateTime.AddDays(1).AddTicks(-1); - } - - public static DateTime ToUtc(this DateTime dateTime) - { - return new DateTime(dateTime.Ticks, DateTimeKind.Utc); - } -} \ No newline at end of file diff --git a/MyOffice.Core/Extensions/GuidExtensions.cs b/MyOffice.Core/Extensions/GuidExtensions.cs deleted file mode 100644 index 6a95e4a..0000000 --- a/MyOffice.Core/Extensions/GuidExtensions.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyOffice.Core.Extensions; - -public static class GuidExtensions -{ - public static bool EqualsString(this Guid guid, string str) - { - return guid.ToString().EqualsIgnoreCase(str); - } - - public static string ToShort(this Guid guid) - { - return guid.ToString("N"); - } - - public static string? ToShort(this Guid? guid) - { - return guid?.ToString("N"); - } -} \ No newline at end of file diff --git a/MyOffice.Core/Extensions/StringExtensions.cs b/MyOffice.Core/Extensions/StringExtensions.cs deleted file mode 100644 index eca1473..0000000 --- a/MyOffice.Core/Extensions/StringExtensions.cs +++ /dev/null @@ -1,65 +0,0 @@ -namespace MyOffice.Core.Extensions; - -using Microsoft.Extensions.Logging; - -public static class StringExtensions -{ - public static bool IsMissing(this string? str) - { - return str == null || string.IsNullOrEmpty(str) || string.IsNullOrEmpty(str.Trim()); - } - - public static bool IsPresent(this string? str) - { - return !IsMissing(str); - } - - public static string? NullIfEmpty(this string? str) - { - return IsMissing(str) ? null : str; - } - - public static bool EqualsIgnoreCase(this string? str, string? value) - { - return str != null && str.Equals(value, StringComparison.OrdinalIgnoreCase); - } - - public static string? SafeTrim(this string? str) - { - return str == null ? str : str!.Trim(); - } - - public static string? MaxOf(this string? str, int maxLength) - { - if (str == null) - { - return null; - } - - if (str.Length < maxLength) - { - return str; - } - - return str.Substring(0, maxLength); - } - - public static bool AsBool(this string? str, bool defaultValue = false) - { - return true.ToString().Equals(str, StringComparison.OrdinalIgnoreCase) || defaultValue; - } - - public static Guid AsGuid(this string str) - { - return Guid.Parse(str); - } - - public static Guid? AsGuidNull(this string? str) - { - if (Guid.TryParse(str, out var guid)) - { - return guid; - } - return null; - } -} \ No newline at end of file diff --git a/MyOffice.Core/Helpers/JsonHelper.cs b/MyOffice.Core/Helpers/JsonHelper.cs deleted file mode 100644 index 100f7bc..0000000 --- a/MyOffice.Core/Helpers/JsonHelper.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace MyOffice.Core.Helpers -{ - using System.Text.Json; - using System.Text.Json.Serialization; - - public static class JsonHelper - { - public static string ToJson(this object entity, JsonSerializerOptions? options = null) - { - options ??= new JsonSerializerOptions - { - MaxDepth = 0, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - ReferenceHandler = ReferenceHandler.IgnoreCycles, - WriteIndented = true, - }; - return JsonSerializer.Serialize(entity, options); - } - } - - /*public class CustomIgnoreReferenceHandler : ReferenceHandler - { - //public CustomIgnoreReferenceHandler() => HandlingStrategy = ReferenceHandlingStrategy.IgnoreCycles; - public CustomIgnoreReferenceHandler() - { - new HandlingStrategy { } = true; - } - - public override ReferenceResolver CreateResolver() => new IgnoreReferenceResolver(); - }*/ -} diff --git a/MyOffice.Core/Helpers/RandomizationHelper.cs b/MyOffice.Core/Helpers/RandomizationHelper.cs deleted file mode 100644 index f240a4f..0000000 --- a/MyOffice.Core/Helpers/RandomizationHelper.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace MyOffice.Core.Helpers; - -using MyOffice.Core.Extensions; - -public class RandomizationHelper -{ - public static string Generate(int length) - { - var result = ""; - - while(result.Length < length) - { - result += Guid.NewGuid().ToShort(); - } - - return result.Substring(0, length); - } -} diff --git a/MyOffice.Core/Identity/IExternalProviderValidator.cs b/MyOffice.Core/Identity/IExternalProviderValidator.cs deleted file mode 100644 index d74d303..0000000 --- a/MyOffice.Core/Identity/IExternalProviderValidator.cs +++ /dev/null @@ -1,47 +0,0 @@ -namespace MyOffice.Core.Identity; - -using System; -using System.Diagnostics.Contracts; - -public interface IExternalProviderValidator -{ - string Provider { get; } - public bool IsConfigured { get; } - - Task ValidateAsync(string token); -} - -public class ExternalProviderValidatorResult -{ - public static ExternalProviderValidatorResult Failed() - { - return new ExternalProviderValidatorResult(); - } - - public static ExternalProviderValidatorResult Success(string email, bool emailVerified, string externalId, - string? fullName) - { - return new ExternalProviderValidatorResult(email, emailVerified, externalId, fullName); - } - - public ExternalProviderValidatorResult() - { - IsSuccessed = false; - } - - public ExternalProviderValidatorResult(string email, bool emailVerified, string externalId, string? fullName) : - this() - { - Email = email; - EmailVerified = emailVerified; - IsSuccessed = true; - ExternalId = externalId; - FullName = fullName; - } - - public bool IsSuccessed { get; } - public string? Email { get; } - public bool EmailVerified { get; } - public string? ExternalId { get; } - public string? FullName { get; } -} \ No newline at end of file diff --git a/MyOffice.Core/Interfaces/IDataModel.cs b/MyOffice.Core/Interfaces/IDataModel.cs deleted file mode 100644 index 586eae7..0000000 --- a/MyOffice.Core/Interfaces/IDataModel.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MyOffice.Core; - -public interface IDataModel -{ - -} diff --git a/MyOffice.Core/Interfaces/IDataModelDto.cs b/MyOffice.Core/Interfaces/IDataModelDto.cs deleted file mode 100644 index 073a84b..0000000 --- a/MyOffice.Core/Interfaces/IDataModelDto.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MyOffice.Core; - -public interface IDataModelDto where TSource : IDataModel -{ - -} diff --git a/MyOffice.Core/MyOffice.Core.csproj b/MyOffice.Core/MyOffice.Core.csproj deleted file mode 100644 index 13dc371..0000000 --- a/MyOffice.Core/MyOffice.Core.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - diff --git a/MyOffice.Data.Models/Accounts/Account.cs b/MyOffice.Data.Models/Accounts/Account.cs deleted file mode 100644 index 9048af0..0000000 --- a/MyOffice.Data.Models/Accounts/Account.cs +++ /dev/null @@ -1,51 +0,0 @@ -namespace MyOffice.Data.Models.Accounts; - -using Currencies; -using MyOffice.Core; -using MyOffice.Data.Models.Users; - -public class Account: IDataModel -{ - public Guid Id { get; set; } - public string CurrencyGlobalId { get; set; } = null!; - public CurrencyGlobal? CurrencyGlobal { get; set; } - public Guid? OwnerId { get; set; } - public User? Owner { get; set; } - public string Name { get; set; } = null!; - public IEnumerable? AccessRights { get; set; } - public IEnumerable? Motions { get; set; } - public IEnumerable? Categories { get; set; } - public IEnumerable? Invites { get; set; } -} - -public class AccountDetailed: IDataModel -{ - public Account Account { get; set; } = null!; - public decimal TotalPlus { get; set; } - public decimal TotalMinus { get; set; } - public decimal Rest => TotalPlus - TotalMinus; -} - -public class AccountSimple -{ - public Guid Id { get; set; } - public string Name { get; set; } = null!; - public AccountAccessTypeEnum Type { get; set; } - public string? CurrencyName { get; set; } - public string? CurrencyShortName { get; set; } - public decimal? CurrencyRate { get; set; } - public int? CurrencyQuantity { get; set; } - public decimal? TotalPlus { get; set; } - public decimal? TotalMinus { get; set; } - public decimal? Balance { get; set; } -} - -public class MotionTotalSimple -{ - public Guid? Id { get; set; } - public string Name { get; set; } = null!; - public string CurrencyId { get; set; } = null!; - public string CurrencyName { get; set; } = null!; - public decimal CurrencyRate { get; set; } - public decimal Amount { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Accounts/AccountAccess.cs b/MyOffice.Data.Models/Accounts/AccountAccess.cs deleted file mode 100644 index 0d1aeb3..0000000 --- a/MyOffice.Data.Models/Accounts/AccountAccess.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace MyOffice.Data.Models.Accounts; - -using MyOffice.Data.Models.Users; - -public enum AccountAccessTypeEnum -{ - balance, - credit, - external, - other, -} - -public class AccountAccess -{ - public int Id { get; set; } - public Guid AccountId { get; set; } - public Account? Account { get; set; } - public Guid UserId { get; set; } - public User? User { get; set; } - public Guid OwnerId { get; set; } - public User? Owner { get; set; } - - public bool IsAllowRead { get; set; } - public bool IsAllowWrite { get; set; } - public bool IsAllowManage { get; set; } - public AccountAccessTypeEnum Type { get; set; } - public string? Name { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Accounts/AccountAccessInvite.cs b/MyOffice.Data.Models/Accounts/AccountAccessInvite.cs deleted file mode 100644 index 0827695..0000000 --- a/MyOffice.Data.Models/Accounts/AccountAccessInvite.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyOffice.Data.Models.Accounts; - -using Users; - -public class AccountAccessInvite -{ - public Guid Id { get; set; } - public Guid UserId { get; set; } - public User? User { get; set; } - public Guid AccountId { get; set; } - public Account? Account { get; set; } - public DateTime CreatedOn { get; set; } - public DateTime? AcceptedOn { get; set; } - public DateTime? RejectedOn { get; set; } - public string Email { get; set; } = null!; - public bool IsAllowWrite { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Accounts/AccountAccountCategory.cs b/MyOffice.Data.Models/Accounts/AccountAccountCategory.cs deleted file mode 100644 index 3ede78a..0000000 --- a/MyOffice.Data.Models/Accounts/AccountAccountCategory.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Data.Models.Accounts; - -public class AccountAccountCategory -{ - public int Id { get; set; } - public Guid AccountId { get; set; } - public Account Account { get; set; } = null!; - public Guid CategoryId { get; set; } - public AccountCategory Category { get; set; } = null!; -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Accounts/AccountCategory.cs b/MyOffice.Data.Models/Accounts/AccountCategory.cs deleted file mode 100644 index dc445b9..0000000 --- a/MyOffice.Data.Models/Accounts/AccountCategory.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyOffice.Data.Models.Accounts; - -using MyOffice.Data.Models.Users; - -public class AccountCategory -{ - public Guid Id { get; set; } - public Guid UserId { get; set; } - public User? User { get; set; } - public string Name { get; set; } = null!; - public IEnumerable? Accounts { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Accounts/Domain/AccountWithRate.cs b/MyOffice.Data.Models/Accounts/Domain/AccountWithRate.cs deleted file mode 100644 index e5d2504..0000000 --- a/MyOffice.Data.Models/Accounts/Domain/AccountWithRate.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Data.Models.Accounts.Domain; - -using Currencies; - -public class AccountWithRate -{ - public Account Account { get; set; } = null!; - public Currency? Currency { get; set; } - public CurrencyRate? Rate { get; set; } -} diff --git a/MyOffice.Data.Models/Accounts/Motion.cs b/MyOffice.Data.Models/Accounts/Motion.cs deleted file mode 100644 index 1439e8d..0000000 --- a/MyOffice.Data.Models/Accounts/Motion.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace MyOffice.Data.Models.Accounts; - -using Items; - -/// -/// Account motion -/// DateTime: 2023-01-01, Account: 'Debit card', Item.ItemGlobal: 'Primary salary', AmountPlus: 5000 -/// -public class Motion -{ - public Guid Id { get; set; } - public DateTime CreatedOn { get; set; } - public DateTime DateTime { get; set; } - public Guid AccountId { get; set; } - public Account Account { get; set; } = null!; - public int ItemId { get; set; } - public Item Item { get; set; } = null!; - public string? Description { get; set; } - public decimal AmountPlus { get; set; } - public decimal AmountMinus { get; set; } - public DateTime? DeletedOn { get; set; } -} diff --git a/MyOffice.Data.Models/Currencies/Currency.cs b/MyOffice.Data.Models/Currencies/Currency.cs deleted file mode 100644 index c8cd254..0000000 --- a/MyOffice.Data.Models/Currencies/Currency.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MyOffice.Data.Models.Currencies; - -using MyOffice.Data.Models.Users; - -public class Currency -{ - public Guid Id { get; set; } - public string CurrencyGlobalId { get; set; } = null!; - public CurrencyGlobal? CurrencyGlobal { get; set; } - public Guid UserId { get; set; } - public User? User { get; set; } - - public string Name { get; set; } = null!; - public string ShortName { get; set; } = null!; - public IEnumerable? Rates { get; set; } - - public int? CurrentRateId { get; set; } - public CurrencyRate? CurrentRate { get; set; } - - public bool IsPrimary { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Currencies/CurrencyGlobal.cs b/MyOffice.Data.Models/Currencies/CurrencyGlobal.cs deleted file mode 100644 index 78ea67e..0000000 --- a/MyOffice.Data.Models/Currencies/CurrencyGlobal.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace MyOffice.Data.Models.Currencies; - -using MyOffice.Data.Models.Accounts; - -public enum CurrencyGlobalIdEnum -{ - UAH, - USD, - EUR, - GBP, - RUB, - BTC, - ETH, - TON, - OTHER, -} - -public class CurrencyGlobal -{ - public string Id { get; set; } = null!; - public string Name { get; set; } = null!; - public string Symbol { get; set; } = null!; - public int DefaultQuantity { get; set; } - public IEnumerable? Currencies { get; set; } - public IEnumerable? Accounts { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Currencies/CurrencyRate.cs b/MyOffice.Data.Models/Currencies/CurrencyRate.cs deleted file mode 100644 index 8d20bbe..0000000 --- a/MyOffice.Data.Models/Currencies/CurrencyRate.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyOffice.Data.Models.Currencies; - -public class CurrencyRate -{ - public int Id { get; set; } - public Guid CurrencyId { get; set; } - public Currency? Currency { get; set; } - public DateTime DateTime { get; set; } - public int Quantity { get; set; } - public decimal Rate { get; set; } - public IEnumerable? Currencies { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Items/Item.cs b/MyOffice.Data.Models/Items/Item.cs deleted file mode 100644 index 17cb931..0000000 --- a/MyOffice.Data.Models/Items/Item.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace MyOffice.Data.Models.Items; - -using MyOffice.Data.Models.Accounts; - -/// -/// User 'Item' linked to global item -/// ItemGlobal: 'Primary salary', ItemCategory: 'Incomes' -/// -public class Item -{ - public int Id { get; set; } - /// - /// UnCategorized category is CategoryId = UserId - /// - public Guid CategoryId { get; set; } - public ItemCategory? Category { get; set; } - public Guid ItemGlobalId { get; set; } - public ItemGlobal ItemGlobal { get; set; } = null!; - public List? Motions { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Items/ItemCategory.cs b/MyOffice.Data.Models/Items/ItemCategory.cs deleted file mode 100644 index f368199..0000000 --- a/MyOffice.Data.Models/Items/ItemCategory.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MyOffice.Data.Models.Items; - -using MyOffice.Data.Models.Users; - -public class ItemCategory -{ - public Guid Id { get; set; } - public Guid UserId { get; set; } - public User User { get; set; } = null!; - public string Name { get; set; } = null!; - public List Items { get; set; } = null!; - public bool IsInternal { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Items/ItemGlobal.cs b/MyOffice.Data.Models/Items/ItemGlobal.cs deleted file mode 100644 index 420d19b..0000000 --- a/MyOffice.Data.Models/Items/ItemGlobal.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MyOffice.Data.Models.Items; - -public class ItemGlobal -{ - public Guid Id { get; set; } - public string Name { get; set; } = null!; - public IEnumerable Items { get; set; } = null!; -} \ No newline at end of file diff --git a/MyOffice.Data.Models/MyOffice.Data.Models.csproj b/MyOffice.Data.Models/MyOffice.Data.Models.csproj deleted file mode 100644 index 34cd07d..0000000 --- a/MyOffice.Data.Models/MyOffice.Data.Models.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - diff --git a/MyOffice.Data.Models/Notifications/EmailTemplate.cs b/MyOffice.Data.Models/Notifications/EmailTemplate.cs deleted file mode 100644 index 4b17ef2..0000000 --- a/MyOffice.Data.Models/Notifications/EmailTemplate.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyOffice.Data.Models.Notifications; - -public enum EmailTemplateEnum -{ - PasswordRestore, -} - -public class EmailTemplate -{ - public string Id { get; set; } - public DateTime CreatedOn { get; set; } - public string Description { get; set; } - public string Subject { get; set; } - public string Sender { get; set; } - public string SenderName { get; set; } - public string Template { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Users/User.cs b/MyOffice.Data.Models/Users/User.cs deleted file mode 100644 index 2246452..0000000 --- a/MyOffice.Data.Models/Users/User.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace MyOffice.Data.Models.Users; - -using Accounts; -using Currencies; -using Items; - -public class User -{ - public User() - { - CurrencyId = "USD"; - } - - public Guid Id { get; set; } - public string UserName { get; set; } = null!; - public string Email { get; set; } = null!; - public string PasswordHash { get; set; } = null!; - public string? FirstName { get; set; } - public string? LastName { get; set; } - public string? FullName { get; set; } - public string? Phone { get; set; } - public bool IsEmailConfirmed { get; set; } - public IEnumerable? UserClaims { get; set; } - - public string CurrencyId { get; set; } - public CurrencyGlobal? Currency { get; set; } - public IEnumerable? Currencies { get; set; } - public IEnumerable? AccountAccess { get; set; } - public IEnumerable? AccountMotions { get; set; } - public IEnumerable? AccountCategories { get; set; } - public IEnumerable? ItemCategories { get; set; } - public IEnumerable? Accounts { get; set; } - public IEnumerable? AccountAccessOwners { get; set; } - public IEnumerable? AccountAccessInvites { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Users/UserExternal.cs b/MyOffice.Data.Models/Users/UserExternal.cs deleted file mode 100644 index b86f5df..0000000 --- a/MyOffice.Data.Models/Users/UserExternal.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyOffice.Data.Models.Users; - -public class UserExternal -{ - public int Id { get; set; } - public DateTime CreatedOn { get; set; } - public Guid UserId { get; set; } - public User User { get; set; } = null!; - public string ExternalId { get; set; } = null!; - public string Email { get; set; } = null!; - public string Provider { get; set; } = null!; -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Verifications/VerificationCode.cs b/MyOffice.Data.Models/Verifications/VerificationCode.cs deleted file mode 100644 index 272f823..0000000 --- a/MyOffice.Data.Models/Verifications/VerificationCode.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace MyOffice.Data.Models.Verifications; - -using MyOffice.Data.Models.Users; - -public class VerificationCode -{ - public int Id { get; set; } - public Guid UserId { get; set; } - public User? User { get; set; } - public string Code { get; set; } = null!; - public string DestinationType { get; set; } = null!; - public string Destination { get; set; } = null!; - public DateTime CreatedOn { get; set; } - public DateTime ExpiresOn { get; set; } - public DateTime? VerifiedOn { get; set; } - public string Template { get; set; } = null!; - public string? Metadata { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Data.Models/Verifications/VerificationCodeTemplateEnum.cs b/MyOffice.Data.Models/Verifications/VerificationCodeTemplateEnum.cs deleted file mode 100644 index 96096a0..0000000 --- a/MyOffice.Data.Models/Verifications/VerificationCodeTemplateEnum.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyOffice.Data.Models.Verifications; - -public enum VerificationCodeTemplateEnum -{ - password_restore, - email_confirm, -} diff --git a/MyOffice.Data.Models/Verifications/VerificationCodeTypeEnum.cs b/MyOffice.Data.Models/Verifications/VerificationCodeTypeEnum.cs deleted file mode 100644 index 642a403..0000000 --- a/MyOffice.Data.Models/Verifications/VerificationCodeTypeEnum.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyOffice.Data.Models.Verifications; - -public enum VerificationCodeTypeEnum -{ - email, - phone, -} diff --git a/MyOffice.Data.Repositories/Account/AccountAccessInviteRepository.cs b/MyOffice.Data.Repositories/Account/AccountAccessInviteRepository.cs deleted file mode 100644 index 967d7cd..0000000 --- a/MyOffice.Data.Repositories/Account/AccountAccessInviteRepository.cs +++ /dev/null @@ -1,81 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Microsoft.EntityFrameworkCore; -using Models.Accounts; -using MyOffice.Data.Repositories; -using MyOffice.DbContext; - -public class AccountAccessInviteRepository : AppRepository, IAccountAccessInviteRepository -{ - public AccountAccessInviteRepository(AppDbContext context) : base(context) - { - } - - public AccountAccessInvite? Get(Guid userId, string email) - { - return _context.AccountAccessInvites - .FirstOrDefault(x => x.UserId == userId - && x.Email == email - && !x.AcceptedOn.HasValue - && !x.RejectedOn.HasValue - ); - } - - public async Task GetAsync(Guid userId, string email, CancellationToken cancellationToken = default) - { - return await _context.AccountAccessInvites - .FirstOrDefaultAsync(x => x.UserId == userId - && x.Email == email - && !x.AcceptedOn.HasValue - && !x.RejectedOn.HasValue, - cancellationToken); - } - - public bool Add(AccountAccessInvite invite) - { - return AddBase(invite) > 0; - } - - public async Task AddAsync(AccountAccessInvite invite, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(invite, cancellationToken) > 0; - } - - public bool Update(AccountAccessInvite invite) - { - return UpdateBase(invite) > 0; - } - - public async Task UpdateAsync(AccountAccessInvite invite, CancellationToken cancellationToken = default) - { - return await UpdateBaseAsync(invite, cancellationToken) > 0; - } - - public IEnumerable GetActive(string email) - { - return _context - .AccountAccessInvites - .Include(x => x.Account) - .Where(x => x.Email == email && !x.AcceptedOn.HasValue && !x.RejectedOn.HasValue); - - } - - public async Task> GetActiveAsync(string email, CancellationToken cancellationToken = default) - { - return await _context - .AccountAccessInvites - .Include(x => x.Account) - .Where(x => x.Email == email && !x.AcceptedOn.HasValue && !x.RejectedOn.HasValue) - .ToListAsync(cancellationToken); - } - - public AccountAccessInvite? Get(Guid id) - { - return _context.AccountAccessInvites.FirstOrDefault(x => x.Id == id); - } - - public async Task GetAsync(Guid id, CancellationToken cancellationToken = default) - { - return await _context.AccountAccessInvites.FirstOrDefaultAsync(x => x.Id == id, cancellationToken); - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Account/AccountAccessRepository.cs b/MyOffice.Data.Repositories/Account/AccountAccessRepository.cs deleted file mode 100644 index be14bbe..0000000 --- a/MyOffice.Data.Repositories/Account/AccountAccessRepository.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Models.Accounts; -using MyOffice.Data.Repositories; -using MyOffice.DbContext; - -public class AccountAccessRepository : AppRepository, IAccountAccessRepository -{ - public AccountAccessRepository(AppDbContext context) : base(context) - { - } - - public bool Add(AccountAccess accountAccess) - { - return AddBase(accountAccess) > 0; - } - - public async Task AddAsync(AccountAccess accountAccess, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(accountAccess, cancellationToken) > 0; - } - - public bool Update(AccountAccess accountAccess) - { - return UpdateBase(accountAccess) > 0; - } - - public async Task UpdateAsync(AccountAccess accountAccess, CancellationToken cancellationToken = default) - { - return await UpdateBaseAsync(accountAccess, cancellationToken) > 0; - } - - public bool Delete(AccountAccess accountAccess) - { - return RemoveBase(accountAccess) > 0; - } - - public async Task DeleteAsync(AccountAccess accountAccess, CancellationToken cancellationToken = default) - { - return await RemoveBaseAsync(accountAccess, cancellationToken) > 0; - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Account/AccountAccountCategoryRepository.cs b/MyOffice.Data.Repositories/Account/AccountAccountCategoryRepository.cs deleted file mode 100644 index 9fdbf54..0000000 --- a/MyOffice.Data.Repositories/Account/AccountAccountCategoryRepository.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Microsoft.EntityFrameworkCore; -using Models.Accounts; -using MyOffice.DbContext; - -public class AccountAccountCategoryRepository : AppRepository, IAccountAccountCategoryRepository -{ - public AccountAccountCategoryRepository(AppDbContext context) : base(context) - { - } - - public List Get(Guid userId, Guid accountId, Guid categoryId) - { - return _context.AccountAccountCategories - .Include(x => x.Account) - .Include(x => x.Category) - .Where(x => x.AccountId == accountId && x.CategoryId == categoryId && x.Category.UserId == userId) - .ToList(); - } - - public async Task> GetAsync( - Guid userId, - Guid accountId, - Guid categoryId, - CancellationToken cancellationToken = default - ) - { - return await _context.AccountAccountCategories - .Include(x => x.Account) - .Include(x => x.Category) - .Where(x => x.AccountId == accountId && x.CategoryId == categoryId && x.Category.UserId == userId) - .ToListAsync(cancellationToken); - } - - public bool Remove(AccountAccountCategory accountAccountCategory) - { - return RemoveBase(accountAccountCategory) > 0; - } - - public async Task RemoveAsync(AccountAccountCategory accountAccountCategory, CancellationToken cancellationToken = default) - { - return await RemoveBaseAsync(accountAccountCategory, cancellationToken) > 0; - } - - public bool Add(AccountAccountCategory accountAccountCategory) - { - return AddBase(accountAccountCategory) > 0; - } - - public async Task AddAsync(AccountAccountCategory accountAccountCategory, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(accountAccountCategory, cancellationToken) > 0; - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Account/AccountCategoryRepository.cs b/MyOffice.Data.Repositories/Account/AccountCategoryRepository.cs deleted file mode 100644 index f1ec7e1..0000000 --- a/MyOffice.Data.Repositories/Account/AccountCategoryRepository.cs +++ /dev/null @@ -1,73 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Microsoft.EntityFrameworkCore; -using Models.Accounts; -using MyOffice.Data.Repositories; -using MyOffice.DbContext; - -public class AccountCategoryRepository : AppRepository, IAccountCategoryRepository -{ - public AccountCategoryRepository(AppDbContext context) : base(context) - { - } - - public List GetAll(Guid userId) - { - return _context.AccountCategories - .Include(x => x.Accounts) - .Where(x => x.UserId == userId) - .ToList(); - } - - public async Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default) - { - return await _context.AccountCategories - .Include(x => x.Accounts) - .Where(x => x.UserId == userId) - .ToListAsync(cancellationToken); - } - - public bool Add(AccountCategory accountCategory) - { - return AddBase(accountCategory) > 0; - } - - public async Task AddAsync(AccountCategory accountCategory, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(accountCategory, cancellationToken) > 0; - } - - public AccountCategory? Get(Guid userId, Guid id) - { - return _context.AccountCategories - .Include(x => x.Accounts) - .FirstOrDefault(x => x.Id == id && x.UserId == userId); - } - - public async Task GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default) - { - return await _context.AccountCategories - .Include(x => x.Accounts) - .FirstOrDefaultAsync(x => x.Id == id && x.UserId == userId, cancellationToken); - } - - public bool Update(AccountCategory accountCategory) - { - return UpdateBase(accountCategory) > 0; - } - - public async Task UpdateAsync(AccountCategory accountCategory, CancellationToken cancellationToken = default) - { - return await UpdateBaseAsync(accountCategory, cancellationToken) > 0; - } - - public bool Remove(AccountCategory accountCategory) - { - return RemoveBase(accountCategory) > 0; - } - - public async Task RemoveAsync(AccountCategory accountCategory, CancellationToken cancellationToken = default) - { - return await RemoveBaseAsync(accountCategory, cancellationToken) > 0; - } -} diff --git a/MyOffice.Data.Repositories/Account/AccountRepository.cs b/MyOffice.Data.Repositories/Account/AccountRepository.cs deleted file mode 100644 index f09eaf4..0000000 --- a/MyOffice.Data.Repositories/Account/AccountRepository.cs +++ /dev/null @@ -1,641 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Logging; -using Models.Accounts; -using MyOffice.Data.Models.Accounts.Domain; -using MyOffice.Data.Models.Currencies; -using MyOffice.Data.Repositories; -using MyOffice.DbContext; - -public class AccountRepository : AppRepository, IAccountRepository -{ - private readonly ILogger _logger; - - public AccountRepository( - AppDbContext context, - ILogger logger - ) : base(context) - { - _logger = logger; - } - - public List GetAll(Guid userId) - { - return _context.Accounts! - .Include(x => x.CurrencyGlobal) - // categories created with current user - .Include(x => x.Categories!.Where(c => c.Category.UserId == userId))! - .ThenInclude(x => x.Category) - // access rights created with current user - .Include(x => x.AccessRights!.Where(a => a.OwnerId == userId))! - .ThenInclude(x => x.User) - // require only one motions to check if can to delete account - .Include(x => x.Motions!.Take(1))! - // only accounts with access to current user - .Where(x => x.AccessRights!.Any(a => a.UserId == userId)) - .ToList(); - } - - public async Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default) - { - return await _context.Accounts! - .Include(x => x.CurrencyGlobal) - // categories created with current user - .Include(x => x.Categories!.Where(c => c.Category.UserId == userId))! - .ThenInclude(x => x.Category) - // access rights created with current user - .Include(x => x.AccessRights!.Where(a => a.OwnerId == userId))! - .ThenInclude(x => x.User) - // require only one motions to check if can to delete account - .Include(x => x.Motions!.Take(1))! - // only accounts with access to current user - .Where(x => x.AccessRights!.Any(a => a.UserId == userId)) - .ToListAsync(cancellationToken); - } - - public List GetByCategory(Guid userId, Guid categoryId) - { - return _context.Accounts! - .Include(x => x.CurrencyGlobal) - .Include(x => x.Categories)! - .ThenInclude(x => x.Category) - .Include(x => x.AccessRights)! - .ThenInclude(x => x.User) - .Include(x => x.Motions)! - .Where(x => x.Categories!.Any(c => c.CategoryId == categoryId) && x.AccessRights!.Any(a => a.UserId == userId)) - .ToList(); - } - - public async Task> GetByCategoryAsync(Guid userId, Guid categoryId, CancellationToken cancellationToken = default) - { - return await _context.Accounts! - .Include(x => x.CurrencyGlobal) - .Include(x => x.Categories)! - .ThenInclude(x => x.Category) - .Include(x => x.AccessRights)! - .ThenInclude(x => x.User) - .Include(x => x.Motions)! - .Where(x => x.Categories!.Any(c => c.CategoryId == categoryId) && x.AccessRights!.Any(a => a.UserId == userId)) - .ToListAsync(cancellationToken); - } - - public List GetByCategoryDetailed(Guid userId, Guid categoryId) - { - return _context.Accounts! - .Include(x => x.CurrencyGlobal) - .Include(x => x.Categories)! - .ThenInclude(x => x.Category) - .Include(x => x.AccessRights)! - .ThenInclude(x => x.User) - .Where(x => x.Categories!.Any(c => c.CategoryId == categoryId) && x.AccessRights!.Any(a => a.UserId == userId)) - .Select(x => new AccountDetailed - { - Account = x, - TotalPlus = x.Motions!.Sum(m => m.AmountPlus), - TotalMinus = x.Motions!.Sum(m => m.AmountMinus), - }) - .ToList(); - } - - public Task> GetByCategoryDetailedAsync( - Guid userId, - Guid categoryId, - CancellationToken cancellationToken = default - ) - { - return _context.Accounts! - .Include(x => x.CurrencyGlobal) - .Include(x => x.Categories)! - .ThenInclude(x => x.Category) - .Include(x => x.AccessRights)! - .ThenInclude(x => x.User) - .Where(x => x.Categories!.Any(c => c.CategoryId == categoryId) && x.AccessRights!.Any(a => a.UserId == userId)) - .Select(x => new AccountDetailed - { - Account = x, - TotalPlus = x.Motions!.Sum(m => m.AmountPlus), - TotalMinus = x.Motions!.Sum(m => m.AmountMinus), - }) - .ToListAsync(cancellationToken); - } - - public AccountDetailed? GetByIdDetailed(Guid userId, Guid id) - { - return _context.Accounts! - .Include(x => x.CurrencyGlobal) - .Include(x => x.Categories)! - .ThenInclude(x => x.Category) - .Include(x => x.AccessRights)! - .ThenInclude(x => x.User) - .Where(x => x.Id == id && x.AccessRights!.Any(a => a.UserId == userId)) - .Select(x => new AccountDetailed - { - Account = x, - TotalPlus = x.Motions!.Sum(m => m.AmountPlus), - TotalMinus = x.Motions!.Sum(m => m.AmountMinus), - }) - .FirstOrDefault(); - } - - public Task GetByIdDetailedAsync( - Guid userId, - Guid id, - CancellationToken cancellationToken = default - ) - { - return _context.Accounts! - .Include(x => x.CurrencyGlobal) - .Include(x => x.Categories)! - .ThenInclude(x => x.Category) - .Include(x => x.AccessRights)! - .ThenInclude(x => x.User) - .Where(x => x.Id == id && x.AccessRights!.Any(a => a.UserId == userId)) - .Select(x => new AccountDetailed - { - Account = x, - TotalPlus = x.Motions!.Sum(m => m.AmountPlus), - TotalMinus = x.Motions!.Sum(m => m.AmountMinus), - }) - .FirstOrDefaultAsync(cancellationToken); - } - - public bool Add(Account account) - { - return AddBase(account) > 0; - } - - public async Task AddAsync(Account account, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(account, cancellationToken) > 0; - } - - public bool Delete(Account account) - { - return RemoveBase(account) > 0; - } - - public async Task DeleteAsync(Account account, CancellationToken cancellationToken = default) - { - return await RemoveBaseAsync(account, cancellationToken) > 0; - } - - public Account? Get(Guid userId, Guid id) - { - return _context.Accounts! - .Include(x => x.Categories!.Where(c => c.Category.UserId == userId))! - .ThenInclude(x => x.Category) - .Include(x => x.AccessRights)! - .ThenInclude(x => x.User) - //.Include(x => x.Motions)! - .FirstOrDefault(x => x.Id == id && x.AccessRights!.Any(r => r.UserId == userId)); - } - - public Task GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default) - { - return _context.Accounts! - .Include(x => x.Categories!.Where(c => c.Category.UserId == userId))! - .ThenInclude(x => x.Category) - .Include(x => x.AccessRights)! - .ThenInclude(x => x.User) - .FirstOrDefaultAsync( - x => x.Id == id && x.AccessRights!.Any(r => r.UserId == userId), - cancellationToken); - } - - public bool Update(Account account) - { - return UpdateBase(account) > 0; - } - - public async Task UpdateAsync(Account account, CancellationToken cancellationToken = default) - { - return await UpdateBaseAsync(account, cancellationToken) > 0; - } - - public bool Remove(Account account) - { - return RemoveBase(account) > 0; - } - - public List FindAccounts(Guid userId, string term) - { - return _context.Accounts - .Where(x => x.AccessRights!.Any(a => a.UserId == userId)) - .Where(x => x.Name.ToLower().Contains(term.ToLower())) - .ToList(); - } - - public async Task> FindAccountsAsync(Guid userId, string term, CancellationToken cancellationToken = default) - { - return await _context.Accounts - .Where(x => x.AccessRights!.Any(a => a.UserId == userId)) - .Where(x => x.Name.ToLower().Contains(term.ToLower())) - .ToListAsync(cancellationToken); - } - - public List GetAccountsWithRate(Guid userId, DateTime date) - { - var accounts = _context.Accounts - .Where(x => x.AccessRights!.Any(a => a.UserId == userId)) - .ToList(); - - var currencyIds = accounts - .Select(x => x.CurrencyGlobalId) - .ToList(); - - var rates = _context.CurrencyRates - .Include(x => x.Currency) - .Where(x => x.Currency!.UserId == userId) - .Where(x => x.DateTime <= date) - .Where(x => currencyIds.Contains(x.Currency!.CurrencyGlobalId)) - .GroupBy(x => x.Currency!.CurrencyGlobalId) - .Select(x => x.OrderByDescending(r => r.DateTime).First()) - .ToList(); - - return accounts - .Select(account => - { - var rate = rates.FirstOrDefault(rate => rate.Currency!.CurrencyGlobalId == account.CurrencyGlobalId); - - var result = new AccountWithRate - { - Account = account, - Currency = rate?.Currency, - Rate = rate, - }; - - return result; - }) - .ToList(); - } - - public List GetRestAtDate(Guid userId, DateTime date) - { - return _context.AccountAccesses! - .Where(x => x.UserId == userId) - .Include(x => x.Account!) - .ThenInclude(x => x.CurrencyGlobal!) - .ThenInclude(x => x.Currencies!) - .ThenInclude(x => x.CurrentRate!) - .Include(x => x.Account) - .ThenInclude(x => x!.Motions) - .Select(x => new - { - Id = x.AccountId, - Name = x.Account!.Name, - Type = x.Type, - Currency = x.Account!.CurrencyGlobal!.Currencies!.FirstOrDefault(c => c.UserId == userId), - CurrentRate = x.Account!.CurrencyGlobal!.Currencies!.FirstOrDefault(c => c.UserId == userId)!.CurrentRate, - Plus = x.Account.Motions! - .Where(x => !x.DeletedOn.HasValue) - .Sum(m => m.AmountPlus), - Minus = x.Account.Motions! - .Where(x => !x.DeletedOn.HasValue) - .Sum(m => m.AmountMinus), - }) - .ToList() - .Select(x => new AccountSimple - { - Id = x.Id, - Name = x.Name, - Type = x.Type, - CurrencyName = x.Currency?.Name, - CurrencyShortName = x.Currency?.ShortName, - CurrencyRate = x.CurrentRate?.Rate, - CurrencyQuantity = x.CurrentRate?.Quantity, - TotalMinus = x.Minus, - TotalPlus = x.Plus, - Balance = x.Plus - x.Minus, - }) - .ToList(); - } - - public List GetIncomeByCategories(Guid userId, DateTime from, DateTime to) - { - var accounts = GetAccountsWithRate(userId, to); - var accountIds = accounts.Select(x => x.Account.Id); - - return _context.Motions - .Where(x => x.DateTime >= from && x.DateTime <= to) - .Where(x => accountIds.Contains(x.AccountId)) - .Where(x => !x.Item.Category!.IsInternal) - .GroupBy(x => new - { - Id = x.Item.CategoryId, - Name = x.Item.Category!.Name, - IsUserCategory = x.Item.Category!.UserId == userId, - CurrencyId = x.Account.CurrencyGlobalId, - CurrencyName = x.Account.CurrencyGlobal!.Name, - }) - .ToList() - .Select(x => new MotionTotalSimple - { - Id = x.Key.IsUserCategory ? x.Key.Id : userId, - Name = x.Key.Name, - CurrencyId = x.Key.CurrencyId, - CurrencyName = x.Key.CurrencyName, - Amount = x.Sum(a => a.AmountPlus), - }) - .ToList(); - } - - public List GetIncomeByCategory(Guid userId, Guid categoryId, DateTime from, DateTime to) - { - return _context.Motions - .Where(x => x.DateTime >= from && x.DateTime <= to) - .Where(x => x.Item.Category!.UserId == userId) - .Where(x => x.Item.CategoryId == categoryId) - .Where(x => !x.Item.Category!.IsInternal) - .Where(x => x.Item.Category!.UserId == userId) - .GroupBy(x => new - { - Id = x.Item.ItemGlobalId, - Name = x.Item.ItemGlobal!.Name, - CurrencyId = x.Account.CurrencyGlobalId, - CurrencyName = x.Account.CurrencyGlobal!.Name, - }) - .Select(x => new MotionTotalSimple - { - Name = x.Key.Name, - CurrencyId = x.Key.CurrencyId, - CurrencyName = x.Key.CurrencyName, - Amount = x.Sum(a => a.AmountPlus), - }) - .ToList(); - } - - - public List GetOutcomeByCategories(Guid userId, DateTime from, DateTime to) - { - var accounts = GetAccountsWithRate(userId, to); - var accountIds = accounts.Select(x => x.Account.Id); - - return _context.Motions - .Where(x => x.DateTime >= from && x.DateTime <= to) - .Where(x => accountIds.Contains(x.AccountId)) - .Where(x => !x.Item.Category!.IsInternal) - .GroupBy(x => new - { - Id = x.Item.CategoryId, - Name = x.Item.Category!.Name, - IsUserCategory = x.Item.Category!.UserId == userId, - CurrencyId = x.Account.CurrencyGlobalId, - CurrencyName = x.Account.CurrencyGlobal!.Name, - }) - .Select(x => new MotionTotalSimple - { - Id = x.Key.IsUserCategory ? x.Key.Id : userId, - Name = x.Key.IsUserCategory ? x.Key.Name : "UnCategorized", - //Name = x.Key.Name, - CurrencyId = x.Key.CurrencyId, - CurrencyName = x.Key.CurrencyName, - Amount = x.Sum(a => a.AmountMinus), - }).ToList(); - } - - - public List GetOutcomeByCategory(Guid userId, Guid categoryId, DateTime from, DateTime to) - { - var accounts = GetAccountsWithRate(userId, to); - var accountIds = accounts.Select(x => x.Account.Id); - - return _context.Motions - .Where(x => x.DateTime >= from && x.DateTime <= to) - .Where(x => accountIds.Contains(x.AccountId)) - .Where(x => !x.Item.Category!.IsInternal) - .Where(x => x.Item.CategoryId == categoryId) - .GroupBy(x => new - { - Id = x.Item.ItemGlobalId, - Name = x.Item.ItemGlobal!.Name, - CurrencyId = x.Account.CurrencyGlobalId, - CurrencyName = x.Account.CurrencyGlobal!.Name, - }) - .Select(x => new MotionTotalSimple - { - CurrencyId = x.Key.CurrencyId, - CurrencyName = x.Key.CurrencyName, - Name = x.Key.Name, - Amount = x.Sum(a => a.AmountMinus), - }) - .ToList(); - } - - public async Task> GetAccountsWithRateAsync( - Guid userId, - DateTime date, - CancellationToken cancellationToken = default - ) - { - var accounts = await _context.Accounts - .Where(x => x.AccessRights!.Any(a => a.UserId == userId)) - .ToListAsync(cancellationToken); - - var currencyIds = accounts - .Select(x => x.CurrencyGlobalId) - .ToList(); - - var rates = await _context.CurrencyRates - .Include(x => x.Currency) - .Where(x => x.Currency!.UserId == userId) - .Where(x => x.DateTime <= date) - .Where(x => currencyIds.Contains(x.Currency!.CurrencyGlobalId)) - .GroupBy(x => x.Currency!.CurrencyGlobalId) - .Select(x => x.OrderByDescending(r => r.DateTime).First()) - .ToListAsync(cancellationToken); - - return accounts - .Select(account => - { - var rate = rates.FirstOrDefault(r => r.Currency!.CurrencyGlobalId == account.CurrencyGlobalId); - return new AccountWithRate - { - Account = account, - Currency = rate?.Currency, - Rate = rate, - }; - }) - .ToList(); - } - - public async Task> GetRestAtDateAsync( - Guid userId, - DateTime date, - CancellationToken cancellationToken = default - ) - { - var rows = await _context.AccountAccesses! - .Where(x => x.UserId == userId) - .Include(x => x.Account!) - .ThenInclude(x => x.CurrencyGlobal!) - .ThenInclude(x => x.Currencies!) - .ThenInclude(x => x.CurrentRate!) - .Include(x => x.Account) - .ThenInclude(x => x!.Motions) - .Select(x => new - { - Id = x.AccountId, - Name = x.Account!.Name, - Type = x.Type, - Currency = x.Account!.CurrencyGlobal!.Currencies!.FirstOrDefault(c => c.UserId == userId), - CurrentRate = x.Account!.CurrencyGlobal!.Currencies!.FirstOrDefault(c => c.UserId == userId)!.CurrentRate, - Plus = x.Account.Motions! - .Where(m => !m.DeletedOn.HasValue) - .Sum(m => m.AmountPlus), - Minus = x.Account.Motions! - .Where(m => !m.DeletedOn.HasValue) - .Sum(m => m.AmountMinus), - }) - .ToListAsync(cancellationToken); - - return rows - .Select(x => new AccountSimple - { - Id = x.Id, - Name = x.Name, - Type = x.Type, - CurrencyName = x.Currency?.Name, - CurrencyShortName = x.Currency?.ShortName, - CurrencyRate = x.CurrentRate?.Rate, - CurrencyQuantity = x.CurrentRate?.Quantity, - TotalMinus = x.Minus, - TotalPlus = x.Plus, - Balance = x.Plus - x.Minus, - }) - .ToList(); - } - - public async Task> GetIncomeByCategoriesAsync( - Guid userId, - DateTime from, - DateTime to, - CancellationToken cancellationToken = default - ) - { - var accounts = await GetAccountsWithRateAsync(userId, to, cancellationToken); - var accountIds = accounts.Select(x => x.Account.Id).ToList(); - - var groups = await _context.Motions - .Where(x => x.DateTime >= from && x.DateTime <= to) - .Where(x => accountIds.Contains(x.AccountId)) - .Where(x => !x.Item.Category!.IsInternal) - .GroupBy(x => new - { - Id = x.Item.CategoryId, - Name = x.Item.Category!.Name, - IsUserCategory = x.Item.Category!.UserId == userId, - CurrencyId = x.Account.CurrencyGlobalId, - CurrencyName = x.Account.CurrencyGlobal!.Name, - }) - .ToListAsync(cancellationToken); - - return groups - .Select(x => new MotionTotalSimple - { - Id = x.Key.IsUserCategory ? x.Key.Id : userId, - Name = x.Key.Name, - CurrencyId = x.Key.CurrencyId, - CurrencyName = x.Key.CurrencyName, - Amount = x.Sum(a => a.AmountPlus), - }) - .ToList(); - } - - public Task> GetIncomeByCategoryAsync( - Guid userId, - Guid categoryId, - DateTime from, - DateTime to, - CancellationToken cancellationToken = default - ) - { - return _context.Motions - .Where(x => x.DateTime >= from && x.DateTime <= to) - .Where(x => x.Item.Category!.UserId == userId) - .Where(x => x.Item.CategoryId == categoryId) - .Where(x => !x.Item.Category!.IsInternal) - .Where(x => x.Item.Category!.UserId == userId) - .GroupBy(x => new - { - Id = x.Item.ItemGlobalId, - Name = x.Item.ItemGlobal!.Name, - CurrencyId = x.Account.CurrencyGlobalId, - CurrencyName = x.Account.CurrencyGlobal!.Name, - }) - .Select(x => new MotionTotalSimple - { - Name = x.Key.Name, - CurrencyId = x.Key.CurrencyId, - CurrencyName = x.Key.CurrencyName, - Amount = x.Sum(a => a.AmountPlus), - }) - .ToListAsync(cancellationToken); - } - - public async Task> GetOutcomeByCategoriesAsync( - Guid userId, - DateTime from, - DateTime to, - CancellationToken cancellationToken = default - ) - { - var accounts = await GetAccountsWithRateAsync(userId, to, cancellationToken); - var accountIds = accounts.Select(x => x.Account.Id).ToList(); - - return await _context.Motions - .Where(x => x.DateTime >= from && x.DateTime <= to) - .Where(x => accountIds.Contains(x.AccountId)) - .Where(x => !x.Item.Category!.IsInternal) - .GroupBy(x => new - { - Id = x.Item.CategoryId, - Name = x.Item.Category!.Name, - IsUserCategory = x.Item.Category!.UserId == userId, - CurrencyId = x.Account.CurrencyGlobalId, - CurrencyName = x.Account.CurrencyGlobal!.Name, - }) - .Select(x => new MotionTotalSimple - { - Id = x.Key.IsUserCategory ? x.Key.Id : userId, - Name = x.Key.IsUserCategory ? x.Key.Name : "UnCategorized", - CurrencyId = x.Key.CurrencyId, - CurrencyName = x.Key.CurrencyName, - Amount = x.Sum(a => a.AmountMinus), - }) - .ToListAsync(cancellationToken); - } - - public async Task> GetOutcomeByCategoryAsync( - Guid userId, - Guid categoryId, - DateTime from, - DateTime to, - CancellationToken cancellationToken = default - ) - { - var accounts = await GetAccountsWithRateAsync(userId, to, cancellationToken); - var accountIds = accounts.Select(x => x.Account.Id).ToList(); - - return await _context.Motions - .Where(x => x.DateTime >= from && x.DateTime <= to) - .Where(x => accountIds.Contains(x.AccountId)) - .Where(x => !x.Item.Category!.IsInternal) - .Where(x => x.Item.CategoryId == categoryId) - .GroupBy(x => new - { - Id = x.Item.ItemGlobalId, - Name = x.Item.ItemGlobal!.Name, - CurrencyId = x.Account.CurrencyGlobalId, - CurrencyName = x.Account.CurrencyGlobal!.Name, - }) - .Select(x => new MotionTotalSimple - { - CurrencyId = x.Key.CurrencyId, - CurrencyName = x.Key.CurrencyName, - Name = x.Key.Name, - Amount = x.Sum(a => a.AmountMinus), - }) - .ToListAsync(cancellationToken); - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Account/IAccountAccessInviteRepository.cs b/MyOffice.Data.Repositories/Account/IAccountAccessInviteRepository.cs deleted file mode 100644 index ac0a50c..0000000 --- a/MyOffice.Data.Repositories/Account/IAccountAccessInviteRepository.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Models.Accounts; - -public interface IAccountAccessInviteRepository -{ - AccountAccessInvite? Get(Guid userId, string email); - Task GetAsync(Guid userId, string email, CancellationToken cancellationToken = default); - IEnumerable GetActive(string email); - Task> GetActiveAsync(string email, CancellationToken cancellationToken = default); - AccountAccessInvite? Get(Guid id); - Task GetAsync(Guid id, CancellationToken cancellationToken = default); - bool Add(AccountAccessInvite invite); - Task AddAsync(AccountAccessInvite invite, CancellationToken cancellationToken = default); - bool Update(AccountAccessInvite invite); - Task UpdateAsync(AccountAccessInvite invite, CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Account/IAccountAccessRepository.cs b/MyOffice.Data.Repositories/Account/IAccountAccessRepository.cs deleted file mode 100644 index 47e7c95..0000000 --- a/MyOffice.Data.Repositories/Account/IAccountAccessRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Models.Accounts; - -public interface IAccountAccessRepository -{ - bool Add(AccountAccess accountAccess); - Task AddAsync(AccountAccess accountAccess, CancellationToken cancellationToken = default); - bool Update(AccountAccess accountAccess); - Task UpdateAsync(AccountAccess accountAccess, CancellationToken cancellationToken = default); - bool Delete(AccountAccess accountAccess); - Task DeleteAsync(AccountAccess accountAccess, CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Account/IAccountAccountCategoryRepository.cs b/MyOffice.Data.Repositories/Account/IAccountAccountCategoryRepository.cs deleted file mode 100644 index 1f2d59c..0000000 --- a/MyOffice.Data.Repositories/Account/IAccountAccountCategoryRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Models.Accounts; - -public interface IAccountAccountCategoryRepository -{ - List Get(Guid userId, Guid accountId, Guid categoryId); - Task> GetAsync(Guid userId, Guid accountId, Guid categoryId, CancellationToken cancellationToken = default); - bool Remove(AccountAccountCategory accountAccountCategory); - Task RemoveAsync(AccountAccountCategory accountAccountCategory, CancellationToken cancellationToken = default); - bool Add(AccountAccountCategory accountAccountCategory); - Task AddAsync(AccountAccountCategory accountAccountCategory, CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Account/IAccountCategoryRepository.cs b/MyOffice.Data.Repositories/Account/IAccountCategoryRepository.cs deleted file mode 100644 index 24903f2..0000000 --- a/MyOffice.Data.Repositories/Account/IAccountCategoryRepository.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Models.Accounts; - -public interface IAccountCategoryRepository -{ - List GetAll(Guid userId); - Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default); - bool Add(AccountCategory accountCategory); - Task AddAsync(AccountCategory accountCategory, CancellationToken cancellationToken = default); - AccountCategory? Get(Guid userId, Guid id); - Task GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default); - bool Update(AccountCategory accountCategory); - Task UpdateAsync(AccountCategory accountCategory, CancellationToken cancellationToken = default); - bool Remove(AccountCategory accountCategory); - Task RemoveAsync(AccountCategory accountCategory, CancellationToken cancellationToken = default); -} diff --git a/MyOffice.Data.Repositories/Account/IAccountyRepository.cs b/MyOffice.Data.Repositories/Account/IAccountyRepository.cs deleted file mode 100644 index 5d7345d..0000000 --- a/MyOffice.Data.Repositories/Account/IAccountyRepository.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Models.Accounts; - -public interface IAccountRepository -{ - List GetAll(Guid userId); - Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default); - List GetByCategory(Guid userId, Guid categoryId); - Task> GetByCategoryAsync(Guid userId, Guid categoryId, CancellationToken cancellationToken = default); - List GetByCategoryDetailed(Guid userId, Guid categoryId); - Task> GetByCategoryDetailedAsync(Guid userId, Guid categoryId, CancellationToken cancellationToken = default); - AccountDetailed? GetByIdDetailed(Guid userId, Guid id); - Task GetByIdDetailedAsync(Guid userId, Guid id, CancellationToken cancellationToken = default); - bool Add(Account account); - Task AddAsync(Account account, CancellationToken cancellationToken = default); - bool Delete(Account account); - Task DeleteAsync(Account account, CancellationToken cancellationToken = default); - Account? Get(Guid userId, Guid id); - Task GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default); - bool Update(Account account); - Task UpdateAsync(Account account, CancellationToken cancellationToken = default); - bool Remove(Account account); - List FindAccounts(Guid userId, string term); - Task> FindAccountsAsync(Guid userId, string term, CancellationToken cancellationToken = default); - - List GetRestAtDate(Guid userId, DateTime date); - Task> GetRestAtDateAsync(Guid userId, DateTime date, CancellationToken cancellationToken = default); - List GetIncomeByCategories(Guid userId, DateTime from, DateTime to); - Task> GetIncomeByCategoriesAsync(Guid userId, DateTime from, DateTime to, CancellationToken cancellationToken = default); - List GetIncomeByCategory(Guid userId, Guid categoryId, DateTime from, DateTime to); - Task> GetIncomeByCategoryAsync(Guid userId, Guid categoryId, DateTime from, DateTime to, CancellationToken cancellationToken = default); - List GetOutcomeByCategories(Guid userId, DateTime from, DateTime to); - Task> GetOutcomeByCategoriesAsync(Guid userId, DateTime from, DateTime to, CancellationToken cancellationToken = default); - List GetOutcomeByCategory(Guid userId, Guid categoryId, DateTime from, DateTime to); - Task> GetOutcomeByCategoryAsync(Guid userId, Guid categoryId, DateTime from, DateTime to, CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Account/IMotionRepository.cs b/MyOffice.Data.Repositories/Account/IMotionRepository.cs deleted file mode 100644 index 2cc664d..0000000 --- a/MyOffice.Data.Repositories/Account/IMotionRepository.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Models.Accounts; - -public interface IMotionRepository -{ - Task AddAsync(Motion motion, CancellationToken cancellationToken = default); - Task> GetByAccountAsync(Guid accountId, DateTime dateFrom, DateTime dateTo, CancellationToken cancellationToken = default); - Task GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default); - Task UpdateAsync(Motion motion, CancellationToken cancellationToken = default); - Task RemoveAsync(Motion motion, CancellationToken cancellationToken = default); -} diff --git a/MyOffice.Data.Repositories/Account/MotionRepository.cs b/MyOffice.Data.Repositories/Account/MotionRepository.cs deleted file mode 100644 index 3d2ceb5..0000000 --- a/MyOffice.Data.Repositories/Account/MotionRepository.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace MyOffice.Data.Repositories.Account; - -using Microsoft.EntityFrameworkCore; -using Models.Accounts; -using MyOffice.DbContext; - -public class MotionRepository : AppRepository, IMotionRepository -{ - public MotionRepository(AppDbContext context) : base(context) - { - } - - public async Task AddAsync(Motion motion, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(motion, cancellationToken) > 0; - } - - public async Task> GetByAccountAsync( - Guid accountId, - DateTime dateFrom, - DateTime dateTo, - CancellationToken cancellationToken = default - ) - { - return await _context - .Motions - .Include(x => x.Item) - .ThenInclude(x => x.ItemGlobal) - .Where(x => x.AccountId == accountId && x.DateTime >= dateFrom && x.DateTime <= dateTo) - .OrderByDescending(x => x.DateTime) - .ThenByDescending(x => x.CreatedOn) - .ToListAsync(cancellationToken); - } - - public async Task GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default) - { - return await _context - .Motions - .Include(x => x.Item) - .ThenInclude(x => x.ItemGlobal) - .FirstOrDefaultAsync( - x => x.Account!.AccessRights!.Any(a => a.UserId == userId) && x.Id == id, - cancellationToken); - } - - public async Task UpdateAsync(Motion motion, CancellationToken cancellationToken = default) - { - return await UpdateBaseAsync(motion, cancellationToken) > 0; - } - - public async Task RemoveAsync(Motion motion, CancellationToken cancellationToken = default) - { - return await RemoveBaseAsync(motion, cancellationToken) > 0; - } -} diff --git a/MyOffice.Data.Repositories/AppRepository.cs b/MyOffice.Data.Repositories/AppRepository.cs deleted file mode 100644 index 84e7481..0000000 --- a/MyOffice.Data.Repositories/AppRepository.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Data.Repositories; - -using DbContext; - -public class AppRepository : RepositoryBase where TEntity : class -{ - public AppRepository(AppDbContext context) : base(context) - { - } -} diff --git a/MyOffice.Data.Repositories/Currency/CurrencyGlobalRepository.cs b/MyOffice.Data.Repositories/Currency/CurrencyGlobalRepository.cs deleted file mode 100644 index 1eda5bf..0000000 --- a/MyOffice.Data.Repositories/Currency/CurrencyGlobalRepository.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace MyOffice.Data.Repositories.Currency; - -using Microsoft.EntityFrameworkCore; -using Models.Currencies; -using MyOffice.DbContext; - -public class CurrencyGlobalRepository : AppRepository, ICurrencyGlobalRepository -{ - public CurrencyGlobalRepository(AppDbContext context) : base(context) - { - } - - public List GetAll() - { - return _context.CurrencyGlobals.ToList(); - } - - public async Task> GetAllAsync(CancellationToken cancellationToken = default) - { - return await _context.CurrencyGlobals.ToListAsync(cancellationToken); - } -} diff --git a/MyOffice.Data.Repositories/Currency/CurrencyRateRepository.cs b/MyOffice.Data.Repositories/Currency/CurrencyRateRepository.cs deleted file mode 100644 index 72b43be..0000000 --- a/MyOffice.Data.Repositories/Currency/CurrencyRateRepository.cs +++ /dev/null @@ -1,115 +0,0 @@ -namespace MyOffice.Data.Repositories.Currency; - -using System.Xml.Schema; -using Microsoft.EntityFrameworkCore; -using Models.Currencies; -using MyOffice.DbContext; - -public class CurrencyRateRepository : AppRepository, ICurrencyRateRepository -{ - public CurrencyRateRepository(AppDbContext context) : base(context) - { - } - - public List GetLastRates(Guid currencyId, DateTime? before = null, int count = 1) - { - before = before ?? DateTime.UtcNow; - - return _context.CurrencyRates - .Where(x => x.CurrencyId == currencyId) - .Where(x => x.DateTime <= before) - .OrderByDescending(x => x.DateTime) - .ThenByDescending(x => x.Id) - .Take(count) - .ToList(); - } - - public async Task> GetLastRatesAsync( - Guid currencyId, - DateTime? before = null, - int count = 1, - CancellationToken cancellationToken = default) - { - before ??= DateTime.UtcNow; - - return await _context.CurrencyRates - .Where(x => x.CurrencyId == currencyId) - .Where(x => x.DateTime <= before) - .OrderByDescending(x => x.DateTime) - .ThenByDescending(x => x.Id) - .Take(count) - .ToListAsync(cancellationToken); - } - - public Dictionary GetLastRates(Guid userId, List currencyIds, DateTime? before = null) - { - return _context.CurrencyRates - .Include(x => x.Currency) - .Include(x => x.Currency!.CurrencyGlobal) - .Where(x => x.DateTime <= before) - .Where(x => x.Currency!.UserId == userId) - .Where(x => currencyIds.Contains(x.Currency!.CurrencyGlobalId)) - .GroupBy(x => new - { - x.Currency!.CurrencyGlobalId - }, (key, g) => new - { - key.CurrencyGlobalId, - rate = g.OrderByDescending(x => x.DateTime).First() - }) - .ToDictionary(x => x.CurrencyGlobalId, x => x.rate); - } - - public async Task> GetLastRatesAsync( - Guid userId, - List currencyIds, - DateTime? before = null, - CancellationToken cancellationToken = default - ) - { - var rows = await _context.CurrencyRates - .Include(x => x.Currency) - .Include(x => x.Currency!.CurrencyGlobal) - .Where(x => x.DateTime <= before) - .Where(x => x.Currency!.UserId == userId) - .Where(x => currencyIds.Contains(x.Currency!.CurrencyGlobalId)) - .GroupBy(x => new - { - x.Currency!.CurrencyGlobalId - }, (key, g) => new - { - key.CurrencyGlobalId, - rate = g.OrderByDescending(x => x.DateTime).First() - }) - .ToListAsync(cancellationToken); - - return rows.ToDictionary(x => x.CurrencyGlobalId, x => x.rate); - } - - public bool AddRate(CurrencyRate currencyRate) - { - return this.AddBase(currencyRate) > 0; - } - - public async Task AddRateAsync(CurrencyRate currencyRate, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(currencyRate, cancellationToken) > 0; - } - - public List GetAtDate(Guid currencyId, DateTime date) - { - return _context.CurrencyRates - .Where(x => x.CurrencyId == currencyId && x.DateTime == date) - .ToList(); - } - - public async Task> GetAtDateAsync( - Guid currencyId, - DateTime date, - CancellationToken cancellationToken = default) - { - return await _context.CurrencyRates - .Where(x => x.CurrencyId == currencyId && x.DateTime == date) - .ToListAsync(cancellationToken); - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Currency/CurrencyRepository.cs b/MyOffice.Data.Repositories/Currency/CurrencyRepository.cs deleted file mode 100644 index 77d12bb..0000000 --- a/MyOffice.Data.Repositories/Currency/CurrencyRepository.cs +++ /dev/null @@ -1,102 +0,0 @@ -namespace MyOffice.Data.Repositories.Currency; - -using Microsoft.EntityFrameworkCore; -using Models.Currencies; -using MyOffice.Data.Repositories; -using MyOffice.DbContext; - -public class CurrencyRepository : AppRepository, ICurrencyRepository -{ - public CurrencyRepository(AppDbContext context) : base(context) - { - } - - public List GetAll(Guid userId) - { - return _context.Currencies - .Include(x => x.CurrencyGlobal) - .Where(x => x.UserId == userId) - .ToList(); - } - - public async Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default) - { - return await _context.Currencies - .Include(x => x.CurrencyGlobal) - .Where(x => x.UserId == userId) - .ToListAsync(cancellationToken); - } - - public Currency? Get(Guid userId, Guid id) - { - return _context - .Currencies - .Include(x => x.CurrencyGlobal) - .FirstOrDefault(x => x.Id == id && x.UserId == userId); - } - - public async Task GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default) - { - return await _context - .Currencies - .Include(x => x.CurrencyGlobal) - .FirstOrDefaultAsync(x => x.Id == id && x.UserId == userId, cancellationToken); - } - - public Currency? GetByGlobalCurrency(Guid userId, string globalCurrencyId) - { - return _context.Currencies.FirstOrDefault(x => x.UserId == userId && x.CurrencyGlobalId == globalCurrencyId); - } - - public async Task GetByGlobalCurrencyAsync( - Guid userId, - string globalCurrencyId, - CancellationToken cancellationToken = default) - { - return await _context.Currencies.FirstOrDefaultAsync( - x => x.UserId == userId && x.CurrencyGlobalId == globalCurrencyId, - cancellationToken); - } - - public bool Add(Currency currency) - { - return AddBase(currency) > 0; - } - - public async Task AddAsync(Currency currency, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(currency, cancellationToken) > 0; - } - - public bool Update(Currency currency) - { - return UpdateBase(currency) > 0; - } - - public async Task UpdateAsync(Currency currency, CancellationToken cancellationToken = default) - { - return await UpdateBaseAsync(currency, cancellationToken) > 0; - } - - public bool Remove(Currency currency) - { - return RemoveBase(currency) > 0; - } - - public async Task RemoveAsync(Currency currency, CancellationToken cancellationToken = default) - { - return await RemoveBaseAsync(currency, cancellationToken) > 0; - } - - public List GetPrimaries(Guid userId) - { - return _context.Currencies.Where(x => x.UserId == userId && x.IsPrimary).ToList(); - } - - public async Task> GetPrimariesAsync(Guid userId, CancellationToken cancellationToken = default) - { - return await _context.Currencies - .Where(x => x.UserId == userId && x.IsPrimary) - .ToListAsync(cancellationToken); - } -} diff --git a/MyOffice.Data.Repositories/Currency/ICurrencyGlobalRepository.cs b/MyOffice.Data.Repositories/Currency/ICurrencyGlobalRepository.cs deleted file mode 100644 index e2b75ce..0000000 --- a/MyOffice.Data.Repositories/Currency/ICurrencyGlobalRepository.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MyOffice.Data.Repositories.Currency; - -using Models.Currencies; - -public interface ICurrencyGlobalRepository -{ - List GetAll(); - Task> GetAllAsync(CancellationToken cancellationToken = default); -} diff --git a/MyOffice.Data.Repositories/Currency/ICurrencyRateRepository.cs b/MyOffice.Data.Repositories/Currency/ICurrencyRateRepository.cs deleted file mode 100644 index d54bb0e..0000000 --- a/MyOffice.Data.Repositories/Currency/ICurrencyRateRepository.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyOffice.Data.Repositories.Currency; - -using Models.Currencies; - -public interface ICurrencyRateRepository -{ - List GetLastRates(Guid currencyId, DateTime? before = null, int count = 1); - Task> GetLastRatesAsync(Guid currencyId, DateTime? before = null, int count = 1, CancellationToken cancellationToken = default); - Dictionary GetLastRates(Guid userId, List currencyIds, DateTime? before = null); - Task> GetLastRatesAsync( - Guid userId, - List currencyIds, - DateTime? before = null, - CancellationToken cancellationToken = default); - bool AddRate(CurrencyRate currencyRate); - Task AddRateAsync(CurrencyRate currencyRate, CancellationToken cancellationToken = default); - List GetAtDate(Guid currencyId, DateTime date); - Task> GetAtDateAsync(Guid currencyId, DateTime date, CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Currency/ICurrencyRepository.cs b/MyOffice.Data.Repositories/Currency/ICurrencyRepository.cs deleted file mode 100644 index ebb3ce1..0000000 --- a/MyOffice.Data.Repositories/Currency/ICurrencyRepository.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MyOffice.Data.Repositories.Currency; - -using Models.Currencies; - -public interface ICurrencyRepository -{ - List GetAll(Guid userId); - Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default); - Currency? Get(Guid userId, Guid id); - Task GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default); - Currency? GetByGlobalCurrency(Guid userId, string globalCurrencyId); - Task GetByGlobalCurrencyAsync(Guid userId, string globalCurrencyId, CancellationToken cancellationToken = default); - bool Add(Currency currency); - Task AddAsync(Currency currency, CancellationToken cancellationToken = default); - bool Update(Currency currency); - Task UpdateAsync(Currency currency, CancellationToken cancellationToken = default); - bool Remove(Currency currency); - Task RemoveAsync(Currency currency, CancellationToken cancellationToken = default); - List GetPrimaries(Guid userId); - Task> GetPrimariesAsync(Guid userId, CancellationToken cancellationToken = default); -} diff --git a/MyOffice.Data.Repositories/Item/IItemCategoryRepository.cs b/MyOffice.Data.Repositories/Item/IItemCategoryRepository.cs deleted file mode 100644 index ced8cea..0000000 --- a/MyOffice.Data.Repositories/Item/IItemCategoryRepository.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyOffice.Data.Repositories.Item; - -using MyOffice.Data.Models.Items; - -public interface IItemCategoryRepository -{ - List GetAll(Guid userId); - Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default); - bool Add(ItemCategory accountCategory); - Task AddAsync(ItemCategory accountCategory, CancellationToken cancellationToken = default); - ItemCategory? Get(Guid userId, Guid id); - Task GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default); - bool Update(ItemCategory accountCategory); - Task UpdateAsync(ItemCategory accountCategory, CancellationToken cancellationToken = default); - bool Remove(ItemCategory accountCategory); - Task RemoveAsync(ItemCategory accountCategory, CancellationToken cancellationToken = default); -} diff --git a/MyOffice.Data.Repositories/Item/IItemGlobalRepository.cs b/MyOffice.Data.Repositories/Item/IItemGlobalRepository.cs deleted file mode 100644 index 1dcd4a8..0000000 --- a/MyOffice.Data.Repositories/Item/IItemGlobalRepository.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace MyOffice.Data.Repositories.Item; - -using MyOffice.Data.Models.Items; - -public interface IItemGlobalRepository -{ - ItemGlobal? Get(Guid id); - ItemGlobal? GetByName(string name); - Task GetByNameAsync(string name, CancellationToken cancellationToken = default); - bool Add(ItemGlobal itemGlobal); - Task AddAsync(ItemGlobal itemGlobal, CancellationToken cancellationToken = default); - List GetAvailableToUser(Guid userId); - Task> GetAvailableToUserAsync(Guid userId, CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Item/IItemRepository.cs b/MyOffice.Data.Repositories/Item/IItemRepository.cs deleted file mode 100644 index 2f98f3a..0000000 --- a/MyOffice.Data.Repositories/Item/IItemRepository.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyOffice.Data.Repositories.Item; - -using MyOffice.Data.Models.Items; - -public interface IItemRepository -{ - List GetAll(Guid userId); - Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default); - List GetByCategory(Guid userId, Guid categoryId); - Task> GetByCategoryAsync(Guid userId, Guid categoryId, CancellationToken cancellationToken = default); - Item? GetByGlobal(Guid userId, Guid globalItemId); - Task GetByGlobalAsync(Guid userId, Guid globalItemId, CancellationToken cancellationToken = default); - bool Add(Item item); - Task AddAsync(Item item, CancellationToken cancellationToken = default); - bool Update(Item item); - Task UpdateAsync(Item item, CancellationToken cancellationToken = default); - List Find(Guid userId, string term, int limit); - Task> FindAsync(Guid userId, string term, int limit, CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Item/ItemCategoryRepository.cs b/MyOffice.Data.Repositories/Item/ItemCategoryRepository.cs deleted file mode 100644 index 74bae1d..0000000 --- a/MyOffice.Data.Repositories/Item/ItemCategoryRepository.cs +++ /dev/null @@ -1,72 +0,0 @@ -namespace MyOffice.Data.Repositories.Item; - -using Microsoft.EntityFrameworkCore; -using MyOffice.Data.Models.Items; -using MyOffice.DbContext; - -public class ItemCategoryRepository : AppRepository, IItemCategoryRepository -{ - public ItemCategoryRepository(AppDbContext context) : base(context) - { - } - - public List GetAll(Guid userId) - { - return _context.ItemCategories - .Include(x => x.Items) - .Where(x => x.UserId == userId) - .ToList(); - } - - public async Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default) - { - return await _context.ItemCategories - .Include(x => x.Items) - .Where(x => x.UserId == userId) - .ToListAsync(cancellationToken); - } - - public bool Add(ItemCategory itemCategory) - { - return AddBase(itemCategory) > 0; - } - - public async Task AddAsync(ItemCategory itemCategory, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(itemCategory, cancellationToken) > 0; - } - - public ItemCategory? Get(Guid userId, Guid id) - { - return _context.ItemCategories - .Include(x => x.Items) - .FirstOrDefault(x => x.Id == id && x.UserId == userId); - } - - public async Task GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default) - { - return await _context.ItemCategories - .Include(x => x.Items) - .FirstOrDefaultAsync(x => x.Id == id && x.UserId == userId, cancellationToken); - } - - public bool Update(ItemCategory itemCategory) - { - return UpdateBase(itemCategory) > 0; - } - - public async Task UpdateAsync(ItemCategory itemCategory, CancellationToken cancellationToken = default) - { - return await UpdateBaseAsync(itemCategory, cancellationToken) > 0; - } - - public bool Remove(ItemCategory itemCategory) - { - return RemoveBase(itemCategory) > 0; - } - - public async Task RemoveAsync(ItemCategory itemCategory, CancellationToken cancellationToken = default) - { - return await RemoveBaseAsync(itemCategory, cancellationToken) > 0; - } -} diff --git a/MyOffice.Data.Repositories/Item/ItemGlobalRepository.cs b/MyOffice.Data.Repositories/Item/ItemGlobalRepository.cs deleted file mode 100644 index 1f57d46..0000000 --- a/MyOffice.Data.Repositories/Item/ItemGlobalRepository.cs +++ /dev/null @@ -1,69 +0,0 @@ -namespace MyOffice.Data.Repositories.Item; - -using Microsoft.EntityFrameworkCore; -using MyOffice.Data.Models.Items; -using MyOffice.DbContext; - -public class ItemGlobalRepository : AppRepository, IItemGlobalRepository -{ - public ItemGlobalRepository(AppDbContext context) : base(context) - { - } - - public ItemGlobal? Get(Guid id) - { - return _context.ItemGlobals.FirstOrDefault(x => x.Id == id); - } - - public ItemGlobal? GetByName(string name) - { - return _context.ItemGlobals.FirstOrDefault(x => x.Name == name); - } - - public Task GetByNameAsync(string name, CancellationToken cancellationToken = default) - { - return _context.ItemGlobals.FirstOrDefaultAsync(x => x.Name == name, cancellationToken); - } - - public bool Add(ItemGlobal itemGlobal) - { - return AddBase(itemGlobal) > 0; - } - - public async Task AddAsync(ItemGlobal itemGlobal, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(itemGlobal, cancellationToken) > 0; - } - - public List GetAvailableToUser(Guid userId) - { - return _context.Motions - .Include(x => x.Item) - .ThenInclude(x => x.ItemGlobal) - .ThenInclude(x => x.Items) - .ThenInclude(x => x.Category) - .Where(x => x.Account.AccessRights!.Any(a => a.UserId == userId)) - .Where(x => x.Item.ItemGlobal.Items.All(g => g.Category!.UserId != userId)) - .Select(x => x.Item.ItemGlobal) - .GroupBy(x => x.Id) - .Select(x => x.First()) - .ToList(); - } - - public async Task> GetAvailableToUserAsync( - Guid userId, - CancellationToken cancellationToken = default) - { - return await _context.Motions - .Include(x => x.Item) - .ThenInclude(x => x.ItemGlobal) - .ThenInclude(x => x.Items) - .ThenInclude(x => x.Category) - .Where(x => x.Account.AccessRights!.Any(a => a.UserId == userId)) - .Where(x => x.Item.ItemGlobal.Items.All(g => g.Category!.UserId != userId)) - .Select(x => x.Item.ItemGlobal) - .GroupBy(x => x.Id) - .Select(x => x.First()) - .ToListAsync(cancellationToken); - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Item/ItemRepository.cs b/MyOffice.Data.Repositories/Item/ItemRepository.cs deleted file mode 100644 index ed0bb82..0000000 --- a/MyOffice.Data.Repositories/Item/ItemRepository.cs +++ /dev/null @@ -1,121 +0,0 @@ -namespace MyOffice.Data.Repositories.Item; - -using Microsoft.EntityFrameworkCore; -using MyOffice.Data.Models.Items; -using MyOffice.DbContext; - -public class ItemRepository : AppRepository, IItemRepository -{ - public ItemRepository(AppDbContext context) : base(context) - { - } - - public List GetAll(Guid userId) - { - return _context.Items - .Include(x => x.Motions) - .Include(x => x.Category) - .Include(x => x.ItemGlobal) - .Where(x => x.Category!.UserId == userId) - .ToList(); - } - - public async Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default) - { - return await _context.Items - .Include(x => x.Motions) - .Include(x => x.Category) - .Include(x => x.ItemGlobal) - .Where(x => x.Category!.UserId == userId) - .ToListAsync(cancellationToken); - } - - public List GetByCategory(Guid userId, Guid categoryId) - { - return _context.Items - .Include(x => x.Motions) - .Include(x => x.Category) - .Include(x => x.ItemGlobal) - .Where(x => x.Category!.UserId == userId && x.CategoryId == categoryId) - .ToList(); - } - - public async Task> GetByCategoryAsync( - Guid userId, - Guid categoryId, - CancellationToken cancellationToken = default) - { - return await _context.Items - .Include(x => x.Motions) - .Include(x => x.Category) - .Include(x => x.ItemGlobal) - .Where(x => x.Category!.UserId == userId && x.CategoryId == categoryId) - .ToListAsync(cancellationToken); - } - - public Item? GetByGlobal(Guid userId, Guid globalItemId) - { - return _context.Items - .Include(x => x.Motions) - .Include(x => x.Category) - .Include(x => x.ItemGlobal) - .FirstOrDefault(x => x.Category!.UserId == userId && x.ItemGlobalId == globalItemId); - } - - public Task GetByGlobalAsync(Guid userId, Guid globalItemId, CancellationToken cancellationToken = default) - { - return _context.Items - .Include(x => x.Motions) - .Include(x => x.Category) - .Include(x => x.ItemGlobal) - .FirstOrDefaultAsync( - x => x.Category!.UserId == userId && x.ItemGlobalId == globalItemId, - cancellationToken); - } - - public bool Update(Item item) - { - return base.UpdateBase(item) > 0; - } - - public async Task UpdateAsync(Item item, CancellationToken cancellationToken = default) - { - return await UpdateBaseAsync(item, cancellationToken) > 0; - } - - public bool Add(Item item) - { - return base.AddBase(item) > 0; - } - - public async Task AddAsync(Item item, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(item, cancellationToken) > 0; - } - - public List Find(Guid userId, string term, int limit) - { - return _context - .Items - .Include(x => x.ItemGlobal) - .Where(x => x.Category!.UserId == userId && x.ItemGlobal.Name.ToLower().Contains(term.ToLower())) - .OrderByDescending(x => x!.Motions!.Count()) - .Take(limit) - .ToList(); - } - - public async Task> FindAsync( - Guid userId, - string term, - int limit, - CancellationToken cancellationToken = default) - { - return await _context - .Items - .Include(x => x.ItemGlobal) - .Where(x => x.Category!.UserId == userId && x.ItemGlobal.Name.ToLower().Contains(term.ToLower())) - .OrderByDescending(x => x!.Motions!.Count()) - .Take(limit) - .ToListAsync(cancellationToken); - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/MyOffice.Data.Repositories.csproj b/MyOffice.Data.Repositories/MyOffice.Data.Repositories.csproj deleted file mode 100644 index 0d17979..0000000 --- a/MyOffice.Data.Repositories/MyOffice.Data.Repositories.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - diff --git a/MyOffice.Data.Repositories/Notifications/EmailTemplateRepository.cs b/MyOffice.Data.Repositories/Notifications/EmailTemplateRepository.cs deleted file mode 100644 index 40addda..0000000 --- a/MyOffice.Data.Repositories/Notifications/EmailTemplateRepository.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyOffice.Data.Repositories.Item; - -using MyOffice.Data.Models.Notifications; -using MyOffice.DbContext; - -public class EmailTemplateRepository : AppRepository, IEmailTemplateRepository -{ - public EmailTemplateRepository(AppDbContext context) : base(context) - { - } - - public EmailTemplate? Get(EmailTemplateEnum emailTemplate) - { - var emailTemplateStr = emailTemplate.ToString(); - return _context.EmailTemplates.FirstOrDefault(x => x.Id == emailTemplateStr); - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Notifications/IEmailTemplateRepository.cs b/MyOffice.Data.Repositories/Notifications/IEmailTemplateRepository.cs deleted file mode 100644 index 65849f2..0000000 --- a/MyOffice.Data.Repositories/Notifications/IEmailTemplateRepository.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MyOffice.Data.Repositories.Item; - -using MyOffice.Data.Models.Notifications; - -public interface IEmailTemplateRepository -{ - EmailTemplate? Get(EmailTemplateEnum emailTemplate); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/RepositoryBase.cs b/MyOffice.Data.Repositories/RepositoryBase.cs deleted file mode 100644 index c265ef0..0000000 --- a/MyOffice.Data.Repositories/RepositoryBase.cs +++ /dev/null @@ -1,108 +0,0 @@ -namespace MyOffice.Data.Repositories; - -using Microsoft.EntityFrameworkCore; -using DbContext; - -public class RepositoryBase where TEntity : class -{ - protected readonly AppDbContext _context; - - protected RepositoryBase( - AppDbContext context - ) - { - _context = context; - } - - protected async Task SaveChangesAsync(CancellationToken cancellationToken = default) - { - try - { - return await _context.SaveChangesAsync(cancellationToken); - } - catch (DbUpdateException updateException) - { - throw updateException; - } - } - - protected int SaveChanges() - { - try - { - return _context.SaveChanges(); - } - catch (DbUpdateException updateException) - { - throw updateException; - } - } - - - protected async Task GetBaseAsync(Guid id) - { - return await _context.Set().FindAsync(id); - } - - protected TEntity? GetBase(Guid id) - { - return _context.Set().Find(id); - } - - protected int AddBase(TEntity entity) - { - _context.Entry(entity).State = EntityState.Added; - - var result = SaveChanges(); - - _context.Entry(entity).State = EntityState.Detached; - return result; - } - - protected async Task AddBaseAsync(TEntity entity, CancellationToken cancellationToken = default) - { - _context.Entry(entity).State = EntityState.Added; - var result = await SaveChangesAsync(cancellationToken); - _context.Entry(entity).State = EntityState.Detached; - return result; - } - - protected int RemoveBase(TEntity entity) - { - _context.Set().Remove(entity); - - _context.Entry(entity).State = EntityState.Deleted; - - var result = SaveChanges(); - - _context.Entry(entity).State = EntityState.Detached; - return result; - } - - protected async Task RemoveBaseAsync(TEntity entity, CancellationToken cancellationToken = default) - { - _context.Set().Remove(entity); - _context.Entry(entity).State = EntityState.Deleted; - var result = await SaveChangesAsync(cancellationToken); - _context.Entry(entity).State = EntityState.Detached; - return result; - } - - protected int UpdateBase(TEntity entity) - { - _context.Entry(entity).State = EntityState.Modified; - - var result = SaveChanges(); - - _context.Entry(entity).State = EntityState.Detached; - return result; - } - - protected async Task UpdateBaseAsync(TEntity entity, CancellationToken cancellationToken = default) - { - _context.Entry(entity).State = EntityState.Modified; - var result = await SaveChangesAsync(cancellationToken); - _context.Entry(entity).State = EntityState.Detached; - return result; - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Users/IUserExternalRepository.cs b/MyOffice.Data.Repositories/Users/IUserExternalRepository.cs deleted file mode 100644 index 738f029..0000000 --- a/MyOffice.Data.Repositories/Users/IUserExternalRepository.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace MyOffice.Data.Repositories.Users; - -using Models.Users; - -public interface IUserExternalRepository -{ - int AddUserExternal(UserExternal external); - Task AddUserExternalAsync(UserExternal external, CancellationToken cancellationToken = default); - - Task> GetUserExternalsByUserIdAsync(Guid userId); - - Task GetByUserIdAsync(Guid userId, string provider); - UserExternal? GetByUserId(Guid userId, string provider); - - UserExternal? GetByExternalId(string externalId, string provider); - Task GetByExternalIdAsync(string externalId, string provider); - - void RemoveUserExternal(UserExternal userExternal); - Task RemoveUserExternalAsync(UserExternal userExternal, CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Users/IUserRepository.cs b/MyOffice.Data.Repositories/Users/IUserRepository.cs deleted file mode 100644 index 9d47ac1..0000000 --- a/MyOffice.Data.Repositories/Users/IUserRepository.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace MyOffice.Data.Repositories.Users; - -using MyOffice.Data.Models.Users; - -public interface IUserRepository -{ - Task GetUserAsync(Guid id); - User? GetUser(Guid id); - - Task GetByUserUserNameAsync(string userName); - User? GetByUserUserName(string userName); - - int AddUser(User user); - int UpdateUser(User user); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Users/UserExternalRepository.cs b/MyOffice.Data.Repositories/Users/UserExternalRepository.cs deleted file mode 100644 index 5fd1ad8..0000000 --- a/MyOffice.Data.Repositories/Users/UserExternalRepository.cs +++ /dev/null @@ -1,108 +0,0 @@ -namespace MyOffice.Data.Repositories.Users; - -using MyOffice.Data.Models.Users; -using Repositories; -using Microsoft.EntityFrameworkCore; -using MyOffice.DbContext; - -public class UserExternalRepository : AppRepository, IUserExternalRepository -{ - public UserExternalRepository(AppDbContext context) : base(context) - { - } - - public int AddUserExternal(UserExternal userExternal) - { - return AddBase(userExternal); - } - - public async Task AddUserExternalAsync(UserExternal userExternal, CancellationToken cancellationToken = default) - { - return await AddBaseAsync(userExternal, cancellationToken); - } - - public async Task AddUserExternalsAsync(IEnumerable claims) - { - _context.AddRange(claims); - return await SaveChangesAsync(); - } - - - public async Task> GetUserExternalsByUserNameAsync(string userName) - { - return await _context - .UserClaims - .Where(x => x.User.UserName == userName) - .Include(x => x.User) - .ToListAsync(); - } - - public async Task> GetUserExternalsByUserIdAsync(Guid userId) - { - return await _context - .UserClaims - .Where(x => x.UserId == userId) - .Include(x => x.User) - .ToListAsync(); - } - - public List GetUserExternalsByUser(Guid userId) - { - return _context - .UserClaims - .Where(x => x.UserId == userId) - .Include(x => x.User) - .ToList(); - } - - public List GetUserExternalsByUserName(string userName) - { - return _context - .UserClaims - .Where(x => x.User.UserName == userName) - .Include(x => x.User) - .ToList(); - } - - public async Task GetByUserIdAsync(Guid userId, string provider) - { - return await _context - .UserClaims - .Include(x => x.User) - .FirstOrDefaultAsync(x => x.UserId == userId && x.Provider == provider); - } - - public UserExternal? GetByUserId(Guid userId, string provider) - { - return _context - .UserClaims - .Include(x => x.User) - .FirstOrDefault(x => x.UserId == userId && x.Provider == provider); - } - - public UserExternal? GetByExternalId(string externalId, string provider) - { - return _context - .UserClaims - .Include(x => x.User) - .FirstOrDefault(x => x.ExternalId == externalId && x.Provider == provider); - } - - public Task GetByExternalIdAsync(string externalId, string provider) - { - return _context - .UserClaims - .Include(x => x.User) - .FirstOrDefaultAsync(x => x.ExternalId == externalId && x.Provider == provider); - } - - public void RemoveUserExternal(UserExternal userExternal) - { - RemoveBase(userExternal); - } - - public async Task RemoveUserExternalAsync(UserExternal userExternal, CancellationToken cancellationToken = default) - { - await RemoveBaseAsync(userExternal, cancellationToken); - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Users/UserRepository.cs b/MyOffice.Data.Repositories/Users/UserRepository.cs deleted file mode 100644 index 76aae6b..0000000 --- a/MyOffice.Data.Repositories/Users/UserRepository.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace MyOffice.Data.Repositories.Users; - -using MyOffice.Data.Models.Users; -using Repositories; -using Microsoft.EntityFrameworkCore; -using MyOffice.DbContext; - -public class UserRepository : AppRepository, IUserRepository -{ - public UserRepository(AppDbContext context) : base(context) - { - } - - public async Task GetUserAsync(Guid id) - { - return await GetBaseAsync(id); - } - - public User? GetUser(Guid id) - { - return GetBase(id); - } - - public async Task GetByUserUserNameAsync(string userName) - { - return await _context.Users.FirstOrDefaultAsync(x => x.UserName == userName); - } - - public User? GetByUserUserName(string userName) - { - return _context.Users.FirstOrDefault(x => x.UserName == userName); - } - - public int AddUser(User user) - { - return AddBase(user); - } - - public int UpdateUser(User user) - { - return UpdateBase(user); - } -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Verifications/IVerificationCodeRepository.cs b/MyOffice.Data.Repositories/Verifications/IVerificationCodeRepository.cs deleted file mode 100644 index 4c07131..0000000 --- a/MyOffice.Data.Repositories/Verifications/IVerificationCodeRepository.cs +++ /dev/null @@ -1,11 +0,0 @@ -using MyOffice.Data.Models.Verifications; - -namespace MyOffice.Data.Repositories.Item; - - -public interface IVerificationCodeRepository -{ - VerificationCode? GetByCode(string code); - bool Add(VerificationCode entity); - bool Update(VerificationCode entity); -} \ No newline at end of file diff --git a/MyOffice.Data.Repositories/Verifications/VerificationCodeRepository.cs b/MyOffice.Data.Repositories/Verifications/VerificationCodeRepository.cs deleted file mode 100644 index 796a8cd..0000000 --- a/MyOffice.Data.Repositories/Verifications/VerificationCodeRepository.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace MyOffice.Data.Repositories.Item; - -using Microsoft.EntityFrameworkCore; -using MyOffice.Data.Models.Verifications; -using MyOffice.DbContext; - -public class VerificationCodeRepository : AppRepository, IVerificationCodeRepository -{ - public VerificationCodeRepository(AppDbContext context) : base(context) - { - } - - public bool Add(VerificationCode entity) - { - return AddBase(entity) > 0; - } - - public bool Update(VerificationCode entity) - { - return UpdateBase(entity) > 0; - } - - public VerificationCode? GetByCode(string code) - { - return _context.Verifications.FirstOrDefault(x => x.Code == code); - } -} \ No newline at end of file diff --git a/MyOffice.DbContext/AppDbContext.cs b/MyOffice.DbContext/AppDbContext.cs deleted file mode 100644 index eb14445..0000000 --- a/MyOffice.DbContext/AppDbContext.cs +++ /dev/null @@ -1,335 +0,0 @@ -namespace MyOffice.DbContext; - -using Data.Models.Accounts; -using Data.Models.Currencies; -using Data.Models.Items; -using Microsoft.EntityFrameworkCore; -using Data.Models.Users; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.Data.Models.Verifications; -using MyOffice.Data.Models.Notifications; - -public enum AppDbContextProvidersEnum -{ - sqlite, - mssql, - npgsql -} - -public class AppDbContext : DbContext -{ - private readonly AppDbContextProvidersEnum _provider; - - private readonly Dictionary _noCaseCollation = new() - { - { AppDbContextProvidersEnum.sqlite, "NOCASE" }, - { AppDbContextProvidersEnum.npgsql, "my_ci_collation" } - }; - - public AppDbContext(AppDbContextProvidersEnum provider, DbContextOptions options) : base(options) - { - _provider = provider; - ConfigureChangeTracker(); - } - - public AppDbContext(DbContextOptions options, ConnectionConfiguration connection) : base(options) - { - _provider = Enum.Parse(connection.Provider, ignoreCase: true); - ConfigureChangeTracker(); - } - - private void ConfigureChangeTracker() - { - // Match historical repository behavior (manual EntityState updates). - ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; - ChangeTracker.AutoDetectChangesEnabled = false; - } - - public DbSet Users { get; set; } = null!; - public DbSet UserClaims { get; set; } = null!; - - public DbSet CurrencyGlobals { get; set; } = null!; - public DbSet Currencies { get; set; } = null!; - public DbSet CurrencyRates { get; set; } = null!; - public DbSet AccountCategories { get; set; } = null!; - public DbSet Accounts { get; set; } = null!; - public DbSet AccountAccountCategories { get; set; } = null!; - public DbSet AccountAccesses { get; set; } = null!; - public DbSet AccountAccessInvites { get; set; } = null!; - - public DbSet ItemCategories { get; set; } = null!; - public DbSet ItemGlobals { get; set; } = null!; - public DbSet Items { get; set; } = null!; - public DbSet Motions { get; set; } = null!; - - public DbSet Verifications { get; set; } = null!; - public DbSet EmailTemplates { get; set; } = null!; - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - var noCaseCollation = _noCaseCollation[_provider]; - - if (_provider == AppDbContextProvidersEnum.npgsql) - { - modelBuilder.HasCollation("my_ci_collation", "en-u-ks-primary", "icu", false); - } - - /* NOCASE PROPERTIES */ - modelBuilder.Entity() - .Property(x => x.UserName) - .UseCollation(noCaseCollation); - - modelBuilder.Entity() - .Property(x => x.Email) - .UseCollation(noCaseCollation); - - modelBuilder.Entity() - .Property(x => x.Provider) - .UseCollation(noCaseCollation); - - modelBuilder.Entity() - .Property(x => x.Email) - .UseCollation(noCaseCollation); - - - modelBuilder.Entity() - .HasOne(x => x.User) - .WithMany(x => x.UserClaims) - .HasForeignKey(x => x.UserId); - - UserCreating(modelBuilder); - CurrencyCreating(modelBuilder); - AccountCreating(modelBuilder); - MotionsCreating(modelBuilder); - VerificationsCreating(modelBuilder); - EmailTemplateCreating(modelBuilder); - - modelBuilder.UseOpenIddict(); - - base.OnModelCreating(modelBuilder); - } - - private void VerificationsCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasOne(x => x.User) - .WithMany() - .HasForeignKey(x => x.UserId); - } - - private void EmailTemplateCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasKey(x => x.Id); - } - - private void UserCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasOne(x => x.Currency) - .WithMany() - .HasForeignKey(x => x.CurrencyId); - } - - private void CurrencyCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasOne(x => x.CurrencyGlobal) - .WithMany(x => x.Currencies) - .HasForeignKey(x => x.CurrencyGlobalId); - - modelBuilder.Entity() - .HasOne(x => x.User) - .WithMany(x => x.Currencies) - .HasForeignKey(x => x.UserId); - - modelBuilder.Entity() - .HasOne(x => x.Currency) - .WithMany(x => x.Rates) - .HasForeignKey(x => x.CurrencyId); - - modelBuilder.Entity() - .HasOne(x => x.CurrentRate) - .WithMany(x => x.Currencies) - .HasForeignKey(x => x.CurrentRateId); - } - - private void AccountCreating(ModelBuilder modelBuilder) - { - #region Account - - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasOne(x => x.CurrencyGlobal) - .WithMany(x => x.Accounts) - .HasForeignKey(x => x.CurrencyGlobalId); - - modelBuilder.Entity() - .HasOne(x => x.Owner) - .WithMany(x => x.Accounts) - .HasForeignKey(x => x.OwnerId); - - #endregion Account - - #region AccountAccess - - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasOne(x => x.Account) - .WithMany(x => x.AccessRights) - .HasForeignKey(x => x.AccountId); - - modelBuilder.Entity() - .HasOne(x => x.User) - .WithMany(x => x.AccountAccess) - .HasForeignKey(x => x.UserId); - - modelBuilder.Entity() - .HasOne(x => x.Owner) - .WithMany(x => x.AccountAccessOwners) - .HasForeignKey(x => x.OwnerId); - - modelBuilder - .Entity() - .Property(d => d.Type) - .HasConversion(new EnumToStringConverter()); - - modelBuilder.Entity() - .HasIndex(p => new { p.AccountId, p.UserId }) - .IsUnique(); - - modelBuilder.Entity() - .HasIndex(p => new { p.AccountId, p.OwnerId }) - .IsUnique(); - - #endregion AccountAccess - - #region AccountAccessInvite - - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasOne(x => x.User) - .WithMany(x => x.AccountAccessInvites) - .HasForeignKey(x => x.UserId); - - modelBuilder.Entity() - .HasOne(x => x.Account) - .WithMany(x => x.Invites) - .HasForeignKey(x => x.AccountId); - - #endregion AccountAccessInvite - - #region Motion - - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasOne(x => x.Account) - .WithMany(x => x.Motions) - .HasForeignKey(x => x.AccountId); - - #endregion Motion - - #region AccountCategory - - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasOne(x => x.User) - .WithMany(x => x.AccountCategories) - .HasForeignKey(x => x.UserId); - - #endregion AccountCategory - - #region AccountAccountCategory - - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasOne(x => x.Account) - .WithMany(x => x.Categories) - .HasForeignKey(x => x.AccountId); - - modelBuilder.Entity() - .HasOne(x => x.Category) - .WithMany(x => x.Accounts) - .HasForeignKey(x => x.CategoryId); - - modelBuilder.Entity() - .HasIndex(p => new { p.AccountId, p.CategoryId }) - .IsUnique(); - - modelBuilder.Entity() - .HasOne(x => x.Category) - .WithMany(x => x.Accounts) - .HasForeignKey(x => x.CategoryId); - - #endregion AccountAccountCategory - } - - private void MotionsCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasKey(x => x.Id); - modelBuilder.Entity() - .HasKey(x => x.Id); - modelBuilder.Entity() - .HasKey(x => x.Id); - modelBuilder.Entity() - .HasKey(x => x.Id); - - modelBuilder.Entity() - .HasOne(x => x.User) - .WithMany(x => x.ItemCategories) - .HasForeignKey(x => x.UserId); - - modelBuilder.Entity() - .HasOne(x => x.Category) - .WithMany(x => x.Items) - .HasForeignKey(x => x.CategoryId); - - modelBuilder.Entity() - .HasOne(x => x.ItemGlobal) - .WithMany(x => x.Items) - .HasForeignKey(x => x.ItemGlobalId); - - modelBuilder.Entity() - .HasOne(x => x.Item) - .WithMany(x => x.Motions) - .HasForeignKey(x => x.ItemId); - - modelBuilder.Entity() - .HasOne(x => x.Account) - .WithMany(x => x.Motions) - .HasForeignKey(x => x.AccountId); - - modelBuilder.Entity() - .Property(x => x.AmountMinus) - .HasPrecision(18, 6); - - modelBuilder.Entity() - .Property(x => x.AmountPlus) - .HasPrecision(18, 6); - } -} \ No newline at end of file diff --git a/MyOffice.DbContext/AppDbContextFactory.cs b/MyOffice.DbContext/AppDbContextFactory.cs deleted file mode 100644 index 3362587..0000000 --- a/MyOffice.DbContext/AppDbContextFactory.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace MyOffice.DbContext; - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Design; - -public class AppDbContextFactory : IDesignTimeDbContextFactory -{ - public static AppDbContextFactory Instance = new(); - - public AppDbContext CreateDbContext() - { - return CreateDbContext(null); - } - - public AppDbContext CreateDbContext(string[]? args) - { - var connection = RepositoryInitializer.ConnectionString; - if (connection is null) - { - connection = new ConnectionConfiguration( - args?[0] ?? "npgsql", - args?[1] ?? string.Empty); - } - - var builder = new DbContextOptionsBuilder(); - DbContextServiceCollectionExtensions.ConfigureDbContextOptions(builder, connection); - - if (!Enum.TryParse(connection?.Provider ?? args?[0] ?? "", ignoreCase: true, out var providerEnum)) - throw new InvalidOperationException($"No such provider: [{connection?.Provider}]"); - - var db = new AppDbContext(providerEnum, builder.Options); - db.ChangeTracker.AutoDetectChangesEnabled = false; - db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; - - return db; - } -} \ No newline at end of file diff --git a/MyOffice.DbContext/DatabaseBootstrapper.cs b/MyOffice.DbContext/DatabaseBootstrapper.cs deleted file mode 100644 index 9e27209..0000000 --- a/MyOffice.DbContext/DatabaseBootstrapper.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace MyOffice.DbContext; - -using Data.Models.Currencies; -using Microsoft.EntityFrameworkCore; - -/// -/// Migrate and seed using a DI-scoped (not the design-time factory). -/// -public static class DatabaseBootstrapper -{ - public static async Task InitializeAsync(AppDbContext db, CancellationToken cancellationToken = default) - { - await db.Database.MigrateAsync(cancellationToken); - await PrefillAsync(db, cancellationToken); - await DemoDataSeeder.SeedIfEmptyAsync(db, cancellationToken); - await UpdateCurrentRatesAsync(db, cancellationToken); - } - - private static async Task PrefillAsync(AppDbContext dbContext, CancellationToken cancellationToken) - { - var predefinedCurrencyGlobals = new List - { - new() { Id = CurrencyGlobalIdEnum.UAH.ToString(), DefaultQuantity = 1, Symbol = "₴", Name = "Ukrainian hryvnias" }, - new() { Id = CurrencyGlobalIdEnum.USD.ToString(), DefaultQuantity = 1, Symbol = "$", Name = "US Dollar" }, - new() { Id = CurrencyGlobalIdEnum.EUR.ToString(), DefaultQuantity = 1, Symbol = "€", Name = "Euros" }, - new() { Id = CurrencyGlobalIdEnum.GBP.ToString(), DefaultQuantity = 1, Symbol = "£", Name = "British pounds sterling" }, - new() { Id = CurrencyGlobalIdEnum.RUB.ToString(), DefaultQuantity = 10, Symbol = "₽", Name = "Russia Ruble" }, - new() { Id = CurrencyGlobalIdEnum.BTC.ToString(), DefaultQuantity = 10, Symbol = "btc", Name = "Bitcoin" }, - new() { Id = CurrencyGlobalIdEnum.ETH.ToString(), DefaultQuantity = 10, Symbol = "eth", Name = "Ethereum" }, - new() { Id = CurrencyGlobalIdEnum.TON.ToString(), DefaultQuantity = 10, Symbol = "ton", Name = "TON" }, - new() { Id = CurrencyGlobalIdEnum.OTHER.ToString(), DefaultQuantity = 1, Symbol = "", Name = "Other" }, - }; - - var currencyGlobals = await dbContext.CurrencyGlobals.ToListAsync(cancellationToken); - foreach (var predefined in predefinedCurrencyGlobals) - { - if (currencyGlobals.All(x => x.Id != predefined.Id)) - { - dbContext.CurrencyGlobals.Add(predefined); - } - } - - await dbContext.SaveChangesAsync(cancellationToken); - } - - private static async Task UpdateCurrentRatesAsync(AppDbContext dbContext, CancellationToken cancellationToken) - { - var lastRates = await dbContext.CurrencyRates - .Include(x => x.Currency) - .GroupBy(x => new { x.CurrencyId }, - (key, g) => g.Where(x => x.DateTime <= DateTime.UtcNow).OrderByDescending(x => x.DateTime).First()) - .ToListAsync(cancellationToken); - - var currencies = await dbContext.Currencies.ToListAsync(cancellationToken); - foreach (var currency in currencies) - { - var rate = lastRates.FirstOrDefault(x => x.CurrencyId == currency.Id); - if (rate != null) - { - currency.CurrentRateId = rate.Id; - dbContext.Attach(currency).State = EntityState.Modified; - } - } - - await dbContext.SaveChangesAsync(cancellationToken); - } -} diff --git a/MyOffice.DbContext/DbContextServiceCollectionExtensions.cs b/MyOffice.DbContext/DbContextServiceCollectionExtensions.cs deleted file mode 100644 index 42e111c..0000000 --- a/MyOffice.DbContext/DbContextServiceCollectionExtensions.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace MyOffice.DbContext; - -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; - -public static class DbContextServiceCollectionExtensions -{ - public static IServiceCollection AddAppDbContext( - this IServiceCollection services, - ConnectionConfiguration connection - ) - { - services.AddSingleton(connection); - - services.AddDbContext((_, options) => - { - ConfigureDbContextOptions(options, connection); - }); - - return services; - } - - public static void ConfigureDbContextOptions( - DbContextOptionsBuilder options, - ConnectionConfiguration connection - ) - { - if (!Enum.TryParse(connection.Provider, ignoreCase: true, out var provider)) - throw new InvalidOperationException($"No such provider: [{connection.Provider}]"); - - switch (provider) - { - case AppDbContextProvidersEnum.npgsql: - options.UseNpgsql(connection.ConnectionString, x => - x.MigrationsAssembly("MyOffice.Migrations.Postgres")); - break; - case AppDbContextProvidersEnum.sqlite: - options.UseSqlite(connection.ConnectionString, x => - x.MigrationsAssembly("MyOffice.Migrations.Sqlite")); - break; - default: - throw new NotSupportedException($"No such provider: [{connection.Provider}]"); - } - -#if DEBUG - options.EnableSensitiveDataLogging(); - options.EnableDetailedErrors(); -#endif - } -} diff --git a/MyOffice.DbContext/DemoDataSeeder.cs b/MyOffice.DbContext/DemoDataSeeder.cs deleted file mode 100644 index bfc9b06..0000000 --- a/MyOffice.DbContext/DemoDataSeeder.cs +++ /dev/null @@ -1,292 +0,0 @@ -namespace MyOffice.DbContext; - -using Data.Models.Accounts; -using Data.Models.Currencies; -using Data.Models.Items; -using Data.Models.Users; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; - -/// -/// Fills an empty database with three demo users (UAH/USD/EUR) and sample catalog data. -/// -public static class DemoDataSeeder -{ - private static readonly PasswordHasher PasswordHasher = new(); - - private static readonly string[] CurrencyCodes = ["UAH", "USD", "EUR"]; - - private static readonly (string Code, string Email, string Password, string FirstName)[] Users = - [ - ("UAH", "user_UAH@user_UAH.userUAH", "user_UAH", "User UAH"), - ("USD", "user_USD@user_USD.userUSD", "user_USD", "User USD"), - ("EUR", "user_EUR@user_EUR.userEUR", "user_EUR", "User EUR"), - ]; - - /// 1 USD = 42 UAH, 1 EUR = 50 UAH. - private const decimal UsdInUah = 42m; - private const decimal EurInUah = 50m; - - public static async Task SeedIfEmptyAsync(AppDbContext db, CancellationToken cancellationToken = default) - { - if (await db.Users.AnyAsync(cancellationToken)) - { - return; - } - - // AppDbContext defaults to NoTracking; seeding needs identity values and graph inserts. - var previousTracking = db.ChangeTracker.QueryTrackingBehavior; - var previousDetect = db.ChangeTracker.AutoDetectChangesEnabled; - db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll; - db.ChangeTracker.AutoDetectChangesEnabled = true; - - try - { - var yearStart = new DateTime(DateTime.UtcNow.Year, 1, 1, 0, 0, 0, DateTimeKind.Utc); - var rng = new Random(2026); - - foreach (var (code, email, password, firstName) in Users) - { - await SeedUserAsync(db, code, email, password, firstName, yearStart, rng, cancellationToken); - } - - await db.SaveChangesAsync(cancellationToken); - } - finally - { - db.ChangeTracker.QueryTrackingBehavior = previousTracking; - db.ChangeTracker.AutoDetectChangesEnabled = previousDetect; - db.ChangeTracker.Clear(); - } - } - - private static async Task SeedUserAsync( - AppDbContext db, - string homeCurrency, - string email, - string password, - string firstName, - DateTime rateDate, - Random rng, - CancellationToken cancellationToken) - { - var ua = homeCurrency == "UAH"; - var userId = Guid.NewGuid(); - - var user = new User - { - Id = userId, - UserName = email, - Email = email, - PasswordHash = PasswordHasher.HashPassword(new object(), password), - FirstName = firstName, - FullName = firstName, - IsEmailConfirmed = true, - CurrencyId = homeCurrency, - }; - db.Users.Add(user); - - var currencies = new Dictionary(StringComparer.Ordinal); - foreach (var code in CurrencyCodes) - { - var currency = new Currency - { - Id = Guid.NewGuid(), - UserId = userId, - CurrencyGlobalId = code, - Name = CurrencyDisplayName(code, ua), - ShortName = code, - IsPrimary = code == homeCurrency, - }; - db.Currencies.Add(currency); - db.CurrencyRates.Add(new CurrencyRate - { - CurrencyId = currency.Id, - DateTime = rateDate, - Quantity = 1, - Rate = RateInHome(code, homeCurrency), - }); - currencies[code] = currency; - } - - // UnCategorized convention: category Id == user Id - db.ItemCategories.Add(new ItemCategory - { - Id = userId, - UserId = userId, - Name = ua ? "Без категорії" : "UnCategorized", - Items = [], - IsInternal = true, - }); - - var accountCategoryDefs = ua - ? new (string Key, string Name)[] { ("CASH", "Готівка"), ("BANK", "Банк"), ("DEPOSIT", "Депозит") } - : [("CASH", "CASH"), ("BANK", "BANK"), ("DEPOSIT", "DEPOSIT")]; - - var accounts = new List(); - foreach (var (key, name) in accountCategoryDefs) - { - var category = new AccountCategory - { - Id = Guid.NewGuid(), - UserId = userId, - Name = name, - }; - db.AccountCategories.Add(category); - - foreach (var code in CurrencyCodes) - { - var account = new Account - { - Id = Guid.NewGuid(), - OwnerId = userId, - CurrencyGlobalId = code, - Name = $"{name} {code}", - }; - db.Accounts.Add(account); - db.AccountAccountCategories.Add(new AccountAccountCategory - { - AccountId = account.Id, - CategoryId = category.Id, - }); - db.AccountAccesses.Add(new AccountAccess - { - AccountId = account.Id, - UserId = userId, - OwnerId = userId, - IsAllowRead = true, - IsAllowWrite = true, - IsAllowManage = true, - Type = AccountAccessTypeEnum.balance, - }); - accounts.Add(account); - } - } - - var incomeCategory = new ItemCategory - { - Id = Guid.NewGuid(), - UserId = userId, - Name = ua ? "Доходи" : "INCOME", - Items = [], - }; - var outcomeCategory = new ItemCategory - { - Id = Guid.NewGuid(), - UserId = userId, - Name = ua ? "Витрати" : "OUTCOME", - Items = [], - }; - db.ItemCategories.AddRange(incomeCategory, outcomeCategory); - - var incomeNames = ua - ? new[] { "Готівка", "Офіс" } - : ["CASH", "OFFICE"]; - var outcomeNames = ua - ? new[] - { - "Товари", "Бензин", "Steam", "Продукти", "Кафе", - "Оренда", "Комунальні", "Інтернет", "Зв'язок", "Розваги", - } - : [ - "Goods", "Petrol", "Steam", "Groceries", "Cafe", - "Rent", "Utilities", "Internet", "Mobile", "Entertainment", - ]; - - var incomeItems = await AddItemsAsync(db, incomeCategory.Id, incomeNames, cancellationToken); - var outcomeItems = await AddItemsAsync(db, outcomeCategory.Id, outcomeNames, cancellationToken); - - await db.SaveChangesAsync(cancellationToken); - - SeedMotions(db, accounts, incomeItems, outcomeItems, rng, count: 100); - } - - private static async Task> AddItemsAsync( - AppDbContext db, - Guid categoryId, - IEnumerable names, - CancellationToken cancellationToken) - { - var items = new List(); - foreach (var name in names) - { - var global = db.ItemGlobals.Local.FirstOrDefault(x => x.Name == name) - ?? await db.ItemGlobals.FirstOrDefaultAsync(x => x.Name == name, cancellationToken); - if (global == null) - { - global = new ItemGlobal { Id = Guid.NewGuid(), Name = name }; - db.ItemGlobals.Add(global); - } - - var item = new Item - { - CategoryId = categoryId, - ItemGlobalId = global.Id, - }; - db.Items.Add(item); - items.Add(item); - } - - return items; - } - - private static void SeedMotions( - AppDbContext db, - List accounts, - List incomeItems, - List outcomeItems, - Random rng, - int count) - { - var now = DateTime.UtcNow; - var from = now.AddMonths(-3); - - for (var i = 0; i < count; i++) - { - var isIncome = rng.Next(2) == 0; - var item = isIncome - ? incomeItems[rng.Next(incomeItems.Count)] - : outcomeItems[rng.Next(outcomeItems.Count)]; - var account = accounts[rng.Next(accounts.Count)]; - var days = (now - from).TotalDays; - var when = from.AddDays(rng.NextDouble() * days); - var amount = Math.Round((decimal)(rng.NextDouble() * (isIncome ? 4500 : 700) + (isIncome ? 200 : 20)), 2); - - db.Motions.Add(new Motion - { - Id = Guid.NewGuid(), - AccountId = account.Id, - ItemId = item.Id, - DateTime = when, - CreatedOn = when, - Description = isIncome ? "Demo income" : "Demo expense", - AmountPlus = isIncome ? amount : 0, - AmountMinus = isIncome ? 0 : amount, - }); - } - } - - private static decimal RateInHome(string currencyCode, string homeCurrency) - { - static decimal InUah(string code) => code switch - { - "UAH" => 1m, - "USD" => UsdInUah, - "EUR" => EurInUah, - _ => 1m, - }; - - return InUah(currencyCode) / InUah(homeCurrency); - } - - private static string CurrencyDisplayName(string code, bool ua) => (code, ua) switch - { - ("UAH", true) => "Гривня", - ("USD", true) => "Долар США", - ("EUR", true) => "Євро", - ("UAH", _) => "Ukrainian hryvnia", - ("USD", _) => "US Dollar", - ("EUR", _) => "Euro", - _ => code, - }; -} diff --git a/MyOffice.DbContext/MyOffice.DbContext.csproj b/MyOffice.DbContext/MyOffice.DbContext.csproj deleted file mode 100644 index b7225cb..0000000 --- a/MyOffice.DbContext/MyOffice.DbContext.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - diff --git a/MyOffice.DbContext/RepositoryInitializer.cs b/MyOffice.DbContext/RepositoryInitializer.cs deleted file mode 100644 index 868d5a9..0000000 --- a/MyOffice.DbContext/RepositoryInitializer.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace MyOffice.DbContext; - -using Microsoft.Extensions.DependencyInjection; - -public record ConnectionConfiguration(string Provider, string ConnectionString); - -public static class RepositoryInitializer -{ - /// - /// Registers DbContext DI. Migrate/seed runs via DatabaseInitializerHostedService. - /// remains for design-time . - /// - public static void Initialize( - IServiceCollection services, - ConnectionConfiguration connectionString - ) - { - ConnectionString = connectionString; - services.AddAppDbContext(connectionString); - } - - public static ConnectionConfiguration ConnectionString { get; internal set; } = null!; -} diff --git a/MyOffice.Migration.Postgres/AppDbContextFactoryPostgres.cs b/MyOffice.Migration.Postgres/AppDbContextFactoryPostgres.cs deleted file mode 100644 index 93d1748..0000000 --- a/MyOffice.Migration.Postgres/AppDbContextFactoryPostgres.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace MyOffice.Migrations.Postgres; - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Design; -using Microsoft.Extensions.Configuration; -using MyOffice.DbContext; -using MyOffice.Shared; - -public class AppDbContextFactoryPostgres : IDesignTimeDbContextFactory -{ - public AppDbContext CreateDbContext(string[]? args) - { - var builder = new DbContextOptionsBuilder(); - - var sharedConfiguration = SharedConfiguration.Build(); - var connectionString = - args?.FirstOrDefault() - ?? sharedConfiguration.GetConnectionString("npgsql"); - - builder.UseNpgsql(connectionString, b => b.MigrationsAssembly("MyOffice.Migrations.Postgres")); - - var db = new AppDbContext(AppDbContextProvidersEnum.npgsql, builder.Options); - db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; - - return db; - } -} \ No newline at end of file diff --git a/MyOffice.Migration.Postgres/Migrations/20230621190024_Init.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230621190024_Init.Designer.cs deleted file mode 100644 index 2c41f26..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230621190024_Init.Designer.cs +++ /dev/null @@ -1,608 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230621190024_Init")] - partial class Init - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Motions.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Motions.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Motions.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Motions.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Motions.Item", b => - { - b.HasOne("MyOffice.Data.Models.Motions.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Motions.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Motions.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Motions.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Motions.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Motions.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230621190024_Init.cs b/MyOffice.Migration.Postgres/Migrations/20230621190024_Init.cs deleted file mode 100644 index 47a3398..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230621190024_Init.cs +++ /dev/null @@ -1,445 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class Init : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterDatabase() - .Annotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False"); - - migrationBuilder.CreateTable( - name: "CurrencyGlobals", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - Name = table.Column(type: "text", nullable: false), - Symbol = table.Column(type: "text", nullable: false), - DefaultQuantity = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CurrencyGlobals", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "ItemGlobals", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_ItemGlobals", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Accounts", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - CurrencyGlobalId = table.Column(type: "text", nullable: false), - Name = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Accounts", x => x.Id); - table.ForeignKey( - name: "FK_Accounts_CurrencyGlobals_CurrencyGlobalId", - column: x => x.CurrencyGlobalId, - principalTable: "CurrencyGlobals", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Users", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - UserName = table.Column(type: "text", nullable: false, collation: "my_ci_collation"), - Email = table.Column(type: "text", nullable: false, collation: "my_ci_collation"), - PasswordHash = table.Column(type: "text", nullable: false), - FirstName = table.Column(type: "text", nullable: true), - LastName = table.Column(type: "text", nullable: true), - FullName = table.Column(type: "text", nullable: true), - Phone = table.Column(type: "text", nullable: true), - IsEmailConfirmed = table.Column(type: "boolean", nullable: false), - CurrencyId = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Users", x => x.Id); - table.ForeignKey( - name: "FK_Users_CurrencyGlobals_CurrencyId", - column: x => x.CurrencyId, - principalTable: "CurrencyGlobals", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AccountAccesses", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - AccountId = table.Column(type: "uuid", nullable: false), - UserId = table.Column(type: "uuid", nullable: false), - IsAllowRead = table.Column(type: "boolean", nullable: false), - IsAllowWrite = table.Column(type: "boolean", nullable: false), - IsAllowManage = table.Column(type: "boolean", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AccountAccesses", x => x.Id); - table.ForeignKey( - name: "FK_AccountAccesses_Accounts_AccountId", - column: x => x.AccountId, - principalTable: "Accounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AccountAccesses_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AccountCategories", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - UserId = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AccountCategories", x => x.Id); - table.ForeignKey( - name: "FK_AccountCategories_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Currencies", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - CurrencyGlobalId = table.Column(type: "text", nullable: false), - UserId = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "text", nullable: false), - ShortName = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Currencies", x => x.Id); - table.ForeignKey( - name: "FK_Currencies_CurrencyGlobals_CurrencyGlobalId", - column: x => x.CurrencyGlobalId, - principalTable: "CurrencyGlobals", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Currencies_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "ItemCategories", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - UserId = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_ItemCategories", x => x.Id); - table.ForeignKey( - name: "FK_ItemCategories_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserClaims", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - CreatedOn = table.Column(type: "timestamp with time zone", nullable: false), - UserId = table.Column(type: "uuid", nullable: false), - ExternalId = table.Column(type: "text", nullable: false), - Email = table.Column(type: "text", nullable: false, collation: "my_ci_collation"), - Provider = table.Column(type: "text", nullable: false, collation: "my_ci_collation") - }, - constraints: table => - { - table.PrimaryKey("PK_UserClaims", x => x.Id); - table.ForeignKey( - name: "FK_UserClaims_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AccountAccountCategories", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - AccountId = table.Column(type: "uuid", nullable: false), - CategoryId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AccountAccountCategories", x => x.Id); - table.ForeignKey( - name: "FK_AccountAccountCategories_AccountCategories_CategoryId", - column: x => x.CategoryId, - principalTable: "AccountCategories", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AccountAccountCategories_Accounts_AccountId", - column: x => x.AccountId, - principalTable: "Accounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "CurrencyRates", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - CurrencyId = table.Column(type: "uuid", nullable: false), - DateTime = table.Column(type: "timestamp with time zone", nullable: false), - Quantity = table.Column(type: "integer", nullable: false), - Rate = table.Column(type: "numeric", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CurrencyRates", x => x.Id); - table.ForeignKey( - name: "FK_CurrencyRates_Currencies_CurrencyId", - column: x => x.CurrencyId, - principalTable: "Currencies", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Items", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - CategoryId = table.Column(type: "uuid", nullable: false), - ItemGlobalId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Items", x => x.Id); - table.ForeignKey( - name: "FK_Items_ItemCategories_CategoryId", - column: x => x.CategoryId, - principalTable: "ItemCategories", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Items_ItemGlobals_ItemGlobalId", - column: x => x.ItemGlobalId, - principalTable: "ItemGlobals", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Motions", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - CreatedOn = table.Column(type: "timestamp with time zone", nullable: false), - DateTime = table.Column(type: "timestamp with time zone", nullable: false), - AccountId = table.Column(type: "uuid", nullable: false), - ItemId = table.Column(type: "integer", nullable: false), - Description = table.Column(type: "text", nullable: true), - AmountPlus = table.Column(type: "numeric(18,6)", precision: 18, scale: 6, nullable: false), - AmountMinus = table.Column(type: "numeric(18,6)", precision: 18, scale: 6, nullable: false), - UserId = table.Column(type: "uuid", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Motions", x => x.Id); - table.ForeignKey( - name: "FK_Motions_Accounts_AccountId", - column: x => x.AccountId, - principalTable: "Accounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Motions_Items_ItemId", - column: x => x.ItemId, - principalTable: "Items", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Motions_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccesses_AccountId", - table: "AccountAccesses", - column: "AccountId"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccesses_UserId", - table: "AccountAccesses", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccountCategories_AccountId", - table: "AccountAccountCategories", - column: "AccountId"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccountCategories_CategoryId", - table: "AccountAccountCategories", - column: "CategoryId"); - - migrationBuilder.CreateIndex( - name: "IX_AccountCategories_UserId", - table: "AccountCategories", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Accounts_CurrencyGlobalId", - table: "Accounts", - column: "CurrencyGlobalId"); - - migrationBuilder.CreateIndex( - name: "IX_Currencies_CurrencyGlobalId", - table: "Currencies", - column: "CurrencyGlobalId"); - - migrationBuilder.CreateIndex( - name: "IX_Currencies_UserId", - table: "Currencies", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_CurrencyRates_CurrencyId", - table: "CurrencyRates", - column: "CurrencyId"); - - migrationBuilder.CreateIndex( - name: "IX_ItemCategories_UserId", - table: "ItemCategories", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Items_CategoryId", - table: "Items", - column: "CategoryId"); - - migrationBuilder.CreateIndex( - name: "IX_Items_ItemGlobalId", - table: "Items", - column: "ItemGlobalId"); - - migrationBuilder.CreateIndex( - name: "IX_Motions_AccountId", - table: "Motions", - column: "AccountId"); - - migrationBuilder.CreateIndex( - name: "IX_Motions_ItemId", - table: "Motions", - column: "ItemId"); - - migrationBuilder.CreateIndex( - name: "IX_Motions_UserId", - table: "Motions", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_UserClaims_UserId", - table: "UserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Users_CurrencyId", - table: "Users", - column: "CurrencyId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AccountAccesses"); - - migrationBuilder.DropTable( - name: "AccountAccountCategories"); - - migrationBuilder.DropTable( - name: "CurrencyRates"); - - migrationBuilder.DropTable( - name: "Motions"); - - migrationBuilder.DropTable( - name: "UserClaims"); - - migrationBuilder.DropTable( - name: "AccountCategories"); - - migrationBuilder.DropTable( - name: "Currencies"); - - migrationBuilder.DropTable( - name: "Accounts"); - - migrationBuilder.DropTable( - name: "Items"); - - migrationBuilder.DropTable( - name: "ItemCategories"); - - migrationBuilder.DropTable( - name: "ItemGlobals"); - - migrationBuilder.DropTable( - name: "Users"); - - migrationBuilder.DropTable( - name: "CurrencyGlobals"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230627044606_IsInternal.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230627044606_IsInternal.Designer.cs deleted file mode 100644 index 529060a..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230627044606_IsInternal.Designer.cs +++ /dev/null @@ -1,611 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230627044606_IsInternal")] - partial class IsInternal - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230627044606_IsInternal.cs b/MyOffice.Migration.Postgres/Migrations/20230627044606_IsInternal.cs deleted file mode 100644 index 65fe3c4..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230627044606_IsInternal.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class IsInternal : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "IsInternal", - table: "ItemCategories", - type: "boolean", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "IsInternal", - table: "ItemCategories"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230720190103_PrimaryCurrencyDeletedMotion.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230720190103_PrimaryCurrencyDeletedMotion.Designer.cs deleted file mode 100644 index 5a7e7a5..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230720190103_PrimaryCurrencyDeletedMotion.Designer.cs +++ /dev/null @@ -1,617 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230720190103_PrimaryCurrencyDeletedMotion")] - partial class PrimaryCurrencyDeletedMotion - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230720190103_PrimaryCurrencyDeletedMotion.cs b/MyOffice.Migration.Postgres/Migrations/20230720190103_PrimaryCurrencyDeletedMotion.cs deleted file mode 100644 index 8dbcb2d..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230720190103_PrimaryCurrencyDeletedMotion.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class PrimaryCurrencyDeletedMotion : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "DeletedOn", - table: "Motions", - type: "timestamp with time zone", - nullable: true); - - migrationBuilder.AddColumn( - name: "IsPrimary", - table: "Currencies", - type: "boolean", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "DeletedOn", - table: "Motions"); - - migrationBuilder.DropColumn( - name: "IsPrimary", - table: "Currencies"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230721175243_CurrentRate.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230721175243_CurrentRate.Designer.cs deleted file mode 100644 index 70a3adf..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230721175243_CurrentRate.Designer.cs +++ /dev/null @@ -1,631 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230721175243_CurrentRate")] - partial class CurrentRate - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("CurrentRateId1") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId1"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany() - .HasForeignKey("CurrentRateId1"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230721175243_CurrentRate.cs b/MyOffice.Migration.Postgres/Migrations/20230721175243_CurrentRate.cs deleted file mode 100644 index c7aef90..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230721175243_CurrentRate.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class CurrentRate : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "CurrentRateId", - table: "Currencies", - type: "integer", - nullable: true); - - migrationBuilder.AddColumn( - name: "CurrentRateId1", - table: "Currencies", - type: "integer", - nullable: true); - - migrationBuilder.CreateIndex( - name: "IX_Currencies_CurrentRateId1", - table: "Currencies", - column: "CurrentRateId1"); - - migrationBuilder.AddForeignKey( - name: "FK_Currencies_CurrencyRates_CurrentRateId1", - table: "Currencies", - column: "CurrentRateId1", - principalTable: "CurrencyRates", - principalColumn: "Id"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Currencies_CurrencyRates_CurrentRateId1", - table: "Currencies"); - - migrationBuilder.DropIndex( - name: "IX_Currencies_CurrentRateId1", - table: "Currencies"); - - migrationBuilder.DropColumn( - name: "CurrentRateId", - table: "Currencies"); - - migrationBuilder.DropColumn( - name: "CurrentRateId1", - table: "Currencies"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230721180304_CurrentRateRemove.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230721180304_CurrentRateRemove.Designer.cs deleted file mode 100644 index 71d3381..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230721180304_CurrentRateRemove.Designer.cs +++ /dev/null @@ -1,617 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230721180304_CurrentRateRemove")] - partial class CurrentRateRemove - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230721180304_CurrentRateRemove.cs b/MyOffice.Migration.Postgres/Migrations/20230721180304_CurrentRateRemove.cs deleted file mode 100644 index 30b99ec..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230721180304_CurrentRateRemove.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class CurrentRateRemove : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Currencies_CurrencyRates_CurrentRateId1", - table: "Currencies"); - - migrationBuilder.DropIndex( - name: "IX_Currencies_CurrentRateId1", - table: "Currencies"); - - migrationBuilder.DropColumn( - name: "CurrentRateId", - table: "Currencies"); - - migrationBuilder.DropColumn( - name: "CurrentRateId1", - table: "Currencies"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "CurrentRateId", - table: "Currencies", - type: "integer", - nullable: true); - - migrationBuilder.AddColumn( - name: "CurrentRateId1", - table: "Currencies", - type: "integer", - nullable: true); - - migrationBuilder.CreateIndex( - name: "IX_Currencies_CurrentRateId1", - table: "Currencies", - column: "CurrentRateId1"); - - migrationBuilder.AddForeignKey( - name: "FK_Currencies_CurrencyRates_CurrentRateId1", - table: "Currencies", - column: "CurrentRateId1", - principalTable: "CurrencyRates", - principalColumn: "Id"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230721180851_CurrentRateV2.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230721180851_CurrentRateV2.Designer.cs deleted file mode 100644 index aa4d8f7..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230721180851_CurrentRateV2.Designer.cs +++ /dev/null @@ -1,633 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230721180851_CurrentRateV2")] - partial class CurrentRateV2 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230721180851_CurrentRateV2.cs b/MyOffice.Migration.Postgres/Migrations/20230721180851_CurrentRateV2.cs deleted file mode 100644 index e7bb75c..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230721180851_CurrentRateV2.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class CurrentRateV2 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "CurrentRateId", - table: "Currencies", - type: "integer", - nullable: true); - - migrationBuilder.CreateIndex( - name: "IX_Currencies_CurrentRateId", - table: "Currencies", - column: "CurrentRateId"); - - migrationBuilder.AddForeignKey( - name: "FK_Currencies_CurrencyRates_CurrentRateId", - table: "Currencies", - column: "CurrentRateId", - principalTable: "CurrencyRates", - principalColumn: "Id"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Currencies_CurrencyRates_CurrentRateId", - table: "Currencies"); - - migrationBuilder.DropIndex( - name: "IX_Currencies_CurrentRateId", - table: "Currencies"); - - migrationBuilder.DropColumn( - name: "CurrentRateId", - table: "Currencies"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230721200424_AccountType.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230721200424_AccountType.Designer.cs deleted file mode 100644 index af69953..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230721200424_AccountType.Designer.cs +++ /dev/null @@ -1,636 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230721200424_AccountType")] - partial class AccountType - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230721200424_AccountType.cs b/MyOffice.Migration.Postgres/Migrations/20230721200424_AccountType.cs deleted file mode 100644 index c29a649..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230721200424_AccountType.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class AccountType : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "Type", - table: "Accounts", - type: "integer", - nullable: false, - defaultValue: 0); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "Type", - table: "Accounts"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230722051335_AccountType2.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230722051335_AccountType2.Designer.cs deleted file mode 100644 index 2c92520..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230722051335_AccountType2.Designer.cs +++ /dev/null @@ -1,637 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230722051335_AccountType2")] - partial class AccountType2 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230722051335_AccountType2.cs b/MyOffice.Migration.Postgres/Migrations/20230722051335_AccountType2.cs deleted file mode 100644 index 09ff120..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230722051335_AccountType2.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class AccountType2 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "Type", - table: "AccountAccesses", - type: "text", - nullable: false, - defaultValue: ""); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "Type", - table: "AccountAccesses"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230722052053_AccountOwner.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230722052053_AccountOwner.Designer.cs deleted file mode 100644 index d81cbe5..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230722052053_AccountOwner.Designer.cs +++ /dev/null @@ -1,650 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230722052053_AccountOwner")] - partial class AccountOwner - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230722052053_AccountOwner.cs b/MyOffice.Migration.Postgres/Migrations/20230722052053_AccountOwner.cs deleted file mode 100644 index 277a90e..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230722052053_AccountOwner.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class AccountOwner : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "OwnerId", - table: "Accounts", - type: "uuid", - nullable: true); - - migrationBuilder.CreateIndex( - name: "IX_Accounts_OwnerId", - table: "Accounts", - column: "OwnerId"); - - migrationBuilder.AddForeignKey( - name: "FK_Accounts_Users_OwnerId", - table: "Accounts", - column: "OwnerId", - principalTable: "Users", - principalColumn: "Id"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Accounts_Users_OwnerId", - table: "Accounts"); - - migrationBuilder.DropIndex( - name: "IX_Accounts_OwnerId", - table: "Accounts"); - - migrationBuilder.DropColumn( - name: "OwnerId", - table: "Accounts"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230725054028_Collation.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230725054028_Collation.Designer.cs deleted file mode 100644 index b92d8a3..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230725054028_Collation.Designer.cs +++ /dev/null @@ -1,652 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230725054028_Collation")] - partial class Collation - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230725054028_Collation.cs b/MyOffice.Migration.Postgres/Migrations/20230725054028_Collation.cs deleted file mode 100644 index 7b07646..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230725054028_Collation.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class Collation : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Name", - table: "ItemGlobals", - type: "text", - nullable: false, - collation: "my_ci_collation", - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "Name", - table: "Accounts", - type: "text", - nullable: false, - collation: "my_ci_collation", - oldClrType: typeof(string), - oldType: "text"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Name", - table: "ItemGlobals", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "text", - oldCollation: "my_ci_collation"); - - migrationBuilder.AlterColumn( - name: "Name", - table: "Accounts", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "text", - oldCollation: "my_ci_collation"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230725061203_CollationR.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230725061203_CollationR.Designer.cs deleted file mode 100644 index 5bbd3dd..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230725061203_CollationR.Designer.cs +++ /dev/null @@ -1,651 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230725061203_CollationR")] - partial class CollationR - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230725061203_CollationR.cs b/MyOffice.Migration.Postgres/Migrations/20230725061203_CollationR.cs deleted file mode 100644 index ce688f3..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230725061203_CollationR.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class CollationR : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Name", - table: "Accounts", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "text", - oldCollation: "my_ci_collation"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Name", - table: "Accounts", - type: "text", - nullable: false, - collation: "my_ci_collation", - oldClrType: typeof(string), - oldType: "text"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230725061910_CollationR2.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230725061910_CollationR2.Designer.cs deleted file mode 100644 index f45afe7..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230725061910_CollationR2.Designer.cs +++ /dev/null @@ -1,650 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230725061910_CollationR2")] - partial class CollationR2 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230725061910_CollationR2.cs b/MyOffice.Migration.Postgres/Migrations/20230725061910_CollationR2.cs deleted file mode 100644 index d544478..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230725061910_CollationR2.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class CollationR2 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Name", - table: "ItemGlobals", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "text", - oldCollation: "my_ci_collation"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Name", - table: "ItemGlobals", - type: "text", - nullable: false, - collation: "my_ci_collation", - oldClrType: typeof(string), - oldType: "text"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230726160638_AccessOwner.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230726160638_AccessOwner.Designer.cs deleted file mode 100644 index 4e0b046..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230726160638_AccessOwner.Designer.cs +++ /dev/null @@ -1,663 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230726160638_AccessOwner")] - partial class AccessOwner - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230726160638_AccessOwner.cs b/MyOffice.Migration.Postgres/Migrations/20230726160638_AccessOwner.cs deleted file mode 100644 index 5b12a91..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230726160638_AccessOwner.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class AccessOwner : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "OwnerId", - table: "AccountAccesses", - type: "uuid", - nullable: true); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccesses_OwnerId", - table: "AccountAccesses", - column: "OwnerId"); - - migrationBuilder.AddForeignKey( - name: "FK_AccountAccesses_Users_OwnerId", - table: "AccountAccesses", - column: "OwnerId", - principalTable: "Users", - principalColumn: "Id"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_AccountAccesses_Users_OwnerId", - table: "AccountAccesses"); - - migrationBuilder.DropIndex( - name: "IX_AccountAccesses_OwnerId", - table: "AccountAccesses"); - - migrationBuilder.DropColumn( - name: "OwnerId", - table: "AccountAccesses"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230726161226_AccessOwner2.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230726161226_AccessOwner2.Designer.cs deleted file mode 100644 index 0615901..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230726161226_AccessOwner2.Designer.cs +++ /dev/null @@ -1,665 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230726161226_AccessOwner2")] - partial class AccessOwner2 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230726161226_AccessOwner2.cs b/MyOffice.Migration.Postgres/Migrations/20230726161226_AccessOwner2.cs deleted file mode 100644 index 457656b..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230726161226_AccessOwner2.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class AccessOwner2 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_AccountAccesses_Users_OwnerId", - table: "AccountAccesses"); - - migrationBuilder.AlterColumn( - name: "OwnerId", - table: "AccountAccesses", - type: "uuid", - nullable: false, - defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), - oldClrType: typeof(Guid), - oldType: "uuid", - oldNullable: true); - - migrationBuilder.AddForeignKey( - name: "FK_AccountAccesses_Users_OwnerId", - table: "AccountAccesses", - column: "OwnerId", - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_AccountAccesses_Users_OwnerId", - table: "AccountAccesses"); - - migrationBuilder.AlterColumn( - name: "OwnerId", - table: "AccountAccesses", - type: "uuid", - nullable: true, - oldClrType: typeof(Guid), - oldType: "uuid"); - - migrationBuilder.AddForeignKey( - name: "FK_AccountAccesses_Users_OwnerId", - table: "AccountAccesses", - column: "OwnerId", - principalTable: "Users", - principalColumn: "Id"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230728172249_AccountAccessInvites.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230728172249_AccountAccessInvites.Designer.cs deleted file mode 100644 index a5d9362..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230728172249_AccountAccessInvites.Designer.cs +++ /dev/null @@ -1,695 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230728172249_AccountAccessInvites")] - partial class AccountAccessInvites - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AcceptedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("RejectedOn") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230728172249_AccountAccessInvites.cs b/MyOffice.Migration.Postgres/Migrations/20230728172249_AccountAccessInvites.cs deleted file mode 100644 index 46bed99..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230728172249_AccountAccessInvites.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class AccountAccessInvites : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "Name", - table: "AccountAccesses", - type: "text", - nullable: true); - - migrationBuilder.CreateTable( - name: "AccountAccessInvites", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - CreatedOn = table.Column(type: "timestamp with time zone", nullable: false), - AcceptedOn = table.Column(type: "timestamp with time zone", nullable: true), - RejectedOn = table.Column(type: "timestamp with time zone", nullable: true), - Email = table.Column(type: "text", nullable: false), - IsAllowWrite = table.Column(type: "boolean", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AccountAccessInvites", x => x.Id); - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AccountAccessInvites"); - - migrationBuilder.DropColumn( - name: "Name", - table: "AccountAccesses"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230728181916_AccountAccessInvites2.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230728181916_AccountAccessInvites2.Designer.cs deleted file mode 100644 index 247cc3b..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230728181916_AccountAccessInvites2.Designer.cs +++ /dev/null @@ -1,713 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230728181916_AccountAccessInvites2")] - partial class AccountAccessInvites2 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AcceptedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("RejectedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230728181916_AccountAccessInvites2.cs b/MyOffice.Migration.Postgres/Migrations/20230728181916_AccountAccessInvites2.cs deleted file mode 100644 index 30b2752..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230728181916_AccountAccessInvites2.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class AccountAccessInvites2 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "UserId", - table: "AccountAccessInvites", - type: "uuid", - nullable: false, - defaultValue: new Guid("00000000-0000-0000-0000-000000000000")); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccessInvites_UserId", - table: "AccountAccessInvites", - column: "UserId"); - - migrationBuilder.AddForeignKey( - name: "FK_AccountAccessInvites_Users_UserId", - table: "AccountAccessInvites", - column: "UserId", - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_AccountAccessInvites_Users_UserId", - table: "AccountAccessInvites"); - - migrationBuilder.DropIndex( - name: "IX_AccountAccessInvites_UserId", - table: "AccountAccessInvites"); - - migrationBuilder.DropColumn( - name: "UserId", - table: "AccountAccessInvites"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230728192017_AccountAccessInvites3.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230728192017_AccountAccessInvites3.Designer.cs deleted file mode 100644 index 4574f4d..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230728192017_AccountAccessInvites3.Designer.cs +++ /dev/null @@ -1,728 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230728192017_AccountAccessInvites3")] - partial class AccountAccessInvites3 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AcceptedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("RejectedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Invites") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Invites"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230728192017_AccountAccessInvites3.cs b/MyOffice.Migration.Postgres/Migrations/20230728192017_AccountAccessInvites3.cs deleted file mode 100644 index 7f22a0c..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230728192017_AccountAccessInvites3.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class AccountAccessInvites3 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "AccountId", - table: "AccountAccessInvites", - type: "uuid", - nullable: false, - defaultValue: new Guid("00000000-0000-0000-0000-000000000000")); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccessInvites_AccountId", - table: "AccountAccessInvites", - column: "AccountId"); - - migrationBuilder.AddForeignKey( - name: "FK_AccountAccessInvites_Accounts_AccountId", - table: "AccountAccessInvites", - column: "AccountId", - principalTable: "Accounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_AccountAccessInvites_Accounts_AccountId", - table: "AccountAccessInvites"); - - migrationBuilder.DropIndex( - name: "IX_AccountAccessInvites_AccountId", - table: "AccountAccessInvites"); - - migrationBuilder.DropColumn( - name: "AccountId", - table: "AccountAccessInvites"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230804145453_AccountAccesUnique.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20230804145453_AccountAccesUnique.Designer.cs deleted file mode 100644 index 2015f55..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230804145453_AccountAccesUnique.Designer.cs +++ /dev/null @@ -1,729 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20230804145453_AccountAccesUnique")] - partial class AccountAccesUnique - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.HasIndex("AccountId", "UserId") - .IsUnique(); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AcceptedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("RejectedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("CategoryId"); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Invites") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Invites"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20230804145453_AccountAccesUnique.cs b/MyOffice.Migration.Postgres/Migrations/20230804145453_AccountAccesUnique.cs deleted file mode 100644 index 7b3f55d..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20230804145453_AccountAccesUnique.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class AccountAccesUnique : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "IX_AccountAccesses_AccountId", - table: "AccountAccesses"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccesses_AccountId_UserId", - table: "AccountAccesses", - columns: new[] { "AccountId", "UserId" }, - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "IX_AccountAccesses_AccountId_UserId", - table: "AccountAccesses"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccesses_AccountId", - table: "AccountAccesses", - column: "AccountId"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20231217163807_acc_cat_unique.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20231217163807_acc_cat_unique.Designer.cs deleted file mode 100644 index 445508f..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20231217163807_acc_cat_unique.Designer.cs +++ /dev/null @@ -1,730 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20231217163807_acc_cat_unique")] - partial class acccatunique - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.HasIndex("AccountId", "UserId") - .IsUnique(); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AcceptedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("RejectedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("AccountId", "CategoryId") - .IsUnique(); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Invites") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Invites"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20231217163807_acc_cat_unique.cs b/MyOffice.Migration.Postgres/Migrations/20231217163807_acc_cat_unique.cs deleted file mode 100644 index fe91a77..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20231217163807_acc_cat_unique.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class acccatunique : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "IX_AccountAccountCategories_AccountId", - table: "AccountAccountCategories"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccountCategories_AccountId_CategoryId", - table: "AccountAccountCategories", - columns: new[] { "AccountId", "CategoryId" }, - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "IX_AccountAccountCategories_AccountId_CategoryId", - table: "AccountAccountCategories"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccountCategories_AccountId", - table: "AccountAccountCategories", - column: "AccountId"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20231217185452_acc_access_unique.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20231217185452_acc_access_unique.Designer.cs deleted file mode 100644 index 86bbaf1..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20231217185452_acc_access_unique.Designer.cs +++ /dev/null @@ -1,733 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20231217185452_acc_access_unique")] - partial class accaccessunique - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.HasIndex("AccountId", "OwnerId") - .IsUnique(); - - b.HasIndex("AccountId", "UserId") - .IsUnique(); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AcceptedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("RejectedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("AccountId", "CategoryId") - .IsUnique(); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Invites") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Invites"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20231217185452_acc_access_unique.cs b/MyOffice.Migration.Postgres/Migrations/20231217185452_acc_access_unique.cs deleted file mode 100644 index ef3eb44..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20231217185452_acc_access_unique.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class accaccessunique : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateIndex( - name: "IX_AccountAccesses_AccountId_OwnerId", - table: "AccountAccesses", - columns: new[] { "AccountId", "OwnerId" }, - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "IX_AccountAccesses_AccountId_OwnerId", - table: "AccountAccesses"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20240107073407_VerificationCode.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20240107073407_VerificationCode.Designer.cs deleted file mode 100644 index 57a8887..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20240107073407_VerificationCode.Designer.cs +++ /dev/null @@ -1,790 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20240107073407_VerificationCode")] - partial class VerificationCode - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.HasIndex("AccountId", "OwnerId") - .IsUnique(); - - b.HasIndex("AccountId", "UserId") - .IsUnique(); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AcceptedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("RejectedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("AccountId", "CategoryId") - .IsUnique(); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Code") - .IsRequired() - .HasColumnType("text"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Destination") - .IsRequired() - .HasColumnType("text"); - - b.Property("DestinationType") - .IsRequired() - .HasColumnType("text"); - - b.Property("ExpiresOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Metadata") - .HasColumnType("text"); - - b.Property("Template") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("VerifiedOn") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("Verifications"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Invites") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Invites"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20240107073407_VerificationCode.cs b/MyOffice.Migration.Postgres/Migrations/20240107073407_VerificationCode.cs deleted file mode 100644 index 0dfbe47..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20240107073407_VerificationCode.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class VerificationCode : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Verifications", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - UserId = table.Column(type: "uuid", nullable: false), - Code = table.Column(type: "text", nullable: false), - DestinationType = table.Column(type: "text", nullable: false), - Destination = table.Column(type: "text", nullable: false), - CreatedOn = table.Column(type: "timestamp with time zone", nullable: false), - ExpiresOn = table.Column(type: "timestamp with time zone", nullable: false), - VerifiedOn = table.Column(type: "timestamp with time zone", nullable: true), - Template = table.Column(type: "text", nullable: false), - Metadata = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Verifications", x => x.Id); - table.ForeignKey( - name: "FK_Verifications_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_Verifications_UserId", - table: "Verifications", - column: "UserId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Verifications"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20240107075033_VerificationCode2.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20240107075033_VerificationCode2.Designer.cs deleted file mode 100644 index afd56e5..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20240107075033_VerificationCode2.Designer.cs +++ /dev/null @@ -1,790 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20240107075033_VerificationCode2")] - partial class VerificationCode2 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.HasIndex("AccountId", "OwnerId") - .IsUnique(); - - b.HasIndex("AccountId", "UserId") - .IsUnique(); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AcceptedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("RejectedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("AccountId", "CategoryId") - .IsUnique(); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Code") - .IsRequired() - .HasColumnType("text"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Destination") - .IsRequired() - .HasColumnType("text"); - - b.Property("DestinationType") - .IsRequired() - .HasColumnType("text"); - - b.Property("ExpiresOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Metadata") - .HasColumnType("text"); - - b.Property("Template") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("VerifiedOn") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("Verifications"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Invites") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Invites"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20240107075033_VerificationCode2.cs b/MyOffice.Migration.Postgres/Migrations/20240107075033_VerificationCode2.cs deleted file mode 100644 index 05f4374..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20240107075033_VerificationCode2.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class VerificationCode2 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20260717093113_OpenIddict.Designer.cs b/MyOffice.Migration.Postgres/Migrations/20260717093113_OpenIddict.Designer.cs deleted file mode 100644 index 91858ec..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20260717093113_OpenIddict.Designer.cs +++ /dev/null @@ -1,1067 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20260717093113_OpenIddict")] - partial class OpenIddict - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "10.0.10") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.HasIndex("AccountId", "OwnerId") - .IsUnique(); - - b.HasIndex("AccountId", "UserId") - .IsUnique(); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AcceptedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("RejectedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("AccountId", "CategoryId") - .IsUnique(); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Notifications.EmailTemplate", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("Sender") - .IsRequired() - .HasColumnType("text"); - - b.Property("SenderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("Subject") - .IsRequired() - .HasColumnType("text"); - - b.Property("Template") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("EmailTemplates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Code") - .IsRequired() - .HasColumnType("text"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Destination") - .IsRequired() - .HasColumnType("text"); - - b.Property("DestinationType") - .IsRequired() - .HasColumnType("text"); - - b.Property("ExpiresOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Metadata") - .HasColumnType("text"); - - b.Property("Template") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("VerifiedOn") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("Verifications"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("text"); - - b.Property("ApplicationType") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ClientId") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("ClientSecret") - .HasColumnType("text"); - - b.Property("ClientType") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ConsentType") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("DisplayName") - .HasColumnType("text"); - - b.Property("DisplayNames") - .HasColumnType("text"); - - b.Property("JsonWebKeySet") - .HasColumnType("text"); - - b.Property("Permissions") - .HasColumnType("text"); - - b.Property("PostLogoutRedirectUris") - .HasColumnType("text"); - - b.Property("Properties") - .HasColumnType("text"); - - b.Property("RedirectUris") - .HasColumnType("text"); - - b.Property("Requirements") - .HasColumnType("text"); - - b.Property("Settings") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("ClientId") - .IsUnique(); - - b.ToTable("OpenIddictApplications", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("text"); - - b.Property("ApplicationId") - .HasColumnType("text"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("CreationDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Properties") - .HasColumnType("text"); - - b.Property("Scopes") - .HasColumnType("text"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("character varying(400)"); - - b.Property("Type") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictAuthorizations", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreScope", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("text"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("Descriptions") - .HasColumnType("text"); - - b.Property("DisplayName") - .HasColumnType("text"); - - b.Property("DisplayNames") - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Properties") - .HasColumnType("text"); - - b.Property("Resources") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("OpenIddictScopes", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("text"); - - b.Property("ApplicationId") - .HasColumnType("text"); - - b.Property("AuthorizationId") - .HasColumnType("text"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("CreationDate") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Payload") - .HasColumnType("text"); - - b.Property("Properties") - .HasColumnType("text"); - - b.Property("RedemptionDate") - .HasColumnType("timestamp with time zone"); - - b.Property("ReferenceId") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("character varying(400)"); - - b.Property("Type") - .HasMaxLength(150) - .HasColumnType("character varying(150)"); - - b.HasKey("Id"); - - b.HasIndex("AuthorizationId"); - - b.HasIndex("ReferenceId") - .IsUnique(); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictTokens", (string)null); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Invites") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") - .WithMany("Authorizations") - .HasForeignKey("ApplicationId"); - - b.Navigation("Application"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => - { - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") - .WithMany("Tokens") - .HasForeignKey("ApplicationId"); - - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", "Authorization") - .WithMany("Tokens") - .HasForeignKey("AuthorizationId"); - - b.Navigation("Application"); - - b.Navigation("Authorization"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Invites"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => - { - b.Navigation("Authorizations"); - - b.Navigation("Tokens"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.Navigation("Tokens"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/20260717093113_OpenIddict.cs b/MyOffice.Migration.Postgres/Migrations/20260717093113_OpenIddict.cs deleted file mode 100644 index 684ef30..0000000 --- a/MyOffice.Migration.Postgres/Migrations/20260717093113_OpenIddict.cs +++ /dev/null @@ -1,186 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - /// - public partial class OpenIddict : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "EmailTemplates", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - CreatedOn = table.Column(type: "timestamp with time zone", nullable: false), - Description = table.Column(type: "text", nullable: false), - Subject = table.Column(type: "text", nullable: false), - Sender = table.Column(type: "text", nullable: false), - SenderName = table.Column(type: "text", nullable: false), - Template = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_EmailTemplates", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictApplications", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - ApplicationType = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - ClientId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), - ClientSecret = table.Column(type: "text", nullable: true), - ClientType = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - ConcurrencyToken = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - ConsentType = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - DisplayName = table.Column(type: "text", nullable: true), - DisplayNames = table.Column(type: "text", nullable: true), - JsonWebKeySet = table.Column(type: "text", nullable: true), - Permissions = table.Column(type: "text", nullable: true), - PostLogoutRedirectUris = table.Column(type: "text", nullable: true), - Properties = table.Column(type: "text", nullable: true), - RedirectUris = table.Column(type: "text", nullable: true), - Requirements = table.Column(type: "text", nullable: true), - Settings = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictApplications", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictScopes", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - ConcurrencyToken = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - Description = table.Column(type: "text", nullable: true), - Descriptions = table.Column(type: "text", nullable: true), - DisplayName = table.Column(type: "text", nullable: true), - DisplayNames = table.Column(type: "text", nullable: true), - Name = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), - Properties = table.Column(type: "text", nullable: true), - Resources = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictScopes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictAuthorizations", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - ApplicationId = table.Column(type: "text", nullable: true), - ConcurrencyToken = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - CreationDate = table.Column(type: "timestamp with time zone", nullable: true), - Properties = table.Column(type: "text", nullable: true), - Scopes = table.Column(type: "text", nullable: true), - Status = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - Subject = table.Column(type: "character varying(400)", maxLength: 400, nullable: true), - Type = table.Column(type: "character varying(50)", maxLength: 50, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictAuthorizations", x => x.Id); - table.ForeignKey( - name: "FK_OpenIddictAuthorizations_OpenIddictApplications_Application~", - column: x => x.ApplicationId, - principalTable: "OpenIddictApplications", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictTokens", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - ApplicationId = table.Column(type: "text", nullable: true), - AuthorizationId = table.Column(type: "text", nullable: true), - ConcurrencyToken = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - CreationDate = table.Column(type: "timestamp with time zone", nullable: true), - ExpirationDate = table.Column(type: "timestamp with time zone", nullable: true), - Payload = table.Column(type: "text", nullable: true), - Properties = table.Column(type: "text", nullable: true), - RedemptionDate = table.Column(type: "timestamp with time zone", nullable: true), - ReferenceId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), - Status = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - Subject = table.Column(type: "character varying(400)", maxLength: 400, nullable: true), - Type = table.Column(type: "character varying(150)", maxLength: 150, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictTokens", x => x.Id); - table.ForeignKey( - name: "FK_OpenIddictTokens_OpenIddictApplications_ApplicationId", - column: x => x.ApplicationId, - principalTable: "OpenIddictApplications", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_OpenIddictTokens_OpenIddictAuthorizations_AuthorizationId", - column: x => x.AuthorizationId, - principalTable: "OpenIddictAuthorizations", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictApplications_ClientId", - table: "OpenIddictApplications", - column: "ClientId", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictAuthorizations_ApplicationId_Status_Subject_Type", - table: "OpenIddictAuthorizations", - columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictScopes_Name", - table: "OpenIddictScopes", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_ApplicationId_Status_Subject_Type", - table: "OpenIddictTokens", - columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_AuthorizationId", - table: "OpenIddictTokens", - column: "AuthorizationId"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_ReferenceId", - table: "OpenIddictTokens", - column: "ReferenceId", - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "EmailTemplates"); - - migrationBuilder.DropTable( - name: "OpenIddictScopes"); - - migrationBuilder.DropTable( - name: "OpenIddictTokens"); - - migrationBuilder.DropTable( - name: "OpenIddictAuthorizations"); - - migrationBuilder.DropTable( - name: "OpenIddictApplications"); - } - } -} diff --git a/MyOffice.Migration.Postgres/Migrations/AppDbContextModelSnapshot.cs b/MyOffice.Migration.Postgres/Migrations/AppDbContextModelSnapshot.cs deleted file mode 100644 index 7ffe0d0..0000000 --- a/MyOffice.Migration.Postgres/Migrations/AppDbContextModelSnapshot.cs +++ /dev/null @@ -1,1064 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MyOffice.Migrations.Postgres.Migrations -{ - [DbContext(typeof(AppDbContext))] - partial class AppDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:CollationDefinition:my_ci_collation", "en-u-ks-primary,en-u-ks-primary,icu,False") - .HasAnnotation("ProductVersion", "10.0.10") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("IsAllowManage") - .HasColumnType("boolean"); - - b.Property("IsAllowRead") - .HasColumnType("boolean"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Type") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.HasIndex("AccountId", "OwnerId") - .IsUnique(); - - b.HasIndex("AccountId", "UserId") - .IsUnique(); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AcceptedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsAllowWrite") - .HasColumnType("boolean"); - - b.Property("RejectedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("AccountId", "CategoryId") - .IsUnique(); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("numeric(18,6)"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ItemId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("CurrentRateId") - .HasColumnType("integer"); - - b.Property("IsPrimary") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("DefaultQuantity") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CurrencyId") - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("Rate") - .HasColumnType("numeric"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("ItemGlobalId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("IsInternal") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Notifications.EmailTemplate", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("Sender") - .IsRequired() - .HasColumnType("text"); - - b.Property("SenderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("Subject") - .IsRequired() - .HasColumnType("text"); - - b.Property("Template") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("EmailTemplates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("FullName") - .HasColumnType("text"); - - b.Property("IsEmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("text") - .UseCollation("my_ci_collation"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Code") - .IsRequired() - .HasColumnType("text"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Destination") - .IsRequired() - .HasColumnType("text"); - - b.Property("DestinationType") - .IsRequired() - .HasColumnType("text"); - - b.Property("ExpiresOn") - .HasColumnType("timestamp with time zone"); - - b.Property("Metadata") - .HasColumnType("text"); - - b.Property("Template") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("VerifiedOn") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("Verifications"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("text"); - - b.Property("ApplicationType") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ClientId") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("ClientSecret") - .HasColumnType("text"); - - b.Property("ClientType") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ConsentType") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("DisplayName") - .HasColumnType("text"); - - b.Property("DisplayNames") - .HasColumnType("text"); - - b.Property("JsonWebKeySet") - .HasColumnType("text"); - - b.Property("Permissions") - .HasColumnType("text"); - - b.Property("PostLogoutRedirectUris") - .HasColumnType("text"); - - b.Property("Properties") - .HasColumnType("text"); - - b.Property("RedirectUris") - .HasColumnType("text"); - - b.Property("Requirements") - .HasColumnType("text"); - - b.Property("Settings") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("ClientId") - .IsUnique(); - - b.ToTable("OpenIddictApplications", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("text"); - - b.Property("ApplicationId") - .HasColumnType("text"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("CreationDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Properties") - .HasColumnType("text"); - - b.Property("Scopes") - .HasColumnType("text"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("character varying(400)"); - - b.Property("Type") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictAuthorizations", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreScope", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("text"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("Descriptions") - .HasColumnType("text"); - - b.Property("DisplayName") - .HasColumnType("text"); - - b.Property("DisplayNames") - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Properties") - .HasColumnType("text"); - - b.Property("Resources") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("OpenIddictScopes", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("text"); - - b.Property("ApplicationId") - .HasColumnType("text"); - - b.Property("AuthorizationId") - .HasColumnType("text"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("CreationDate") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Payload") - .HasColumnType("text"); - - b.Property("Properties") - .HasColumnType("text"); - - b.Property("RedemptionDate") - .HasColumnType("timestamp with time zone"); - - b.Property("ReferenceId") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("character varying(400)"); - - b.Property("Type") - .HasMaxLength(150) - .HasColumnType("character varying(150)"); - - b.HasKey("Id"); - - b.HasIndex("AuthorizationId"); - - b.HasIndex("ReferenceId") - .IsUnique(); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictTokens", (string)null); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Invites") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") - .WithMany("Authorizations") - .HasForeignKey("ApplicationId"); - - b.Navigation("Application"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => - { - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") - .WithMany("Tokens") - .HasForeignKey("ApplicationId"); - - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", "Authorization") - .WithMany("Tokens") - .HasForeignKey("AuthorizationId"); - - b.Navigation("Application"); - - b.Navigation("Authorization"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Invites"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => - { - b.Navigation("Authorizations"); - - b.Navigation("Tokens"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.Navigation("Tokens"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Postgres/MyOffice.Migrations.Postgres.csproj b/MyOffice.Migration.Postgres/MyOffice.Migrations.Postgres.csproj deleted file mode 100644 index 23915d8..0000000 --- a/MyOffice.Migration.Postgres/MyOffice.Migrations.Postgres.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - net10.0 - enable - enable - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - diff --git a/MyOffice.Migration.Sqlite/AppDbContextFactorySqlite.cs b/MyOffice.Migration.Sqlite/AppDbContextFactorySqlite.cs deleted file mode 100644 index 47d8c45..0000000 --- a/MyOffice.Migration.Sqlite/AppDbContextFactorySqlite.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace MyOffice.Migrations.Sqlite; - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Design; -using Microsoft.Extensions.Configuration; -using MyOffice.DbContext; -using MyOffice.Shared; - -public class AppDbContextFactorySqlite : IDesignTimeDbContextFactory -{ - public AppDbContext CreateDbContext(string[]? args) - { - var builder = new DbContextOptionsBuilder(); - - var sharedConfiguration = SharedConfiguration.Build(); - var connectionString = - args?.FirstOrDefault() - ?? sharedConfiguration.GetConnectionString("sqlite"); - - builder.UseSqlite(connectionString, b => b.MigrationsAssembly("MyOffice.Migrations.Sqlite")); - - var db = new AppDbContext(AppDbContextProvidersEnum.sqlite, builder.Options); - db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; - - return db; - } -} \ No newline at end of file diff --git a/MyOffice.Migration.Sqlite/Migrations/20260717093158_OpenIddict.Designer.cs b/MyOffice.Migration.Sqlite/Migrations/20260717093158_OpenIddict.Designer.cs deleted file mode 100644 index 2074f6a..0000000 --- a/MyOffice.Migration.Sqlite/Migrations/20260717093158_OpenIddict.Designer.cs +++ /dev/null @@ -1,1049 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; - -#nullable disable - -namespace MyOffice.Migrations.Sqlite.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20260717093158_OpenIddict")] - partial class OpenIddict - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "10.0.10"); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("OwnerId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("AccountId") - .HasColumnType("TEXT"); - - b.Property("IsAllowManage") - .HasColumnType("INTEGER"); - - b.Property("IsAllowRead") - .HasColumnType("INTEGER"); - - b.Property("IsAllowWrite") - .HasColumnType("INTEGER"); - - b.Property("Name") - .HasColumnType("TEXT"); - - b.Property("OwnerId") - .HasColumnType("TEXT"); - - b.Property("Type") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.HasIndex("AccountId", "OwnerId") - .IsUnique(); - - b.HasIndex("AccountId", "UserId") - .IsUnique(); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("AcceptedOn") - .HasColumnType("TEXT"); - - b.Property("AccountId") - .HasColumnType("TEXT"); - - b.Property("CreatedOn") - .HasColumnType("TEXT"); - - b.Property("Email") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("IsAllowWrite") - .HasColumnType("INTEGER"); - - b.Property("RejectedOn") - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("AccountId") - .HasColumnType("TEXT"); - - b.Property("CategoryId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("AccountId", "CategoryId") - .IsUnique(); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("AccountId") - .HasColumnType("TEXT"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("TEXT"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("TEXT"); - - b.Property("CreatedOn") - .HasColumnType("TEXT"); - - b.Property("DateTime") - .HasColumnType("TEXT"); - - b.Property("DeletedOn") - .HasColumnType("TEXT"); - - b.Property("Description") - .HasColumnType("TEXT"); - - b.Property("ItemId") - .HasColumnType("INTEGER"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CurrentRateId") - .HasColumnType("INTEGER"); - - b.Property("IsPrimary") - .HasColumnType("INTEGER"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("DefaultQuantity") - .HasColumnType("INTEGER"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("CurrencyId") - .HasColumnType("TEXT"); - - b.Property("DateTime") - .HasColumnType("TEXT"); - - b.Property("Quantity") - .HasColumnType("INTEGER"); - - b.Property("Rate") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("CategoryId") - .HasColumnType("TEXT"); - - b.Property("ItemGlobalId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("IsInternal") - .HasColumnType("INTEGER"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Notifications.EmailTemplate", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("CreatedOn") - .HasColumnType("TEXT"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Sender") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("SenderName") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Subject") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Template") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("EmailTemplates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Email") - .IsRequired() - .HasColumnType("TEXT") - .UseCollation("NOCASE"); - - b.Property("FirstName") - .HasColumnType("TEXT"); - - b.Property("FullName") - .HasColumnType("TEXT"); - - b.Property("IsEmailConfirmed") - .HasColumnType("INTEGER"); - - b.Property("LastName") - .HasColumnType("TEXT"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Phone") - .HasColumnType("TEXT"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("TEXT") - .UseCollation("NOCASE"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("CreatedOn") - .HasColumnType("TEXT"); - - b.Property("Email") - .IsRequired() - .HasColumnType("TEXT") - .UseCollation("NOCASE"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("TEXT") - .UseCollation("NOCASE"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("Code") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CreatedOn") - .HasColumnType("TEXT"); - - b.Property("Destination") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DestinationType") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ExpiresOn") - .HasColumnType("TEXT"); - - b.Property("Metadata") - .HasColumnType("TEXT"); - - b.Property("Template") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("VerifiedOn") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("Verifications"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("ApplicationType") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("ClientId") - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.Property("ClientSecret") - .HasColumnType("TEXT"); - - b.Property("ClientType") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("ConsentType") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("DisplayName") - .HasColumnType("TEXT"); - - b.Property("DisplayNames") - .HasColumnType("TEXT"); - - b.Property("JsonWebKeySet") - .HasColumnType("TEXT"); - - b.Property("Permissions") - .HasColumnType("TEXT"); - - b.Property("PostLogoutRedirectUris") - .HasColumnType("TEXT"); - - b.Property("Properties") - .HasColumnType("TEXT"); - - b.Property("RedirectUris") - .HasColumnType("TEXT"); - - b.Property("Requirements") - .HasColumnType("TEXT"); - - b.Property("Settings") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("ClientId") - .IsUnique(); - - b.ToTable("OpenIddictApplications", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("ApplicationId") - .HasColumnType("TEXT"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("CreationDate") - .HasColumnType("TEXT"); - - b.Property("Properties") - .HasColumnType("TEXT"); - - b.Property("Scopes") - .HasColumnType("TEXT"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("TEXT"); - - b.Property("Type") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictAuthorizations", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreScope", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("Description") - .HasColumnType("TEXT"); - - b.Property("Descriptions") - .HasColumnType("TEXT"); - - b.Property("DisplayName") - .HasColumnType("TEXT"); - - b.Property("DisplayNames") - .HasColumnType("TEXT"); - - b.Property("Name") - .HasMaxLength(200) - .HasColumnType("TEXT"); - - b.Property("Properties") - .HasColumnType("TEXT"); - - b.Property("Resources") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("OpenIddictScopes", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("ApplicationId") - .HasColumnType("TEXT"); - - b.Property("AuthorizationId") - .HasColumnType("TEXT"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("CreationDate") - .HasColumnType("TEXT"); - - b.Property("ExpirationDate") - .HasColumnType("TEXT"); - - b.Property("Payload") - .HasColumnType("TEXT"); - - b.Property("Properties") - .HasColumnType("TEXT"); - - b.Property("RedemptionDate") - .HasColumnType("TEXT"); - - b.Property("ReferenceId") - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("TEXT"); - - b.Property("Type") - .HasMaxLength(150) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("AuthorizationId"); - - b.HasIndex("ReferenceId") - .IsUnique(); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictTokens", (string)null); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Invites") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") - .WithMany("Authorizations") - .HasForeignKey("ApplicationId"); - - b.Navigation("Application"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => - { - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") - .WithMany("Tokens") - .HasForeignKey("ApplicationId"); - - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", "Authorization") - .WithMany("Tokens") - .HasForeignKey("AuthorizationId"); - - b.Navigation("Application"); - - b.Navigation("Authorization"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Invites"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => - { - b.Navigation("Authorizations"); - - b.Navigation("Tokens"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.Navigation("Tokens"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Sqlite/Migrations/20260717093158_OpenIddict.cs b/MyOffice.Migration.Sqlite/Migrations/20260717093158_OpenIddict.cs deleted file mode 100644 index a014ddc..0000000 --- a/MyOffice.Migration.Sqlite/Migrations/20260717093158_OpenIddict.cs +++ /dev/null @@ -1,747 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyOffice.Migrations.Sqlite.Migrations -{ - /// - public partial class OpenIddict : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "CurrencyGlobals", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", nullable: false), - Symbol = table.Column(type: "TEXT", nullable: false), - DefaultQuantity = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CurrencyGlobals", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "EmailTemplates", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - CreatedOn = table.Column(type: "TEXT", nullable: false), - Description = table.Column(type: "TEXT", nullable: false), - Subject = table.Column(type: "TEXT", nullable: false), - Sender = table.Column(type: "TEXT", nullable: false), - SenderName = table.Column(type: "TEXT", nullable: false), - Template = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_EmailTemplates", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "ItemGlobals", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_ItemGlobals", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictApplications", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - ApplicationType = table.Column(type: "TEXT", maxLength: 50, nullable: true), - ClientId = table.Column(type: "TEXT", maxLength: 100, nullable: true), - ClientSecret = table.Column(type: "TEXT", nullable: true), - ClientType = table.Column(type: "TEXT", maxLength: 50, nullable: true), - ConcurrencyToken = table.Column(type: "TEXT", maxLength: 50, nullable: true), - ConsentType = table.Column(type: "TEXT", maxLength: 50, nullable: true), - DisplayName = table.Column(type: "TEXT", nullable: true), - DisplayNames = table.Column(type: "TEXT", nullable: true), - JsonWebKeySet = table.Column(type: "TEXT", nullable: true), - Permissions = table.Column(type: "TEXT", nullable: true), - PostLogoutRedirectUris = table.Column(type: "TEXT", nullable: true), - Properties = table.Column(type: "TEXT", nullable: true), - RedirectUris = table.Column(type: "TEXT", nullable: true), - Requirements = table.Column(type: "TEXT", nullable: true), - Settings = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictApplications", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictScopes", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - ConcurrencyToken = table.Column(type: "TEXT", maxLength: 50, nullable: true), - Description = table.Column(type: "TEXT", nullable: true), - Descriptions = table.Column(type: "TEXT", nullable: true), - DisplayName = table.Column(type: "TEXT", nullable: true), - DisplayNames = table.Column(type: "TEXT", nullable: true), - Name = table.Column(type: "TEXT", maxLength: 200, nullable: true), - Properties = table.Column(type: "TEXT", nullable: true), - Resources = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictScopes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Users", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - UserName = table.Column(type: "TEXT", nullable: false, collation: "NOCASE"), - Email = table.Column(type: "TEXT", nullable: false, collation: "NOCASE"), - PasswordHash = table.Column(type: "TEXT", nullable: false), - FirstName = table.Column(type: "TEXT", nullable: true), - LastName = table.Column(type: "TEXT", nullable: true), - FullName = table.Column(type: "TEXT", nullable: true), - Phone = table.Column(type: "TEXT", nullable: true), - IsEmailConfirmed = table.Column(type: "INTEGER", nullable: false), - CurrencyId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Users", x => x.Id); - table.ForeignKey( - name: "FK_Users_CurrencyGlobals_CurrencyId", - column: x => x.CurrencyId, - principalTable: "CurrencyGlobals", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictAuthorizations", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - ApplicationId = table.Column(type: "TEXT", nullable: true), - ConcurrencyToken = table.Column(type: "TEXT", maxLength: 50, nullable: true), - CreationDate = table.Column(type: "TEXT", nullable: true), - Properties = table.Column(type: "TEXT", nullable: true), - Scopes = table.Column(type: "TEXT", nullable: true), - Status = table.Column(type: "TEXT", maxLength: 50, nullable: true), - Subject = table.Column(type: "TEXT", maxLength: 400, nullable: true), - Type = table.Column(type: "TEXT", maxLength: 50, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictAuthorizations", x => x.Id); - table.ForeignKey( - name: "FK_OpenIddictAuthorizations_OpenIddictApplications_ApplicationId", - column: x => x.ApplicationId, - principalTable: "OpenIddictApplications", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "AccountCategories", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - UserId = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AccountCategories", x => x.Id); - table.ForeignKey( - name: "FK_AccountCategories_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Accounts", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - CurrencyGlobalId = table.Column(type: "TEXT", nullable: false), - OwnerId = table.Column(type: "TEXT", nullable: true), - Name = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Accounts", x => x.Id); - table.ForeignKey( - name: "FK_Accounts_CurrencyGlobals_CurrencyGlobalId", - column: x => x.CurrencyGlobalId, - principalTable: "CurrencyGlobals", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Accounts_Users_OwnerId", - column: x => x.OwnerId, - principalTable: "Users", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "ItemCategories", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - UserId = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", nullable: false), - IsInternal = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_ItemCategories", x => x.Id); - table.ForeignKey( - name: "FK_ItemCategories_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserClaims", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - CreatedOn = table.Column(type: "TEXT", nullable: false), - UserId = table.Column(type: "TEXT", nullable: false), - ExternalId = table.Column(type: "TEXT", nullable: false), - Email = table.Column(type: "TEXT", nullable: false, collation: "NOCASE"), - Provider = table.Column(type: "TEXT", nullable: false, collation: "NOCASE") - }, - constraints: table => - { - table.PrimaryKey("PK_UserClaims", x => x.Id); - table.ForeignKey( - name: "FK_UserClaims_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Verifications", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - UserId = table.Column(type: "TEXT", nullable: false), - Code = table.Column(type: "TEXT", nullable: false), - DestinationType = table.Column(type: "TEXT", nullable: false), - Destination = table.Column(type: "TEXT", nullable: false), - CreatedOn = table.Column(type: "TEXT", nullable: false), - ExpiresOn = table.Column(type: "TEXT", nullable: false), - VerifiedOn = table.Column(type: "TEXT", nullable: true), - Template = table.Column(type: "TEXT", nullable: false), - Metadata = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Verifications", x => x.Id); - table.ForeignKey( - name: "FK_Verifications_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictTokens", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - ApplicationId = table.Column(type: "TEXT", nullable: true), - AuthorizationId = table.Column(type: "TEXT", nullable: true), - ConcurrencyToken = table.Column(type: "TEXT", maxLength: 50, nullable: true), - CreationDate = table.Column(type: "TEXT", nullable: true), - ExpirationDate = table.Column(type: "TEXT", nullable: true), - Payload = table.Column(type: "TEXT", nullable: true), - Properties = table.Column(type: "TEXT", nullable: true), - RedemptionDate = table.Column(type: "TEXT", nullable: true), - ReferenceId = table.Column(type: "TEXT", maxLength: 100, nullable: true), - Status = table.Column(type: "TEXT", maxLength: 50, nullable: true), - Subject = table.Column(type: "TEXT", maxLength: 400, nullable: true), - Type = table.Column(type: "TEXT", maxLength: 150, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictTokens", x => x.Id); - table.ForeignKey( - name: "FK_OpenIddictTokens_OpenIddictApplications_ApplicationId", - column: x => x.ApplicationId, - principalTable: "OpenIddictApplications", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_OpenIddictTokens_OpenIddictAuthorizations_AuthorizationId", - column: x => x.AuthorizationId, - principalTable: "OpenIddictAuthorizations", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "AccountAccesses", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - AccountId = table.Column(type: "TEXT", nullable: false), - UserId = table.Column(type: "TEXT", nullable: false), - OwnerId = table.Column(type: "TEXT", nullable: false), - IsAllowRead = table.Column(type: "INTEGER", nullable: false), - IsAllowWrite = table.Column(type: "INTEGER", nullable: false), - IsAllowManage = table.Column(type: "INTEGER", nullable: false), - Type = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AccountAccesses", x => x.Id); - table.ForeignKey( - name: "FK_AccountAccesses_Accounts_AccountId", - column: x => x.AccountId, - principalTable: "Accounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AccountAccesses_Users_OwnerId", - column: x => x.OwnerId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AccountAccesses_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AccountAccessInvites", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - UserId = table.Column(type: "TEXT", nullable: false), - AccountId = table.Column(type: "TEXT", nullable: false), - CreatedOn = table.Column(type: "TEXT", nullable: false), - AcceptedOn = table.Column(type: "TEXT", nullable: true), - RejectedOn = table.Column(type: "TEXT", nullable: true), - Email = table.Column(type: "TEXT", nullable: false), - IsAllowWrite = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AccountAccessInvites", x => x.Id); - table.ForeignKey( - name: "FK_AccountAccessInvites_Accounts_AccountId", - column: x => x.AccountId, - principalTable: "Accounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AccountAccessInvites_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AccountAccountCategories", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - AccountId = table.Column(type: "TEXT", nullable: false), - CategoryId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AccountAccountCategories", x => x.Id); - table.ForeignKey( - name: "FK_AccountAccountCategories_AccountCategories_CategoryId", - column: x => x.CategoryId, - principalTable: "AccountCategories", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AccountAccountCategories_Accounts_AccountId", - column: x => x.AccountId, - principalTable: "Accounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Items", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - CategoryId = table.Column(type: "TEXT", nullable: false), - ItemGlobalId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Items", x => x.Id); - table.ForeignKey( - name: "FK_Items_ItemCategories_CategoryId", - column: x => x.CategoryId, - principalTable: "ItemCategories", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Items_ItemGlobals_ItemGlobalId", - column: x => x.ItemGlobalId, - principalTable: "ItemGlobals", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Motions", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - CreatedOn = table.Column(type: "TEXT", nullable: false), - DateTime = table.Column(type: "TEXT", nullable: false), - AccountId = table.Column(type: "TEXT", nullable: false), - ItemId = table.Column(type: "INTEGER", nullable: false), - Description = table.Column(type: "TEXT", nullable: true), - AmountPlus = table.Column(type: "TEXT", precision: 18, scale: 6, nullable: false), - AmountMinus = table.Column(type: "TEXT", precision: 18, scale: 6, nullable: false), - DeletedOn = table.Column(type: "TEXT", nullable: true), - UserId = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Motions", x => x.Id); - table.ForeignKey( - name: "FK_Motions_Accounts_AccountId", - column: x => x.AccountId, - principalTable: "Accounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Motions_Items_ItemId", - column: x => x.ItemId, - principalTable: "Items", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Motions_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "Currencies", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - CurrencyGlobalId = table.Column(type: "TEXT", nullable: false), - UserId = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", nullable: false), - ShortName = table.Column(type: "TEXT", nullable: false), - CurrentRateId = table.Column(type: "INTEGER", nullable: true), - IsPrimary = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Currencies", x => x.Id); - table.ForeignKey( - name: "FK_Currencies_CurrencyGlobals_CurrencyGlobalId", - column: x => x.CurrencyGlobalId, - principalTable: "CurrencyGlobals", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Currencies_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "CurrencyRates", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - CurrencyId = table.Column(type: "TEXT", nullable: false), - DateTime = table.Column(type: "TEXT", nullable: false), - Quantity = table.Column(type: "INTEGER", nullable: false), - Rate = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CurrencyRates", x => x.Id); - table.ForeignKey( - name: "FK_CurrencyRates_Currencies_CurrencyId", - column: x => x.CurrencyId, - principalTable: "Currencies", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccesses_AccountId_OwnerId", - table: "AccountAccesses", - columns: new[] { "AccountId", "OwnerId" }, - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccesses_AccountId_UserId", - table: "AccountAccesses", - columns: new[] { "AccountId", "UserId" }, - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccesses_OwnerId", - table: "AccountAccesses", - column: "OwnerId"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccesses_UserId", - table: "AccountAccesses", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccessInvites_AccountId", - table: "AccountAccessInvites", - column: "AccountId"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccessInvites_UserId", - table: "AccountAccessInvites", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccountCategories_AccountId_CategoryId", - table: "AccountAccountCategories", - columns: new[] { "AccountId", "CategoryId" }, - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AccountAccountCategories_CategoryId", - table: "AccountAccountCategories", - column: "CategoryId"); - - migrationBuilder.CreateIndex( - name: "IX_AccountCategories_UserId", - table: "AccountCategories", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Accounts_CurrencyGlobalId", - table: "Accounts", - column: "CurrencyGlobalId"); - - migrationBuilder.CreateIndex( - name: "IX_Accounts_OwnerId", - table: "Accounts", - column: "OwnerId"); - - migrationBuilder.CreateIndex( - name: "IX_Currencies_CurrencyGlobalId", - table: "Currencies", - column: "CurrencyGlobalId"); - - migrationBuilder.CreateIndex( - name: "IX_Currencies_CurrentRateId", - table: "Currencies", - column: "CurrentRateId"); - - migrationBuilder.CreateIndex( - name: "IX_Currencies_UserId", - table: "Currencies", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_CurrencyRates_CurrencyId", - table: "CurrencyRates", - column: "CurrencyId"); - - migrationBuilder.CreateIndex( - name: "IX_ItemCategories_UserId", - table: "ItemCategories", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Items_CategoryId", - table: "Items", - column: "CategoryId"); - - migrationBuilder.CreateIndex( - name: "IX_Items_ItemGlobalId", - table: "Items", - column: "ItemGlobalId"); - - migrationBuilder.CreateIndex( - name: "IX_Motions_AccountId", - table: "Motions", - column: "AccountId"); - - migrationBuilder.CreateIndex( - name: "IX_Motions_ItemId", - table: "Motions", - column: "ItemId"); - - migrationBuilder.CreateIndex( - name: "IX_Motions_UserId", - table: "Motions", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictApplications_ClientId", - table: "OpenIddictApplications", - column: "ClientId", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictAuthorizations_ApplicationId_Status_Subject_Type", - table: "OpenIddictAuthorizations", - columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictScopes_Name", - table: "OpenIddictScopes", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_ApplicationId_Status_Subject_Type", - table: "OpenIddictTokens", - columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_AuthorizationId", - table: "OpenIddictTokens", - column: "AuthorizationId"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_ReferenceId", - table: "OpenIddictTokens", - column: "ReferenceId", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_UserClaims_UserId", - table: "UserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Users_CurrencyId", - table: "Users", - column: "CurrencyId"); - - migrationBuilder.CreateIndex( - name: "IX_Verifications_UserId", - table: "Verifications", - column: "UserId"); - - migrationBuilder.AddForeignKey( - name: "FK_Currencies_CurrencyRates_CurrentRateId", - table: "Currencies", - column: "CurrentRateId", - principalTable: "CurrencyRates", - principalColumn: "Id"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Currencies_Users_UserId", - table: "Currencies"); - - migrationBuilder.DropForeignKey( - name: "FK_Currencies_CurrencyGlobals_CurrencyGlobalId", - table: "Currencies"); - - migrationBuilder.DropForeignKey( - name: "FK_Currencies_CurrencyRates_CurrentRateId", - table: "Currencies"); - - migrationBuilder.DropTable( - name: "AccountAccesses"); - - migrationBuilder.DropTable( - name: "AccountAccessInvites"); - - migrationBuilder.DropTable( - name: "AccountAccountCategories"); - - migrationBuilder.DropTable( - name: "EmailTemplates"); - - migrationBuilder.DropTable( - name: "Motions"); - - migrationBuilder.DropTable( - name: "OpenIddictScopes"); - - migrationBuilder.DropTable( - name: "OpenIddictTokens"); - - migrationBuilder.DropTable( - name: "UserClaims"); - - migrationBuilder.DropTable( - name: "Verifications"); - - migrationBuilder.DropTable( - name: "AccountCategories"); - - migrationBuilder.DropTable( - name: "Accounts"); - - migrationBuilder.DropTable( - name: "Items"); - - migrationBuilder.DropTable( - name: "OpenIddictAuthorizations"); - - migrationBuilder.DropTable( - name: "ItemCategories"); - - migrationBuilder.DropTable( - name: "ItemGlobals"); - - migrationBuilder.DropTable( - name: "OpenIddictApplications"); - - migrationBuilder.DropTable( - name: "Users"); - - migrationBuilder.DropTable( - name: "CurrencyGlobals"); - - migrationBuilder.DropTable( - name: "CurrencyRates"); - - migrationBuilder.DropTable( - name: "Currencies"); - } - } -} diff --git a/MyOffice.Migration.Sqlite/Migrations/AppDbContextModelSnapshot.cs b/MyOffice.Migration.Sqlite/Migrations/AppDbContextModelSnapshot.cs deleted file mode 100644 index 6364200..0000000 --- a/MyOffice.Migration.Sqlite/Migrations/AppDbContextModelSnapshot.cs +++ /dev/null @@ -1,1046 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyOffice.DbContext; - -#nullable disable - -namespace MyOffice.Migrations.Sqlite.Migrations -{ - [DbContext(typeof(AppDbContext))] - partial class AppDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "10.0.10"); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("OwnerId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("AccountId") - .HasColumnType("TEXT"); - - b.Property("IsAllowManage") - .HasColumnType("INTEGER"); - - b.Property("IsAllowRead") - .HasColumnType("INTEGER"); - - b.Property("IsAllowWrite") - .HasColumnType("INTEGER"); - - b.Property("Name") - .HasColumnType("TEXT"); - - b.Property("OwnerId") - .HasColumnType("TEXT"); - - b.Property("Type") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("UserId"); - - b.HasIndex("AccountId", "OwnerId") - .IsUnique(); - - b.HasIndex("AccountId", "UserId") - .IsUnique(); - - b.ToTable("AccountAccesses"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("AcceptedOn") - .HasColumnType("TEXT"); - - b.Property("AccountId") - .HasColumnType("TEXT"); - - b.Property("CreatedOn") - .HasColumnType("TEXT"); - - b.Property("Email") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("IsAllowWrite") - .HasColumnType("INTEGER"); - - b.Property("RejectedOn") - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("UserId"); - - b.ToTable("AccountAccessInvites"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("AccountId") - .HasColumnType("TEXT"); - - b.Property("CategoryId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("AccountId", "CategoryId") - .IsUnique(); - - b.ToTable("AccountAccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AccountCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("AccountId") - .HasColumnType("TEXT"); - - b.Property("AmountMinus") - .HasPrecision(18, 6) - .HasColumnType("TEXT"); - - b.Property("AmountPlus") - .HasPrecision(18, 6) - .HasColumnType("TEXT"); - - b.Property("CreatedOn") - .HasColumnType("TEXT"); - - b.Property("DateTime") - .HasColumnType("TEXT"); - - b.Property("DeletedOn") - .HasColumnType("TEXT"); - - b.Property("Description") - .HasColumnType("TEXT"); - - b.Property("ItemId") - .HasColumnType("INTEGER"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("AccountId"); - - b.HasIndex("ItemId"); - - b.HasIndex("UserId"); - - b.ToTable("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CurrencyGlobalId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CurrentRateId") - .HasColumnType("INTEGER"); - - b.Property("IsPrimary") - .HasColumnType("INTEGER"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ShortName") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyGlobalId"); - - b.HasIndex("CurrentRateId"); - - b.HasIndex("UserId"); - - b.ToTable("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("DefaultQuantity") - .HasColumnType("INTEGER"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Symbol") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("CurrencyGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("CurrencyId") - .HasColumnType("TEXT"); - - b.Property("DateTime") - .HasColumnType("TEXT"); - - b.Property("Quantity") - .HasColumnType("INTEGER"); - - b.Property("Rate") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("CurrencyRates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("CategoryId") - .HasColumnType("TEXT"); - - b.Property("ItemGlobalId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CategoryId"); - - b.HasIndex("ItemGlobalId"); - - b.ToTable("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("IsInternal") - .HasColumnType("INTEGER"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("ItemCategories"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("ItemGlobals"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Notifications.EmailTemplate", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("CreatedOn") - .HasColumnType("TEXT"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Sender") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("SenderName") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Subject") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Template") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("EmailTemplates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CurrencyId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Email") - .IsRequired() - .HasColumnType("TEXT") - .UseCollation("NOCASE"); - - b.Property("FirstName") - .HasColumnType("TEXT"); - - b.Property("FullName") - .HasColumnType("TEXT"); - - b.Property("IsEmailConfirmed") - .HasColumnType("INTEGER"); - - b.Property("LastName") - .HasColumnType("TEXT"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Phone") - .HasColumnType("TEXT"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("TEXT") - .UseCollation("NOCASE"); - - b.HasKey("Id"); - - b.HasIndex("CurrencyId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("CreatedOn") - .HasColumnType("TEXT"); - - b.Property("Email") - .IsRequired() - .HasColumnType("TEXT") - .UseCollation("NOCASE"); - - b.Property("ExternalId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Provider") - .IsRequired() - .HasColumnType("TEXT") - .UseCollation("NOCASE"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("Code") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CreatedOn") - .HasColumnType("TEXT"); - - b.Property("Destination") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DestinationType") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ExpiresOn") - .HasColumnType("TEXT"); - - b.Property("Metadata") - .HasColumnType("TEXT"); - - b.Property("Template") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("VerifiedOn") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("Verifications"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("ApplicationType") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("ClientId") - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.Property("ClientSecret") - .HasColumnType("TEXT"); - - b.Property("ClientType") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("ConsentType") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("DisplayName") - .HasColumnType("TEXT"); - - b.Property("DisplayNames") - .HasColumnType("TEXT"); - - b.Property("JsonWebKeySet") - .HasColumnType("TEXT"); - - b.Property("Permissions") - .HasColumnType("TEXT"); - - b.Property("PostLogoutRedirectUris") - .HasColumnType("TEXT"); - - b.Property("Properties") - .HasColumnType("TEXT"); - - b.Property("RedirectUris") - .HasColumnType("TEXT"); - - b.Property("Requirements") - .HasColumnType("TEXT"); - - b.Property("Settings") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("ClientId") - .IsUnique(); - - b.ToTable("OpenIddictApplications", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("ApplicationId") - .HasColumnType("TEXT"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("CreationDate") - .HasColumnType("TEXT"); - - b.Property("Properties") - .HasColumnType("TEXT"); - - b.Property("Scopes") - .HasColumnType("TEXT"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("TEXT"); - - b.Property("Type") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictAuthorizations", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreScope", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("Description") - .HasColumnType("TEXT"); - - b.Property("Descriptions") - .HasColumnType("TEXT"); - - b.Property("DisplayName") - .HasColumnType("TEXT"); - - b.Property("DisplayNames") - .HasColumnType("TEXT"); - - b.Property("Name") - .HasMaxLength(200) - .HasColumnType("TEXT"); - - b.Property("Properties") - .HasColumnType("TEXT"); - - b.Property("Resources") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("OpenIddictScopes", (string)null); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("ApplicationId") - .HasColumnType("TEXT"); - - b.Property("AuthorizationId") - .HasColumnType("TEXT"); - - b.Property("ConcurrencyToken") - .IsConcurrencyToken() - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("CreationDate") - .HasColumnType("TEXT"); - - b.Property("ExpirationDate") - .HasColumnType("TEXT"); - - b.Property("Payload") - .HasColumnType("TEXT"); - - b.Property("Properties") - .HasColumnType("TEXT"); - - b.Property("RedemptionDate") - .HasColumnType("TEXT"); - - b.Property("ReferenceId") - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("TEXT"); - - b.Property("Type") - .HasMaxLength(150) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("AuthorizationId"); - - b.HasIndex("ReferenceId") - .IsUnique(); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictTokens", (string)null); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Accounts") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("Accounts") - .HasForeignKey("OwnerId"); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccess", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("AccessRights") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "Owner") - .WithMany("AccountAccessOwners") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccess") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Owner"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccessInvite", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Invites") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountAccessInvites") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountAccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Categories") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Accounts.AccountCategory", "Category") - .WithMany("Accounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Account"); - - b.Navigation("Category"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("AccountCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Motion", b => - { - b.HasOne("MyOffice.Data.Models.Accounts.Account", "Account") - .WithMany("Motions") - .HasForeignKey("AccountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.Item", "Item") - .WithMany("Motions") - .HasForeignKey("ItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Users.User", null) - .WithMany("AccountMotions") - .HasForeignKey("UserId"); - - b.Navigation("Account"); - - b.Navigation("Item"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "CurrencyGlobal") - .WithMany("Currencies") - .HasForeignKey("CurrencyGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyRate", "CurrentRate") - .WithMany("Currencies") - .HasForeignKey("CurrentRateId"); - - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("Currencies") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CurrencyGlobal"); - - b.Navigation("CurrentRate"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.Currency", "Currency") - .WithMany("Rates") - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.HasOne("MyOffice.Data.Models.Items.ItemCategory", "Category") - .WithMany("Items") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyOffice.Data.Models.Items.ItemGlobal", "ItemGlobal") - .WithMany("Items") - .HasForeignKey("ItemGlobalId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("ItemGlobal"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("ItemCategories") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.HasOne("MyOffice.Data.Models.Currencies.CurrencyGlobal", "Currency") - .WithMany() - .HasForeignKey("CurrencyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Currency"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.UserExternal", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany("UserClaims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Verifications.VerificationCode", b => - { - b.HasOne("MyOffice.Data.Models.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") - .WithMany("Authorizations") - .HasForeignKey("ApplicationId"); - - b.Navigation("Application"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => - { - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") - .WithMany("Tokens") - .HasForeignKey("ApplicationId"); - - b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", "Authorization") - .WithMany("Tokens") - .HasForeignKey("AuthorizationId"); - - b.Navigation("Application"); - - b.Navigation("Authorization"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.Account", b => - { - b.Navigation("AccessRights"); - - b.Navigation("Categories"); - - b.Navigation("Invites"); - - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Accounts.AccountCategory", b => - { - b.Navigation("Accounts"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.Currency", b => - { - b.Navigation("Rates"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyGlobal", b => - { - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Currencies.CurrencyRate", b => - { - b.Navigation("Currencies"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.Item", b => - { - b.Navigation("Motions"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Items.ItemGlobal", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("MyOffice.Data.Models.Users.User", b => - { - b.Navigation("AccountAccess"); - - b.Navigation("AccountAccessInvites"); - - b.Navigation("AccountAccessOwners"); - - b.Navigation("AccountCategories"); - - b.Navigation("AccountMotions"); - - b.Navigation("Accounts"); - - b.Navigation("Currencies"); - - b.Navigation("ItemCategories"); - - b.Navigation("UserClaims"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => - { - b.Navigation("Authorizations"); - - b.Navigation("Tokens"); - }); - - modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => - { - b.Navigation("Tokens"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MyOffice.Migration.Sqlite/MyOffice.Migrations.Sqlite.csproj b/MyOffice.Migration.Sqlite/MyOffice.Migrations.Sqlite.csproj deleted file mode 100644 index b5732ca..0000000 --- a/MyOffice.Migration.Sqlite/MyOffice.Migrations.Sqlite.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - diff --git a/MyOffice.SPA/.editorconfig b/MyOffice.SPA/.editorconfig deleted file mode 100644 index f99379e..0000000 --- a/MyOffice.SPA/.editorconfig +++ /dev/null @@ -1,16 +0,0 @@ -# Editor configuration, see https://editorconfig.org -root = true - -[*] -charset = utf-8 -indent_style = tabs -indent_size = 4 -insert_final_newline = true -trim_trailing_whitespace = true - -[*.ts] -quote_type = single - -[*.md] -max_line_length = off -trim_trailing_whitespace = false diff --git a/MyOffice.SPA/.eslintrc.json b/MyOffice.SPA/.eslintrc.json deleted file mode 100644 index 99d2907..0000000 --- a/MyOffice.SPA/.eslintrc.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "root": true, - "ignorePatterns": [ - "projects/**/*" - ], - "overrides": [ - { - "files": [ - "*.ts" - ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@angular-eslint/recommended", - "plugin:@angular-eslint/template/process-inline-templates" - ], - "rules": { - "@angular-eslint/directive-selector": [ - "error", - { - "type": "attribute", - "prefix": "app", - "style": "camelCase" - } - ], - "@angular-eslint/component-selector": [ - "error", - { - "type": "element", - "prefix": "app", - "style": "kebab-case" - } - ] - } - }, - { - "files": [ - "*.html" - ], - "extends": [ - "plugin:@angular-eslint/template/recommended" - ], - "rules": {} - } - ] -} diff --git a/MyOffice.SPA/.gitignore b/MyOffice.SPA/.gitignore deleted file mode 100644 index 0711527..0000000 --- a/MyOffice.SPA/.gitignore +++ /dev/null @@ -1,42 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# Compiled output -/dist -/tmp -/out-tsc -/bazel-out - -# Node -/node_modules -npm-debug.log -yarn-error.log - -# IDEs and editors -.idea/ -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# Visual Studio Code -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history/* - -# Miscellaneous -/.angular/cache -.sass-cache/ -/connect.lock -/coverage -/libpeerconnection.log -testem.log -/typings - -# System files -.DS_Store -Thumbs.db diff --git a/MyOffice.SPA/.npmrc b/MyOffice.SPA/.npmrc deleted file mode 100644 index e9ee3cb..0000000 --- a/MyOffice.SPA/.npmrc +++ /dev/null @@ -1 +0,0 @@ -legacy-peer-deps=true \ No newline at end of file diff --git a/MyOffice.SPA/MyOffice.SPA.esproj b/MyOffice.SPA/MyOffice.SPA.esproj deleted file mode 100644 index 37d6a55..0000000 --- a/MyOffice.SPA/MyOffice.SPA.esproj +++ /dev/null @@ -1,44 +0,0 @@ - - - b02d9868-26cb-4e98-95d8-7286bf255f89 - - - npm start - false - Jasmine - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MyOffice.SPA/README.md b/MyOffice.SPA/README.md deleted file mode 100644 index 747ce2e..0000000 --- a/MyOffice.SPA/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# MyOffice - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.0.6. - -## Development server - -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/MyOffice.SPA/angular.json b/MyOffice.SPA/angular.json deleted file mode 100644 index 9ad369d..0000000 --- a/MyOffice.SPA/angular.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "MyOffice": { - "projectType": "application", - "schematics": {}, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:application", - "options": { - "outputPath": "dist/angular-template", - "index": "src/index.html", - "browser": "src/main.ts", - "polyfills": ["src/polyfills.ts"], - "tsConfig": "tsconfig.app.json", - "inlineStyleLanguage": "scss", - "assets": [ - "src/favicon.ico", - "src/assets", - "src/silent-refresh.html" - ], - "styles": [ - "@angular/material/prebuilt-themes/indigo-pink.css", - "./node_modules/bootstrap/dist/css/bootstrap.min.css", - "src/assets/scss/style.scss", - "src/assets/scss/theme/all-themes.scss", - "src/styles.scss" - ], - "stylePreprocessorOptions": { - "includePaths": ["node_modules/"] - }, - "scripts": [ - ] - }, - "configurations": { - "production": { - "budgets": [ - { - "type": "initial", - "maximumWarning": "1mb", - "maximumError": "3mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" - } - ], - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "outputHashing": "all" - }, - "docker": { - "budgets": [ - { - "type": "initial", - "maximumWarning": "1mb", - "maximumError": "3mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" - } - ], - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.docker.ts" - } - ], - "outputHashing": "all" - }, - "proxmox": { - "budgets": [ - { - "type": "initial", - "maximumWarning": "1mb", - "maximumError": "3mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" - } - ], - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.proxmox.ts" - } - ], - "outputHashing": "all" - }, - "development": { - "optimization": false, - "extractLicenses": false, - "sourceMap": true, - "namedChunks": true - } - }, - "defaultConfiguration": "production" - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "configurations": { - "production": { - "buildTarget": "MyOffice:build:production" - }, - "development": { - "buildTarget": "MyOffice:build:development" - } - }, - "defaultConfiguration": "development", - "options": { - "proxyConfig": "src/proxy.conf.js", - "port": 4300, - "open": false - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "buildTarget": "MyOffice:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "src/test.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.spec.json", - "karmaConfig": "karma.conf.js", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - ], - "scripts": [] - } - } - } - } - }, - "cli": { - "analytics": false - } -} diff --git a/MyOffice.SPA/aspnetcore-https.js b/MyOffice.SPA/aspnetcore-https.js deleted file mode 100644 index 81a924e..0000000 --- a/MyOffice.SPA/aspnetcore-https.js +++ /dev/null @@ -1,36 +0,0 @@ -// This script sets up HTTPS for the application using the ASP.NET Core HTTPS certificate -const fs = require('fs'); -const spawn = require('child_process').spawn; -const path = require('path'); - -const baseFolder = - process.env.APPDATA !== undefined && process.env.APPDATA !== '' - ? `${process.env.APPDATA}/ASP.NET/https` - : `${process.env.HOME}/.aspnet/https`; - -const certificateArg = process.argv.map(arg => arg.match(/--name=(?.+)/i)).filter(Boolean)[0]; -const certificateName = certificateArg ? certificateArg.groups.value : process.env.npm_package_name; - -if (!certificateName) { - console.error( - 'Invalid certificate name. Run this script in the context of an npm/yarn script or pass --name=<> explicitly.'); - process.exit(-1); -} - -const certFilePath = path.join(baseFolder, `${certificateName}.pem`); -const keyFilePath = path.join(baseFolder, `${certificateName}.key`); - -if (!fs.existsSync(certFilePath) || !fs.existsSync(keyFilePath)) { - spawn('dotnet', - [ - 'dev-certs', - 'https', - '--export-path', - certFilePath, - '--format', - 'Pem', - '--no-password', - ], - { stdio: 'inherit', }) - .on('exit', (code) => process.exit(code)); -} diff --git a/MyOffice.SPA/karma.conf.js b/MyOffice.SPA/karma.conf.js deleted file mode 100644 index b5ce0eb..0000000 --- a/MyOffice.SPA/karma.conf.js +++ /dev/null @@ -1,45 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function(config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage'), - require('@angular-devkit/build-angular/plugins/karma') - ], - client: { - jasmine: { - // you can add configuration options for Jasmine here - // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html - // for example, you can disable the random execution with `random: false` - // or set a specific seed with `seed: 4321` - - }, - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - jasmineHtmlReporter: { - suppressAll: true // removes the duplicated traces - }, - coverageReporter: { - dir: require('path').join(__dirname, './coverage/angular-template'), - subdir: '.', - reporters: [ - { type: 'html' }, - { type: 'text-summary' } - ] - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true - }); -}; diff --git a/MyOffice.SPA/nuget.config b/MyOffice.SPA/nuget.config deleted file mode 100644 index 04437b9..0000000 --- a/MyOffice.SPA/nuget.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/MyOffice.SPA/package.json b/MyOffice.SPA/package.json deleted file mode 100644 index 92dfe34..0000000 --- a/MyOffice.SPA/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "angular-template", - "version": "0.0.0", - "scripts": { - "ng": "node --disable-warning=DEP0060 ./node_modules/@angular/cli/bin/ng.js", - "start": "node --disable-warning=DEP0060 ./node_modules/@angular/cli/bin/ng.js serve", - "start-ssl": "node --disable-warning=DEP0060 ./node_modules/@angular/cli/bin/ng.js serve --ssl --ssl-cert %APPDATA%\\ASP.NET\\https\\%npm_package_name%.pem --ssl-key %APPDATA%\\ASP.NET\\https\\%npm_package_name%.key", - "build": "node --disable-warning=DEP0060 ./node_modules/@angular/cli/bin/ng.js build", - "watch": "node --disable-warning=DEP0060 ./node_modules/@angular/cli/bin/ng.js build --watch --configuration development", - "test": "node --disable-warning=DEP0060 ./node_modules/@angular/cli/bin/ng.js test" - }, - "private": true, - "dependencies": { - "@abacritt/angularx-social-login": "^2.1.0", - "@angular/animations": "^18.2.14", - "@angular/cdk": "^18.2.14", - "@angular/common": "^18.2.14", - "@angular/compiler": "^18.2.14", - "@angular/core": "^18.2.14", - "@angular/forms": "^18.2.14", - "@angular/material": "^18.2.14", - "@angular/platform-browser": "^18.2.14", - "@angular/platform-browser-dynamic": "^18.2.14", - "@angular/router": "^18.2.14", - "@auth0/auth0-angular": "2.2.3", - "@ngx-loading-bar/core": "^6.0.2", - "@ngx-loading-bar/http-client": "^6.0.2", - "@ngx-loading-bar/router": "^6.0.2", - "@ngx-translate/core": "^14.0.0", - "@ngx-translate/http-loader": "^7.0.0", - "@popperjs/core": "^2.11.6", - "angular-animations": "^0.11.0", - "angular-feather": "^6.5.0", - "angular-oauth2-oidc": "^18.0.0", - "apexcharts": "^3.37.0", - "bootstrap": "^5.2.3", - "lodash": "^4.17.21", - "moment": "^2.29.4", - "ng-apexcharts": "^1.11.0", - "ngx-currency": "^4.0.0", - "ngx-mask": "^18.0.4", - "ngx-scrollbar": "^13.0.3", - "rxjs": "~7.8.0", - "subsink": "^1.0.2", - "sweetalert2": "^11.4.8", - "tslib": "^2.3.0", - "xlsx": "^0.18.5", - "zone.js": "^0.14.10" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^18.2.14", - "@angular-eslint/builder": "^18.4.3", - "@angular-eslint/eslint-plugin": "^18.4.3", - "@angular-eslint/eslint-plugin-template": "^18.4.3", - "@angular-eslint/schematics": "^18.4.3", - "@angular-eslint/template-parser": "^18.4.3", - "@angular/cli": "^18.2.14", - "@angular/compiler-cli": "^18.2.14", - "@types/jasmine": "~4.3.0", - "@types/lodash": "^4.14.196", - "@typescript-eslint/eslint-plugin": "5.48.2", - "@typescript-eslint/parser": "5.48.2", - "eslint": "^8.33.0", - "jasmine-core": "~4.5.0", - "karma": "~6.4.0", - "karma-chrome-launcher": "~3.1.0", - "karma-coverage": "~2.2.0", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "~2.0.0", - "typescript": "^5.5.4" - }, - "overrides": { - "@auth0/auth0-spa-js": "2.1.3" - } -} diff --git a/MyOffice.SPA/src/app/api-routes.ts b/MyOffice.SPA/src/app/api-routes.ts deleted file mode 100644 index d795b5c..0000000 --- a/MyOffice.SPA/src/app/api-routes.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { environment } from '../environments/environment'; - -const api = (environment.apiUrl ?? '').replace(/\/$/, ''); - -export class ApiRoutes { - static UserRegister = `${api}/api/user/register`; - static UserLogin = `${api}/api/user/login`; - static UserProfile = `${api}/api/user/profile`; - static UserAttach = `${api}/api/user/attach`; - static UserDeattach = `${api}/api/user/deattach`; - - static GeneralCurrencies = `${api}/api/general/currencies`; - static SettingsCurrencies = `${api}/api/settings/currencies`; - static SettingsCurrency = `${api}/api/settings/currencies/:id`; - static SettingsCurrenciesRate = `${api}/api/settings/currencies/:id/rate`; - - static SettingsAccountCategories = `${api}/api/settings/account-categories`; - static SettingsAccountCategory = `${api}/api/settings/account-categories/:id`; - - static SettingsAccounts = `${api}/api/settings/accounts`; - static SettingsAccount = `${api}/api/settings/accounts/:id`; - static SettingsAccountAccesses = `${api}/api/settings/accounts/:id/access`; - static SettingsAccountAccess = `${api}/api/settings/accounts/:id/access/:access`; - static SettingsAccountAccountCategory = `${api}/api/settings/accounts/:id/category/:categoryId`; - static SettingsAccountInvites = `${api}/api/settings/accounts/invites`; - static SettingsAccountInviteAccept = `${api}/api/settings/accounts/invites/:id/accept`; - static SettingsAccountInviteReject = `${api}/api/settings/accounts/invites/:id/reject`; - - static SettingsItemCategories = `${api}/api/settings/item-categories`; - static SettingsItemCategory = `${api}/api/settings/item-categories/:id`; - - static SettingsItems = `${api}/api/settings/items`; - static SettingsItem = `${api}/api/settings/items/:id`; - - static Accounts = `${api}/api/accounts`; - static Account = `${api}/api/accounts/:id`; - - static Motions = `${api}/api/accounts/:id/motions`; - static Motion = `${api}/api/accounts/:id/motions/:motionId`; - - static Items = `${api}/api/items`; - - static Dashboard = `${api}/api/dashboard`; - static DashboardIncome = `${api}/api/dashboard/income`; - static DashboardOutcome = `${api}/api/dashboard/outcome`; -} diff --git a/MyOffice.SPA/src/app/app-routing.module.ts b/MyOffice.SPA/src/app/app-routing.module.ts deleted file mode 100644 index 6e21dbb..0000000 --- a/MyOffice.SPA/src/app/app-routing.module.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { Page404Component } from './authentication/page404/page404.component'; -import { AuthGuard } from './core/guard/auth.guard'; -import { AuthLayoutComponent } from './layout/app-layout/auth-layout/auth-layout.component'; -import { MainLayoutComponent } from './layout/app-layout/main-layout/main-layout.component'; - -const routes: Routes = [ - { - path: '', - component: MainLayoutComponent, - canActivate: [AuthGuard], - children: [ - { path: '', redirectTo: '/authentication/signin', pathMatch: 'full' }, - { - path: 'dashboard', - loadChildren: () => - import('./dashboard/dashboard.module').then((m) => m.DashboardModule), - }, - ], - }, - { - path: 'authentication', - component: AuthLayoutComponent, - loadChildren: () => - import('./authentication/authentication.module').then( - (m) => m.AuthenticationModule - ), - }, - { - path: '', - component: MainLayoutComponent, - canActivate: [AuthGuard], - loadChildren: () => - import('./pages/pages.module').then( - (m) => m.PagesModule - ), - }, - { path: '**', component: Page404Component }, -]; - -@NgModule({ - imports: [RouterModule.forRoot(routes, {})], - exports: [RouterModule], -}) -export class AppRoutingModule { -} diff --git a/MyOffice.SPA/src/app/app.component.html b/MyOffice.SPA/src/app/app.component.html deleted file mode 100644 index 7e31ebd..0000000 --- a/MyOffice.SPA/src/app/app.component.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/MyOffice.SPA/src/app/app.component.scss b/MyOffice.SPA/src/app/app.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/app.component.spec.ts b/MyOffice.SPA/src/app/app.component.spec.ts deleted file mode 100644 index 39d0388..0000000 --- a/MyOffice.SPA/src/app/app.component.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { AppComponent } from './app.component'; - -describe('AppComponent', - () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ - AppComponent - ], - }).compileComponents(); - }); - - it('should create the app', - () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); - - it(`should have as title 'spire'`, - () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('spire'); - }); - - it('should render title', - () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('.content span')?.textContent).toContain('spire app is running!'); - }); - }); diff --git a/MyOffice.SPA/src/app/app.component.ts b/MyOffice.SPA/src/app/app.component.ts deleted file mode 100644 index 06e14b7..0000000 --- a/MyOffice.SPA/src/app/app.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { Event, Router, RouterOutlet, NavigationStart, NavigationEnd } from '@angular/router'; -import { PageLoaderComponent } from './layout/page-loader/page-loader.component'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'], - standalone: true, - imports: [RouterOutlet, PageLoaderComponent], -}) -export class AppComponent { - currentUrl!: string; - private readonly destroyRef = inject(DestroyRef); - - constructor(public _router: Router) { - this._router.events.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((routerEvent: Event) => { - if (routerEvent instanceof NavigationStart) { - this.currentUrl = routerEvent.url.substring( - routerEvent.url.lastIndexOf('/') + 1 - ); - } - if (routerEvent instanceof NavigationEnd) { - /* empty */ - } - window.scrollTo(0, 0); - }); - } -} diff --git a/MyOffice.SPA/src/app/app.config.ts b/MyOffice.SPA/src/app/app.config.ts deleted file mode 100644 index 4fd0b7f..0000000 --- a/MyOffice.SPA/src/app/app.config.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { ApplicationConfig, importProvidersFrom } from '@angular/core'; -import { LocationStrategy, HashLocationStrategy } from '@angular/common'; -import { HTTP_INTERCEPTORS, HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; - -// libs -import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; -import { TranslateHttpLoader } from '@ngx-translate/http-loader'; -import { LoadingBarRouterModule } from '@ngx-loading-bar/router'; -import { LoadingBarHttpClientModule } from '@ngx-loading-bar/http-client'; -import { NgScrollbarModule } from 'ngx-scrollbar'; - -// app -import { CoreModule } from './core/core.module'; -import { AppRoutingModule } from './app-routing.module'; -import { ErrorInterceptor } from './core/interceptor/error.interceptor'; -import { UpdateDateHttpInterceptor } from './core/interceptor/update.date.http.interceptor '; - -export function createTranslateLoader(http: HttpClient) { - return new TranslateHttpLoader(http, 'assets/i18n/', '.json'); -} - -export const appConfig: ApplicationConfig = { - providers: [ - importProvidersFrom( - BrowserAnimationsModule, - AppRoutingModule, - LoadingBarHttpClientModule, - LoadingBarRouterModule, - NgScrollbarModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: createTranslateLoader, - deps: [HttpClient], - }, - }), - // core & shared - CoreModule, - ), - { provide: LocationStrategy, useClass: HashLocationStrategy }, - // Bearer tokens: angular-oauth2-oidc resourceServer (AuthModuleConfig.sendAccessToken) - { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }, - { provide: HTTP_INTERCEPTORS, useClass: UpdateDateHttpInterceptor, multi: true }, - provideHttpClient(withInterceptorsFromDi()), - ], -}; diff --git a/MyOffice.SPA/src/app/authentication/authentication-routing.module.ts b/MyOffice.SPA/src/app/authentication/authentication-routing.module.ts deleted file mode 100644 index ad46f3d..0000000 --- a/MyOffice.SPA/src/app/authentication/authentication-routing.module.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { SigninComponent } from './signin/signin.component'; -import { SignupComponent } from './signup/signup.component'; -import { ForgotPasswordComponent } from './forgot-password/forgot-password.component'; -import { LockedComponent } from './locked/locked.component'; -import { Page404Component } from './page404/page404.component'; -import { Page500Component } from './page500/page500.component'; - -const routes: Routes = [ - { - path: '', - redirectTo: 'signin', - pathMatch: 'full', - }, - { - path: 'signin', - component: SigninComponent, - }, - { - path: 'signup', - component: SignupComponent, - }, - { - path: 'forgot-password', - component: ForgotPasswordComponent, - }, - { - path: 'locked', - component: LockedComponent, - }, - { - path: 'page404', - component: Page404Component, - }, - { - path: 'page500', - component: Page500Component, - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class AuthenticationRoutingModule { -} diff --git a/MyOffice.SPA/src/app/authentication/authentication.module.ts b/MyOffice.SPA/src/app/authentication/authentication.module.ts deleted file mode 100644 index 0886973..0000000 --- a/MyOffice.SPA/src/app/authentication/authentication.module.ts +++ /dev/null @@ -1,50 +0,0 @@ -// angular -import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; - -// libs -import { GoogleSigninButtonModule } from '@abacritt/angularx-social-login'; - -// app -import { AuthenticationRoutingModule } from './authentication-routing.module'; -import { Page500Component } from './page500/page500.component'; -import { Page404Component } from './page404/page404.component'; -import { SigninComponent } from './signin/signin.component'; -import { SignupComponent } from './signup/signup.component'; -import { LockedComponent } from './locked/locked.component'; -import { ForgotPasswordComponent } from './forgot-password/forgot-password.component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - AuthenticationRoutingModule, - MatFormFieldModule, - MatInputModule, - MatIconModule, - MatButtonModule, - GoogleSigninButtonModule, - ], - declarations: [ - Page500Component, - Page404Component, - SigninComponent, - SignupComponent, - LockedComponent, - ForgotPasswordComponent, - ], - providers: [ - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ] -}) -export class AuthenticationModule { -} diff --git a/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.html b/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.html deleted file mode 100644 index 68d6049..0000000 --- a/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.html +++ /dev/null @@ -1,45 +0,0 @@ -
-
-
-
-
-
-
-
-
-

Reset Password

- -
-
-
- - Enter your registered email address. - - - Email - - mail - - Please enter a valid email address - - -
-
-
- -
-
- -
-
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.scss b/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.spec.ts b/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.spec.ts deleted file mode 100644 index cc3bdc0..0000000 --- a/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ForgotPasswordComponent } from './forgot-password.component'; -describe('ForgotPasswordComponent', - () => { - let component: ForgotPasswordComponent; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ForgotPasswordComponent], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(ForgotPasswordComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.ts b/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.ts deleted file mode 100644 index eaac269..0000000 --- a/MyOffice.SPA/src/app/authentication/forgot-password/forgot-password.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { - FormBuilder, - FormControl, - FormGroup, - Validators, -} from '@angular/forms'; - -type ForgotPasswordForm = { - email: FormControl; -}; - -@Component({ - selector: 'app-forgot-password', - templateUrl: './forgot-password.component.html', - styleUrls: ['./forgot-password.component.scss'], -}) -export class ForgotPasswordComponent implements OnInit { - authForm!: FormGroup; - submitted = false; - returnUrl!: string; - - constructor( - private formBuilder: FormBuilder, - private route: ActivatedRoute, - private router: Router - ) { - } - - ngOnInit() { - this.authForm = this.formBuilder.group({ - email: [ - '', - [Validators.required, Validators.email, Validators.minLength(5)], - ], - }); - // get return url from route parameters or default to '/' - this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; - } - - get f() { - return this.authForm.controls; - } - - onSubmit() { - this.submitted = true; - // stop here if form is invalid - if (this.authForm.invalid) { - return; - } else { - this.router.navigate(['/dashboard/rests']); - } - } -} diff --git a/MyOffice.SPA/src/app/authentication/locked/locked.component.html b/MyOffice.SPA/src/app/authentication/locked/locked.component.html deleted file mode 100644 index a0db47e..0000000 --- a/MyOffice.SPA/src/app/authentication/locked/locked.component.html +++ /dev/null @@ -1,58 +0,0 @@ -
-
-
-
-
-
-
-
-
-
-
-
- User -
-
- - {{userFullName}} - -
-

- Locked -

-
-
-
- - Enter your password here. - - - Password - - - {{hide ? 'visibility_off' : 'visibility'}} - - - Password is required - - -
-
-
- -
- -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/authentication/locked/locked.component.scss b/MyOffice.SPA/src/app/authentication/locked/locked.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/authentication/locked/locked.component.spec.ts b/MyOffice.SPA/src/app/authentication/locked/locked.component.spec.ts deleted file mode 100644 index 88664c6..0000000 --- a/MyOffice.SPA/src/app/authentication/locked/locked.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { LockedComponent } from './locked.component'; -describe('LockedComponent', - () => { - let component: LockedComponent; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [LockedComponent], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(LockedComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/authentication/locked/locked.component.ts b/MyOffice.SPA/src/app/authentication/locked/locked.component.ts deleted file mode 100644 index 92a034a..0000000 --- a/MyOffice.SPA/src/app/authentication/locked/locked.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { AuthService } from 'src/app/core/service/auth.service'; - -type LockedForm = { - password: FormControl; -}; - -@Component({ - selector: 'app-locked', - templateUrl: './locked.component.html', - styleUrls: ['./locked.component.scss'], -}) -export class LockedComponent implements OnInit { - authForm!: FormGroup; - submitted = false; - userImg!: string; - userFullName!: string; - hide = true; - - constructor( - private formBuilder: FormBuilder, - private router: Router, - private authService: AuthService - ) { - } - - ngOnInit() { - this.authForm = this.formBuilder.group({ - password: ['', Validators.required], - }); - - this.userImg = this.authService.currentUserValue.img || 'assets/images/user/admin.jpg'; - - this.userFullName = - this.authService.currentUserValue.firstName + - ' ' + - this.authService.currentUserValue.lastName; - } - - get f() { - return this.authForm.controls; - } - - onSubmit() { - this.submitted = true; - // stop here if form is invalid - if (this.authForm.invalid) { - return; - } else { - this.router.navigate(['/dashboard/rests']); - } - } -} diff --git a/MyOffice.SPA/src/app/authentication/page404/page404.component.html b/MyOffice.SPA/src/app/authentication/page404/page404.component.html deleted file mode 100644 index 29e5aeb..0000000 --- a/MyOffice.SPA/src/app/authentication/page404/page404.component.html +++ /dev/null @@ -1,37 +0,0 @@ -
-
-
-
-
-
-
-
-
-
- - 404 - - - Looks Like You're Lost - - - The Page You Are Looking For Not Available! - -
- -
- -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/authentication/page404/page404.component.scss b/MyOffice.SPA/src/app/authentication/page404/page404.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/authentication/page404/page404.component.spec.ts b/MyOffice.SPA/src/app/authentication/page404/page404.component.spec.ts deleted file mode 100644 index f4a6b82..0000000 --- a/MyOffice.SPA/src/app/authentication/page404/page404.component.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { Page404Component } from './page404.component'; - -describe('Page404Component', - () => { - let component: Page404Component; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [Page404Component], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(Page404Component); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/authentication/page404/page404.component.ts b/MyOffice.SPA/src/app/authentication/page404/page404.component.ts deleted file mode 100644 index f3ba68c..0000000 --- a/MyOffice.SPA/src/app/authentication/page404/page404.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-page404', - templateUrl: './page404.component.html', - styleUrls: ['./page404.component.scss'], -}) -export class Page404Component { - constructor() { - // constructor - } -} diff --git a/MyOffice.SPA/src/app/authentication/page500/page500.component.html b/MyOffice.SPA/src/app/authentication/page500/page500.component.html deleted file mode 100644 index ce00254..0000000 --- a/MyOffice.SPA/src/app/authentication/page500/page500.component.html +++ /dev/null @@ -1,34 +0,0 @@ -
-
-
-
-
-
-
-
-
-
- - 500 - - - Oops, Something went wrong. Please try after some times. - -
- -
- -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/authentication/page500/page500.component.scss b/MyOffice.SPA/src/app/authentication/page500/page500.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/authentication/page500/page500.component.spec.ts b/MyOffice.SPA/src/app/authentication/page500/page500.component.spec.ts deleted file mode 100644 index adaba77..0000000 --- a/MyOffice.SPA/src/app/authentication/page500/page500.component.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { Page500Component } from './page500.component'; - -describe('Page500Component', - () => { - let component: Page500Component; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [Page500Component], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(Page500Component); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/authentication/page500/page500.component.ts b/MyOffice.SPA/src/app/authentication/page500/page500.component.ts deleted file mode 100644 index 589f767..0000000 --- a/MyOffice.SPA/src/app/authentication/page500/page500.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-page500', - templateUrl: './page500.component.html', - styleUrls: ['./page500.component.scss'], -}) -export class Page500Component { - constructor() { - // constructor - } -} diff --git a/MyOffice.SPA/src/app/authentication/signin/signin.component.html b/MyOffice.SPA/src/app/authentication/signin/signin.component.html deleted file mode 100644 index 5493ecf..0000000 --- a/MyOffice.SPA/src/app/authentication/signin/signin.component.html +++ /dev/null @@ -1,114 +0,0 @@ -
-
-
-
-
-
-
-
-
-

-
Welcome to ase.com.ua
-
angular/asp.net core template
-

- - -
-
-
- - Email - - mail - - Email is required - - -
-
-
-
- - Password - - - - {{hide ? 'visibility_off' : 'visibility'}} - - - - Password is required - - -
-
-
-
- -
- Forgot Password? -
- -
{{error}}
- -
-
- -
-
-
- - -
-
-
-
-
diff --git a/MyOffice.SPA/src/app/authentication/signin/signin.component.scss b/MyOffice.SPA/src/app/authentication/signin/signin.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/authentication/signin/signin.component.spec.ts b/MyOffice.SPA/src/app/authentication/signin/signin.component.spec.ts deleted file mode 100644 index 639f76b..0000000 --- a/MyOffice.SPA/src/app/authentication/signin/signin.component.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { SigninComponent } from './signin.component'; - -describe('SigninComponent', - () => { - let component: SigninComponent; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [SigninComponent], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(SigninComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/authentication/signin/signin.component.ts b/MyOffice.SPA/src/app/authentication/signin/signin.component.ts deleted file mode 100644 index 374e5d3..0000000 --- a/MyOffice.SPA/src/app/authentication/signin/signin.component.ts +++ /dev/null @@ -1,117 +0,0 @@ -// angular -import { Component, OnInit } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; - -// libs -import { SocialAuthService } from '@abacritt/angularx-social-login'; - -// app -import { AuthService } from 'src/app/core/service/auth.service'; -import { UnsubscribeOnDestroyAdapter } from 'src/app/shared/UnsubscribeOnDestroyAdapter'; -import { getSafeRedirectUrl } from 'src/app/core/utils/safe-redirect'; -import { environment } from '../../../environments/environment'; - -type SigninForm = { - username: FormControl; - password: FormControl; -}; - -@Component({ - selector: 'app-signin', - templateUrl: './signin.component.html', - styleUrls: ['./signin.component.scss'], -}) -export class SigninComponent extends UnsubscribeOnDestroyAdapter -implements OnInit { - authForm!: FormGroup; - submitted = false; - loading = false; - error?= ''; - hide = true; - allowGoogle: boolean; - allowAuth: boolean; - - constructor( - private formBuilder: FormBuilder, - private router: Router, - private route: ActivatedRoute, - private authService: AuthService, - ) { - super(); - - this.allowGoogle = !!(environment.externalLogins && - environment.externalLogins.google && - environment.externalLogins.google.clientId); - - this.allowAuth = !!(environment.externalLogins && - environment.externalLogins.auth0 && - environment.externalLogins.auth0.clientId); - } - - ngOnInit() { - this.authForm = this.formBuilder.group({ - username: ['', Validators.required], - password: ['', Validators.required], - }); - - this.subs.sink = this.authService.isAuthenticated$.subscribe(isAuthenticated => { - if (isAuthenticated) { - this.router.navigate([this.getRedirect() || '/dashboard/rests']); - } - }); - } - - onSubmit() { - if (this.authForm.invalid) { - this.error = 'Username and Password not valid!'; - return; - } - - this.submitted = true; - this.loading = true; - this.error = ''; - - var user = { - username: this.authForm.controls.username.value!, - password: this.authForm.controls.password.value! - }; - - this.subs.sink = this.authService - .login(user) - .subscribe({ - next: (resp) => { - if (!resp.success) { - this.error = 'Invalid Login'; - if (!resp.success && resp.error?.code === 'invalid_grant') { - this.error = 'Invalid username or password'; - } - this.submitted = false; - this.loading = false; - } - }, - error: (error) => { - this.error = 'Invalid username or password'; - this.submitted = false; - this.loading = false; - }, - }); - } - - loginAuth0() { - this.subs.sink = this.authService.loginAuth0().subscribe(resp => { - if (!resp.success) { - this.error = 'Invalid login'; - } - }); - } - - private getRedirect(): string | undefined { - const raw = this.route.snapshot.queryParams['r'] as string | undefined; - if (!raw) { - return undefined; - } - const safe = getSafeRedirectUrl(raw, ''); - return safe || undefined; - } -} diff --git a/MyOffice.SPA/src/app/authentication/signup/signup.component.html b/MyOffice.SPA/src/app/authentication/signup/signup.component.html deleted file mode 100644 index e9eb396..0000000 --- a/MyOffice.SPA/src/app/authentication/signup/signup.component.html +++ /dev/null @@ -1,128 +0,0 @@ -
-
-
-
-
-
-
-
-
-

Sign Up

- -
-
-
- - Email - - mail - - Please enter a valid email address - - -
-
-
-
- - Password - - - - {{hide ? 'visibility_off' : 'visibility'}} - - - - Password is required - - - Password must be at least 8 characters - - - Use upper, lower, digit and special character - - -
-
-
-
- - Confirm Password - - - - {{chide ? 'visibility_off' : 'visibility'}} - - - - Confirm Password is required - - -
-
-
-
- Passwords do not match -
-
-
-
- {{error.description}} -
-
-
-
- - Already Registered? - - Login - - -
-
-
- -
-
- - -
-
-
-
-
diff --git a/MyOffice.SPA/src/app/authentication/signup/signup.component.scss b/MyOffice.SPA/src/app/authentication/signup/signup.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/authentication/signup/signup.component.spec.ts b/MyOffice.SPA/src/app/authentication/signup/signup.component.spec.ts deleted file mode 100644 index e43607c..0000000 --- a/MyOffice.SPA/src/app/authentication/signup/signup.component.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { SignupComponent } from './signup.component'; - -describe('SignupComponent', - () => { - let component: SignupComponent; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [SignupComponent], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(SignupComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/authentication/signup/signup.component.ts b/MyOffice.SPA/src/app/authentication/signup/signup.component.ts deleted file mode 100644 index ceb5d1a..0000000 --- a/MyOffice.SPA/src/app/authentication/signup/signup.component.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Component, DestroyRef, inject, OnInit } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { Router, ActivatedRoute } from '@angular/router'; -import { AbstractControl, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { GeneralErrorModel } from '../../core/models/general-error.model'; -import { AuthService } from '../../core/service/auth.service'; - -type SignupForm = { - email: FormControl; - password: FormControl; - cpassword: FormControl; -}; - -@Component({ - selector: 'app-signup', - templateUrl: './signup.component.html', - styleUrls: ['./signup.component.scss'], -}) -export class SignupComponent implements OnInit { - authForm!: FormGroup; - submitted = false; - returnUrl!: string; - hide = true; - chide = true; - generalError?: GeneralErrorModel; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private formBuilder: FormBuilder, - private route: ActivatedRoute, - private router: Router, - private authService: AuthService - ) { - - } - - ngOnInit() { - this.authForm = this.formBuilder.group({ - email: ['', [Validators.required, Validators.email, Validators.minLength(5)]], - password: [ - '', - [ - Validators.required, - Validators.minLength(8), - Validators.pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).+$/), - ], - ], - cpassword: ['', Validators.required], - }, { - validators: (group: AbstractControl) => { - const password = group.get('password')?.value; - const confirm = group.get('cpassword')?.value; - return password && confirm && password !== confirm - ? { passwordMismatch: true } - : null; - }, - }); - // get return url from route parameters or default to '/' - this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; - } - - get f() { - return this.authForm.controls; - } - - onSubmit() { - this.submitted = true; - // stop here if form is invalid - if (this.authForm.invalid) { - return; - } - - if (this.authForm.hasError('passwordMismatch')) { - return; - } - - this.authService.register({ - username: this.authForm.get('email')!.value!, - password: this.authForm.get('password')!.value!, - confirmPassword: this.authForm.get('cpassword')!.value!, - }).pipe(takeUntilDestroyed(this.destroyRef)).subscribe( - resp => { - if (!resp.succeeded) { - this.generalError = resp as GeneralErrorModel; - return; - } - - // Auto sign-in with email+password after successful register - this.authService.login({ - username: this.authForm.get('email')!.value!, - password: this.authForm.get('password')!.value!, - }).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(login => { - if (login.success) { - this.router.navigate([this.returnUrl || '/dashboard/rests']); - } else { - this.router.navigate(['authentication/signin']); - } - }); - }, - err => { - this.generalError = err.error as GeneralErrorModel; - } - ); - } - - loginAuth0() { - this.authService.loginAuth0() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - }); - } -} diff --git a/MyOffice.SPA/src/app/config.external-login.ts b/MyOffice.SPA/src/app/config.external-login.ts deleted file mode 100644 index bccd451..0000000 --- a/MyOffice.SPA/src/app/config.external-login.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { SocialAuthServiceConfig } from '@abacritt/angularx-social-login'; -import { GoogleLoginProvider } from '@abacritt/angularx-social-login'; -import { FacebookLoginProvider } from '@abacritt/angularx-social-login'; -import { MicrosoftLoginProvider } from '@abacritt/angularx-social-login'; - -import { environment } from '../environments/environment'; - -export class ExternalLoginConfig { - - static readonly GOOGLE = 'google'; - static readonly AUTH0 = 'auth0'; - static readonly FACEBOOK = 'facebook'; - static readonly MICROSOFT = 'microsoft'; - - static getConfiguredProviders() { - return [ - { - provider: ExternalLoginConfig.GOOGLE, - name: 'Google', - }, - { - provider: ExternalLoginConfig.AUTH0, - name: 'Auth0', - }, - /*{ - provider: ExternalLoginConfig.FACEBOOK, - name: "FaceBook", - }, - { - provider: ExternalLoginConfig.MICROSOFT, - name: "Microsoft", - },*/ - ]; - } - - static getSocialConfig(): SocialAuthServiceConfig { - var providers = []; - - if (environment.externalLogins && - environment.externalLogins.google && - environment.externalLogins.google.clientId - ) { - providers.push({ - id: GoogleLoginProvider.PROVIDER_ID, - provider: new GoogleLoginProvider( - environment.externalLogins.google.clientId, - { scopes: 'email', } - ) - }); - } - return { - autoLogin: false, - providers: providers, - onError: (err) => { - console.error(err); - } - }; - } - - static getAuth0Config() { - return { - clientId: environment.externalLogins.auth0.clientId, - domain: environment.externalLogins.auth0.domain, - }; - } -} diff --git a/MyOffice.SPA/src/app/config.oidc.ts b/MyOffice.SPA/src/app/config.oidc.ts deleted file mode 100644 index 292097b..0000000 --- a/MyOffice.SPA/src/app/config.oidc.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { AuthConfig } from 'angular-oauth2-oidc'; -import { OAuthModuleConfig } from 'angular-oauth2-oidc'; - -import { environment } from '../environments/environment'; - -/** Public origin for same-origin deploys when environment URLs are left empty. */ -function publicOrigin(): string { - return window.location.origin; -} - -function resolveIdentityServer(): string { - const configured = (environment.identityServer ?? '').trim(); - if (configured) { - return configured.endsWith('/') ? configured : `${configured}/`; - } - return `${publicOrigin()}/`; -} - -function resolveAllowedUrls(): string[] { - const configured = environment.allowedUrls ?? []; - if (configured.length > 0) { - return configured; - } - const origin = publicOrigin(); - const api = (environment.apiUrl ?? '').trim().replace(/\/$/, ''); - return api ? [origin, api] : [origin]; -} - -export const AuthCodeFlowConfig: AuthConfig = { - // Url of the Identity Provider - issuer: resolveIdentityServer(), - // Local/Docker HTTP demos can set environment.requireHttps = false. - requireHttps: (environment as { requireHttps?: boolean }).requireHttps ?? environment.production, - strictDiscoveryDocumentValidation: - (environment as { requireHttps?: boolean }).requireHttps ?? environment.production, - - // URL of the SPA to redirect the user to after login - redirectUri: window.location.origin + '/', - // Password/external grants issue refresh tokens; no cookie session for iframe silent refresh. - useSilentRefresh: false, - sessionChecksEnabled: false, - timeoutFactor: 0.75, - - clientId: 'angulartemplate_spa', - - // Authorization Code + PKCE for interactive OIDC; email/password still uses ROPC (see docs/AUTH.md). - responseType: 'code', - disablePKCE: false, - - // offline_access → refresh_token (used by setupAutomaticSilentRefresh) - scope: 'openid profile email api offline_access', - - showDebugInformation: !environment.production, -}; - -export const AuthModuleConfig: OAuthModuleConfig = { - resourceServer: { - allowedUrls: resolveAllowedUrls(), - sendAccessToken: true, - } -}; diff --git a/MyOffice.SPA/src/app/config/config.service.ts b/MyOffice.SPA/src/app/config/config.service.ts deleted file mode 100644 index 01aa1b5..0000000 --- a/MyOffice.SPA/src/app/config/config.service.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Injectable } from '@angular/core'; -import { InConfiguration } from '../core/models/config.interface'; - -@Injectable({ - providedIn: 'root', -}) -export class ConfigService { - configData!: InConfiguration; - - constructor() { - this.setConfigData(); - } - - setConfigData() { - this.configData = { - layout: { - rtl: false, // options: true & false - variant: 'light', // options: light & dark - theme_color: 'white', // options: white, black, purple, blue, cyan, green, orange - logo_bg_color: 'white', // options: white, black, purple, blue, cyan, green, orange - sidebar: { - collapsed: false, // options: true & false - backgroundColor: 'light', // options: light & dark - }, - }, - }; - } -} diff --git a/MyOffice.SPA/src/app/config/ui.config.ts b/MyOffice.SPA/src/app/config/ui.config.ts deleted file mode 100644 index d379726..0000000 --- a/MyOffice.SPA/src/app/config/ui.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** Placement of Cancel/Save (and similar) actions in Material dialogs. */ -export type ModalButtonsPosition = 'top' | 'bottom'; - -export const UI_CONFIG = { - /** Dialog action buttons: `top` (next to title) or `bottom` (under content). */ - modal_buttons: 'top' as ModalButtonsPosition, -}; diff --git a/MyOffice.SPA/src/app/core/core.module.ts b/MyOffice.SPA/src/app/core/core.module.ts deleted file mode 100644 index af58986..0000000 --- a/MyOffice.SPA/src/app/core/core.module.ts +++ /dev/null @@ -1,63 +0,0 @@ -// angular -import { NgModule } from '@angular/core'; -import { Optional } from '@angular/core'; -import { SkipSelf } from '@angular/core'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { APP_INITIALIZER } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -// libs -import { OAuthModule, OAuthModuleConfig, OAuthStorage } from 'angular-oauth2-oidc'; -import { AuthConfig } from 'angular-oauth2-oidc'; -import { AuthModule } from '@auth0/auth0-angular'; -import { SocialLoginModule } from '@abacritt/angularx-social-login'; - -// app -import { AuthGuard } from './guard/auth.guard'; -import { RightSidebarService } from './service/rightsidebar.service'; -import { AuthService, authAppInitializerFactory } from './service/auth.service'; -import { DirectionService } from './service/direction.service'; -import { throwIfAlreadyLoaded } from './guard/module-import.guard'; -import { OidcHelperService } from './service/oidc-helper.service'; -import { AuthCodeFlowConfig, AuthModuleConfig } from '../config.oidc'; -import { SubjectExtensions } from './extensions/general.extensions'; -import { ExternalLoginConfig } from '../config.external-login'; -import { AccountCategoryService } from '../services/account.category.service'; -import { AccountService } from '../services/account.service'; - -export function storageFactory(): OAuthStorage { - return localStorage; -} - -@NgModule({ - declarations: [], - imports: [ - CommonModule, - SocialLoginModule, - OAuthModule.forRoot(), - AuthModule.forRoot(ExternalLoginConfig.getAuth0Config()), - ], - providers: [ - { provide: APP_INITIALIZER, useFactory: authAppInitializerFactory, deps: [AuthService], multi: true }, - { provide: AuthConfig, useValue: AuthCodeFlowConfig }, - { provide: OAuthModuleConfig, useValue: AuthModuleConfig }, - { provide: OAuthStorage, useFactory: storageFactory }, - { provide: 'SocialAuthServiceConfig', useValue: ExternalLoginConfig.getSocialConfig() }, - RightSidebarService, - AuthGuard, - AuthService, - DirectionService, - OidcHelperService, - SubjectExtensions, - AccountCategoryService, - AccountService, - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ] -}) -export class CoreModule { - constructor(@Optional() @SkipSelf() parentModule: CoreModule) { - throwIfAlreadyLoaded(parentModule, 'CoreModule'); - } -} diff --git a/MyOffice.SPA/src/app/core/extensions/general.extensions.ts b/MyOffice.SPA/src/app/core/extensions/general.extensions.ts deleted file mode 100644 index 515c2db..0000000 --- a/MyOffice.SPA/src/app/core/extensions/general.extensions.ts +++ /dev/null @@ -1,42 +0,0 @@ -// angular -import { ActivatedRoute } from '@angular/router'; - -// libs -import { BehaviorSubject, Observable, Subject, of, throwError, from, combineLatest } from 'rxjs'; - -import { getSafeRedirectUrl } from '../utils/safe-redirect'; - -export { } - -declare global { - interface RouterExtensions { - addDays(days: number): Date; - } - } - -export class ExActivatedRoute extends ActivatedRoute { - - getCurrentRoute(): string { - const raw = this.snapshot.queryParams['r'] as string | undefined; - return getSafeRedirectUrl(raw); - } -} - -interface Action { - (item: T): void; -} - -interface Func { - (item: T): TResult; -} - -export class SubjectExtensions { - - static start(start: Action>): Subject { - var result = new Subject(); - - start(result); - - return result; - } -} diff --git a/MyOffice.SPA/src/app/core/extensions/router.extensions.ts b/MyOffice.SPA/src/app/core/extensions/router.extensions.ts deleted file mode 100644 index ed347f0..0000000 --- a/MyOffice.SPA/src/app/core/extensions/router.extensions.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ActivatedRoute } from '@angular/router'; -import { getSafeRedirectUrl } from '../utils/safe-redirect'; - -export { } - -declare global { - interface RouterExtensions { - addDays(days: number): Date; - } - } - -export class ExActivatedRoute extends ActivatedRoute { - - getCurrentRoute(): string { - const raw = this.snapshot.queryParams['r'] as string | undefined; - return getSafeRedirectUrl(raw); - } -} diff --git a/MyOffice.SPA/src/app/core/guard/auth.guard.ts b/MyOffice.SPA/src/app/core/guard/auth.guard.ts deleted file mode 100644 index ce462cb..0000000 --- a/MyOffice.SPA/src/app/core/guard/auth.guard.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; - -import { AuthService } from '../service/auth.service'; - -@Injectable({ - providedIn: 'root', -}) -export class AuthGuard { - constructor( - private authService: AuthService, - private router: Router - ) { - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { - if (this.authService.isAuthenticated) { - return true; - } - this.router.navigate(['/authentication/signin'], { queryParams: { r: encodeURIComponent(state.url) } }); - return false; - } -} diff --git a/MyOffice.SPA/src/app/core/guard/module-import.guard.ts b/MyOffice.SPA/src/app/core/guard/module-import.guard.ts deleted file mode 100644 index 3526a01..0000000 --- a/MyOffice.SPA/src/app/core/guard/module-import.guard.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CoreModule } from '../core.module'; - -export function throwIfAlreadyLoaded( - parentModule: CoreModule, - moduleName: string -) { - if (parentModule) { - throw new Error( - `${moduleName} has already been loaded. Import ${moduleName} modules in the AppModule only.` - ); - } -} diff --git a/MyOffice.SPA/src/app/core/interceptor/error.interceptor.ts b/MyOffice.SPA/src/app/core/interceptor/error.interceptor.ts deleted file mode 100644 index 33c54b4..0000000 --- a/MyOffice.SPA/src/app/core/interceptor/error.interceptor.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { AuthService } from '../service/auth.service'; -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -@Injectable() -export class ErrorInterceptor implements HttpInterceptor { - constructor( - private authenticationService: AuthService, - private router: Router - ) {} - - intercept( - request: HttpRequest, - next: HttpHandler - ): Observable> { - return next.handle(request).pipe( - catchError((err) => { - if (err.status === 401) { - const returnUrl = this.router.url; - this.authenticationService.logout(); - void this.router.navigate(['/authentication/signin'], { - queryParams: returnUrl && returnUrl !== '/' - ? { r: returnUrl } - : undefined, - }); - } - - let error = err.error || err.message || err.statusText; - - if (!error) { - console.log('not parsed error', err); - } - return throwError(() => error); - }) - ); - } -} diff --git a/MyOffice.SPA/src/app/core/interceptor/fake-backend.ts b/MyOffice.SPA/src/app/core/interceptor/fake-backend.ts deleted file mode 100644 index 9b64489..0000000 --- a/MyOffice.SPA/src/app/core/interceptor/fake-backend.ts +++ /dev/null @@ -1,101 +0,0 @@ -/*import { Injectable } from '@angular/core'; -import { - HttpRequest, - HttpResponse, - HttpHandler, - HttpEvent, - HttpInterceptor, - HTTP_INTERCEPTORS, -} from '@angular/common/http'; -import { Observable, of, throwError } from 'rxjs'; -import { mergeMap } from 'rxjs/operators'; -import { UserModel } from '../models/user.model'; - -const users: UserModel[] = [ - { - id: 'fake-user', - img: 'assets/images/user/admin.jpg', - username: 'admin@software.com', - //password: 'admin@123', - firstName: 'Sarah', - lastName: 'Smith', - token: 'admin-token', - }, -]; - -@Injectable() -export class FakeBackendInterceptor implements HttpInterceptor { - intercept( - request: HttpRequest, - next: HttpHandler - ): Observable> { - const { url, method, headers, body } = request; - // wrap in delayed observable to simulate server api call - return of(null).pipe(mergeMap(handleRoute)); - - function handleRoute() { - switch (true) { - case url.endsWith('/authenticate') && method === 'POST': - return authenticate(); - default: - // pass through any requests not handled above - return next.handle(request); - } - } - - // route functions - - function authenticate() { - const { username, password } = body; - const user = users.find( - (x) => x.username === username && x.password === password - ); - if (!user) { - return error('Username or password is incorrect'); - } - return ok({ - id: user.id, - username: user.username, - img: user.img, - firstName: user.firstName, - lastName: user.lastName, - token: user.token, - }); - } - - // helper functions - - function ok(body?: { - id: string; - username: string; - img?: string; - firstName?: string; - lastName?: string; - token?: string; - }) { - return of(new HttpResponse({ status: 200, body })); - } - - function error(message: string) { - return throwError({ error: { message } }); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - function unauthorized() { - return throwError({ status: 401, error: { message: 'Unauthorised' } }); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - function isLoggedIn() { - return headers.get('Authorization') === 'Bearer fake-jwt-token'; - } - } -} - -export const fakeBackendProvider = { - // use fake backend in place of Http service for backend-less development - provide: HTTP_INTERCEPTORS, - useClass: FakeBackendInterceptor, - multi: true, -}; -*/ diff --git a/MyOffice.SPA/src/app/core/interceptor/update.date.http.interceptor .ts b/MyOffice.SPA/src/app/core/interceptor/update.date.http.interceptor .ts deleted file mode 100644 index 594334e..0000000 --- a/MyOffice.SPA/src/app/core/interceptor/update.date.http.interceptor .ts +++ /dev/null @@ -1,42 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { HttpInterceptor } from '@angular/common/http'; -import { HttpRequest } from '@angular/common/http'; -import { HttpHandler } from '@angular/common/http'; -import { HttpEvent } from '@angular/common/http'; - -// libs -import moment from 'moment'; - - -@Injectable() -export class UpdateDateHttpInterceptor implements HttpInterceptor { - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - if (request.method === 'POST' || request.method === 'PUT') { - this.shiftDates(request.body); - } - - return next.handle(request); - } - - shiftDates(body: any) { - if (body === null || body === undefined) { - return body; - } - - if (typeof body !== 'object') { - return body; - } - - for (const key of Object.keys(body)) { - const value = body[key]; - if (value instanceof Date) { - body[key] = moment(value).utcOffset(0, true).format(); - } else if (typeof value === 'object') { - this.shiftDates(value); - } - } - } -} diff --git a/MyOffice.SPA/src/app/core/models/config.interface.ts b/MyOffice.SPA/src/app/core/models/config.interface.ts deleted file mode 100644 index fea99e3..0000000 --- a/MyOffice.SPA/src/app/core/models/config.interface.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface InConfiguration { - layout: { - rtl: boolean; - variant: string; - theme_color: string; - logo_bg_color: string; - sidebar: { - collapsed: boolean; - backgroundColor: string; - }; - }; -} diff --git a/MyOffice.SPA/src/app/core/models/general-error.model.ts b/MyOffice.SPA/src/app/core/models/general-error.model.ts deleted file mode 100644 index 2cbcb47..0000000 --- a/MyOffice.SPA/src/app/core/models/general-error.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface GeneralErrorModel { - //succeeded?: boolean; - code?: string; - description?: string; - errors?: GeneralErrorModel[]; -} diff --git a/MyOffice.SPA/src/app/core/models/general-result.model.ts b/MyOffice.SPA/src/app/core/models/general-result.model.ts deleted file mode 100644 index 5f3950d..0000000 --- a/MyOffice.SPA/src/app/core/models/general-result.model.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { GeneralErrorModel } from './general-error.model'; - -export interface GeneralResultModel { - success: boolean; - error?: GeneralErrorModel; - data?: any; -} diff --git a/MyOffice.SPA/src/app/core/models/login.model.ts b/MyOffice.SPA/src/app/core/models/login.model.ts deleted file mode 100644 index 2de9c3c..0000000 --- a/MyOffice.SPA/src/app/core/models/login.model.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface LoginModel { - username: string; - password: string; -} diff --git a/MyOffice.SPA/src/app/core/models/register.model.ts b/MyOffice.SPA/src/app/core/models/register.model.ts deleted file mode 100644 index ab84657..0000000 --- a/MyOffice.SPA/src/app/core/models/register.model.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface RegisterModel { - username: string; - password: string; - confirmPassword: string; -} diff --git a/MyOffice.SPA/src/app/core/models/selectable.model.spec.ts b/MyOffice.SPA/src/app/core/models/selectable.model.spec.ts deleted file mode 100644 index 1c4ee7b..0000000 --- a/MyOffice.SPA/src/app/core/models/selectable.model.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { SelectableModel } from './selectable.model'; - -describe('SelectableModel', () => { - it('should create an instance', () => { - expect(new SelectableModel()).toBeTruthy(); - }); -}); diff --git a/MyOffice.SPA/src/app/core/models/selectable.model.ts b/MyOffice.SPA/src/app/core/models/selectable.model.ts deleted file mode 100644 index bba11c1..0000000 --- a/MyOffice.SPA/src/app/core/models/selectable.model.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface ISelectableModel { - model: T; - selected: boolean; -} diff --git a/MyOffice.SPA/src/app/core/models/user-profile.model.ts b/MyOffice.SPA/src/app/core/models/user-profile.model.ts deleted file mode 100644 index ce03098..0000000 --- a/MyOffice.SPA/src/app/core/models/user-profile.model.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface UserProfileModel { - id: string; - email?: string; - phone?: string; - firstName?: string; - lastName?: string; - fullName?: string; - currency?: string; -} diff --git a/MyOffice.SPA/src/app/core/models/user.model.ts b/MyOffice.SPA/src/app/core/models/user.model.ts deleted file mode 100644 index 7a9298e..0000000 --- a/MyOffice.SPA/src/app/core/models/user.model.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface UserModel { - id: string; - userName: string; - img?: string; - firstName?: string; - lastName?: string; - email?: string; - //token?: string; -} diff --git a/MyOffice.SPA/src/app/core/service/auth.service.spec.ts b/MyOffice.SPA/src/app/core/service/auth.service.spec.ts deleted file mode 100644 index 9b6666e..0000000 --- a/MyOffice.SPA/src/app/core/service/auth.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { AuthService } from './auth.service'; - -describe('AuthService', - () => { - let service: AuthService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(AuthService); - }); - - it('should be created', - () => { - expect(service).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/core/service/auth.service.ts b/MyOffice.SPA/src/app/core/service/auth.service.ts deleted file mode 100644 index 2e19184..0000000 --- a/MyOffice.SPA/src/app/core/service/auth.service.ts +++ /dev/null @@ -1,266 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Router } from '@angular/router'; -import { ActivatedRoute } from '@angular/router'; - -// libs -import { BehaviorSubject } from 'rxjs'; -import { Observable } from 'rxjs'; -import { Subject } from 'rxjs'; -import { of } from 'rxjs'; -import { throwError } from 'rxjs'; -import { from } from 'rxjs'; -import { filter, map, switchMap } from 'rxjs/operators'; -import { catchError } from 'rxjs/operators'; -import { AuthService as Auth0Service } from '@auth0/auth0-angular'; - -import { SocialAuthService } from '@abacritt/angularx-social-login'; -import { GoogleLoginProvider } from '@abacritt/angularx-social-login'; - -// app -import { OidcHelperService } from './oidc-helper.service'; -import { UserModel } from '../models/user.model'; -import { ApiRoutes } from '../../api-routes'; -import { RegisterModel } from '../models/register.model'; -import { LoginModel } from '../models/login.model'; -import { UserProfileModel } from '../models/user-profile.model'; -import { GeneralResultModel } from '../models/general-result.model'; -import { getSafeRedirectUrl } from '../utils/safe-redirect'; -import { SubjectExtensions } from '../extensions/general.extensions'; - -export function authAppInitializerFactory(authService: AuthService): () => Promise { - if (window.location.href.indexOf('/silent-refresh.html') !== -1) { - return () => Promise.resolve(); - } - return () => authService.runInitialLoginSequence(); -} - -@Injectable({ - providedIn: 'root', -}) -export class AuthService { - private currentUserSubject: BehaviorSubject; - currentUser$: Observable; - - private isAuthenticatedSubject$ = new BehaviorSubject(false); - isAuthenticated$ = this.isAuthenticatedSubject$.asObservable(); - - constructor( - private http: HttpClient, - private router: Router, - private route: ActivatedRoute, - private oidcHelperService: OidcHelperService, - private auth0Service: Auth0Service, - private externalAuthService: SocialAuthService, - ) { - this.currentUserSubject = new BehaviorSubject({} as UserModel); - this.currentUser$ = this.currentUserSubject.asObservable(); - - // on external social login - this.externalAuthService.authState.subscribe((user) => { - if (user?.idToken) { - oidcHelperService.loginByExternalLogin('google', user.idToken); - } - }); - - this.oidcHelperService.isDoneLoading$ - .pipe( - filter(isDone => isDone), - switchMap(() => this.oidcHelperService.isAuthenticated$) - ) - .subscribe(authState => { - let redirectUrl = this.getRedirect(); - if (authState.isAuthenticated) { - this.oidcHelperService.loadUserProfile().then(e => { - let resp = (e as any).info; - let userProfile = { - id: resp.id, - email: resp.email, - phone: resp.phone, - firstName: resp.firstName, - lastName: resp.lastName, - fullName: resp.fullName, - }; - - this.setCurrentUserValue(userProfile.id, userProfile); - - if (authState.action === AuthenticatedActionEnum.loggedIn) { - this.router.navigate([redirectUrl || '/dashboard/rests']); - } - }); - } - }); - } - - setCurrentUserValue(id: string, profile?: UserProfileModel) { - this.currentUserSubject.next({ - id: id, - img: 'assets/images/user/admin.jpg', - userName: profile?.email || '', - firstName: profile?.firstName || '', - lastName: profile?.lastName || '', - }); - } - - get currentUserValue(): UserModel { - return this.currentUserSubject.value; - } - - login(loginModel: LoginModel): Subject { - return SubjectExtensions.start(subject => { - this.oidcHelperService - .login(loginModel.username, loginModel.password) - .subscribe(resp => { - if (resp.access_token) { - this.isAuthenticatedSubject$.next(true); - } - subject.next({ success: !!(resp.access_token) }); - }, - err => { - subject.next({ success: false, error: err.error }); - }); - }); - } - - logout() { - this.currentUserSubject.next({} as UserModel); - this.isAuthenticatedSubject$.next(false); - this.oidcHelperService.logout(); - - return of({ success: false }); - } - - register(registerModel: RegisterModel): Observable { - return this.http - .post(ApiRoutes.UserRegister, registerModel) - .pipe( - map(resp => resp), - catchError(error => { - return throwError(error); - }) - ); - } - - runInitialLoginSequence() { - return this.oidcHelperService.runInitialLoginSequence(); - } - - get isAuthenticated(): boolean { - return this.oidcHelperService.hasValidAccessToken(); - } - - getAccessToken() { - return this.oidcHelperService.getAccessToken(); - } - - loginGoogle(redirectUrl?: string): Observable { - return from(this.externalAuthService.signIn(GoogleLoginProvider.PROVIDER_ID)); - } - - attachGoogle(): Observable { - var result = new Subject(); - - /*this.externalAuthService.signIn(GoogleLoginProvider.PROVIDER_ID).then(function (resp) { - //console.log('attachGoogle', resp); - //return result.next(resp); - //this.attach(idToken.__raw, result); - });*/ - - return result; - } - - loginAuth0(): Observable { - return SubjectExtensions.start((subject) => { - var subs = this.auth0Service.idTokenClaims$.subscribe(token => { - if (token && token?.__raw) { - subs.unsubscribe(); - - this.oidcHelperService.loginByExternalLogin('auth0', token.__raw).subscribe(login => { - if (login.success) { - this.isAuthenticatedSubject$.next(true); - } - subject.next({ success: login.success, error: login.error }); - }); - } else { - //subject.next({ success: false, error: { description: 'Login failed' } }); - } - }); - - this.auth0Service.getAccessTokenWithPopup().subscribe(popupToken => { - if (!popupToken) { - this.auth0Service.getAccessTokenSilently().subscribe(silently => { - }); - } - }); - }); - } - - attachAuth0(): Observable { - return SubjectExtensions.start((subject) => { - var subs = this.auth0Service.idTokenClaims$.subscribe(token => { - if (token && token?.__raw) { - subs.unsubscribe(); - - this.attach(token?.__raw).subscribe( - (resp) => subject.next({ success: true, data: token?.__raw }), - (err) => subject.next({ success: false, data: err }) - ); - } else { - subject.next({ success: false, data: 'Failed' }); - } - }); - - this.auth0Service.getAccessTokenWithPopup().subscribe(popupToken => { - if (!popupToken) { - this.auth0Service.getAccessTokenSilently().subscribe(silently => { - }); - } - }); - }); - } - - deattach(provider: string): Observable { - return this.http - .post(ApiRoutes.UserDeattach, { provider: provider }) - .pipe( - catchError(error => throwError(() => error)) - ); - } - - private attach(token: string): Observable { - return this.http.post(ApiRoutes.UserAttach, { - provider: 'auth0', - token: token, - }); - } - - private getRedirect(): string | undefined { - const raw = this.route.snapshot.queryParams['r'] as string | undefined; - if (!raw) { - return undefined; - } - const safe = getSafeRedirectUrl(raw, ''); - return safe || undefined; - } -} - -export enum AuthenticatedActionEnum { - init, - update, - loggedIn, - loggedOff, -} - -export interface IAuthenticatedState { - isAuthenticated: boolean, - action: AuthenticatedActionEnum, - redirectUrl?: string, -} - -export enum StateEnum { - undefined, - inited, - completed, - failed, -} diff --git a/MyOffice.SPA/src/app/core/service/direction.service.ts b/MyOffice.SPA/src/app/core/service/direction.service.ts deleted file mode 100644 index 9acd559..0000000 --- a/MyOffice.SPA/src/app/core/service/direction.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Injectable } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; - -@Injectable() -export class DirectionService { - private data = new BehaviorSubject(''); - currentData = this.data.asObservable(); - - constructor() { - //constructor - } - - updateDirection(item: string) { - this.data.next(item); - } -} diff --git a/MyOffice.SPA/src/app/core/service/language.service.ts b/MyOffice.SPA/src/app/core/service/language.service.ts deleted file mode 100644 index 27a17cc..0000000 --- a/MyOffice.SPA/src/app/core/service/language.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Injectable } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; - -@Injectable({ - providedIn: 'root', -}) -export class LanguageService { - languages: string[] = ['en', 'es', 'de', 'ua']; - - constructor(public translate: TranslateService) { - let browserLang: string; - translate.addLangs(this.languages); - - if (localStorage.getItem('lang')) { - browserLang = localStorage.getItem('lang') as string; - } else { - browserLang = translate.getBrowserLang() as string; - } - translate.use(browserLang.match(/en|es|de|ua/) ? browserLang : 'en'); - } - - setLanguage(lang: string) { - this.translate.use(lang); - localStorage.setItem('lang', lang); - } -} diff --git a/MyOffice.SPA/src/app/core/service/oidc-helper.service.ts b/MyOffice.SPA/src/app/core/service/oidc-helper.service.ts deleted file mode 100644 index 0626ca4..0000000 --- a/MyOffice.SPA/src/app/core/service/oidc-helper.service.ts +++ /dev/null @@ -1,252 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { OAuthService } from 'angular-oauth2-oidc'; -import { OAuthErrorEvent } from 'angular-oauth2-oidc'; - -// libs -import { filter, map } from 'rxjs/operators'; -import { Subject, Observable, BehaviorSubject, from } from 'rxjs'; - -// app -import { GeneralResultModel } from '../models/general-result.model'; - -@Injectable() -export class OidcHelperService { - private isAuthenticatedSubject$ = new BehaviorSubject({ - isAuthenticated: false, - action: AuthenticatedActionEnum.init - }); - isAuthenticated$ = this.isAuthenticatedSubject$.asObservable(); - - private isDoneLoadingFailed = false; - private isDoneLoadingSubject$ = new BehaviorSubject(false); - isDoneLoading$ = this.isDoneLoadingSubject$.asObservable(); - - constructor( - private oauthService: OAuthService, - private router: Router, - ) { - this.oauthService.oidc = false; - - // all events handler - this.oauthService.events.subscribe(event => { - if (event instanceof OAuthErrorEvent) { - console.error('OAuthErrorEvent Object:', event); - if (event.type === 'discovery_document_validation_error') { - this.isDoneLoadingFailed = true; - this.setIsAuthenticatedSubject$(false, AuthenticatedActionEnum.update); - } - } else { - var hasValidAccessToken = this.hasValidAccessToken(); - var isAuthenticated = this.isAuthenticatedSubject$.getValue().isAuthenticated; - if (isAuthenticated !== hasValidAccessToken) { - this.setIsAuthenticatedSubject$(hasValidAccessToken, AuthenticatedActionEnum.update); - } - } - }); - - // This is tricky, as it might cause race conditions (where access_token is set in another - // tab before everything is said and done there. - // TODO: Improve this setup. See: https://github.com/jeroenheijmans/sample-angular-oauth2-oidc-with-auth-guards/issues/2 - window.addEventListener('storage', - (event) => { - // The `key` is `null` if the event was caused by `.clear()` - if (event.key !== 'access_token' && event.key !== null) { - return; - } - - console.warn( - 'Noticed changes to access_token (most likely from another tab), updating isAuthenticated'); - this.setIsAuthenticatedSubject$(this.hasValidAccessToken(), AuthenticatedActionEnum.update); - - if (!this.hasValidAccessToken()) { - console.log('storage access_token updated !this.hasValidAccessToken()'); - this.logout(); - this.navigateToLoginPage(); - } - }); - - // init login stata - this.setIsAuthenticatedSubject$(this.hasValidAccessToken(), AuthenticatedActionEnum.update); - - // TODO: some time receive 'message' with data 'error' == 'session_error'' - /*window.addEventListener('message', e => { - console.log('message', e);; - if (e.origin === 'https://dev-w08xm0pi.us.auth0.com') { - console.log('message stopPropagation');; - e.stopPropagation(); - } - }); - this.oauthService.events.subscribe(x => { - console.log('events', x); - });*/ - this.oauthService.events - .pipe(filter(e => ['session_terminated', 'session_error'].includes(e.type))) - .subscribe(e => { - console.log('events session_terminated', e, this.hasValidAccessToken()); - this.navigateToLoginPage(); - }); - - this.oauthService.setupAutomaticSilentRefresh(); - } - - private setIsAuthenticatedSubject$( - isAuthenticated: boolean, - action: AuthenticatedActionEnum - ) { - var state = this.isAuthenticatedSubject$.getValue(); - if (state.isAuthenticated !== isAuthenticated || state.action !== action - ) { - this.isAuthenticatedSubject$.next({ isAuthenticated, action }); - } - } - - private navigateToLoginPage() { - this.router.navigateByUrl('/authentication/signin'); - } - - logout() { - this.oauthService.logOut(true); - } - - refresh() { - const refreshToken = this.oauthService.getRefreshToken(); - if (refreshToken) { - this.oauthService.refreshToken(); - } - } - - hasValidAccessToken() { - return this.oauthService.hasValidAccessToken(); - } - - getAccessToken() { - return this.oauthService.getAccessToken(); - } - - login(username: string, password: string) { - //return this.oauthService.fetchTokenUsingPasswordFlow(username, password); - return from(this.oauthService.fetchTokenUsingPasswordFlow(username, password)); - } - - loginByExternalLogin( - provider: string, - token: string, - redirectUrl?: string - ): Observable { - var result = new Subject(); - - let params = { - token: token, - provider: provider, - }; - this.oauthService - .fetchTokenUsingGrant('external', params) - .then(x => { - this.setIsAuthenticatedSubject$(this.hasValidAccessToken(), AuthenticatedActionEnum.loggedIn); - result.next({ success: true }); - }) - .catch(err => { - result.next({ success: false, error: { code: err, description: err } }); - }); - - return result; - } - - loadUserProfile(): Promise { - return this.oauthService.loadUserProfile(); - } - - runInitialLoginSequence(): Promise { - if (location.hash) { - //console.log('Encountered hash fragment, plotting as table...'); - //console.table(location.hash.substr(1).split('&').map(kvp => kvp.split('='))); - } - if (this.isDoneLoadingFailed) { - return new Promise(resolve => setTimeout(() => resolve(), 1500)); - } - // 0. LOAD CONFIG: - // First we have to check to see how the IdServer is - // currently configured: - return this.oauthService.loadDiscoveryDocument() - - // For demo purposes, we pretend the previous call was very slow - .then(() => { - new Promise(resolve => setTimeout(() => resolve(), 1500)); - }) - - // 1. HASH LOGIN: - // Try to log in via hash fragment after redirect back - // from IdServer from initImplicitFlow: - .then(() => { - this.oauthService.tryLogin(); - }) - .then(() => { - if (this.hasValidAccessToken()) { - return Promise.resolve(); - } - - // Refresh via refresh_token (no /connect/authorize cookie session). - const refreshToken = this.oauthService.getRefreshToken(); - if (!refreshToken) { - return Promise.resolve(); - } - - return this.oauthService.refreshToken() - .then(() => Promise.resolve()) - .catch(result => { - const error = - result?.reason?.error ?? - result?.params?.error ?? - result?.error; - const softErrors = [ - 'interaction_required', - 'login_required', - 'account_selection_required', - 'consent_required', - 'access_denied', - 'invalid_grant', - ]; - - if (error && softErrors.indexOf(error) >= 0) { - console.warn('Token refresh needs user login.', error); - return Promise.resolve(); - } - - return Promise.reject(result); - }); - }) - .then(() => { - this.isDoneLoadingSubject$.next(true); - - // Check for the strings 'undefined' and 'null' just to be sure. Our current - // login(...) should never have this, but in case someone ever calls - // initImplicitFlow(undefined | null) this could happen. - if (this.oauthService.state && - this.oauthService.state !== 'undefined' && - this.oauthService.state !== 'null') { - let stateUrl = this.oauthService.state; - if (stateUrl.startsWith('/') === false) { - stateUrl = decodeURIComponent(stateUrl); - } - console.log(`There was state of ${this.oauthService.state}, so we are sending you to: ${stateUrl}`); - this.router.navigateByUrl(stateUrl); - } - }) - .catch(() => this.isDoneLoadingSubject$.next(true)); - } -} - -export enum AuthenticatedActionEnum { - init, - update, - loggedIn, - loggedOff, -} - -export interface IAuthenticatedState { - isAuthenticated: boolean, - action: AuthenticatedActionEnum, - redirectUrl?: string, -} diff --git a/MyOffice.SPA/src/app/core/service/rightsidebar.service.ts b/MyOffice.SPA/src/app/core/service/rightsidebar.service.ts deleted file mode 100644 index 7b5d47b..0000000 --- a/MyOffice.SPA/src/app/core/service/rightsidebar.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Injectable } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; - -@Injectable() -export class RightSidebarService { - private sidebarSubject: BehaviorSubject = new BehaviorSubject(false); - sidebarState = this.sidebarSubject.asObservable(); - - setRightSidebar = (value: boolean) => { - this.sidebarSubject.next(value); - }; - - constructor() { - //constructor - } -} diff --git a/MyOffice.SPA/src/app/core/utils/safe-redirect.spec.ts b/MyOffice.SPA/src/app/core/utils/safe-redirect.spec.ts deleted file mode 100644 index 4e295e0..0000000 --- a/MyOffice.SPA/src/app/core/utils/safe-redirect.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { getSafeRedirectUrl } from './safe-redirect'; - -describe('getSafeRedirectUrl', () => { - it('returns fallback when raw is empty', () => { - expect(getSafeRedirectUrl(null)).toBe('/dashboard/rests'); - expect(getSafeRedirectUrl(undefined)).toBe('/dashboard/rests'); - expect(getSafeRedirectUrl('')).toBe('/dashboard/rests'); - }); - - it('allows relative in-app paths', () => { - expect(getSafeRedirectUrl('/accounts')).toBe('/accounts'); - expect(getSafeRedirectUrl('%2Fdashboard%2Frests')).toBe('/dashboard/rests'); - }); - - it('blocks open redirects', () => { - expect(getSafeRedirectUrl('//evil.com')).toBe('/dashboard/rests'); - expect(getSafeRedirectUrl('https://evil.com')).toBe('/dashboard/rests'); - expect(getSafeRedirectUrl('http://evil.com')).toBe('/dashboard/rests'); - expect(getSafeRedirectUrl('/path?next=https://evil.com')).toBe('/dashboard/rests'); - }); -}); - diff --git a/MyOffice.SPA/src/app/core/utils/safe-redirect.ts b/MyOffice.SPA/src/app/core/utils/safe-redirect.ts deleted file mode 100644 index 90bb5ac..0000000 --- a/MyOffice.SPA/src/app/core/utils/safe-redirect.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Only allow in-app relative paths (blocks open redirects via ?r=). - */ -export function getSafeRedirectUrl( - raw: string | null | undefined, - fallback = '/dashboard/rests' -): string { - if (!raw) { - return fallback; - } - - let url: string; - try { - url = decodeURIComponent(raw).trim(); - } catch { - return fallback; - } - - if (!url.startsWith('/') || url.startsWith('//') || url.includes('://')) { - return fallback; - } - - return url; -} diff --git a/MyOffice.SPA/src/app/core/validators/atleastone.validator.ts b/MyOffice.SPA/src/app/core/validators/atleastone.validator.ts deleted file mode 100644 index 8968db7..0000000 --- a/MyOffice.SPA/src/app/core/validators/atleastone.validator.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - FormGroup, - ValidationErrors, - ValidatorFn, - Validators, -} from '@angular/forms'; - -export const atLeastOne = (validator: ValidatorFn, controls: string[] = []) => ( - group: FormGroup, -): ValidationErrors | null => { - if (!controls) { - controls = Object.keys(group.controls); - } - - const hasAtLeastOne = group && group.controls && controls - .some(k => !validator(group.controls[k])); - - return hasAtLeastOne ? null : { - atLeastOne: true, - }; -}; diff --git a/MyOffice.SPA/src/app/core/validators/atleastonenumber.validator.ts b/MyOffice.SPA/src/app/core/validators/atleastonenumber.validator.ts deleted file mode 100644 index 49cdcb2..0000000 --- a/MyOffice.SPA/src/app/core/validators/atleastonenumber.validator.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - FormGroup, - ValidationErrors, - ValidatorFn, - Validators, -} from '@angular/forms'; - -export const atLeastOneNumber = (validator: ValidatorFn, controls: string[] = []) => - (group: FormGroup,): ValidationErrors | null => { - - if (!controls) { - controls = Object.keys(group.controls); - } - - const hasAtLeastOne = group && group.controls && controls - .some(k => { - var v = group.controls[k].value; - return !!(v && !isNaN(v) && parseFloat(v) !== 0 && !validator(group.controls[k])); - }); - - return hasAtLeastOne ? null : { - atLeastOne: true, - }; - }; diff --git a/MyOffice.SPA/src/app/dashboard/dashboard-routing.module.ts b/MyOffice.SPA/src/app/dashboard/dashboard-routing.module.ts deleted file mode 100644 index d53cfa3..0000000 --- a/MyOffice.SPA/src/app/dashboard/dashboard-routing.module.ts +++ /dev/null @@ -1,37 +0,0 @@ -// angular -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -// app -import { Page404Component } from '../authentication/page404/page404.component'; -import { Dashboard2Component } from './dashboard2/dashboard2.component'; -import { DashboardIncomeComponent } from './income/dashboard.component'; -import { DashboardOutcomeComponent } from './outcome/dashboard.component'; - -const routes: Routes = [ - { - path: '', - redirectTo: 'rests', - pathMatch: 'full', - }, - { - path: 'rests', - component: Dashboard2Component, - }, - { - path: 'income', - component: DashboardIncomeComponent, - }, - { - path: 'outcome', - component: DashboardOutcomeComponent, - }, - { path: '**', component: Page404Component }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class DashboardRoutingModule { -} diff --git a/MyOffice.SPA/src/app/dashboard/dashboard.module.ts b/MyOffice.SPA/src/app/dashboard/dashboard.module.ts deleted file mode 100644 index 6c769a5..0000000 --- a/MyOffice.SPA/src/app/dashboard/dashboard.module.ts +++ /dev/null @@ -1,55 +0,0 @@ -// angular -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { DecimalPipe } from '@angular/common'; - -// libs -import { NgScrollbarModule } from 'ngx-scrollbar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { NgApexchartsModule } from 'ng-apexcharts'; -import { TranslateModule } from '@ngx-translate/core'; -import { MAT_DATE_LOCALE } from '@angular/material/core'; - -// app -import { DashboardRoutingModule } from './dashboard-routing.module'; -import { Dashboard2Component } from './dashboard2/dashboard2.component'; -import { DashboardIncomeComponent } from './income/dashboard.component'; -import { DashboardOutcomeComponent } from './outcome/dashboard.component'; -import { ComponentsModule } from 'src/app/shared/components/components.module'; -import { SharedModule } from '../shared/shared.module'; - -@NgModule({ - declarations: [ - Dashboard2Component, - DashboardIncomeComponent, - DashboardOutcomeComponent, - ], - imports: [ - CommonModule, - DashboardRoutingModule, - NgApexchartsModule, - NgScrollbarModule, - MatIconModule, - MatButtonModule, - MatMenuModule, - MatTooltipModule, - MatCheckboxModule, - DragDropModule, - MatProgressBarModule, - ComponentsModule, - SharedModule, - TranslateModule, - ], - providers: [ - { provide: MAT_DATE_LOCALE, useValue: 'en-GB' }, - DecimalPipe, - ] -}) -export class DashboardModule { -} diff --git a/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.html b/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.html deleted file mode 100644 index 919b567..0000000 --- a/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.html +++ /dev/null @@ -1,103 +0,0 @@ -
-
-
- - -
- -
- -
-
-
-
-
-
{{'BALANCE' | translate}}
-
-

{{dashboardModel?.balance | number: '0.2-2'}}

-
-
-
-
- -
-
-
-
-
-
{{'DEBIT.BALANCE' | translate}}
-

-
-

{{dashboardModel?.balanceDebit | number: '0.2-2'}}

-
-
-
-
- -
-
-
-
-
-
{{'CREDIT.BALANCE' | translate}}
-
-

{{dashboardModel?.balanceCredit | number: '0.2-2'}}

-
-
-
-
-
- -
- -
-
-
-

{{'CURRENT.BALANCE' | translate}}

- - - - - - -
-
-
- - -
-
- - - - - - - - - - - - - - - - - - -
{{item.name}}{{item.balance | number: '1.2'}} ({{item.currencyShortName}}){{item.balanceAtRate | number: '1.2'}}
{{'OTHER' | translate}}{{top10BalanceOther | number: '1.2'}}
{{'TOTAL' | translate}}{{top10BalanceTotal | number: '1.2'}}
-
-
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.scss b/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.spec.ts b/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.spec.ts deleted file mode 100644 index 00dd7f9..0000000 --- a/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { Dashboard2Component } from './dashboard2.component'; - -describe('Dashboard2Component', - () => { - let component: Dashboard2Component; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [Dashboard2Component] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(Dashboard2Component); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.ts b/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.ts deleted file mode 100644 index 1f8dc52..0000000 --- a/MyOffice.SPA/src/app/dashboard/dashboard2/dashboard2.component.ts +++ /dev/null @@ -1,155 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { OnInit } from '@angular/core'; -import { ViewChild } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { DecimalPipe } from '@angular/common'; - -// libs -import { - ApexAxisChartSeries, - ApexChart, - ApexXAxis, - ApexDataLabels, - ApexStroke, - ApexMarkers, - ApexYAxis, - ApexGrid, - ApexTitleSubtitle, - ApexTooltip, - ApexLegend, - ApexFill, - ApexResponsive, - ApexNonAxisChartSeries, -} from 'ng-apexcharts'; -import { ChartComponent } from "ng-apexcharts"; - -// app -import { ApiRoutes } from '../../api-routes'; -import { DashboardModel } from '../../model/dashboard.model'; -import { DashboardRestModel } from '../../model/dashboard.model'; - -export type ChartOptions = { - series: ApexAxisChartSeries; - series2: ApexNonAxisChartSeries; - chart: ApexChart; - xaxis: ApexXAxis; - stroke: ApexStroke; - dataLabels: ApexDataLabels; - markers: ApexMarkers; - colors: string[]; - yaxis: ApexYAxis; - grid: ApexGrid; - legend: ApexLegend; - tooltip: ApexTooltip; - fill: ApexFill; - title: ApexTitleSubtitle; - responsive: ApexResponsive[]; - labels: string[]; -}; - -@Component({ - selector: 'app-dashboard2', - templateUrl: './dashboard2.component.html', - styleUrls: ['./dashboard2.component.scss'], -}) -export class Dashboard2Component implements OnInit { - - @ViewChild("chart") chart!: ChartComponent; - public pieChartOptions!: Partial; - top10Balance?: DashboardRestModel[]; - top10BalanceOther?: number; - top10BalanceTotal?: number; - dashboardModel?: DashboardModel; - - private readonly destroyRef = inject(DestroyRef); - - // color: ["#3FA7DC", "#F6A025", "#9BC311"], - constructor( - private httpClient: HttpClient, - private _decimalPipe: DecimalPipe - ) { - - } - - ngOnInit() { - this.httpClient - .get(ApiRoutes.Dashboard) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - data.incomeChange = this.calcChanges(data.incomeLast, data.incomePrevious); - data.outcomeChange = this.calcChanges(data.outcomeLast, data.outcomePrevious); - - var labels = []; - var series2: number[] = []; - for (var i = 0; i < data.balanceRests.length; i++) { - let item = data.balanceRests[i]; - labels.push(item.name); - series2.push(item.balanceAtRate); - } - - this.balanceChart(labels, series2); - - this.top10Balance = data.balanceRests - .filter(x => x.balanceAtRate > 0) - .sort(x => x.balanceAtRate) - .slice(0, 10); - - this.top10BalanceTotal = data.balanceRests.reduce((sum, current) => sum + current.balanceAtRate, 0); - this.top10BalanceOther = this.top10Balance.reduce((sum, current) => sum + current.balanceAtRate, 0); - this.top10BalanceOther = this.top10BalanceTotal - this.top10BalanceOther; - - this.dashboardModel = data; - }); - } - - private calcChanges(newValue: number, oldValue: number): number { - if (newValue > oldValue) { - return (newValue - oldValue) / oldValue * 100; - } - else if (newValue < oldValue) { - return (oldValue - newValue) / oldValue * 100; - } - - return 0; - } - - private balanceChart(labels: string[], series2: number[]) { - var self = this; - - this.pieChartOptions = { - labels: labels, - series2: series2, - chart: { - type: 'donut', - width: 600, - height: 600, - }, - legend: { - show: true, - }, - dataLabels: { - enabled: false, - }, - responsive: [{ - breakpoint: 480, - options: { - legend: { - position: 'bottom' - } - }, - }], - tooltip: { - x: { - show: false, - }, - y: { - formatter: function (value, series) { - return self._decimalPipe.transform(value, '1.2-2') || ""; - } - } - } - }; - } -} diff --git a/MyOffice.SPA/src/app/dashboard/income/dashboard.component.html b/MyOffice.SPA/src/app/dashboard/income/dashboard.component.html deleted file mode 100644 index 0a55e51..0000000 --- a/MyOffice.SPA/src/app/dashboard/income/dashboard.component.html +++ /dev/null @@ -1,70 +0,0 @@ -
-
-
- - -
- -
-
-
-
-

{{'PERIOD' | translate}}

-
-
-
- -
-
-
-
-
- -
- -
-
-
-

{{'INCOME' | translate}}

- - - - - - -
-
-
- - -
-
- - - - - - - - - - - - - -
{{item.name}}{{item.valueRaw | number: '1.2'}}{{item.value | number: '1.2'}}
{{'TOTAL' | translate}}{{total | number: '1.2'}}
-
-
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/dashboard/income/dashboard.component.scss b/MyOffice.SPA/src/app/dashboard/income/dashboard.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/dashboard/income/dashboard.component.spec.ts b/MyOffice.SPA/src/app/dashboard/income/dashboard.component.spec.ts deleted file mode 100644 index 00dd7f9..0000000 --- a/MyOffice.SPA/src/app/dashboard/income/dashboard.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { Dashboard2Component } from './dashboard2.component'; - -describe('Dashboard2Component', - () => { - let component: Dashboard2Component; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [Dashboard2Component] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(Dashboard2Component); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/dashboard/income/dashboard.component.ts b/MyOffice.SPA/src/app/dashboard/income/dashboard.component.ts deleted file mode 100644 index 26848e5..0000000 --- a/MyOffice.SPA/src/app/dashboard/income/dashboard.component.ts +++ /dev/null @@ -1,146 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { OnInit } from '@angular/core'; -import { ViewChild } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { HttpParams } from '@angular/common/http'; -import { DecimalPipe } from '@angular/common'; - -// libs -import { - ChartComponent, - ApexAxisChartSeries, - ApexTitleSubtitle, - ApexDataLabels, - ApexChart, - ApexPlotOptions, - ApexLegend -} from "ng-apexcharts"; -import moment from 'moment'; - -// app -import { ApiRoutes } from '../../api-routes'; -import { DashboardInOutModel } from '../../model/dashboard.model'; - -export type ChartOptions = { - series: ApexAxisChartSeries; - chart: ApexChart; - dataLabels: ApexDataLabels; - title: ApexTitleSubtitle; - plotOptions: ApexPlotOptions; - legend: ApexLegend; -}; - -@Component({ - selector: 'app-dashboard-income', - templateUrl: './dashboard.component.html', - styleUrls: ['./dashboard.component.scss'], -}) -export class DashboardIncomeComponent implements OnInit { - - @ViewChild("chart") chart!: ChartComponent; - public chartOptions!: Partial; - dashboardModel?: DashboardInOutModel; - total?: number; - public dateFrom: Date = moment(new Date).add(-30, 'days').toDate(); - public dateTo: Date = moment(new Date).add(0, 'days').toDate(); - - colors: string[] = ["#fd7f6f", "#7eb0d5", "#b2e061", "#bd7ebe", "#ffb55a", "#ffee65", "#beb9db", "#fdcce5", "#8bd3c7"]; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private httpClient: HttpClient, - private _decimalPipe: DecimalPipe - ) { - - } - - ngOnInit() { - this.loadData(); - } - - onChangePeriod(dates: Date[]) { - this.dateFrom = dates[0]; - this.dateTo = dates[1]; - this.loadData(); - } - - loadData(update?: boolean, category?: string) { - let params = new HttpParams() - .set('from', moment(this.dateFrom).format('YYYY-MM-DD')) - .set('to', moment(this.dateTo).format('YYYY-MM-DD')) - .set('category', category || '') - ; - - this.httpClient - .get(ApiRoutes.DashboardIncome, { params: params }) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - this.dashboardModel = response; - - var series = response.data.map(x => ({ - x: x.name + '(' + (this._decimalPipe.transform(x.value, '1.2-2') || "") + ')', - y: x.value - })); - var min = Math.min(...response.data.map(x => x.value)); - var max = Math.max(...response.data.map(x => x.value)); - var step = max / 10; - var ranges = []; - for (var i = 0; i < this.colors.length; i++) { - ranges.push({ - from: i === 0 ? min : step * i, - to: i === this.colors.length - 1 ? max + 10 : step * (i + 1), - color: this.colors[this.colors.length - i - 1], - }); - } - - this.total = response.data.reduce((sum, current) => sum + current.value, 0); - - if (update) { - this.chart.updateSeries([{ - data: series - }]); - } else { - this.setChartOptions(series, ranges); - } - }); - } - - onRightClick(event?: Event) { - event?.preventDefault(); - this.loadData(true); - } - - private setChartOptions(data: any[], ranges: any[]) { - var self = this; - - this.chartOptions = { - series: [{ - data: data - }], - chart: { - type: 'treemap', - width: 600, - height: 600, - events: { - click: function (event, chartContext, config) { - var data = self.dashboardModel!.data[config.dataPointIndex]; - self.loadData(true, data.id); - } - } - }, - plotOptions: { - treemap: { - enableShades: true, - shadeIntensity: 0.5, - reverseNegativeShade: true, - colorScale: { - ranges: ranges - } - } - }, - }; - } -} diff --git a/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.html b/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.html deleted file mode 100644 index d372db6..0000000 --- a/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.html +++ /dev/null @@ -1,72 +0,0 @@ -
-
-
- - -
- -
-
-
-
-

{{'PERIOD' | translate}}

-
-
-
- -
-
-
-
-
- -
- -
-
-
-

{{'OUTCOME' | translate}}

- -
-
- - -
- - - - - - - - - - - - - -
{{item.name}}{{item.valueRaw | number: '1.2'}}{{item.value | number: '1.2'}}
{{'TOTAL' | translate}}{{total | number: '1.2'}}
-
-
-
-
-
- - -
-
diff --git a/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.scss b/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.spec.ts b/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.spec.ts deleted file mode 100644 index 00dd7f9..0000000 --- a/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { Dashboard2Component } from './dashboard2.component'; - -describe('Dashboard2Component', - () => { - let component: Dashboard2Component; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [Dashboard2Component] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(Dashboard2Component); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.ts b/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.ts deleted file mode 100644 index 6db6b1c..0000000 --- a/MyOffice.SPA/src/app/dashboard/outcome/dashboard.component.ts +++ /dev/null @@ -1,145 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { OnInit } from '@angular/core'; -import { ViewChild } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { HttpParams } from '@angular/common/http'; -import { DecimalPipe } from '@angular/common'; - -// libs -import { - ChartComponent, - ApexAxisChartSeries, - ApexTitleSubtitle, - ApexDataLabels, - ApexChart, - ApexPlotOptions, - ApexLegend -} from "ng-apexcharts"; -import moment from 'moment'; - -// app -import { ApiRoutes } from '../../api-routes'; -import { DashboardInOutModel } from '../../model/dashboard.model'; - -export type ChartOptions = { - series: ApexAxisChartSeries; - chart: ApexChart; - dataLabels: ApexDataLabels; - title: ApexTitleSubtitle; - plotOptions: ApexPlotOptions; - legend: ApexLegend; -}; - -@Component({ - selector: 'app-dashboard-outcome', - templateUrl: './dashboard.component.html', - styleUrls: ['./dashboard.component.scss'], -}) -export class DashboardOutcomeComponent implements OnInit { - - @ViewChild("chart") chart!: ChartComponent; - public chartOptions!: Partial; - dashboardModel?: DashboardInOutModel; - total?: number; - public dateFrom: Date = moment(new Date).add(-30, 'days').toDate(); - public dateTo: Date = moment(new Date).add(0, 'days').toDate(); - - colors: string[] = ["#fd7f6f", "#7eb0d5", "#b2e061", "#bd7ebe", "#ffb55a", "#ffee65", "#beb9db", "#fdcce5", "#8bd3c7"]; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private httpClient: HttpClient, - private _decimalPipe: DecimalPipe - ) { - } - - ngOnInit() { - this.loadData(); - } - - onChangePeriod(dates: Date[]) { - this.dateFrom = dates[0]; - this.dateTo = dates[1]; - this.loadData(); - } - - onRightClick(event?: Event) { - event?.preventDefault(); - this.loadData(true); - } - - private loadData(update?: boolean, category?: string) { - let params = new HttpParams() - .set('from', moment(this.dateFrom).format('YYYY-MM-DD')) - .set('to', moment(this.dateTo).format('YYYY-MM-DD')) - .set('category', category || '') - ; - - this.httpClient - .get(ApiRoutes.DashboardOutcome, { params: params }) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - this.dashboardModel = response; - - var series = response.data.map(x => ({ - x: x.name + ' (' + (this._decimalPipe.transform(x.value, '1.2-2') || '') + ')', - y: x.value - })); - var min = Math.min(...response.data.map(x => x.value)); - var max = Math.max(...response.data.map(x => x.value)); - var step = max / 10; - var ranges = []; - for (var i = 0; i < this.colors.length; i++) { - ranges.push({ - from: i === 0 ? min : step * i, - to: i === this.colors.length - 1 ? max + 10 : step * (i + 1), - color: this.colors[this.colors.length - i - 1], - }); - } - - this.total = response.data.reduce((sum, current) => sum + current.value, 0); - - if (update) { - this.chart.updateSeries([{ - data: series - }]); - } else { - this.setChartOptions(series, ranges); - } - }); - } - - private setChartOptions(data: any[], ranges: any[]) { - var self = this; - - this.chartOptions = { - series: [{ - data: data - }], - chart: { - type: 'treemap', - width: 600, - height: 600, - events: { - click: function (event, chartContext, config) { - var data = self.dashboardModel!.data[config.dataPointIndex]; - self.loadData(true, data.id); - } - } - }, - plotOptions: { - treemap: { - enableShades: true, - shadeIntensity: 0.5, - reverseNegativeShade: true, - colorScale: { - ranges: ranges - } - } - }, - }; - } -} diff --git a/MyOffice.SPA/src/app/layout/app-layout/auth-layout/auth-layout.component.html b/MyOffice.SPA/src/app/layout/app-layout/auth-layout/auth-layout.component.html deleted file mode 100644 index d1c5fa2..0000000 --- a/MyOffice.SPA/src/app/layout/app-layout/auth-layout/auth-layout.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/MyOffice.SPA/src/app/layout/app-layout/auth-layout/auth-layout.component.ts b/MyOffice.SPA/src/app/layout/app-layout/auth-layout/auth-layout.component.ts deleted file mode 100644 index f700c55..0000000 --- a/MyOffice.SPA/src/app/layout/app-layout/auth-layout/auth-layout.component.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { BidiModule, Direction } from '@angular/cdk/bidi'; -import { Component, DestroyRef, Inject, inject, Renderer2 } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { RouterOutlet } from '@angular/router'; -import { InConfiguration } from 'src/app/core/models/config.interface'; -import { DirectionService } from 'src/app/core/service/direction.service'; -import { ConfigService } from 'src/app/config/config.service'; -import { DOCUMENT } from '@angular/common'; - -@Component({ - selector: 'app-auth-layout', - templateUrl: './auth-layout.component.html', - styleUrls: [], - standalone: true, - imports: [BidiModule, RouterOutlet], -}) -export class AuthLayoutComponent { - direction!: Direction; - config!: InConfiguration; - private readonly destroyRef = inject(DestroyRef); - - constructor( - @Inject(DOCUMENT) private document: Document, - private directoryService: DirectionService, - private configService: ConfigService, - private renderer: Renderer2 - ) { - this.config = this.configService.configData; - this.directoryService.currentData - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((currentData) => { - if (currentData) { - this.direction = currentData === 'ltr' ? 'ltr' : 'rtl'; - } else { - if (localStorage.getItem('isRtl')) { - if (localStorage.getItem('isRtl') === 'true') { - this.direction = 'rtl'; - } else if (localStorage.getItem('isRtl') === 'false') { - this.direction = 'ltr'; - } - } else { - if (this.config) { - if (this.config.layout.rtl === true) { - this.direction = 'rtl'; - localStorage.setItem('isRtl', 'true'); - } else { - this.direction = 'ltr'; - localStorage.setItem('isRtl', 'false'); - } - } - } - } - }); - - // set theme on startup - if (localStorage.getItem('theme')) { - this.renderer.removeClass(this.document.body, this.config.layout.variant); - this.renderer.addClass( - this.document.body, - localStorage.getItem('theme') as string - ); - } else { - this.renderer.addClass(this.document.body, this.config.layout.variant); - } - } -} diff --git a/MyOffice.SPA/src/app/layout/app-layout/main-layout/main-layout.component.html b/MyOffice.SPA/src/app/layout/app-layout/main-layout/main-layout.component.html deleted file mode 100644 index 74b91bd..0000000 --- a/MyOffice.SPA/src/app/layout/app-layout/main-layout/main-layout.component.html +++ /dev/null @@ -1,6 +0,0 @@ - - - -
- -
diff --git a/MyOffice.SPA/src/app/layout/app-layout/main-layout/main-layout.component.ts b/MyOffice.SPA/src/app/layout/app-layout/main-layout/main-layout.component.ts deleted file mode 100644 index b77f5eb..0000000 --- a/MyOffice.SPA/src/app/layout/app-layout/main-layout/main-layout.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { BidiModule, Direction } from '@angular/cdk/bidi'; -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { RouterOutlet } from '@angular/router'; -import { InConfiguration } from 'src/app/core/models/config.interface'; -import { DirectionService } from 'src/app/core/service/direction.service'; -import { ConfigService } from 'src/app/config/config.service'; -import { HeaderComponent } from '../../header/header.component'; -import { SidebarComponent } from '../../sidebar/sidebar.component'; -import { RightSidebarComponent } from '../../right-sidebar/right-sidebar.component'; - -@Component({ - selector: 'app-main-layout', - templateUrl: './main-layout.component.html', - styleUrls: [], - standalone: true, - imports: [BidiModule, RouterOutlet, HeaderComponent, SidebarComponent, RightSidebarComponent], -}) -export class MainLayoutComponent { - direction!: Direction; - config!: InConfiguration; - private readonly destroyRef = inject(DestroyRef); - - constructor( - private directoryService: DirectionService, - private configService: ConfigService - ) { - this.config = this.configService.configData; - this.directoryService.currentData - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((currentData) => { - if (currentData) { - this.direction = currentData === 'ltr' ? 'ltr' : 'rtl'; - } else { - if (localStorage.getItem('isRtl')) { - if (localStorage.getItem('isRtl') === 'true') { - this.direction = 'rtl'; - } else if (localStorage.getItem('isRtl') === 'false') { - this.direction = 'ltr'; - } - } else { - if (this.config) { - if (this.config.layout.rtl === true) { - this.direction = 'rtl'; - localStorage.setItem('isRtl', 'true'); - } else { - this.direction = 'ltr'; - localStorage.setItem('isRtl', 'false'); - } - } - } - } - }); - } -} diff --git a/MyOffice.SPA/src/app/layout/header/header.component.html b/MyOffice.SPA/src/app/layout/header/header.component.html deleted file mode 100644 index d381862..0000000 --- a/MyOffice.SPA/src/app/layout/header/header.component.html +++ /dev/null @@ -1,179 +0,0 @@ - diff --git a/MyOffice.SPA/src/app/layout/header/header.component.scss b/MyOffice.SPA/src/app/layout/header/header.component.scss deleted file mode 100644 index 8b13789..0000000 --- a/MyOffice.SPA/src/app/layout/header/header.component.scss +++ /dev/null @@ -1 +0,0 @@ - diff --git a/MyOffice.SPA/src/app/layout/header/header.component.spec.ts b/MyOffice.SPA/src/app/layout/header/header.component.spec.ts deleted file mode 100644 index 4cff7eb..0000000 --- a/MyOffice.SPA/src/app/layout/header/header.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { HeaderComponent } from './header.component'; -describe('HeaderComponent', - () => { - let component: HeaderComponent; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [HeaderComponent], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(HeaderComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/layout/header/header.component.ts b/MyOffice.SPA/src/app/layout/header/header.component.ts deleted file mode 100644 index c5bbdbe..0000000 --- a/MyOffice.SPA/src/app/layout/header/header.component.ts +++ /dev/null @@ -1,264 +0,0 @@ -// angular -import { DOCUMENT } from '@angular/common'; -import { Component } from '@angular/core'; -import { Inject } from '@angular/core'; -import { ElementRef } from '@angular/core'; -import { OnInit } from '@angular/core'; -import { Renderer2 } from '@angular/core'; -import { AfterViewInit } from '@angular/core'; -import { Router } from '@angular/router'; - -// libs -import { NgScrollbarModule } from 'ngx-scrollbar'; - -// app -import { ConfigService } from 'src/app/config/config.service'; -import { InConfiguration } from 'src/app/core/models/config.interface'; -import { AuthService } from 'src/app/core/service/auth.service'; -import { LanguageService } from 'src/app/core/service/language.service'; -import { UnsubscribeOnDestroyAdapter } from 'src/app/shared/UnsubscribeOnDestroyAdapter'; -import { SharedModule } from 'src/app/shared/shared.module'; - -interface Notifications { - message: string; - time: string; - icon: string; - color: string; - status: string; -} - -@Component({ - selector: 'app-header', - templateUrl: './header.component.html', - styleUrls: ['./header.component.scss'], - standalone: true, - imports: [SharedModule, NgScrollbarModule], -}) -export class HeaderComponent extends UnsubscribeOnDestroyAdapter implements OnInit, AfterViewInit { - - config!: InConfiguration; - - userImg?: string; - userName?: string; - - homePage?: string; - isNavbarCollapsed = true; - flagvalue: string | string[] | undefined; - countryName: string | string[] = []; - langStoreValue?: string; - defaultFlag?: string; - isOpenSidebar?: boolean; - docElement: HTMLElement | undefined; - isFullScreen = false; - - constructor( - @Inject(DOCUMENT) private document: Document, - private renderer: Renderer2, - public elementRef: ElementRef, - private configService: ConfigService, - private authService: AuthService, - private router: Router, - public languageService: LanguageService - ) { - super(); - - this.subs.sink = this.authService.currentUser$.subscribe(() => { - this.setUser(); - }); - } - - listLang = [ - { text: 'English', flag: 'assets/images/flags/us.jpg', lang: 'en' }, - { text: 'Spanish', flag: 'assets/images/flags/spain.jpg', lang: 'es' }, - { text: 'German', flag: 'assets/images/flags/germany.jpg', lang: 'de' }, - { text: 'Ukraine', flag: 'assets/images/flags/ukraine.png', lang: 'ua' }, - ]; - notifications: Notifications[] = [ - { - message: 'Please check your mail', - time: '14 mins ago', - icon: 'mail', - color: 'nfc-green', - status: 'msg-unread', - }, - { - message: 'New Employee Added..', - time: '22 mins ago', - icon: 'person_add', - color: 'nfc-blue', - status: 'msg-read', - }, - { - message: 'Your leave is approved!! ', - time: '3 hours ago', - icon: 'event_available', - color: 'nfc-orange', - status: 'msg-read', - }, - { - message: 'Lets break for lunch...', - time: '5 hours ago', - icon: 'lunch_dining', - color: 'nfc-blue', - status: 'msg-read', - }, - { - message: 'Employee report generated', - time: '14 mins ago', - icon: 'description', - color: 'nfc-green', - status: 'msg-read', - }, - { - message: 'Please check your mail', - time: '22 mins ago', - icon: 'mail', - color: 'nfc-red', - status: 'msg-read', - }, - { - message: 'Salary credited...', - time: '3 hours ago', - icon: 'paid', - color: 'nfc-purple', - status: 'msg-read', - }, - ]; - - ngOnInit() { - this.config = this.configService.configData; - - this.setUser(); - - this.homePage = 'dashboard/rests'; - - this.langStoreValue = localStorage.getItem('lang') as string; - const val = this.listLang.filter((x) => x.lang === this.langStoreValue); - this.countryName = val.map((element) => element.text); - if (val.length === 0) { - if (this.flagvalue === undefined) { - this.defaultFlag = 'assets/images/flags/us.jpg'; - } - } else { - this.flagvalue = val.map((element) => element.flag); - } - } - - ngAfterViewInit() { - // set theme on startup - if (localStorage.getItem('theme')) { - this.renderer.removeClass(this.document.body, this.config.layout.variant); - this.renderer.addClass( - this.document.body, - localStorage.getItem('theme') as string - ); - } else { - this.renderer.addClass(this.document.body, this.config.layout.variant); - } - - if (localStorage.getItem('menuOption')) { - this.renderer.addClass( - this.document.body, - localStorage.getItem('menuOption') as string - ); - } else { - this.renderer.addClass( - this.document.body, - 'menu_' + this.config.layout.sidebar.backgroundColor - ); - } - - if (localStorage.getItem('choose_logoheader')) { - this.renderer.addClass( - this.document.body, - localStorage.getItem('choose_logoheader') as string - ); - } else { - this.renderer.addClass( - this.document.body, - 'logo-' + this.config.layout.logo_bg_color - ); - } - - if (localStorage.getItem('sidebar_status')) { - if (localStorage.getItem('sidebar_status') === 'close') { - this.renderer.addClass(this.document.body, 'side-closed'); - this.renderer.addClass(this.document.body, 'submenu-closed'); - } else { - this.renderer.removeClass(this.document.body, 'side-closed'); - this.renderer.removeClass(this.document.body, 'submenu-closed'); - } - } else { - if (this.config.layout.sidebar.collapsed === true) { - this.renderer.addClass(this.document.body, 'side-closed'); - this.renderer.addClass(this.document.body, 'submenu-closed'); - } - } - } - - callFullscreen() { - if (!this.isFullScreen) { - this.docElement?.requestFullscreen(); - } else { - document.exitFullscreen(); - } - this.isFullScreen = !this.isFullScreen; - } - - setLanguage(text: string, lang: string, flag: string) { - this.countryName = text; - this.flagvalue = flag; - this.langStoreValue = lang; - this.languageService.setLanguage(lang); - } - - mobileMenuSidebarOpen(event: Event, className: string) { - const hasClass = (event.target as HTMLInputElement).classList.contains( - className - ); - if (hasClass) { - this.renderer.removeClass(this.document.body, className); - } else { - this.renderer.addClass(this.document.body, className); - } - - const hasClass2 = this.document.body.classList.contains('side-closed'); - if (hasClass2) { - // this.renderer.removeClass(this.document.body, "side-closed"); - this.renderer.removeClass(this.document.body, 'submenu-closed'); - } else { - // this.renderer.addClass(this.document.body, "side-closed"); - this.renderer.addClass(this.document.body, 'submenu-closed'); - } - } - - callSidemenuCollapse() { - const hasClass = this.document.body.classList.contains('side-closed'); - if (hasClass) { - this.renderer.removeClass(this.document.body, 'side-closed'); - this.renderer.removeClass(this.document.body, 'submenu-closed'); - } else { - this.renderer.addClass(this.document.body, 'side-closed'); - this.renderer.addClass(this.document.body, 'submenu-closed'); - } - } - - logout() { - this.subs.sink = this.authService.logout().subscribe((res) => { - if (!res.success) { - this.router.navigate(['/authentication/signin']); - } - }); - } - - private setUser() { - this.userImg = this.authService.currentUserValue.img; - - this.userName = [ - this.authService.currentUserValue.firstName, - this.authService.currentUserValue.lastName - ].join(' ').trim(); - - this.userName = this.userName || this.authService.currentUserValue.userName; - } -} diff --git a/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.html b/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.html deleted file mode 100644 index c0c959c..0000000 --- a/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.scss b/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.scss deleted file mode 100644 index 8b13789..0000000 --- a/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.scss +++ /dev/null @@ -1 +0,0 @@ - diff --git a/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.spec.ts b/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.spec.ts deleted file mode 100644 index d2479a5..0000000 --- a/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { PageLoaderComponent } from './page-loader.component'; -describe('PageLoaderComponent', - () => { - let component: PageLoaderComponent; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [PageLoaderComponent], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(PageLoaderComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.ts b/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.ts deleted file mode 100644 index 5eab98c..0000000 --- a/MyOffice.SPA/src/app/layout/page-loader/page-loader.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component } from '@angular/core'; -import { LoadingBarModule } from '@ngx-loading-bar/core'; - -@Component({ - selector: 'app-page-loader', - templateUrl: './page-loader.component.html', - styleUrls: ['./page-loader.component.scss'], - standalone: true, - imports: [LoadingBarModule], -}) -export class PageLoaderComponent { - constructor() { - // constructor - } -} diff --git a/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.html b/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.html deleted file mode 100644 index 9e15752..0000000 --- a/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.html +++ /dev/null @@ -1,48 +0,0 @@ -
- - - - -
-
-
- Setting Panel -
-
-
Select Layout
-
-
- -
Light
-
-
- -
Dark
-
-
-
-
-
Sidebar Menu Color
- - Light - Dark - -
-
-
RTL Layout
- -
-
-
-
-
diff --git a/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.scss b/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.scss deleted file mode 100644 index 8b13789..0000000 --- a/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.scss +++ /dev/null @@ -1 +0,0 @@ - diff --git a/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.spec.ts b/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.spec.ts deleted file mode 100644 index 2528b67..0000000 --- a/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { RightSidebarComponent } from './right-sidebar.component'; -describe('RightSidebarComponent', - () => { - let component: RightSidebarComponent; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [RightSidebarComponent], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(RightSidebarComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.ts b/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.ts deleted file mode 100644 index 84f3a00..0000000 --- a/MyOffice.SPA/src/app/layout/right-sidebar/right-sidebar.component.ts +++ /dev/null @@ -1,258 +0,0 @@ -import { DOCUMENT } from '@angular/common'; -import { - Component, - Inject, - ElementRef, - OnInit, - AfterViewInit, - Renderer2, - ChangeDetectionStrategy, - ChangeDetectorRef, -} from '@angular/core'; -import { ConfigService } from 'src/app/config/config.service'; -import { RightSidebarService } from 'src/app/core/service/rightsidebar.service'; -import { MatSlideToggleChange } from '@angular/material/slide-toggle'; -import { UnsubscribeOnDestroyAdapter } from 'src/app/shared/UnsubscribeOnDestroyAdapter'; -import { DirectionService } from 'src/app/core/service/direction.service'; -import { InConfiguration } from 'src/app/core/models/config.interface'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { NgScrollbarModule } from 'ngx-scrollbar'; - -@Component({ - changeDetection: ChangeDetectionStrategy.OnPush, - selector: 'app-right-sidebar', - templateUrl: './right-sidebar.component.html', - styleUrls: ['./right-sidebar.component.scss'], - standalone: true, - imports: [SharedModule, NgScrollbarModule], -}) -export class RightSidebarComponent -extends UnsubscribeOnDestroyAdapter -implements OnInit, AfterViewInit { - selectedBgColor = 'white'; - maxHeight!: string; - maxWidth!: string; - showpanel = false; - isOpenSidebar!: boolean; - isDarkSidebar = false; - isDarTheme = false; - innerHeight?: number; - headerHeight = 60; - isRtl = false; - config!: InConfiguration; - - constructor( - @Inject(DOCUMENT) private document: Document, - private renderer: Renderer2, - public elementRef: ElementRef, - private rightSidebarService: RightSidebarService, - private configService: ConfigService, - private directionService: DirectionService, - private cdr: ChangeDetectorRef - ) { - super(); - } - - ngOnInit() { - this.config = this.configService.configData; - this.subs.sink = this.rightSidebarService.sidebarState.subscribe( - (isRunning) => { - this.isOpenSidebar = isRunning; - } - ); - this.setRightSidebarWindowHeight(); - } - - ngAfterViewInit() { - // Light/dark skins only (clamp legacy color-skin values). - const storedSkin = localStorage.getItem('choose_skin_active'); - const skin = storedSkin === 'black' || this.config.layout.theme_color === 'black' - ? 'black' - : 'white'; - this.selectedBgColor = skin; - this.renderer.addClass(this.document.body, 'theme-' + skin); - localStorage.setItem('choose_skin', 'theme-' + skin); - localStorage.setItem('choose_skin_active', skin); - - if (localStorage.getItem('menuOption')) { - if (localStorage.getItem('menuOption') === 'menu_dark') { - this.isDarkSidebar = true; - } else if (localStorage.getItem('menuOption') === 'menu_light') { - this.isDarkSidebar = false; - } else { - this.isDarkSidebar = - this.config.layout.sidebar.backgroundColor === 'dark' ? true : false; - } - } else { - this.isDarkSidebar = - this.config.layout.sidebar.backgroundColor === 'dark' ? true : false; - } - - if (localStorage.getItem('theme')) { - if (localStorage.getItem('theme') === 'dark') { - this.isDarTheme = true; - } else if (localStorage.getItem('theme') === 'light') { - this.isDarTheme = false; - } else { - this.isDarTheme = this.config.layout.variant === 'dark' ? true : false; - } - } else { - this.isDarTheme = this.config.layout.variant === 'dark' ? true : false; - } - - // Content styles use body.dark; keep in sync with the layout toggle (theme-black alone is chrome-only). - if (this.isDarTheme) { - this.renderer.removeClass(this.document.body, 'light'); - this.renderer.addClass(this.document.body, 'dark'); - } else { - this.renderer.removeClass(this.document.body, 'dark'); - this.renderer.addClass(this.document.body, 'light'); - } - - if (localStorage.getItem('isRtl')) { - if (localStorage.getItem('isRtl') === 'true') { - this.setRTLSettings(); - } else if (localStorage.getItem('isRtl') === 'false') { - this.setLTRSettings(); - } - } else { - if (this.config.layout.rtl == true) { - this.setRTLSettings(); - } else { - this.setLTRSettings(); - } - } - this.cdr.markForCheck(); - } - - lightSidebarBtnClick() { - this.renderer.removeClass(this.document.body, 'menu_dark'); - this.renderer.removeClass(this.document.body, 'logo-black'); - this.renderer.addClass(this.document.body, 'menu_light'); - this.renderer.addClass(this.document.body, 'logo-white'); - this.isDarkSidebar = false; - localStorage.setItem('choose_logoheader', 'logo-white'); - localStorage.setItem('menuOption', 'menu_light'); - this.cdr.markForCheck(); - } - - darkSidebarBtnClick() { - this.renderer.removeClass(this.document.body, 'menu_light'); - this.renderer.removeClass(this.document.body, 'logo-white'); - this.renderer.addClass(this.document.body, 'menu_dark'); - this.renderer.addClass(this.document.body, 'logo-black'); - this.isDarkSidebar = true; - localStorage.setItem('choose_logoheader', 'logo-black'); - localStorage.setItem('menuOption', 'menu_dark'); - this.cdr.markForCheck(); - } - - lightThemeBtnClick() { - this.removeBodyThemeClasses(); - this.renderer.removeClass(this.document.body, 'dark'); - this.renderer.removeClass(this.document.body, 'menu_dark'); - this.renderer.removeClass(this.document.body, 'logo-black'); - - this.renderer.addClass(this.document.body, 'light'); - this.renderer.addClass(this.document.body, 'submenu-closed'); - this.renderer.addClass(this.document.body, 'menu_light'); - this.renderer.addClass(this.document.body, 'logo-white'); - this.renderer.addClass(this.document.body, 'theme-white'); - - this.selectedBgColor = 'white'; - this.isDarkSidebar = false; - this.isDarTheme = false; - localStorage.setItem('choose_logoheader', 'logo-white'); - localStorage.setItem('choose_skin', 'theme-white'); - localStorage.setItem('choose_skin_active', 'white'); - localStorage.setItem('theme', 'light'); - localStorage.setItem('menuOption', 'menu_light'); - this.cdr.markForCheck(); - } - - darkThemeBtnClick() { - this.removeBodyThemeClasses(); - this.renderer.removeClass(this.document.body, 'light'); - this.renderer.removeClass(this.document.body, 'menu_light'); - this.renderer.removeClass(this.document.body, 'logo-white'); - - this.renderer.addClass(this.document.body, 'dark'); - this.renderer.addClass(this.document.body, 'submenu-closed'); - this.renderer.addClass(this.document.body, 'menu_dark'); - this.renderer.addClass(this.document.body, 'logo-black'); - this.renderer.addClass(this.document.body, 'theme-black'); - - this.selectedBgColor = 'black'; - this.isDarkSidebar = true; - this.isDarTheme = true; - localStorage.setItem('choose_logoheader', 'logo-black'); - localStorage.setItem('choose_skin', 'theme-black'); - localStorage.setItem('choose_skin_active', 'black'); - localStorage.setItem('theme', 'dark'); - localStorage.setItem('menuOption', 'menu_dark'); - this.cdr.markForCheck(); - } - - /** Clears light/dark theme-* classes before applying a layout. */ - private removeBodyThemeClasses() { - ['theme-white', 'theme-black', 'theme-purple', 'theme-orange', 'theme-cyan', 'theme-green', 'theme-blue'] - .forEach((themeClass) => this.renderer.removeClass(this.document.body, themeClass)); - } - - setRightSidebarWindowHeight() { - this.innerHeight = window.innerHeight; - const height = this.innerHeight - this.headerHeight; - this.maxHeight = height + ''; - this.maxWidth = '500px'; - } - - onClickedOutside(event: Event) { - const button = event.target as HTMLButtonElement; - if (button.id !== 'settingBtn') { - if (this.isOpenSidebar === true) { - this.toggleRightSidebar(); - } - } - } - - toggleRightSidebar(): void { - this.rightSidebarService.setRightSidebar( - (this.isOpenSidebar = !this.isOpenSidebar) - ); - } - - switchDirection(event: MatSlideToggleChange) { - const isrtl = String(event.checked); - if ( - isrtl === 'false' && - document.getElementsByTagName('html')[0].hasAttribute('dir') - ) { - document.getElementsByTagName('html')[0].removeAttribute('dir'); - this.renderer.removeClass(this.document.body, 'rtl'); - this.directionService.updateDirection('ltr'); - } else if ( - isrtl === 'true' && - !document.getElementsByTagName('html')[0].hasAttribute('dir') - ) { - document.getElementsByTagName('html')[0].setAttribute('dir', 'rtl'); - this.renderer.addClass(this.document.body, 'rtl'); - this.directionService.updateDirection('rtl'); - } - localStorage.setItem('isRtl', isrtl); - this.isRtl = event.checked; - } - - setRTLSettings() { - document.getElementsByTagName('html')[0].setAttribute('dir', 'rtl'); - this.renderer.addClass(this.document.body, 'rtl'); - this.isRtl = true; - localStorage.setItem('isRtl', 'true'); - } - - setLTRSettings() { - document.getElementsByTagName('html')[0].removeAttribute('dir'); - this.renderer.removeClass(this.document.body, 'rtl'); - this.isRtl = false; - localStorage.setItem('isRtl', 'false'); - } -} diff --git a/MyOffice.SPA/src/app/layout/sidebar/sidebar-items.ts b/MyOffice.SPA/src/app/layout/sidebar/sidebar-items.ts deleted file mode 100644 index 08d9e58..0000000 --- a/MyOffice.SPA/src/app/layout/sidebar/sidebar-items.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { RouteInfo } from './sidebar.metadata'; - -export const ROUTES: RouteInfo[] = [ - { - path: '', - title: 'MENUITEMS.MAIN.TEXT', - iconType: '', - icon: '', - class: '', - groupTitle: true, - badge: '', - badgeClass: '', - submenu: [], - }, - { - path: '', - title: 'MENUITEMS.DASHBOARD.TEXT', - iconType: 'feather', - icon: 'home', - class: 'menu-toggle', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [ - { - path: 'dashboard/rests', - title: 'MENUITEMS.DASHBOARD.LIST.DASHBOARD', - iconType: '', - icon: '', - class: 'ml-menu', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [], - }, - { - path: 'dashboard/income', - title: 'MENUITEMS.DASHBOARD.LIST.INCOME', - iconType: '', - icon: '', - class: 'ml-menu', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [], - }, - { - path: 'dashboard/outcome', - title: 'MENUITEMS.DASHBOARD.LIST.OUTCOME', - iconType: '', - icon: '', - class: 'ml-menu', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [], - }, - ], - }, - - // Common Modules - { - id: 'accounts', - path: '', - title: 'MENUITEMS.ACCOUNTS.TEXT', - iconType: 'feather', - icon: 'chevrons-down', - class: 'menu-toggle', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [ - ], - }, - { - path: '', - title: 'MENUITEMS.SETTINGS.TEXT', - iconType: 'feather', - icon: 'settings', - class: 'menu-toggle', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [ - { - path: '/settings/currencies', - title: 'MENUITEMS.SETTINGS.LIST.CURRENCIES', - iconType: '', - icon: '', - class: 'ml-menu', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [], - }, - { - path: '/settings/account-categories', - title: 'MENUITEMS.SETTINGS.LIST.ACCOUNTCATEGORIES', - iconType: '', - icon: '', - class: 'ml-menu', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [], - }, - { - path: '/settings/accounts', - title: 'MENUITEMS.SETTINGS.LIST.ACCOUNTS', - iconType: '', - icon: '', - class: 'ml-menu', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [], - }, - { - path: '/settings/item-categories', - title: 'MENUITEMS.SETTINGS.LIST.ITEMCATEGORIES', - iconType: '', - icon: '', - class: 'ml-menu', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [], - }, - { - path: '/settings/items', - title: 'MENUITEMS.SETTINGS.LIST.ITEMS', - iconType: '', - icon: '', - class: 'ml-menu', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [], - }, - ], - }, -]; diff --git a/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.html b/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.html deleted file mode 100644 index aa8d3f3..0000000 --- a/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.html +++ /dev/null @@ -1,75 +0,0 @@ - diff --git a/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.scss b/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.scss deleted file mode 100644 index 8b13789..0000000 --- a/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.scss +++ /dev/null @@ -1 +0,0 @@ - diff --git a/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.spec.ts b/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.spec.ts deleted file mode 100644 index 5d604f1..0000000 --- a/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { SidebarComponent } from './sidebar.component'; -describe('SidebarComponent', - () => { - let component: SidebarComponent; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [SidebarComponent], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(SidebarComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.ts b/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.ts deleted file mode 100644 index f76d647..0000000 --- a/MyOffice.SPA/src/app/layout/sidebar/sidebar.component.ts +++ /dev/null @@ -1,208 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -// angular -import { Router, NavigationEnd } from '@angular/router'; -import { DOCUMENT } from '@angular/common'; -import { Component, DestroyRef, Inject, ElementRef, OnInit, Renderer2, HostListener, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { filter } from 'rxjs/operators'; - -// libs -import { NgScrollbarModule } from 'ngx-scrollbar'; -import { TranslateModule } from '@ngx-translate/core'; - -// app -import { ROUTES } from './sidebar-items'; -import { AuthService } from 'src/app/core/service/auth.service'; -import { AccountCategoryService } from '../../services/account.category.service'; -import { RouteInfo } from './sidebar.metadata'; -import { SharedModule } from 'src/app/shared/shared.module'; - -@Component({ - selector: 'app-sidebar', - templateUrl: './sidebar.component.html', - styleUrls: ['./sidebar.component.scss'], - standalone: true, - imports: [SharedModule, NgScrollbarModule, TranslateModule], -}) -export class SidebarComponent implements OnInit { - sidebarItems!: RouteInfo[]; - innerHeight?: number; - bodyTag!: HTMLElement; - listMaxHeight?: string; - listMaxWidth?: string; - userFullName?: string; - userImg?: string; - userType?: string; - headerHeight = 60; - currentRoute?: string; - menuIcon = 'radio_button_checked'; - private readonly destroyRef = inject(DestroyRef); - - constructor( - @Inject(DOCUMENT) private document: Document, - private renderer: Renderer2, - public elementRef: ElementRef, - private authService: AuthService, - private router: Router, - private accountCategoryService: AccountCategoryService, - ) { - this.elementRef.nativeElement.closest('body'); - this.router.events - .pipe( - filter((event): event is NavigationEnd => event instanceof NavigationEnd), - takeUntilDestroyed(this.destroyRef) - ) - .subscribe(() => { - // close sidebar on mobile screen after menu select - this.renderer.removeClass(this.document.body, 'overlay-open'); - }); - } - - @HostListener('window:resize', ['$event']) - windowResizecall() { - this.setMenuHeight(); - this.checkStatuForResize(false); - } - - @HostListener('document:mousedown', ['$event']) - onGlobalClick(event: Event): void { - if (!this.elementRef.nativeElement.contains(event.target)) { - this.renderer.removeClass(this.document.body, 'overlay-open'); - } - } - - callToggleMenu(event: Event, length: number) { - if (length > 0) { - const parentElement = (event.target as HTMLInputElement).closest('li'); - const activeClass = parentElement?.classList.contains('active'); - - if (activeClass) { - this.renderer.removeClass(parentElement, 'active'); - } else { - this.renderer.addClass(parentElement, 'active'); - } - } - } - - ngOnInit() { - if (this.authService.currentUserValue) { - this.userFullName = - this.authService.currentUserValue.firstName + - ' ' + - this.authService.currentUserValue.lastName; - this.userImg = this.authService.currentUserValue.img; - this.userType = 'Admin'; - this.sidebarItems = ROUTES.filter((sidebarItem) => sidebarItem); - - this.accountCategoryService - .getCategories() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(categories => { - var accounts = this.sidebarItems.filter(x => x.id === 'accounts'); - accounts[0].submenu = []; - for (var category of categories) { - accounts[0].submenu.push({ - path: '/account-category/' + category.id, - title: category.name!, - iconType: '', - icon: '', - class: 'ml-menu', - groupTitle: false, - badge: '', - badgeClass: '', - submenu: [], - - }); - } - }); - } - - // this.sidebarItems = ROUTES.filter((sidebarItem) => sidebarItem); - this.initLeftSidebar(); - this.bodyTag = this.document.body; - } - - initLeftSidebar() { - // eslint-disable-next-line @typescript-eslint/no-this-alias - const _this = this; - // Set menu height - _this.setMenuHeight(); - _this.checkStatuForResize(true); - } - - setMenuHeight() { - this.innerHeight = window.innerHeight; - const height = this.innerHeight - this.headerHeight; - this.listMaxHeight = height + ''; - this.listMaxWidth = '500px'; - } - - isOpen() { - return this.bodyTag.classList.contains('overlay-open'); - } - - checkStatuForResize(firstTime: boolean) { - if (window.innerWidth < 1170) { - this.renderer.addClass(this.document.body, 'ls-closed'); - } else { - this.renderer.removeClass(this.document.body, 'ls-closed'); - } - } - - mouseHover() { - const body = this.elementRef.nativeElement.closest('body'); - if (body.classList.contains('submenu-closed')) { - this.renderer.addClass(this.document.body, 'side-closed-hover'); - this.renderer.removeClass(this.document.body, 'submenu-closed'); - } - } - - mouseOut() { - const body = this.elementRef.nativeElement.closest('body'); - if (body.classList.contains('side-closed-hover')) { - this.renderer.removeClass(this.document.body, 'side-closed-hover'); - this.renderer.addClass(this.document.body, 'submenu-closed'); - } - } - - mobileMenuSidebarOpen(event: Event, className: string) { - const hasClass = (event.target as HTMLInputElement).classList.contains( - className - ); - if (hasClass) { - this.renderer.removeClass(this.document.body, className); - } else { - this.renderer.addClass(this.document.body, className); - } - } - - callSidemenuCollapse() { - const hasClass = this.document.body.classList.contains('side-closed'); - if (hasClass) { - this.renderer.removeClass(this.document.body, 'side-closed'); - this.renderer.removeClass(this.document.body, 'submenu-closed'); - this.menuIcon = 'radio_button_checked'; - } else { - this.renderer.addClass(this.document.body, 'side-closed'); - this.renderer.addClass(this.document.body, 'submenu-closed'); - this.menuIcon = 'radio_button_unchecked'; - } - - const sideClosedHover = - this.document.body.classList.contains('side-closed'); - if (sideClosedHover) { - this.renderer.removeClass(this.document.body, 'side-closed-hover'); - } - } - - logout() { - this.authService.logout() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((res) => { - if (!res.success) { - console.log('sidebar.logout'); - this.router.navigate(['/authentication/signin']); - } - }); - } -} diff --git a/MyOffice.SPA/src/app/layout/sidebar/sidebar.metadata.ts b/MyOffice.SPA/src/app/layout/sidebar/sidebar.metadata.ts deleted file mode 100644 index 1be5931..0000000 --- a/MyOffice.SPA/src/app/layout/sidebar/sidebar.metadata.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Sidebar route metadata -export interface RouteInfo { - id?: string; - path: string; - title: string; - iconType: string; - icon: string; - class: string; - groupTitle: boolean; - badge: string; - badgeClass: string; - submenu: RouteInfo[]; -} diff --git a/MyOffice.SPA/src/app/model/account.accessRight.model.ts b/MyOffice.SPA/src/app/model/account.accessRight.model.ts deleted file mode 100644 index 0836e3f..0000000 --- a/MyOffice.SPA/src/app/model/account.accessRight.model.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { UserModel } from '../core/models/user.model'; - -export interface AccountAccessRightModel { - user: UserModel; - isAllowRead: boolean; - isAllowWrite: boolean; - isAllowManage: boolean; - isAllowDelete: boolean; - isOwner: boolean; -} diff --git a/MyOffice.SPA/src/app/model/account.category.model.ts b/MyOffice.SPA/src/app/model/account.category.model.ts deleted file mode 100644 index 2d33b16..0000000 --- a/MyOffice.SPA/src/app/model/account.category.model.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface AccountCategoryModel { - id?: string, - name?: string, - allowDelete: boolean, -} diff --git a/MyOffice.SPA/src/app/model/account.detailed.model.ts b/MyOffice.SPA/src/app/model/account.detailed.model.ts deleted file mode 100644 index 6c0bcc9..0000000 --- a/MyOffice.SPA/src/app/model/account.detailed.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { AccountModel } from './account.model'; - -export interface AccountDetailedModel { - account: AccountModel; - rest: number; -} diff --git a/MyOffice.SPA/src/app/model/account.invite.model.ts b/MyOffice.SPA/src/app/model/account.invite.model.ts deleted file mode 100644 index 7c45d0b..0000000 --- a/MyOffice.SPA/src/app/model/account.invite.model.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface AccountInviteModel { - id?: string, - account?: string, - allowWrite: boolean, -} diff --git a/MyOffice.SPA/src/app/model/account.model.ts b/MyOffice.SPA/src/app/model/account.model.ts deleted file mode 100644 index f617014..0000000 --- a/MyOffice.SPA/src/app/model/account.model.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AccountCategoryModel } from './account.category.model'; -import { AccountAccessRightModel } from './account.accessRight.model'; - -export interface AccountModel { - id?: string, - name?: string, - currencyId?: string, - currencyName?: string, - type?: string, - allowWrite: boolean, - allowDelete: boolean, - allowManage: boolean, - categories?: AccountCategoryModel[], - accessRights?: AccountAccessRightModel[], -} diff --git a/MyOffice.SPA/src/app/model/currency.model.ts b/MyOffice.SPA/src/app/model/currency.model.ts deleted file mode 100644 index 5ad985a..0000000 --- a/MyOffice.SPA/src/app/model/currency.model.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface CurrencyModel { - id?: string, - name?: string, - code?: string, - shortName?: string, - symbol?: string, - quantity?: number, - rate?: number, - rateDate?: Date, - isConnected?: boolean, - isPrimary?: boolean, -} diff --git a/MyOffice.SPA/src/app/model/dashboard.model.ts b/MyOffice.SPA/src/app/model/dashboard.model.ts deleted file mode 100644 index 1545917..0000000 --- a/MyOffice.SPA/src/app/model/dashboard.model.ts +++ /dev/null @@ -1,38 +0,0 @@ -export interface DashboardModel { - incomeLast: number; - incomePrevious: number; - incomeChange: number; - outcomeLast: number; - outcomePrevious: number; - outcomeChange: number; - - balance: number; - balanceDebit: number; - balanceCredit: number; - - balanceRests: DashboardRestModel[]; -} - -export interface DashboardRestModel { - id: string; - name: string; - currencyName: string; - currencyShortName: string; - balance: number; - currencyRate: number; - currencyQuantity: number; - balanceAtRate: number; -} - -export interface DashboardInOutModel { - data: DashboardInOutItemModel[]; - details: DashboardInOutItemModel[]; -} - -export interface DashboardInOutItemModel { - id: string; - currency: string; - name: string; - value: number; - valueRaw: number; -} diff --git a/MyOffice.SPA/src/app/model/item.category.model.ts b/MyOffice.SPA/src/app/model/item.category.model.ts deleted file mode 100644 index 73a4191..0000000 --- a/MyOffice.SPA/src/app/model/item.category.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface ItemCategoryModel { - id?: string, - name?: string, - allowDelete: boolean, - internal: boolean, -} diff --git a/MyOffice.SPA/src/app/model/item.model.ts b/MyOffice.SPA/src/app/model/item.model.ts deleted file mode 100644 index 661682d..0000000 --- a/MyOffice.SPA/src/app/model/item.model.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface ItemModel { - id?: string, - name?: string, - categoryId?: string, - category?: string, - allowDelete: boolean, -} diff --git a/MyOffice.SPA/src/app/model/motion.model.ts b/MyOffice.SPA/src/app/model/motion.model.ts deleted file mode 100644 index 40a82d5..0000000 --- a/MyOffice.SPA/src/app/model/motion.model.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface MotionModel { - id?: string; - date?: Date; - item?: string; - description?: string; - itemId?: string; - accountId?: string; - plus?: number; - minus?: number; - amountBalancing?: number; -} diff --git a/MyOffice.SPA/src/app/pages/accounts/account.component.html b/MyOffice.SPA/src/app/pages/accounts/account.component.html deleted file mode 100644 index 50c925d..0000000 --- a/MyOffice.SPA/src/app/pages/accounts/account.component.html +++ /dev/null @@ -1,22 +0,0 @@ - - - -

{{account.account.name}}

-

- {{account.rest | number: '1.2-6'}} - ({{account.account.currencyId}}) -

-
-
-
- -
-
- - - - -
diff --git a/MyOffice.SPA/src/app/pages/accounts/account.component.scss b/MyOffice.SPA/src/app/pages/accounts/account.component.scss deleted file mode 100644 index 493077c..0000000 --- a/MyOffice.SPA/src/app/pages/accounts/account.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -:host-context(body.dark)account-motion:nth-child(even) { - filter: brightness(1); -} - -:host-context(body.dark)account-motion:nth-child(odd) { - filter: brightness(1.75); -} - -:host-context(body.light)account-motion:nth-child(even) { - filter: brightness(0.75); -} - -:host-context(body.light)account-motion:nth-child(odd) { - filter: brightness(1); -} diff --git a/MyOffice.SPA/src/app/pages/accounts/account.component.ts b/MyOffice.SPA/src/app/pages/accounts/account.component.ts deleted file mode 100644 index 852fdfb..0000000 --- a/MyOffice.SPA/src/app/pages/accounts/account.component.ts +++ /dev/null @@ -1,110 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { Input } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { ActivatedRoute } from '@angular/router'; -import { Output } from '@angular/core'; -import { EventEmitter } from '@angular/core'; - -// libs -import moment from 'moment'; -import { Observable } from 'rxjs'; - -// app -import { ApiRoutes } from '../../api-routes'; -import { AccountDetailedModel } from '../../model/account.detailed.model'; -import { MotionModel } from '../../model/motion.model'; - -@Component({ - templateUrl: './account.component.html', - styleUrls: ['./account.component.scss'], - selector: 'account' -}) -export class AccountComponent { - public motions?: MotionModel[]; - public newMotion: MotionModel; - public dateFrom: Date = moment(new Date).add(-7, 'days').toDate(); - public dateTo: Date = moment(new Date).add(0, 'days').toDate(); - @Input('account') account!: AccountDetailedModel; - @Input('active') active: boolean = false; - @Input() reloadEvent!: Observable; - - @Output() onUpdate: EventEmitter = new EventEmitter(); - private readonly destroyRef = inject(DestroyRef); - - constructor( - private httpClient: HttpClient, - private activatedRoute: ActivatedRoute - ) { - this.newMotion = { - date: new Date(), - plus: 0, - minus: 0, - }; - } - - ngOnInit(): void { - this.loadMotions(); - - this.reloadEvent - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - if (x.find(id => id === this.account.account.id)) { - this.loadMotions(); - } - }); - } - - onSubmitClick() { - } - - handlerOnAdd(motions: MotionModel[]) { - this.onUpdate?.emit(motions.filter(x => x.accountId !== this.account.account!.id)); - this.loadMotions(); - - this.httpClient - .get(ApiRoutes.Account.replace(':id', this.account.account!.id!)) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.account = data; - }); - } - - handlerOnDelete(motion: MotionModel) { - const index = this.motions!.findIndex(x => x.id === motion.id); - this.motions!.splice(index, 1); - } - - onChangePeriod(dates: Date[]) { - this.dateFrom = dates[0]; - this.dateTo = dates[1]; - this.loadMotions(); - } - - private loadMotions() { - var url = ApiRoutes.Motions.replace(':id', this.account.account.id!); - url += '?from=' + moment(this.dateFrom).format('yyyy-MM-DD'); - url += '&to=' + moment(this.dateTo).format('yyyy-MM-DD'); - - this.httpClient - .get(url) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.motions = data; - }); - } - - afterExpand() { - var refresh = window.location.protocol + "//"; - refresh += window.location.host; - refresh += window.location.pathname; - refresh += window.location.hash; - var idx = refresh.indexOf('/account/'); - if (idx > -1) { - refresh = refresh.substr(0, idx); - } - refresh += '/account/' + this.account.account.id; - window.history.pushState({ path: refresh }, '', refresh); - } -} diff --git a/MyOffice.SPA/src/app/pages/accounts/account.list.component.html b/MyOffice.SPA/src/app/pages/accounts/account.list.component.html deleted file mode 100644 index 8af7ec9..0000000 --- a/MyOffice.SPA/src/app/pages/accounts/account.list.component.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
-
- - - -
-
-
- -
- -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/accounts/account.list.component.scss b/MyOffice.SPA/src/app/pages/accounts/account.list.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/accounts/account.list.component.ts b/MyOffice.SPA/src/app/pages/accounts/account.list.component.ts deleted file mode 100644 index c61c669..0000000 --- a/MyOffice.SPA/src/app/pages/accounts/account.list.component.ts +++ /dev/null @@ -1,62 +0,0 @@ -// angular -import { Component, DestroyRef, inject, OnInit } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; -import { ActivatedRoute } from '@angular/router'; - -// libs -import { Subject } from 'rxjs'; - -// app -import { AccountCategoryService } from '../../services/account.category.service'; -import { ApiRoutes } from '../../api-routes'; -import { AccountDetailedModel } from '../../model/account.detailed.model'; -import { MotionModel } from '../../model/motion.model'; - -@Component({ - templateUrl: './account.list.component.html', - styleUrls: ['./account.list.component.scss'], -}) -export class AccountListComponent implements OnInit { - public accounts?: AccountDetailedModel[]; - public category = ''; - public activeAccount = ''; - - reloadSubject: Subject = new Subject(); - private readonly destroyRef = inject(DestroyRef); - - constructor( - private httpClient: HttpClient, - private activatedRoute: ActivatedRoute, - private accountCategoryService: AccountCategoryService, - ) { - this.activatedRoute.params - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => this.activeAccount = x['accountId']); - } - - ngOnInit(): void { - this.activatedRoute.params - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(params => { - var categoryId = params['id']; - - this.httpClient - .get(ApiRoutes.Accounts + '?category=' + categoryId) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.accounts = data; - }); - this.accountCategoryService - .getCategory(categoryId) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.category = data.name!; - }); - }); - } - - handlerOnUpdate(motions: MotionModel[]) { - this.reloadSubject.next(motions.map(x => x.accountId!)); - } -} diff --git a/MyOffice.SPA/src/app/pages/accounts/motion.component.html b/MyOffice.SPA/src/app/pages/accounts/motion.component.html deleted file mode 100644 index 91e378b..0000000 --- a/MyOffice.SPA/src/app/pages/accounts/motion.component.html +++ /dev/null @@ -1,84 +0,0 @@ -
-
-
-
- - arrow_back - - - - - YYYY/MM/DD - - - - Please enter rate date - - - - - arrow_forward - -
-
-
- - - Motion - !! - - - - Please enter motion - - - - {{item.name}} - - - - - - -
-
- - - - Please enter motion - - - - - - Please enter motion - - -
-
- - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/accounts/motion.component.scss b/MyOffice.SPA/src/app/pages/accounts/motion.component.scss deleted file mode 100644 index 47f7e12..0000000 --- a/MyOffice.SPA/src/app/pages/accounts/motion.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -.mat-mdc-option.mdc-list-item.mat-mdc-option-active { - filter: brightness(50%) -} diff --git a/MyOffice.SPA/src/app/pages/accounts/motion.component.ts b/MyOffice.SPA/src/app/pages/accounts/motion.component.ts deleted file mode 100644 index 82938a9..0000000 --- a/MyOffice.SPA/src/app/pages/accounts/motion.component.ts +++ /dev/null @@ -1,274 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; -import { FormBuilder } from '@angular/forms'; -import { FormGroup } from '@angular/forms'; -import { Validators } from '@angular/forms'; -import { Input } from '@angular/core'; -import { Output } from '@angular/core'; -import { EventEmitter } from '@angular/core'; -import { ViewChild } from '@angular/core'; -import { ElementRef } from '@angular/core'; - -// libs -import moment from 'moment'; -import Swal from 'sweetalert2'; -import { debounceTime, switchMap } from 'rxjs/operators'; -import { of } from 'rxjs'; -import { pulseAnimation } from 'angular-animations'; - -// app -import { ApiRoutes } from '../../api-routes'; -import { AccountModel } from '../../model/account.model'; -import { MotionModel } from '../../model/motion.model'; -import { ItemModel } from '../../model/item.model'; -import { atLeastOneNumber } from '../../core/validators/atleastonenumber.validator'; - -@Component({ - selector: 'account-motion', - templateUrl: './motion.component.html', - styleUrls: ['./motion.component.scss'], - animations: [ - pulseAnimation({ direction: '<=>', duration: 200 }), - ], -}) -export class MotionComponent { - public form!: FormGroup; - public errorMessage?: string; - public filteredItems: ItemModel[] = []; - public option?: string; - public selectedItem?: ItemModel; - public inProgress: boolean = false; - - @Input('motion') motion!: MotionModel; - @Input('account') account!: AccountModel; - - @Output() onAdd: EventEmitter = new EventEmitter(); - @Output() onDelete: EventEmitter = new EventEmitter(); - - @ViewChild('motionInput') motionInput?: ElementRef; - @ViewChild('dateInput') dateInput?: ElementRef; - private readonly destroyRef = inject(DestroyRef); - - constructor( - private fb: FormBuilder, - private httpClient: HttpClient, - ) { - } - - ngOnInit(): void { - this.form = this.fb.group({ - id: [ - this.motion.id, - ], - date: [ - this.motion.date, - [Validators.required], - ], - item: [ - this.motion.item, - [Validators.required], - ], - description: [ - this.motion.description, - ], - plus: [ - this.motion.plus, - ], - minus: [ - this.motion.minus, - ], - }, { - validator: atLeastOneNumber(Validators.required, ['plus', 'minus']) - }); - - this.form.controls['item'].valueChanges - .pipe( - debounceTime(200), - switchMap(value => { - if (!value || typeof value !== 'string') { - return of([] as ItemModel[]); - } - this.selectedItem = undefined; - return this.httpClient.get( - ApiRoutes.Items + '?term=' + encodeURIComponent(value) - ); - }), - takeUntilDestroyed(this.destroyRef) - ) - .subscribe(x => { - this.filteredItems = x; - }); - - this.form.valueChanges - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(() => { - this.form.controls['plus'].markAsPristine(); - this.form.controls['plus'].markAsUntouched(); - this.form.controls['plus'].setErrors(null); - this.form.controls['minus'].markAsPristine(); - this.form.controls['minus'].markAsUntouched(); - this.form.controls['minus'].setErrors(null); - }); - } - - displayFn(item: any): string { - var value = item && item.name ? item.name : item; - return value; - } - - selectedFn(item: ItemModel) { - this.selectedItem = item; - } - - add() { - this.form.markAllAsTouched(); - - if (this.form.hasError('atLeastOne')) { - this.form.get('plus')!.setErrors(this.form.errors); - this.form.get('minus')!.setErrors(this.form.errors); - return; - } - - if (!this.form.valid) { - return; - } - - this.setInProgress(); - - var data: MotionModel = { - date: this.form.value.date, - description: this.form.value.description, - plus: this.form.value.plus || 0, - minus: this.form.value.minus || 0, - }; - - if (this.form.value.item.name) { - data.date = this.form.value.date; - data.item = this.form.value.item.name; - data.itemId = this.form.value.item.id; - data.accountId = this.form.value.item.accountId; - data.amountBalancing = data.plus! > 0 ? data.plus : data.minus; - } else { - data.item = this.form.value.item; - } - - this.httpClient - .post(ApiRoutes.Motions.replace(':id', this.account.id!), data) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe({ - next: response => { - this.onAdd?.emit(response); - - this.form.patchValue({ - item: '', - plus: 0, - minus: 0, - }); - - this.filteredItems = []; - this.motionInput?.nativeElement.focus(); - this.form.markAsUntouched(); - this.setInProgress(false); - }, - error: error => { - this.errorMessage = error.detail; - this.setInProgress(false); - } - }); - } - - private setInProgress(inProgress: boolean = true) { - this.inProgress = inProgress; - } - - update() { - this.form.markAllAsTouched(); - - if (!this.form.valid) { - if (this.form.hasError('atLeastOne')) { - this.form.get('plus')!.setErrors(this.form.errors); - this.form.get('minus')!.setErrors(this.form.errors); - } - return; - } - - this.setInProgress(); - - var url = ApiRoutes.Motion - .replace(':id', this.account.id!) - .replace(':motionId', this.motion.id!); - - var data = this.form.value; - data.motion = data.item.name - ? data.item.name - : data.motion; - data.itemId = this.selectedItem?.id; - - this.httpClient - .put(url, data) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe({ - next: () => { - this.form.markAsUntouched(); - this.setInProgress(false); - }, - error: error => { - this.errorMessage = error.detail; - this.setInProgress(false); - } - }); - } - - delete() { - Swal.fire({ - title: 'Delete motion ' + this.motion.item, - showCancelButton: true, - confirmButtonText: 'Delete', - showLoaderOnConfirm: true, - preConfirm: (name) => { - return new Promise((resolve, reject) => { - var url = ApiRoutes.Motion - .replace(':id', this.account.id!) - .replace(':motionId', this.motion.id!); - - this.setInProgress(); - - this.httpClient.delete(url) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe({ - next: data => { - resolve(data); - this.setInProgress(false); - }, - error: error => { - Swal.showValidationMessage(error.detail); - reject(); - this.setInProgress(false); - } - }); - - }).catch(x => { - return false; - }); - }, - allowOutsideClick: () => !Swal.isLoading(), - }).then((result) => { - if (result.isConfirmed) { - this.onDelete?.emit((result.value! as MotionModel)); - } - }); - } - - import() { - - } - - addDay(days: number) { - var date = moment(this.form!.get('date')!.value).add(days, 'days').toDate(); - this.form.patchValue({ - date: date, - }); - } -} diff --git a/MyOffice.SPA/src/app/pages/pages-routing.module.ts b/MyOffice.SPA/src/app/pages/pages-routing.module.ts deleted file mode 100644 index 9341c68..0000000 --- a/MyOffice.SPA/src/app/pages/pages-routing.module.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { UserProfileComponent } from './user-profile/user-profile.component'; -import { SettingsCurrencyComponent } from './settings/currency/currency.component'; -import { SettingsAccountCategoryComponent } from './settings/account/account.category.component'; -import { SettingsAccountComponent } from './settings/account/account.component'; -import { SettingsItemCategoryComponent } from './settings/item/item.category.component'; -import { SettingsItemComponent } from './settings/item/item.component'; -import { AccountListComponent } from './accounts/account.list.component'; - -const routes: Routes = [ - { - path: '', - redirectTo: 'signin', - pathMatch: 'full', - }, - { - path: 'user/profile', - component: UserProfileComponent, - }, - { - path: 'settings/currencies', - component: SettingsCurrencyComponent, - }, - { - path: 'settings/account-categories', - component: SettingsAccountCategoryComponent, - }, - { - path: 'settings/accounts', - component: SettingsAccountComponent, - }, - { - path: 'settings/item-categories', - component: SettingsItemCategoryComponent, - }, - { - path: 'settings/items', - component: SettingsItemComponent, - }, - { - path: 'account-category/:id', - component: AccountListComponent, - }, - { - path: 'account-category/:id/account/:accountId', - component: AccountListComponent, - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class PagesRoutingModule { -} diff --git a/MyOffice.SPA/src/app/pages/pages.module.ts b/MyOffice.SPA/src/app/pages/pages.module.ts deleted file mode 100644 index 7a18563..0000000 --- a/MyOffice.SPA/src/app/pages/pages.module.ts +++ /dev/null @@ -1,102 +0,0 @@ -// angular -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { ReactiveFormsModule } from '@angular/forms'; - -// libs -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTabsModule } from '@angular/material/tabs'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatGridListModule } from '@angular/material/grid-list'; -import { MatCardModule } from '@angular/material/card'; -import { NgxMaskDirective, NgxMaskPipe } from 'ngx-mask'; -import { NgxCurrencyDirective } from 'ngx-currency'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatMenuModule } from '@angular/material/menu'; -import { MAT_DATE_LOCALE } from '@angular/material/core'; - -// app -import { PagesRoutingModule } from './pages-routing.module'; -import { ComponentsModule } from '../shared/components/components.module'; -import { SettingsCurrencyComponent } from './settings/currency/currency.component'; -import { SettingsConnectCurrencyComponent } from './settings/currency/connect.currency.component'; -import { UserProfileComponent } from './user-profile/user-profile.component'; -import { SettingsRateCurrencyComponent } from './settings/currency/rate.currency.component'; -import { SettingsAccountCategoryComponent } from './settings/account/account.category.component'; -import { SettingsAccountComponent } from './settings/account/account.component'; -import { SettingsAccountAddComponent } from './settings/account/add.account.component'; -import { SettingsAccountEditComponent } from './settings/account/edit.account.component'; -import { SettingsAccountAccessComponent } from './settings/account/access.account.component'; -import { CurrencyService } from '../services/currency.service'; -import { ItemService } from '../services/item.service'; -import { SettingsItemCategoryComponent } from './settings/item/item.category.component'; -import { SettingsItemComponent } from './settings/item/item.component'; -import { SettingsItemEditComponent } from './settings/item/edit.item.component'; -import { AccountListComponent } from './accounts/account.list.component'; -import { AccountComponent } from './accounts/account.component'; -import { MotionComponent } from './accounts/motion.component'; -import { SettingsItemCategoryEditComponent } from './settings/item/edit.item.category.component'; - -@NgModule({ - declarations: [ - UserProfileComponent, - - SettingsCurrencyComponent, - SettingsConnectCurrencyComponent, - SettingsRateCurrencyComponent, - - SettingsAccountCategoryComponent, - SettingsAccountComponent, - SettingsAccountAddComponent, - SettingsAccountEditComponent, - SettingsAccountAccessComponent, - - SettingsItemCategoryComponent, - SettingsItemComponent, - SettingsItemEditComponent, - SettingsItemCategoryEditComponent, - - AccountListComponent, - AccountComponent, - MotionComponent, - ], - imports: [ - CommonModule, - ComponentsModule, - FormsModule, - ReactiveFormsModule, - PagesRoutingModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - MatIconModule, - MatButtonModule, - MatTabsModule, - MatDialogModule, - MatDatepickerModule, - MatGridListModule, - MatCardModule, - MatExpansionModule, - MatAutocompleteModule, - NgxMaskDirective, - NgxMaskPipe, - NgxCurrencyDirective, - MatCheckboxModule, - MatMenuModule, - ], - providers: [ - { provide: MAT_DATE_LOCALE, useValue: 'en-GB' }, - CurrencyService, - ItemService, - ], -}) -export class PagesModule { -} diff --git a/MyOffice.SPA/src/app/pages/settings/account/access.account.component.html b/MyOffice.SPA/src/app/pages/settings/account/access.account.component.html deleted file mode 100644 index 78ddef0..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/access.account.component.html +++ /dev/null @@ -1,47 +0,0 @@ -
-
- - - - - - -
-
- -
- - Email - - -
-
-
-
User rights
-
- - Allow write - -
-
-
-
-
-
- - {{access.user.email}} - (owner) -
-
- - Allow write - -
-
- -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/account/access.account.component.scss b/MyOffice.SPA/src/app/pages/settings/account/access.account.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/settings/account/access.account.component.ts b/MyOffice.SPA/src/app/pages/settings/account/access.account.component.ts deleted file mode 100644 index 818d251..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/access.account.component.ts +++ /dev/null @@ -1,128 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; -import { Inject } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; - -// libs -import Swal from 'sweetalert2'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; -import * as ld from 'lodash'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { AccountModel } from '../../../model/account.model'; -import { MatDialogRef } from '@angular/material/dialog'; -import { CurrencyService } from '../../../services/currency.service'; -import { CurrencyModel } from '../../../model/currency.model'; -import { AccountCategoryService } from '../../../services/account.category.service'; -import { AccountCategoryModel } from '../../../model/account.category.model'; -import { AccountAccessRightModel } from '../../../model/account.accessRight.model'; -import { AccountService } from '../../../services/account.service'; - -@Component({ - templateUrl: './access.account.component.html', - styleUrls: ['./access.account.component.scss'], -}) -export class SettingsAccountAccessComponent { - public editForm!: FormGroup; - public errorMessage?: string; - public currencies?: CurrencyModel[]; - public categories?: AccountCategoryModel[]; - public types = new Map(); - - public accessRightsSorted: AccountAccessRightModel[]; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private fb: FormBuilder, - private httpClient: HttpClient, - private dialogRef: MatDialogRef, - private accountService: AccountService, - @Inject(MAT_DIALOG_DATA) public account: AccountModel - ) { - this.types = this.accountService.getTypes(); - - this.accessRightsSorted = ld.orderBy(account.accessRights!, ['isOwner', 'user.email'], ['desc', 'asc']); - - } - - ngOnInit(): void { - const accesses = this.fb.array( - this.accessRightsSorted.map(x => this.fb.group({ - userId: [ - x.user.id - ], - allowWrite: [{ - value: x.isAllowWrite, - disabled: !x.isAllowDelete, - }], - })) - ); - - this.editForm = this.fb.group({ - email: [ - '', - ], - allowWrite: [ - false, - ], - accesses: accesses, - }); - } - - removeAccessRight(accessRight: AccountAccessRightModel) { - Swal.fire({ - title: 'Delete access ' + accessRight.user.email, - showCancelButton: true, - confirmButtonText: 'Delete', - showLoaderOnConfirm: true, - preConfirm: (name) => { - return new Promise((resolve, reject) => { - var url = ApiRoutes.SettingsAccountAccess - .replace(':id', this.account.id!) - .replace(':access', accessRight.user.id); - - this.errorMessage = undefined; - this.httpClient - .delete(url, this.editForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - resolve(response); - }, error => { - Swal.showValidationMessage(error.detail); - reject(); - }); - - }).catch(x => { - return false; - }); - }, - allowOutsideClick: () => !Swal.isLoading(), - }).then((result) => { - if (result.isConfirmed) { - this.dialogRef.close({ refresh: true }); - } - }); - } - - closeDialog(): void { - this.dialogRef.close(); - } - - onSubmitClick() { - if (this.editForm.valid) { - this.errorMessage = undefined; - this.httpClient - .post(ApiRoutes.SettingsAccountAccesses.replace(':id', this.account.id!), this.editForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - this.dialogRef.close({ refresh: true }); - }, error => { - this.errorMessage = error.detail; - }); - } - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/account/account.category.component.html b/MyOffice.SPA/src/app/pages/settings/account/account.category.component.html deleted file mode 100644 index 55ca473..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/account.category.component.html +++ /dev/null @@ -1,47 +0,0 @@ -
-
-
- - - -
-
-
- - - - - Account categories - - - - -
- -
- -
- - - - - - - -
{{item.name}} - - -
-
-
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/account/account.category.component.scss b/MyOffice.SPA/src/app/pages/settings/account/account.category.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/settings/account/account.category.component.ts b/MyOffice.SPA/src/app/pages/settings/account/account.category.component.ts deleted file mode 100644 index 2c6c309..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/account.category.component.ts +++ /dev/null @@ -1,129 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; - -// libs -import Swal from 'sweetalert2'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { AccountCategoryModel } from '../../../model/account.category.model'; - -@Component({ - templateUrl: './account.category.component.html', - styleUrls: ['./account.category.component.scss'], -}) -export class SettingsAccountCategoryComponent { - public categories?: AccountCategoryModel[]; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private httpClient: HttpClient, - ) { - } - - ngOnInit(): void { - this.load(); - } - - private load() { - this.httpClient - .get(ApiRoutes.SettingsAccountCategories) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.categories = data; - }); - } - - public add() { - Swal.fire({ - title: 'Account category name', - input: 'text', - inputAttributes: { - autocapitalize: 'off', - }, - showCancelButton: true, - confirmButtonText: 'Add', - showLoaderOnConfirm: true, - preConfirm: (name) => { - return new Promise((resolve, reject) => { - this.httpClient.post(ApiRoutes.SettingsAccountCategories, { name: name }) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - resolve(data); - }, error => { - Swal.showValidationMessage(error.detail); - reject(); - }); - - }).catch(x => { - return false; - }); - }, - allowOutsideClick: () => !Swal.isLoading(), - }).then((result) => { - this.load(); - }); - } - - public edit(category: AccountCategoryModel) { - Swal.fire({ - title: 'Account category name', - input: 'text', - inputValue: category.name, - inputAttributes: { - autocapitalize: 'off', - }, - showCancelButton: true, - confirmButtonText: 'Update', - showLoaderOnConfirm: true, - preConfirm: (name) => { - return new Promise((resolve, reject) => { - this.httpClient.put(ApiRoutes.SettingsAccountCategory.replace(':id', category.id!), { name: name }) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - resolve(data); - }, error => { - Swal.showValidationMessage(error.detail); - reject(); - }); - - }).catch(x => { - return false; - }); - }, - allowOutsideClick: () => !Swal.isLoading(), - }).then((result) => { - this.load(); - }); - } - - public remove(category: AccountCategoryModel) { - Swal.fire({ - title: 'Delete account category ' + category.name, - showCancelButton: true, - confirmButtonText: 'Delete', - showLoaderOnConfirm: true, - preConfirm: (name) => { - return new Promise((resolve, reject) => { - this.httpClient.delete(ApiRoutes.SettingsAccountCategory.replace(':id', category.id!)) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - resolve(data); - }, error => { - Swal.showValidationMessage(error.detail); - reject(); - }); - - }).catch(x => { - return false; - }); - }, - allowOutsideClick: () => !Swal.isLoading(), - }).then((result) => { - this.load(); - }); - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/account/account.component.html b/MyOffice.SPA/src/app/pages/settings/account/account.component.html deleted file mode 100644 index 7f820bc..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/account.component.html +++ /dev/null @@ -1,99 +0,0 @@ -
-
-
- - - -
-
-
- - - - - Accounts - - - - -
-
- - - - -
- -
- -
- - - - - - - - - - - -
{{account.name}}{{account.currencyId}}{{account.type}} - - - -
-
- - - - - - - - - - -
{{account.name}}{{account.currencyId}}{{account.type}} - - -
-
- - - - - - - - - -
{{account.name}}{{account.currencyId}} - - -
-
-
-
-
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/account/account.component.scss b/MyOffice.SPA/src/app/pages/settings/account/account.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/settings/account/account.component.ts b/MyOffice.SPA/src/app/pages/settings/account/account.component.ts deleted file mode 100644 index d2bcf46..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/account.component.ts +++ /dev/null @@ -1,214 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; - -// libs -import Swal from 'sweetalert2'; -import { MatDialog } from '@angular/material/dialog'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { AccountModel } from '../../../model/account.model'; -import { AccountCategoryModel } from '../../../model/account.category.model'; -import { AccountInviteModel } from '../../../model/account.invite.model'; -import { SettingsAccountAddComponent } from './add.account.component'; -import { SettingsAccountEditComponent } from './edit.account.component'; -import { SettingsAccountAccessComponent } from './access.account.component'; -import { AccountCategoryService } from '../../../services/account.category.service'; - -@Component({ - templateUrl: './account.component.html', - styleUrls: ['./account.component.scss'], -}) -export class SettingsAccountComponent { - public accountCategories?: AccountCategoryModel[]; - public accounts?: AccountModel[]; - public invites?: AccountInviteModel[]; - public tabIndex = 0; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private httpClient: HttpClient, - private dialogModel: MatDialog, - private accountCategoryService: AccountCategoryService, - ) { - } - - ngOnInit(): void { - this.loadCategories(); - this.loadInvites(); - } - - private loadAccounts(accountToShow?: string) { - this.httpClient - .get(ApiRoutes.SettingsAccounts) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.accounts = data; - if (accountToShow) { - var idx = -1; - var account = this.accounts.find(x => x.id === accountToShow); - if (account && account.categories && account.categories.length > 0) { - for (var i = 0; i < this.accountCategories!.length; i++) { - if (account!.categories!.find(c => c.id === this.accountCategories![i].id)) { - idx = i; - break; - } - } - } - this.tabIndex = idx === -1 ? this.accountCategories!.length : idx; - } - }); - } - - private loadInvites() { - return this.httpClient - .get(ApiRoutes.SettingsAccountInvites) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - this.invites = response; - }); - } - - private loadCategories() { - this.accountCategoryService - .getCategories() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - this.accountCategories = x; - this.loadAccounts(); - }); - } - - public accountInCategory(category?: AccountCategoryModel) { - if (this.accounts) { - return this.accounts.filter(acc => (!category && (!acc.categories || acc.categories.length === 0)) || (category && acc.categories && acc.categories.filter(cat => cat.id === category.id).length > 0)); - } - return null; - } - - public add() { - this.dialogModel.open(SettingsAccountAddComponent, { - width: '640px', - disableClose: true, - data: this.accounts, - }).afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - if (x && x.refresh) { - this.loadAccounts(); - } - }); - } - - public edit(account: AccountModel) { - this.dialogModel.open(SettingsAccountEditComponent, { - width: '640px', - disableClose: true, - data: account, - }).afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - if (x && x.refresh) { - this.loadAccounts(); - } - }); - } - - public remove(account: AccountModel) { - Swal.fire({ - title: 'Remove account ' + account.name, - showCancelButton: true, - confirmButtonText: 'Delete', - showLoaderOnConfirm: true, - preConfirm: (name) => { - return new Promise((resolve, reject) => { - this.httpClient.delete(ApiRoutes.SettingsAccount.replace(':id', account.id!)) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - resolve(data); - }, error => { - Swal.showValidationMessage(error.detail); - reject(); - }); - - }).catch(x => { - return false; - }); - }, - allowOutsideClick: () => !Swal.isLoading(), - }).then((result) => { - this.loadAccounts(); - }); - } - - public access(account: AccountModel) { - this.dialogModel.open(SettingsAccountAccessComponent, { - width: '640px', - disableClose: true, - data: account, - }).afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - if (x && x.refresh) { - this.loadAccounts(); - } - }); - } - - public startInvite(invite: AccountInviteModel) { - Swal.fire({ - title: 'Accept to invite the account "' + invite.account + '"', - input: 'text', - inputLabel: 'Accept with name', - inputValue: invite.account, - showDenyButton: true, - showCancelButton: true, - confirmButtonText: 'Accept', - denyButtonText: 'Reject', - showLoaderOnConfirm: true, - preConfirm: (input) => { - return new Promise((resolve, reject) => { - this.httpClient.post(ApiRoutes.SettingsAccountInviteAccept.replace(':id', invite.id!), { name: input }) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - resolve(data); - }, error => { - Swal.showValidationMessage(error); - reject(); - }); - - }).catch(x => { - return false; - }); - }, - preDeny: (x) => { - return new Promise((resolve, reject) => { - this.httpClient.post(ApiRoutes.SettingsAccountInviteReject.replace(':id', invite.id!), null) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - resolve(data); - }, error => { - Swal.showValidationMessage(error.detail); - reject(); - }); - - }).catch(x => { - return false; - }); - }, - allowOutsideClick: () => !Swal.isLoading(), - }).then((result) => { - var id; - if (result.value) { - var account = result.value as AccountModel; - id = account.id; - } - this.loadInvites(); - this.loadAccounts(id); - }); - - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/account/add.account.component.html b/MyOffice.SPA/src/app/pages/settings/account/add.account.component.html deleted file mode 100644 index 5f94441..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/add.account.component.html +++ /dev/null @@ -1,62 +0,0 @@ -
-
- - - - - - -
-
-
- - Type - - - {{type.key}} ({{type.value}}) - - - -
-
-
- -
-
-
- - Name - - -
-
-
-
- - Currency - - - {{currency.code}} ({{currency.name}}) - - - -
-
-
-
-
-
- - Category - - - {{category.name}} - - - -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/account/add.account.component.scss b/MyOffice.SPA/src/app/pages/settings/account/add.account.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/settings/account/add.account.component.ts b/MyOffice.SPA/src/app/pages/settings/account/add.account.component.ts deleted file mode 100644 index 70688cd..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/add.account.component.ts +++ /dev/null @@ -1,101 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; -import { Inject } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; - -// libs -import Swal from 'sweetalert2'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { AccountModel } from '../../../model/account.model'; -import { MatDialogRef } from '@angular/material/dialog'; -import { CurrencyService } from '../../../services/currency.service'; -import { CurrencyModel } from '../../../model/currency.model'; -import { AccountCategoryService } from '../../../services/account.category.service'; -import { AccountCategoryModel } from '../../../model/account.category.model'; -import { AuthService } from '../../../core/service/auth.service'; -import { AccountService } from '../../../services/account.service'; - -@Component({ - templateUrl: './add.account.component.html', - styleUrls: ['./add.account.component.scss'], -}) -export class SettingsAccountAddComponent { - public editForm!: FormGroup; - public errorMessage?: string; - public currencies?: CurrencyModel[]; - public categories?: AccountCategoryModel[]; - public username: string; - public types = new Map(); - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private fb: FormBuilder, - private httpClient: HttpClient, - private dialogRef: MatDialogRef, - private currencyService: CurrencyService, - private accountCategoryService: AccountCategoryService, - private authService: AuthService, - private accountService: AccountService, - @Inject(MAT_DIALOG_DATA) public account: AccountModel - ) { - this.username = authService.currentUserValue.userName; - this.types = this.accountService.getTypes(); - } - - ngOnInit(): void { - this.editForm = this.fb.group({ - id: [ - this.account.id, - ], - name: [ - this.account.name, - [Validators.required], - ], - currencyId: [ - this.account.currencyId, - [Validators.required], - ], - categoryId: [ - '', - [Validators.required], - ], - type: [ - this.account.type - ] - }); - - this.currencyService - .getCurrencies() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => this.currencies = x); - - this.accountCategoryService - .getCategories() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => this.categories = x); - } - - closeDialog(): void { - this.dialogRef.close(); - } - - onSubmitClick() { - if (this.editForm.valid) { - this.errorMessage = undefined; - this.httpClient - .post(ApiRoutes.SettingsAccounts, this.editForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - this.dialogRef.close({ refresh: true }); - }, error => { - this.errorMessage = error.detail; - }); - } - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/account/edit.account.component.html b/MyOffice.SPA/src/app/pages/settings/account/edit.account.component.html deleted file mode 100644 index 913a55a..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/edit.account.component.html +++ /dev/null @@ -1,93 +0,0 @@ -
-
- - - - - - -
-
-
- - Type - - - {{type.key}} ({{type.value}}) - - - -
-
-
- -
-
-
- - Name - - -
-
-
-
- - Currency - - - {{currency.code}} ({{currency.name}}) - - - -
-
-
- -
-
- - - - - - - - -
{{category.name}} - -
- -
No categories assigned
-
-
-
- -
-
- -
- - Category - - - {{category.name}} - - - - -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/account/edit.account.component.scss b/MyOffice.SPA/src/app/pages/settings/account/edit.account.component.scss deleted file mode 100644 index 07f1433..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/edit.account.component.scss +++ /dev/null @@ -1,24 +0,0 @@ -.section-label { - display: block; - font-weight: 500; - margin-bottom: 8px; -} - -.category-add-block { - margin-bottom: 8px; -} - -.category-add-row { - display: flex; - align-items: flex-start; - gap: 12px; -} - -.category-add-select { - flex: 1; -} - -.empty-categories { - opacity: 0.7; - padding: 8px 0 16px; -} diff --git a/MyOffice.SPA/src/app/pages/settings/account/edit.account.component.ts b/MyOffice.SPA/src/app/pages/settings/account/edit.account.component.ts deleted file mode 100644 index d5550e1..0000000 --- a/MyOffice.SPA/src/app/pages/settings/account/edit.account.component.ts +++ /dev/null @@ -1,161 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; -import { Inject } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; - -// libs -import Swal from 'sweetalert2'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; -import * as ld from 'lodash'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { AccountModel } from '../../../model/account.model'; -import { MatDialogRef } from '@angular/material/dialog'; -import { CurrencyService } from '../../../services/currency.service'; -import { CurrencyModel } from '../../../model/currency.model'; -import { AccountCategoryService } from '../../../services/account.category.service'; -import { AccountCategoryModel } from '../../../model/account.category.model'; -import { AccountAccessRightModel } from '../../../model/account.accessRight.model'; -import { AccountService } from '../../../services/account.service'; - -@Component({ - templateUrl: './edit.account.component.html', - styleUrls: ['./edit.account.component.scss'], -}) -export class SettingsAccountEditComponent { - public editForm!: FormGroup; - public errorMessage?: string; - public currencies?: CurrencyModel[]; - public categories?: AccountCategoryModel[]; - public types = new Map(); - - public categoriesSorted: AccountCategoryModel[]; - public accessRightsSorted: AccountAccessRightModel[]; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private fb: FormBuilder, - private httpClient: HttpClient, - private dialogRef: MatDialogRef, - private currencyService: CurrencyService, - private accountCategoryService: AccountCategoryService, - private accountService: AccountService, - @Inject(MAT_DIALOG_DATA) public account: AccountModel - ) { - this.types = this.accountService.getTypes(); - - this.categoriesSorted = ld.orderBy(account.categories ?? [], ['name'], ['asc']); - this.accessRightsSorted = ld.orderBy(account.accessRights!, ['isOwner', 'user.email'], ['desc', 'asc']); - } - - /** Categories not yet assigned to this account (for the Add select). */ - get availableCategories(): AccountCategoryModel[] { - const assigned = new Set((this.categoriesSorted ?? []).map(c => c.id)); - return (this.categories ?? []).filter(c => !assigned.has(c.id)); - } - - ngOnInit(): void { - this.editForm = this.fb.group({ - id: [ - this.account.id, - ], - name: [ - this.account.name, - [Validators.required], - ], - currencyId: [ - this.account.currencyId, - [Validators.required], - ], - categoryId: [ - '', - ], - type: [ - this.account.type, - ], - userEmail: [ - '', - ], - }); - - this.currencyService - .getCurrencies() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => this.currencies = x); - - this.accountCategoryService - .getCategories() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => this.categories = x); - } - - addCategory() { - const categoryId = this.editForm.get('categoryId')?.value; - if (!categoryId || !this.editForm.valid) { - this.editForm.markAllAsTouched(); - return; - } - - this.errorMessage = undefined; - this.httpClient - .put(ApiRoutes.SettingsAccount.replace(':id', this.account.id!), this.editForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe({ - next: account => { - this.applyAccountCategories(account); - this.editForm.patchValue({ categoryId: '' }); - }, - error: error => { - this.errorMessage = error.detail; - }, - }); - } - - removeCategory(category: AccountCategoryModel) { - const url = ApiRoutes.SettingsAccountAccountCategory - .replace(':id', this.account.id!) - .replace(':categoryId', category.id!); - - this.errorMessage = undefined; - this.httpClient - .delete(url) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe({ - next: account => this.applyAccountCategories(account), - error: error => { - this.errorMessage = error.detail; - }, - }); - } - - private applyAccountCategories(account: AccountModel) { - this.account.categories = account.categories ?? []; - this.categoriesSorted = ld.orderBy(this.account.categories, ['name'], ['asc']); - } - - removeAccessRight(accessRight: AccountAccessRightModel) { - - } - - closeDialog(): void { - this.dialogRef.close(); - } - - onSubmitClick() { - if (this.editForm.valid) { - this.errorMessage = undefined; - this.httpClient - .put(ApiRoutes.SettingsAccount.replace(':id', this.account.id!), this.editForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - this.dialogRef.close({ refresh: true }); - }, error => { - this.errorMessage = error.detail; - }); - } - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.html b/MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.html deleted file mode 100644 index 8d21ed8..0000000 --- a/MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.html +++ /dev/null @@ -1,85 +0,0 @@ -
-
- - - - - - -
-
-
- - Symbol - - -
-
-
-
- - Code - - -
-
-
-
-
-
- - Name - - -
-
-
-
- - Short Name - - -
-
-
-
-
-
- - Rate - - - Please enter rate - - -
-
-
-
- - Quantity - - - Please enter rate - - -
-
-
-
- - Rate Date - - YYYY/MM/DD - - - - Please enter rate date - - -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.scss b/MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.ts b/MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.ts deleted file mode 100644 index 7d142ee..0000000 --- a/MyOffice.SPA/src/app/pages/settings/currency/connect.currency.component.ts +++ /dev/null @@ -1,80 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { Inject } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; - -// libs -import { MatDialogRef } from '@angular/material/dialog'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { CurrencyModel } from '../../../model/currency.model'; - -@Component({ - templateUrl: './connect.currency.component.html', - styleUrls: ['./connect.currency.component.scss'], -}) -export class SettingsConnectCurrencyComponent { - public addForm!: FormGroup; - public errorMessage?: string; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private fb: FormBuilder, - private httpClient: HttpClient, - private dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public currency: CurrencyModel - ) { - } - - public ngOnInit(): void { - this.addForm = this.fb.group({ - id: [ - this.currency.id, - ], - symbol: [ - this.currency.symbol, - ], - name: [ - this.currency.name, - ], - shortName: [ - this.currency.id, - ], - quantity: [ - this.currency.quantity || 1, - [Validators.required], - ], - rate: [ - this.currency.rate || 1, - [Validators.required], - ], - rateDate: [ - this.currency.rateDate, - [Validators.required], - ], - }); - } - - closeDialog(): void { - this.dialogRef.close(); - } - - onSubmitClick() { - if (this.addForm.valid) { - this.errorMessage = undefined; - this.httpClient - .post(ApiRoutes.SettingsCurrencies, this.addForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - this.dialogRef.close({ refresh: true }); - }, error => { - this.errorMessage = error.detail; - }); - } - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/currency/currency.component.html b/MyOffice.SPA/src/app/pages/settings/currency/currency.component.html deleted file mode 100644 index f3c3b86..0000000 --- a/MyOffice.SPA/src/app/pages/settings/currency/currency.component.html +++ /dev/null @@ -1,88 +0,0 @@ -
-
-
- - - -
-
-
-
-
-

My currencies

-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - -
CodeNameShort NameQuantityRateRate Date
{{item.code}}{{item.name}}{{item.shortName}} - {{item.quantity}} - - {{item.rate | number: '1.2-6'}} - {{item.symbol}} - {{item.rateDate | date:'yyyy-MM-dd'}} - - -
-
-
- -
- - - - - - - - - - - - - - - - - -
{{item.symbol}}{{item.id}}{{item.name}} - -
-
-
-
-
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/currency/currency.component.scss b/MyOffice.SPA/src/app/pages/settings/currency/currency.component.scss deleted file mode 100644 index faf4a57..0000000 --- a/MyOffice.SPA/src/app/pages/settings/currency/currency.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -// Primary currency highlight must target cells — Bootstrap paints td backgrounds, -// so a class on alone is invisible in light theme. -.table tbody tr.currency-row-primary > td, -.table tbody tr.currency-row-primary > th { - background-color: rgba(0, 188, 212, 0.18) !important; - color: inherit; -} - -:host-context(body.dark) { - .table tbody tr.currency-row-primary > td, - .table tbody tr.currency-row-primary > th { - background-color: rgba(33, 150, 243, 0.22) !important; - color: #cfe8ff; - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/currency/currency.component.ts b/MyOffice.SPA/src/app/pages/settings/currency/currency.component.ts deleted file mode 100644 index adab3f8..0000000 --- a/MyOffice.SPA/src/app/pages/settings/currency/currency.component.ts +++ /dev/null @@ -1,133 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; - -// libs -import { MatDialog } from '@angular/material/dialog'; -import Swal from 'sweetalert2'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { SettingsConnectCurrencyComponent } from './connect.currency.component'; -import { CurrencyModel } from '../../../model/currency.model'; -import { SettingsRateCurrencyComponent } from './rate.currency.component'; - -@Component({ - templateUrl: './currency.component.html', - styleUrls: ['./currency.component.scss'], -}) -export class SettingsCurrencyComponent { - public tabIndex = 0; - - public currencies?: CurrencyModel[]; - public myCurrencies?: CurrencyModel[]; - public primaryId?: string; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private httpClient: HttpClient, - private dialogModel: MatDialog - ) { - } - - ngOnInit(): void { - this.load(); - } - - connect(currency: CurrencyModel) { - this.dialogModel.open(SettingsConnectCurrencyComponent, { - width: '640px', - disableClose: true, - data: currency, - }).afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - if (x && x.refresh) { - this.tabIndex = 0; - this.loadMyCurrency(); - } - }); - } - - disconnect(currency: CurrencyModel) { - } - - setRate(currency: CurrencyModel) { - this.dialogModel.open(SettingsRateCurrencyComponent, { - width: '640px', - disableClose: true, - data: currency, - }).afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - if (x && x.refresh) { - this.loadMyCurrency(); - } - }); - } - - delete(currency: CurrencyModel) { - Swal.fire({ - title: 'Delete currency ' + currency.name, - showCancelButton: true, - confirmButtonText: 'Delete', - showLoaderOnConfirm: true, - preConfirm: (name) => { - return new Promise((resolve, reject) => { - this.httpClient.delete(ApiRoutes.SettingsCurrency.replace(':id', currency.id!)) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - resolve(data); - }, error => { - Swal.showValidationMessage(error.detail); - reject(); - }); - - }).catch(x => { - return false; - }); - }, - allowOutsideClick: () => !Swal.isLoading(), - }).then((result) => { - this.load(); - }); - - } - - private load() { - this.httpClient - .get(ApiRoutes.GeneralCurrencies) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.currencies = data; - this.loadMyCurrency(); - }); - } - - private loadMyCurrency() { - this.httpClient - .get(ApiRoutes.SettingsCurrencies) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.myCurrencies = data - .sort((a, b) => a.code!.localeCompare(b.code!)) - .map(myCurrency => { - var globalCurrency = this.currencies?.find(x => x.id === myCurrency.code); - - return { - id: myCurrency.id, - code: myCurrency.code, - name: myCurrency.name, - quantity: myCurrency.quantity, - rate: myCurrency.rate, - rateDate: myCurrency.rateDate, - shortName: myCurrency.shortName, - symbol: globalCurrency?.symbol, - isPrimary: myCurrency.isPrimary, - }; - }); - }); - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.html b/MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.html deleted file mode 100644 index 61c3640..0000000 --- a/MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.html +++ /dev/null @@ -1,95 +0,0 @@ -
-
- - - - - - -
-
-
- - Symbol - - -
-
-
-
- - Code - - -
-
-
-
- - Name - - -
-
-
-
- - Short name - - -
-
-
-
-
-
- - Rate - - - Please enter rate - - -
-
-
-
- - Quantity - - - Please enter rate - - -
-
-
-
- - Rate Date - - DD/MM/YYYY - - - - Please enter rate date - - -
-
-
-
-
-
- - Primary currency - -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.scss b/MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.ts b/MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.ts deleted file mode 100644 index 88b4777..0000000 --- a/MyOffice.SPA/src/app/pages/settings/currency/rate.currency.component.ts +++ /dev/null @@ -1,99 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { Inject } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; - -// libs -import { MatDialogRef } from '@angular/material/dialog'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { CurrencyModel } from '../../../model/currency.model'; - -@Component({ - templateUrl: './rate.currency.component.html', - styleUrls: ['./rate.currency.component.scss'], -}) -export class SettingsRateCurrencyComponent { - public addForm!: FormGroup; - public error?: any; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private fb: FormBuilder, - private httpClient: HttpClient, - private dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public currency: CurrencyModel - ) { - } - - public ngOnInit(): void { - this.addForm = this.fb.group({ - id: [ - this.currency.id, - ], - code: [ - this.currency.code, - ], - symbol: [ - this.currency.symbol, - ], - name: [ - this.currency.name, - ], - shortName: [ - this.currency.shortName, - ], - quantity: [ - this.currency.quantity || 1, - [Validators.required], - ], - rate: [ - this.currency.rate || 1, - [Validators.required], - ], - rateDate: [ - this.currency.rateDate, - [Validators.required], - ], - isPrimary: [ - this.currency.isPrimary, - ], - }); - } - - closeDialog(): void { - this.dialogRef.close(); - } - - onSubmitClick() { - this.error = undefined; - if (this.addForm.valid) { - this.httpClient - .put(ApiRoutes.SettingsCurrency.replace(':id', this.addForm.value.id), this.addForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe({ - next: (response) => { - this.httpClient - .post(ApiRoutes.SettingsCurrenciesRate.replace(':id', this.addForm.value.id), this.addForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe({ - next: (response) => { - this.dialogRef.close({ refresh: true }); - }, - error: (error) => { - this.error = error; - }, - }); - }, - error: (error) => { - this.error = error; - } - }); - } - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.html b/MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.html deleted file mode 100644 index dafe1c2..0000000 --- a/MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.html +++ /dev/null @@ -1,26 +0,0 @@ -
-
- - - - - - -
-
-
- - Name - - -
-
-
-
- Is internal motion -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.scss b/MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.ts b/MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.ts deleted file mode 100644 index 017b03e..0000000 --- a/MyOffice.SPA/src/app/pages/settings/item/edit.item.category.component.ts +++ /dev/null @@ -1,77 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; -import { Inject } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; - -// libs -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatDialogRef } from '@angular/material/dialog'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { ItemCategoryModel } from '../../../model/item.category.model'; - -@Component({ - templateUrl: './edit.item.category.component.html', - styleUrls: ['./edit.item.category.component.scss'], -}) -export class SettingsItemCategoryEditComponent { - public editForm!: FormGroup; - public errorMessage?: string; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private fb: FormBuilder, - private httpClient: HttpClient, - private dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public category: ItemCategoryModel - ) { - } - - ngOnInit(): void { - this.editForm = this.fb.group({ - id: [ - this.category.id, - ], - name: [ - this.category.name, - [Validators.required], - ], - internal: [ - this.category?.internal ?? false, - ], - }); - } - - closeDialog(): void { - this.dialogRef.close(); - } - - onSubmitClick() { - if (this.editForm.valid) { - this.errorMessage = undefined; - if (!this.category.id) { - this.httpClient - .post(ApiRoutes.SettingsItemCategories, this.editForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - this.dialogRef.close({ category: response, refresh: true }); - }, error => { - this.errorMessage = error.detail; - }); - } else { - this.httpClient - .put(ApiRoutes.SettingsItemCategory.replace(':id', this.category.id!), this.editForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - this.dialogRef.close({ category: response, refresh: true }); - }, error => { - this.errorMessage = error.detail; - }); - } - } - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/item/edit.item.component.html b/MyOffice.SPA/src/app/pages/settings/item/edit.item.component.html deleted file mode 100644 index 910111a..0000000 --- a/MyOffice.SPA/src/app/pages/settings/item/edit.item.component.html +++ /dev/null @@ -1,33 +0,0 @@ -
-
- - - - - - -
-
-
- - Name - - -
-
-
-
- - Category - - - {{category.name}} - - - -
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/item/edit.item.component.scss b/MyOffice.SPA/src/app/pages/settings/item/edit.item.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/settings/item/edit.item.component.ts b/MyOffice.SPA/src/app/pages/settings/item/edit.item.component.ts deleted file mode 100644 index 42bbe1b..0000000 --- a/MyOffice.SPA/src/app/pages/settings/item/edit.item.component.ts +++ /dev/null @@ -1,78 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; -import { Inject } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; - -// libs -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatDialogRef } from '@angular/material/dialog'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { ItemCategoryModel } from '../../../model/item.category.model'; -import { ItemModel } from '../../../model/item.model'; -import { ItemService } from '../../../services/item.service'; - -@Component({ - templateUrl: './edit.item.component.html', - styleUrls: ['./edit.item.component.scss'], -}) -export class SettingsItemEditComponent { - public editForm!: FormGroup; - public errorMessage?: string; - public categories?: ItemCategoryModel[]; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private fb: FormBuilder, - private httpClient: HttpClient, - private dialogRef: MatDialogRef, - private itemService: ItemService, - @Inject(MAT_DIALOG_DATA) public item: ItemModel - ) { - } - - ngOnInit(): void { - this.editForm = this.fb.group({ - id: [ - this.item.id, - ], - name: [ - this.item.name, - [Validators.required], - ], - category: [ - this.item.categoryId, - [Validators.required], - ], - }); - - this.itemService - .getCategories() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => this.categories = x); - } - - closeDialog(): void { - this.dialogRef.close(); - } - - onSubmitClick() { - console.log(this.item); - console.log(this.editForm.value); - if (this.editForm.valid) { - this.errorMessage = undefined; - this.httpClient - .put(ApiRoutes.SettingsItem.replace(':id', this.item.id!), this.editForm.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(response => { - this.dialogRef.close({ motion: response, refresh: true }); - }, error => { - this.errorMessage = error.detail; - }); - } - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/item/item.category.component.html b/MyOffice.SPA/src/app/pages/settings/item/item.category.component.html deleted file mode 100644 index f56ed7c..0000000 --- a/MyOffice.SPA/src/app/pages/settings/item/item.category.component.html +++ /dev/null @@ -1,49 +0,0 @@ -
-
-
- - - -
-
-
- - - - - - - - -
- -
- -
- - - - - - - - -
{{item.name}} - done - - - -
-
-
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/item/item.category.component.scss b/MyOffice.SPA/src/app/pages/settings/item/item.category.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/settings/item/item.category.component.ts b/MyOffice.SPA/src/app/pages/settings/item/item.category.component.ts deleted file mode 100644 index fce7de7..0000000 --- a/MyOffice.SPA/src/app/pages/settings/item/item.category.component.ts +++ /dev/null @@ -1,97 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; - -// libs -import Swal from 'sweetalert2'; -import { MatDialog } from '@angular/material/dialog'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { ItemCategoryModel } from '../../../model/item.category.model'; -import { SettingsItemCategoryEditComponent } from './edit.item.category.component'; - -@Component({ - templateUrl: './item.category.component.html', - styleUrls: ['./item.category.component.scss'], -}) -export class SettingsItemCategoryComponent { - public categories?: ItemCategoryModel[]; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private httpClient: HttpClient, - private dialogModel: MatDialog, - ) { - } - - ngOnInit(): void { - this.load(); - } - - private load() { - this.httpClient - .get(ApiRoutes.SettingsItemCategories) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.categories = data; - }); - } - - public add() { - this.dialogModel.open(SettingsItemCategoryEditComponent, { - width: '640px', - disableClose: true, - data: { }, - }).afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - if (x && x.refresh) { - this.load(); - } - }); - } - - public edit(category: ItemCategoryModel) { - this.dialogModel.open(SettingsItemCategoryEditComponent, { - width: '640px', - disableClose: true, - data: category, - }).afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - if (x && x.refresh) { - this.load(); - } - }); - } - - public remove(category: ItemCategoryModel) { - Swal.fire({ - title: 'Delete item category ' + category.name, - showCancelButton: true, - confirmButtonText: 'Delete', - showLoaderOnConfirm: true, - preConfirm: (name) => { - return new Promise((resolve, reject) => { - this.httpClient.delete(ApiRoutes.SettingsItemCategory.replace(':id', category.id!)) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - resolve(data); - }, error => { - Swal.showValidationMessage(error.detail); - reject(); - }); - - }).catch(x => { - return false; - }); - }, - allowOutsideClick: () => !Swal.isLoading(), - }).then((result) => { - this.load(); - }); - } -} diff --git a/MyOffice.SPA/src/app/pages/settings/item/item.component.html b/MyOffice.SPA/src/app/pages/settings/item/item.component.html deleted file mode 100644 index c93753c..0000000 --- a/MyOffice.SPA/src/app/pages/settings/item/item.component.html +++ /dev/null @@ -1,77 +0,0 @@ -
-
-
- - - -
-
-
-
-
-
-
    - - Move to category - - - {{category.name}} - - - -
- -
    - - Code - - -
-
    - -
-
-
-
-
-
- - - - - Motions - - - - -
-
- -
- - - - - - - -
- - {{item.model.name}} - - - -
-
-
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/settings/item/item.component.scss b/MyOffice.SPA/src/app/pages/settings/item/item.component.scss deleted file mode 100644 index 72edd68..0000000 --- a/MyOffice.SPA/src/app/pages/settings/item/item.component.scss +++ /dev/null @@ -1,11 +0,0 @@ -.card-title { - display: flex; -} - -.left-content { - flex: 1; -} - -.right-content { - margin-left: auto; -} diff --git a/MyOffice.SPA/src/app/pages/settings/item/item.component.ts b/MyOffice.SPA/src/app/pages/settings/item/item.component.ts deleted file mode 100644 index f58012f..0000000 --- a/MyOffice.SPA/src/app/pages/settings/item/item.component.ts +++ /dev/null @@ -1,130 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; - -// libs -import Swal from 'sweetalert2'; -import { MatDialog } from '@angular/material/dialog'; - -// app -import { ApiRoutes } from '../../../api-routes'; -import { SettingsItemEditComponent } from './edit.item.component'; -import { ItemService } from '../../../services/item.service'; -import { ISelectableModel } from '../../../core/models/selectable.model'; -import { ItemModel } from '../../../model/item.model'; -import { ItemCategoryModel } from '../../../model/item.category.model'; - -@Component({ - templateUrl: './item.component.html', - styleUrls: ['./item.component.scss'], -}) -export class SettingsItemComponent { - public items?: ISelectableModel[]; - public categories?: ItemCategoryModel[]; - public selectedCategory?: ItemCategoryModel; - public selectedCount: number = 0; - public category?: ItemCategoryModel; - public categoryAddShow: boolean = false; - public categoryAddName?: string; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private dialogModel: MatDialog, - private httpClient: HttpClient, - private itemService: ItemService, - ) { - } - - ngOnInit(): void { - this.load(); - } - - private load(categoryId?: string) { - this.itemService.getCategories() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.categories = data; - var selected = data[0]; - if (categoryId) { - var categories = this.categories.filter(x => x.id === categoryId); - selected = categories.length === 0 - ? selected - : categories[0]; - } - - this.selectCategory(selected); - }); - } - - public selectCategory(category: ItemCategoryModel) { - this.selectedCategory = category; - this.itemService.getItems(category.id) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.items = data.map>(x => { return { model: x, selected: false } }); - }); - } - - public edit(item: ItemModel) { - this.dialogModel.open(SettingsItemEditComponent, { - width: '640px', - disableClose: true, - data: item, - }).afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - if (x && x.refresh) { - console.log(x.motion.categoryId); - this.load(x.motion.categoryId); - } - }); - } - - public remove(category: ItemModel) { - Swal.fire({ - title: 'Delete item from ' + category.name, - showCancelButton: true, - confirmButtonText: 'Delete', - showLoaderOnConfirm: true, - preConfirm: (name) => { - return new Promise((resolve, reject) => { - this.httpClient.delete(ApiRoutes.SettingsItemCategory.replace(':id', category.id!)) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - resolve(data); - }, error => { - Swal.showValidationMessage(error.detail); - reject(); - }); - - }).catch(x => { - return false; - }); - }, - allowOutsideClick: () => !Swal.isLoading(), - }).then((result) => { - this.load(); - }); - } - - onCheckboxChange(item: ISelectableModel) { - this.selectedCount += item.selected ? 1 : -1; - } - - onCategoryChange(item: any) { - var data = { - category: item.value, - items: this.items!.filter(x => x.selected).map(x => x.model.id) - } - this.httpClient.post(ApiRoutes.SettingsItems, data) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.category = undefined; - this.selectedCount = 0; - this.load(); - }, error => { - }); - } -} diff --git a/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.html b/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.html deleted file mode 100644 index e418b7c..0000000 --- a/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.html +++ /dev/null @@ -1,129 +0,0 @@ -
-
-
- - - -
-
-
-
-
-

User Profile

-
-
-
-
-
- - Email - - email - -
-
-
-
- - First name - - face - - Only characters or numbers allowed - - -
-
- - Last name - - face - - Only characters or numbers allowed - - -
-
-
-
- - Full name - - face - - Full name is empty - - -
-
-
-
- - Currency - - - ({{item.symbol}}) {{item.name}} - - - - -
-
-
-
- - -
-
-
-
-
-
-
-
-
-

- Providers -

-
-
-
-
- link - email - mark_email_read -
-
- {{provider.name}} -
-
- - - - - - -
-
-
-
-
-
-
-
diff --git a/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.scss b/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.spec.ts b/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.spec.ts deleted file mode 100644 index bc71b08..0000000 --- a/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { UserProfileComponent } from './user-profile.component'; - -describe('UserProfileComponent', - () => { - let component: UserProfileComponent; - let fixture: ComponentFixture; - beforeEach( - waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [UserProfileComponent], - }).compileComponents(); - }) - ); - beforeEach(() => { - fixture = TestBed.createComponent(UserProfileComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.ts b/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.ts deleted file mode 100644 index 3fb03f0..0000000 --- a/MyOffice.SPA/src/app/pages/user-profile/user-profile.component.ts +++ /dev/null @@ -1,178 +0,0 @@ -// angular -import { Component, DestroyRef, inject } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { HttpClient } from '@angular/common/http'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; - -// libs -import Swal from 'sweetalert2'; - -// app -import { ApiRoutes } from '../../api-routes'; -import { ExternalLoginConfig } from '../../config.external-login'; -import { AuthService } from '../../core/service/auth.service'; - -@Component({ - selector: 'app-blank', - templateUrl: './user-profile.component.html', - styleUrls: ['./user-profile.component.scss'], -}) -export class UserProfileComponent { - form: FormGroup; - providers?: ProviderModel[]; - profile?: ProfileModel; - currencies?: CurrencyModel[]; - - private readonly destroyRef = inject(DestroyRef); - - constructor( - private fb: FormBuilder, - private httpClient: HttpClient, - private authService: AuthService, - ) { - this.form = this.fb.group({ - firstName: ['', [Validators.pattern('[a-zA-Z0-9]+')]], - lastName: ['', [Validators.pattern('[a-zA-Z0-9]+')]], - fullName: ['', [Validators.pattern('[a-zA-Z0-9 ]+')]], - email: [{ value: '', disabled: true }, []], - currency: [{ value: '' }, []], - }); - - this.providers = ExternalLoginConfig - .getConfiguredProviders() - .map(x => { - provider: x.provider, - name: x.name, - isConnected: false, - isEmailConfirmed: false - }); - } - - ngOnInit(): void { - this.load(); - } - - private updateForm(data: ProfileModel) { - this.form.patchValue(data); - } - - private load() { - this.loadProfile(); - } - - private loadProfile() { - this.httpClient - .get(ApiRoutes.UserProfile) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.profile = data; - this.loadCurrencies(); - - this.updateForm(data); - - this.providers?.map((provider) => { - var attached = data.providers?.find(x => x.provider === provider.provider); - provider.isConnected = false; - provider.isEmailConfirmed = false; - if (attached) { - provider.isConnected = true; - provider.isEmailConfirmed = attached.isEmailConfirmed; - } - }); - }); - } - - private loadCurrencies() { - this.httpClient - .get(ApiRoutes.GeneralCurrencies) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.currencies = data; - }); - } - - onSubmit() { - if (this.form.invalid) { - return; - } - - this.httpClient.post(ApiRoutes.UserProfile, this.form.value) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(data => { - this.updateForm(data); - console.log(this.form); - }); - } - - connect(provider: ProviderModel) { - provider.error = undefined; - provider.isLoading = true; - - if (provider.provider === ExternalLoginConfig.GOOGLE) { - this.authService.attachGoogle() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(r => { - this.load(); - provider.isLoading = false; - }); - } - if (provider.provider === ExternalLoginConfig.AUTH0) { - this.authService.attachAuth0() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(resp => { - provider.error = ''; - if (!resp.success) { - provider.error = resp.data || 'Connect failed'; - } - this.load(); - provider.isLoading = false; - }); - } - } - - disconnect(provider: string) { - Swal.fire({ - title: 'Are you sure to disconnect ' + provider + ' ?', - text: 'Some providers can be connected only with login!', - icon: 'warning', - showCancelButton: true, - confirmButtonColor: '#3085d6', - cancelButtonColor: '#d33', - confirmButtonText: 'Yes, disconnect it!', - }).then((result) => { - if (result.value) { - this.authService.deattach(provider) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(x => { - this.load(); - }); - } - }); - } -} - -interface ProviderModel { - provider: string; - name: string; - isConnected: boolean; - isEmailConfirmed: boolean; - error?: string; - isLoading: boolean; -} - -interface ProfileModel { - firstName?: string, - lastName?: string, - fullName?: string, - currency?: string, - isEmailConfirmed?: boolean, - providers?: ProviderModel[], -} - -interface CurrencyModel { - id?: string, - name?: string, - symbol?: string, - rate?: number, - rateDate?: string, -} diff --git a/MyOffice.SPA/src/app/services/account.category.service.ts b/MyOffice.SPA/src/app/services/account.category.service.ts deleted file mode 100644 index 26a3ea7..0000000 --- a/MyOffice.SPA/src/app/services/account.category.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; - -// libs -import { Observable } from 'rxjs'; - -// app -import { ApiRoutes } from '../api-routes'; -import { AccountCategoryModel } from '../model/account.category.model'; - -@Injectable() -export class AccountCategoryService { - - constructor( - private httpClient: HttpClient, - ) { - } - - public getCategories(): Observable { - return this.httpClient - .get(ApiRoutes.SettingsAccountCategories); - } - - public getCategory(id: string): Observable { - return this.httpClient - .get(ApiRoutes.SettingsAccountCategory.replace(':id', id)); - } -} diff --git a/MyOffice.SPA/src/app/services/account.service.ts b/MyOffice.SPA/src/app/services/account.service.ts deleted file mode 100644 index 06d4216..0000000 --- a/MyOffice.SPA/src/app/services/account.service.ts +++ /dev/null @@ -1,28 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; - -// libs -import { Observable } from 'rxjs'; - -// app -import { ApiRoutes } from '../api-routes'; -import { AccountCategoryModel } from '../model/account.category.model'; - -@Injectable() -export class AccountService { - private types = new Map(); - - constructor( - private httpClient: HttpClient, - ) { - this.types.set('balance', 'Account with balance'); - this.types.set('credit', 'Account with loan funds'); - this.types.set('external', 'External account'); - this.types.set('other', 'Other account'); - } - - public getTypes(): Map { - return this.types; - } -} diff --git a/MyOffice.SPA/src/app/services/currency.service.ts b/MyOffice.SPA/src/app/services/currency.service.ts deleted file mode 100644 index 9733638..0000000 --- a/MyOffice.SPA/src/app/services/currency.service.ts +++ /dev/null @@ -1,24 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; - -// libs -import { Observable } from 'rxjs'; - -// app -import { ApiRoutes } from '../api-routes'; -import { CurrencyModel } from '../model/currency.model'; - -@Injectable() -export class CurrencyService { - - constructor( - private httpClient: HttpClient, - ) { - } - - public getCurrencies(): Observable { - return this.httpClient - .get(ApiRoutes.SettingsCurrencies); - } -} diff --git a/MyOffice.SPA/src/app/services/item.service.ts b/MyOffice.SPA/src/app/services/item.service.ts deleted file mode 100644 index 32f804f..0000000 --- a/MyOffice.SPA/src/app/services/item.service.ts +++ /dev/null @@ -1,34 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; - -// libs -import { Observable } from 'rxjs'; - -// app -import { ApiRoutes } from '../api-routes'; -import { ItemModel } from '../model/item.model'; -import { ItemCategoryModel } from '../model/item.category.model'; - -@Injectable() -export class ItemService { - - constructor( - private httpClient: HttpClient, - ) { - } - - public getCategories(category?: string): Observable { - return this.httpClient - .get(ApiRoutes.SettingsItemCategories); - } - - public getItems(categoryId?: string): Observable { - var url = categoryId - ? ApiRoutes.SettingsItems + "?category=" + categoryId - : ApiRoutes.SettingsItems; - - return this.httpClient - .get(url); - } -} diff --git a/MyOffice.SPA/src/app/shared/TableElement.ts b/MyOffice.SPA/src/app/shared/TableElement.ts deleted file mode 100644 index ad7a93a..0000000 --- a/MyOffice.SPA/src/app/shared/TableElement.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface TableElement { - [key: string]: string | number; -} diff --git a/MyOffice.SPA/src/app/shared/UnsubscribeOnDestroyAdapter.ts b/MyOffice.SPA/src/app/shared/UnsubscribeOnDestroyAdapter.ts deleted file mode 100644 index 8fcd939..0000000 --- a/MyOffice.SPA/src/app/shared/UnsubscribeOnDestroyAdapter.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable, OnDestroy } from '@angular/core'; -import { SubSink } from './sub-sink'; - -/** - * A class that automatically unsubscribes all observables when the object gets destroyed - */ -@Injectable() -export class UnsubscribeOnDestroyAdapter implements OnDestroy { - /** - * The subscription sink object that stores all subscriptions - */ - subs = new SubSink(); - - /** - * The lifecycle hook that unsubscribes all subscriptions when the component / object gets destroyed - */ - ngOnDestroy(): void { - this.subs.unsubscribe(); - } -} diff --git a/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.html b/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.html deleted file mode 100644 index 805084e..0000000 --- a/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.html +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.scss b/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.spec.ts b/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.spec.ts deleted file mode 100644 index e8f9133..0000000 --- a/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { BreadcrumbComponent } from './breadcrumb.component'; - -describe('BreadcrumbComponent', - () => { - let component: BreadcrumbComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [BreadcrumbComponent] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(BreadcrumbComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.ts b/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.ts deleted file mode 100644 index 5e67931..0000000 --- a/MyOffice.SPA/src/app/shared/components/breadcrumb/breadcrumb.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, Input } from '@angular/core'; - -@Component({ - selector: 'app-breadcrumb', - templateUrl: './breadcrumb.component.html', - styleUrls: ['./breadcrumb.component.scss'], -}) -export class BreadcrumbComponent { - @Input() - title!: string; - @Input() - items!: string[]; - @Input() - active_item!: string; - - constructor() { - //constructor - } -} diff --git a/MyOffice.SPA/src/app/shared/components/components.module.ts b/MyOffice.SPA/src/app/shared/components/components.module.ts deleted file mode 100644 index 69a47bc..0000000 --- a/MyOffice.SPA/src/app/shared/components/components.module.ts +++ /dev/null @@ -1,33 +0,0 @@ -// angular -import { NgModule } from '@angular/core'; - -// libs -import { TranslateModule } from '@ngx-translate/core'; -import { MatDialogModule } from '@angular/material/dialog'; -import { FileUploadComponent } from './file-upload/file-upload.component'; -import { BreadcrumbComponent } from './breadcrumb/breadcrumb.component'; -import { SharedModule } from '../shared.module'; -import { DatePeriodComponent } from './date-period/date-period.component'; -import { DialogChromeComponent } from './dialog-chrome/dialog-chrome.component'; - -@NgModule({ - declarations: [ - FileUploadComponent, - BreadcrumbComponent, - DatePeriodComponent, - DialogChromeComponent, - ], - imports: [ - SharedModule, - TranslateModule, - MatDialogModule, - ], - exports: [ - FileUploadComponent, - BreadcrumbComponent, - DatePeriodComponent, - DialogChromeComponent, - ], -}) -export class ComponentsModule { -} diff --git a/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.css b/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.css deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.html b/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.html deleted file mode 100644 index d4a9468..0000000 --- a/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.html +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
- - From - - YYYY/MM/DD - - - - Please enter rate date - - -
-
- - To - - YYYY/MM/DD - - - - Please enter rate date - - -
-
-
diff --git a/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.spec.ts b/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.spec.ts deleted file mode 100644 index 81cf7ca..0000000 --- a/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { DatePeriodComponent } from './date-period.component'; - -describe('DatePeriodComponent', () => { - let component: DatePeriodComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ DatePeriodComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(DatePeriodComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.ts b/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.ts deleted file mode 100644 index 0411193..0000000 --- a/MyOffice.SPA/src/app/shared/components/date-period/date-period.component.ts +++ /dev/null @@ -1,56 +0,0 @@ -// app -import { Component } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { Input } from '@angular/core'; -import { Output } from '@angular/core'; -import { EventEmitter } from '@angular/core'; - -// libs -import moment from 'moment'; - - -type DatePeriodForm = { - dateFrom: FormControl; - dateTo: FormControl; -}; - -@Component({ - selector: 'app-date-period', - templateUrl: './date-period.component.html', - styleUrls: ['./date-period.component.css'] -}) -export class DatePeriodComponent { - - @Input('from') dateFrom!: Date; - @Input('to') dateTo!: Date; - - @Output() onChange: EventEmitter = new EventEmitter(); - - form!: FormGroup; - - constructor( - private fb: FormBuilder - ) { - - } - - ngOnInit() { - this.form = this.fb.group({ - dateFrom: [ - this.dateFrom, - [Validators.required], - ], - dateTo: [ - this.dateTo, - [Validators.required], - ], - }); - } - - onSubmitClick() { - } - - onInputChange() { - this.onChange.emit([this.form.value.dateFrom!, this.form.value.dateTo!]); - } -} diff --git a/MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.html b/MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.html deleted file mode 100644 index a34b6d6..0000000 --- a/MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.html +++ /dev/null @@ -1,39 +0,0 @@ -
-

{{ title }}

-
- -
-
- -
- {{ errorMessage }} - -

{{ error.title }}

-
    -
  • {{ item.value }}
  • -
-
-
- -
- - - -
-
- {{ errorMessage }} - -

{{ error.title }}

-
    -
  • {{ item.value }}
  • -
-
-
-
-
-
- -
-
-
-
diff --git a/MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.scss b/MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.scss deleted file mode 100644 index 19ab249..0000000 --- a/MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.scss +++ /dev/null @@ -1,24 +0,0 @@ -.dialog-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: 16px; -} - -.dialog-header [mat-dialog-title] { - flex: 1; - min-width: 0; -} - -.dialog-header-actions { - display: flex; - align-items: center; - flex-shrink: 0; - margin-top: 24px; - margin-right: 24px; - gap: 8px; -} - -.dialog-header-error { - margin: 0 24px 8px; -} diff --git a/MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.ts b/MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.ts deleted file mode 100644 index fb75106..0000000 --- a/MyOffice.SPA/src/app/shared/components/dialog-chrome/dialog-chrome.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, Input, TemplateRef } from '@angular/core'; -import { UI_CONFIG } from '../../../config/ui.config'; - -@Component({ - selector: 'app-dialog-chrome', - templateUrl: './dialog-chrome.component.html', - styleUrls: ['./dialog-chrome.component.scss'], -}) -export class DialogChromeComponent { - @Input({ required: true }) title!: string; - @Input({ required: true }) actions!: TemplateRef; - @Input() errorMessage?: string | null; - /** Structured validation error (e.g. currency rate dialog). */ - @Input() error?: { title?: string; errors?: Record } | null; - - readonly modalButtonsTop = UI_CONFIG.modal_buttons === 'top'; - - get hasError(): boolean { - return !!(this.errorMessage || this.error?.title || this.error?.errors); - } -} diff --git a/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.html b/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.html deleted file mode 100644 index 1e97cd1..0000000 --- a/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.scss b/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.spec.ts b/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.spec.ts deleted file mode 100644 index c1e8bbf..0000000 --- a/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { FeatherIconsComponent } from './feather-icons.component'; - -describe('FeatherIconsComponent', - () => { - let component: FeatherIconsComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [FeatherIconsComponent] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(FeatherIconsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.ts b/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.ts deleted file mode 100644 index 5f97c19..0000000 --- a/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component, Input } from '@angular/core'; - -@Component({ - selector: 'app-feather-icons', - templateUrl: './feather-icons.component.html', - styleUrls: ['./feather-icons.component.scss'], -}) -export class FeatherIconsComponent { - @Input() - icon?: string; - @Input() - class?: string; - - constructor() { - // constructor - } -} diff --git a/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.module.ts b/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.module.ts deleted file mode 100644 index 0b3bbb2..0000000 --- a/MyOffice.SPA/src/app/shared/components/feather-icons/feather-icons.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FeatherIconsComponent } from './feather-icons.component'; - -import { FeatherModule } from 'angular-feather'; -import { allIcons } from 'angular-feather/icons'; - -@NgModule({ - imports: [CommonModule, FeatherModule.pick(allIcons)], - exports: [FeatherIconsComponent, FeatherModule], - declarations: [FeatherIconsComponent], -}) -export class FeatherIconsModule { -} diff --git a/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.html b/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.html deleted file mode 100644 index 8fb6747..0000000 --- a/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.html +++ /dev/null @@ -1,5 +0,0 @@ -
- - {{file ? file.name : ' or drag and drop file here' }} - -
diff --git a/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.scss b/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.scss deleted file mode 100644 index d3cb0d4..0000000 --- a/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.scss +++ /dev/null @@ -1,27 +0,0 @@ -.file-drop-area { - border: 1px dashed #7c7db3; - border-radius: 3px; - position: relative; - max-width: 100%; - margin-top: 5px; - padding: 26px 20px 30px; - transition: 0.2s; -} - -.file-input { - position: absolute; - left: 0; - top: 0; - height: 100%; - width: 100%; - cursor: pointer; - opacity: 0; -} - -.file-msg { - display: inline-block; - margin-left: 5px; - font-size: 12px; - font-weight: 500; - color: #5b5bff; -} diff --git a/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.spec.ts b/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.spec.ts deleted file mode 100644 index 622f59d..0000000 --- a/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { FileUploadComponent } from './file-upload.component'; - -describe('FileUploadComponent', - () => { - let component: FileUploadComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [FileUploadComponent] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(FileUploadComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', - () => { - expect(component).toBeTruthy(); - }); - }); diff --git a/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.ts b/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.ts deleted file mode 100644 index 9dfd503..0000000 --- a/MyOffice.SPA/src/app/shared/components/file-upload/file-upload.component.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable @typescript-eslint/ban-types */ -import { Component, ElementRef, HostListener, Input } from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; - -@Component({ - selector: 'app-file-upload', - templateUrl: './file-upload.component.html', - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: FileUploadComponent, - multi: true, - }, - ], - styleUrls: ['./file-upload.component.scss'], -}) -export class FileUploadComponent implements ControlValueAccessor { - onChange!: Function; - file: File | null = null; - - @HostListener('change', ['$event.target.files']) - emitFiles(event: FileList) { - const file = event && event.item(0); - this.onChange(file); - this.file = file; - } - - constructor(private host: ElementRef) {} - - writeValue(value: null) { - // clear file input - this.host.nativeElement.value = ''; - this.file = null; - } - - registerOnChange(fn: Function) { - this.onChange = fn; - } - - registerOnTouched(fn: Function) { - // add code here - } -} diff --git a/MyOffice.SPA/src/app/shared/feather-icons.module.ts b/MyOffice.SPA/src/app/shared/feather-icons.module.ts deleted file mode 100644 index d3e4d0c..0000000 --- a/MyOffice.SPA/src/app/shared/feather-icons.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; - -import { FeatherModule } from 'angular-feather'; -import { allIcons } from 'angular-feather/icons'; - -// Select some icons (use an object, not an array) - -@NgModule({ - imports: [FeatherModule.pick(allIcons)], - exports: [FeatherModule], -}) -export class FeatherIconsModule { -} diff --git a/MyOffice.SPA/src/app/shared/material.module.ts b/MyOffice.SPA/src/app/shared/material.module.ts deleted file mode 100644 index dd3372f..0000000 --- a/MyOffice.SPA/src/app/shared/material.module.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { NgModule } from '@angular/core'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatNativeDateModule } from '@angular/material/core'; -import { NgxMaskDirective, NgxMaskPipe, provideNgxMask } from 'ngx-mask'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatListModule } from '@angular/material/list'; -import { MatButtonToggleModule } from '@angular/material/button-toggle'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; - -const materialModules = [ - MatButtonModule, - MatInputModule, - MatListModule, - MatIconModule, - MatTooltipModule, - MatDatepickerModule, - MatNativeDateModule, - NgxMaskDirective, - NgxMaskPipe, - MatButtonToggleModule, - MatFormFieldModule, - MatMenuModule, - MatSlideToggleModule, -]; - -@NgModule({ - declarations: [], - imports: [...materialModules], - exports: [...materialModules], - providers: [provideNgxMask()], -}) -export class MaterialModule { -} diff --git a/MyOffice.SPA/src/app/shared/shared.module.ts b/MyOffice.SPA/src/app/shared/shared.module.ts deleted file mode 100644 index 4f1da2e..0000000 --- a/MyOffice.SPA/src/app/shared/shared.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; - -import { MaterialModule } from './material.module'; -import { FeatherIconsModule } from './components/feather-icons/feather-icons.module'; - -@NgModule({ - declarations: [], - imports: [CommonModule, FormsModule, ReactiveFormsModule, RouterModule], - exports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - RouterModule, - MaterialModule, - FeatherIconsModule, - ], -}) -export class SharedModule { -} diff --git a/MyOffice.SPA/src/app/shared/sub-sink.ts b/MyOffice.SPA/src/app/shared/sub-sink.ts deleted file mode 100644 index afb3d23..0000000 --- a/MyOffice.SPA/src/app/shared/sub-sink.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { SubscriptionLike } from 'rxjs'; - -// TODO: SubSink -> SubSync -/** - * Subscription sink that holds Observable subscriptions - * until you call unsubscribe on it in ngOnDestroy. - */ -export class SubSink { - protected _subs: SubscriptionLike[] = []; - - /** - * Subscription sink that holds Observable subscriptions - * until you call unsubscribe on it in ngOnDestroy. - * - * @example - * In Angular: - * ``` - * private subs = new SubSink(); - * ... - * this.subs.sink = observable$.subscribe( - * this.subs.add(observable$.subscribe(...)); - * ... - * ngOnDestroy() { - * this.subs.unsubscribe(); - * } - * ``` - */ - constructor() { - // constructor - } - - /** - * Add subscriptions to the tracked subscriptions - * @example - * this.subs.add(observable$.subscribe(...)); - */ - add(...subscriptions: SubscriptionLike[]) { - this._subs = this._subs.concat(subscriptions); - } - - /** - * Assign subscription to this sink to add it to the tracked subscriptions - * @example - * this.subs.sink = observable$.subscribe(...); - */ - set sink(subscription: SubscriptionLike) { - this._subs.push(subscription); - } - - /** - * Unsubscribe to all subscriptions in ngOnDestroy() - * @example - * ngOnDestroy() { - * this.subs.unsubscribe(); - * } - */ - unsubscribe() { - this._subs.forEach((sub) => sub && sub.unsubscribe()); - this._subs = []; - } -} diff --git a/MyOffice.SPA/src/app/shared/tableExportUtil.ts b/MyOffice.SPA/src/app/shared/tableExportUtil.ts deleted file mode 100644 index e22b342..0000000 --- a/MyOffice.SPA/src/app/shared/tableExportUtil.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as XLSX from 'xlsx'; -import { TableElement } from './TableElement'; - -const getFileName = (name: string) => { - const timeSpan = new Date().toISOString(); - const sheetName = name || 'ExportResult'; - const fileName = `${sheetName}-${timeSpan}`; - return { - sheetName, - fileName, - }; -}; - -export class TableExportUtil { - static exportToExcel(arr: Partial[], name: string) { - const { sheetName, fileName } = getFileName(name); - - const wb = XLSX.utils.book_new(); - const ws = XLSX.utils.json_to_sheet(arr); - XLSX.utils.book_append_sheet(wb, ws, sheetName); - XLSX.writeFile(wb, `${fileName}.xlsx`); - } - - // static exportToPDF(exportData: any[]) { - // const doc = new jsPDF(); - // const dataValue: any = Object.keys(exportData).map(function ( - // personNamedIndex: any - // ) { - // return Object.values(exportData[personNamedIndex]); - // }); - // const keys: any = Object.keys(exportData[0]); - - // autoTable(doc, { - // head: [keys], - // body: dataValue, - // }); - - // const { fileName } = getFileName('pdf'); - - // doc.save(`${fileName}.pdf`); - // } -} diff --git a/MyOffice.SPA/src/assets/.gitkeep b/MyOffice.SPA/src/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.eot b/MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.eot deleted file mode 100644 index f5c1fd4d3b0272949c283d3b39895121d7e333b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124904 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⁣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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.ttf b/MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.ttf deleted file mode 100644 index 218ff47f8268577baa46a72170751838db84de4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124668 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

G74!5qyph^unhK{Bjxu$I@oB8zye|I_n3pV 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 diff --git a/MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.woff b/MyOffice.SPA/src/assets/fonts/fontawesome/fa-brands-400.woff deleted file mode 100644 index d24c3a9cf73b11e93c18282ebbde11a9884d96d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80660 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

9)+qeXTB~vm;qE(S@&E?^FOLk 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MyOffice.SPA/src/assets/fonts/fontawesome/fa-regular-400.ttf b/MyOffice.SPA/src/assets/fonts/fontawesome/fa-regular-400.ttf deleted file mode 100644 index 4adbd66d8af953325e87c902f7415dfe53ca5b31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40348 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 KYohod0000~N%%AX diff --git a/MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.eot b/MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.eot deleted file mode 100644 index 9def162070e04775c5b87c0a2b8a80294ad09fb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191512 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 XaI8Z?6IZ#8(SRQn@-*XFFr!T;y(Mu0%OZSSg;y

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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.ttf b/MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.ttf deleted file mode 100644 index c6818494584137a0616a98e084e48a29e4ac219d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191292 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≥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

#5wA_Yc`ok3-3$X% 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 C_L-^x diff --git a/MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.woff2 b/MyOffice.SPA/src/assets/fonts/fontawesome/fa-solid-900.woff2 deleted file mode 100644 index 00d15c427a14b55d4b768ba95b729487470ae165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71952 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MyOffice.SPA/src/assets/fonts/poppins/poppins-v5-latin-regular.ttf b/MyOffice.SPA/src/assets/fonts/poppins/poppins-v5-latin-regular.ttf deleted file mode 100644 index 5f2caab59b9ceb2630115279b3534f8d51a639f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15724 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 K9Ia`S761Ug5*LpE diff --git a/MyOffice.SPA/src/assets/i18n/de.json b/MyOffice.SPA/src/assets/i18n/de.json deleted file mode 100644 index 6b93e47..0000000 --- a/MyOffice.SPA/src/assets/i18n/de.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "HEADER": { - "SEARCH": { - "TEXT": "Suche.." - } - }, - "MENUITEMS": { - "USER": { - "POST": "Manager" - }, - "MAIN": { - "TEXT": "Main" - }, - "DASHBOARD": { - "TEXT": "Zuhause", - "LIST": { - "DASHBOARD": "Dashboard" - } - }, - "ADVANCE-TABLE": { - "TEXT": "Vorab-Tabelle" - }, - "APPS": { - "TEXT": "Apps" - }, - "CALENDAR": { - "TEXT": "Kalender" - }, - "TASK": { - "TEXT": "Aufgabe" - }, - "CONTACTS": { - "TEXT": "Kontakte" - }, - "EMAIL": { - "TEXT": "Email", - "LIST": { - "INBOX": "Posteingang", - "COMPOSE": "Komponieren", - "READ": "E-Mail lesen" - } - }, - "MORE-APPS": { - "TEXT": "Mehr Apps", - "LIST": { - "CHAT": "Plaudern", - "SUPPORT": "Unterstützung", - "DRAG-DROP": "Ziehen und loslassen", - "CONTACT-GRID": "Kontakt Grid" - } - }, - "COMPONENTS": { - "TEXT": "Komponenten" - }, - "WIDGETS": { - "TEXT": "Widgets", - "LIST": { - "CHART-WIDGET": "Diagramm-Widget", - "DATA-WIDGET": "Daten-Widget" - } - }, - "FORMS": { - "TEXT": "Formen", - "LIST": { - "CONTROLS": "Form Controls", - "ADVANCE": "Advance Control", - "EXAMPLE": "Vorabkontrolle", - "VALIDATION": "Formularvalidierung", - "WIZARD": "Magier", - "EDITORS": "Redakteurinnen" - } - }, - "TABLES": { - "TEXT": "Tabellen", - "LIST": { - "BASIC": "Tablas básicas", - "MATERIAL": "Materialtabellen", - "NGX-DATATABLE": "NGX-datierbar" - } - } - } -} diff --git a/MyOffice.SPA/src/assets/i18n/en.json b/MyOffice.SPA/src/assets/i18n/en.json deleted file mode 100644 index 2f87228..0000000 --- a/MyOffice.SPA/src/assets/i18n/en.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "HEADER": { - "SEARCH": { - "TEXT": "Search.." - } - }, - "MENUITEMS": { - "USER": { - "POST": "Manager" - }, - "MAIN": { - "TEXT": "Main" - }, - "DASHBOARD": { - "TEXT": "Dashboard", - "LIST": { - "DASHBOARD": "Rests", - "INCOME": "Incomes", - "OUTCOME": "Outcomes" - } - }, - "ACCOUNTS": { - "TEXT": "Accounts" - }, - "SETTINGS": { - "TEXT": "Settings", - "LIST": { - "CURRENCIES": "Currencies", - "ACCOUNTCATEGORIES": "Account categories", - "ACCOUNTS": "Accounts", - "ITEMCATEGORIES": "Item categories", - "ITEMS": "Items" - } - }, - - "ADVANCE-TABLE": { - "TEXT": "Advance Table" - }, - "APPS": { - "TEXT": "Apps" - }, - "CALENDAR": { - "TEXT": "Calendar" - }, - "TASK": { - "TEXT": "Task" - }, - "CONTACTS": { - "TEXT": "Contacts" - }, - "EMAIL": { - "TEXT": "Email", - "LIST": { - "INBOX": "Inbox", - "COMPOSE": "Compose", - "READ": "Read Email" - } - }, - "MORE-APPS": { - "TEXT": "More Apps", - "LIST": { - "CHAT": "Chat", - "SUPPORT": "Support", - "DRAG-DROP": "Drag & Drop", - "CONTACT-GRID": "Contact Grid" - } - }, - "COMPONENTS": { - "TEXT": "Components" - }, - "WIDGETS": { - "TEXT": "Widgets", - "LIST": { - "CHART-WIDGET": "Chart-Widget", - "DATA-WIDGET": "Data-Widget" - } - }, - "FORMS": { - "TEXT": "Forms", - "LIST": { - "CONTROLS": "Form Controls", - "ADVANCE": "Advance Control", - "EXAMPLE": "Form Examples", - "VALIDATION": "Form Validation", - "WIZARD": "Wizard", - "EDITORS": "Editors" - } - }, - "TABLES": { - "TEXT": "Tables", - "LIST": { - "BASIC": "Basic Tables", - "MATERIAL": "Material Tables", - "NGX-DATATABLE": "NGX-Datatable" - } - } - }, - - "BALANCE": "Balance", - "DEBIT.BALANCE": "Debit balance", - "CREDIT.BALANCE": "Credit balance", - "CURRENT.BALANCE": "Current balance", - "HOME": "Home", - "OTHER": "Other", - "TOTAL": "Total" -} diff --git a/MyOffice.SPA/src/assets/i18n/es.json b/MyOffice.SPA/src/assets/i18n/es.json deleted file mode 100644 index 58966ef..0000000 --- a/MyOffice.SPA/src/assets/i18n/es.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "HEADER": { - "SEARCH": { - "TEXT": "Buscar.." - } - }, - "MENUITEMS": { - "USER": { - "POST": "Gerente" - }, - "MAIN": { - "TEXT": "Principal" - }, - "DASHBOARD": { - "TEXT": "Casa", - "LIST": { - "DASHBOARD": "Tablero" - } - }, - "ADVANCE-TABLE": { - "TEXT": "Tabla de avance" - }, - "APPS": { - "TEXT": "Aplicaciones" - }, - "CALENDAR": { - "TEXT": "Calendario" - }, - "TASK": { - "TEXT": "Tarea" - }, - "CONTACTS": { - "TEXT": "Contactos" - }, - "EMAIL": { - "TEXT": "Email", - "LIST": { - "INBOX": "Bandeja de entrada", - "COMPOSE": "Componer", - "READ": "Leer el correo electrónico" - } - }, - "MORE-APPS": { - "TEXT": "Más aplicaciones", - "LIST": { - "CHAT": "Charla", - "SUPPORT": "Apoyo", - "DRAG-DROP": "Arrastrar y soltar", - "CONTACT-GRID": "Cuadrícula de contacto" - } - }, - "COMPONENTS": { - "TEXT": "Componentes" - }, - "WIDGETS": { - "TEXT": "Widgets", - "LIST": { - "CHART-WIDGET": "Widget de gráfico", - "DATA-WIDGET": "Widget de datos" - } - }, - "FORMS": { - "TEXT": "Formularios", - "LIST": { - "CONTROLS": "Controles de formulario", - "ADVANCE": "Control avanzado", - "EXAMPLE": "Ejemplos de formularios", - "VALIDATION": "Validación de formulario", - "WIZARD": "Mago", - "EDITORS": "Editoras" - } - }, - "TABLES": { - "TEXT": "Tabellen", - "LIST": { - "BASIC": "Tablas básicas", - "MATERIAL": "Tablas de materiales", - "NGX-DATATABLE": "NGX-Datatable" - } - } - } -} diff --git a/MyOffice.SPA/src/assets/i18n/ua.json b/MyOffice.SPA/src/assets/i18n/ua.json deleted file mode 100644 index 38167be..0000000 --- a/MyOffice.SPA/src/assets/i18n/ua.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "HEADER": { - "SEARCH": { - "TEXT": "Шукати.." - } - }, - "MENUITEMS": { - "USER": { - "POST": "Manager" - }, - "MAIN": { - "TEXT": "Головне" - }, - "DASHBOARD": { - "TEXT": "Панелі", - "LIST": { - "DASHBOARD": "Залишки", - "INCOME": "Надходження", - "OUTCOME": "Витрати" - } - }, - "ACCOUNTS": { - "TEXT": "Рахунки" - }, - "SETTINGS": { - "TEXT": "Налаштування", - "LIST": { - "CURRENCIES": "Валюти", - "ACCOUNTCATEGORIES": "Категорії рахунків", - "ACCOUNTS": "Рахунки", - "ITEMCATEGORIES": "Категорії статей", - "ITEMS": "Статті" - } - }, - - "ADVANCE-TABLE": { - "TEXT": "Advance Table" - }, - "APPS": { - "TEXT": "Apps" - }, - "CALENDAR": { - "TEXT": "Calendar" - }, - "TASK": { - "TEXT": "Task" - }, - "CONTACTS": { - "TEXT": "Contacts" - }, - "EMAIL": { - "TEXT": "Email", - "LIST": { - "INBOX": "Inbox", - "COMPOSE": "Compose", - "READ": "Read Email" - } - }, - "MORE-APPS": { - "TEXT": "More Apps", - "LIST": { - "CHAT": "Chat", - "SUPPORT": "Support", - "DRAG-DROP": "Drag & Drop", - "CONTACT-GRID": "Contact Grid" - } - }, - "COMPONENTS": { - "TEXT": "Components" - }, - "WIDGETS": { - "TEXT": "Widgets", - "LIST": { - "CHART-WIDGET": "Chart-Widget", - "DATA-WIDGET": "Data-Widget" - } - }, - "FORMS": { - "TEXT": "Forms", - "LIST": { - "CONTROLS": "Form Controls", - "ADVANCE": "Advance Control", - "EXAMPLE": "Form Examples", - "VALIDATION": "Form Validation", - "WIZARD": "Wizard", - "EDITORS": "Editors" - } - }, - "TABLES": { - "TEXT": "Tables", - "LIST": { - "BASIC": "Basic Tables", - "MATERIAL": "Material Tables", - "NGX-DATATABLE": "NGX-Datatable" - } - } - }, - "BALANCE": "Баланс", - "DEBIT.BALANCE": "Остаток", - "CREDIT.BALANCE": "Кредиты", - "CURRENT.BALANCE": "Поточний баланс", - "HOME": "Головна", - "OTHER": "Інші", - "TOTAL": "Всього", - "INCOME": "Надходження", - "OUTCOME": "Витрати", - "PERIOD": "Період" -} diff --git a/MyOffice.SPA/src/assets/images/apps/calendar.png b/MyOffice.SPA/src/assets/images/apps/calendar.png deleted file mode 100644 index 2778d984d193d70c3d50c6bcbf5849a797a0766c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 998 zcmV2R0JLvPk4u|?L<6mpIAd9W89 zX6#|&_B`-Gwg`{(odet&$wM>ywb#$Stz-;mq4CTPj5J`?nSD+N0F>uFay1IVNtBj$aty_ZNTY$YsO3J{qRN)YQ8u7Te)Rhb)8be+`dDhL6@m;Vg;uy%qWJ zpe> zp>XwlfK5+d3|bZ;0P?jOY}dt7rP3BT04!B1uw57VS`7q1(6R`dp1xSPdOko;s0Y6e z{<)wEga7~-fW@0P5vbK5cZkm=-oW4MRb+4dggsP%UwAULZ+)E>14^$blqxFymmB~B zqKJb4fR45&=;`#Mr^!bNfl#WbB9SGD#MQRRb^;zbT56_&)?zS69>Rt;q{O z1OTsN`_BXzV=V=imzVL~!~{&!#LK&PCuHgF)!Jj`2&E@Y(1neov?I?Ts548X7{WRBBnzIft+z&}{X39q%7M z4q2ALIY(Dl7fjOxV+@ic;gfUc5DJGqYa6ZQ1e8*Q!(kK)1?aktU+><PXK^aDs?K8$(+sS^Ob6~3deEay6%q5aU4{uRpj&e zN+y#zn@Xil0RU-yzp=5g{oUQ&hx~qjoKpJAPM*YdUEQ**%*x8jk0T=^OB?=w0II@8 UWcot7^#A|>07*qoM6N<$g3{yM3;+NC diff --git a/MyOffice.SPA/src/assets/images/apps/chat.png b/MyOffice.SPA/src/assets/images/apps/chat.png deleted file mode 100644 index a67f31588cbafa2def56fd9e5bd59c9fd5b695d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 487 zcmVz&kXM?qn)o>$}= zFkKdEjnzVs!~iH#4gm)+)<`LE0zid{5O6*jnT~=e6YmvhJS8*Lns){IqROc|pQu0& zPvFE!gRTIs2x-gN23#Q7yl5;XB%NS(zava%g-p8jw)Ji!mt1Po=J#K3L|O9t*->F_HjW7{ zuwzuHx^oG)?U6<0*>Cs7cv_u~{TU8m8k|7DXJ@gyG00fV`@6N9196#DD1r>N)Hn>x zwQTo*ON8U~g~SCky+Jpr*1QAItuG~V@Zzl;O*vL8CAcsC*gtIWbj;YqX`O3XF d6AApMd;sxtUe)l)(O>`o002ovPDHLkV1f>*(|Z5_ diff --git a/MyOffice.SPA/src/assets/images/apps/contact.png b/MyOffice.SPA/src/assets/images/apps/contact.png deleted file mode 100644 index df6623238576a32df9ddbc91efcb664dc123c4ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 979 zcmV;^11$WBP)#OMPO(HDh4d@`H1 z9im#@0W($A_}nmUg=Byxsdf z=leb9{LZ<*D^%Gwf9LbYNF3M%G*;vPVH1e<8HgpX#eWBoapyGaY$3yiDdY#$swnpz?`0MS6_0YpxTIwyc#W*#s_&rZOn z%KOVD2N)QMp9X$XW#<;Z{lG#6#&I525e$;97p#Z<-f5rb4ON~|<%X!7^z{tYNJfT0 zw;T07B;l~#u%_Vd6L?BtEifj^kNqRDefN=Do}|L&ve&aB?6JDj=gNJfEnOd?95F5p z8UO_?cW^{2o&lyU&zmK3J(2eoR^#w2kXPm7#ad=kDLX$n9NVGFdnGY>ZE!gL%6;vD zEdY6MF}Bto&G>rKNmb4Q>$4sHb#(<6Q?C$EZU8jQc%BB(7jcQO0hqDISKnE&fQb15 zn8ol-rakoKls|L{*a&NT=(ZqK9d%amRc}|cg z=BEfWIWQc5sa{aF!@th*Hs2QeLa`QJK1J@oyc60~bkCH}ks^1igVf%%Dw~^mOGNjf zte?t_-N|-@&WoenR?pSn>Lp`RDLdbPEw-z2ied-KohI#Y(^T&6fS?JKW|Ut9nFd}~ zBbTxrt$XVV)B`G>to9jm~0RGfxQSx zt2=#A?8^)7vyP|waO5D+=t7PxOTZ=0RsfW*q-x^H3h<9yCE9vIxoUe z06|Z+1-j16JE+Km07m4GS_JoY;JPYnYT@oua%lO@Q~oUyq+ihsT99AsmMMHqjp|C! zJ!=be9#)ZFQF)<%}XlNzmB{B^Ijw897{~mIK z>jxks!rR+Ii6@uK9ck%&9pO3P`=3YcOvR-i4JP)3o(ARwxuWRg68RqmT7X-|rIBPh zJ|fi~ZNbD26(^3$W|sKdA~3G-o#P^YF&+C8;2+cuQb_kY`i%ep002ovPDHLkV1jBv B#?$}+ diff --git a/MyOffice.SPA/src/assets/images/apps/gallery.png b/MyOffice.SPA/src/assets/images/apps/gallery.png deleted file mode 100644 index 78451700508784a5572ab68851d1cd494d59c9d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 831 zcmV-F1Hk-=P)B@xiHP$+G8c6U4oP3e}h z)|1a^X5ROGe(yWG8Q^~xsXT};EL<;a=ASc#HPk8$1OgBQVXrXfATu0lpDrW6m4Bw} zV{Sl%fS;zIFKA^%ky+zEnwP|ZQ#wGooY@Gxb0M^6FQSQ!*TbMS0pdyos;WWMexbGS zpdJAB{7Oc3|IGlFw^q>8-h(SAuj=A8Ct&`5m`oHh^+9SF(8ce*yn~6k2`sHGVdVV? zB9jqaPU$yIB&FWqvDWB^k2Bmz=R=c2_#%A<00=e_CW{FGaH+i);ZS(@1gop7c1=I!Ym zcDPzxh9J>c6f}{PdKFa>jhNR15mc4+Z?6de49`A-l#%u=v^Cqo0jw|SZnh*!C z7XWY#hXCNm=CYyA0KndC2LR+UxvKGi^KhOrrZ@ngC>MkC^YceL1D#LJqWP~NcE3Z{ z`4Lx3zN59Hk9_(%yCxTlP5>}l%;`o^I1>y8Q&rvS5J@B!&gEI*m0Xk$0sy6yn=R(= zl+XoA2?GF5h~hoq88hU_Y252>dR+qSEMl>gN3DOzp8b>~5RY<~IV+DBAo^=iI)4O8v}c+laz1fbedBoCi?t zX?f>$J459Mh5_Z`oSV|=jSwjB26#6IISb$$<@AQfj zqnP~>L?XVWN7aOIB7H>xMj;{EPhcKAjEoNAe*Cb(yDr9y5zi^zBQ40A5mepo@*4n% z+B%GT4>4}t0iVD08=0n(7q8;a*@Mm05;lNY~%CrlsumFvisR&2|HLq{u;RUQDWWOBr6 z8*p8hx>cJ%m9M<0k^omJHJ?a|WGcPR#ZzgrmXG>SKnWql9|znxM*kju0P2qDaC)}%hX4Qo07*qoM6N<$g5?uT$^ZZW diff --git a/MyOffice.SPA/src/assets/images/apps/support.png b/MyOffice.SPA/src/assets/images/apps/support.png deleted file mode 100644 index c5f5b765b4aeb2f0e11048c997a2376c926d1c91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1180 zcmV;N1Y`S&P)vJ2Q9g zdX5iWoQ;-$a+7nv<^R9m_uX@j0C>Ca%T^T%_IrW<)R^Z4p7IB!;^~i9zj~e$^c_0% ztdep+FdxtqI08=FLcF}byZa(FAa?$Cq{)^10kljSZ@C5Xf#b$ys`bOQn}z{?K6r4i zfNhlo3UCVrFC@gHD|hVpz0$9_ig!xM0a9TT8K`ie=RO5Eec-?oLa8cp0N1kcTsLI< z{t2a&s1iWY39u+RmyFp+DpJP-$$3O{gFwj+04c-)L{%=*bMYK!d>sV!y}Nh6RxNqifAl2Cm)U%B2A`AyicbyOwP}3LIp7 zUI65Lo0x7~{%GYZ?@kEhQmF*3bJHc{d`5=H7#tWbO^fN_uz61c2=NtQO}@%NV)z~mT!ZUZ zVelUkVZHpL;CSbjEw}DT;IZ!RixO5TAwFqYnC)M-?h#MK(#?==#%!#kV|C|f zd{+7l@E*4PLMg|zLq7S}zjgT`v3cO8`&=e5l+fLgi7aFMnSd#a4OimJJ9DOaUvpD< z47Tr?YQo*fzdtp!?fm89`?-Rz18jUeLAJgCwgrI)G5{kC;Ru-Ze0@gIe`&m%E$Q$` z+uUf^+ODSlniZVt8+qv0b9eT7oB;tai1A{|uQa7|8flSQ` zzU>`4@@IeUMSuoe~4atQ7J1P`Ze z`rj1D7iE>rwOt0U4&XU%xkG~Ml^>`x3KVJxSOtsRXpTbODzi%^v7PeR8JlZaRYyDx zsRp94DA8E?(XEuCP%Mv~QJ_`@LI|Q}H90`Rs)#*v;`9+ENS7J|!V6qq%K#V}A{Nt( ukbz(8#+rm5C>@k;6_xM$NB}eB{_r0t+Ns(iq}qxA0000^yq&1-^>#^;>Av2@zLbYcIQn-|Ucimr7PhrG;DSS1C1dfCTutj|q!XmRDtoysaO z^PklajbHWdmtvu&Si7H2yqNbJ@KU-2KZUU;w0L9 z$C0KA9PIUy6_~I0Gb!v^N9nAbRgt|-6Ch@H?0tI1%OcH*yq|@m@kOkhMVb=@O@P7V zzr_K9^fMDME8TVgSV3gy9e`@hS^K;uO0?I{0FIlpcCnHG2)q8bV;YU$CZeo2fPq#5 z`gFz#0$Ew?Xd^Vfof~!2aQT-bbWryEccf2gpoPeK&qj7sAW8DRSlfB)Ch(!m$ z`vH6-=6gNIPj@Wj>LX(2zZzL*XQv=V_ZN!8&D*v4Z<9Ap_I9_G>S-eiMH8(CsT0h| zc-lGw=BHX^5=pR1Z#dGryL!*g>uSCLWA#eptaqqsi=mjCwZ`r|cnHQ8ZA7CPt8Yt7 z%iDE^s4g+bar&i{+7s$Hg?=fes@k+}QdY0NKHdKYu04j0a z6&A%ms4IZK*g%C(vGYCUEzRFRwukX=O)|3)XnGg`pMy}~BJd;&?#xw4O`A3Y?G!GNEkgZh zs|;*LV2n+35jcPsxD5=9hxDdE(+2q8jj{80rdXiKwa+quxWf>_F4uTrBJWjESq|4P zK~FzS2SHQ+=kRt$KZlug%MZ+_HJW9?*;<&Ggew=|R}kiYgGsDU7@nmarP-}ud28BL zVOg+$FC43Zr6uU=2Z?4jTq4H(q+!IZAfZfUl&JR+9Iu6u4-gNp!&gs0#6ye(p=^){ zabE?)r$wCXoG~_0QV&iv1n-`w5}AM~K+L9<0uN4nk~6@YT!F(gl!jtk6=49Nbc&Y6 z-SlMVJr?%G12Ua=Ze5-F)X<2sFArD+K0bXyKWy&N|L^e^(QDiEXvwxr00000NkvXX Hu0mjfw-`l0 diff --git a/MyOffice.SPA/src/assets/images/banner/1.png b/MyOffice.SPA/src/assets/images/banner/1.png deleted file mode 100644 index d90352c317e384c2209aac094ea7fee36c774e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 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≫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 z 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 {qoU6FKzt*6lq7c?$(mc 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

4MqzlXwGHkRV|~Q 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 G|9=4QMuyP< diff --git a/MyOffice.SPA/src/assets/images/details_close.png b/MyOffice.SPA/src/assets/images/details_close.png deleted file mode 100644 index 9c7d6982d9a1408f24278ed38458bcf4722f365f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686 zcmV;f0#W^mP)rc9KHq9BMrrU)X4H-ZEQYRE1Mf85oDS6+Hm_uUD?Zq_fw zn=!^pDk~VX)hyi>=S**$PUrUR`S!lB@UYy4U- zlEcGD4Gkgv=rJ;WKMI))DAuw^dT%HXWm=_w?8Z*(BJ3CQI%#--o7^rMEd#LBM)@B$J!$?OvK`BMr zRsP$^2&f}b(NMqg?(VM1WPEB0UtKPttw@_o;Zl6jYuxh?_E**)MMmZ=lj-GUY_zo4 zX(g@tS*_O65-5I9{ZVRcW0RMmjZRMDLvyp>RI5|PAGtc61d;J^<~u33U#`0zaEJU_|e`8Yr*V+r?U8t8q~5ysN3H=`#OLdQ`{tkJnH+Sb-{!Kx_E1b-CDbv<6zhT-G!; zHrm-k^-4++%<@a!5cN&=qHLfPW&NcnA1I0WN?Z#PQ?_Tq4T=XPJ+fmXr9Rgh3WX*Z zY#nYzQEw57`)ss=4Tg%vFE(OA%kWiDnx_5WNX2@ofwe7&7_56;heB6A3S0$9q(X_2 z`oVfov$L}iHK*xu4Qu;rVd=8M;tWJwyMNQvvP;;W?hU$~2rlvFo8-^N?*Lg_D zTe3=V`<3HIr6d4&egY9GOIM|W1%+nkgGI!)I?U}_s`qE~MPPaOgl(?}8>tURI zbq@QVWUtD}o>Q37XTTcP8e{XvVEg@k7er&fzT$lU1!T4DL)K$KEZM8pr+dy|-ehDF_X77(*?9ze9%f;;Q2ML_ci!DaFdSTY^)igBw_c9}Yfb<4e2tHf re}@wNRi3XkJ+L;i)(3W7{ssI7YL=IQ_s#k*00000NkvXXu0mjfLt|7w diff --git a/MyOffice.SPA/src/assets/images/favicon.ico b/MyOffice.SPA/src/assets/images/favicon.ico deleted file mode 100644 index 9ba9214fd85678584b1c2d486f3ec8c221a6c378..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmb_ZO>9h282tuK6NJWss5H7H>?CX?5}VGqE!I4uv6N{M1+4|F%|K@AKyhmz%pN#xyN_j-0wSQuGQOxOKZ!KHXhn25@UqQ-_fSRUI55p5{osPyc&*|I}Pi&T76bdIK=?PgAzAZ;X3CZDJ z$&G!I8rG9Pc1Ae&hx-)OXH3!u9eC&0e8=x2L0UsL3 z^mi5~J#Dfg@+e;!ePnk794TTLC~DnP9D$C}k1Xy;4j~UGQ}hLWW$mn)Mh%O$W)wxA z*c*T(@G6?I2P4BO2@P4)KqjoGq(Hu7sNpkuGKnnTqaXF&olN!5C2f5HA0zg{=u>;? zmJxe?O$&{rqJ@&We~unu0nI6mM(?^o~i zK3NT&@}qxTN8xA7h*|)C{8tVIcxW+Fs=`RCKXS@9w~tz6JhTb?TJR5}rw74bfxea> z`{%kbm8ZsZ-nIRv?b?=@`s;aSqVeNInYks5V;-+8t(#o4v?eTz-*ROM`AtNHBSb#| D(y#Bc diff --git a/MyOffice.SPA/src/assets/images/flags/germany.jpg b/MyOffice.SPA/src/assets/images/flags/germany.jpg deleted file mode 100644 index 46147e469e010e4dab4c158fe9021ad3a60d86b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmex=&BisxYG7UMvAjrX>#o)lqsKme|$jB_n z`2Prl1kkBKz<>nUnOH$Gssap*OibKJa*Pa2%z>f zF&**w&E-nj6Sb2d)a0At~Q#o}SToT1z33;_lViatNUg0VEJ7H#&$B`5JeU$9~-vj{Y>E0gz diff --git a/MyOffice.SPA/src/assets/images/flags/spain.jpg b/MyOffice.SPA/src/assets/images/flags/spain.jpg deleted file mode 100644 index f81c83a1cfd43d37d77ab63e7dca5d832f453aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1039 zcmex=&BisxYG7UMvAjrX>#o)lqsKme|$jB_n z`2Prl6axb@BM>kk04oO@3nLRyPE&w^iIItgm4z85&B(;ez{1KVC?qNtI_09UNMMkX zp<^M)7)Ayrpg9Ob7#P?Xnb}#u#s~t9VP;}wW`)UvjS*A~VHFY*ir2zg*Uv;J<)179F(2*^+&^>^zSRJi)&}~p8b}! zG)M1~o?^Y8yqG*o(68Bw)pIPICT-hY_D=i9+`|r1^FQ!#FODcX`DmBkzD3zeP0!ms z_S}4`jZ=giZ9xvi-7Vg9Dc zCqk@ ze#4rUeqzP67u#k`-C6n2@UAd3^UCy#mz~UI<^4}>*>--{3w1r!bw^6R-#QYP%461c z!@GXgWp&Bj56i_SIcJORvI)y#X$sMM6DjdrW~Y^`*7O|9**hwuGGzn=uLd%z@Cf^9 zEb4Mt4J0%cE%}#mrncxm!;X5BVz=bi)Bhg+xh}`e;?lpLf}){$s-X-S4D4UDr)T}) zx@GMhyTxAW@{2AZ#ux4nww#}3EFZJ~o%~sui!**b{m)SFFEj1x50TvXM)%C@ZS9Yv z=JnVwvu9ma1C!2p)^q&2{_pnB-e&6$EC!kgG4SHW_AkeA87F$R-Cg?rjm3*LZ9U?3 cpx2S*U$5-kb+_buvv>j;=e5*v$N#?x08mVdv;Y7A diff --git a/MyOffice.SPA/src/assets/images/flags/ukraine.png b/MyOffice.SPA/src/assets/images/flags/ukraine.png deleted file mode 100644 index 3479ad32f685ece944239779b0005484906c5f3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^|ABZF6El#MS1ptUQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI0*T78I$Rxzbz{=Rb%D_U~07x1<4*Q^mq9HdwB{QuOw}wgF9$&BisxYG7UMvAjrX>#o)lqsKme|$jB_n z`2PrlGy?+@6Eo1E2*A$F#>m3T0hBZqU|?ioVrOS!WoCuQGcvI-Ftf6;3kr#a35$pZ zPF{G~FkDG_;-pLBj!BBDu0c&eZBmR3KqFDiWMgDyXJ!G)845BmurM=ou|f?58q3JU z%)%-tq&N|1pjco?*rdsq*o=(R8VwzTQ!f6$#lQn}9+M!mAcH-_LMc6;UzW3PcFnm| za#HX4+QXa5^hI?OICHxKJmYQR_mrHCPd_?cy?99h=jo}3_Mc)<$u(P&aJcE;MQN9| zE5@0Z*IlSiVA?|E`NufA9j@Xs)Hm5C|; z@mGIl1s-1JE8|(atb1c? z9B1UL_p?fE=K^+zW1Z~AOy>v2lqVy0?k$jU8c?H}F<^Kbg}{L}KF)}?N(yWUO> zepBMmZ4!Q$qi@!Ov!dUfl$Y(8j^d*W7s3mgIz85Yf*V!`G?-Gh2RO|6>yPHESPR@TE)#Q6f!b>E#h>TtoB xPr3Ugc9U+VwCKJL(Pdb2b{dD$hkS!{UZ4&qQRNw`YE{R@3&SrZZ>ax&69BKU;9~#) diff --git a/MyOffice.SPA/src/assets/images/icons/xlsx.png b/MyOffice.SPA/src/assets/images/icons/xlsx.png deleted file mode 100644 index 2362390464c0aac6a82ff00ae6557d338e66c72e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24988 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%0Acf@^vp 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�V5ntVpZ(Li=yzE$^vH8=RMxm5T_Pa&! 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 Kw4Y%0Y4HYrC#JUD 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 diff --git a/MyOffice.SPA/src/assets/images/logo.png b/MyOffice.SPA/src/assets/images/logo.png deleted file mode 100644 index 83968825a346f907fa12e6b2bd8a381b85fbc4a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 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 Ojf)fbO7-R6@Ba_>anqgv diff --git a/MyOffice.SPA/src/assets/images/pages/bg-02.png b/MyOffice.SPA/src/assets/images/pages/bg-02.png deleted file mode 100644 index 2847236eef6a8e2a38871a6ebb0326bad53f182e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3051 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 Ojf)fbO7-R6@Ba_>anqgv diff --git a/MyOffice.SPA/src/assets/images/pages/bg-03.png b/MyOffice.SPA/src/assets/images/pages/bg-03.png deleted file mode 100644 index 2847236eef6a8e2a38871a6ebb0326bad53f182e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3051 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 Ojf)fbO7-R6@Ba_>anqgv diff --git a/MyOffice.SPA/src/assets/images/pages/bg-04.png b/MyOffice.SPA/src/assets/images/pages/bg-04.png deleted file mode 100644 index 2847236eef6a8e2a38871a6ebb0326bad53f182e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3051 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 Ojf)fbO7-R6@Ba_>anqgv diff --git a/MyOffice.SPA/src/assets/images/pages/bg-05.png b/MyOffice.SPA/src/assets/images/pages/bg-05.png deleted file mode 100644 index 2847236eef6a8e2a38871a6ebb0326bad53f182e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3051 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 Ojf)fbO7-R6@Ba_>anqgv diff --git a/MyOffice.SPA/src/assets/images/pages/home-1.png b/MyOffice.SPA/src/assets/images/pages/home-1.png deleted file mode 100644 index df6683dc76788cf0f48088491bdae04cf75dade7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0xf#j5QblyHTKb)7{k#JK5{gml&c|W)gx^p&X7XM(QrUL8Y1z#yW<*c z1eMZNtL89|w7c5b^`l|Nz5p-`!!QiPFbu;m48t%C!!QiPFmK0<;50(avsEM=(W z+(sBJT4?tNXEF0zKh{yc$_NvzaeE0S&pS*?fqEkW%j-tR7<#a#y3TFC z>iCb;_hC2;k1=c)-9*=EH)8C3`V6~K$;)F-eW|5n7=~dOhG7_nVHk#C-Ysr6-i6bU zH_@A%2JNJjt`PwBbPI@{A4AOi2v>mV9J-bObMmmjK)7~j&F{zXBU-Ha zC%WRRqa8})qSH)vM&@j0(+KXZ6BK`YQ^j7bPAM@Xm5~Qp)SxS#Ix5GbwD78ysneb= z4^B6m47i(ed~~WF(N)vjoAjJZ$xtT_^)%oFgOhrq6I{sCTqDnuf-0F!d9M;oAEc#_ zCtAU&^UK&ctEX#KPMlOvt7Erd&qb(CXerbatN7GOpAG;7scyx`+4kPd|`<@UN^L{C%e?1jGCnegYSqV$RD&p@0AY002ovPDHLkV1f)2 BSuFqn diff --git a/MyOffice.SPA/src/assets/images/posts/post1.jpg b/MyOffice.SPA/src/assets/images/posts/post1.jpg deleted file mode 100644 index d706d8b8a3c6f3a961e0bc394ecff9bc413ac0d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 732 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�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 G4&*=CjAW|- diff --git a/MyOffice.SPA/src/assets/images/thumbs-up.png b/MyOffice.SPA/src/assets/images/thumbs-up.png deleted file mode 100644 index 8273711578564ca1d94009bce18410ad282b63c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmVXq{scW+=lo4`3&rTCqKvS1~>&PmJ@)AF~`TBw{uwm0^V_b1fCaC z0Y5n{02Mr5UI6^;eEEl*0v|dFPjvA-sMt)X0Le$(6j0))hrydf#jkL$^k?|8sNmx$ z0<>cLI41xl+!by0;b%QQzPMYfFJWsGfRO|UR&uWKk>Dx}JkS7daBTJ2SyACl>JmHL z8F*6uawzzxu>?F(SizwkA8&{QkBYtE(0-qv8wcJb3Vyf!;7=45MaAxj3vW_OezF61 zdD$xlCXs;Y!rJ!23%;4TshJcWC41ZIZf^h*!Anjw(oV=4W-Q+3@`ob>3q~~2OXRl@ z4ct%Eelt<)jf6uFHdxy2***sB|4dZuJ5+p}ly_9sZ*HQ1cdH2-E(30=4*W|43!;Fr z{J;mtDI8f*czUK~0aUy@kMJhV!c-3asj;O|a4(18!JhE#p9lO#@jZ%@ufuyEz3IPm z=)X5SZ+DdZ^_+qSE8v^N0!+?<_dfii)V1{1B?YIVV8wic2L*61l>n2(8*&R6eouk# zn_j?hTRs6hZYAowmxw+3>kg8p28d(;Ucp6%JH3Fhu6zn;yNRglcB1aPi2Cj$8hnrl z8i~ex2&ad-4RbaECj0Cxe*ybtBVc;aN&%?A&qjb?mI`3sW+OmyI|T^%CK~|?Y|Y`C z7NARTP&NW&P9e<*EIdLq*8Pvu6eYjXFuUCY%s!ywmfuA5-a}Mup`WLRKGo9O-|%K9 zV5VU2_BRs&Q~g%Y|MUXJd#s-S=>?3mTRi_m1WaE3WVisY$>RARBA|622p3Rz$m;o@ zUO?YH7S8_=0q;zGNI!h>BWbPa`_F$g|Npmuj$86S|7ZF?2+sdd0R}!0M#6s!XuXkW zW+?Ba|G8m|EPyo44o&3+jCSUI^nDjgfLZa`74SoO0sPUtkG`jZtdV-auM+gH@aF&W z0($Psw*U!OMH7%9qdg+?7t^w^14_6R1$?1!a~!TKoKvsHrE zTC(FK9as|hH@x=`PWUm@LMZvAsMwd4U3mka;~>SC)Dq4xPmoc;n<&_iX}i5?c;=iB flzm9lqaMEig2@SJiS>I900000NkvXXu0mjf%LU+& diff --git a/MyOffice.SPA/src/assets/images/user/admin.jpg b/MyOffice.SPA/src/assets/images/user/admin.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/images/user/user1.jpg b/MyOffice.SPA/src/assets/images/user/user1.jpg deleted file mode 100644 index dd2b3b8dd34c6b1639df334e1015f3ace447a40f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 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 diff --git a/MyOffice.SPA/src/assets/images/user/usrbig10.jpg b/MyOffice.SPA/src/assets/images/user/usrbig10.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/images/user/usrbig11.jpg b/MyOffice.SPA/src/assets/images/user/usrbig11.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/images/user/usrbig2.jpg b/MyOffice.SPA/src/assets/images/user/usrbig2.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/images/user/usrbig3.jpg b/MyOffice.SPA/src/assets/images/user/usrbig3.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/images/user/usrbig4.jpg b/MyOffice.SPA/src/assets/images/user/usrbig4.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/images/user/usrbig5.jpg b/MyOffice.SPA/src/assets/images/user/usrbig5.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/images/user/usrbig6.jpg b/MyOffice.SPA/src/assets/images/user/usrbig6.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/images/user/usrbig7.jpg b/MyOffice.SPA/src/assets/images/user/usrbig7.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/images/user/usrbig8.jpg b/MyOffice.SPA/src/assets/images/user/usrbig8.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/images/user/usrbig9.jpg b/MyOffice.SPA/src/assets/images/user/usrbig9.jpg deleted file mode 100644 index cbe59c32137e412259dfee67d24e4487447ac212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmds3c{JNu8~$aXp@dk1##Vz`Kb1jLORI~mYOf`HR7s2260KtBba9F)#dO-BnAoaH zYL6;utQ}hWnna6Is)`mdNJ_qF%{l#R{`vm+zBA8z@45Hf_uhNn=bq<1@8vOglYqF5 zg|!6$0s#PsZvbx_P(BeB5>CWLMBx0D&qpfr`si#cJ6B=3+{kHc12ic9?crPU2LPmOUnMBLO>S|M}PvqtrLOeNXnQ3c=#v zFa3|^e-j_%|0F(5aR3YfzyLpiA>UpJ0tJBu06~O=q?CiWzQGS@L$b8;!QIpb!GP_F zlQ@FsORJ2Gq&wo1VhN?5u4}j5wq0ujJ!)@-qy89p*LBjigXu+GNqx(O2!Qk1G?MQu zmNkX%8gHOlTh~gr_%?BGOlN;M9Q>zJkfh7QsZ8CVQ(0&?KP3w!hPyHUY|wj@@u%Ve zXGe#jo`0vL2)X>rzm|lplG>Lbji|3^g*SMuv6_7kcK(sJ@T?Ha14L>17b4m*3vz4p zUuDke!eNTdQ?7$P=?M44ln%Cm^ZCP?>N3E_BeFJ>z_jGx??ZleQ901RKHl3`oO3H) zAhc_$f}2~?`wFY+i6ts|NGCg&*4%cxJ~Ya{;S@m;V>5JWG|(^P*Ya(j5LV%)aWb-* zi8Z$NKFgA!dY?JW6f*|Js;TGtrkbp}E4`Llw;B+&T7C81CUg5G@euPU%**ogJx-7s zyd>t7$Y6n|iHrae)@t|T>2yDbfXj2KhB+hcFwh00M=2%|KStR`L>~=&@6N^aRCBYJ zXDwIlH)0Lu1I8>Fdsv2N&O*Qg(G_68Q zE5@(LEbC5-mRGttHCcxT06_=$NyUa_J*4&ekD*G3*h6ZTxm{y0=isW580L}Z?~s@J z1mM;m{jwfA*&S(NQOfb-1x4kd4HC{z+rAjhMt8;-(>LGP>lJl*4JK0w6xF<$Pz~h$ z+z`{6DRO)2#jKDRqk0ITwm1a?oqaU8)Y`qJxHl%|k~}qo<@9k?*wfppWFvg|TAERb zK_$$*?XEqMU05cp1-g}GV{o%-B_3~oApqtWqw%!$OrdPa{7TWl;6O1oc_>dhNOOCZ z2k=t~BhD|LU?^AsCcGgZ4{=2&*dO5J)t5NNF_P$|w$y99$3C*(3ymz{DYJcbTUCf#Fnfb%4vJ?|7G*>H|Z>mocKz8z~?AfI=o;2f5Oje2%+IM{_@&B(-$J`h-wZcxF@ zP!t|nm1D%?aCrJsz|+wyEn|I~wrJ?t$YGjAFlDT3yeR6-tDdd<)D@pMa}(uD<@BXF zuHOcJ!S~B0g{ZZ>E=qyXgqh3bbMAACr{U(^+OC}AdbKu<#K^p#K1?}BXBek@@AnDj z0edW8ua9im|7L)nW_lMlY92nDj;6 z6KznPDtVdkV{Cn$TO>7|e)IK^NL^oA<$Gj;jwea?66-ZQTi$)roO(gSlSUSyCO}yg z`hKV~)%J>Y(j1FmV{&`kTTG%LSbs@k50V-ma^n7(F`24QS4EG#inB^mB;o@eY|s|r y=b2SY>fI-<_QUd5OVKfdQS`FuoqB-y`ak-vAd$b-D-h@?04V*<4#@5f=6?XBo;=6^ diff --git a/MyOffice.SPA/src/assets/scss/apps/_calendar.scss b/MyOffice.SPA/src/assets/scss/apps/_calendar.scss deleted file mode 100644 index 0a416be..0000000 --- a/MyOffice.SPA/src/assets/scss/apps/_calendar.scss +++ /dev/null @@ -1,340 +0,0 @@ -/* - * Document : _calendar.scss - * Author : RedStar Template - * Description: This scss file for style related to calendar app - */ - -#event_title { - font-size: 1.2rem; -} - -#calendar { - float: right; - width: 100%; -} - -#external-events { - .fc-event { - padding: 5px 10px; - font-size: 14px; - margin-bottom: 4px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); - border-radius: 3px; - cursor: move; - } - - .form-check .form-check-label { - font-size: 14px; - } -} - -.cal-event { - display: inline-block !important; - height: 10px; - width: 10px; - border-radius: 50%; - padding: 0; -} - -.fc-state-active { - background: #a389d4 !important; - color: #fff; -} - -.fc-day-grid-event { - color: white !important; - text-align: center; -} - -.fc-event-primary { - border: none !important; - background-color: #007bff !important; - box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), - 0 7px 10px -5px rgba(0, 154, 255, 0.4); - color: #fff; -} - -.fc-event-warning { - border: none !important; - background-color: #ff9800 !important; - box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), - 0 7px 10px -5px rgba(255, 152, 0, 0.4); - color: #fff; -} - -.fc-event-success { - border: none !important; - position: relative; - background-color: #53b958 !important; - box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), - 0 7px 10px -5px rgba(76, 175, 80, 0.4); - font-weight: 400; - color: #fff; -} - -.fc-event-danger { - border: none !important; - background-color: #f9483b !important; - box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), - 0 7px 10px -5px rgba(244, 67, 54, 0.4); - color: #fff; -} - -.fc-event-info { - border: none !important; - position: relative; - background-color: #03c5de !important; - box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), - 0 7px 10px -5px rgba(0, 188, 212, 0.4); - font-weight: 400; - color: #fff; -} - -.fc-event-default { - background: #007bff; - border: 1px solid #007bff; -} - -.fc-state-default { - border: 1px solid #eee; - background: transparent !important; - color: #7e869d; - border-radius: 0; -} - -.catLbl { - font-weight: 600; - color: #34395e; - font-size: 12px; - letter-spacing: 0.5px; - margin-bottom: 0; -} - -.fc .fc-button-primary { - background-color: #ffffff !important; - border: 1px solid #eee !important; - color: #7e869d !important; - border-radius: 5px !important; - margin-right: 8px !important; - - &:disabled { - color: #fff !important; - background-color: #6777ef !important; - border-color: #6777ef !important; - } - - &:hover { - color: #868181 !important; - background-color: #e1e0e0 !important; - border-color: #e1e0e0 !important; - } - - &:focus { - box-shadow: none !important; - } - - &:not(:disabled) { - &.fc-button-active { - color: #fff !important; - background-color: #6777ef !important; - border-color: #6777ef !important; - } - - &:active { - color: #fff !important; - background-color: #6777ef !important; - border-color: #6777ef !important; - } - } -} - -.fc-color-picker { - list-style: none; - margin: 0; - padding: 0; - - > li { - float: left; - font-size: 30px; - margin-right: 5px; - line-height: 30px; - } -} - -.fc-content-skeleton thead { - border-bottom: none; -} - -.fc-toolbar h2 { - font-size: 16px; - margin-top: 4px; -} - -.fc-view { - border-color: #f2f2f2; - - > table { - border-color: #f2f2f2; - - th { - border-color: #ddd; - color: color(fontdark) !important; - font-weight: 500; - padding: 15px; - } - } - - color: color(fontdark) !important; - font-weight: 500; - padding: 10px; - - .fc-scrollgrid-section { - > th { - padding: 0px; - } - } -} - -.fc-view-container > .fc-view { - padding: 0; -} - -.fc-view { - color: #666; - text-align: right; - - > table td { - color: #666; - text-align: right; - } -} - -.fc button .fc-icon { - top: -0.09em; -} - -.fc-basic-view { - .fc-day-number, - .fc-week-number { - padding: 10px; - } -} - -.fc .fc-daygrid-event { - padding: 0px 10px; - box-shadow: 0 4px 25px 0 rgba(0, 0, 0, 0.1); - color: #ffffff; - text-align: left; -} -.fc-daygrid-block-event .fc-event-time { - font-weight: 400 !important; - font-size: 12px; -} -.fc-daygrid-event-dot { - display: none; -} -.fc-daygrid-dot-event .fc-event-title { - font-weight: 400 !important; - text-align: left; - font-size: 12px; -} -.fc-daygrid-dot-event .fc-event-time { - font-weight: 400 !important; - text-align: left; - font-size: 12px; -} -.fc-event-title-container .fc-event-title { - font-weight: 400 !important; - text-align: left; - font-size: 12px; -} - -tr:first-child > td > .fc-day-grid-event { - margin-bottom: 10px; -} - -.fc-state-default { - border-radius: 3px; - background-color: #f2f2f2; - background-image: none; - border: none; - box-shadow: none; - text-transform: capitalize; - font-weight: 500; -} - -.fc button { - height: auto; - padding: 10px 15px; - text-shadow: none; - border-radius: 0; - - &.fc-state-active { - background-color: color(primary); - color: #fff; - } -} - -.fc .fc-axis { - vertical-align: middle; - padding: 0 4px; - white-space: nowrap; -} - -.ngx-mat-timepicker { - .ng-pristine { - td { - padding: 0px; - border-top: none; - border-bottom: none; - } - } -} - -.fc-time-grid-event .fc-content { - color: #ffffff; -} - -.fc-list-event { - color: #ffffff; -} - -.fc-list-event:hover td { - background-color: #cccaca !important; -} - -.fc-event-container:hover { - cursor: pointer; -} - -.fc-daygrid-day-top { - text-align: center; - display: block !important; - .fc-daygrid-day-number { - color: #666; - display: inline-flex; - align-items: center; - justify-content: center; - margin: 4px 0; - font-size: 12px !important; - } -} -.fc-day-today .fc-daygrid-day-number { - display: inline-flex; - align-items: center; - justify-content: center; - width: 25px; - height: 25px; - margin: 4px 0; - font-size: 12px; - border-radius: 50%; - background: #6777ef; - color: #fff; -} -.fc .fc-daygrid-day.fc-day-today { - background-color: transparent !important; -} -.fc .fc-col-header-cell-cushion { - color: #666; -} diff --git a/MyOffice.SPA/src/assets/scss/apps/_chat.scss b/MyOffice.SPA/src/assets/scss/apps/_chat.scss deleted file mode 100644 index 4cc8208..0000000 --- a/MyOffice.SPA/src/assets/scss/apps/_chat.scss +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Document : _chat.scss - * Author : RedStar Template - * Description: This scss file for style related to chat app - */ -%font_extend { - font-size: 16px; - color: gray; - cursor: pointer; -} - -.chat-app { - height: 690px; - .people-list { - width: 280px; - position: absolute; - left: 0; - top: 0; - padding: 20px; - } - .chat { - // margin-left: 280px; - border-left: 1px solid #e8e8e8; - } - .list_btn { - position: fixed; - bottom: 20px; - right: 20px; - z-index: 9999; - padding: 0; - width: 40px; - height: 40px; - text-align: center; - line-height: 40px; - display: none; - @include box-shadow(0 10px 25px 0 rgba(0, 0, 0, 0.3)); - @include border-radius(3px); - } -} -.people-list { - transition: 0.5s; - .chat-list { - li { - padding: 10px 15px; - list-style: none; - @include border-radius(3px); - &:hover { - background: #efefef; - cursor: pointer; - } - &.active { - background: #efefef; - } - .name { - font-size: 15px; - } - } - img { - width: 45px; - @include border-radius(50%); - } - } - img { - float: left; - border: 1px solid #fff; - @include box-shadow(0px 5px 25px 0px rgba(0, 0, 0, 0.2)); - @include border-radius(50%); - } - .about { - float: left; - padding-left: 8px; - } - .status { - color: #999; - font-size: 13px; - } -} -.chat { - .chat-header { - padding: 20px; - border-bottom: 1px solid #eee; - border-radius: 0 0.55rem 0 0; - img { - float: left; - @include border-radius(50%); - width: 45px; - } - .chat-about { - float: left; - padding-left: 10px; - } - .chat-with { - font-weight: bold; - font-size: 16px; - } - .chat-num-messages { - color: 434651; - } - } - .chat-history { - padding: 20px; - border-bottom: 2px solid #fff; - height: 450px; - ul { - padding: 0; - li { - list-style: none; - } - } - .message-data { - margin-bottom: 15px; - .message-data-name { - font-size: 13px; - font-weight: 700; - } - } - .message-data-time { - color: #434651; - padding-left: 6px; - } - .message { - color: #444; - padding: 18px 20px; - line-height: 26px; - font-size: 13px; - @include border-radius(7px); - margin-bottom: 30px; - width: 90%; - position: relative; - &:after { - bottom: 100%; - left: 7%; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-bottom-color: #fff; - border-width: 10px; - margin-left: -10px; - } - } - .my-message { - background: #e8e8e8; - &:after { - bottom: 100%; - left: 7%; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-bottom-color: #e8e8e8; - border-width: 10px; - margin-left: -10px; - } - } - .other-message { - background: #d9e7ea; - &:after { - border-bottom-color: #d9e7ea; - left: 93%; - } - } - } - .chat-message { - padding: 20px; - textarea { - width: 100%; - border: none; - padding: 10px 20px; - font: 14px/22px Lato, Arial, sans-serif; - margin-bottom: 10px; - @include border-radius(5px); - resize: none; - } - .fa-file-o { - @extend %font_extend; - } - .fa-file-image-o { - @extend %font_extend; - } - } -} -.online { - margin-right: 3px; - font-size: 10px; - color: #86bb71; -} -.offline { - margin-right: 3px; - font-size: 10px; - color: #e38968; -} -.me { - margin-right: 3px; - font-size: 10px; - color: #0498bd; -} -.float-end { - float: right; -} -.clearfix:after { - visibility: hidden; - display: block; - font-size: 0; - content: " "; - clear: both; - height: 0; -} -.slimScrollBar { - z-index: 0 !important; -} -.chat-upload { - float: right; -} diff --git a/MyOffice.SPA/src/assets/scss/apps/_contactgrid.scss b/MyOffice.SPA/src/assets/scss/apps/_contactgrid.scss deleted file mode 100644 index 5e7eea7..0000000 --- a/MyOffice.SPA/src/assets/scss/apps/_contactgrid.scss +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Document : _contactgrid.scss - * Author : RedStar Template - * Description: This scss file for style related to contact grid app - */ -.contact-grid { - float: left; - width: 100%; - text-align: center; -} -.profile-header { - min-height: 150px; - color: #fff; -} -.user-name { - padding: 3px; - font-size: 22px; - text-align: center; - padding-top: 10px; -} -.user-img { - padding: 3px; - border-radius: 50% 50% 50% 50%; - max-width: 112px; - margin-top: -70px; - box-shadow: 0px 10px 25px 0px rgba(0, 0, 0, 0.3); - margin-bottom: 20px; -} -.profile-userbuttons { - text-align: center; - margin-top: 10px; -} -.contact-grid .phone .material-icons { - font-size: 16px; - padding: 4px 7px 40px 0px; -} diff --git a/MyOffice.SPA/src/assets/scss/apps/_contactlist.scss b/MyOffice.SPA/src/assets/scss/apps/_contactlist.scss deleted file mode 100644 index 18c17da..0000000 --- a/MyOffice.SPA/src/assets/scss/apps/_contactlist.scss +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Document : _contactlist.scss - * Author : RedStar Template - * Description: This scss file for style related to contact list app - */ -.contact-detail { - .fa { - float: left; - width: 30px; - font-size: 20px; - margin-top: 5px; - } - span { - float: left; - width: calc(100% - 30px); - margin-bottom: 20px; - } - .fa-envelope { - font-size: 15px; - } - .fa-mobile { - font-size: 25px; - } -} -.contact-photo { - float: left; - width: 100%; - text-align: center; - padding-top: 20px; - img { - margin: 0 auto; - width: 130px; - padding: 3px; - border: 3px solid rgb(210, 214, 222); - border-radius: 50% 50% 50% 50%; - } -} -.contact-usertitle { - text-align: center; - margin-top: 5px; -} -.contact-usertitle-name { - font-size: 20px; - margin-bottom: 2px; - font-weight: bold; - color: #3a405b; -} -.contact-usertitle-job { - color: #777777; - font-size: 12px; - margin-bottom: 5px; -} -.newLabelBtn { - padding: 20px 0; - text-align: center; -} -.alert-dismissible .close { - text-indent: 0; -} -.alert.alert-dismissible { - color: #ffffff; -} -.contact_list { - .phone { - position: relative; - padding-left: 20px; - .material-icons { - position: absolute; - left: 0; - font-size: 16px; - top: 1px; - } - } -} -.list-group-unbordered { - .list-group-item { - border: 0px; - } -} -.contact-header { - display: flex; - - .contact-details-img img { - position: relative; - display: flex; - width: 80px; - height: 80px; - border-radius: 50%; - margin-right: 0px; - overflow: hidden; - } -} - -.contact-details-name { - font-size: 20px; - font-weight: 500; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - letter-spacing: 1px; -} - -.contact-details-field { - display: flex; - margin-top: 30px; - - .material-icons-two-tone { - margin: 0 20px 0 10px; - } - - .contact-detail-info { - white-space: pre-wrap; - } - - .color-icon { - filter: invert(14%) sepia(0%) saturate(5141%) hue-rotate(101deg) - brightness(95%) contrast(97%); - } -} - -.contact-form { - .modalHeader img { - border-radius: 50%; - height: 35px; - width: 35px; - } -} diff --git a/MyOffice.SPA/src/assets/scss/apps/_dragdrop.scss b/MyOffice.SPA/src/assets/scss/apps/_dragdrop.scss deleted file mode 100644 index cd4c6eb..0000000 --- a/MyOffice.SPA/src/assets/scss/apps/_dragdrop.scss +++ /dev/null @@ -1,153 +0,0 @@ -.example-box { - width: 200px; - height: 200px; - border: solid 1px #ccc; - color: rgba(0, 0, 0, 0.87); - cursor: move; - display: inline-flex; - justify-content: center; - align-items: center; - text-align: center; - background: #fff; - border-radius: 4px; - margin-right: 25px; - position: relative; - z-index: 1; - box-sizing: border-box; - padding: 10px; - transition: box-shadow 200ms cubic-bezier(0, 0, 0.2, 1); - box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), - 0 1px 5px 0 rgba(0, 0, 0, 0.12); -} - -.example-box:active { - box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), - 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12); -} - -.example-boundary { - width: 400px; - height: 400px; - max-width: 100%; - border: dotted #ccc 2px; -} - -.example-container2 { - width: 400px; - max-width: 100%; - margin: 0 25px 25px 0; - display: inline-block; - vertical-align: top; -} - -.example-list { - border: solid 1px #ccc; - min-height: 60px; - background: white; - border-radius: 4px; - overflow: hidden; - display: block; -} - -.example-box-small { - padding: 20px 10px; - border-bottom: solid 1px #ccc; - color: rgba(0, 0, 0, 0.87); - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - box-sizing: border-box; - cursor: move; - background: white; - font-size: 14px; -} - -.cdk-drag-preview { - box-sizing: border-box; - border-radius: 4px; - box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), - 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12); -} - -.cdk-drag-placeholder { - opacity: 0; -} - -.cdk-drag-animating { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.example-box-small:last-child { - border: none; -} - -.example-list.cdk-drop-list-dragging - .example-box-small:not(.cdk-drag-placeholder) { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.example-list2 { - width: 500px; - max-width: 100%; - border: solid 1px #ccc; - min-height: 60px; - display: block; - background: white; - border-radius: 4px; - overflow: hidden; -} - -.example-box2 { - padding: 20px 10px; - border-bottom: solid 1px #ccc; - color: rgba(0, 0, 0, 0.87); - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - box-sizing: border-box; - cursor: move; - background: white; - font-size: 14px; -} - -.cdk-drag-preview { - box-sizing: border-box; - border-radius: 4px; - box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), - 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12); -} - -.cdk-drag-animating { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.example-box2:last-child { - border: none; -} - -.example-list2.cdk-drop-list-dragging .example-box2:not(.cdk-drag-placeholder) { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.example-custom-placeholder { - background: #ccc; - border: dotted 3px #999; - min-height: 60px; - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.example-box-small.cdk-drag-disabled { - background: #ccc; - cursor: default; -} -.example-handle { - position: absolute; - top: 10px; - right: 10px; - color: #ccc; - cursor: move; - width: 24px; - height: 24px; -} diff --git a/MyOffice.SPA/src/assets/scss/apps/_task.scss b/MyOffice.SPA/src/assets/scss/apps/_task.scss deleted file mode 100644 index 28116f9..0000000 --- a/MyOffice.SPA/src/assets/scss/apps/_task.scss +++ /dev/null @@ -1,250 +0,0 @@ -.gu-mirror { - position: fixed !important; - margin: 0 !important; - z-index: 9999 !important; - opacity: 0.8; - filter: alpha(opacity=80); -} - -.gu-hide { - display: none !important; -} - -.gu-unselectable { - //Instead of the line below you could use @include user-select($select) - user-select: none !important; -} - -.gu-transit { - opacity: 0.2; - filter: alpha(opacity=20); -} - -.taskbar { - .checked { - border: 3px solid #dda500 !important; - } - - .box { - padding-bottom: 7px; - - .task-name { - font-size: 18px; - font-weight: 600; - color: green; - } - - .task-desc { - font-size: 1.1em; - color: #555; - } - - .task-deadline { - margin-top: 5px; - margin-right: 5px; - font-size: 0.8em; - color: #555; - } - } - - .done div.box { - pointer-events: none; - - .tasks { - color: #fff !important; - } - } - - .avatar-image { - display: inline-block; - position: relative; - } - - .task-header { - text-align: center; - font-size: 25px; - padding: 20px; - color: #6b6a6a; - } - - .card-footer { - background: #fff !important; - border-radius: 0px 0px 10px 10px; - - .progress { - height: 5px; - } - } -} - -.pad { - padding-left: 0; - padding-right: 0; - display: flex; -} - -.move { - text-align: center; - background: #eee; - - .btn { - margin-bottom: 20px; - } -} - -.task-module { - display: flex; - flex-direction: column; - padding: 0 !important; - min-height: 100%; - - .mat-drawer.mat-drawer-end { - width: 500px; - min-width: 500px; - border: 1px solid #dcd6d6; - } - - .task-header { - display: flex; - flex: 0 1 auto; - align-items: center; - margin: 10px 0px 23px 0px; - } - - .header-button { - margin-left: auto; - } -} - -.task-container { - .header { - .header-title { - margin: 0px 0px 0px 5px; - } - - .header-close { - position: absolute; - top: 10px; - right: 15px; - list-style: none; - } - } -} - -.task-list { - width: 100%; - max-width: 100%; - border: solid 1px #ccc; - min-height: 60px; - display: block; - background: white; - border-radius: 4px; - overflow: hidden; -} - -.task-user-img { - height: 30px; - width: 30px; - position: relative; - margin-left: 30px; - border-radius: 50%; -} - -.task-date { - margin-left: 30px; -} - -.lbl-low { - display: inline-flex; - vertical-align: middle; -} - -.lbl-high { - display: inline-flex; - vertical-align: middle; -} - -.lbl-normal { - display: inline-flex; - vertical-align: middle; -} - -.task-low { - color: #0bc53a; - position: relative; - margin-left: auto; -} - -.task-high { - color: #f9683a; - position: relative; - margin-left: auto; -} - -.task-normal { - color: #868688; - position: relative; - margin-left: auto; -} - -.task-box { - padding: 10px 10px; - border-bottom: solid 1px #ccc; - color: rgba(0, 0, 0, 0.87); - display: flex; - flex-direction: row; - align-items: center; - // justify-content: space-between; - box-sizing: border-box; - cursor: move; - background: white; - font-size: 14px; - - &:hover { - cursor: pointer; - } -} - -.cdk-drag-preview { - box-sizing: border-box; - border-radius: 4px; - box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), - 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12); -} - -.cdk-drag-animating { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.task-box:last-child { - border: none; -} - -.task-list.cdk-drop-list-dragging .task-box:not(.cdk-drag-placeholder) { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.task-custom-placeholder { - background: #ccc; - border: dotted 3px #999; - min-height: 60px; - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.task-handle { - color: #ccc; - cursor: move; - width: 24px; - height: 24px; -} - -.done { - text-decoration: line-through; - opacity: 0.5; -} - -.mat-list-item-content { - display: flex; - flex-direction: row; - justify-content: space-between; -} diff --git a/MyOffice.SPA/src/assets/scss/browser/_ie10.scss b/MyOffice.SPA/src/assets/scss/browser/_ie10.scss deleted file mode 100644 index 698e265..0000000 --- a/MyOffice.SPA/src/assets/scss/browser/_ie10.scss +++ /dev/null @@ -1,60 +0,0 @@ -html { - &.ie10 { - .sidebar { - .menu { - .list { - li { - line-height: 30px; - } - - .ml-menu { - li { - &.active { - a { - &:not(.menu-toggle) { - &.toggled { - &:before { - top: 6px !important; - line-height: 20px !important; - } - } - } - } - } - } - } - } - } - - .user-info { - .info-container { - top: 15px; - } - } - } - - .search-bar { - input[type="text"] { - padding: 26px 60px 26px 56px; - } - } - - .dropdown-menu { - ul { - &.menu { - li { - a { - margin-top: -22px; - } - } - } - } - } - - .bs-searchbox { - .form-control { - width: 90%; - } - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/browser/_ie11.scss b/MyOffice.SPA/src/assets/scss/browser/_ie11.scss deleted file mode 100644 index 00779db..0000000 --- a/MyOffice.SPA/src/assets/scss/browser/_ie11.scss +++ /dev/null @@ -1,56 +0,0 @@ -html { - &.ie11 { - .sidebar { - .menu { - .list { - .ml-menu { - li { - &.active { - a { - &:not(.menu-toggle) { - &.toggled { - &:before { - top: 6px !important; - line-height: 20px !important; - } - } - } - } - } - } - } - } - } - - .user-info { - .info-container { - top: 15px; - } - } - } - - .search-bar { - input[type="text"] { - padding: 26px 60px 26px 56px; - } - } - - .dropdown-menu { - ul { - &.menu { - li { - a { - margin-top: -22px; - } - } - } - } - } - - .bs-searchbox { - .form-control { - width: 90%; - } - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/common/_animation.scss b/MyOffice.SPA/src/assets/scss/common/_animation.scss deleted file mode 100644 index 6ed8cde..0000000 --- a/MyOffice.SPA/src/assets/scss/common/_animation.scss +++ /dev/null @@ -1,1046 +0,0 @@ -/* - * Document : _animation.scss - * Author : RedStar Template - * Description: This scss file for animation css classes - */ -.waves-effect { - position: relative; - cursor: pointer; - display: inline-block; - overflow: hidden; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-tap-highlight-color: transparent; -} -.waves-effect .waves-ripple { - position: absolute; - border-radius: 50%; - width: 100px; - height: 100px; - margin-top: -50px; - margin-left: -50px; - opacity: 0; - background: transparent; - // background:rgba(0,0,0,0.2); - // background:-webkit-radial-gradient(rgba(0,0,0,0.2) 0, rgba(0,0,0,0.3) 40%, rgba(0,0,0,0.4) 50%, rgba(0,0,0,0.5) 60%, rgba(255,255,255,0) 70%); - // background:-o-radial-gradient(rgba(0,0,0,0.2) 0, rgba(0,0,0,0.3) 40%, rgba(0,0,0,0.4) 50%, rgba(0,0,0,0.5) 60%, rgba(255,255,255,0) 70%); - // background:-moz-radial-gradient(rgba(0,0,0,0.2) 0, rgba(0,0,0,0.3) 40%, rgba(0,0,0,0.4) 50%, rgba(0,0,0,0.5) 60%, rgba(255,255,255,0) 70%); - // background:radial-gradient(rgba(0,0,0,0.2) 0, rgba(0,0,0,0.3) 40%, rgba(0,0,0,0.4) 50%, rgba(0,0,0,0.5) 60%, rgba(255,255,255,0) 70%); - -webkit-transition: all 0.5s ease-out; - -moz-transition: all 0.5s ease-out; - -o-transition: all 0.5s ease-out; - transition: all 0.5s ease-out; - -webkit-transition-property: -webkit-transform, opacity; - -moz-transition-property: -moz-transform, opacity; - -o-transition-property: -o-transform, opacity; - transition-property: transform, opacity; - -webkit-transform: scale(0) translate(0, 0); - -moz-transform: scale(0) translate(0, 0); - -ms-transform: scale(0) translate(0, 0); - -o-transform: scale(0) translate(0, 0); - transform: scale(0) translate(0, 0); - pointer-events: none; -} -.waves-effect.waves-light .waves-ripple { - background: rgba(255, 255, 255, 0.4); - background: -webkit-radial-gradient( - rgba(255, 255, 255, 0.2) 0, - rgba(255, 255, 255, 0.3) 40%, - rgba(255, 255, 255, 0.4) 50%, - rgba(255, 255, 255, 0.5) 60%, - rgba(255, 255, 255, 0) 70% - ); - background: -o-radial-gradient( - rgba(255, 255, 255, 0.2) 0, - rgba(255, 255, 255, 0.3) 40%, - rgba(255, 255, 255, 0.4) 50%, - rgba(255, 255, 255, 0.5) 60%, - rgba(255, 255, 255, 0) 70% - ); - background: -moz-radial-gradient( - rgba(255, 255, 255, 0.2) 0, - rgba(255, 255, 255, 0.3) 40%, - rgba(255, 255, 255, 0.4) 50%, - rgba(255, 255, 255, 0.5) 60%, - rgba(255, 255, 255, 0) 70% - ); - background: radial-gradient( - rgba(255, 255, 255, 0.2) 0, - rgba(255, 255, 255, 0.3) 40%, - rgba(255, 255, 255, 0.4) 50%, - rgba(255, 255, 255, 0.5) 60%, - rgba(255, 255, 255, 0) 70% - ); -} -.waves-effect.waves-classic .waves-ripple { - background: rgba(0, 0, 0, 0.2); -} -.waves-effect.waves-classic.waves-light .waves-ripple { - background: rgba(255, 255, 255, 0.4); -} -.waves-notransition { - -webkit-transition: none !important; - -moz-transition: none !important; - -o-transition: none !important; - transition: none !important; -} -.waves-button, -.waves-circle { - -webkit-transform: translateZ(0); - -moz-transform: translateZ(0); - -ms-transform: translateZ(0); - -o-transform: translateZ(0); - transform: translateZ(0); - -webkit-mask-image: -webkit-radial-gradient(circle, #fff 100%, #000 100%); -} -.waves-button, -.waves-button:hover, -.waves-button:visited, -.waves-button-input { - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - border: none; - outline: none; - color: inherit; - background-color: transparent; - font-size: 1em; - line-height: 1em; - text-align: center; - text-decoration: none; - z-index: 1; -} -.waves-button { - padding: 0.85em 1.1em; - border-radius: 0.2em; -} -.waves-button-input { - margin: 0; - padding: 0.85em 1.1em; -} -.waves-input-wrapper { - border-radius: 0.2em; - vertical-align: bottom; -} -.waves-input-wrapper.waves-button { - padding: 0; -} -.waves-input-wrapper .waves-button-input { - position: relative; - top: 0; - left: 0; - z-index: 1; -} -.waves-circle { - text-align: center; - width: 2.5em; - height: 2.5em; - line-height: 2.5em; - border-radius: 50%; -} -.waves-float { - -webkit-mask-image: none; - -webkit-box-shadow: 0px 1px 1.5px 1px rgba(0, 0, 0, 0.12); - box-shadow: 0px 1px 1.5px 1px rgba(0, 0, 0, 0.12); - -webkit-transition: all 300ms; - -moz-transition: all 300ms; - -o-transition: all 300ms; - transition: all 300ms; -} -.waves-float:active { - -webkit-box-shadow: 0px 8px 20px 1px rgba(0, 0, 0, 0.3); - box-shadow: 0px 8px 20px 1px rgba(0, 0, 0, 0.3); -} -.waves-block { - display: block; -} -.slideDown { - animation-name: slideDown; - -webkit-animation-name: slideDown; - animation-duration: 1s; - -webkit-animation-duration: 1s; - animation-timing-function: ease; - -webkit-animation-timing-function: ease; - visibility: visible !important; -} -@keyframes slideDown { - 0% { - transform: translateY(-100%); - } - 50% { - transform: translateY(8%); - } - 65% { - transform: translateY(-4%); - } - 80% { - transform: translateY(4%); - } - 95% { - transform: translateY(-2%); - } - 100% { - transform: translateY(0%); - } -} -@-webkit-keyframes slideDown { - 0% { - -webkit-transform: translateY(-100%); - } - 50% { - -webkit-transform: translateY(8%); - } - 65% { - -webkit-transform: translateY(-4%); - } - 80% { - -webkit-transform: translateY(4%); - } - 95% { - -webkit-transform: translateY(-2%); - } - 100% { - -webkit-transform: translateY(0%); - } -} -.slideUp { - animation-name: slideUp; - -webkit-animation-name: slideUp; - animation-duration: 1s; - -webkit-animation-duration: 1s; - animation-timing-function: ease; - -webkit-animation-timing-function: ease; - visibility: visible !important; -} -@keyframes slideUp { - 0% { - transform: translateY(100%); - } - 50% { - transform: translateY(-8%); - } - 65% { - transform: translateY(4%); - } - 80% { - transform: translateY(-4%); - } - 95% { - transform: translateY(2%); - } - 100% { - transform: translateY(0%); - } -} -@-webkit-keyframes slideUp { - 0% { - -webkit-transform: translateY(100%); - } - 50% { - -webkit-transform: translateY(-8%); - } - 65% { - -webkit-transform: translateY(4%); - } - 80% { - -webkit-transform: translateY(-4%); - } - 95% { - -webkit-transform: translateY(2%); - } - 100% { - -webkit-transform: translateY(0%); - } -} -.slideLeft { - animation-name: slideLeft; - -webkit-animation-name: slideLeft; - animation-duration: 1s; - -webkit-animation-duration: 1s; - animation-timing-function: ease-in-out; - -webkit-animation-timing-function: ease-in-out; - visibility: visible !important; -} -@keyframes slideLeft { - 0% { - transform: translateX(150%); - } - 50% { - transform: translateX(-8%); - } - 65% { - transform: translateX(4%); - } - 80% { - transform: translateX(-4%); - } - 95% { - transform: translateX(2%); - } - 100% { - transform: translateX(0%); - } -} -@-webkit-keyframes slideLeft { - 0% { - -webkit-transform: translateX(150%); - } - 50% { - -webkit-transform: translateX(-8%); - } - 65% { - -webkit-transform: translateX(4%); - } - 80% { - -webkit-transform: translateX(-4%); - } - 95% { - -webkit-transform: translateX(2%); - } - 100% { - -webkit-transform: translateX(0%); - } -} -.slideRight { - animation-name: slideRight; - -webkit-animation-name: slideRight; - animation-duration: 1s; - -webkit-animation-duration: 1s; - animation-timing-function: ease-in-out; - -webkit-animation-timing-function: ease-in-out; - visibility: visible !important; -} -@keyframes slideRight { - 0% { - transform: translateX(-150%); - } - 50% { - transform: translateX(8%); - } - 65% { - transform: translateX(-4%); - } - 80% { - transform: translateX(4%); - } - 95% { - transform: translateX(-2%); - } - 100% { - transform: translateX(0%); - } -} -@-webkit-keyframes slideRight { - 0% { - -webkit-transform: translateX(-150%); - } - 50% { - -webkit-transform: translateX(8%); - } - 65% { - -webkit-transform: translateX(-4%); - } - 80% { - -webkit-transform: translateX(4%); - } - 95% { - -webkit-transform: translateX(-2%); - } - 100% { - -webkit-transform: translateX(0%); - } -} -.slideExpandUp { - animation-name: slideExpandUp; - -webkit-animation-name: slideExpandUp; - animation-duration: 1.6s; - -webkit-animation-duration: 1.6s; - animation-timing-function: ease-out; - -webkit-animation-timing-function: ease -out; - visibility: visible !important; -} -@keyframes slideExpandUp { - 0% { - transform: translateY(100%) scaleX(0.5); - } - 30% { - transform: translateY(-8%) scaleX(0.5); - } - 40% { - transform: translateY(2%) scaleX(0.5); - } - 50% { - transform: translateY(0%) scaleX(1.1); - } - 60% { - transform: translateY(0%) scaleX(0.9); - } - 70% { - transform: translateY(0%) scaleX(1.05); - } - 80% { - transform: translateY(0%) scaleX(0.95); - } - 90% { - transform: translateY(0%) scaleX(1.02); - } - 100% { - transform: translateY(0%) scaleX(1); - } -} -@-webkit-keyframes slideExpandUp { - 0% { - -webkit-transform: translateY(100%) scaleX(0.5); - } - 30% { - -webkit-transform: translateY(-8%) scaleX(0.5); - } - 40% { - -webkit-transform: translateY(2%) scaleX(0.5); - } - 50% { - -webkit-transform: translateY(0%) scaleX(1.1); - } - 60% { - -webkit-transform: translateY(0%) scaleX(0.9); - } - 70% { - -webkit-transform: translateY(0%) scaleX(1.05); - } - 80% { - -webkit-transform: translateY(0%) scaleX(0.95); - } - 90% { - -webkit-transform: translateY(0%) scaleX(1.02); - } - 100% { - -webkit-transform: translateY(0%) scaleX(1); - } -} -.expandUp { - animation-name: expandUp; - -webkit-animation-name: expandUp; - animation-duration: 0.7s; - -webkit-animation-duration: 0.7s; - animation-timing-function: ease; - -webkit-animation-timing-function: ease; - visibility: visible !important; -} -@keyframes expandUp { - 0% { - transform: translateY(100%) scale(0.6) scaleY(0.5); - } - 60% { - transform: translateY(-7%) scaleY(1.12); - } - 75% { - transform: translateY(3%); - } - 100% { - transform: translateY(0%) scale(1) scaleY(1); - } -} -@-webkit-keyframes expandUp { - 0% { - -webkit-transform: translateY(100%) scale(0.6) scaleY(0.5); - } - 60% { - -webkit-transform: translateY(-7%) scaleY(1.12); - } - 75% { - -webkit-transform: translateY(3%); - } - 100% { - -webkit-transform: translateY(0%) scale(1) scaleY(1); - } -} -.fadeIn { - animation-name: fadeIn; - -webkit-animation-name: fadeIn; - animation-duration: 1.5s; - -webkit-animation-duration: 1.5s; - animation-timing-function: ease-in-out; - -webkit-animation-timing-function: ease-in-out; - visibility: visible !important; -} -@keyframes fadeIn { - 0% { - transform: scale(0); - opacity: 0; - } - 60% { - transform: scale(1.1); - } - 80% { - transform: scale(0.9); - opacity: 1; - } - 100% { - transform: scale(1); - opacity: 1; - } -} -@-webkit-keyframes fadeIn { - 0% { - -webkit-transform: scale(0); - opacity: 0; - } - 60% { - -webkit-transform: scale(1.1); - } - 80% { - -webkit-transform: scale(0.9); - opacity: 1; - } - 100% { - -webkit-transform: scale(1); - opacity: 1; - } -} -.expandOpen { - animation-name: expandOpen; - -webkit-animation-name: expandOpen; - animation-duration: 1.2s; - -webkit-animation-duration: 1.2s; - animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - visibility: visible !important; -} -@keyframes expandOpen { - 0% { - transform: scale(1.8); - } - 50% { - transform: scale(0.95); - } - 80% { - transform: scale(1.05); - } - 90% { - transform: scale(0.98); - } - 100% { - transform: scale(1); - } -} -@-webkit-keyframes expandOpen { - 0% { - -webkit-transform: scale(1.8); - } - 50% { - -webkit-transform: scale(0.95); - } - 80% { - -webkit-transform: scale(1.05); - } - 90% { - -webkit-transform: scale(0.98); - } - 100% { - -webkit-transform: scale(1); - } -} -.bigEntrance { - animation-name: bigEntrance; - -webkit-animation-name: bigEntrance; - animation-duration: 1.6s; - -webkit-animation-duration: 1.6s; - animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - visibility: visible !important; -} -@keyframes bigEntrance { - 0% { - transform: scale(0.3) rotate(6deg) translateX(-30%) translateY(30%); - opacity: 0.2; - } - 30% { - transform: scale(1.03) rotate(-2deg) translateX(2%) translateY(-2%); - opacity: 1; - } - 45% { - transform: scale(0.98) rotate(1deg) translateX(0%) translateY(0%); - opacity: 1; - } - 60% { - transform: scale(1.01) rotate(-1deg) translateX(0%) translateY(0%); - opacity: 1; - } - 75% { - transform: scale(0.99) rotate(1deg) translateX(0%) translateY(0%); - opacity: 1; - } - 90% { - transform: scale(1.01) rotate(0deg) translateX(0%) translateY(0%); - opacity: 1; - } - 100% { - transform: scale(1) rotate(0deg) translateX(0%) translateY(0%); - opacity: 1; - } -} -@-webkit-keyframes bigEntrance { - 0% { - -webkit-transform: scale(0.3) rotate(6deg) translateX(-30%) translateY(30%); - opacity: 0.2; - } - 30% { - -webkit-transform: scale(1.03) rotate(-2deg) translateX(2%) translateY(-2%); - opacity: 1; - } - 45% { - -webkit-transform: scale(0.98) rotate(1deg) translateX(0%) translateY(0%); - opacity: 1; - } - 60% { - -webkit-transform: scale(1.01) rotate(-1deg) translateX(0%) translateY(0%); - opacity: 1; - } - 75% { - -webkit-transform: scale(0.99) rotate(1deg) translateX(0%) translateY(0%); - opacity: 1; - } - 90% { - -webkit-transform: scale(1.01) rotate(0deg) translateX(0%) translateY(0%); - opacity: 1; - } - 100% { - -webkit-transform: scale(1) rotate(0deg) translateX(0%) translateY(0%); - opacity: 1; - } -} -.hatch { - animation-name: hatch; - -webkit-animation-name: hatch; - animation-duration: 2s; - -webkit-animation-duration: 2s; - animation-timing-function: ease-in-out; - -webkit-animation-timing-function: ease-in-out; - transform-origin: 50% 100%; - -ms-transform-origin: 50% 100%; - -webkit-transform-origin: 50% 100%; - visibility: visible !important; -} -@keyframes hatch { - 0% { - transform: rotate(0deg) scaleY(0.6); - } - 20% { - transform: rotate(-2deg) scaleY(1.05); - } - 35% { - transform: rotate(2deg) scaleY(1); - } - 50% { - transform: rotate(-2deg); - } - 65% { - transform: rotate(1deg); - } - 80% { - transform: rotate(-1deg); - } - 100% { - transform: rotate(0deg); - } -} -@-webkit-keyframes hatch { - 0% { - -webkit-transform: rotate(0deg) scaleY(0.6); - } - 20% { - -webkit-transform: rotate(-2deg) scaleY(1.05); - } - 35% { - -webkit-transform: rotate(2deg) scaleY(1); - } - 50% { - -webkit-transform: rotate(-2deg); - } - 65% { - -webkit-transform: rotate(1deg); - } - 80% { - -webkit-transform: rotate(-1deg); - } - 100% { - -webkit-transform: rotate(0deg); - } -} -.bounce { - animation-name: bounce; - -webkit-animation-name: bounce; - animation-duration: 1.6s; - -webkit-animation-duration: 1.6s; - animation-timing-function: ease; - -webkit-animation-timing-function: ease; - transform-origin: 50% 100%; - -ms-transform-origin: 50% 100%; - -webkit-transform-origin: 50% 100%; -} -@keyframes bounce { - 0% { - transform: translateY(0%) scaleY(0.6); - } - 60% { - transform: translateY(-100%) scaleY(1.1); - } - 70% { - transform: translateY(0%) scaleY(0.95) scaleX(1.05); - } - 80% { - transform: translateY(0%) scaleY(1.05) scaleX(1); - } - 90% { - transform: translateY(0%) scaleY(0.95) scaleX(1); - } - 100% { - transform: translateY(0%) scaleY(1) scaleX(1); - } -} -@-webkit-keyframes bounce { - 0% { - -webkit-transform: translateY(0%) scaleY(0.6); - } - 60% { - -webkit-transform: translateY(-100%) scaleY(1.1); - } - 70% { - -webkit-transform: translateY(0%) scaleY(0.95) scaleX(1.05); - } - 80% { - -webkit-transform: translateY(0%) scaleY(1.05) scaleX(1); - } - 90% { - -webkit-transform: translateY(0%) scaleY(0.95) scaleX(1); - } - 100% { - -webkit-transform: translateY(0%) scaleY(1) scaleX(1); - } -} -.pulse { - animation-name: pulse; - -webkit-animation-name: pulse; - animation-duration: 1.5s; - -webkit-animation-duration: 1.5s; - animation-iteration-count: infinite; - -webkit-animation-iteration-count: infinite; -} -@keyframes pulse { - 0% { - transform: scale(0.9); - opacity: 0.7; - } - 50% { - transform: scale(1); - opacity: 1; - } - 100% { - transform: scale(0.9); - opacity: 0.7; - } -} -@-webkit-keyframes pulse { - 0% { - -webkit-transform: scale(0.95); - opacity: 0.7; - } - 50% { - -webkit-transform: scale(1); - opacity: 1; - } - 100% { - -webkit-transform: scale(0.95); - opacity: 0.7; - } -} -.floating { - animation-name: floating; - -webkit-animation-name: floating; - animation-duration: 1.5s; - -webkit-animation-duration: 1.5s; - animation-iteration-count: infinite; - -webkit-animation-iteration-count: infinite; -} -@keyframes floating { - 0% { - transform: translateY(0%); - } - 50% { - transform: translateY(8%); - } - 100% { - transform: translateY(0%); - } -} -@-webkit-keyframes floating { - 0% { - -webkit-transform: translateY(0%); - } - 50% { - -webkit-transform: translateY(8%); - } - 100% { - -webkit-transform: translateY(0%); - } -} -.tossing { - animation-name: tossing; - -webkit-animation-name: tossing; - animation-duration: 2.5s; - -webkit-animation-duration: 2.5s; - animation-iteration-count: infinite; - -webkit-animation-iteration-count: infinite; -} -@keyframes tossing { - 0% { - transform: rotate(-4deg); - } - 50% { - transform: rotate(4deg); - } - 100% { - transform: rotate(-4deg); - } -} -@-webkit-keyframes tossing { - 0% { - -webkit-transform: rotate(-4deg); - } - 50% { - -webkit-transform: rotate(4deg); - } - 100% { - -webkit-transform: rotate(-4deg); - } -} -.pullUp { - animation-name: pullUp; - -webkit-animation-name: pullUp; - animation-duration: 1.1s; - -webkit-animation-duration: 1.1s; - animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - transform-origin: 50% 100%; - -ms-transform-origin: 50% 100%; - -webkit-transform-origin: 50% 100%; -} -@keyframes pullUp { - 0% { - transform: scaleY(0.1); - } - 40% { - transform: scaleY(1.02); - } - 60% { - transform: scaleY(0.98); - } - 80% { - transform: scaleY(1.01); - } - 100% { - transform: scaleY(0.98); - } - 80% { - transform: scaleY(1.01); - } - 100% { - transform: scaleY(1); - } -} -@-webkit-keyframes pullUp { - 0% { - -webkit-transform: scaleY(0.1); - } - 40% { - -webkit-transform: scaleY(1.02); - } - 60% { - -webkit-transform: scaleY(0.98); - } - 80% { - -webkit-transform: scaleY(1.01); - } - 100% { - -webkit-transform: scaleY(0.98); - } - 80% { - -webkit-transform: scaleY(1.01); - } - 100% { - -webkit-transform: scaleY(1); - } -} -.pullDown { - animation-name: pullDown; - -webkit-animation-name: pullDown; - animation-duration: 0.8s; - -webkit-animation-duration: 0.8s; - animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - transform-origin: 50% 0%; - -ms-transform-origin: 50% 0%; - -webkit-transform-origin: 50% 0%; -} -@keyframes pullDown { - 0% { - transform: scaleY(0.1); - } - 40% { - transform: scaleY(1.02); - } - 60% { - transform: scaleY(0.98); - } - 80% { - transform: scaleY(1.01); - } - 100% { - transform: scaleY(0.98); - } - 80% { - transform: scaleY(1.01); - } - 100% { - transform: scaleY(1); - } -} -@-webkit-keyframes pullDown { - 0% { - -webkit-transform: scaleY(0.1); - } - 40% { - -webkit-transform: scaleY(1.02); - } - 60% { - -webkit-transform: scaleY(0.98); - } - 80% { - -webkit-transform: scaleY(1.01); - } - 100% { - -webkit-transform: scaleY(0.98); - } - 80% { - -webkit-transform: scaleY(1.01); - } - 100% { - -webkit-transform: scaleY(1); - } -} -.stretchLeft { - animation-name: stretchLeft; - -webkit-animation-name: stretchLeft; - animation-duration: 1.5s; - -webkit-animation-duration: 1.5s; - animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - transform-origin: 100% 0%; - -ms-transform-origin: 100% 0%; - -webkit-transform-origin: 100% 0%; -} -@keyframes stretchLeft { - 0% { - transform: scaleX(0.3); - } - 40% { - transform: scaleX(1.02); - } - 60% { - transform: scaleX(0.98); - } - 80% { - transform: scaleX(1.01); - } - 100% { - transform: scaleX(0.98); - } - 80% { - transform: scaleX(1.01); - } - 100% { - transform: scaleX(1); - } -} -@-webkit-keyframes stretchLeft { - 0% { - -webkit-transform: scaleX(0.3); - } - 40% { - -webkit-transform: scaleX(1.02); - } - 60% { - -webkit-transform: scaleX(0.98); - } - 80% { - -webkit-transform: scaleX(1.01); - } - 100% { - -webkit-transform: scaleX(0.98); - } - 80% { - -webkit-transform: scaleX(1.01); - } - 100% { - -webkit-transform: scaleX(1); - } -} -.stretchRight { - animation-name: stretchRight; - -webkit-animation-name: stretchRight; - animation-duration: 1.5s; - -webkit-animation-duration: 1.5s; - animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - -webkit-transform-origin: 0% 0%; -} -@keyframes stretchRight { - 0% { - transform: scaleX(0.3); - } - 40% { - transform: scaleX(1.02); - } - 60% { - transform: scaleX(0.98); - } - 80% { - transform: scaleX(1.01); - } - 100% { - transform: scaleX(0.98); - } - 80% { - transform: scaleX(1.01); - } - 100% { - transform: scaleX(1); - } -} -@-webkit-keyframes stretchRight { - 0% { - -webkit-transform: scaleX(0.3); - } - 40% { - -webkit-transform: scaleX(1.02); - } - 60% { - -webkit-transform: scaleX(0.98); - } - 80% { - -webkit-transform: scaleX(1.01); - } - 100% { - -webkit-transform: scaleX(0.98); - } - 80% { - -webkit-transform: scaleX(1.01); - } - 100% { - -webkit-transform: scaleX(1); - } -} diff --git a/MyOffice.SPA/src/assets/scss/common/_customanimate.scss b/MyOffice.SPA/src/assets/scss/common/_customanimate.scss deleted file mode 100644 index bd021ce..0000000 --- a/MyOffice.SPA/src/assets/scss/common/_customanimate.scss +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Document : _customanimate.scss - * Author : RedStar Template - * Description: This scss file for mixure of custom animation classes - */ -@-ms-keyframes spin { - from { - -ms-transform: rotate(0deg); - -moz-transform: rotate(0deg); - -o-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - - to { - -ms-transform: rotate(360deg); - -moz-transform: rotate(360deg); - -o-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@-moz-keyframes spin { - from { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -o-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - - to { - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -o-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@-webkit-keyframes spin { - from { - -webkit-transform: rotate(0deg); - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -o-transform: rotate(0deg); - transform: rotate(0deg); - } - - to { - -webkit-transform: rotate(360deg); - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -o-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@keyframes spin { - from { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -o-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - - to { - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -o-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} diff --git a/MyOffice.SPA/src/assets/scss/common/_demo.scss b/MyOffice.SPA/src/assets/scss/common/_demo.scss deleted file mode 100644 index 74cbef7..0000000 --- a/MyOffice.SPA/src/assets/scss/common/_demo.scss +++ /dev/null @@ -1,372 +0,0 @@ -/* - * Document : _demo.scss - * Author : RedStar Template - * Description: This scss file style classes of following components - - Structure (with shortcodes): - - 1. BUTTONS - 2. CHECKBOX & RADIO - 3. JQUERY KNOB-CHART - 4. SWITCH - 5. COLOR BOX - 6. IMAGES - 7. TAGS INPUT - 8. GOOGLE MATERIAL DESIGN ICON - 9. PRELOADER - 10. ION RANGE SLIDER - 11. RIGHT SIDEBAR - - */ - -/*********************************************************************** - - [1. BUTTONS ] - -***********************************************************************/ -.demo-button-sizes { - .btn { - margin-bottom: 5px; - } -} - -.icon-button-demo { - button { - margin-right: 5px; - margin-bottom: 12px; - } -} - -.icon-and-text-button-demo { - button { - margin-right: 5px; - margin-bottom: 12px; - width: 16.66666666666667%; - } -} - -.button-demo { - ul { - padding-left: 0; - - li { - list-style: none; - padding-left: 0; - display: inline-block; - margin-right: 7px; - - .btn { - display: block; - min-width: 175px; - } - } - } - - .btn { - margin-right: 8px; - margin-bottom: 13px; - min-width: 100px; - } -} - -.demo-button-groups { - .btn-group { - margin-right: 10px; - margin-bottom: 10px; - } -} - -.demo-button-toolbar { - .btn-toolbar { - float: left; - margin-right: 25px; - margin-bottom: 10px; - .btn-group { - margin-left: 5px; - } - } -} - -.demo-button-nesting { - > .btn-group { - margin-right: 15px; - } -} - -.demo-single-button-dropdowns { - > .btn-group { - margin-right: 10px; - } -} - -.demo-splite-button-dropdowns { - > .btn-group { - margin-right: 10px; - } -} - -.demo-dropup { - .dropup { - margin-right: 10px; - } -} - -/*********************************************************************** - - [2. CHECKBOX & RADIO ] - -***********************************************************************/ - -.demo-checkbox, -.demo-radio-button { - label { - min-width: 150px; - } -} -/*********************************************************************** - - [3. JQUERY KNOB-CHART ] - -***********************************************************************/ - -.demo-knob-chart { - div { - margin-right: 15px; - } -} -/*********************************************************************** - - [4. SWITCH ] - -***********************************************************************/ - -.demo-switch { - .switch { - display: inline-block; - min-width: 170px; - } - - .demo-switch-title { - min-width: 95px; - display: inline-block; - } -} -/*********************************************************************** - - [5. COLOR BOX ] - -***********************************************************************/ -.demo-color-box { - padding: 15px 0; - text-align: center; - margin-bottom: 20px; - @include border-radius(3px); - - .color-name { - font-size: 16px; - margin-bottom: 5px; - } - - .color-code, - .color-class-name { - font-size: 13px; - } -} -/*********************************************************************** - - [6. IMAGES ] - -***********************************************************************/ -.demo-image-copyright { - text-align: right; - font-style: italic; - font-size: 12px; - color: #777; - margin: 5px 0 10px 0; - - a { - font-weight: bold; - color: #555 !important; - } -} -/*********************************************************************** - - [7. TAGS INPUT ] - -***********************************************************************/ -.demo-tagsinput-area { - margin-bottom: 0px !important; - &.form-group .form-line:after { - border-bottom: 0px; - } -} -/*********************************************************************** - - [8 .GOOGLE MATERIAL DESIGN ICON ] - -***********************************************************************/ -.demo-icon-container { - .demo-google-material-icon { - margin-bottom: 5px; - text-align: left; - - .icon-name { - position: relative; - top: -8px; - left: 7px; - } - - .material-icons { - width: 24px; - } - } -} -/*********************************************************************** - - [9. PRELOADERS ] - -***********************************************************************/ -.demo-preloader { - .preloader { - margin-right: 10px; - } -} -/*********************************************************************** - - [10. ION RANGE SLIDER ] - -***********************************************************************/ -.irs-demo { - margin-bottom: 40px; - - .irs { - margin-top: 15px; - } -} -/*********************************************************************** - - [11. RIGHT SIDEBAR ] - -***********************************************************************/ -.right-sidebar { - .nav-tabs + .tab-content { - padding: 0; - } - - p { - margin: 20px 15px 15px 15px; - font-weight: bold; - text-align: center; - } - - #settings { - .setting-list { - list-style: none; - padding-left: 0; - margin-bottom: 20px; - - li { - padding: 15px; - position: relative; - border-top: 1px solid #eee; - - .switch { - position: absolute; - top: 15px; - right: 5px; - } - } - } - } - .progress { - -webkit-border-radius: 50px; - -moz-border-radius: 50px; - -ms-border-radius: 50px; - border-radius: 50px; - height: 7px; - margin: 10px 0px 0px 0px; - } -} -.right-sidebar .choose-theme li { - position: relative; - cursor: pointer; - display: inline-block; -} - -.demo-choose-skin, -.demo-choose-logoheader { - list-style: none; - padding-left: 0; - overflow-y: hidden; - - li { - padding: 10px 7px 4px 0px; - position: relative; - cursor: pointer; - float: left; - - &.actived { - &:after { - font-family: "Material Icons"; - position: absolute; - top: 10px; - right: 10px; - content: "\E876"; - font-size: 18px; - color: #ece6e6; - } - } - - div { - width: 24px; - height: 24px; - display: inline-block; - @include border-radius(3px); - } - - span { - position: relative; - bottom: 7px; - left: 5px; - } - } - .white-theme { - background-color: #fff; - } - .black-theme { - background-color: #3a3f51; - } - .purple-theme { - background-color: #813ae1; - } - .blue-theme { - background-color: #03a9f3; - } - .cyan-theme { - background-color: #13d1d3; - } - .green-theme { - background-color: #13b464; - } - .orange-theme { - background-color: #f06533; - } - - @each $key, $val in $colors { - .#{$key} { - background-color: $val; - } - } -} -.white-theme-border { - border: 1px solid #888888; -} - -.btn-sidebar-light, -.btn-theme-light { - background: 0 0 !important; - color: #888888 !important; - border: 1px solid #888888 !important; - margin: 10px; -} -//===================================================================================== diff --git a/MyOffice.SPA/src/assets/scss/common/_general.scss b/MyOffice.SPA/src/assets/scss/common/_general.scss deleted file mode 100644 index 80cfc33..0000000 --- a/MyOffice.SPA/src/assets/scss/common/_general.scss +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Document : _general.scss - * Author : RedStar Template - * Description: This scss file for all common style classes - */ - -body, -html { - @include transition(all 0.5s); - background-color: #f0eff3; - font-family: "Roboto", sans-serif; - font-size: 14px; -} - -button, -input, -select, -a { - outline: none !important; - font-size: 14px !important; - text-decoration: none; - - &:hover { - text-decoration: none; - } -} - -textarea { - font-size: 14px !important; -} - -ol, -ul, -dl { - padding-left: 0px; - list-style-type: none; -} - -.no-animate { - -o-transition-property: none !important; - -moz-transition-property: none !important; - -ms-transition-property: none !important; - -webkit-transition-property: none !important; - transition-property: none !important; - -o-transform: none !important; - -moz-transform: none !important; - -ms-transform: none !important; - -webkit-transform: none !important; - transform: none !important; - -webkit-animation: none !important; - -moz-animation: none !important; - -o-animation: none !important; - -ms-animation: none !important; - animation: none !important; -} - -section { - &.content { - margin: 55px 27px 0 260px; - min-height: calc(100vh - 76px); - @include transition(0.5s); - .content-block { - padding: 25px 0px 0px 25px; - } - } -} - -.horizontal-layout { - section { - &.content { - margin: 170px 15px 0 15px; - float: left; - width: calc(100% - 30px); - } - } -} - -.pull-left { - float: left !important; -} - -.pull-right { - float: right !important; -} - -.msl-1 { - margin-left: 0.25rem !important; -} -.msl-2 { - margin-left: 0.5rem !important; -} -.msl-3 { - margin-left: 1rem !important; -} -.msl-4 { - margin-left: 1.5rem !important; -} -.msl-5 { - margin-left: 3rem !important; -} - -.msr-1 { - margin-right: 0.25rem !important; -} -.msr-2 { - margin-right: 0.5rem !important; -} -.msr-3 { - margin-right: 1rem !important; -} -.msr-4 { - margin-right: 1.5rem !important; -} -.msr-5 { - margin-right: 3rem !important; -} - -.psl-1 { - padding-left: 0.25rem !important; -} -.psl-2 { - padding-left: 0.5rem !important; -} -.psl-3 { - padding-left: 1rem !important; -} -.psl-4 { - padding-left: 1.5rem !important; -} -.psl-5 { - padding-left: 3rem !important; -} - -.psr-1 { - padding-right: 0.25rem !important; -} -.psr-2 { - padding-right: 0.5rem !important; -} -.psr-3 { - padding-right: 1rem !important; -} -.psr-4 { - padding-right: 1.5rem !important; -} -.psr-5 { - padding-right: 3rem !important; -} -.cursor-pointer { - cursor: pointer; -} - -.jqvmap-zoomin, -.jqvmap-zoomout { - width: 15px; - height: 15px; -} - -table { - .checkbox { - [type="checkbox"] + label { - margin: 0; - height: 20px; - padding-left: 20px; - vertical-align: middle; - } - } -} - -.loading-img-spin { - position: absolute; - top: 50%; - left: 50%; - width: 50px; - height: 50px; - margin: -60px 0 20px -20px; - -webkit-animation: spin 1.5s linear infinite; - -moz-animation: spin 1.5s linear infinite; - animation: spin 1.5s linear infinite; -} - -.shadow-style { - -webkit-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); -} - -.review-img { - padding-left: 20px; - padding-top: 5px; - width: 70px; - - img { - border-radius: 50%; - border: 2px solid #ffffff; - box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); - } -} - -.horizontal-layout { - .sidebar, - .nav-left-menu { - display: none; - } -} - -.bootstrap-notify-container { - max-width: 320px; - text-align: center; -} - -.map iframe { - width: 100%; -} - -.jqvmap-label { - position: absolute; - display: none; - -webkit-border-radius: 30px; - -moz-border-radius: 30px; - border-radius: 30px; - background: #eee; - color: black; - font-size: 14px; - font-family: sans-serif, Verdana; - padding: 10px; - pointer-events: none; -} - -.logo-white { - .navbar-toggle, - .bars:before, - .bars:after { - color: #000 !important; - } -} - -.logo-black { - .navbar-toggle, - .bars:before, - .bars:after { - color: #fff !important; - } -} - -.dark { - .sidemenu-collapse i { - color: #fff; - } - - .nav { - > li { - > a { - color: #fff; - } - } - } -} - -.light { - .sidemenu-collapse i { - color: #0d091d; - } - - .nav { - > li { - > a { - color: #0d091d; - } - } - } -} - -.border-apply { - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2) !important; -} - -input::-webkit-input-placeholder { - font-size: 12px; - color: #adabab; -} - -input:-moz-placeholder { - /* Firefox 18- */ - font-size: 12px; - color: #adabab; -} - -input::-moz-placeholder { - /* Firefox 19+ */ - font-size: 12px; - color: #adabab; -} - -input:-ms-input-placeholder { - font-size: 12px; - color: #adabab; -} - -textarea::-webkit-input-placeholder { - font-size: 12px; - color: #adabab; -} - -textarea:-moz-placeholder { - /* Firefox 18- */ - font-size: 12px; - color: #adabab; -} - -textarea::-moz-placeholder { - /* Firefox 19+ */ - font-size: 12px; - color: #adabab; -} - -textarea:-ms-input-placeholder { - font-size: 12px; - color: #adabab; -} - -.profile-image img { - width: 100%; -} - -@media screen and (max-width: 1169px) { - .horizontal-layout { - .sidebar { - display: block; - } - - .top-sidebar { - display: none; - } - - section.content { - margin-top: 100px; - } - } -} - -.font-icon { - display: flex; - flex-direction: row; - align-items: center; - margin-bottom: 20px; - padding: 10px; - transition: all 0.2s; - - .icon-preview { - font-size: 1.8rem; - margin-right: 10px; - line-height: 1; - color: #333439; - } -} - -.deshboard-echart-height { - height: 250px; -} -.pill-style { - font-size: 17px; - color: #a9a6a6; - padding-right: 5px; -} -.pill-timing { - width: 30%; -} - -@media screen and (min-width: 1400px) { - .boxed-layout .container { - width: 1370px; - max-width: 100%; - } -} diff --git a/MyOffice.SPA/src/assets/scss/common/_helpers.scss b/MyOffice.SPA/src/assets/scss/common/_helpers.scss deleted file mode 100644 index 12b1938..0000000 --- a/MyOffice.SPA/src/assets/scss/common/_helpers.scss +++ /dev/null @@ -1,164 +0,0 @@ -@use "sass:math"; -@for $i from -25 through 25 { - .m-l-#{$i * 5} { - margin-left: #{$i * 5}px; - } - - .m-t-#{$i * 5} { - margin-top: #{$i * 5}px; - } - - .m-r-#{$i * 5} { - margin-right: #{$i * 5}px; - } - - .m-b-#{$i * 5} { - margin-bottom: #{$i * 5}px; - } -} - -.margin-0 { - margin: 0; -} - -@for $i from 0 through 25 { - .p-l-#{$i * 5} { - padding-left: #{$i * 5}px; - } - - .p-t-#{$i * 5} { - padding-top: #{$i * 5}px; - } - - .p-r-#{$i * 5} { - padding-right: #{$i * 5}px; - } - - .p-b-#{$i * 5} { - padding-bottom: #{$i * 5}px; - } -} -@for $i from 0 through 25 { - .margin-#{$i * 5} { - margin: #{$i * 5}px; - } - .padding-#{$i * 5} { - padding: #{$i * 5}px; - } -} - -.padding-0 { - padding: 0; -} - -@for $i from 5 through 49 { - .font-#{$i + 1} { - font-size: #{$i + 1}px; - } -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -.align-justify { - text-align: justify; -} - -.no-resize { - resize: none; -} - -.font-bold { - font-weight: bold; -} - -.font-italic { - font-style: italic; -} - -.font-underline { - text-decoration: underline; -} - -.font-line-through { - text-decoration: line-through; -} - -.font-overline { - text-decoration: overline; -} - -.block-header { - //margin-bottom: 15px; - - h2 { - margin: 0 !important; - color: #666 !important; - font-weight: normal; - font-size: 22px; - line-height: 46px; - - small { - display: block; - font-size: 12px; - margin-top: 8px; - color: #888; - - a { - font-weight: bold; - color: #777; - } - } - } -} - -@each $key, $val in $colors { - .bg-#{$key} { - background-color: $val !important; - color: #fff; - - .content { - .text, - .number { - color: #fff !important; - } - } - } -} - -@each $key, $val in $linear-colors { - .l-bg-#{$key} { - background: $val !important; - color: #fff; - - .content { - .text, - .number { - color: #fff !important; - } - } - } -} - -@each $key, $val in $colors { - .col-#{$key} { - color: $val !important; - } -} -@for $i from 0 through 100 { - .width-per-#{$i} { - width: round(percentage(math.div($i, 100))); - } - .tbl-col-width-per-#{$i} { - max-width: round(percentage(math.div($i, 100))); - } -} diff --git a/MyOffice.SPA/src/assets/scss/common/_media.scss b/MyOffice.SPA/src/assets/scss/common/_media.scss deleted file mode 100644 index 24868d0..0000000 --- a/MyOffice.SPA/src/assets/scss/common/_media.scss +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Document : _media.scss - * Author : RedStar Template - * Description: This scss file for media queries classes - */ -@media (max-width: 1169px) { - // .sidemenu-collapse { - // display: none !important; - // } - .ls-closed .sidebar { - margin-left: -300px; - } - section.content { - margin: 83px 15px 0 0px; - } - .search-box { - margin-left: 25px; - } - .side-closed.submenu-closed .navbar-header { - width: 260px !important; - .navbar-brand span { - display: inline-block !important; - } - } - nav.navbar { - width: calc(100% - 4rem) !important; - } - .navbar .collapse-menu-icon { - display: block !important; - } - .sidebar .sidemenu-collapse { - display: none !important; - } -} -@media (max-width: 800px) { - .responsive_table { - overflow-x: auto !important; - } - - .mat-table { - min-width: 800px; - } -} - -@media (max-width: 799px) { - .navbar { - .search-box { - margin-left: 20px; - } - // .nav > li > a { - // padding: 10px 10px; - // } - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - &.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - } - .navbar-toggle { - display: none; - } - .navbar-nav { - float: left; - margin: 0; - > li { - float: left; - > a { - padding-top: 15px; - padding-bottom: 15px; - } - } - } - - .container > { - .navbar-header { - margin-right: 0; - margin-left: 0; - } - .navbar-collapse { - margin-right: 0; - margin-left: 0; - } - } - .container-fluid > { - .navbar-header { - margin-right: 0; - margin-left: 0; - } - .navbar-collapse { - margin-right: 0; - margin-left: 0; - } - } - .navbar > { - .container .navbar-brand { - margin-left: -15px; - } - .container-fluid .navbar-brand { - margin-left: -15px; - } - } -} -.container > { - .navbar-header { - margin-right: -15px; - margin-left: -15px; - } - .navbar-collapse { - margin-right: -15px; - margin-left: -15px; - } -} -.container-fluid > { - .navbar-header { - margin-right: -15px; - margin-left: -15px; - border-right: 1px solid #f2f4f9; - } - .navbar-collapse { - margin-right: -15px; - margin-left: -15px; - } -} -@media (max-width: 767px) { - .navbar { - height: auto; - > .container, - > .container-fluid { - .navbar-brand { - margin-left: 30px; - width: 88%; - margin-right: 0; - } - } - - .navbar-toggle { - float: right; - } - - .nav-left-menu { - display: none; - } - - .navbar-right { - .fullscreen { - display: none; - } - } - - .navbar-header { - display: inline-block; - // margin-bottom: -25px; - width: calc(100% + 30px); - float: left; - } - - .nav { - > li { - display: inline-block; - > a { - // padding: 13px 15px 8px 15px; - &.js-right-sidebar { - padding: 9px 8px 8px 15px; - } - } - } - } - - .navbar-nav { - // margin-top: -10px; - margin-bottom: 1px; - margin-left: -7px; - - .open { - .dropdown-menu { - background-color: #fff; - position: absolute; - } - } - } - - .dropdown-menu { - margin-left: -50px; - } - - .navbar-collapse { - display: block; - } - } - .side-closed.submenu-closed .navbar-header { - width: calc(100% + 30px) !important; - } - .side-closed.submenu-closed .navbar-header .navbar-brand span { - display: inline-block !important; - } - .dt-buttons { - float: none !important; - text-align: center; - margin-bottom: 15px; - } - - .panel-switch-btn { - top: 12px; - right: 0 !important; - } - .rtl { - .navbar { - .navbar-toggle { - float: left; - margin-left: 15px; - margin-right: 0; - } - .navbar-header { - margin-bottom: 0px; - } - } - } - section.content, - body.ls-closed section.content { - margin-right: 0px; - margin-left: 0px; - } -} -@media (max-width: 600px) { - .navbar { - > .container, - > .container-fluid { - .navbar-brand { - /*width: 86%;*/ - } - } - .navbar-header { - margin-bottom: 0; - } - .navbar-toggle:before { - margin-top: 2px; - float: left; - } - // .nav-notification-icons { - // margin-top: 7px; - // } - } - .ls-closed .bars:after, - .ls-closed .bars:before { - margin-top: 2px; - } -} -@media (max-width: 500px) { - .navbar-nav { - &.nav { - .dropdown-menu { - width: 245px; - right: -80px; - &::before { - right: 95px; - } - &::after { - right: 96px; - } - } - .user_profile { - .dropdown-menu { - &::before { - right: 19px; - } - &::after { - right: 20px; - } - } - } - } - } - .navbar { - > .container, - > .container-fluid { - .navbar-brand { - margin-left: 28px; - width: 84%; - } - } - } - .breadcrumb-chart { - margin: 0 0 0 20px; - } - .search-box { - display: none; - } - full-calendar > div.fc-toolbar { - display: block !important; - } -} -@media (max-width: 420px) { - .navbar { - > .container, - > .container-fluid { - .navbar-brand { - width: 79%; - } - } - } - .btnAppList { - display: none; - } -} -@media (max-width: 350px) { - .navbar { - .nav { - > li { - > a { - padding: 13px 10px 8px 10px; - &.js-right-sidebar { - padding: 9px 10px 8px 10px; - } - } - } - .user_profile { - .dropdown-toggle { - padding: 7px 0px 9px 10px; - } - } - } - > .container-fluid { - .navbar-brand { - margin-left: 25px; - } - } - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .navbar { - > .container, - > .container-fluid { - .navbar-brand { - margin-left: 20px; - } - } - } -} - -@media (min-width: 992px) and (max-width: 1169px) { - .navbar { - > .container, - > .container-fluid { - .navbar-brand { - margin-left: 20px; - } - } - } -} - -@media (min-width: 1170px) and (max-width: 1999px) { -} - -@media (min-width: 1200px) { -} diff --git a/MyOffice.SPA/src/assets/scss/common/_mixins.scss b/MyOffice.SPA/src/assets/scss/common/_mixins.scss deleted file mode 100644 index ba9a5d6..0000000 --- a/MyOffice.SPA/src/assets/scss/common/_mixins.scss +++ /dev/null @@ -1,70 +0,0 @@ -@mixin border-radius($radius) { - -webkit-border-radius: $radius; - -moz-border-radius: $radius; - -ms-border-radius: $radius; - border-radius: $radius; -} - -@mixin box-shadow($shadowinfo) { - -webkit-box-shadow: $shadowinfo; - -moz-box-shadow: $shadowinfo; - -ms-box-shadow: $shadowinfo; - box-shadow: $shadowinfo; -} -@mixin transform($transform) { - -moz-transform: $transform; - -ms-transform: $transform; - -o-transform: $transform; - -webkit-transform: $transform; - transform: $transform; -} - -@mixin transition($transition) { - -moz-transition: $transition; - -o-transition: $transition; - -webkit-transition: $transition; - transition: $transition; -} - -@mixin three-dots-overflow() { - white-space: nowrap; - -ms-text-overflow: ellipsis; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - overflow: hidden; -} - -@mixin navbar-link-color($textcolor, $navbarcolor, $opacity) { - .navbar-brand, - .navbar-brand:hover, - .navbar-brand:active, - .navbar-brand:focus { - color: $textcolor; - } - - .nav > li > a:hover, - .nav > li > a:focus, - .nav .open > a, - .nav .open > a:hover, - .nav .open > a:focus { - background-color: transparentize($navbarcolor, $opacity); - } - - .nav > li > a { - color: $textcolor; - } - - .bars { - float: left; - padding: 10px 20px; - font-size: 22px; - color: $textcolor; - margin-right: 10px; - margin-left: -10px; - margin-top: 4px; - } - - .bars:hover { - background-color: rgba(0, 0, 0, 0.08); - } -} diff --git a/MyOffice.SPA/src/assets/scss/common/_rtl.scss b/MyOffice.SPA/src/assets/scss/common/_rtl.scss deleted file mode 100644 index a213c35..0000000 --- a/MyOffice.SPA/src/assets/scss/common/_rtl.scss +++ /dev/null @@ -1,816 +0,0 @@ -.rtl { - direction: rtl; - text-align: right; - .navbar { - right: unset; - left: 0; - .navbar-toggle { - float: left; - margin-left: 15px; - margin-right: 0; - } - - .navbar-header { - margin-bottom: 0px; - } - .navbar-left { - padding-right: 0px; - } - } - - .navbar-nav { - &.navbar-right { - float: left !important; - margin-left: 0px; - margin-right: unset; - display: flex !important; - flex-direction: unset; - - .user_profile { - margin: 0px 0px 0px 6px; - .user_img { - border-radius: 50%; - } - } - - // .lang-dropdown { - // margin: 14px 10px 0px 20px; - // } - } - .dropdown-menu { - left: 0; - right: auto !important; - } - .nfc-dropdown { - left: 0; - right: auto !important; - } - .nfc-dropdown::before { - left: 19px; - right: unset; - } - .nfc-dropdown::after { - left: 20px; - right: unset; - } - > li .js-right-sidebar { - margin-left: 0px; - margin-right: 0; - } - .user_profile .user_dw_menu li i { - float: right; - padding-left: 5px; - } - .app-dropdown { - left: unset !important; - right: 0 !important; - - &::before { - right: 19px !important; - left: unset !important; - } - &::after { - right: 20px !important; - left: unset !important; - } - } - } - section { - &.content { - margin: 55px 260px 0px 27px; - min-height: calc(100vh - 76px); - transition: 0.5s; - .content-block { - padding: 25px 25px 0px 0px; - } - } - } - .breadcrumb-main { - .page-title { - border-right: none; - padding-right: 0px; - &:after { - display: none; - } - &:before { - content: "\f104"; - font-family: "Font Awesome 5 Free"; - font-size: 18px; - font-weight: 900; - padding: 0px 5px; - } - } - .breadcrumb-list { - float: left; - } - li a .fa-home { - float: right; - padding-right: 10px; - padding-left: unset; - } - .breadcrumb-item + .breadcrumb-item { - padding-right: 5px; - padding-left: unset; - &:after { - content: "\f104"; - font-family: "Font Awesome 5 Free"; - font-size: 14px; - font-weight: 900; - padding-left: 0.5rem; - } - &:before { - display: none; - } - } - } - .sidebar { - right: 0; - .menu { - clear: right; - .list { - .menu-toggle { - &:after { - left: 17px; - right: unset; - } - &:before { - content: "\f053"; - left: 17px; - right: unset; - } - } - a { - padding: 9px 9px 9px 9px; - span { - margin: 7px 12px 7px 0; - } - .mat-button-wrapper { - margin: 7px 0 7px 12px; - } - .material-icons-two-tone { - float: right; - } - .sidebarIcon { - float: right; - margin-right: 5px; - } - } - .ml-menu { - li a { - padding-right: 55px; - padding-top: 7px; - padding-bottom: 7px; - margin-right: 0; - } - .ml-menu-2 { - padding-right: 55px; - li a { - padding-right: 20px; - padding-top: 4px; - padding-bottom: 4px; - } - } - .ml-menu-3 { - padding-right: 20px; - li a { - padding-right: 20px; - padding-top: 4px; - padding-bottom: 4px; - } - } - } - .ml-sub-menu:after, - .ml-sub-menu:before { - left: 17px; - right: unset; - } - .header { - margin: 15px 35px 5px 0 !important; - } - .ml-sub-menu2:after, - .ml-sub-menu2:before { - left: 17px; - right: unset; - } - } - } - .sidebar-badge { - left: 35px; - right: unset; - } - .nav { - padding-right: 0px; - .logo { - margin-left: auto; - margin-right: unset; - } - } - } - .sidemenu-reorder { - float: right; - } - .form-check { - .form-check-label { - padding-right: 30px; - } - .form-check-sign { - left: unset; - right: 0px; - padding-right: 0px; - } - } - .mat-radio-button ~ .mat-radio-button { - margin-right: 16px; - } - @media (min-width: 768px) { - .navbar-header { - float: right; - } - } - - .msl-1 { - margin-right: 0.25rem !important; - margin-left: unset !important; - } - .msl-2 { - margin-right: 0.5rem !important; - margin-left: unset !important; - } - .msl-3 { - margin-right: 1rem !important; - margin-left: unset !important; - } - .msl-4 { - margin-right: 1.5rem !important; - margin-left: unset !important; - } - .msl-5 { - margin-right: 3rem !important; - margin-left: unset !important; - } - - .msr-1 { - margin-left: 0.25rem !important; - margin-right: unset !important; - } - .msr-2 { - margin-left: 0.5rem !important; - margin-right: unset !important; - } - .msr-3 { - margin-left: 1rem !important; - margin-right: unset !important; - } - .msr-4 { - margin-left: 1.5rem !important; - margin-right: unset !important; - } - .msr-5 { - margin-left: 3rem !important; - margin-right: unset !important; - } - - .psl-1 { - padding-right: 0.25rem !important; - padding-left: unset !important; - } - .psl-2 { - padding-right: 0.5rem !important; - padding-left: unset !important; - } - .psl-3 { - padding-right: 1rem !important; - padding-left: unset !important; - } - .psl-4 { - padding-right: 1.5rem !important; - padding-left: unset !important; - } - .psl-5 { - padding-right: 3rem !important; - padding-left: unset !important; - } - - .psr-1 { - padding-left: 0.25rem !important; - padding-right: unset !important; - } - .psr-2 { - padding-left: 0.5rem !important; - padding-right: unset !important; - } - .psr-3 { - padding-left: 1rem !important; - padding-right: unset !important; - } - .psr-4 { - padding-left: 1.5rem !important; - padding-right: unset !important; - } - .psr-5 { - padding-left: 3rem !important; - padding-right: unset !important; - } - - &.side-closed { - &.side-closed-hover { - section.content { - margin-right: 260px; - margin-left: 27px; - } - .sidebar .menu .list { - .ml-menu { - li a { - padding-right: 55px; - :before { - padding-right: 40px; - } - } - .ml-menu-2 { - padding-right: 55px; - li a { - padding-right: 20px; - } - } - } - li { - i { - float: right; - line-height: 2rem; - } - span { - display: block; - float: right; - } - .sidebarIcon { - float: right; - } - } - li .menu-toggle:before { - content: "\f053"; - } - } - } - section.content { - margin-right: 60px; - margin-left: 27px; - } - .navbar-brand { - margin-right: 5px; - } - a .sidebarIcon { - margin-right: 0px !important; - } - } - .card .header .header-dropdown { - left: 0px; - right: unset; - } - .dropdown-menu ul.menu { - .msg-user { - float: right; - } - .menu-info { - right: 10px; - float: right; - text-align: right; - .menu-desc .material-icons { - float: right; - margin-left: 3px; - } - } - li a { - float: right; - } - } - .right-sidebar { - &.open { - left: 0; - right: unset; - } - .rightSidebarClose { - right: 5px; - left: unset; - } - } - .collapse-menu-icon { - float: right !important; - } - .list-unstyled { - padding-right: 0; - } - .review-img { - padding-left: 0 !important; - padding-right: 20px; - } - .progress-percent { - float: left !important; - } - .todo-actionlist { - left: 0; - } - .ngxTableHeader { - .header-buttons-left { - right: -15px; - li { - margin-right: 10px; - } - .search-icon { - left: 0; - } - } - .header-buttons { - left: 35px; - right: unset; - } - } - #mail-nav { - #mail-folders { - padding-right: 0; - .badge { - float: left; - } - } - #mail-labels { - padding-right: 0; - } - #online-offline { - padding-right: 0; - } - } - .chat { - .chat-header { - img { - float: right; - } - .chat-about { - float: right; - padding-right: 10px; - } - } - .chat-history .my-message:after { - right: 7%; - } - } - .owl-carousel { - direction: ltr; - .owl-item { - direction: rtl; - } - } - .bx-wrapper { - direction: ltr; - } - .lg-outer { - direction: ltr; - } - .rightSetting p { - text-align: right; - } - .sidebar .menu .list { - padding-right: 0; - .active .ml-menu { - // padding-right: 30px; - margin-right: 0; - padding-left: 0px; - } - .ml-menu { - padding-right: 0; - li.active .ml-menu:before { - right: 30px; - left: unset; - content: "\f104"; - font-family: "Font Awesome 5 Free"; - } - .ml-menu-2 li.active a:not(.menu-toggle):before { - right: 0px; - left: unset; - } - } - .ml-menu-3 li.active .ml-menu3:before { - content: "\f104"; - } - } - .notice-board .notice-body { - padding: 0 10px 5px 0; - } - .ngx-datatable.material .datatable-footer .datatable-pager { - text-align: left; - } - .people-list img { - float: right; - } - .cd-timeline-img img { - right: 10%; - } - .navbar-header .bars:before { - right: 10px; - left: unset; - } - .navbar-brand { - margin-right: 60px; - span { - padding-left: unset; - padding-right: 10px; - } - } - .dropdown-menu ul.menu { - padding-right: 0; - } - .navbar-nav .user_profile .user_dw_menu { - padding-right: 0; - text-align: right; - } - .progress-list .status { - left: 0; - right: unset; - } - .to-do-list { - padding-right: 0px; - } - .materialTableHeader { - .tbl-export-btn { - left: 20px; - right: unset; - float: left; - } - .header-buttons-left { - padding-right: 0px; - .tbl-title { - margin-right: 20px; - margin-left: 0px; - } - - .tbl-search-box { - margin-right: 10px; - } - .search-icon { - padding-right: 10px; - padding-left: unset; - } - - input.search-field { - padding: 8px 50px 8px 8px; - } - } - } - #mail-nav #mail-labels li { - float: right; - } - #mail-nav #online-offline .material-icons { - padding: 0px 5px 2px 5px; - } - .chat-upload { - float: left; - } - .modal-header .close { - margin-left: 0px; - } - .modal-close-button { - left: 10px; - right: unset; - } - .owl-dt-container { - direction: rtl; - } - - .owl-dt-control-arrow-button svg { - transform: rotate(180deg); - } - .card-statistic-4 { - .card-spacing { - padding-right: 15px; - padding-top: 1rem; - } - } - .card-statistic-3 .card-icon { - left: -5px; - right: unset; - margin-left: 0px; - } - .card-statistic-2 .card-right { - float: left; - margin: 15px 0px 15px 15px; - } - .post-user { - .avtar-img { - float: right; - margin-left: 15px; - margin-right: unset; - } - } - .info-box6 { - .count-numbers { - left: 35px; - right: unset; - } - .count-name { - left: 35px; - right: unset; - } - } - - .feedBody { - border-right: 1px solid #d6d6d6; - border-left: unset; - margin-right: 30px; - margin-left: unset; - padding-right: 0px; - padding-left: unset; - li { - padding-left: unset; - padding-right: 30px; - .feed-user-img { - right: -20px; - left: unset; - } - } - } - .sl-item { - border-right: 1px solid #13b1e0; - border-left: unset; - padding-right: 15px; - padding-left: unset; - &::before { - right: -6.5px; - left: unset; - } - } - .task-module .header-button { - margin-right: auto; - margin-left: unset; - } - .task-list { - .task-low { - margin-right: auto; - margin-left: unset; - } - - .task-high { - margin-right: auto; - margin-left: unset; - } - - .task-normal { - margin-right: auto; - margin-left: unset; - } - } - .task-container .header .header-close { - left: 15px; - right: unset; - } - .form-check .form-check-sign .check:before { - margin-right: 10px; - margin-left: unset; - } - .top-sell { - .product-title { - margin-right: 20px; - } - .product-price { - margin-right: 20px; - } - .sell-price { - float: left; - } - } - .doc-file-type .media-cta { - margin-left: 15px; - } - .lang-dropdown { - margin-left: 0px; - .country-name { - margin-right: 5px; - } - } - .lang-item .lang-item-list { - text-align: right; - line-height: 15px; - display: block; - .flag-img { - float: right; - margin: 5px 0px 0px 5px; - } - } - &.ls-closed .sidebar { - margin-right: -300px; - margin-left: unset; - } - &.ls-closed section.content { - margin-right: 15px; - margin-left: 15px; - } - &.overlay-open.ls-closed .sidebar { - margin-right: 0; - margin-left: unset; - } - - .btn-space { - margin-left: 10px !important; - } - .ms-auto { - margin-right: auto !important; - margin-left: unset !important; - } - .float-end { - float: left !important; - } - .float-start { - float: right !important; - } - .text-end { - text-align: left !important; - } - .text-start { - text-align: right !important; - } - .settingSidebar { - left: -280px; - right: unset; - &.showSettingPanel { - left: 0; - right: unset; - } - - .settingPanelToggle { - background: #6777ef; - padding: 10px 15px; - color: #fff; - position: absolute; - top: 30%; - left: 280px; - width: 40px; - border-radius: 0px 10px 10px 0px; - } - } - .hiddenradio { - padding: 0px 0px 0px 20px; - margin: 10px 10px 0px 20px; - } - - .card-bnner { - img { - transform: scaleX(-1); - } - } - .user_img { - margin: 0px 0px 0px 5px; - } - &.side-closed .sidebar .menu .list li a { - padding-right: 9px; - } - - .nfc-menu { - right: auto; - left: unset; - .nfc-dropdown .menu { - .msg-user { - float: right; - } - .menu-info { - margin-right: 20px; - float: right; - text-align: right; - .menu-desc .material-icons { - float: right; - margin-left: 3px; - } - } - li a { - float: right; - } - } - } - - .mat-menu-item .user-menu-icons { - float: right; - } - .profile-menu .menu .user_dw_menu .mdc-list-item { - display: block; - .user-menu-icons { - float: right; - } - } - .order-list li + li { - margin-left: unset; - margin-right: -14px; - } - .info-card { - text-align: left; - } - .mdc-linear-progress__bar-inner { - left: 0px; - } - .ng-scrollbar-wrapper { - direction: rtl; - } -} - -@media (max-width: 1169px) { - .rtl { - .sidemenu-collapse { - display: none !important; - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/common/_variables.scss b/MyOffice.SPA/src/assets/scss/common/_variables.scss deleted file mode 100644 index 3a7718c..0000000 --- a/MyOffice.SPA/src/assets/scss/common/_variables.scss +++ /dev/null @@ -1,34 +0,0 @@ -$colors: ( - "red": #f44336, - "pink": #e91e63, - "purple": #6f42c1, - "indigo": #3f51b5, - "blue": #2196f3, - "cyan": #00bcd4, - "teal": #009688, - "green": #4caf50, - "yellow": #ffe821, - "orange": #fd7e14, - "deep-orange": #ff5722, - "brown": #795548, - "grey": #9e9e9e, - "black": #000000, - "white": #ffffff, -) !default; - -$linear-colors: ( - "green": linear-gradient(45deg, #9ce89d, #cdfa7e), - "orange": linear-gradient(135deg, #ffc480, #ff763b), - "cyan": linear-gradient(45deg, #72c2ff, #86f0ff), - "red": linear-gradient(316deg, #fc5286, #fbaaa2), - "purple": linear-gradient(230deg, #759bff, #843cf6), - "purple-dark": linear-gradient(45deg, #a52dd8, #e29bf1), - "card1": linear-gradient(to left, #3a7bd5, #3a6073), - "card2": linear-gradient(to right, #c33764, #1d2671), - "card3": linear-gradient(to left, #134e5e, #71b280), - "card4": linear-gradient(to left, #d38312, #a83279), -); - -//Fonts Family -$navbar-font-family: "Roboto", sans-serif; -$sidebar-font-family: "Roboto", sans-serif; diff --git a/MyOffice.SPA/src/assets/scss/components/_breadcrumbs.scss b/MyOffice.SPA/src/assets/scss/components/_breadcrumbs.scss deleted file mode 100644 index 4721d45..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_breadcrumbs.scss +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Document : _breadscrumbs.scss - * Author : RedStar Template - * Description: This scss file for breadscrumbs style classes - */ - -.breadcrumb-main { - // background-color: transparent; - // font-size: 15px; - // align-items: center; - // margin: 3rem 0 3rem; - // padding: 0px; - // color: #555; - - // &:before { - // content: ""; - // margin: 0; - // } - - .breadcrumb-title { - background-color: transparent; - font-size: 15px; - align-items: center; - margin: 30px 0px; - padding: 0px; - color: #555; - } - .breadcrumb-list { - background-color: transparent; - font-size: 15px; - align-items: center; - margin: 32px 0px; - float: right; - color: #555; - padding: 0px 5px; - } - - li { - display: inline-block; - a { - color: #444; - text-decoration: none; - - .fa-home { - font-size: 17px; - position: relative; - top: 0; - float: left; - padding-left: 10px; - color: #5798f7; - } - } - - .material-icons { - font-size: 18px; - position: relative; - top: 4px; - float: none; - } - &.active { - color: #444444; - } - } - - > li + li:before { - // content: "/" !important; - // color: #444444; - // padding-left: 5px; - } - .page-title { - // border-right: 1px solid #c5c5c5; - // padding-right: 10px; - font-size: 20px; - font-weight: 500; - color: #444444; - margin-bottom: 0px; - // &:after { - // content: "\f105"; - // font-family: "Font Awesome 5 Free"; - // font-size: 18px; - // font-weight: 900; - // padding: 0px 5px; - // } - i { - padding: 0px 5px; - &:before { - color: #717883; - font-size: 20px; - } - } - } - .breadcrumb-item + .breadcrumb-item { - padding-left: 5px; - &:before { - content: "\f105"; - font-family: "Font Awesome 5 Free"; - font-size: 14px; - display: block; - font-weight: 900; - padding-right: 0.5rem; - } - } -} - -@each $key, $val in $colors { - .breadcrumb-col-#{$key} { - li { - a { - color: $val !important; - font-weight: bold; - } - } - } - - .breadcrumb-bg-#{$key} { - background-color: $val !important; - - li { - a { - color: #fff; - font-weight: bold; - - .material-icons { - padding-bottom: 8px; - } - } - - color: #fff !important; - } - - li + li:before { - color: #fff; - } - } -} -.breadcrumb-style { - border-radius: 30px; - /*background: #ffffff; - padding-left: 20px !important;*/ -} -.breadcrumb-chart { - display: inline-block; - .chart-info p { - font-size: 13px; - } -} -.breadcrumb-icon { - vertical-align: top; - height: 18px !important; - width: 18px !important; - margin: 0px 3px; - .feather { - width: 18px; - height: 18px; - color: #2c323f; - position: relative; - float: left; - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_checkboxradio.scss b/MyOffice.SPA/src/assets/scss/components/_checkboxradio.scss deleted file mode 100644 index 55fbea2..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_checkboxradio.scss +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Document : _checkboxradio.scss - * Author : RedStar Template - * Description: This scss file for checkbox and radio button style classes - */ -[type="checkbox"] { - +label { - padding-left: 26px; - height: 25px; - line-height: 21px; - font-size: 13px; - font-weight: normal; - vertical-align: middle; - } - - &:checked { - +label { - &:before { - top: -4px; - left: -2px; - width: 11px; - height: 19px; - } - } - } - - @each $key, - $val in $colors { - &:checked.chk-col-#{$key} { - +label { - &:before { - border-right: 2px solid $val; - border-bottom: 2px solid $val; - } - } - } - } -} - -@each $key, -$val in $colors { - :checked.chk-col-#{$key} { - +span { - &:after { - color: $val; - } - } - } -} - -[type="checkbox"].filled-in { - &:checked { - +label { - &:after { - top: 0; - width: 20px; - height: 20px; - border: 2px solid #26a69a; - background-color: #26a69a; - z-index: 0; - } - - &:before { - border-right: 2px solid #fff !important; - border-bottom: 2px solid #fff !important; - } - } - } - - @each $key, - $val in $colors { - &:checked.chk-col-#{$key} { - +label { - &:after { - border: 2px solid $val; - background-color: $val; - } - } - } - } -} - -[type="radio"] { - &:not(:checked) { - +label { - padding-left: 26px; - height: 25px; - line-height: 25px; - font-size: 13px; - font-weight: normal; - } - } - - &:checked { - +label { - padding-left: 26px; - height: 25px; - line-height: 25px; - font-size: 13px; - font-weight: normal; - } - } - - +label { - vertical-align: middle; - } -} - -@each $key, -$val in $colors { - [type="radio"].radio-col-#{$key} { - &:checked { - +label { - &:after { - background-color: $val; - border-color: $val; - } - } - } - } -} - -@each $key, -$val in $colors { - [type="radio"].with-gap.radio-col-#{$key} { - &:checked { - +label { - &:before { - border: 2px solid $val; - } - - &:after { - background-color: $val; - border: 2px solid $val; - } - } - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_dropdownmenu.scss b/MyOffice.SPA/src/assets/scss/components/_dropdownmenu.scss deleted file mode 100644 index 4f21eff..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_dropdownmenu.scss +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Document : _dropdownmenu.scss - * Author : RedStar Template - * Description: This scss file for dropdown menu style classes - */ -.dropdown-menu { - @include border-radius(0); - margin-top: -35px !important; - margin-left: -15px; - -webkit-box-shadow: 0 5px 15px 2px rgba(64, 70, 74, 0.2) !important; - box-shadow: 0 5px 15px 2px rgba(64, 70, 74, 0.2) !important; - border-radius: 0px; - border: none; - padding: 0px; - - .divider { - margin: 5px 0; - } - - .header { - font-size: 13px; - font-weight: bold; - width: 100%; - border-bottom: 1px solid #eee; - text-align: center; - padding: 4px 0 6px 0; - } - - .footer { - a { - text-align: center; - border-top: 1px solid #eee; - padding: 10px 0 5px 0; - font-size: 13px; - margin-bottom: -5px; - color: #ff5e00; - font-weight: 500; - - &:hover { - background-color: transparent; - } - } - } - - > li { - > a { - padding: 7px 18px; - color: #666; - @include transition(all 0.5s); - font-size: 14px; - line-height: 25px; - display: block; - - &:hover { - background-color: rgba(0, 0, 0, 0.075); - } - - i.material-icons { - float: left; - margin-right: 7px; - margin-top: 2px; - font-size: 20px; - } - } - } -} - -.app-dropdown { - width: 350px; - max-width: 350px !important; - .nfc-header { - padding: 20px; - background-color: #7366ff; - border-radius: 5px 5px 0px 0px; - h5 { - color: #fff; - } - } - .app-icons { - display: block; - border-radius: 3px; - line-height: 34px; - text-align: center; - padding: 15px 0 9px; - border: 1px solid transparent; - color: black; - font-weight: 500; - &:hover { - background-color: #eef4fd; - } - } - .mat-mdc-menu-content { - padding: 0px; - } -} - -.dropdown-content li > a, -.dropdown-content li > span { - font-size: 13px; - color: #636262; -} - -.dropdown-animated { - -webkit-animation-duration: 0.3s !important; - -moz-animation-duration: 0.3s !important; - -o-animation-duration: 0.3s !important; - animation-duration: 0.3s !important; -} - -.dropdown-menu.pull-right.show { - position: absolute !important; - left: auto !important; - right: 0 !important; - top: 50px !important; - transform: none !important; -} -.nfc-menu { - transform-origin: left top; - width: 325px; - max-width: 100vw !important; - right: 10px; - left: auto; - position: absolute !important; - top: 0; - padding: 0; - border-radius: 5px; - .nfc-dropdown { - .menu { - padding-left: 0; - button { - padding: 11px 11px; - text-decoration: none; - @include transition(0.5s); - float: left; - width: 100%; - height: 65px; - // border-bottom: 1px solid #eee; - margin-bottom: 2px; - - &:hover { - background-color: #eef4fd; - } - .mdc-list-item__primary-text { - width: 100%; - } - } - - &.tasks { - h4 { - color: #333; - font-size: 13px; - margin: 0 0 8px 0; - - small { - float: right; - margin-top: 6px; - } - } - - .progress { - height: 7px; - margin-bottom: 7px; - } - } - - .icon-circle { - width: 36px; - height: 36px; - @include border-radius(50%); - color: #fff; - text-align: center; - display: inline-block; - float: left; - - i { - font-size: 18px; - line-height: 36px !important; - } - } - - .msg-user { - width: 44px; - height: 44px; - @include border-radius(50%); - color: #fff; - text-align: center; - display: inline-block; - vertical-align: top; - float: left; - - img { - float: left; - } - } - - li { - &:last-child { - border-bottom: none; - } - } - - .menu-info { - display: inline-block; - position: relative; - top: 3px; - left: 10px; - float: left; - width: calc(100% - 75px); - - h4, - .menu-title { - margin: 0; - font-size: 14px; - color: #121212; - float: left; - width: 100%; - line-height: 1; - } - - p, - .menu-desc { - margin: 0; - font-size: 11px; - color: rgba(0, 0, 0, 0.54); - float: left; - width: 100%; - line-height: 20px; - - .material-icons { - font-size: 13px; - color: rgba(0, 0, 0, 0.54); - position: relative; - top: 3px; - float: left; - margin-right: 3px; - height: 20px; - } - } - } - .nfc-close { - display: flex; - height: 40px; - line-height: 40px; - .feather { - color: #747474; - height: 12px !important; - width: 12px !important; - } - } - .nfc-type-icon { - height: 40px; - width: 40px; - display: flex; - align-items: center; - justify-content: center; - &.nfc-green { - filter: invert(77%) sepia(4%) saturate(5247%) hue-rotate(85deg) - brightness(88%) contrast(95%); - } - &.nfc-blue { - filter: invert(67%) sepia(95%) saturate(5173%) hue-rotate(214deg) - brightness(101%) contrast(101%); - } - &.nfc-orange { - filter: invert(69%) sepia(81%) saturate(523%) hue-rotate(353deg) - brightness(101%) contrast(102%); - } - &.nfc-purple { - filter: invert(19%) sepia(98%) saturate(7474%) hue-rotate(284deg) - brightness(105%) contrast(117%); - } - &.nfc-red { - filter: invert(24%) sepia(94%) saturate(7102%) hue-rotate(356deg) - brightness(103%) contrast(100%); - } - } - .msg-unread { - background-color: #f5f9ff; - border-bottom: 1px solid #eee; - } - .msg-read { - border-bottom: 1px solid #eee; - } - } - } - .mat-menu-content { - padding-top: 0px !important; - padding-bottom: 0px !important; - } - .nfc-header { - padding: 20px; - background-color: #7366ff; - border-radius: 5px 5px 0px 0px; - display: flex; - h5 { - color: #fff; - } - } - - .nfc-mark-as-read { - display: block; - text-align: right; - color: #ffffff; - float: right; - width: 100%; - font-size: 12px !important; - } - .nfc-footer { - line-height: 50px; - cursor: pointer; - text-align: center; - border-top: 1px solid rgba(0, 0, 0, 0.15); - - .nfc-read-all { - color: rgb(106 106 106); - } - } - .mat-mdc-menu-content { - padding: 0px; - } -} -.profile-menu { - width: 200px; - max-width: 200px !important; - right: 10px; - - .user-menu-icons .feather { - height: 18px !important; - width: 18px !important; - vertical-align: middle; - } - .mat-mdc-menu-content { - padding: 0px; - } -} -.lang-item-menu .mat-mdc-menu-content { - padding: 0px; -} diff --git a/MyOffice.SPA/src/assets/scss/components/_feed.scss b/MyOffice.SPA/src/assets/scss/components/_feed.scss deleted file mode 100644 index cdec4ea..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_feed.scss +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Document : _feed.scss - * Author : RedStar Template - * Description: This scss file for feed style classes - */ -.feedBody { - border-left: 1px solid #d6d6d6; - margin-left: 30px; - padding-top: 10px; - padding-left: 0px; -} - -.col-auto { - padding-left: 15px; - padding-right: 15px; -} - -.feedLblStyle { - font-weight: bold; - padding: 0px 7px 0px 7px; - border-radius: 10px; -} - -.lblFileStyle { - color: red; - border: 1px solid red; -} - -.lblTaskStyle { - color: #2ed8b6; - border: 1px solid #2ed8b6; -} - -.lblCommentStyle { - color: #4099ff; - border: 1px solid #4099ff; -} - -.lblReplyStyle { - color: #f15317; - border: 1px solid #f15317; -} - -.feedBody li { - position: relative; - padding-left: 30px; - margin-bottom: 25px; -} - -.feedBody li .feed-user-img { - position: absolute; - left: -20px; - top: -10px; -} - -.feedBody li .feed-user-img img { - width: 40px; - height: 40px; - border-radius: 50%; -} - -.feedBody li.active-feed .feed-user-img:after { - border-color: #2ed8b6; -} - -.feedBody li .feed-user-img:after { - content: ""; - position: absolute; - top: 3px; - right: 3px; - border: 3px solid transparent; - border-radius: 50%; -} - -.feedBody li h6 { - line-height: 1.5; - cursor: pointer; -} - -.text-muted { - color: #96a2b4 !important; - margin-bottom: 10px; -} - -.img-100 { - width: 100px; -} - -.feedBody li h6 { - line-height: 1.5; - cursor: pointer; -} - -.feedBody li.active-feed .feed-user-img:after { - border-color: #2ed8b6; -} - -.sl-item { - border-left: 1px solid #13b1e0; - padding-bottom: 1px; - padding-left: 15px; - position: relative; - - &:last-child::after { - //Instead of the line below you could use @include border-radius($radius, $vertical-radius) - border-radius: 100%; - bottom: 0; - content: ""; - height: 6px; - left: -3px; - position: absolute; - width: 6px; - } - - .sl-content { - i { - font-size: 12px; - } - - small { - position: relative; - top: -4px; - } - - p { - padding-bottom: 4px; - position: relative; - } - } -} - -.sl-item::before { - background-color: #13b1e0; - border-radius: 100%; - content: ""; - height: 12px; - left: -6.5px; - position: absolute; - top: 0; - width: 12px; -} - -.sl-primary { - border-left-color: #2196f3; - - &:last-child::after { - background-color: #2196f3; - } -} - -.sl-primary::before { - background-color: #2196f3; -} - -.sl-danger { - border-left-color: #f44336; - - &:last-child::after { - background-color: #f44336; - } -} - -.sl-danger::before { - background-color: #f44336; -} - -.sl-success { - border-left-color: #4caf50; - - &:last-child::after { - background-color: #4caf50; - } -} - -.sl-success::before { - background-color: #4caf50; -} - -.sl-warning { - border-left-color: #ff5722; - - &:last-child::after { - background-color: #ff5722; - } -} - -.sl-warning::before { - background-color: #ff5722; -} diff --git a/MyOffice.SPA/src/assets/scss/components/_formcomponents.scss b/MyOffice.SPA/src/assets/scss/components/_formcomponents.scss deleted file mode 100644 index 365fb1d..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_formcomponents.scss +++ /dev/null @@ -1,59 +0,0 @@ -.example-form { - min-width: 150px; - max-width: 500px; - width: 100%; -} - -.example-full-width { - width: 100%; -} -.example-h2 { - margin: 10px; -} - -.example-section { - display: flex; - align-content: center; - align-items: center; - height: 60px; -} - -.example-margin { - margin: 0 10px; -} - -.example-radio-group { - display: flex; - flex-direction: column; - margin: 15px 0; -} - -.example-radio-button { - margin: 5px; -} - -.advance-validation .error-msg { - margin-top: -15px; -} -.mat-radio-button ~ .mat-radio-button { - margin-left: 16px; -} -.mat-radio-label { - margin-bottom: 0px; -} -.mat-datepicker-content-touch .mat-calendar { - width: 50vh !important; - height: 57vh !important; -} -.mat-datepicker-toggle-default-icon { - width: 1.4em !important; -} -.mat-form-field { - .date-icon { - cursor: pointer; - } -} -.mat-form-field-prefix, -.mat-form-field-suffix { - color: rgba(0, 0, 0, 0.54); -} diff --git a/MyOffice.SPA/src/assets/scss/components/_infobox.scss b/MyOffice.SPA/src/assets/scss/components/_infobox.scss deleted file mode 100644 index 188ac5e..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_infobox.scss +++ /dev/null @@ -1,690 +0,0 @@ -/* - * Document : _infobox.scss - * Author : RedStar Template - * Description: This scss file for info box style classes - */ -.info-box { - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); - height: 80px; - display: flex; - cursor: default; - background-color: #fff; - position: relative; - overflow: hidden; - margin-bottom: 30px; - - .icon { - display: inline-block; - text-align: center; - background-color: rgba(0, 0, 0, 0.12); - width: 80px; - - i { - color: #fff; - font-size: 50px; - line-height: 80px; - } - - .chart.chart-bar { - height: 100%; - line-height: 100px; - - canvas { - vertical-align: baseline !important; - } - } - - .chart.chart-pie { - height: 100%; - line-height: 123px; - - canvas { - vertical-align: baseline !important; - } - } - - .chart.chart-line { - height: 100%; - line-height: 115px; - - canvas { - vertical-align: baseline !important; - } - } - } - - .content { - display: inline-block; - padding: 7px 10px; - - .text { - font-size: 13px; - margin-top: 11px; - color: #555; - } - - .number { - font-weight: normal; - font-size: 26px; - margin-top: -4px; - color: #555; - } - } -} - -.info-box.hover-zoom-effect { - .icon { - overflow: hidden; - - i { - @include transition(all 0.3s ease); - } - } - - &:hover { - .icon { - i { - opacity: 0.4; - @include transform(rotate(-32deg) scale(1.4)); - } - } - } -} - -.info-box.hover-expand-effect { - &:after { - background-color: rgba(0, 0, 0, 0.05); - content: "."; - position: absolute; - left: 80px; - top: 0; - width: 0; - height: 100%; - color: transparent; - @include transition(all 0.95s); - } - - &:hover { - &:after { - width: 100%; - } - } -} - -.info-box-2 { - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); - height: 80px; - display: flex; - cursor: default; - background-color: #fff; - position: relative; - overflow: hidden; - margin-bottom: 30px; - - .icon { - display: inline-block; - text-align: center; - width: 80px; - - i { - color: #fff; - font-size: 50px; - line-height: 80px; - } - } - - .chart.chart-bar { - height: 100%; - line-height: 105px; - - canvas { - vertical-align: baseline !important; - } - } - - .chart.chart-pie { - height: 100%; - line-height: 123px; - - canvas { - vertical-align: baseline !important; - } - } - - .chart.chart-line { - height: 100%; - line-height: 115px; - - canvas { - vertical-align: baseline !important; - } - } - - .content { - display: inline-block; - padding: 7px 10px; - - .text { - font-size: 13px; - margin-top: 11px; - color: #555; - } - - .number { - font-weight: normal; - font-size: 26px; - margin-top: -4px; - color: #555; - } - } -} - -.info-box-2.hover-zoom-effect { - .icon { - overflow: hidden; - - i { - @include transition(all 0.3s ease); - } - } - - &:hover { - .icon { - i { - opacity: 0.4; - @include transform(rotate(-32deg) scale(1.4)); - } - } - } -} - -.info-box-2.hover-expand-effect { - &:after { - background-color: rgba(0, 0, 0, 0.05); - content: "."; - position: absolute; - left: 0; - top: 0; - width: 0; - height: 100%; - color: transparent; - @include transition(all 0.95s); - } - - &:hover { - &:after { - width: 100%; - } - } -} - -.info-box-3 { - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); - height: 80px; - display: flex; - cursor: default; - background-color: #fff; - position: relative; - overflow: hidden; - margin-bottom: 30px; - - .icon { - position: absolute; - right: 10px; - bottom: 2px; - text-align: center; - - i { - color: rgba(0, 0, 0, 0.15); - font-size: 60px; - } - } - - .chart { - margin-right: 5px; - } - - .chart.chart-bar { - height: 100%; - line-height: 50px; - - canvas { - vertical-align: baseline !important; - } - } - - .chart.chart-pie { - height: 100%; - line-height: 34px; - - canvas { - vertical-align: baseline !important; - } - } - - .chart.chart-line { - height: 100%; - line-height: 40px; - - canvas { - vertical-align: baseline !important; - } - } - - .content { - display: inline-block; - padding: 7px 16px; - - .text { - font-size: 13px; - margin-top: 11px; - color: #555; - } - - .number { - font-weight: normal; - font-size: 26px; - margin-top: -4px; - color: #555; - } - } -} - -.info-box-3.hover-zoom-effect { - .icon { - i { - @include transition(all 0.3s ease); - } - } - - &:hover { - .icon { - i { - opacity: 0.4; - @include transform(rotate(-32deg) scale(1.4)); - } - } - } -} - -.info-box-3.hover-expand-effect { - &:after { - background-color: rgba(0, 0, 0, 0.05); - content: "."; - position: absolute; - left: 0; - top: 0; - width: 0; - height: 100%; - color: transparent; - @include transition(all 0.95s); - } - - &:hover { - &:after { - width: 100%; - } - } -} - -.info-box-4 { - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); - height: 80px; - display: flex; - cursor: default; - background-color: #fff; - position: relative; - overflow: hidden; - margin-bottom: 30px; - - .icon { - position: absolute; - right: 10px; - bottom: 2px; - text-align: center; - - i { - color: rgba(0, 0, 0, 0.15); - font-size: 60px; - } - } - - .chart { - margin-right: 5px; - } - - .chart.chart-bar { - height: 100%; - line-height: 50px; - - canvas { - vertical-align: baseline !important; - } - } - - .chart.chart-pie { - height: 100%; - line-height: 34px; - - canvas { - vertical-align: baseline !important; - } - } - - .chart.chart-line { - height: 100%; - line-height: 40px; - - canvas { - vertical-align: baseline !important; - } - } - - .content { - display: inline-block; - padding: 7px 16px; - - .text { - font-size: 13px; - margin-top: 11px; - color: #555; - } - - .number { - font-weight: normal; - font-size: 26px; - margin-top: -4px; - color: #555; - } - } -} - -.info-box-4.hover-zoom-effect { - .icon { - i { - @include transition(all 0.3s ease); - } - } - - &:hover { - .icon { - i { - opacity: 0.4; - @include transform(rotate(-32deg) scale(1.4)); - } - } - } -} - -.info-box-4.hover-expand-effect { - &:after { - background-color: rgba(0, 0, 0, 0.05); - content: "."; - position: absolute; - left: 0; - top: 0; - width: 0; - height: 100%; - color: transparent; - @include transition(all 0.95s); - } - - &:hover { - &:after { - width: 100%; - } - } -} -.info-box-new { - background: #fff; - padding: 20px 20px 0px 20px; - color: #463f3f; - border-radius: 15px; - - .progress { - height: 10px; - border-radius: 20px; - } -} -.support-box { - padding: 15px; - color: #fff; - margin: 8px 0px 25px 0px; - border-radius: 10px; - min-height: 140px; -} -.counter-box { - padding: 15px; - color: #212529; - margin: 8px 0px 25px 0px; - border-radius: 10px; - min-height: 140px; - background-color: #ffffff; - box-shadow: 0 5px 25px rgba(0, 0, 0, 0.1); -} -.info-box1 .text-end h2 { - color: #44e229; -} -.info-box2 .text-end h2 { - color: #e66c2f; -} -.info-box3 .text-end h2 { - color: #58b5f5; -} -.info-box4 .text-end h2 { - color: #ab92d4; -} - -.info-box5 { - width: 100%; - box-shadow: 0 5px 25px rgba(0, 0, 0, 0.1); - margin-bottom: 25px; - padding: 0px 20px 0 20px; - border-radius: 25px; - height: 110px; - display: flex; - cursor: default; - background-color: #fff; - position: relative; - overflow: hidden; - small { - font-size: 14px; - } - .progress { - background: rgba(0, 0, 0, 0.2); - margin: 5px -10px 5px 0; - height: 8px; - background: #e3e3e3; - border-radius: 20px; - box-shadow: none; - overflow: visible; - .progress-bar { - border-radius: 20px; - background: #fff; - } - } - .knob-icon { - margin-top: 16px; - } - .info-box-content { - margin-top: 24px; - margin-left: 10px; - } - .progress-bar { - position: relative; - animation: animate-positive 4s; - line-height: 8px; - } -} -.info-box6 { - box-shadow: 2px 2px 10px #dadada; - margin: 8px 0px 25px 0px; - padding: 20px 10px; - background-color: #fff; - height: 100px; - border-radius: 5px; - transition: 0.3s linear all; - &:hover { - //Instead of the line below you could use @include box-shadow($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10) - box-shadow: 4px 4px 20px #dadada; - //Instead of the line below you could use @include transition($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10) - transition: 0.3s linear all; - } - &.primary { - background-color: #007bff; - color: #fff; - } - &.danger { - background-color: #ef5350; - color: #fff; - } - &.success { - background-color: #66bb6a; - color: #fff; - } - &.info { - background-color: #26c6da; - color: #fff; - } - i { - font-size: 5em; - opacity: 0.2; - } - .count-numbers { - position: absolute; - right: 35px; - top: 20px; - font-size: 32px; - display: block; - } - .count-name { - position: absolute; - right: 35px; - top: 65px; - font-style: italic; - text-transform: capitalize; - opacity: 0.5; - display: block; - font-size: 18px; - } -} -.bg-c-blue { - background: linear-gradient(to right, #5b73e8, #44c4fa); -} -.bg-c-green { - background: linear-gradient(to right, #1d976c, #2fd38a); -} -.bg-c-yellow { - background: linear-gradient(45deg, #ffb64d, #ffcb80); -} -.bg-c-pink { - background: linear-gradient(45deg, #ff5370, #ff869a); -} -.bg-c-purple { - background: linear-gradient(to right, #664dc9, #9884ea); -} -.bg-c-orange { - background: linear-gradient(to right, #fa5420, #f6a800); -} -.info-box7 { - border-radius: 5px; - color: #fff; - box-shadow: 0 1px 2.94px 0.06px rgba(4, 26, 55, 0.16); - border: none; - margin: 8px 0px 25px 0px; - transition: all 0.3s ease-in-out; - .info-box7-block { - padding: 25px; - } -} -.order-info-box7 i { - font-size: 30px; -} -.box-part { - background: #fff; - border-radius: 10px; - padding: 30px 15px; - margin: 5px 0 23px; -} -.box-part { - background: #fff; - border-radius: 10px; - padding: 30px 15px; - margin: 5px 0 23px; -} -.infobox-5 { - .card-icon { - i { - font-size: 4rem; - } - } -} -.card-statistic-4 { - position: relative; - color: #000000; - padding: 15px; - border-radius: 3px; - overflow: hidden; - - .card-icon-large { - font-size: 110px; - width: 110px; - height: 50px; - text-shadow: 3px 7px rgba(0, 0, 0, 0.3); - } - - .card-icon { - text-align: center; - line-height: 50px; - margin-left: 15px; - color: #000; - position: absolute; - right: -5px; - top: 20px; - opacity: 0.1; - } - - .banner-img img { - max-width: 100%; - float: right; - } -} - -.info-card { - margin-top: 20px; - text-align: right; - - .info-box8 { - padding: 15px 20px; - } - .card1-icon { - width: 50px; - height: 50px; - position: absolute; - top: -15px; - font-size: 35px; - border-radius: 8px; - display: flex; - color: #fff; - align-items: center; - justify-content: center; - transition: all 0.3s ease-in-out; - } - .card-block > span { - color: #919aa3; - } - :hover .card1-icon { - top: -25px; - } -} - -@-webkit-keyframes animate-positive { - 0% { - width: 0; - } -} -@keyframes animate-positive { - 0% { - width: 0; - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_inputformgroup.scss b/MyOffice.SPA/src/assets/scss/components/_inputformgroup.scss deleted file mode 100644 index 1baa625..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_inputformgroup.scss +++ /dev/null @@ -1,456 +0,0 @@ -/* - * Document : _inputformgroup.scss - * Author : RedStar Template - * Description: This scss file for input form style classes - */ -%extend_check { - font-size: 13px; - line-height: 1.42857; - color: #414244; - font-weight: 400; -} - -.input-group { - width: 100%; - margin-bottom: 20px; - display: table; - - .form-line { - display: inline-block; - width: 100%; - //border-bottom: 1px solid #ddd; - position: relative; - - &:after { - content: ""; - position: absolute; - left: 0; - width: 100%; - bottom: 0px; - @include transform(scaleX(0)); - @include transition(0.25s ease-in); - border-bottom: 2px solid #1f91f3; - } - - +.input-group-addon { - padding-right: 0; - padding-left: 10px; - } - } - - .help-info { - float: right; - font-size: 12px; - margin-top: 5px; - color: #999; - } - - label.error { - font-size: 12px; - display: block; - margin-top: 5px; - font-weight: normal; - color: #f44336; - } - - .form-line.error { - &:after { - border-bottom: 2px solid #f44336; - } - } - - .form-line.success { - &:after { - border-bottom: 2px solid #4caf50; - } - } - - .form-line.warning { - &:after { - border-bottom: 2px solid #ffc107; - } - } - - .form-line.focused { - &:after { - @include transform(scaleX(1)); - } - - .form-label { - bottom: 25px; - left: 0; - font-size: 12px; - } - } - - .input-group-addon { - border: none; - background-color: transparent; - padding-left: 0; - font-weight: bold; - display: table-cell; - - .material-icons { - font-size: 18px; - color: #555; - } - } - - input[type="text"], - .form-control { - //border: none; - box-shadow: none; - padding-left: 0; - margin: 0; - font-size: 13px; - } - - .form-control { - &:focus { - @include box-shadow(none !important); - } - } -} - -.input-group.input-group-sm { - .input-group-addon { - i { - font-size: 14px; - } - } - - .form-control { - font-size: 12px !important; - } -} - -.input-group.input-group-lg { - .input-group-addon { - i { - font-size: 26px; - } - } - - .form-control { - font-size: 18px !important; - } -} - -.input-field { - >label:not(.label-icon).active { - font-size: 15px !important; - transform: translateY(-5px) scale(0.8); - } - - input, - textarea { - font-size: 13px !important; - } - - >label { - font-size: 13px !important; - } -} - -.form-control-label { - text-align: right; - - label { - margin-top: 8px; - } -} - -.form-horizontal { - .form-group { - margin-bottom: 0; - } -} - -.form-group { - width: 100%; - margin-bottom: 25px; - - .form-control { - width: 100%; - /* border: none; */ - box-shadow: none; - /* border-bottom: 1px solid #9e9e9e;*/ - @include border-radius(0); - padding-left: 0; - } - - input.form-control { - margin: 0; - font-size: 13px; - } - - .help-info { - float: right; - font-size: 12px; - margin-top: 5px; - color: #999; - } - - label.error { - font-size: 12px; - display: block; - margin-top: 5px; - font-weight: normal; - color: #f44336; - } - - .form-line { - width: 100%; - position: relative; - //border-bottom: 1px solid #ddd; - - &:after { - content: ""; - position: absolute; - left: 0; - width: 100%; - height: 0; - bottom: -1px; - @include transform(scaleX(0)); - @include transition(0.25s ease-in); - border-bottom: 2px solid #1f91f3; - } - - .form-label { - font-weight: normal; - color: #aaa; - position: absolute; - top: 10px; - left: 0; - cursor: text; - @include transition(0.2s); - } - } - - .form-line.error { - &:after { - border-bottom: 2px solid #f44336; - } - } - - .form-line.success { - &:after { - border-bottom: 2px solid #4caf50; - } - } - - .form-line.warning { - &:after { - border-bottom: 2px solid #ffc107; - } - } - - .form-line.focused { - &:after { - @include transform(scaleX(1)); - } - - .form-label { - top: -10px; - left: 0; - font-size: 12px; - } - } -} - -.form-group-sm { - .form-label { - font-size: 12px; - } - - .form-line.focused { - .form-label { - bottom: 20px; - font-size: 10px; - } - } -} - -.form-group-lg { - .form-label { - font-size: 18px; - } - - .form-line.focused { - .form-label { - bottom: 35px; - font-size: 12px; - } - } -} - -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - background-color: transparent; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px dashed; - border-top: 4px solid \9; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - -.show>.dropdown-menu { - display: block; -} - -.spinner { - .input-group-addon { - /*position: relative;*/ - position: absolute; - top: 10px; - right: 0; - - .spin-up i { - position: absolute; - left: 0; - } - - .spin-down i { - position: absolute; - left: 0; - bottom: -15px; - } - } -} - -.bootstrap-select { - .btn { - color: #333; - } -} - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} - -.form-check { - @extend %extend_check; - margin-bottom: 0.5rem; - padding-left: 0; - - .form-check-label { - cursor: pointer; - padding-left: 25px; - position: relative; - padding-right: 15px; - - span { - display: block; - position: absolute; - left: -1px; - top: -1px; - transition-duration: 0.2s; - padding-left: 0; - } - } - - .form-check-input { - opacity: 0; - height: 0; - width: 0; - overflow: hidden; - position: absolute; - margin: 0; - z-index: -1; - left: 0; - pointer-events: none; - - &:checked+.form-check-sign { - &:before { - animation: rippleOn 0.5s; - } - - .check { - background: #9c27b0; - - &:before { - color: #ffffff; - box-shadow: 0 0 0 10px, 10px -10px 0 10px, 32px 0 0 20px, - 0 32px 0 20px, -5px 5px 0 10px, 20px -12px 0 11px; - animation: checkboxOn 0.3s forwards; - } - } - } - } - - .form-check-sign { - vertical-align: middle; - position: relative; - top: -2px; - float: left; - padding-right: 10px; - display: inline-block; - - &:before { - display: block; - position: absolute; - left: 0; - content: ""; - background-color: rgba(0, 0, 0, 0.84); - height: 20px; - width: 20px; - border-radius: 100%; - z-index: 1; - opacity: 0; - margin: 0; - top: 0; - transform: scale3d(2.3, 2.3, 1); - } - - .check { - position: relative; - display: inline-block; - width: 20px; - height: 20px; - border: 1px solid rgba(0, 0, 0, 0.54); - overflow: hidden; - z-index: 1; - border-radius: 3px; - - &:before { - position: absolute; - content: ""; - transform: rotate(45deg); - display: block; - margin-top: -3px; - margin-left: 7px; - width: 0; - color: #ffffff; - height: 0; - animation: checkboxOff 0.3s forwards; - } - } - } -} - -label { - @extend %extend_check; -} - -.default-select { - select { - width: 100px; - -moz-appearance: none; - -webkit-appearance: none; - appearance: none; - } - - .select-wrapper input.select-dropdown { - display: none; - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_labels.scss b/MyOffice.SPA/src/assets/scss/components/_labels.scss deleted file mode 100644 index 8a2f508..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_labels.scss +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Document : _labels.scss - * Author : RedStar Template - * Description: This scss file for label style classes - */ -.label { - @include border-radius(10px); - padding: 2px 10px; - color: #fff; - display: inline-block; -} - -.label-default { - background-color: #777; -} - -.label-primary { - background-color: #1f91f3; -} - -.label-success { - background-color: #2b982b; -} - -.label-info { - background-color: #00b0e4; -} - -.label-warning { - background-color: #ff9600; -} - -.label-danger { - background-color: #fb483a; -} diff --git a/MyOffice.SPA/src/assets/scss/components/_leftsidebaroverlay.scss b/MyOffice.SPA/src/assets/scss/components/_leftsidebaroverlay.scss deleted file mode 100644 index 3d898e0..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_leftsidebaroverlay.scss +++ /dev/null @@ -1,952 +0,0 @@ -/* - * Document : _leftsidebaroverlay.scss - * Author : RedStar Template - * Description: This scss file for left side bar style classes - */ -.overlay { - position: fixed; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.5); - z-index: 10; -} - -.overlay-open { - .sidebar { - margin-left: 0; - z-index: 99999999; - } -} - -.sidebar { - @include transition(all 0.5s); - font-family: $sidebar-font-family; - background: #ffffff; - width: 260px; - overflow: hidden; - display: inline-block; - height: calc(100vh - 0px); - position: fixed; - top: 0px; - left: 0; - border-right: 1px solid #f2f4f9; - -webkit-box-shadow: 0 8px 10px 0 rgba(183, 192, 206, 0.2); - box-shadow: 0 8px 10px 0 rgba(183, 192, 206, 0.2); - z-index: 999 !important; - - .user-info { - padding: 13px 15px 12px 15px; - white-space: nowrap; - position: relative; - border-bottom: 1px solid #e9e9e9; - height: 135px; - - .image { - margin-right: 12px; - display: inline-block; - - img { - @include border-radius(50%); - vertical-align: bottom !important; - } - } - - .info-container { - cursor: default; - display: block; - position: relative; - top: 25px; - - .name { - @include three-dots-overflow(); - font-size: 14px; - max-width: 200px; - color: #fff; - } - - .email { - @include three-dots-overflow(); - font-size: 12px; - max-width: 200px; - color: #fff; - } - - .user-helper-dropdown { - position: absolute; - right: -3px; - bottom: -12px; - @include box-shadow(none); - cursor: pointer; - color: #fff; - } - } - } - - .menu { - position: relative; - overflow-y: auto; - height: 100vh; - clear: left; - - .list { - list-style: none; - padding-left: 0; - - li { - &.active { - .menu-top { - background-color: #f0f3fb; - border-radius: 5px; - } - > :first-child { - span { - font-weight: 500; - } - } - } - &.active-top { - .menu-top { - background-color: #f0f3fb; - } - } - } - - .header { - font-size: 12px; - margin: 15px 0px 5px 23px; - text-transform: uppercase; - letter-spacing: 0.5px; - color: #000000; - } - - i.material-icons { - font-size: 15px; - } - - i.fas { - font-size: 15px; - } - - i.far { - font-size: 15px; - } - - i.fab { - font-size: 15px; - } - - i.fa { - font-size: 15px; - } - - .tooltips .sidebarQuickIcon { - font-size: 18px; - margin-top: 10px; - } - - .active { - .menu-toggle { - background: rgba(146, 144, 144, 0.28); - } - - .ml-menu { - display: block; - } - .ml-sub-menu { - display: block; - } - .ml-sub-menu2 { - display: block; - } - .ml-sub-menu3 { - display: block; - } - } - - .menu-toggle { - &:after, - &:before { - position: absolute; - top: calc(50% - 13px); - right: 17px; - font-size: 19px; - @include transform(scale(0)); - @include transition(all 0.3s); - } - - &:before { - content: "\f054"; - transform: scale(1); - font-family: "Font Awesome 5 Free"; - font-weight: 600; - font-size: 12px; - color: gray; - @include transform(scale(1)); - } - - &:after { - content: "\f078"; - transform: scale(1); - font-family: "Font Awesome 5 Free"; - font-weight: 600; - font-size: 12px; - color: gray; - @include transform(scale(0)); - } - } - - .material-icons-two-tone { - vertical-align: middle; - filter: invert(43%) sepia(4%) saturate(19%) hue-rotate(342deg) - brightness(94%) contrast(88%); - } - - .active .menu-toggle { - &:before { - @include transform(scale(0)); - } - - &:after { - @include transform(scale(1)); - } - } - - .ml-sub-menu { - &:after, - &:before { - position: absolute; - top: calc(50% - 13px); - right: 17px; - font-size: 19px; - @include transition(all 0.3s); - } - - &:before { - content: "\f054"; - font-family: "Font Awesome 5 Free"; - font-weight: 600; - font-size: 12px; - color: gray; - // @include transform(scale(1)); - } - - &:after { - content: "\f078"; - font-family: "Font Awesome 5 Free"; - font-weight: 600; - font-size: 12px; - color: gray; - // content: "\2013"; - // @include transform(scale(0)); - } - } - .ml-sub-menu2 { - &:after, - &:before { - position: absolute; - top: calc(50% - 13px); - right: 17px; - font-size: 19px; - // @include transform(scale(0)); - @include transition(all 0.3s); - } - - &:before { - content: "\f054"; - font-family: "Font Awesome 5 Free"; - font-weight: 600; - font-size: 12px; - color: gray; - // @include transform(scale(1)); - } - - &:after { - content: "\f078"; - font-family: "Font Awesome 5 Free"; - font-weight: 600; - font-size: 12px; - color: gray; - // @include transform(scale(0)); - } - } - .ml-sub-menu3 { - &:after, - &:before { - position: absolute; - top: calc(50% - 13px); - right: 17px; - font-size: 19px; - // @include transform(scale(0)); - @include transition(all 0.3s); - } - - &:before { - content: "\f054"; - font-family: "Font Awesome 5 Free"; - font-weight: 600; - font-size: 12px; - color: gray; - // @include transform(scale(1)); - } - - &:after { - content: "\f078"; - font-family: "Font Awesome 5 Free"; - font-weight: 600; - font-size: 12px; - color: gray; - // @include transform(scale(0)); - } - } - - a { - color: #000000; - position: relative; - font-size: 15px !important; - display: block; - overflow: hidden; - line-height: 2rem; - padding: 9px 9px 9px 9px; - margin: 8px 11px 0px 11px; - // Parent items (menu-toggle) have no routerLink/href — force pointer on hover. - cursor: pointer; - &:hover, - &:active { - text-decoration: none !important; - background-color: #f0f3fb; - } - - small { - position: absolute; - top: calc(50% - 7.5px); - right: 15px; - } - - span { - margin: 7px 0 7px 7px; - color: rgba(0, 0, 0, 0.85); - // font-weight: bold; - font-size: 16px; - overflow: hidden; - } - } - - .ml-menu { - list-style: none; - display: none; - padding-left: 0; - - span { - font-weight: normal; - font-size: 14px; - margin: 3px 0 1px 6px; - } - - li { - a { - padding-left: 40px; - padding-top: 4px; - padding-bottom: 4px; - } - - &.active { - a.toggled:not(.menu-toggle) { - &:before { - content: ""; - display: block; - width: 7px; - height: 7px; - border-radius: 50%; - position: absolute; - left: 18%; - top: 50%; - transform: translate(-10px, -50%); - opacity: 1; - transition: all 0.2s ease; - } - } - - .ml-menu { - &:before { - content: "\f105"; - font-family: "Font Awesome 5 Free"; - font-size: 13px; - display: block; - width: 7px; - height: 7px; - position: absolute; - transition: 0.5s; - left: 6%; - font-weight: 900; - top: calc(50% - 15px); - } - // &:hover:before { - // font-weight: 600; - // left: 25px; - // } - } - .ml-menu-2 { - display: block; - } - .ml-menu { - color: #5668f3; - font-weight: 500; - } - .ml-sub-sub-menu { - color: #5668f3; - font-weight: 500; - } - } - a { - &.ml-sub-sub-menu { - &:before { - content: "\f105"; - font-family: "Font Awesome 5 Free"; - font-size: 13px; - display: block; - width: 7px; - height: 7px; - position: absolute; - transition: 0.5s; - left: 18%; - font-weight: 900; - top: calc(50% - 15px); - } - &:hover:before { - font-weight: 600; - left: 50px; - } - } - } - - .ml-menu { - li { - a { - padding-left: 80px; - } - } - - .ml-menu { - li { - a { - padding-left: 95px; - } - } - } - } - } - .activeSub { - .ml-menu-2 { - display: block; - } - .ml-menu-3 { - display: block; - } - } - } - .ml-menu-2 { - list-style: none; - display: none; - padding-left: 0; - - span { - font-weight: normal; - font-size: 14px; - margin: 3px 0 1px 6px; - } - - li { - a { - padding-left: 55px; - padding-top: 4px; - padding-bottom: 4px; - } - } - li.active .ml-menu-3 { - display: block; - } - li.active .ml-menu2:before { - content: "\f105"; - font-family: "Font Awesome 5 Free"; - font-size: 13px; - display: block; - width: 7px; - height: 7px; - position: absolute; - left: 17%; - font-weight: 900; - top: calc(50% - 15px); - } - } - .ml-menu-3 { - list-style: none; - display: none; - padding-left: 0; - - span { - font-weight: normal; - font-size: 14px; - margin: 3px 0 1px 6px; - } - - li { - a { - padding-left: 70px; - padding-top: 4px; - padding-bottom: 4px; - } - } - li.active .ml-menu3:before { - content: "\f105"; - font-family: "Font Awesome 5 Free"; - font-size: 13px; - display: block; - width: 7px; - height: 7px; - position: absolute; - left: 24%; - font-weight: 900; - top: calc(50% - 15px); - } - } - } - } - .sidebar-badge { - position: absolute; - right: 35px; - padding: 3px 6px; - margin-top: 5px !important; - border-radius: 15px; - color: #ffffff !important; - font-size: 12px !important; - border: none; - font-weight: 300 !important; - } -} -.ml-menu { - .ml-sub-menu { - &:before { - @include transform(scale(1)); - } - &:after { - @include transform(scale(0)); - } - } - - .ml-sub-menu2 { - &:before { - @include transform(scale(1)); - } - &:after { - @include transform(scale(0)); - } - } - - .ml-sub-menu3 { - &:before { - @include transform(scale(1)); - } - &:after { - @include transform(scale(0)); - } - } - - .active .ml-sub-menu { - &:after { - @include transform(scale(1)); - } - - &:before { - @include transform(scale(0)); - } - } - - .ml-menu-2 { - li.active .ml-sub-menu2 { - &:after { - @include transform(scale(1)); - } - - &:before { - @include transform(scale(0)); - } - } - } - - .ml-menu-3 { - li.active .ml-sub-menu3 { - &:after { - @include transform(scale(1)); - } - - &:before { - @include transform(scale(0)); - } - } - } -} -.right-sidebar { - width: 280px; - height: calc(100vh - 60px); - position: fixed; - right: -300px; - top: 60px; - background: #fdfdfd; - z-index: 999 !important; - @include box-shadow(-2px 2px 5px rgba(0, 0, 0, 0.1)); - overflow: hidden; - @include transition(0.5s); - - &.open { - right: 0; - } - - .nav-tabs { - font-weight: 600; - font-size: 13px; - width: 100%; - margin-left: 2px; - - li { - text-align: center; - - > a { - margin-right: 0; - } - - &:first-child { - width: 45%; - } - - &:last-child { - width: 55%; - } - } - } - - .rightSidebarClose { - position: absolute; - top: 8px; - left: 8px; - z-index: 99; - cursor: pointer; - } -} - -.boxed-layout { - .sidebar { - left: auto; - } - - &.side-closed .sidebar { - left: 0; - } -} - -.horizontal-menu { - width: 100%; - text-align: center; -} - -.top-sidebar { - float: left; - width: 100%; - position: fixed; - z-index: 9; - top: 60px; - background-color: #ffffff; - -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); - -ms-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); - box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); - - ul.horizontal-list { - overflow: visible !important; - margin: 0; - display: inline-block; - height: 60px; - - a { - color: #747474; - float: left; - width: 100%; - } - - li { - float: left; - position: relative; - padding: 20px 20px; - - &:hover > ul { - display: block !important; - position: absolute; - top: 63px; - background-color: #fff; - border-radius: 5px; - z-index: 9; - -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); - -ms-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); - box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); - - &:after { - position: absolute; - bottom: 100%; - left: 1.8rem; - width: 0; - height: 0; - margin-left: -16px; - content: " "; - pointer-events: none; - border: solid transparent; - border-width: 9px; - border-color: rgba(136, 183, 213, 0); - border-bottom-color: #fff; - } - - &:before { - position: absolute; - bottom: 100%; - left: 1.8rem; - width: 0; - height: 0; - margin-left: -16px; - content: " "; - pointer-events: none; - border: solid transparent; - border-width: 9px; - border-color: rgba(136, 183, 213, 0); - border-bottom-color: #ad5454; - } - - &.mega-ml-menu { - position: relative; - top: 0; - } - } - - ul li { - width: 100%; - padding: 10px 15px; - text-align: left; - } - } - - ul.ml-menu { - display: none !important; - width: 200px; - - li:hover ul { - top: 0; - left: 100%; - } - - .menu-toggle { - position: relative; - - &:after { - content: "\2023"; - position: absolute; - right: 0; - font-size: 25px; - top: 0; - line-height: 22px; - } - } - } - - i.material-icons { - margin-top: 1px; - margin-right: 3px; - float: left; - font-size: 20px; - } - - // .menu-toggle::after{ - // content: "\2304"; - // position: absolute; - // top: 15px; - // right: 0; - // } - } - - .slimScrollDiv { - overflow: visible !important; - } -} - -// Dark left sidebar style -.menu_dark .sidebar { - background: #1a202e; - border-right: 1px solid #2f3a44; - font-weight: 500; - - .menu .list { - a { - color: #cfd8e3; - span { - color: #cfd8e3; - } - } - - a:hover { - background-color: rgba(0, 0, 0, 0.2); - } - - .header { - background: transparent; - color: #9babf1; - font-size: 12px; - margin: 15px 0px 5px 23px; - text-transform: uppercase; - letter-spacing: 0.5px; - } - - .active { - .menu-toggle { - background-color: rgba(0, 0, 0, 0.4); - } - } - - .menu-toggle::after { - color: #b8babb; - } - - .menu-toggle::before { - color: #b8babb; - } - - .material-icons-two-tone { - filter: invert(86%) sepia(3%) saturate(2995%) hue-rotate(185deg) - brightness(79%) contrast(78%); - } - - .ml-menu { - li a { - color: #dadada; - } - } - - li { - &.active { - .menu-top { - background-color: rgba(0, 0, 0, 0.4); - } - } - &.active-top { - .menu-top { - background-color: rgba(0, 0, 0, 0.4); - } - } - } - } - - .menu .list .ml-menu .active a::before { - content: "\f105"; - font-family: "Font Awesome 5 Free"; - font-size: 13px; - display: block; - width: 7px; - height: 7px; - position: absolute; - left: 10%; - font-weight: 900; - } -} - -.menu_dark { - .sidebar-userpic-name { - color: #e6e6e6; - } - - .profile-usertitle-job { - color: #e6e6e6; - } -} - -.user-panel { - float: left; - width: 100%; - color: #ccc; - padding: 25px 0px 10px 0; - .image { - width: 35%; - max-width: 75px; - margin: 0 auto; - - img { - max-width: 100%; - } - } -} - -.user-img-circle { - background: #fff; - z-index: 1000; - position: inherit; - box-shadow: 10px 10px 13px 0px rgba(78, 78, 78, 0.15); -} - -.img-circle { - border-radius: 15%; -} - -.profile-usertitle { - text-align: center; - color: #060606; -} - -.profile-usertitle-job { - font-size: 11px; - color: #000000; -} - -.sidebar-userpic-btn { - display: flex; - place-content: space-around; - margin: auto; - line-height: 2rem; - padding: 9px 9px 9px 9px; - margin: 8px 13px 0px 13px; - - a { - padding: 0px !important; - margin: 0px !important; - height: 30px; - width: 30px; - - &:hover { - cursor: pointer; - } - - .mat-button-wrapper { - margin-left: 0px !important; - } - - &:hover { - background-color: transparent !important; - } - } -} - -.collapse.in { - display: block; - list-style-type: none; -} -.sidebarIcon { - height: 18px !important; - width: 18px !important; - text-align: center; - fill: rgba(75, 75, 90, 0.12) !important; -} -.headerShadow { - width: 100%; - height: 100px; - position: fixed; - top: 0; - z-index: 1; - background: linear-gradient(180deg, #f8f8f8e6 44%, #f7f7f780 73%, #ffffff00); -} diff --git a/MyOffice.SPA/src/assets/scss/components/_navbar.scss b/MyOffice.SPA/src/assets/scss/components/_navbar.scss deleted file mode 100644 index 35ed72f..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_navbar.scss +++ /dev/null @@ -1,654 +0,0 @@ -/* - * Document : _navbar.scss - * Author : RedStar Template - * Description: This scss file for navbar style classes - */ -.navbar { - font-family: $navbar-font-family; - @include border-radius(0); - box-shadow: none; - // @include box-shadow(0px 0px 20px 0px rgba(0,0,0,0.15)); - border: none; - position: fixed; - top: 0; - left: 0; - z-index: 999; - width: 100%; - padding: 0; - - .navbar-brand { - @include three-dots-overflow(); - } - - .navbar-custom-right-menu { - float: right; - } - - .navbar-toggle { - text-decoration: none; - color: #fff; - width: 20px; - height: 20px; - margin-top: -7px; - line-height: 60px; - margin-right: 17px; - - &:before { - content: "\E8D5"; - font-family: "Material Icons"; - font-size: 26px; - } - } - - .navbar-collapse { - &.in { - overflow: visible; - } - } - .nav.navbar-nav { - display: block; - } - .container-fluid, - .container { - display: block; - box-shadow: 0 4px 24px 0 rgb(35 42 48 / 10%); - } - .dropdown-menu ul.menu li { - width: 100%; - } - .nav-left-menu { - margin: 3px 15px; - } - .collapse-menu-icon { - margin-bottom: 0px; - line-height: 60px; - display: none; - } - .header-icon { - vertical-align: top !important; - .feather { - height: 20px; - width: 20px; - } - } -} -.ls-closed { - .sidebar { - margin-left: -300px; - } - - section.content { - margin-left: 15px; - } - - .bars { - &:after, - &:before { - font-family: "Material Icons"; - font-size: 24px; - position: absolute; - left: 10px; - top: 0px; - line-height: 60px; - margin-right: 10px; - @include transform(scale(0)); - @include transition(all 0.3s); - } - - &:before { - content: "\E5D2"; - @include transform(scale(1)); - } - - // &:after { - // content: "\E5C4"; - // @include transform(scale(0)); - // } - } - - .navbar-brand { - margin-left: 30px; - } -} - -.overlay-open { - .bars { - &:before { - @include transform(scale(0)); - } - - &:after { - @include transform(scale(1)); - } - } - &.ls-closed { - .sidebar { - margin-left: 0; - } - } -} - -.navbar-header { - padding: 8px; - background-color: #000; - width: 260px; - float: left; - @include transition(all 0.5s); - - .bars { - float: left; - text-decoration: none; - } -} -.navbar-icon { - list-style-type: none; - padding-left: 20px; -} -.logo-name { - color: white; - font-size: 24px; - font-weight: 400; -} -.navbar-nav { - > li { - > a { - padding: 7px 7px 2px 7px; - } - .js-right-sidebar { - margin-right: 5px; - } - } - &.navbar-left { - margin-right: 10px; - line-height: 60px; - } - - &.navbar-right { - float: right !important; - margin-right: 10px; - line-height: 60px; - // .nav-item { - // margin: 0px 4px; - // } - - .user_profile { - .dropdown-toggle { - cursor: pointer; - } - .user_img { - float: right; - margin: 13px 0px 0px 10px; - border-radius: 50%; - } - span { - font-weight: 500; - color: #fff; - } - } - } - .langSelItem .dropdown-menu { - margin-top: 35px !important; - } - - .app-dropdown { - right: unset !important; - left: 0 !important; - &::before { - left: 19px !important; - right: unset !important; - } - &::after { - left: 20px !important; - right: unset !important; - } - } - .dropdown-menu { - margin-top: 60px !important; - width: 325px; - right: 0; - left: auto; - position: absolute !important; - top: 0; - padding: 0; - border-radius: 5px; - &::before { - content: ""; - position: absolute; - top: -7px; - right: 19px; - display: inline-block !important; - border-right: 7px solid transparent; - border-bottom: 7px solid #eee; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - } - &::after { - content: ""; - position: absolute; - top: -6px; - right: 20px; - display: inline-block !important; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-left: 6px solid transparent; - } - ul.menu .menu-info p { - line-height: 1; - .material-icons { - display: inline-block; - } - } - li.footer { - width: 100%; - height: 45px; - } - .header { - line-height: 2; - } - } - .material-icons { - line-height: 1; - height: 24px; - font-size: 27px; - } - .fas { - line-height: 1; - height: 24px; - font-size: 18px; - } - .far { - line-height: 1; - height: 24px; - font-size: 18px; - } - .fab { - line-height: 1; - height: 24px; - font-size: 18px; - } - .fa { - line-height: 1; - height: 24px; - font-size: 18px; - } - .user_profile { - .user_dw_menu { - list-style-type: none; - padding-left: 0px; - li { - width: 100%; - border-bottom: 1px solid #eee; - height: 45px; - a { - line-height: 24px; - color: #333333; - display: inline-flex; - } - i { - float: left; - padding-right: 5px; - } - &:last-child { - border-bottom: 0; - } - } - } - .dropdown-menu { - width: 200px; - right: -10px; - } - } -} -.nav-notification-icons { - min-width: 0 !important; - flex-shrink: 0; - line-height: 40px !important; - border-radius: 50% !important; - margin: 0px 4px; - &:after { - display: none; - } - .material-icons-outlined { - display: flex; - vertical-align: middle; - } -} -.lang-dropdown { - cursor: pointer; - // margin: 14px 20px 0px 10px; - .country-name { - margin-left: 5px; - vertical-align: middle; - } - &::after { - display: none; - } - img { - height: 17px; - border-radius: 3px; - } -} -.lang-item { - width: 175px !important; - .lang-item-list { - line-height: 30px; - &.active { - background-color: #eef1f9; - color: #000000; - } - &:active { - background-color: #eef1f9; - color: #000000; - } - .flag-img { - margin: 0px 5px; - } - } -} - -.label-count { - position: absolute; - top: 5px; - right: 10px; - font-size: 10px; - line-height: 15px; - background-color: #000; - padding: 3px 3px; - border-radius: 3px; -} -.navbar-brand { - float: left; - height: 45px; - padding: 6px 25px; - margin-left: 20px; - font-size: 18px; - line-height: 20px; - text-align: center; - width: 100%; - img { - /*float: left;*/ - vertical-align: top; - } - span { - line-height: 32px; - padding-left: 10px; - } -} -.navbar-collapse { - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -} -.collapse { - display: none; -} -.navbar-nav { - float: none; - > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; - } -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; - > li { - position: relative; - display: block; - > a { - position: relative; - display: block; - padding: 5px 0px; - } - } - .fullscreen { - // margin: 0px 10px; - } - .langSelItem { - margin: 15px 10px 0px 10px; - } - .btnNotification { - margin: 0px 10px; - } - .btnUserDropdown { - margin: 0px 8px; - } - .btnHeaderSetting { - margin: 0px 8px; - .settingBtn { - vertical-align: top; - } - } - .user-menu-icons { - margin: 0px 5px; - .feather { - height: 18px !important; - width: 18px !important; - vertical-align: middle; - } - } - - .menuIcon { - line-height: 20px !important; - height: 20px; - font-size: 20px; - } - .logo { - margin-right: auto; - } -} -nav.navbar { - min-height: 60px; - position: fixed; - width: calc(100% - 4rem - 257px); - z-index: 12; - right: 0; - left: unset; - margin: 1.3rem 2rem 0; - border-radius: 0.428rem; - box-shadow: 0 -18px 1px 5px rgb(241 240 244); - top: 0; -} - -@each $key, $val in $colors { - .col-#{$key} { - .navbar { - @include navbar-link-color(#fff, #000, 0.95); - // @include navbar-link-color(rgba(0,0,0,0.85), #000, .95); - } - } -} -.side-closed { - .sidebar { - /*margin-left: -300px;*/ - width: 60px; - .menu { - .list { - li { - .menu-toggle { - &:before, - &:after { - content: ""; - } - } - span { - display: none; - } - a { - line-height: 1rem; - padding-left: 9px; - &:after { - top: calc(50% - 7px); - } - } - } - } - } - } - &.submenu-closed { - .sidebar .menu .list { - li .ml-menu, - .header { - display: none !important; - } - } - .navbar-header { - width: 65px; - .navbar-brand { - padding-right: 0; - padding-left: 0; - // margin: 0; - span { - display: none; - } - } - .navbar-nav { - .sidemenu-collapse { - display: none; - } - } - } - .sidebar-user-panel { - display: none; - } - } - - section.content { - margin-left: 58px; - transition: all 1s, width 1s; - } - nav.navbar { - width: calc(100% - 4rem - 55px); - transition: all 1s, width 1s; - } - - .navbar-brand { - margin-left: 5px; - } - &.side-closed-hover { - .sidebar { - width: 260px; - transition: all 1s, width 1s; - .menu { - .list { - li { - .menu-toggle { - &:before { - content: "\f054"; - transform: scale(1); - font-family: "Font Awesome 5 Free"; - font-weight: 600; - font-size: 12px; - color: gray; - top: calc(50% - 7px); - @include transform(scale(1)); - } - &:after { - content: "\f078"; - transform: scale(1); - font-family: "Font Awesome 5 Free"; - font-weight: 600; - font-size: 12px; - color: gray; - @include transform(scale(0)); - } - } - span { - display: block; - float: left; - } - a { - padding: 9px 9px 9px 9px; - } - i { - float: left; - line-height: 2rem; - } - .sidebarIcon { - float: left; - line-height: 2rem; - } - } - .ml-menu { - li { - a { - padding-left: 45px; - padding-top: 7px; - padding-bottom: 7px; - line-height: 2rem; - } - } - .ml-menu-2 { - li { - a { - padding-left: 65px; - padding-top: 4px; - padding-bottom: 4px; - } - } - } - .ml-menu-3 { - li { - a { - padding-left: 85px; - padding-top: 4px; - padding-bottom: 4px; - } - } - } - } - .active .menu-toggle { - &:before { - @include transform(scale(0)); - } - - &:after { - @include transform(scale(1)); - } - } - } - } - } - section.content { - margin-left: 260px; - transition: all 1s, width 1s; - } - nav.navbar { - width: calc(100% - 4rem - 257px); - transition: all 1s, width 1s; - } - } -} -.sidemenu-collapse { - height: 50px; - padding: 0px 20px 0px 44px; - &:hover { - text-decoration: none; - color: #fff; - background-color: transparent; - } - .fas { - line-height: 1; - height: 24px; - font-size: 18px; - color: #3a2c70; - } -} -nav, -nav .nav-wrapper i, -nav a.button-collapse, -nav a.button-collapse i { - @media screen and (min-width: 601px) { - // height: 60px; - // line-height: 60px; - } -} -.boxed-layout { - .container > .navbar-header { - margin-left: 0; - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_navtabs.scss b/MyOffice.SPA/src/assets/scss/components/_navtabs.scss deleted file mode 100644 index 1e52768..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_navtabs.scss +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Document : _navtabs.scss - * Author : RedStar Template - * Description: This scss file for navbar tabs style classes - */ -.nav-tabs { - border-bottom: 2px solid #eee; - - > li { - position: relative; - top: 3px; - left: -2px; - - > a { - border: none !important; - color: #999 !important; - @include border-radius(0); - - &:hover, - &:active, - &:focus { - background-color: transparent !important; - } - - &:before { - content: ""; - position: absolute; - left: 0; - width: 100%; - height: 0; - border-bottom: 2px solid #2196f3; - bottom: 2px; - @include transform(scaleX(0)); - @include transition(0.1s ease-in); - } - - .material-icons { - position: relative; - top: 7px; - margin-bottom: 8px; - } - } - } - - li { - a.active { - color: #222 !important; - - &:hover, - &:active, - &:focus { - background-color: transparent !important; - } - - &:before { - @include transform(scaleX(1)); - } - } - } - - + .tab-content { - padding: 15px 0; - } -} - -@each $key, $val in $colors { - .nav-tabs.tab-col-#{$key} { - > li { - > a { - &:before { - border-bottom: 2px solid $val; - } - } - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_noticeboard.scss b/MyOffice.SPA/src/assets/scss/components/_noticeboard.scss deleted file mode 100644 index cf4603c..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_noticeboard.scss +++ /dev/null @@ -1,18 +0,0 @@ -.notice-board { - display: -ms-flexbox; - display: -webkit-box; - display: flex; - -ms-flex-align: start; - -webkit-box-align: start; - align-items: flex-start; - .notice-body { - font-size: 13px; - padding: 0px 0px 5px 10px; - p { - margin-bottom: 0px; - } - .notice-heading { - margin: 5px 0px 0px 0px; - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_rightsidebar.scss b/MyOffice.SPA/src/assets/scss/components/_rightsidebar.scss deleted file mode 100644 index e2a555d..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_rightsidebar.scss +++ /dev/null @@ -1,30 +0,0 @@ -.rightSetting { - padding: 20px 25px 0px 25px; - p { - font-weight: bold; - margin: 0; - border-bottom: 1px solid #eee; - font-size: 12px; - text-align: left; - } - .mat-button-toggle-checked { - background-color: #6e68c1; - color: #ffffff !important; - } - .mat-button-toggle { - width: 70px; - height: 30px; - font-size: 14px; - } - .mat-button-toggle-button { - height: 100%; - display: flex; - align-items: center; - justify-content: center; - } - .mat-button-toggle-appearance-standard .mat-button-toggle-label-content { - line-height: 30px !important; - padding: 0 12px !important; - text-align: center; - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_searchbar.scss b/MyOffice.SPA/src/assets/scss/components/_searchbar.scss deleted file mode 100644 index 26c5770..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_searchbar.scss +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Document : _noUISlider.scss - * Author : RedStar Template - * Description: This scss file for noUISlider component style classes - */ -%extend_search { - outline: none; - opacity: 1; - margin-left: -43px; -} - -.search-box { - overflow: hidden; - width: 270px; - vertical-align: middle; - white-space: nowrap; - input { - &#search { - width: 250px; - height: 40px; - background: rgb(255, 255, 255); - border: none; - font-size: 10pt; - float: left; - color: #fff; - padding-left: 15px; - margin-bottom: 0; - margin-top: 10px; - border-radius: 50px; - &:-moz-placeholder { - color: #65737e; - } - &:-ms-input-placeholder { - color: #65737e; - } - } - &#search::-webkit-input-placeholder { - color: #65737e; - } - &#search::-moz-placeholder { - color: #65737e; - } - } - button.icon { - border: none; - background: transparent; - height: 50px; - width: 0px; - color: #4f5b66; - opacity: 0; - font-size: 10pt; - transition: all 0.55s ease; - - .fa { - font-size: 18px; - } - } - &:hover button.icon { - @extend %extend_search; - &:hover { - background: transparent; - } - } - &:active button.icon { - @extend %extend_search; - } - &:focus button.icon { - @extend %extend_search; - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_settingSidebar.scss b/MyOffice.SPA/src/assets/scss/components/_settingSidebar.scss deleted file mode 100644 index a90e1d1..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_settingSidebar.scss +++ /dev/null @@ -1,197 +0,0 @@ -.settingSidebar { - background: #fff; - position: fixed; - height: 100%; - width: 280px; - top: 62px; - right: -280px; - z-index: 999; - transition: 0.3s ease-in; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.16), 0 2px 10px rgba(0, 0, 0, 0.12); - - .settingPanelToggle { - background: #6777ef; - padding: 13px 13px; - color: #fff; - position: absolute; - top: 30%; - left: -40px; - width: 40px; - border-radius: 10px 0 0 10px; - .setting-sidebar-icon .feather { - height: 17px; - width: 17px; - } - } - - &.showSettingPanel { - right: 0; - } - - .settingSidebar-body { - position: relative; - height: 100%; - } - - .settingSidebar-tab { - display: flex; - - .nav-item { - width: 33.33%; - text-align: center; - - .nav-link { - padding: 15px 12px; - color: #6a7a8c; - border-bottom: 3px solid transparent; - - &.active { - border-bottom: 3px solid #2962ff; - color: #2962ff; - } - - &:hover { - border-bottom: 3px solid #2962ff; - color: #2962ff; - } - } - } - } - - ul.choose-theme li { - display: inline-block; - - &:hover { - cursor: pointer; - } - } - - ul.choose-theme li div { - border-radius: 15px; - display: inline-block; - vertical-align: middle; - height: 25px; - width: 25px; - overflow: hidden; - position: relative; - margin: 4px; - } - - ul.choose-theme li div.purple { - background: #6777ef; - -webkit-box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - } - - ul.choose-theme li div.orange { - background: #ffa117; - -webkit-box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - } - - ul.choose-theme li div.cyan { - background: #3dc7be; - -webkit-box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - } - - ul.choose-theme li div.green { - background: #4caf4f; - -webkit-box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - } - - ul.choose-theme li div.red { - background: #ea5455; - -webkit-box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - } - - ul.choose-theme li div.white { - background: #ece8e8; - -webkit-box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - } - - ul.choose-theme li div.black { - background: #343a40; - -webkit-box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - } - ul.choose-theme li div.blue { - background: #03a9f3; - -webkit-box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - } - - ul.choose-theme li.active div::after { - content: "\f00c"; - color: #fff; - top: 4px; - left: 7px; - font-family: "Font Awesome 5 Free"; - font-weight: 900; - font-size: 12px; - position: absolute; - -webkit-transition: 0.5s; - transition: 0.5s; - } - - .setting-panel-header { - display: block; - padding: 15px 20px; - color: #212529; - font-size: 15px; - border: 1px solid #eae9e9; - background: #e9ecef; - } - - .disk-server-setting { - .progress { - height: 8px; - } - - p { - font-weight: bold; - margin: 0; - border-bottom: 1px solid #eee; - font-size: 14px; - text-align: left; - padding-bottom: 5px; - } - } - - .rt-sidebar-last-ele { - margin-bottom: 70px !important; - } -} -.hiddenradio { - padding: 0px 20px 0px 0px; - margin: 0px 20px 0px 0px; -} -.hiddenradio [type="radio"] { - position: absolute; - opacity: 0; - width: 0; - height: 0; -} - -/* IMAGE STYLES */ -.hiddenradio [type="radio"] + img { - cursor: pointer; - height: auto; - width: 100%; - border: 3px solid #d5e0ec; -} - -/* CHECKED STYLES */ -.hiddenradio [type="radio"]:checked + img, -.hiddenradio label.layout-selected img { - outline: 2px solid #6777ef; -} - -@media only screen and (max-width: 1024px) { - .settingSidebar { - display: none; - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_switch.scss b/MyOffice.SPA/src/assets/scss/components/_switch.scss deleted file mode 100644 index 6324216..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_switch.scss +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Document : _switch.scss - * Author : RedStar Template - * Description: This scss file switch button style classes - */ -.switch { - label { - font-weight: normal; - font-size: 13px; - - .lever { - margin: 0 14px; - } - - input[type="checkbox"] { - &:checked { - @each $key, $val in $colors { - &:not(:disabled) { - ~ .lever.switch-col-#{$key} { - &:active { - &:after { - box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), - 0 0 0 15px rgba($val, 0.1); - } - } - } - } - - + .lever.switch-col-#{$key} { - background-color: rgba($val, 0.5); - - &:after { - background-color: $val; - } - } - } - } - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_thumbnails.scss b/MyOffice.SPA/src/assets/scss/components/_thumbnails.scss deleted file mode 100644 index b229ed0..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_thumbnails.scss +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Document : _thumbnail.scss - * Author : RedStar Template - * Description: This scss file for thumbnail style classes - */ -.thumbnail { - @include border-radius(0); - - p:not(button) { - color: #999999; - font-size: 14px; - } - - h3 { - font-weight: bold; - font-size: 17px; - } -} diff --git a/MyOffice.SPA/src/assets/scss/components/_todo.scss b/MyOffice.SPA/src/assets/scss/components/_todo.scss deleted file mode 100644 index fa5536f..0000000 --- a/MyOffice.SPA/src/assets/scss/components/_todo.scss +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Document : _todo.scss - * Author : RedStar Template - * Description: This scss file for todo style classes - */ -.to-do-list { - padding-left: 0; - margin-top: -10px; - font-size: 12px; - min-height: 311px; - float: left; - width: 100%; - li { - padding: 15px 0; - border-radius: 3px; - position: relative; - cursor: move; - list-style: none; - font-size: 14px; - background: #fff; - border-bottom: 1px dotted rgba(0, 0, 0, 0.2); - p { - margin: 0; - padding-left: 50px; - } - .todo-check input[type="checkbox"] { - visibility: hidden; - } - } -} -.todo-actionlist { - position: absolute; - right: -5px; - top: 22px; - a { - height: 24px; - width: 24px; - display: inline-block; - float: left; - i { - height: 24px; - width: 24px; - display: inline-block; - text-align: center; - line-height: 24px; - color: #ccc; - } - &:hover i { - color: #666; - } - } -} -.line-through { - text-decoration: line-through; -} -.todo-action-bar { - margin-top: 20px; -} -.todo-check { - width: 20px; - position: relative; - margin-right: 10px; - margin-left: 10px; - input[type="checkbox"] { - visibility: hidden; - } - label { - cursor: pointer; - position: absolute; - width: 20px; - height: 20px; - top: 0; - left: 0; - border-radius: 2px; - } -} -.todo-done i { - font-size: 14px; -} -.todo-remove i { - font-size: 10px; -} -.inbox-small-cells .todo-check input[type="checkbox"] { - visibility: hidden; -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_animated.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_animated.scss deleted file mode 100644 index 7c7c0e1..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_animated.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Animated Icons -// -------------------------- - -.#{$fa-css-prefix}-spin { - animation: fa-spin 2s infinite linear; -} - -.#{$fa-css-prefix}-pulse { - animation: fa-spin 1s infinite steps(8); -} - -@keyframes fa-spin { - 0% { - transform: rotate(0deg); - } - - 100% { - transform: rotate(360deg); - } -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_bordered-pulled.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_bordered-pulled.scss deleted file mode 100644 index c8c4274..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_bordered-pulled.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.#{$fa-css-prefix}-border { - border: solid .08em $fa-border-color; - border-radius: .1em; - padding: .2em .25em .15em; -} - -.#{$fa-css-prefix}-pull-left { float: left; } -.#{$fa-css-prefix}-pull-right { float: right; } - -.#{$fa-css-prefix}, -.fas, -.far, -.fal, -.fab { - &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } - &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_core.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_core.scss deleted file mode 100644 index cbd4cf7..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_core.scss +++ /dev/null @@ -1,21 +0,0 @@ -// Base Class Definition -// ------------------------- - -.#{$fa-css-prefix}, -.fas, -.far, -.fal, -.fad, -.fab { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; -} - -%fa-icon { - @include fa-icon; -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_fixed-width.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_fixed-width.scss deleted file mode 100644 index 970641f..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_fixed-width.scss +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.#{$fa-css-prefix}-fw { - text-align: center; - width: $fa-fw-width; -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_icons.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_icons.scss deleted file mode 100644 index fa3ac07..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_icons.scss +++ /dev/null @@ -1,1451 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen -readers do not read off random characters that represent icons */ - -.#{$fa-css-prefix}-500px:before { content: fa-content($fa-var-500px); } -.#{$fa-css-prefix}-accessible-icon:before { content: fa-content($fa-var-accessible-icon); } -.#{$fa-css-prefix}-accusoft:before { content: fa-content($fa-var-accusoft); } -.#{$fa-css-prefix}-acquisitions-incorporated:before { content: fa-content($fa-var-acquisitions-incorporated); } -.#{$fa-css-prefix}-ad:before { content: fa-content($fa-var-ad); } -.#{$fa-css-prefix}-address-book:before { content: fa-content($fa-var-address-book); } -.#{$fa-css-prefix}-address-card:before { content: fa-content($fa-var-address-card); } -.#{$fa-css-prefix}-adjust:before { content: fa-content($fa-var-adjust); } -.#{$fa-css-prefix}-adn:before { content: fa-content($fa-var-adn); } -.#{$fa-css-prefix}-adobe:before { content: fa-content($fa-var-adobe); } -.#{$fa-css-prefix}-adversal:before { content: fa-content($fa-var-adversal); } -.#{$fa-css-prefix}-affiliatetheme:before { content: fa-content($fa-var-affiliatetheme); } -.#{$fa-css-prefix}-air-freshener:before { content: fa-content($fa-var-air-freshener); } -.#{$fa-css-prefix}-airbnb:before { content: fa-content($fa-var-airbnb); } -.#{$fa-css-prefix}-algolia:before { content: fa-content($fa-var-algolia); } -.#{$fa-css-prefix}-align-center:before { content: fa-content($fa-var-align-center); } -.#{$fa-css-prefix}-align-justify:before { content: fa-content($fa-var-align-justify); } -.#{$fa-css-prefix}-align-left:before { content: fa-content($fa-var-align-left); } -.#{$fa-css-prefix}-align-right:before { content: fa-content($fa-var-align-right); } -.#{$fa-css-prefix}-alipay:before { content: fa-content($fa-var-alipay); } -.#{$fa-css-prefix}-allergies:before { content: fa-content($fa-var-allergies); } -.#{$fa-css-prefix}-amazon:before { content: fa-content($fa-var-amazon); } -.#{$fa-css-prefix}-amazon-pay:before { content: fa-content($fa-var-amazon-pay); } -.#{$fa-css-prefix}-ambulance:before { content: fa-content($fa-var-ambulance); } -.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: fa-content($fa-var-american-sign-language-interpreting); } -.#{$fa-css-prefix}-amilia:before { content: fa-content($fa-var-amilia); } -.#{$fa-css-prefix}-anchor:before { content: fa-content($fa-var-anchor); } -.#{$fa-css-prefix}-android:before { content: fa-content($fa-var-android); } -.#{$fa-css-prefix}-angellist:before { content: fa-content($fa-var-angellist); } -.#{$fa-css-prefix}-angle-double-down:before { content: fa-content($fa-var-angle-double-down); } -.#{$fa-css-prefix}-angle-double-left:before { content: fa-content($fa-var-angle-double-left); } -.#{$fa-css-prefix}-angle-double-right:before { content: fa-content($fa-var-angle-double-right); } -.#{$fa-css-prefix}-angle-double-up:before { content: fa-content($fa-var-angle-double-up); } -.#{$fa-css-prefix}-angle-down:before { content: fa-content($fa-var-angle-down); } -.#{$fa-css-prefix}-angle-left:before { content: fa-content($fa-var-angle-left); } -.#{$fa-css-prefix}-angle-right:before { content: fa-content($fa-var-angle-right); } -.#{$fa-css-prefix}-angle-up:before { content: fa-content($fa-var-angle-up); } -.#{$fa-css-prefix}-angry:before { content: fa-content($fa-var-angry); } -.#{$fa-css-prefix}-angrycreative:before { content: fa-content($fa-var-angrycreative); } -.#{$fa-css-prefix}-angular:before { content: fa-content($fa-var-angular); } -.#{$fa-css-prefix}-ankh:before { content: fa-content($fa-var-ankh); } -.#{$fa-css-prefix}-app-store:before { content: fa-content($fa-var-app-store); } -.#{$fa-css-prefix}-app-store-ios:before { content: fa-content($fa-var-app-store-ios); } -.#{$fa-css-prefix}-apper:before { content: fa-content($fa-var-apper); } -.#{$fa-css-prefix}-apple:before { content: fa-content($fa-var-apple); } -.#{$fa-css-prefix}-apple-alt:before { content: fa-content($fa-var-apple-alt); } -.#{$fa-css-prefix}-apple-pay:before { content: fa-content($fa-var-apple-pay); } -.#{$fa-css-prefix}-archive:before { content: fa-content($fa-var-archive); } -.#{$fa-css-prefix}-archway:before { content: fa-content($fa-var-archway); } -.#{$fa-css-prefix}-arrow-alt-circle-down:before { content: fa-content($fa-var-arrow-alt-circle-down); } -.#{$fa-css-prefix}-arrow-alt-circle-left:before { content: fa-content($fa-var-arrow-alt-circle-left); } -.#{$fa-css-prefix}-arrow-alt-circle-right:before { content: fa-content($fa-var-arrow-alt-circle-right); } -.#{$fa-css-prefix}-arrow-alt-circle-up:before { content: fa-content($fa-var-arrow-alt-circle-up); } -.#{$fa-css-prefix}-arrow-circle-down:before { content: fa-content($fa-var-arrow-circle-down); } -.#{$fa-css-prefix}-arrow-circle-left:before { content: fa-content($fa-var-arrow-circle-left); } -.#{$fa-css-prefix}-arrow-circle-right:before { content: fa-content($fa-var-arrow-circle-right); } -.#{$fa-css-prefix}-arrow-circle-up:before { content: fa-content($fa-var-arrow-circle-up); } -.#{$fa-css-prefix}-arrow-down:before { content: fa-content($fa-var-arrow-down); } -.#{$fa-css-prefix}-arrow-left:before { content: fa-content($fa-var-arrow-left); } -.#{$fa-css-prefix}-arrow-right:before { content: fa-content($fa-var-arrow-right); } -.#{$fa-css-prefix}-arrow-up:before { content: fa-content($fa-var-arrow-up); } -.#{$fa-css-prefix}-arrows-alt:before { content: fa-content($fa-var-arrows-alt); } -.#{$fa-css-prefix}-arrows-alt-h:before { content: fa-content($fa-var-arrows-alt-h); } -.#{$fa-css-prefix}-arrows-alt-v:before { content: fa-content($fa-var-arrows-alt-v); } -.#{$fa-css-prefix}-artstation:before { content: fa-content($fa-var-artstation); } -.#{$fa-css-prefix}-assistive-listening-systems:before { content: fa-content($fa-var-assistive-listening-systems); } -.#{$fa-css-prefix}-asterisk:before { content: fa-content($fa-var-asterisk); } -.#{$fa-css-prefix}-asymmetrik:before { content: fa-content($fa-var-asymmetrik); } -.#{$fa-css-prefix}-at:before { content: fa-content($fa-var-at); } -.#{$fa-css-prefix}-atlas:before { content: fa-content($fa-var-atlas); } -.#{$fa-css-prefix}-atlassian:before { content: fa-content($fa-var-atlassian); } -.#{$fa-css-prefix}-atom:before { content: fa-content($fa-var-atom); } -.#{$fa-css-prefix}-audible:before { content: fa-content($fa-var-audible); } -.#{$fa-css-prefix}-audio-description:before { content: fa-content($fa-var-audio-description); } -.#{$fa-css-prefix}-autoprefixer:before { content: fa-content($fa-var-autoprefixer); } -.#{$fa-css-prefix}-avianex:before { content: fa-content($fa-var-avianex); } -.#{$fa-css-prefix}-aviato:before { content: fa-content($fa-var-aviato); } -.#{$fa-css-prefix}-award:before { content: fa-content($fa-var-award); } -.#{$fa-css-prefix}-aws:before { content: fa-content($fa-var-aws); } -.#{$fa-css-prefix}-baby:before { content: fa-content($fa-var-baby); } -.#{$fa-css-prefix}-baby-carriage:before { content: fa-content($fa-var-baby-carriage); } -.#{$fa-css-prefix}-backspace:before { content: fa-content($fa-var-backspace); } -.#{$fa-css-prefix}-backward:before { content: fa-content($fa-var-backward); } -.#{$fa-css-prefix}-bacon:before { content: fa-content($fa-var-bacon); } -.#{$fa-css-prefix}-bacteria:before { content: fa-content($fa-var-bacteria); } -.#{$fa-css-prefix}-bacterium:before { content: fa-content($fa-var-bacterium); } -.#{$fa-css-prefix}-bahai:before { content: fa-content($fa-var-bahai); } -.#{$fa-css-prefix}-balance-scale:before { content: fa-content($fa-var-balance-scale); } -.#{$fa-css-prefix}-balance-scale-left:before { content: fa-content($fa-var-balance-scale-left); } -.#{$fa-css-prefix}-balance-scale-right:before { content: fa-content($fa-var-balance-scale-right); } -.#{$fa-css-prefix}-ban:before { content: fa-content($fa-var-ban); } -.#{$fa-css-prefix}-band-aid:before { content: fa-content($fa-var-band-aid); } -.#{$fa-css-prefix}-bandcamp:before { content: fa-content($fa-var-bandcamp); } -.#{$fa-css-prefix}-barcode:before { content: fa-content($fa-var-barcode); } -.#{$fa-css-prefix}-bars:before { content: fa-content($fa-var-bars); } -.#{$fa-css-prefix}-baseball-ball:before { content: fa-content($fa-var-baseball-ball); } -.#{$fa-css-prefix}-basketball-ball:before { content: fa-content($fa-var-basketball-ball); } -.#{$fa-css-prefix}-bath:before { content: fa-content($fa-var-bath); } -.#{$fa-css-prefix}-battery-empty:before { content: fa-content($fa-var-battery-empty); } -.#{$fa-css-prefix}-battery-full:before { content: fa-content($fa-var-battery-full); } -.#{$fa-css-prefix}-battery-half:before { content: fa-content($fa-var-battery-half); } -.#{$fa-css-prefix}-battery-quarter:before { content: fa-content($fa-var-battery-quarter); } -.#{$fa-css-prefix}-battery-three-quarters:before { content: fa-content($fa-var-battery-three-quarters); } -.#{$fa-css-prefix}-battle-net:before { content: fa-content($fa-var-battle-net); } -.#{$fa-css-prefix}-bed:before { content: fa-content($fa-var-bed); } -.#{$fa-css-prefix}-beer:before { content: fa-content($fa-var-beer); } -.#{$fa-css-prefix}-behance:before { content: fa-content($fa-var-behance); } -.#{$fa-css-prefix}-behance-square:before { content: fa-content($fa-var-behance-square); } -.#{$fa-css-prefix}-bell:before { content: fa-content($fa-var-bell); } -.#{$fa-css-prefix}-bell-slash:before { content: fa-content($fa-var-bell-slash); } -.#{$fa-css-prefix}-bezier-curve:before { content: fa-content($fa-var-bezier-curve); } -.#{$fa-css-prefix}-bible:before { content: fa-content($fa-var-bible); } -.#{$fa-css-prefix}-bicycle:before { content: fa-content($fa-var-bicycle); } -.#{$fa-css-prefix}-biking:before { content: fa-content($fa-var-biking); } -.#{$fa-css-prefix}-bimobject:before { content: fa-content($fa-var-bimobject); } -.#{$fa-css-prefix}-binoculars:before { content: fa-content($fa-var-binoculars); } -.#{$fa-css-prefix}-biohazard:before { content: fa-content($fa-var-biohazard); } -.#{$fa-css-prefix}-birthday-cake:before { content: fa-content($fa-var-birthday-cake); } -.#{$fa-css-prefix}-bitbucket:before { content: fa-content($fa-var-bitbucket); } -.#{$fa-css-prefix}-bitcoin:before { content: fa-content($fa-var-bitcoin); } -.#{$fa-css-prefix}-bity:before { content: fa-content($fa-var-bity); } -.#{$fa-css-prefix}-black-tie:before { content: fa-content($fa-var-black-tie); } -.#{$fa-css-prefix}-blackberry:before { content: fa-content($fa-var-blackberry); } -.#{$fa-css-prefix}-blender:before { content: fa-content($fa-var-blender); } -.#{$fa-css-prefix}-blender-phone:before { content: fa-content($fa-var-blender-phone); } -.#{$fa-css-prefix}-blind:before { content: fa-content($fa-var-blind); } -.#{$fa-css-prefix}-blog:before { content: fa-content($fa-var-blog); } -.#{$fa-css-prefix}-blogger:before { content: fa-content($fa-var-blogger); } -.#{$fa-css-prefix}-blogger-b:before { content: fa-content($fa-var-blogger-b); } -.#{$fa-css-prefix}-bluetooth:before { content: fa-content($fa-var-bluetooth); } -.#{$fa-css-prefix}-bluetooth-b:before { content: fa-content($fa-var-bluetooth-b); } -.#{$fa-css-prefix}-bold:before { content: fa-content($fa-var-bold); } -.#{$fa-css-prefix}-bolt:before { content: fa-content($fa-var-bolt); } -.#{$fa-css-prefix}-bomb:before { content: fa-content($fa-var-bomb); } -.#{$fa-css-prefix}-bone:before { content: fa-content($fa-var-bone); } -.#{$fa-css-prefix}-bong:before { content: fa-content($fa-var-bong); } -.#{$fa-css-prefix}-book:before { content: fa-content($fa-var-book); } -.#{$fa-css-prefix}-book-dead:before { content: fa-content($fa-var-book-dead); } -.#{$fa-css-prefix}-book-medical:before { content: fa-content($fa-var-book-medical); } -.#{$fa-css-prefix}-book-open:before { content: fa-content($fa-var-book-open); } -.#{$fa-css-prefix}-book-reader:before { content: fa-content($fa-var-book-reader); } -.#{$fa-css-prefix}-bookmark:before { content: fa-content($fa-var-bookmark); } -.#{$fa-css-prefix}-bootstrap:before { content: fa-content($fa-var-bootstrap); } -.#{$fa-css-prefix}-border-all:before { content: fa-content($fa-var-border-all); } -.#{$fa-css-prefix}-border-none:before { content: fa-content($fa-var-border-none); } -.#{$fa-css-prefix}-border-style:before { content: fa-content($fa-var-border-style); } -.#{$fa-css-prefix}-bowling-ball:before { content: fa-content($fa-var-bowling-ball); } -.#{$fa-css-prefix}-box:before { content: fa-content($fa-var-box); } -.#{$fa-css-prefix}-box-open:before { content: fa-content($fa-var-box-open); } -.#{$fa-css-prefix}-box-tissue:before { content: fa-content($fa-var-box-tissue); } -.#{$fa-css-prefix}-boxes:before { content: fa-content($fa-var-boxes); } -.#{$fa-css-prefix}-braille:before { content: fa-content($fa-var-braille); } -.#{$fa-css-prefix}-brain:before { content: fa-content($fa-var-brain); } -.#{$fa-css-prefix}-bread-slice:before { content: fa-content($fa-var-bread-slice); } -.#{$fa-css-prefix}-briefcase:before { content: fa-content($fa-var-briefcase); } -.#{$fa-css-prefix}-briefcase-medical:before { content: fa-content($fa-var-briefcase-medical); } -.#{$fa-css-prefix}-broadcast-tower:before { content: fa-content($fa-var-broadcast-tower); } -.#{$fa-css-prefix}-broom:before { content: fa-content($fa-var-broom); } -.#{$fa-css-prefix}-brush:before { content: fa-content($fa-var-brush); } -.#{$fa-css-prefix}-btc:before { content: fa-content($fa-var-btc); } -.#{$fa-css-prefix}-buffer:before { content: fa-content($fa-var-buffer); } -.#{$fa-css-prefix}-bug:before { content: fa-content($fa-var-bug); } -.#{$fa-css-prefix}-building:before { content: fa-content($fa-var-building); } -.#{$fa-css-prefix}-bullhorn:before { content: fa-content($fa-var-bullhorn); } -.#{$fa-css-prefix}-bullseye:before { content: fa-content($fa-var-bullseye); } -.#{$fa-css-prefix}-burn:before { content: fa-content($fa-var-burn); } -.#{$fa-css-prefix}-buromobelexperte:before { content: fa-content($fa-var-buromobelexperte); } -.#{$fa-css-prefix}-bus:before { content: fa-content($fa-var-bus); } -.#{$fa-css-prefix}-bus-alt:before { content: fa-content($fa-var-bus-alt); } -.#{$fa-css-prefix}-business-time:before { content: fa-content($fa-var-business-time); } -.#{$fa-css-prefix}-buy-n-large:before { content: fa-content($fa-var-buy-n-large); } -.#{$fa-css-prefix}-buysellads:before { content: fa-content($fa-var-buysellads); } -.#{$fa-css-prefix}-calculator:before { content: fa-content($fa-var-calculator); } -.#{$fa-css-prefix}-calendar:before { content: fa-content($fa-var-calendar); } -.#{$fa-css-prefix}-calendar-alt:before { content: fa-content($fa-var-calendar-alt); } -.#{$fa-css-prefix}-calendar-check:before { content: fa-content($fa-var-calendar-check); } -.#{$fa-css-prefix}-calendar-day:before { content: fa-content($fa-var-calendar-day); } -.#{$fa-css-prefix}-calendar-minus:before { content: fa-content($fa-var-calendar-minus); } -.#{$fa-css-prefix}-calendar-plus:before { content: fa-content($fa-var-calendar-plus); } -.#{$fa-css-prefix}-calendar-times:before { content: fa-content($fa-var-calendar-times); } -.#{$fa-css-prefix}-calendar-week:before { content: fa-content($fa-var-calendar-week); } -.#{$fa-css-prefix}-camera:before { content: fa-content($fa-var-camera); } -.#{$fa-css-prefix}-camera-retro:before { content: fa-content($fa-var-camera-retro); } -.#{$fa-css-prefix}-campground:before { content: fa-content($fa-var-campground); } -.#{$fa-css-prefix}-canadian-maple-leaf:before { content: fa-content($fa-var-canadian-maple-leaf); } -.#{$fa-css-prefix}-candy-cane:before { content: fa-content($fa-var-candy-cane); } -.#{$fa-css-prefix}-cannabis:before { content: fa-content($fa-var-cannabis); } -.#{$fa-css-prefix}-capsules:before { content: fa-content($fa-var-capsules); } -.#{$fa-css-prefix}-car:before { content: fa-content($fa-var-car); } -.#{$fa-css-prefix}-car-alt:before { content: fa-content($fa-var-car-alt); } -.#{$fa-css-prefix}-car-battery:before { content: fa-content($fa-var-car-battery); } -.#{$fa-css-prefix}-car-crash:before { content: fa-content($fa-var-car-crash); } -.#{$fa-css-prefix}-car-side:before { content: fa-content($fa-var-car-side); } -.#{$fa-css-prefix}-caravan:before { content: fa-content($fa-var-caravan); } -.#{$fa-css-prefix}-caret-down:before { content: fa-content($fa-var-caret-down); } -.#{$fa-css-prefix}-caret-left:before { content: fa-content($fa-var-caret-left); } -.#{$fa-css-prefix}-caret-right:before { content: fa-content($fa-var-caret-right); } -.#{$fa-css-prefix}-caret-square-down:before { content: fa-content($fa-var-caret-square-down); } -.#{$fa-css-prefix}-caret-square-left:before { content: fa-content($fa-var-caret-square-left); } -.#{$fa-css-prefix}-caret-square-right:before { content: fa-content($fa-var-caret-square-right); } -.#{$fa-css-prefix}-caret-square-up:before { content: fa-content($fa-var-caret-square-up); } -.#{$fa-css-prefix}-caret-up:before { content: fa-content($fa-var-caret-up); } -.#{$fa-css-prefix}-carrot:before { content: fa-content($fa-var-carrot); } -.#{$fa-css-prefix}-cart-arrow-down:before { content: fa-content($fa-var-cart-arrow-down); } -.#{$fa-css-prefix}-cart-plus:before { content: fa-content($fa-var-cart-plus); } -.#{$fa-css-prefix}-cash-register:before { content: fa-content($fa-var-cash-register); } -.#{$fa-css-prefix}-cat:before { content: fa-content($fa-var-cat); } -.#{$fa-css-prefix}-cc-amazon-pay:before { content: fa-content($fa-var-cc-amazon-pay); } -.#{$fa-css-prefix}-cc-amex:before { content: fa-content($fa-var-cc-amex); } -.#{$fa-css-prefix}-cc-apple-pay:before { content: fa-content($fa-var-cc-apple-pay); } -.#{$fa-css-prefix}-cc-diners-club:before { content: fa-content($fa-var-cc-diners-club); } -.#{$fa-css-prefix}-cc-discover:before { content: fa-content($fa-var-cc-discover); } -.#{$fa-css-prefix}-cc-jcb:before { content: fa-content($fa-var-cc-jcb); } -.#{$fa-css-prefix}-cc-mastercard:before { content: fa-content($fa-var-cc-mastercard); } -.#{$fa-css-prefix}-cc-paypal:before { content: fa-content($fa-var-cc-paypal); } -.#{$fa-css-prefix}-cc-stripe:before { content: fa-content($fa-var-cc-stripe); } -.#{$fa-css-prefix}-cc-visa:before { content: fa-content($fa-var-cc-visa); } -.#{$fa-css-prefix}-centercode:before { content: fa-content($fa-var-centercode); } -.#{$fa-css-prefix}-centos:before { content: fa-content($fa-var-centos); } -.#{$fa-css-prefix}-certificate:before { content: fa-content($fa-var-certificate); } -.#{$fa-css-prefix}-chair:before { content: fa-content($fa-var-chair); } -.#{$fa-css-prefix}-chalkboard:before { content: fa-content($fa-var-chalkboard); } -.#{$fa-css-prefix}-chalkboard-teacher:before { content: fa-content($fa-var-chalkboard-teacher); } -.#{$fa-css-prefix}-charging-station:before { content: fa-content($fa-var-charging-station); } -.#{$fa-css-prefix}-chart-area:before { content: fa-content($fa-var-chart-area); } -.#{$fa-css-prefix}-chart-bar:before { content: fa-content($fa-var-chart-bar); } -.#{$fa-css-prefix}-chart-line:before { content: fa-content($fa-var-chart-line); } -.#{$fa-css-prefix}-chart-pie:before { content: fa-content($fa-var-chart-pie); } -.#{$fa-css-prefix}-check:before { content: fa-content($fa-var-check); } -.#{$fa-css-prefix}-check-circle:before { content: fa-content($fa-var-check-circle); } -.#{$fa-css-prefix}-check-double:before { content: fa-content($fa-var-check-double); } -.#{$fa-css-prefix}-check-square:before { content: fa-content($fa-var-check-square); } -.#{$fa-css-prefix}-cheese:before { content: fa-content($fa-var-cheese); } -.#{$fa-css-prefix}-chess:before { content: fa-content($fa-var-chess); } -.#{$fa-css-prefix}-chess-bishop:before { content: fa-content($fa-var-chess-bishop); } -.#{$fa-css-prefix}-chess-board:before { content: fa-content($fa-var-chess-board); } -.#{$fa-css-prefix}-chess-king:before { content: fa-content($fa-var-chess-king); } -.#{$fa-css-prefix}-chess-knight:before { content: fa-content($fa-var-chess-knight); } -.#{$fa-css-prefix}-chess-pawn:before { content: fa-content($fa-var-chess-pawn); } -.#{$fa-css-prefix}-chess-queen:before { content: fa-content($fa-var-chess-queen); } -.#{$fa-css-prefix}-chess-rook:before { content: fa-content($fa-var-chess-rook); } -.#{$fa-css-prefix}-chevron-circle-down:before { content: fa-content($fa-var-chevron-circle-down); } -.#{$fa-css-prefix}-chevron-circle-left:before { content: fa-content($fa-var-chevron-circle-left); } -.#{$fa-css-prefix}-chevron-circle-right:before { content: fa-content($fa-var-chevron-circle-right); } -.#{$fa-css-prefix}-chevron-circle-up:before { content: fa-content($fa-var-chevron-circle-up); } -.#{$fa-css-prefix}-chevron-down:before { content: fa-content($fa-var-chevron-down); } -.#{$fa-css-prefix}-chevron-left:before { content: fa-content($fa-var-chevron-left); } -.#{$fa-css-prefix}-chevron-right:before { content: fa-content($fa-var-chevron-right); } -.#{$fa-css-prefix}-chevron-up:before { content: fa-content($fa-var-chevron-up); } -.#{$fa-css-prefix}-child:before { content: fa-content($fa-var-child); } -.#{$fa-css-prefix}-chrome:before { content: fa-content($fa-var-chrome); } -.#{$fa-css-prefix}-chromecast:before { content: fa-content($fa-var-chromecast); } -.#{$fa-css-prefix}-church:before { content: fa-content($fa-var-church); } -.#{$fa-css-prefix}-circle:before { content: fa-content($fa-var-circle); } -.#{$fa-css-prefix}-circle-notch:before { content: fa-content($fa-var-circle-notch); } -.#{$fa-css-prefix}-city:before { content: fa-content($fa-var-city); } -.#{$fa-css-prefix}-clinic-medical:before { content: fa-content($fa-var-clinic-medical); } -.#{$fa-css-prefix}-clipboard:before { content: fa-content($fa-var-clipboard); } -.#{$fa-css-prefix}-clipboard-check:before { content: fa-content($fa-var-clipboard-check); } -.#{$fa-css-prefix}-clipboard-list:before { content: fa-content($fa-var-clipboard-list); } -.#{$fa-css-prefix}-clock:before { content: fa-content($fa-var-clock); } -.#{$fa-css-prefix}-clone:before { content: fa-content($fa-var-clone); } -.#{$fa-css-prefix}-closed-captioning:before { content: fa-content($fa-var-closed-captioning); } -.#{$fa-css-prefix}-cloud:before { content: fa-content($fa-var-cloud); } -.#{$fa-css-prefix}-cloud-download-alt:before { content: fa-content($fa-var-cloud-download-alt); } -.#{$fa-css-prefix}-cloud-meatball:before { content: fa-content($fa-var-cloud-meatball); } -.#{$fa-css-prefix}-cloud-moon:before { content: fa-content($fa-var-cloud-moon); } -.#{$fa-css-prefix}-cloud-moon-rain:before { content: fa-content($fa-var-cloud-moon-rain); } -.#{$fa-css-prefix}-cloud-rain:before { content: fa-content($fa-var-cloud-rain); } -.#{$fa-css-prefix}-cloud-showers-heavy:before { content: fa-content($fa-var-cloud-showers-heavy); } -.#{$fa-css-prefix}-cloud-sun:before { content: fa-content($fa-var-cloud-sun); } -.#{$fa-css-prefix}-cloud-sun-rain:before { content: fa-content($fa-var-cloud-sun-rain); } -.#{$fa-css-prefix}-cloud-upload-alt:before { content: fa-content($fa-var-cloud-upload-alt); } -.#{$fa-css-prefix}-cloudscale:before { content: fa-content($fa-var-cloudscale); } -.#{$fa-css-prefix}-cloudsmith:before { content: fa-content($fa-var-cloudsmith); } -.#{$fa-css-prefix}-cloudversify:before { content: fa-content($fa-var-cloudversify); } -.#{$fa-css-prefix}-cocktail:before { content: fa-content($fa-var-cocktail); } -.#{$fa-css-prefix}-code:before { content: fa-content($fa-var-code); } -.#{$fa-css-prefix}-code-branch:before { content: fa-content($fa-var-code-branch); } -.#{$fa-css-prefix}-codepen:before { content: fa-content($fa-var-codepen); } -.#{$fa-css-prefix}-codiepie:before { content: fa-content($fa-var-codiepie); } -.#{$fa-css-prefix}-coffee:before { content: fa-content($fa-var-coffee); } -.#{$fa-css-prefix}-cog:before { content: fa-content($fa-var-cog); } -.#{$fa-css-prefix}-cogs:before { content: fa-content($fa-var-cogs); } -.#{$fa-css-prefix}-coins:before { content: fa-content($fa-var-coins); } -.#{$fa-css-prefix}-columns:before { content: fa-content($fa-var-columns); } -.#{$fa-css-prefix}-comment:before { content: fa-content($fa-var-comment); } -.#{$fa-css-prefix}-comment-alt:before { content: fa-content($fa-var-comment-alt); } -.#{$fa-css-prefix}-comment-dollar:before { content: fa-content($fa-var-comment-dollar); } -.#{$fa-css-prefix}-comment-dots:before { content: fa-content($fa-var-comment-dots); } -.#{$fa-css-prefix}-comment-medical:before { content: fa-content($fa-var-comment-medical); } -.#{$fa-css-prefix}-comment-slash:before { content: fa-content($fa-var-comment-slash); } -.#{$fa-css-prefix}-comments:before { content: fa-content($fa-var-comments); } -.#{$fa-css-prefix}-comments-dollar:before { content: fa-content($fa-var-comments-dollar); } -.#{$fa-css-prefix}-compact-disc:before { content: fa-content($fa-var-compact-disc); } -.#{$fa-css-prefix}-compass:before { content: fa-content($fa-var-compass); } -.#{$fa-css-prefix}-compress:before { content: fa-content($fa-var-compress); } -.#{$fa-css-prefix}-compress-alt:before { content: fa-content($fa-var-compress-alt); } -.#{$fa-css-prefix}-compress-arrows-alt:before { content: fa-content($fa-var-compress-arrows-alt); } -.#{$fa-css-prefix}-concierge-bell:before { content: fa-content($fa-var-concierge-bell); } -.#{$fa-css-prefix}-confluence:before { content: fa-content($fa-var-confluence); } -.#{$fa-css-prefix}-connectdevelop:before { content: fa-content($fa-var-connectdevelop); } -.#{$fa-css-prefix}-contao:before { content: fa-content($fa-var-contao); } -.#{$fa-css-prefix}-cookie:before { content: fa-content($fa-var-cookie); } -.#{$fa-css-prefix}-cookie-bite:before { content: fa-content($fa-var-cookie-bite); } -.#{$fa-css-prefix}-copy:before { content: fa-content($fa-var-copy); } -.#{$fa-css-prefix}-copyright:before { content: fa-content($fa-var-copyright); } -.#{$fa-css-prefix}-cotton-bureau:before { content: fa-content($fa-var-cotton-bureau); } -.#{$fa-css-prefix}-couch:before { content: fa-content($fa-var-couch); } -.#{$fa-css-prefix}-cpanel:before { content: fa-content($fa-var-cpanel); } -.#{$fa-css-prefix}-creative-commons:before { content: fa-content($fa-var-creative-commons); } -.#{$fa-css-prefix}-creative-commons-by:before { content: fa-content($fa-var-creative-commons-by); } -.#{$fa-css-prefix}-creative-commons-nc:before { content: fa-content($fa-var-creative-commons-nc); } -.#{$fa-css-prefix}-creative-commons-nc-eu:before { content: fa-content($fa-var-creative-commons-nc-eu); } -.#{$fa-css-prefix}-creative-commons-nc-jp:before { content: fa-content($fa-var-creative-commons-nc-jp); } -.#{$fa-css-prefix}-creative-commons-nd:before { content: fa-content($fa-var-creative-commons-nd); } -.#{$fa-css-prefix}-creative-commons-pd:before { content: fa-content($fa-var-creative-commons-pd); } -.#{$fa-css-prefix}-creative-commons-pd-alt:before { content: fa-content($fa-var-creative-commons-pd-alt); } -.#{$fa-css-prefix}-creative-commons-remix:before { content: fa-content($fa-var-creative-commons-remix); } -.#{$fa-css-prefix}-creative-commons-sa:before { content: fa-content($fa-var-creative-commons-sa); } -.#{$fa-css-prefix}-creative-commons-sampling:before { content: fa-content($fa-var-creative-commons-sampling); } -.#{$fa-css-prefix}-creative-commons-sampling-plus:before { content: fa-content($fa-var-creative-commons-sampling-plus); } -.#{$fa-css-prefix}-creative-commons-share:before { content: fa-content($fa-var-creative-commons-share); } -.#{$fa-css-prefix}-creative-commons-zero:before { content: fa-content($fa-var-creative-commons-zero); } -.#{$fa-css-prefix}-credit-card:before { content: fa-content($fa-var-credit-card); } -.#{$fa-css-prefix}-critical-role:before { content: fa-content($fa-var-critical-role); } -.#{$fa-css-prefix}-crop:before { content: fa-content($fa-var-crop); } -.#{$fa-css-prefix}-crop-alt:before { content: fa-content($fa-var-crop-alt); } -.#{$fa-css-prefix}-cross:before { content: fa-content($fa-var-cross); } -.#{$fa-css-prefix}-crosshairs:before { content: fa-content($fa-var-crosshairs); } -.#{$fa-css-prefix}-crow:before { content: fa-content($fa-var-crow); } -.#{$fa-css-prefix}-crown:before { content: fa-content($fa-var-crown); } -.#{$fa-css-prefix}-crutch:before { content: fa-content($fa-var-crutch); } -.#{$fa-css-prefix}-css3:before { content: fa-content($fa-var-css3); } -.#{$fa-css-prefix}-css3-alt:before { content: fa-content($fa-var-css3-alt); } -.#{$fa-css-prefix}-cube:before { content: fa-content($fa-var-cube); } -.#{$fa-css-prefix}-cubes:before { content: fa-content($fa-var-cubes); } -.#{$fa-css-prefix}-cut:before { content: fa-content($fa-var-cut); } -.#{$fa-css-prefix}-cuttlefish:before { content: fa-content($fa-var-cuttlefish); } -.#{$fa-css-prefix}-d-and-d:before { content: fa-content($fa-var-d-and-d); } -.#{$fa-css-prefix}-d-and-d-beyond:before { content: fa-content($fa-var-d-and-d-beyond); } -.#{$fa-css-prefix}-dailymotion:before { content: fa-content($fa-var-dailymotion); } -.#{$fa-css-prefix}-dashcube:before { content: fa-content($fa-var-dashcube); } -.#{$fa-css-prefix}-database:before { content: fa-content($fa-var-database); } -.#{$fa-css-prefix}-deaf:before { content: fa-content($fa-var-deaf); } -.#{$fa-css-prefix}-deezer:before { content: fa-content($fa-var-deezer); } -.#{$fa-css-prefix}-delicious:before { content: fa-content($fa-var-delicious); } -.#{$fa-css-prefix}-democrat:before { content: fa-content($fa-var-democrat); } -.#{$fa-css-prefix}-deploydog:before { content: fa-content($fa-var-deploydog); } -.#{$fa-css-prefix}-deskpro:before { content: fa-content($fa-var-deskpro); } -.#{$fa-css-prefix}-desktop:before { content: fa-content($fa-var-desktop); } -.#{$fa-css-prefix}-dev:before { content: fa-content($fa-var-dev); } -.#{$fa-css-prefix}-deviantart:before { content: fa-content($fa-var-deviantart); } -.#{$fa-css-prefix}-dharmachakra:before { content: fa-content($fa-var-dharmachakra); } -.#{$fa-css-prefix}-dhl:before { content: fa-content($fa-var-dhl); } -.#{$fa-css-prefix}-diagnoses:before { content: fa-content($fa-var-diagnoses); } -.#{$fa-css-prefix}-diaspora:before { content: fa-content($fa-var-diaspora); } -.#{$fa-css-prefix}-dice:before { content: fa-content($fa-var-dice); } -.#{$fa-css-prefix}-dice-d20:before { content: fa-content($fa-var-dice-d20); } -.#{$fa-css-prefix}-dice-d6:before { content: fa-content($fa-var-dice-d6); } -.#{$fa-css-prefix}-dice-five:before { content: fa-content($fa-var-dice-five); } -.#{$fa-css-prefix}-dice-four:before { content: fa-content($fa-var-dice-four); } -.#{$fa-css-prefix}-dice-one:before { content: fa-content($fa-var-dice-one); } -.#{$fa-css-prefix}-dice-six:before { content: fa-content($fa-var-dice-six); } -.#{$fa-css-prefix}-dice-three:before { content: fa-content($fa-var-dice-three); } -.#{$fa-css-prefix}-dice-two:before { content: fa-content($fa-var-dice-two); } -.#{$fa-css-prefix}-digg:before { content: fa-content($fa-var-digg); } -.#{$fa-css-prefix}-digital-ocean:before { content: fa-content($fa-var-digital-ocean); } -.#{$fa-css-prefix}-digital-tachograph:before { content: fa-content($fa-var-digital-tachograph); } -.#{$fa-css-prefix}-directions:before { content: fa-content($fa-var-directions); } -.#{$fa-css-prefix}-discord:before { content: fa-content($fa-var-discord); } -.#{$fa-css-prefix}-discourse:before { content: fa-content($fa-var-discourse); } -.#{$fa-css-prefix}-disease:before { content: fa-content($fa-var-disease); } -.#{$fa-css-prefix}-divide:before { content: fa-content($fa-var-divide); } -.#{$fa-css-prefix}-dizzy:before { content: fa-content($fa-var-dizzy); } -.#{$fa-css-prefix}-dna:before { content: fa-content($fa-var-dna); } -.#{$fa-css-prefix}-dochub:before { content: fa-content($fa-var-dochub); } -.#{$fa-css-prefix}-docker:before { content: fa-content($fa-var-docker); } -.#{$fa-css-prefix}-dog:before { content: fa-content($fa-var-dog); } -.#{$fa-css-prefix}-dollar-sign:before { content: fa-content($fa-var-dollar-sign); } -.#{$fa-css-prefix}-dolly:before { content: fa-content($fa-var-dolly); } -.#{$fa-css-prefix}-dolly-flatbed:before { content: fa-content($fa-var-dolly-flatbed); } -.#{$fa-css-prefix}-donate:before { content: fa-content($fa-var-donate); } -.#{$fa-css-prefix}-door-closed:before { content: fa-content($fa-var-door-closed); } -.#{$fa-css-prefix}-door-open:before { content: fa-content($fa-var-door-open); } -.#{$fa-css-prefix}-dot-circle:before { content: fa-content($fa-var-dot-circle); } -.#{$fa-css-prefix}-dove:before { content: fa-content($fa-var-dove); } -.#{$fa-css-prefix}-download:before { content: fa-content($fa-var-download); } -.#{$fa-css-prefix}-draft2digital:before { content: fa-content($fa-var-draft2digital); } -.#{$fa-css-prefix}-drafting-compass:before { content: fa-content($fa-var-drafting-compass); } -.#{$fa-css-prefix}-dragon:before { content: fa-content($fa-var-dragon); } -.#{$fa-css-prefix}-draw-polygon:before { content: fa-content($fa-var-draw-polygon); } -.#{$fa-css-prefix}-dribbble:before { content: fa-content($fa-var-dribbble); } -.#{$fa-css-prefix}-dribbble-square:before { content: fa-content($fa-var-dribbble-square); } -.#{$fa-css-prefix}-dropbox:before { content: fa-content($fa-var-dropbox); } -.#{$fa-css-prefix}-drum:before { content: fa-content($fa-var-drum); } -.#{$fa-css-prefix}-drum-steelpan:before { content: fa-content($fa-var-drum-steelpan); } -.#{$fa-css-prefix}-drumstick-bite:before { content: fa-content($fa-var-drumstick-bite); } -.#{$fa-css-prefix}-drupal:before { content: fa-content($fa-var-drupal); } -.#{$fa-css-prefix}-dumbbell:before { content: fa-content($fa-var-dumbbell); } -.#{$fa-css-prefix}-dumpster:before { content: fa-content($fa-var-dumpster); } -.#{$fa-css-prefix}-dumpster-fire:before { content: fa-content($fa-var-dumpster-fire); } -.#{$fa-css-prefix}-dungeon:before { content: fa-content($fa-var-dungeon); } -.#{$fa-css-prefix}-dyalog:before { content: fa-content($fa-var-dyalog); } -.#{$fa-css-prefix}-earlybirds:before { content: fa-content($fa-var-earlybirds); } -.#{$fa-css-prefix}-ebay:before { content: fa-content($fa-var-ebay); } -.#{$fa-css-prefix}-edge:before { content: fa-content($fa-var-edge); } -.#{$fa-css-prefix}-edge-legacy:before { content: fa-content($fa-var-edge-legacy); } -.#{$fa-css-prefix}-edit:before { content: fa-content($fa-var-edit); } -.#{$fa-css-prefix}-egg:before { content: fa-content($fa-var-egg); } -.#{$fa-css-prefix}-eject:before { content: fa-content($fa-var-eject); } -.#{$fa-css-prefix}-elementor:before { content: fa-content($fa-var-elementor); } -.#{$fa-css-prefix}-ellipsis-h:before { content: fa-content($fa-var-ellipsis-h); } -.#{$fa-css-prefix}-ellipsis-v:before { content: fa-content($fa-var-ellipsis-v); } -.#{$fa-css-prefix}-ello:before { content: fa-content($fa-var-ello); } -.#{$fa-css-prefix}-ember:before { content: fa-content($fa-var-ember); } -.#{$fa-css-prefix}-empire:before { content: fa-content($fa-var-empire); } -.#{$fa-css-prefix}-envelope:before { content: fa-content($fa-var-envelope); } -.#{$fa-css-prefix}-envelope-open:before { content: fa-content($fa-var-envelope-open); } -.#{$fa-css-prefix}-envelope-open-text:before { content: fa-content($fa-var-envelope-open-text); } -.#{$fa-css-prefix}-envelope-square:before { content: fa-content($fa-var-envelope-square); } -.#{$fa-css-prefix}-envira:before { content: fa-content($fa-var-envira); } -.#{$fa-css-prefix}-equals:before { content: fa-content($fa-var-equals); } -.#{$fa-css-prefix}-eraser:before { content: fa-content($fa-var-eraser); } -.#{$fa-css-prefix}-erlang:before { content: fa-content($fa-var-erlang); } -.#{$fa-css-prefix}-ethereum:before { content: fa-content($fa-var-ethereum); } -.#{$fa-css-prefix}-ethernet:before { content: fa-content($fa-var-ethernet); } -.#{$fa-css-prefix}-etsy:before { content: fa-content($fa-var-etsy); } -.#{$fa-css-prefix}-euro-sign:before { content: fa-content($fa-var-euro-sign); } -.#{$fa-css-prefix}-evernote:before { content: fa-content($fa-var-evernote); } -.#{$fa-css-prefix}-exchange-alt:before { content: fa-content($fa-var-exchange-alt); } -.#{$fa-css-prefix}-exclamation:before { content: fa-content($fa-var-exclamation); } -.#{$fa-css-prefix}-exclamation-circle:before { content: fa-content($fa-var-exclamation-circle); } -.#{$fa-css-prefix}-exclamation-triangle:before { content: fa-content($fa-var-exclamation-triangle); } -.#{$fa-css-prefix}-expand:before { content: fa-content($fa-var-expand); } -.#{$fa-css-prefix}-expand-alt:before { content: fa-content($fa-var-expand-alt); } -.#{$fa-css-prefix}-expand-arrows-alt:before { content: fa-content($fa-var-expand-arrows-alt); } -.#{$fa-css-prefix}-expeditedssl:before { content: fa-content($fa-var-expeditedssl); } -.#{$fa-css-prefix}-external-link-alt:before { content: fa-content($fa-var-external-link-alt); } -.#{$fa-css-prefix}-external-link-square-alt:before { content: fa-content($fa-var-external-link-square-alt); } -.#{$fa-css-prefix}-eye:before { content: fa-content($fa-var-eye); } -.#{$fa-css-prefix}-eye-dropper:before { content: fa-content($fa-var-eye-dropper); } -.#{$fa-css-prefix}-eye-slash:before { content: fa-content($fa-var-eye-slash); } -.#{$fa-css-prefix}-facebook:before { content: fa-content($fa-var-facebook); } -.#{$fa-css-prefix}-facebook-f:before { content: fa-content($fa-var-facebook-f); } -.#{$fa-css-prefix}-facebook-messenger:before { content: fa-content($fa-var-facebook-messenger); } -.#{$fa-css-prefix}-facebook-square:before { content: fa-content($fa-var-facebook-square); } -.#{$fa-css-prefix}-fan:before { content: fa-content($fa-var-fan); } -.#{$fa-css-prefix}-fantasy-flight-games:before { content: fa-content($fa-var-fantasy-flight-games); } -.#{$fa-css-prefix}-fast-backward:before { content: fa-content($fa-var-fast-backward); } -.#{$fa-css-prefix}-fast-forward:before { content: fa-content($fa-var-fast-forward); } -.#{$fa-css-prefix}-faucet:before { content: fa-content($fa-var-faucet); } -.#{$fa-css-prefix}-fax:before { content: fa-content($fa-var-fax); } -.#{$fa-css-prefix}-feather:before { content: fa-content($fa-var-feather); } -.#{$fa-css-prefix}-feather-alt:before { content: fa-content($fa-var-feather-alt); } -.#{$fa-css-prefix}-fedex:before { content: fa-content($fa-var-fedex); } -.#{$fa-css-prefix}-fedora:before { content: fa-content($fa-var-fedora); } -.#{$fa-css-prefix}-female:before { content: fa-content($fa-var-female); } -.#{$fa-css-prefix}-fighter-jet:before { content: fa-content($fa-var-fighter-jet); } -.#{$fa-css-prefix}-figma:before { content: fa-content($fa-var-figma); } -.#{$fa-css-prefix}-file:before { content: fa-content($fa-var-file); } -.#{$fa-css-prefix}-file-alt:before { content: fa-content($fa-var-file-alt); } -.#{$fa-css-prefix}-file-archive:before { content: fa-content($fa-var-file-archive); } -.#{$fa-css-prefix}-file-audio:before { content: fa-content($fa-var-file-audio); } -.#{$fa-css-prefix}-file-code:before { content: fa-content($fa-var-file-code); } -.#{$fa-css-prefix}-file-contract:before { content: fa-content($fa-var-file-contract); } -.#{$fa-css-prefix}-file-csv:before { content: fa-content($fa-var-file-csv); } -.#{$fa-css-prefix}-file-download:before { content: fa-content($fa-var-file-download); } -.#{$fa-css-prefix}-file-excel:before { content: fa-content($fa-var-file-excel); } -.#{$fa-css-prefix}-file-export:before { content: fa-content($fa-var-file-export); } -.#{$fa-css-prefix}-file-image:before { content: fa-content($fa-var-file-image); } -.#{$fa-css-prefix}-file-import:before { content: fa-content($fa-var-file-import); } -.#{$fa-css-prefix}-file-invoice:before { content: fa-content($fa-var-file-invoice); } -.#{$fa-css-prefix}-file-invoice-dollar:before { content: fa-content($fa-var-file-invoice-dollar); } -.#{$fa-css-prefix}-file-medical:before { content: fa-content($fa-var-file-medical); } -.#{$fa-css-prefix}-file-medical-alt:before { content: fa-content($fa-var-file-medical-alt); } -.#{$fa-css-prefix}-file-pdf:before { content: fa-content($fa-var-file-pdf); } -.#{$fa-css-prefix}-file-powerpoint:before { content: fa-content($fa-var-file-powerpoint); } -.#{$fa-css-prefix}-file-prescription:before { content: fa-content($fa-var-file-prescription); } -.#{$fa-css-prefix}-file-signature:before { content: fa-content($fa-var-file-signature); } -.#{$fa-css-prefix}-file-upload:before { content: fa-content($fa-var-file-upload); } -.#{$fa-css-prefix}-file-video:before { content: fa-content($fa-var-file-video); } -.#{$fa-css-prefix}-file-word:before { content: fa-content($fa-var-file-word); } -.#{$fa-css-prefix}-fill:before { content: fa-content($fa-var-fill); } -.#{$fa-css-prefix}-fill-drip:before { content: fa-content($fa-var-fill-drip); } -.#{$fa-css-prefix}-film:before { content: fa-content($fa-var-film); } -.#{$fa-css-prefix}-filter:before { content: fa-content($fa-var-filter); } -.#{$fa-css-prefix}-fingerprint:before { content: fa-content($fa-var-fingerprint); } -.#{$fa-css-prefix}-fire:before { content: fa-content($fa-var-fire); } -.#{$fa-css-prefix}-fire-alt:before { content: fa-content($fa-var-fire-alt); } -.#{$fa-css-prefix}-fire-extinguisher:before { content: fa-content($fa-var-fire-extinguisher); } -.#{$fa-css-prefix}-firefox:before { content: fa-content($fa-var-firefox); } -.#{$fa-css-prefix}-firefox-browser:before { content: fa-content($fa-var-firefox-browser); } -.#{$fa-css-prefix}-first-aid:before { content: fa-content($fa-var-first-aid); } -.#{$fa-css-prefix}-first-order:before { content: fa-content($fa-var-first-order); } -.#{$fa-css-prefix}-first-order-alt:before { content: fa-content($fa-var-first-order-alt); } -.#{$fa-css-prefix}-firstdraft:before { content: fa-content($fa-var-firstdraft); } -.#{$fa-css-prefix}-fish:before { content: fa-content($fa-var-fish); } -.#{$fa-css-prefix}-fist-raised:before { content: fa-content($fa-var-fist-raised); } -.#{$fa-css-prefix}-flag:before { content: fa-content($fa-var-flag); } -.#{$fa-css-prefix}-flag-checkered:before { content: fa-content($fa-var-flag-checkered); } -.#{$fa-css-prefix}-flag-usa:before { content: fa-content($fa-var-flag-usa); } -.#{$fa-css-prefix}-flask:before { content: fa-content($fa-var-flask); } -.#{$fa-css-prefix}-flickr:before { content: fa-content($fa-var-flickr); } -.#{$fa-css-prefix}-flipboard:before { content: fa-content($fa-var-flipboard); } -.#{$fa-css-prefix}-flushed:before { content: fa-content($fa-var-flushed); } -.#{$fa-css-prefix}-fly:before { content: fa-content($fa-var-fly); } -.#{$fa-css-prefix}-folder:before { content: fa-content($fa-var-folder); } -.#{$fa-css-prefix}-folder-minus:before { content: fa-content($fa-var-folder-minus); } -.#{$fa-css-prefix}-folder-open:before { content: fa-content($fa-var-folder-open); } -.#{$fa-css-prefix}-folder-plus:before { content: fa-content($fa-var-folder-plus); } -.#{$fa-css-prefix}-font:before { content: fa-content($fa-var-font); } -.#{$fa-css-prefix}-font-awesome:before { content: fa-content($fa-var-font-awesome); } -.#{$fa-css-prefix}-font-awesome-alt:before { content: fa-content($fa-var-font-awesome-alt); } -.#{$fa-css-prefix}-font-awesome-flag:before { content: fa-content($fa-var-font-awesome-flag); } -.#{$fa-css-prefix}-font-awesome-logo-full:before { content: fa-content($fa-var-font-awesome-logo-full); } -.#{$fa-css-prefix}-fonticons:before { content: fa-content($fa-var-fonticons); } -.#{$fa-css-prefix}-fonticons-fi:before { content: fa-content($fa-var-fonticons-fi); } -.#{$fa-css-prefix}-football-ball:before { content: fa-content($fa-var-football-ball); } -.#{$fa-css-prefix}-fort-awesome:before { content: fa-content($fa-var-fort-awesome); } -.#{$fa-css-prefix}-fort-awesome-alt:before { content: fa-content($fa-var-fort-awesome-alt); } -.#{$fa-css-prefix}-forumbee:before { content: fa-content($fa-var-forumbee); } -.#{$fa-css-prefix}-forward:before { content: fa-content($fa-var-forward); } -.#{$fa-css-prefix}-foursquare:before { content: fa-content($fa-var-foursquare); } -.#{$fa-css-prefix}-free-code-camp:before { content: fa-content($fa-var-free-code-camp); } -.#{$fa-css-prefix}-freebsd:before { content: fa-content($fa-var-freebsd); } -.#{$fa-css-prefix}-frog:before { content: fa-content($fa-var-frog); } -.#{$fa-css-prefix}-frown:before { content: fa-content($fa-var-frown); } -.#{$fa-css-prefix}-frown-open:before { content: fa-content($fa-var-frown-open); } -.#{$fa-css-prefix}-fulcrum:before { content: fa-content($fa-var-fulcrum); } -.#{$fa-css-prefix}-funnel-dollar:before { content: fa-content($fa-var-funnel-dollar); } -.#{$fa-css-prefix}-futbol:before { content: fa-content($fa-var-futbol); } -.#{$fa-css-prefix}-galactic-republic:before { content: fa-content($fa-var-galactic-republic); } -.#{$fa-css-prefix}-galactic-senate:before { content: fa-content($fa-var-galactic-senate); } -.#{$fa-css-prefix}-gamepad:before { content: fa-content($fa-var-gamepad); } -.#{$fa-css-prefix}-gas-pump:before { content: fa-content($fa-var-gas-pump); } -.#{$fa-css-prefix}-gavel:before { content: fa-content($fa-var-gavel); } -.#{$fa-css-prefix}-gem:before { content: fa-content($fa-var-gem); } -.#{$fa-css-prefix}-genderless:before { content: fa-content($fa-var-genderless); } -.#{$fa-css-prefix}-get-pocket:before { content: fa-content($fa-var-get-pocket); } -.#{$fa-css-prefix}-gg:before { content: fa-content($fa-var-gg); } -.#{$fa-css-prefix}-gg-circle:before { content: fa-content($fa-var-gg-circle); } -.#{$fa-css-prefix}-ghost:before { content: fa-content($fa-var-ghost); } -.#{$fa-css-prefix}-gift:before { content: fa-content($fa-var-gift); } -.#{$fa-css-prefix}-gifts:before { content: fa-content($fa-var-gifts); } -.#{$fa-css-prefix}-git:before { content: fa-content($fa-var-git); } -.#{$fa-css-prefix}-git-alt:before { content: fa-content($fa-var-git-alt); } -.#{$fa-css-prefix}-git-square:before { content: fa-content($fa-var-git-square); } -.#{$fa-css-prefix}-github:before { content: fa-content($fa-var-github); } -.#{$fa-css-prefix}-github-alt:before { content: fa-content($fa-var-github-alt); } -.#{$fa-css-prefix}-github-square:before { content: fa-content($fa-var-github-square); } -.#{$fa-css-prefix}-gitkraken:before { content: fa-content($fa-var-gitkraken); } -.#{$fa-css-prefix}-gitlab:before { content: fa-content($fa-var-gitlab); } -.#{$fa-css-prefix}-gitter:before { content: fa-content($fa-var-gitter); } -.#{$fa-css-prefix}-glass-cheers:before { content: fa-content($fa-var-glass-cheers); } -.#{$fa-css-prefix}-glass-martini:before { content: fa-content($fa-var-glass-martini); } -.#{$fa-css-prefix}-glass-martini-alt:before { content: fa-content($fa-var-glass-martini-alt); } -.#{$fa-css-prefix}-glass-whiskey:before { content: fa-content($fa-var-glass-whiskey); } -.#{$fa-css-prefix}-glasses:before { content: fa-content($fa-var-glasses); } -.#{$fa-css-prefix}-glide:before { content: fa-content($fa-var-glide); } -.#{$fa-css-prefix}-glide-g:before { content: fa-content($fa-var-glide-g); } -.#{$fa-css-prefix}-globe:before { content: fa-content($fa-var-globe); } -.#{$fa-css-prefix}-globe-africa:before { content: fa-content($fa-var-globe-africa); } -.#{$fa-css-prefix}-globe-americas:before { content: fa-content($fa-var-globe-americas); } -.#{$fa-css-prefix}-globe-asia:before { content: fa-content($fa-var-globe-asia); } -.#{$fa-css-prefix}-globe-europe:before { content: fa-content($fa-var-globe-europe); } -.#{$fa-css-prefix}-gofore:before { content: fa-content($fa-var-gofore); } -.#{$fa-css-prefix}-golf-ball:before { content: fa-content($fa-var-golf-ball); } -.#{$fa-css-prefix}-goodreads:before { content: fa-content($fa-var-goodreads); } -.#{$fa-css-prefix}-goodreads-g:before { content: fa-content($fa-var-goodreads-g); } -.#{$fa-css-prefix}-google:before { content: fa-content($fa-var-google); } -.#{$fa-css-prefix}-google-drive:before { content: fa-content($fa-var-google-drive); } -.#{$fa-css-prefix}-google-pay:before { content: fa-content($fa-var-google-pay); } -.#{$fa-css-prefix}-google-play:before { content: fa-content($fa-var-google-play); } -.#{$fa-css-prefix}-google-plus:before { content: fa-content($fa-var-google-plus); } -.#{$fa-css-prefix}-google-plus-g:before { content: fa-content($fa-var-google-plus-g); } -.#{$fa-css-prefix}-google-plus-square:before { content: fa-content($fa-var-google-plus-square); } -.#{$fa-css-prefix}-google-wallet:before { content: fa-content($fa-var-google-wallet); } -.#{$fa-css-prefix}-gopuram:before { content: fa-content($fa-var-gopuram); } -.#{$fa-css-prefix}-graduation-cap:before { content: fa-content($fa-var-graduation-cap); } -.#{$fa-css-prefix}-gratipay:before { content: fa-content($fa-var-gratipay); } -.#{$fa-css-prefix}-grav:before { content: fa-content($fa-var-grav); } -.#{$fa-css-prefix}-greater-than:before { content: fa-content($fa-var-greater-than); } -.#{$fa-css-prefix}-greater-than-equal:before { content: fa-content($fa-var-greater-than-equal); } -.#{$fa-css-prefix}-grimace:before { content: fa-content($fa-var-grimace); } -.#{$fa-css-prefix}-grin:before { content: fa-content($fa-var-grin); } -.#{$fa-css-prefix}-grin-alt:before { content: fa-content($fa-var-grin-alt); } -.#{$fa-css-prefix}-grin-beam:before { content: fa-content($fa-var-grin-beam); } -.#{$fa-css-prefix}-grin-beam-sweat:before { content: fa-content($fa-var-grin-beam-sweat); } -.#{$fa-css-prefix}-grin-hearts:before { content: fa-content($fa-var-grin-hearts); } -.#{$fa-css-prefix}-grin-squint:before { content: fa-content($fa-var-grin-squint); } -.#{$fa-css-prefix}-grin-squint-tears:before { content: fa-content($fa-var-grin-squint-tears); } -.#{$fa-css-prefix}-grin-stars:before { content: fa-content($fa-var-grin-stars); } -.#{$fa-css-prefix}-grin-tears:before { content: fa-content($fa-var-grin-tears); } -.#{$fa-css-prefix}-grin-tongue:before { content: fa-content($fa-var-grin-tongue); } -.#{$fa-css-prefix}-grin-tongue-squint:before { content: fa-content($fa-var-grin-tongue-squint); } -.#{$fa-css-prefix}-grin-tongue-wink:before { content: fa-content($fa-var-grin-tongue-wink); } -.#{$fa-css-prefix}-grin-wink:before { content: fa-content($fa-var-grin-wink); } -.#{$fa-css-prefix}-grip-horizontal:before { content: fa-content($fa-var-grip-horizontal); } -.#{$fa-css-prefix}-grip-lines:before { content: fa-content($fa-var-grip-lines); } -.#{$fa-css-prefix}-grip-lines-vertical:before { content: fa-content($fa-var-grip-lines-vertical); } -.#{$fa-css-prefix}-grip-vertical:before { content: fa-content($fa-var-grip-vertical); } -.#{$fa-css-prefix}-gripfire:before { content: fa-content($fa-var-gripfire); } -.#{$fa-css-prefix}-grunt:before { content: fa-content($fa-var-grunt); } -.#{$fa-css-prefix}-guitar:before { content: fa-content($fa-var-guitar); } -.#{$fa-css-prefix}-gulp:before { content: fa-content($fa-var-gulp); } -.#{$fa-css-prefix}-h-square:before { content: fa-content($fa-var-h-square); } -.#{$fa-css-prefix}-hacker-news:before { content: fa-content($fa-var-hacker-news); } -.#{$fa-css-prefix}-hacker-news-square:before { content: fa-content($fa-var-hacker-news-square); } -.#{$fa-css-prefix}-hackerrank:before { content: fa-content($fa-var-hackerrank); } -.#{$fa-css-prefix}-hamburger:before { content: fa-content($fa-var-hamburger); } -.#{$fa-css-prefix}-hammer:before { content: fa-content($fa-var-hammer); } -.#{$fa-css-prefix}-hamsa:before { content: fa-content($fa-var-hamsa); } -.#{$fa-css-prefix}-hand-holding:before { content: fa-content($fa-var-hand-holding); } -.#{$fa-css-prefix}-hand-holding-heart:before { content: fa-content($fa-var-hand-holding-heart); } -.#{$fa-css-prefix}-hand-holding-medical:before { content: fa-content($fa-var-hand-holding-medical); } -.#{$fa-css-prefix}-hand-holding-usd:before { content: fa-content($fa-var-hand-holding-usd); } -.#{$fa-css-prefix}-hand-holding-water:before { content: fa-content($fa-var-hand-holding-water); } -.#{$fa-css-prefix}-hand-lizard:before { content: fa-content($fa-var-hand-lizard); } -.#{$fa-css-prefix}-hand-middle-finger:before { content: fa-content($fa-var-hand-middle-finger); } -.#{$fa-css-prefix}-hand-paper:before { content: fa-content($fa-var-hand-paper); } -.#{$fa-css-prefix}-hand-peace:before { content: fa-content($fa-var-hand-peace); } -.#{$fa-css-prefix}-hand-point-down:before { content: fa-content($fa-var-hand-point-down); } -.#{$fa-css-prefix}-hand-point-left:before { content: fa-content($fa-var-hand-point-left); } -.#{$fa-css-prefix}-hand-point-right:before { content: fa-content($fa-var-hand-point-right); } -.#{$fa-css-prefix}-hand-point-up:before { content: fa-content($fa-var-hand-point-up); } -.#{$fa-css-prefix}-hand-pointer:before { content: fa-content($fa-var-hand-pointer); } -.#{$fa-css-prefix}-hand-rock:before { content: fa-content($fa-var-hand-rock); } -.#{$fa-css-prefix}-hand-scissors:before { content: fa-content($fa-var-hand-scissors); } -.#{$fa-css-prefix}-hand-sparkles:before { content: fa-content($fa-var-hand-sparkles); } -.#{$fa-css-prefix}-hand-spock:before { content: fa-content($fa-var-hand-spock); } -.#{$fa-css-prefix}-hands:before { content: fa-content($fa-var-hands); } -.#{$fa-css-prefix}-hands-helping:before { content: fa-content($fa-var-hands-helping); } -.#{$fa-css-prefix}-hands-wash:before { content: fa-content($fa-var-hands-wash); } -.#{$fa-css-prefix}-handshake:before { content: fa-content($fa-var-handshake); } -.#{$fa-css-prefix}-handshake-alt-slash:before { content: fa-content($fa-var-handshake-alt-slash); } -.#{$fa-css-prefix}-handshake-slash:before { content: fa-content($fa-var-handshake-slash); } -.#{$fa-css-prefix}-hanukiah:before { content: fa-content($fa-var-hanukiah); } -.#{$fa-css-prefix}-hard-hat:before { content: fa-content($fa-var-hard-hat); } -.#{$fa-css-prefix}-hashtag:before { content: fa-content($fa-var-hashtag); } -.#{$fa-css-prefix}-hat-cowboy:before { content: fa-content($fa-var-hat-cowboy); } -.#{$fa-css-prefix}-hat-cowboy-side:before { content: fa-content($fa-var-hat-cowboy-side); } -.#{$fa-css-prefix}-hat-wizard:before { content: fa-content($fa-var-hat-wizard); } -.#{$fa-css-prefix}-hdd:before { content: fa-content($fa-var-hdd); } -.#{$fa-css-prefix}-head-side-cough:before { content: fa-content($fa-var-head-side-cough); } -.#{$fa-css-prefix}-head-side-cough-slash:before { content: fa-content($fa-var-head-side-cough-slash); } -.#{$fa-css-prefix}-head-side-mask:before { content: fa-content($fa-var-head-side-mask); } -.#{$fa-css-prefix}-head-side-virus:before { content: fa-content($fa-var-head-side-virus); } -.#{$fa-css-prefix}-heading:before { content: fa-content($fa-var-heading); } -.#{$fa-css-prefix}-headphones:before { content: fa-content($fa-var-headphones); } -.#{$fa-css-prefix}-headphones-alt:before { content: fa-content($fa-var-headphones-alt); } -.#{$fa-css-prefix}-headset:before { content: fa-content($fa-var-headset); } -.#{$fa-css-prefix}-heart:before { content: fa-content($fa-var-heart); } -.#{$fa-css-prefix}-heart-broken:before { content: fa-content($fa-var-heart-broken); } -.#{$fa-css-prefix}-heartbeat:before { content: fa-content($fa-var-heartbeat); } -.#{$fa-css-prefix}-helicopter:before { content: fa-content($fa-var-helicopter); } -.#{$fa-css-prefix}-highlighter:before { content: fa-content($fa-var-highlighter); } -.#{$fa-css-prefix}-hiking:before { content: fa-content($fa-var-hiking); } -.#{$fa-css-prefix}-hippo:before { content: fa-content($fa-var-hippo); } -.#{$fa-css-prefix}-hips:before { content: fa-content($fa-var-hips); } -.#{$fa-css-prefix}-hire-a-helper:before { content: fa-content($fa-var-hire-a-helper); } -.#{$fa-css-prefix}-history:before { content: fa-content($fa-var-history); } -.#{$fa-css-prefix}-hockey-puck:before { content: fa-content($fa-var-hockey-puck); } -.#{$fa-css-prefix}-holly-berry:before { content: fa-content($fa-var-holly-berry); } -.#{$fa-css-prefix}-home:before { content: fa-content($fa-var-home); } -.#{$fa-css-prefix}-hooli:before { content: fa-content($fa-var-hooli); } -.#{$fa-css-prefix}-hornbill:before { content: fa-content($fa-var-hornbill); } -.#{$fa-css-prefix}-horse:before { content: fa-content($fa-var-horse); } -.#{$fa-css-prefix}-horse-head:before { content: fa-content($fa-var-horse-head); } -.#{$fa-css-prefix}-hospital:before { content: fa-content($fa-var-hospital); } -.#{$fa-css-prefix}-hospital-alt:before { content: fa-content($fa-var-hospital-alt); } -.#{$fa-css-prefix}-hospital-symbol:before { content: fa-content($fa-var-hospital-symbol); } -.#{$fa-css-prefix}-hospital-user:before { content: fa-content($fa-var-hospital-user); } -.#{$fa-css-prefix}-hot-tub:before { content: fa-content($fa-var-hot-tub); } -.#{$fa-css-prefix}-hotdog:before { content: fa-content($fa-var-hotdog); } -.#{$fa-css-prefix}-hotel:before { content: fa-content($fa-var-hotel); } -.#{$fa-css-prefix}-hotjar:before { content: fa-content($fa-var-hotjar); } -.#{$fa-css-prefix}-hourglass:before { content: fa-content($fa-var-hourglass); } -.#{$fa-css-prefix}-hourglass-end:before { content: fa-content($fa-var-hourglass-end); } -.#{$fa-css-prefix}-hourglass-half:before { content: fa-content($fa-var-hourglass-half); } -.#{$fa-css-prefix}-hourglass-start:before { content: fa-content($fa-var-hourglass-start); } -.#{$fa-css-prefix}-house-damage:before { content: fa-content($fa-var-house-damage); } -.#{$fa-css-prefix}-house-user:before { content: fa-content($fa-var-house-user); } -.#{$fa-css-prefix}-houzz:before { content: fa-content($fa-var-houzz); } -.#{$fa-css-prefix}-hryvnia:before { content: fa-content($fa-var-hryvnia); } -.#{$fa-css-prefix}-html5:before { content: fa-content($fa-var-html5); } -.#{$fa-css-prefix}-hubspot:before { content: fa-content($fa-var-hubspot); } -.#{$fa-css-prefix}-i-cursor:before { content: fa-content($fa-var-i-cursor); } -.#{$fa-css-prefix}-ice-cream:before { content: fa-content($fa-var-ice-cream); } -.#{$fa-css-prefix}-icicles:before { content: fa-content($fa-var-icicles); } -.#{$fa-css-prefix}-icons:before { content: fa-content($fa-var-icons); } -.#{$fa-css-prefix}-id-badge:before { content: fa-content($fa-var-id-badge); } -.#{$fa-css-prefix}-id-card:before { content: fa-content($fa-var-id-card); } -.#{$fa-css-prefix}-id-card-alt:before { content: fa-content($fa-var-id-card-alt); } -.#{$fa-css-prefix}-ideal:before { content: fa-content($fa-var-ideal); } -.#{$fa-css-prefix}-igloo:before { content: fa-content($fa-var-igloo); } -.#{$fa-css-prefix}-image:before { content: fa-content($fa-var-image); } -.#{$fa-css-prefix}-images:before { content: fa-content($fa-var-images); } -.#{$fa-css-prefix}-imdb:before { content: fa-content($fa-var-imdb); } -.#{$fa-css-prefix}-inbox:before { content: fa-content($fa-var-inbox); } -.#{$fa-css-prefix}-indent:before { content: fa-content($fa-var-indent); } -.#{$fa-css-prefix}-industry:before { content: fa-content($fa-var-industry); } -.#{$fa-css-prefix}-infinity:before { content: fa-content($fa-var-infinity); } -.#{$fa-css-prefix}-info:before { content: fa-content($fa-var-info); } -.#{$fa-css-prefix}-info-circle:before { content: fa-content($fa-var-info-circle); } -.#{$fa-css-prefix}-instagram:before { content: fa-content($fa-var-instagram); } -.#{$fa-css-prefix}-instagram-square:before { content: fa-content($fa-var-instagram-square); } -.#{$fa-css-prefix}-intercom:before { content: fa-content($fa-var-intercom); } -.#{$fa-css-prefix}-internet-explorer:before { content: fa-content($fa-var-internet-explorer); } -.#{$fa-css-prefix}-invision:before { content: fa-content($fa-var-invision); } -.#{$fa-css-prefix}-ioxhost:before { content: fa-content($fa-var-ioxhost); } -.#{$fa-css-prefix}-italic:before { content: fa-content($fa-var-italic); } -.#{$fa-css-prefix}-itch-io:before { content: fa-content($fa-var-itch-io); } -.#{$fa-css-prefix}-itunes:before { content: fa-content($fa-var-itunes); } -.#{$fa-css-prefix}-itunes-note:before { content: fa-content($fa-var-itunes-note); } -.#{$fa-css-prefix}-java:before { content: fa-content($fa-var-java); } -.#{$fa-css-prefix}-jedi:before { content: fa-content($fa-var-jedi); } -.#{$fa-css-prefix}-jedi-order:before { content: fa-content($fa-var-jedi-order); } -.#{$fa-css-prefix}-jenkins:before { content: fa-content($fa-var-jenkins); } -.#{$fa-css-prefix}-jira:before { content: fa-content($fa-var-jira); } -.#{$fa-css-prefix}-joget:before { content: fa-content($fa-var-joget); } -.#{$fa-css-prefix}-joint:before { content: fa-content($fa-var-joint); } -.#{$fa-css-prefix}-joomla:before { content: fa-content($fa-var-joomla); } -.#{$fa-css-prefix}-journal-whills:before { content: fa-content($fa-var-journal-whills); } -.#{$fa-css-prefix}-js:before { content: fa-content($fa-var-js); } -.#{$fa-css-prefix}-js-square:before { content: fa-content($fa-var-js-square); } -.#{$fa-css-prefix}-jsfiddle:before { content: fa-content($fa-var-jsfiddle); } -.#{$fa-css-prefix}-kaaba:before { content: fa-content($fa-var-kaaba); } -.#{$fa-css-prefix}-kaggle:before { content: fa-content($fa-var-kaggle); } -.#{$fa-css-prefix}-key:before { content: fa-content($fa-var-key); } -.#{$fa-css-prefix}-keybase:before { content: fa-content($fa-var-keybase); } -.#{$fa-css-prefix}-keyboard:before { content: fa-content($fa-var-keyboard); } -.#{$fa-css-prefix}-keycdn:before { content: fa-content($fa-var-keycdn); } -.#{$fa-css-prefix}-khanda:before { content: fa-content($fa-var-khanda); } -.#{$fa-css-prefix}-kickstarter:before { content: fa-content($fa-var-kickstarter); } -.#{$fa-css-prefix}-kickstarter-k:before { content: fa-content($fa-var-kickstarter-k); } -.#{$fa-css-prefix}-kiss:before { content: fa-content($fa-var-kiss); } -.#{$fa-css-prefix}-kiss-beam:before { content: fa-content($fa-var-kiss-beam); } -.#{$fa-css-prefix}-kiss-wink-heart:before { content: fa-content($fa-var-kiss-wink-heart); } -.#{$fa-css-prefix}-kiwi-bird:before { content: fa-content($fa-var-kiwi-bird); } -.#{$fa-css-prefix}-korvue:before { content: fa-content($fa-var-korvue); } -.#{$fa-css-prefix}-landmark:before { content: fa-content($fa-var-landmark); } -.#{$fa-css-prefix}-language:before { content: fa-content($fa-var-language); } -.#{$fa-css-prefix}-laptop:before { content: fa-content($fa-var-laptop); } -.#{$fa-css-prefix}-laptop-code:before { content: fa-content($fa-var-laptop-code); } -.#{$fa-css-prefix}-laptop-house:before { content: fa-content($fa-var-laptop-house); } -.#{$fa-css-prefix}-laptop-medical:before { content: fa-content($fa-var-laptop-medical); } -.#{$fa-css-prefix}-laravel:before { content: fa-content($fa-var-laravel); } -.#{$fa-css-prefix}-lastfm:before { content: fa-content($fa-var-lastfm); } -.#{$fa-css-prefix}-lastfm-square:before { content: fa-content($fa-var-lastfm-square); } -.#{$fa-css-prefix}-laugh:before { content: fa-content($fa-var-laugh); } -.#{$fa-css-prefix}-laugh-beam:before { content: fa-content($fa-var-laugh-beam); } -.#{$fa-css-prefix}-laugh-squint:before { content: fa-content($fa-var-laugh-squint); } -.#{$fa-css-prefix}-laugh-wink:before { content: fa-content($fa-var-laugh-wink); } -.#{$fa-css-prefix}-layer-group:before { content: fa-content($fa-var-layer-group); } -.#{$fa-css-prefix}-leaf:before { content: fa-content($fa-var-leaf); } -.#{$fa-css-prefix}-leanpub:before { content: fa-content($fa-var-leanpub); } -.#{$fa-css-prefix}-lemon:before { content: fa-content($fa-var-lemon); } -.#{$fa-css-prefix}-less:before { content: fa-content($fa-var-less); } -.#{$fa-css-prefix}-less-than:before { content: fa-content($fa-var-less-than); } -.#{$fa-css-prefix}-less-than-equal:before { content: fa-content($fa-var-less-than-equal); } -.#{$fa-css-prefix}-level-down-alt:before { content: fa-content($fa-var-level-down-alt); } -.#{$fa-css-prefix}-level-up-alt:before { content: fa-content($fa-var-level-up-alt); } -.#{$fa-css-prefix}-life-ring:before { content: fa-content($fa-var-life-ring); } -.#{$fa-css-prefix}-lightbulb:before { content: fa-content($fa-var-lightbulb); } -.#{$fa-css-prefix}-line:before { content: fa-content($fa-var-line); } -.#{$fa-css-prefix}-link:before { content: fa-content($fa-var-link); } -.#{$fa-css-prefix}-linkedin:before { content: fa-content($fa-var-linkedin); } -.#{$fa-css-prefix}-linkedin-in:before { content: fa-content($fa-var-linkedin-in); } -.#{$fa-css-prefix}-linode:before { content: fa-content($fa-var-linode); } -.#{$fa-css-prefix}-linux:before { content: fa-content($fa-var-linux); } -.#{$fa-css-prefix}-lira-sign:before { content: fa-content($fa-var-lira-sign); } -.#{$fa-css-prefix}-list:before { content: fa-content($fa-var-list); } -.#{$fa-css-prefix}-list-alt:before { content: fa-content($fa-var-list-alt); } -.#{$fa-css-prefix}-list-ol:before { content: fa-content($fa-var-list-ol); } -.#{$fa-css-prefix}-list-ul:before { content: fa-content($fa-var-list-ul); } -.#{$fa-css-prefix}-location-arrow:before { content: fa-content($fa-var-location-arrow); } -.#{$fa-css-prefix}-lock:before { content: fa-content($fa-var-lock); } -.#{$fa-css-prefix}-lock-open:before { content: fa-content($fa-var-lock-open); } -.#{$fa-css-prefix}-long-arrow-alt-down:before { content: fa-content($fa-var-long-arrow-alt-down); } -.#{$fa-css-prefix}-long-arrow-alt-left:before { content: fa-content($fa-var-long-arrow-alt-left); } -.#{$fa-css-prefix}-long-arrow-alt-right:before { content: fa-content($fa-var-long-arrow-alt-right); } -.#{$fa-css-prefix}-long-arrow-alt-up:before { content: fa-content($fa-var-long-arrow-alt-up); } -.#{$fa-css-prefix}-low-vision:before { content: fa-content($fa-var-low-vision); } -.#{$fa-css-prefix}-luggage-cart:before { content: fa-content($fa-var-luggage-cart); } -.#{$fa-css-prefix}-lungs:before { content: fa-content($fa-var-lungs); } -.#{$fa-css-prefix}-lungs-virus:before { content: fa-content($fa-var-lungs-virus); } -.#{$fa-css-prefix}-lyft:before { content: fa-content($fa-var-lyft); } -.#{$fa-css-prefix}-magento:before { content: fa-content($fa-var-magento); } -.#{$fa-css-prefix}-magic:before { content: fa-content($fa-var-magic); } -.#{$fa-css-prefix}-magnet:before { content: fa-content($fa-var-magnet); } -.#{$fa-css-prefix}-mail-bulk:before { content: fa-content($fa-var-mail-bulk); } -.#{$fa-css-prefix}-mailchimp:before { content: fa-content($fa-var-mailchimp); } -.#{$fa-css-prefix}-male:before { content: fa-content($fa-var-male); } -.#{$fa-css-prefix}-mandalorian:before { content: fa-content($fa-var-mandalorian); } -.#{$fa-css-prefix}-map:before { content: fa-content($fa-var-map); } -.#{$fa-css-prefix}-map-marked:before { content: fa-content($fa-var-map-marked); } -.#{$fa-css-prefix}-map-marked-alt:before { content: fa-content($fa-var-map-marked-alt); } -.#{$fa-css-prefix}-map-marker:before { content: fa-content($fa-var-map-marker); } -.#{$fa-css-prefix}-map-marker-alt:before { content: fa-content($fa-var-map-marker-alt); } -.#{$fa-css-prefix}-map-pin:before { content: fa-content($fa-var-map-pin); } -.#{$fa-css-prefix}-map-signs:before { content: fa-content($fa-var-map-signs); } -.#{$fa-css-prefix}-markdown:before { content: fa-content($fa-var-markdown); } -.#{$fa-css-prefix}-marker:before { content: fa-content($fa-var-marker); } -.#{$fa-css-prefix}-mars:before { content: fa-content($fa-var-mars); } -.#{$fa-css-prefix}-mars-double:before { content: fa-content($fa-var-mars-double); } -.#{$fa-css-prefix}-mars-stroke:before { content: fa-content($fa-var-mars-stroke); } -.#{$fa-css-prefix}-mars-stroke-h:before { content: fa-content($fa-var-mars-stroke-h); } -.#{$fa-css-prefix}-mars-stroke-v:before { content: fa-content($fa-var-mars-stroke-v); } -.#{$fa-css-prefix}-mask:before { content: fa-content($fa-var-mask); } -.#{$fa-css-prefix}-mastodon:before { content: fa-content($fa-var-mastodon); } -.#{$fa-css-prefix}-maxcdn:before { content: fa-content($fa-var-maxcdn); } -.#{$fa-css-prefix}-mdb:before { content: fa-content($fa-var-mdb); } -.#{$fa-css-prefix}-medal:before { content: fa-content($fa-var-medal); } -.#{$fa-css-prefix}-medapps:before { content: fa-content($fa-var-medapps); } -.#{$fa-css-prefix}-medium:before { content: fa-content($fa-var-medium); } -.#{$fa-css-prefix}-medium-m:before { content: fa-content($fa-var-medium-m); } -.#{$fa-css-prefix}-medkit:before { content: fa-content($fa-var-medkit); } -.#{$fa-css-prefix}-medrt:before { content: fa-content($fa-var-medrt); } -.#{$fa-css-prefix}-meetup:before { content: fa-content($fa-var-meetup); } -.#{$fa-css-prefix}-megaport:before { content: fa-content($fa-var-megaport); } -.#{$fa-css-prefix}-meh:before { content: fa-content($fa-var-meh); } -.#{$fa-css-prefix}-meh-blank:before { content: fa-content($fa-var-meh-blank); } -.#{$fa-css-prefix}-meh-rolling-eyes:before { content: fa-content($fa-var-meh-rolling-eyes); } -.#{$fa-css-prefix}-memory:before { content: fa-content($fa-var-memory); } -.#{$fa-css-prefix}-mendeley:before { content: fa-content($fa-var-mendeley); } -.#{$fa-css-prefix}-menorah:before { content: fa-content($fa-var-menorah); } -.#{$fa-css-prefix}-mercury:before { content: fa-content($fa-var-mercury); } -.#{$fa-css-prefix}-meteor:before { content: fa-content($fa-var-meteor); } -.#{$fa-css-prefix}-microblog:before { content: fa-content($fa-var-microblog); } -.#{$fa-css-prefix}-microchip:before { content: fa-content($fa-var-microchip); } -.#{$fa-css-prefix}-microphone:before { content: fa-content($fa-var-microphone); } -.#{$fa-css-prefix}-microphone-alt:before { content: fa-content($fa-var-microphone-alt); } -.#{$fa-css-prefix}-microphone-alt-slash:before { content: fa-content($fa-var-microphone-alt-slash); } -.#{$fa-css-prefix}-microphone-slash:before { content: fa-content($fa-var-microphone-slash); } -.#{$fa-css-prefix}-microscope:before { content: fa-content($fa-var-microscope); } -.#{$fa-css-prefix}-microsoft:before { content: fa-content($fa-var-microsoft); } -.#{$fa-css-prefix}-minus:before { content: fa-content($fa-var-minus); } -.#{$fa-css-prefix}-minus-circle:before { content: fa-content($fa-var-minus-circle); } -.#{$fa-css-prefix}-minus-square:before { content: fa-content($fa-var-minus-square); } -.#{$fa-css-prefix}-mitten:before { content: fa-content($fa-var-mitten); } -.#{$fa-css-prefix}-mix:before { content: fa-content($fa-var-mix); } -.#{$fa-css-prefix}-mixcloud:before { content: fa-content($fa-var-mixcloud); } -.#{$fa-css-prefix}-mixer:before { content: fa-content($fa-var-mixer); } -.#{$fa-css-prefix}-mizuni:before { content: fa-content($fa-var-mizuni); } -.#{$fa-css-prefix}-mobile:before { content: fa-content($fa-var-mobile); } -.#{$fa-css-prefix}-mobile-alt:before { content: fa-content($fa-var-mobile-alt); } -.#{$fa-css-prefix}-modx:before { content: fa-content($fa-var-modx); } -.#{$fa-css-prefix}-monero:before { content: fa-content($fa-var-monero); } -.#{$fa-css-prefix}-money-bill:before { content: fa-content($fa-var-money-bill); } -.#{$fa-css-prefix}-money-bill-alt:before { content: fa-content($fa-var-money-bill-alt); } -.#{$fa-css-prefix}-money-bill-wave:before { content: fa-content($fa-var-money-bill-wave); } -.#{$fa-css-prefix}-money-bill-wave-alt:before { content: fa-content($fa-var-money-bill-wave-alt); } -.#{$fa-css-prefix}-money-check:before { content: fa-content($fa-var-money-check); } -.#{$fa-css-prefix}-money-check-alt:before { content: fa-content($fa-var-money-check-alt); } -.#{$fa-css-prefix}-monument:before { content: fa-content($fa-var-monument); } -.#{$fa-css-prefix}-moon:before { content: fa-content($fa-var-moon); } -.#{$fa-css-prefix}-mortar-pestle:before { content: fa-content($fa-var-mortar-pestle); } -.#{$fa-css-prefix}-mosque:before { content: fa-content($fa-var-mosque); } -.#{$fa-css-prefix}-motorcycle:before { content: fa-content($fa-var-motorcycle); } -.#{$fa-css-prefix}-mountain:before { content: fa-content($fa-var-mountain); } -.#{$fa-css-prefix}-mouse:before { content: fa-content($fa-var-mouse); } -.#{$fa-css-prefix}-mouse-pointer:before { content: fa-content($fa-var-mouse-pointer); } -.#{$fa-css-prefix}-mug-hot:before { content: fa-content($fa-var-mug-hot); } -.#{$fa-css-prefix}-music:before { content: fa-content($fa-var-music); } -.#{$fa-css-prefix}-napster:before { content: fa-content($fa-var-napster); } -.#{$fa-css-prefix}-neos:before { content: fa-content($fa-var-neos); } -.#{$fa-css-prefix}-network-wired:before { content: fa-content($fa-var-network-wired); } -.#{$fa-css-prefix}-neuter:before { content: fa-content($fa-var-neuter); } -.#{$fa-css-prefix}-newspaper:before { content: fa-content($fa-var-newspaper); } -.#{$fa-css-prefix}-nimblr:before { content: fa-content($fa-var-nimblr); } -.#{$fa-css-prefix}-node:before { content: fa-content($fa-var-node); } -.#{$fa-css-prefix}-node-js:before { content: fa-content($fa-var-node-js); } -.#{$fa-css-prefix}-not-equal:before { content: fa-content($fa-var-not-equal); } -.#{$fa-css-prefix}-notes-medical:before { content: fa-content($fa-var-notes-medical); } -.#{$fa-css-prefix}-npm:before { content: fa-content($fa-var-npm); } -.#{$fa-css-prefix}-ns8:before { content: fa-content($fa-var-ns8); } -.#{$fa-css-prefix}-nutritionix:before { content: fa-content($fa-var-nutritionix); } -.#{$fa-css-prefix}-object-group:before { content: fa-content($fa-var-object-group); } -.#{$fa-css-prefix}-object-ungroup:before { content: fa-content($fa-var-object-ungroup); } -.#{$fa-css-prefix}-odnoklassniki:before { content: fa-content($fa-var-odnoklassniki); } -.#{$fa-css-prefix}-odnoklassniki-square:before { content: fa-content($fa-var-odnoklassniki-square); } -.#{$fa-css-prefix}-oil-can:before { content: fa-content($fa-var-oil-can); } -.#{$fa-css-prefix}-old-republic:before { content: fa-content($fa-var-old-republic); } -.#{$fa-css-prefix}-om:before { content: fa-content($fa-var-om); } -.#{$fa-css-prefix}-opencart:before { content: fa-content($fa-var-opencart); } -.#{$fa-css-prefix}-openid:before { content: fa-content($fa-var-openid); } -.#{$fa-css-prefix}-opera:before { content: fa-content($fa-var-opera); } -.#{$fa-css-prefix}-optin-monster:before { content: fa-content($fa-var-optin-monster); } -.#{$fa-css-prefix}-orcid:before { content: fa-content($fa-var-orcid); } -.#{$fa-css-prefix}-osi:before { content: fa-content($fa-var-osi); } -.#{$fa-css-prefix}-otter:before { content: fa-content($fa-var-otter); } -.#{$fa-css-prefix}-outdent:before { content: fa-content($fa-var-outdent); } -.#{$fa-css-prefix}-page4:before { content: fa-content($fa-var-page4); } -.#{$fa-css-prefix}-pagelines:before { content: fa-content($fa-var-pagelines); } -.#{$fa-css-prefix}-pager:before { content: fa-content($fa-var-pager); } -.#{$fa-css-prefix}-paint-brush:before { content: fa-content($fa-var-paint-brush); } -.#{$fa-css-prefix}-paint-roller:before { content: fa-content($fa-var-paint-roller); } -.#{$fa-css-prefix}-palette:before { content: fa-content($fa-var-palette); } -.#{$fa-css-prefix}-palfed:before { content: fa-content($fa-var-palfed); } -.#{$fa-css-prefix}-pallet:before { content: fa-content($fa-var-pallet); } -.#{$fa-css-prefix}-paper-plane:before { content: fa-content($fa-var-paper-plane); } -.#{$fa-css-prefix}-paperclip:before { content: fa-content($fa-var-paperclip); } -.#{$fa-css-prefix}-parachute-box:before { content: fa-content($fa-var-parachute-box); } -.#{$fa-css-prefix}-paragraph:before { content: fa-content($fa-var-paragraph); } -.#{$fa-css-prefix}-parking:before { content: fa-content($fa-var-parking); } -.#{$fa-css-prefix}-passport:before { content: fa-content($fa-var-passport); } -.#{$fa-css-prefix}-pastafarianism:before { content: fa-content($fa-var-pastafarianism); } -.#{$fa-css-prefix}-paste:before { content: fa-content($fa-var-paste); } -.#{$fa-css-prefix}-patreon:before { content: fa-content($fa-var-patreon); } -.#{$fa-css-prefix}-pause:before { content: fa-content($fa-var-pause); } -.#{$fa-css-prefix}-pause-circle:before { content: fa-content($fa-var-pause-circle); } -.#{$fa-css-prefix}-paw:before { content: fa-content($fa-var-paw); } -.#{$fa-css-prefix}-paypal:before { content: fa-content($fa-var-paypal); } -.#{$fa-css-prefix}-peace:before { content: fa-content($fa-var-peace); } -.#{$fa-css-prefix}-pen:before { content: fa-content($fa-var-pen); } -.#{$fa-css-prefix}-pen-alt:before { content: fa-content($fa-var-pen-alt); } -.#{$fa-css-prefix}-pen-fancy:before { content: fa-content($fa-var-pen-fancy); } -.#{$fa-css-prefix}-pen-nib:before { content: fa-content($fa-var-pen-nib); } -.#{$fa-css-prefix}-pen-square:before { content: fa-content($fa-var-pen-square); } -.#{$fa-css-prefix}-pencil-alt:before { content: fa-content($fa-var-pencil-alt); } -.#{$fa-css-prefix}-pencil-ruler:before { content: fa-content($fa-var-pencil-ruler); } -.#{$fa-css-prefix}-penny-arcade:before { content: fa-content($fa-var-penny-arcade); } -.#{$fa-css-prefix}-people-arrows:before { content: fa-content($fa-var-people-arrows); } -.#{$fa-css-prefix}-people-carry:before { content: fa-content($fa-var-people-carry); } -.#{$fa-css-prefix}-pepper-hot:before { content: fa-content($fa-var-pepper-hot); } -.#{$fa-css-prefix}-percent:before { content: fa-content($fa-var-percent); } -.#{$fa-css-prefix}-percentage:before { content: fa-content($fa-var-percentage); } -.#{$fa-css-prefix}-periscope:before { content: fa-content($fa-var-periscope); } -.#{$fa-css-prefix}-person-booth:before { content: fa-content($fa-var-person-booth); } -.#{$fa-css-prefix}-phabricator:before { content: fa-content($fa-var-phabricator); } -.#{$fa-css-prefix}-phoenix-framework:before { content: fa-content($fa-var-phoenix-framework); } -.#{$fa-css-prefix}-phoenix-squadron:before { content: fa-content($fa-var-phoenix-squadron); } -.#{$fa-css-prefix}-phone:before { content: fa-content($fa-var-phone); } -.#{$fa-css-prefix}-phone-alt:before { content: fa-content($fa-var-phone-alt); } -.#{$fa-css-prefix}-phone-slash:before { content: fa-content($fa-var-phone-slash); } -.#{$fa-css-prefix}-phone-square:before { content: fa-content($fa-var-phone-square); } -.#{$fa-css-prefix}-phone-square-alt:before { content: fa-content($fa-var-phone-square-alt); } -.#{$fa-css-prefix}-phone-volume:before { content: fa-content($fa-var-phone-volume); } -.#{$fa-css-prefix}-photo-video:before { content: fa-content($fa-var-photo-video); } -.#{$fa-css-prefix}-php:before { content: fa-content($fa-var-php); } -.#{$fa-css-prefix}-pied-piper:before { content: fa-content($fa-var-pied-piper); } -.#{$fa-css-prefix}-pied-piper-alt:before { content: fa-content($fa-var-pied-piper-alt); } -.#{$fa-css-prefix}-pied-piper-hat:before { content: fa-content($fa-var-pied-piper-hat); } -.#{$fa-css-prefix}-pied-piper-pp:before { content: fa-content($fa-var-pied-piper-pp); } -.#{$fa-css-prefix}-pied-piper-square:before { content: fa-content($fa-var-pied-piper-square); } -.#{$fa-css-prefix}-piggy-bank:before { content: fa-content($fa-var-piggy-bank); } -.#{$fa-css-prefix}-pills:before { content: fa-content($fa-var-pills); } -.#{$fa-css-prefix}-pinterest:before { content: fa-content($fa-var-pinterest); } -.#{$fa-css-prefix}-pinterest-p:before { content: fa-content($fa-var-pinterest-p); } -.#{$fa-css-prefix}-pinterest-square:before { content: fa-content($fa-var-pinterest-square); } -.#{$fa-css-prefix}-pizza-slice:before { content: fa-content($fa-var-pizza-slice); } -.#{$fa-css-prefix}-place-of-worship:before { content: fa-content($fa-var-place-of-worship); } -.#{$fa-css-prefix}-plane:before { content: fa-content($fa-var-plane); } -.#{$fa-css-prefix}-plane-arrival:before { content: fa-content($fa-var-plane-arrival); } -.#{$fa-css-prefix}-plane-departure:before { content: fa-content($fa-var-plane-departure); } -.#{$fa-css-prefix}-plane-slash:before { content: fa-content($fa-var-plane-slash); } -.#{$fa-css-prefix}-play:before { content: fa-content($fa-var-play); } -.#{$fa-css-prefix}-play-circle:before { content: fa-content($fa-var-play-circle); } -.#{$fa-css-prefix}-playstation:before { content: fa-content($fa-var-playstation); } -.#{$fa-css-prefix}-plug:before { content: fa-content($fa-var-plug); } -.#{$fa-css-prefix}-plus:before { content: fa-content($fa-var-plus); } -.#{$fa-css-prefix}-plus-circle:before { content: fa-content($fa-var-plus-circle); } -.#{$fa-css-prefix}-plus-square:before { content: fa-content($fa-var-plus-square); } -.#{$fa-css-prefix}-podcast:before { content: fa-content($fa-var-podcast); } -.#{$fa-css-prefix}-poll:before { content: fa-content($fa-var-poll); } -.#{$fa-css-prefix}-poll-h:before { content: fa-content($fa-var-poll-h); } -.#{$fa-css-prefix}-poo:before { content: fa-content($fa-var-poo); } -.#{$fa-css-prefix}-poo-storm:before { content: fa-content($fa-var-poo-storm); } -.#{$fa-css-prefix}-poop:before { content: fa-content($fa-var-poop); } -.#{$fa-css-prefix}-portrait:before { content: fa-content($fa-var-portrait); } -.#{$fa-css-prefix}-pound-sign:before { content: fa-content($fa-var-pound-sign); } -.#{$fa-css-prefix}-power-off:before { content: fa-content($fa-var-power-off); } -.#{$fa-css-prefix}-pray:before { content: fa-content($fa-var-pray); } -.#{$fa-css-prefix}-praying-hands:before { content: fa-content($fa-var-praying-hands); } -.#{$fa-css-prefix}-prescription:before { content: fa-content($fa-var-prescription); } -.#{$fa-css-prefix}-prescription-bottle:before { content: fa-content($fa-var-prescription-bottle); } -.#{$fa-css-prefix}-prescription-bottle-alt:before { content: fa-content($fa-var-prescription-bottle-alt); } -.#{$fa-css-prefix}-print:before { content: fa-content($fa-var-print); } -.#{$fa-css-prefix}-procedures:before { content: fa-content($fa-var-procedures); } -.#{$fa-css-prefix}-product-hunt:before { content: fa-content($fa-var-product-hunt); } -.#{$fa-css-prefix}-project-diagram:before { content: fa-content($fa-var-project-diagram); } -.#{$fa-css-prefix}-pump-medical:before { content: fa-content($fa-var-pump-medical); } -.#{$fa-css-prefix}-pump-soap:before { content: fa-content($fa-var-pump-soap); } -.#{$fa-css-prefix}-pushed:before { content: fa-content($fa-var-pushed); } -.#{$fa-css-prefix}-puzzle-piece:before { content: fa-content($fa-var-puzzle-piece); } -.#{$fa-css-prefix}-python:before { content: fa-content($fa-var-python); } -.#{$fa-css-prefix}-qq:before { content: fa-content($fa-var-qq); } -.#{$fa-css-prefix}-qrcode:before { content: fa-content($fa-var-qrcode); } -.#{$fa-css-prefix}-question:before { content: fa-content($fa-var-question); } -.#{$fa-css-prefix}-question-circle:before { content: fa-content($fa-var-question-circle); } -.#{$fa-css-prefix}-quidditch:before { content: fa-content($fa-var-quidditch); } -.#{$fa-css-prefix}-quinscape:before { content: fa-content($fa-var-quinscape); } -.#{$fa-css-prefix}-quora:before { content: fa-content($fa-var-quora); } -.#{$fa-css-prefix}-quote-left:before { content: fa-content($fa-var-quote-left); } -.#{$fa-css-prefix}-quote-right:before { content: fa-content($fa-var-quote-right); } -.#{$fa-css-prefix}-quran:before { content: fa-content($fa-var-quran); } -.#{$fa-css-prefix}-r-project:before { content: fa-content($fa-var-r-project); } -.#{$fa-css-prefix}-radiation:before { content: fa-content($fa-var-radiation); } -.#{$fa-css-prefix}-radiation-alt:before { content: fa-content($fa-var-radiation-alt); } -.#{$fa-css-prefix}-rainbow:before { content: fa-content($fa-var-rainbow); } -.#{$fa-css-prefix}-random:before { content: fa-content($fa-var-random); } -.#{$fa-css-prefix}-raspberry-pi:before { content: fa-content($fa-var-raspberry-pi); } -.#{$fa-css-prefix}-ravelry:before { content: fa-content($fa-var-ravelry); } -.#{$fa-css-prefix}-react:before { content: fa-content($fa-var-react); } -.#{$fa-css-prefix}-reacteurope:before { content: fa-content($fa-var-reacteurope); } -.#{$fa-css-prefix}-readme:before { content: fa-content($fa-var-readme); } -.#{$fa-css-prefix}-rebel:before { content: fa-content($fa-var-rebel); } -.#{$fa-css-prefix}-receipt:before { content: fa-content($fa-var-receipt); } -.#{$fa-css-prefix}-record-vinyl:before { content: fa-content($fa-var-record-vinyl); } -.#{$fa-css-prefix}-recycle:before { content: fa-content($fa-var-recycle); } -.#{$fa-css-prefix}-red-river:before { content: fa-content($fa-var-red-river); } -.#{$fa-css-prefix}-reddit:before { content: fa-content($fa-var-reddit); } -.#{$fa-css-prefix}-reddit-alien:before { content: fa-content($fa-var-reddit-alien); } -.#{$fa-css-prefix}-reddit-square:before { content: fa-content($fa-var-reddit-square); } -.#{$fa-css-prefix}-redhat:before { content: fa-content($fa-var-redhat); } -.#{$fa-css-prefix}-redo:before { content: fa-content($fa-var-redo); } -.#{$fa-css-prefix}-redo-alt:before { content: fa-content($fa-var-redo-alt); } -.#{$fa-css-prefix}-registered:before { content: fa-content($fa-var-registered); } -.#{$fa-css-prefix}-remove-format:before { content: fa-content($fa-var-remove-format); } -.#{$fa-css-prefix}-renren:before { content: fa-content($fa-var-renren); } -.#{$fa-css-prefix}-reply:before { content: fa-content($fa-var-reply); } -.#{$fa-css-prefix}-reply-all:before { content: fa-content($fa-var-reply-all); } -.#{$fa-css-prefix}-replyd:before { content: fa-content($fa-var-replyd); } -.#{$fa-css-prefix}-republican:before { content: fa-content($fa-var-republican); } -.#{$fa-css-prefix}-researchgate:before { content: fa-content($fa-var-researchgate); } -.#{$fa-css-prefix}-resolving:before { content: fa-content($fa-var-resolving); } -.#{$fa-css-prefix}-restroom:before { content: fa-content($fa-var-restroom); } -.#{$fa-css-prefix}-retweet:before { content: fa-content($fa-var-retweet); } -.#{$fa-css-prefix}-rev:before { content: fa-content($fa-var-rev); } -.#{$fa-css-prefix}-ribbon:before { content: fa-content($fa-var-ribbon); } -.#{$fa-css-prefix}-ring:before { content: fa-content($fa-var-ring); } -.#{$fa-css-prefix}-road:before { content: fa-content($fa-var-road); } -.#{$fa-css-prefix}-robot:before { content: fa-content($fa-var-robot); } -.#{$fa-css-prefix}-rocket:before { content: fa-content($fa-var-rocket); } -.#{$fa-css-prefix}-rocketchat:before { content: fa-content($fa-var-rocketchat); } -.#{$fa-css-prefix}-rockrms:before { content: fa-content($fa-var-rockrms); } -.#{$fa-css-prefix}-route:before { content: fa-content($fa-var-route); } -.#{$fa-css-prefix}-rss:before { content: fa-content($fa-var-rss); } -.#{$fa-css-prefix}-rss-square:before { content: fa-content($fa-var-rss-square); } -.#{$fa-css-prefix}-ruble-sign:before { content: fa-content($fa-var-ruble-sign); } -.#{$fa-css-prefix}-ruler:before { content: fa-content($fa-var-ruler); } -.#{$fa-css-prefix}-ruler-combined:before { content: fa-content($fa-var-ruler-combined); } -.#{$fa-css-prefix}-ruler-horizontal:before { content: fa-content($fa-var-ruler-horizontal); } -.#{$fa-css-prefix}-ruler-vertical:before { content: fa-content($fa-var-ruler-vertical); } -.#{$fa-css-prefix}-running:before { content: fa-content($fa-var-running); } -.#{$fa-css-prefix}-rupee-sign:before { content: fa-content($fa-var-rupee-sign); } -.#{$fa-css-prefix}-rust:before { content: fa-content($fa-var-rust); } -.#{$fa-css-prefix}-sad-cry:before { content: fa-content($fa-var-sad-cry); } -.#{$fa-css-prefix}-sad-tear:before { content: fa-content($fa-var-sad-tear); } -.#{$fa-css-prefix}-safari:before { content: fa-content($fa-var-safari); } -.#{$fa-css-prefix}-salesforce:before { content: fa-content($fa-var-salesforce); } -.#{$fa-css-prefix}-sass:before { content: fa-content($fa-var-sass); } -.#{$fa-css-prefix}-satellite:before { content: fa-content($fa-var-satellite); } -.#{$fa-css-prefix}-satellite-dish:before { content: fa-content($fa-var-satellite-dish); } -.#{$fa-css-prefix}-save:before { content: fa-content($fa-var-save); } -.#{$fa-css-prefix}-schlix:before { content: fa-content($fa-var-schlix); } -.#{$fa-css-prefix}-school:before { content: fa-content($fa-var-school); } -.#{$fa-css-prefix}-screwdriver:before { content: fa-content($fa-var-screwdriver); } -.#{$fa-css-prefix}-scribd:before { content: fa-content($fa-var-scribd); } -.#{$fa-css-prefix}-scroll:before { content: fa-content($fa-var-scroll); } -.#{$fa-css-prefix}-sd-card:before { content: fa-content($fa-var-sd-card); } -.#{$fa-css-prefix}-search:before { content: fa-content($fa-var-search); } -.#{$fa-css-prefix}-search-dollar:before { content: fa-content($fa-var-search-dollar); } -.#{$fa-css-prefix}-search-location:before { content: fa-content($fa-var-search-location); } -.#{$fa-css-prefix}-search-minus:before { content: fa-content($fa-var-search-minus); } -.#{$fa-css-prefix}-search-plus:before { content: fa-content($fa-var-search-plus); } -.#{$fa-css-prefix}-searchengin:before { content: fa-content($fa-var-searchengin); } -.#{$fa-css-prefix}-seedling:before { content: fa-content($fa-var-seedling); } -.#{$fa-css-prefix}-sellcast:before { content: fa-content($fa-var-sellcast); } -.#{$fa-css-prefix}-sellsy:before { content: fa-content($fa-var-sellsy); } -.#{$fa-css-prefix}-server:before { content: fa-content($fa-var-server); } -.#{$fa-css-prefix}-servicestack:before { content: fa-content($fa-var-servicestack); } -.#{$fa-css-prefix}-shapes:before { content: fa-content($fa-var-shapes); } -.#{$fa-css-prefix}-share:before { content: fa-content($fa-var-share); } -.#{$fa-css-prefix}-share-alt:before { content: fa-content($fa-var-share-alt); } -.#{$fa-css-prefix}-share-alt-square:before { content: fa-content($fa-var-share-alt-square); } -.#{$fa-css-prefix}-share-square:before { content: fa-content($fa-var-share-square); } -.#{$fa-css-prefix}-shekel-sign:before { content: fa-content($fa-var-shekel-sign); } -.#{$fa-css-prefix}-shield-alt:before { content: fa-content($fa-var-shield-alt); } -.#{$fa-css-prefix}-shield-virus:before { content: fa-content($fa-var-shield-virus); } -.#{$fa-css-prefix}-ship:before { content: fa-content($fa-var-ship); } -.#{$fa-css-prefix}-shipping-fast:before { content: fa-content($fa-var-shipping-fast); } -.#{$fa-css-prefix}-shirtsinbulk:before { content: fa-content($fa-var-shirtsinbulk); } -.#{$fa-css-prefix}-shoe-prints:before { content: fa-content($fa-var-shoe-prints); } -.#{$fa-css-prefix}-shopify:before { content: fa-content($fa-var-shopify); } -.#{$fa-css-prefix}-shopping-bag:before { content: fa-content($fa-var-shopping-bag); } -.#{$fa-css-prefix}-shopping-basket:before { content: fa-content($fa-var-shopping-basket); } -.#{$fa-css-prefix}-shopping-cart:before { content: fa-content($fa-var-shopping-cart); } -.#{$fa-css-prefix}-shopware:before { content: fa-content($fa-var-shopware); } -.#{$fa-css-prefix}-shower:before { content: fa-content($fa-var-shower); } -.#{$fa-css-prefix}-shuttle-van:before { content: fa-content($fa-var-shuttle-van); } -.#{$fa-css-prefix}-sign:before { content: fa-content($fa-var-sign); } -.#{$fa-css-prefix}-sign-in-alt:before { content: fa-content($fa-var-sign-in-alt); } -.#{$fa-css-prefix}-sign-language:before { content: fa-content($fa-var-sign-language); } -.#{$fa-css-prefix}-sign-out-alt:before { content: fa-content($fa-var-sign-out-alt); } -.#{$fa-css-prefix}-signal:before { content: fa-content($fa-var-signal); } -.#{$fa-css-prefix}-signature:before { content: fa-content($fa-var-signature); } -.#{$fa-css-prefix}-sim-card:before { content: fa-content($fa-var-sim-card); } -.#{$fa-css-prefix}-simplybuilt:before { content: fa-content($fa-var-simplybuilt); } -.#{$fa-css-prefix}-sink:before { content: fa-content($fa-var-sink); } -.#{$fa-css-prefix}-sistrix:before { content: fa-content($fa-var-sistrix); } -.#{$fa-css-prefix}-sitemap:before { content: fa-content($fa-var-sitemap); } -.#{$fa-css-prefix}-sith:before { content: fa-content($fa-var-sith); } -.#{$fa-css-prefix}-skating:before { content: fa-content($fa-var-skating); } -.#{$fa-css-prefix}-sketch:before { content: fa-content($fa-var-sketch); } -.#{$fa-css-prefix}-skiing:before { content: fa-content($fa-var-skiing); } -.#{$fa-css-prefix}-skiing-nordic:before { content: fa-content($fa-var-skiing-nordic); } -.#{$fa-css-prefix}-skull:before { content: fa-content($fa-var-skull); } -.#{$fa-css-prefix}-skull-crossbones:before { content: fa-content($fa-var-skull-crossbones); } -.#{$fa-css-prefix}-skyatlas:before { content: fa-content($fa-var-skyatlas); } -.#{$fa-css-prefix}-skype:before { content: fa-content($fa-var-skype); } -.#{$fa-css-prefix}-slack:before { content: fa-content($fa-var-slack); } -.#{$fa-css-prefix}-slack-hash:before { content: fa-content($fa-var-slack-hash); } -.#{$fa-css-prefix}-slash:before { content: fa-content($fa-var-slash); } -.#{$fa-css-prefix}-sleigh:before { content: fa-content($fa-var-sleigh); } -.#{$fa-css-prefix}-sliders-h:before { content: fa-content($fa-var-sliders-h); } -.#{$fa-css-prefix}-slideshare:before { content: fa-content($fa-var-slideshare); } -.#{$fa-css-prefix}-smile:before { content: fa-content($fa-var-smile); } -.#{$fa-css-prefix}-smile-beam:before { content: fa-content($fa-var-smile-beam); } -.#{$fa-css-prefix}-smile-wink:before { content: fa-content($fa-var-smile-wink); } -.#{$fa-css-prefix}-smog:before { content: fa-content($fa-var-smog); } -.#{$fa-css-prefix}-smoking:before { content: fa-content($fa-var-smoking); } -.#{$fa-css-prefix}-smoking-ban:before { content: fa-content($fa-var-smoking-ban); } -.#{$fa-css-prefix}-sms:before { content: fa-content($fa-var-sms); } -.#{$fa-css-prefix}-snapchat:before { content: fa-content($fa-var-snapchat); } -.#{$fa-css-prefix}-snapchat-ghost:before { content: fa-content($fa-var-snapchat-ghost); } -.#{$fa-css-prefix}-snapchat-square:before { content: fa-content($fa-var-snapchat-square); } -.#{$fa-css-prefix}-snowboarding:before { content: fa-content($fa-var-snowboarding); } -.#{$fa-css-prefix}-snowflake:before { content: fa-content($fa-var-snowflake); } -.#{$fa-css-prefix}-snowman:before { content: fa-content($fa-var-snowman); } -.#{$fa-css-prefix}-snowplow:before { content: fa-content($fa-var-snowplow); } -.#{$fa-css-prefix}-soap:before { content: fa-content($fa-var-soap); } -.#{$fa-css-prefix}-socks:before { content: fa-content($fa-var-socks); } -.#{$fa-css-prefix}-solar-panel:before { content: fa-content($fa-var-solar-panel); } -.#{$fa-css-prefix}-sort:before { content: fa-content($fa-var-sort); } -.#{$fa-css-prefix}-sort-alpha-down:before { content: fa-content($fa-var-sort-alpha-down); } -.#{$fa-css-prefix}-sort-alpha-down-alt:before { content: fa-content($fa-var-sort-alpha-down-alt); } -.#{$fa-css-prefix}-sort-alpha-up:before { content: fa-content($fa-var-sort-alpha-up); } -.#{$fa-css-prefix}-sort-alpha-up-alt:before { content: fa-content($fa-var-sort-alpha-up-alt); } -.#{$fa-css-prefix}-sort-amount-down:before { content: fa-content($fa-var-sort-amount-down); } -.#{$fa-css-prefix}-sort-amount-down-alt:before { content: fa-content($fa-var-sort-amount-down-alt); } -.#{$fa-css-prefix}-sort-amount-up:before { content: fa-content($fa-var-sort-amount-up); } -.#{$fa-css-prefix}-sort-amount-up-alt:before { content: fa-content($fa-var-sort-amount-up-alt); } -.#{$fa-css-prefix}-sort-down:before { content: fa-content($fa-var-sort-down); } -.#{$fa-css-prefix}-sort-numeric-down:before { content: fa-content($fa-var-sort-numeric-down); } -.#{$fa-css-prefix}-sort-numeric-down-alt:before { content: fa-content($fa-var-sort-numeric-down-alt); } -.#{$fa-css-prefix}-sort-numeric-up:before { content: fa-content($fa-var-sort-numeric-up); } -.#{$fa-css-prefix}-sort-numeric-up-alt:before { content: fa-content($fa-var-sort-numeric-up-alt); } -.#{$fa-css-prefix}-sort-up:before { content: fa-content($fa-var-sort-up); } -.#{$fa-css-prefix}-soundcloud:before { content: fa-content($fa-var-soundcloud); } -.#{$fa-css-prefix}-sourcetree:before { content: fa-content($fa-var-sourcetree); } -.#{$fa-css-prefix}-spa:before { content: fa-content($fa-var-spa); } -.#{$fa-css-prefix}-space-shuttle:before { content: fa-content($fa-var-space-shuttle); } -.#{$fa-css-prefix}-speakap:before { content: fa-content($fa-var-speakap); } -.#{$fa-css-prefix}-speaker-deck:before { content: fa-content($fa-var-speaker-deck); } -.#{$fa-css-prefix}-spell-check:before { content: fa-content($fa-var-spell-check); } -.#{$fa-css-prefix}-spider:before { content: fa-content($fa-var-spider); } -.#{$fa-css-prefix}-spinner:before { content: fa-content($fa-var-spinner); } -.#{$fa-css-prefix}-splotch:before { content: fa-content($fa-var-splotch); } -.#{$fa-css-prefix}-spotify:before { content: fa-content($fa-var-spotify); } -.#{$fa-css-prefix}-spray-can:before { content: fa-content($fa-var-spray-can); } -.#{$fa-css-prefix}-square:before { content: fa-content($fa-var-square); } -.#{$fa-css-prefix}-square-full:before { content: fa-content($fa-var-square-full); } -.#{$fa-css-prefix}-square-root-alt:before { content: fa-content($fa-var-square-root-alt); } -.#{$fa-css-prefix}-squarespace:before { content: fa-content($fa-var-squarespace); } -.#{$fa-css-prefix}-stack-exchange:before { content: fa-content($fa-var-stack-exchange); } -.#{$fa-css-prefix}-stack-overflow:before { content: fa-content($fa-var-stack-overflow); } -.#{$fa-css-prefix}-stackpath:before { content: fa-content($fa-var-stackpath); } -.#{$fa-css-prefix}-stamp:before { content: fa-content($fa-var-stamp); } -.#{$fa-css-prefix}-star:before { content: fa-content($fa-var-star); } -.#{$fa-css-prefix}-star-and-crescent:before { content: fa-content($fa-var-star-and-crescent); } -.#{$fa-css-prefix}-star-half:before { content: fa-content($fa-var-star-half); } -.#{$fa-css-prefix}-star-half-alt:before { content: fa-content($fa-var-star-half-alt); } -.#{$fa-css-prefix}-star-of-david:before { content: fa-content($fa-var-star-of-david); } -.#{$fa-css-prefix}-star-of-life:before { content: fa-content($fa-var-star-of-life); } -.#{$fa-css-prefix}-staylinked:before { content: fa-content($fa-var-staylinked); } -.#{$fa-css-prefix}-steam:before { content: fa-content($fa-var-steam); } -.#{$fa-css-prefix}-steam-square:before { content: fa-content($fa-var-steam-square); } -.#{$fa-css-prefix}-steam-symbol:before { content: fa-content($fa-var-steam-symbol); } -.#{$fa-css-prefix}-step-backward:before { content: fa-content($fa-var-step-backward); } -.#{$fa-css-prefix}-step-forward:before { content: fa-content($fa-var-step-forward); } -.#{$fa-css-prefix}-stethoscope:before { content: fa-content($fa-var-stethoscope); } -.#{$fa-css-prefix}-sticker-mule:before { content: fa-content($fa-var-sticker-mule); } -.#{$fa-css-prefix}-sticky-note:before { content: fa-content($fa-var-sticky-note); } -.#{$fa-css-prefix}-stop:before { content: fa-content($fa-var-stop); } -.#{$fa-css-prefix}-stop-circle:before { content: fa-content($fa-var-stop-circle); } -.#{$fa-css-prefix}-stopwatch:before { content: fa-content($fa-var-stopwatch); } -.#{$fa-css-prefix}-stopwatch-20:before { content: fa-content($fa-var-stopwatch-20); } -.#{$fa-css-prefix}-store:before { content: fa-content($fa-var-store); } -.#{$fa-css-prefix}-store-alt:before { content: fa-content($fa-var-store-alt); } -.#{$fa-css-prefix}-store-alt-slash:before { content: fa-content($fa-var-store-alt-slash); } -.#{$fa-css-prefix}-store-slash:before { content: fa-content($fa-var-store-slash); } -.#{$fa-css-prefix}-strava:before { content: fa-content($fa-var-strava); } -.#{$fa-css-prefix}-stream:before { content: fa-content($fa-var-stream); } -.#{$fa-css-prefix}-street-view:before { content: fa-content($fa-var-street-view); } -.#{$fa-css-prefix}-strikethrough:before { content: fa-content($fa-var-strikethrough); } -.#{$fa-css-prefix}-stripe:before { content: fa-content($fa-var-stripe); } -.#{$fa-css-prefix}-stripe-s:before { content: fa-content($fa-var-stripe-s); } -.#{$fa-css-prefix}-stroopwafel:before { content: fa-content($fa-var-stroopwafel); } -.#{$fa-css-prefix}-studiovinari:before { content: fa-content($fa-var-studiovinari); } -.#{$fa-css-prefix}-stumbleupon:before { content: fa-content($fa-var-stumbleupon); } -.#{$fa-css-prefix}-stumbleupon-circle:before { content: fa-content($fa-var-stumbleupon-circle); } -.#{$fa-css-prefix}-subscript:before { content: fa-content($fa-var-subscript); } -.#{$fa-css-prefix}-subway:before { content: fa-content($fa-var-subway); } -.#{$fa-css-prefix}-suitcase:before { content: fa-content($fa-var-suitcase); } -.#{$fa-css-prefix}-suitcase-rolling:before { content: fa-content($fa-var-suitcase-rolling); } -.#{$fa-css-prefix}-sun:before { content: fa-content($fa-var-sun); } -.#{$fa-css-prefix}-superpowers:before { content: fa-content($fa-var-superpowers); } -.#{$fa-css-prefix}-superscript:before { content: fa-content($fa-var-superscript); } -.#{$fa-css-prefix}-supple:before { content: fa-content($fa-var-supple); } -.#{$fa-css-prefix}-surprise:before { content: fa-content($fa-var-surprise); } -.#{$fa-css-prefix}-suse:before { content: fa-content($fa-var-suse); } -.#{$fa-css-prefix}-swatchbook:before { content: fa-content($fa-var-swatchbook); } -.#{$fa-css-prefix}-swift:before { content: fa-content($fa-var-swift); } -.#{$fa-css-prefix}-swimmer:before { content: fa-content($fa-var-swimmer); } -.#{$fa-css-prefix}-swimming-pool:before { content: fa-content($fa-var-swimming-pool); } -.#{$fa-css-prefix}-symfony:before { content: fa-content($fa-var-symfony); } -.#{$fa-css-prefix}-synagogue:before { content: fa-content($fa-var-synagogue); } -.#{$fa-css-prefix}-sync:before { content: fa-content($fa-var-sync); } -.#{$fa-css-prefix}-sync-alt:before { content: fa-content($fa-var-sync-alt); } -.#{$fa-css-prefix}-syringe:before { content: fa-content($fa-var-syringe); } -.#{$fa-css-prefix}-table:before { content: fa-content($fa-var-table); } -.#{$fa-css-prefix}-table-tennis:before { content: fa-content($fa-var-table-tennis); } -.#{$fa-css-prefix}-tablet:before { content: fa-content($fa-var-tablet); } -.#{$fa-css-prefix}-tablet-alt:before { content: fa-content($fa-var-tablet-alt); } -.#{$fa-css-prefix}-tablets:before { content: fa-content($fa-var-tablets); } -.#{$fa-css-prefix}-tachometer-alt:before { content: fa-content($fa-var-tachometer-alt); } -.#{$fa-css-prefix}-tag:before { content: fa-content($fa-var-tag); } -.#{$fa-css-prefix}-tags:before { content: fa-content($fa-var-tags); } -.#{$fa-css-prefix}-tape:before { content: fa-content($fa-var-tape); } -.#{$fa-css-prefix}-tasks:before { content: fa-content($fa-var-tasks); } -.#{$fa-css-prefix}-taxi:before { content: fa-content($fa-var-taxi); } -.#{$fa-css-prefix}-teamspeak:before { content: fa-content($fa-var-teamspeak); } -.#{$fa-css-prefix}-teeth:before { content: fa-content($fa-var-teeth); } -.#{$fa-css-prefix}-teeth-open:before { content: fa-content($fa-var-teeth-open); } -.#{$fa-css-prefix}-telegram:before { content: fa-content($fa-var-telegram); } -.#{$fa-css-prefix}-telegram-plane:before { content: fa-content($fa-var-telegram-plane); } -.#{$fa-css-prefix}-temperature-high:before { content: fa-content($fa-var-temperature-high); } -.#{$fa-css-prefix}-temperature-low:before { content: fa-content($fa-var-temperature-low); } -.#{$fa-css-prefix}-tencent-weibo:before { content: fa-content($fa-var-tencent-weibo); } -.#{$fa-css-prefix}-tenge:before { content: fa-content($fa-var-tenge); } -.#{$fa-css-prefix}-terminal:before { content: fa-content($fa-var-terminal); } -.#{$fa-css-prefix}-text-height:before { content: fa-content($fa-var-text-height); } -.#{$fa-css-prefix}-text-width:before { content: fa-content($fa-var-text-width); } -.#{$fa-css-prefix}-th:before { content: fa-content($fa-var-th); } -.#{$fa-css-prefix}-th-large:before { content: fa-content($fa-var-th-large); } -.#{$fa-css-prefix}-th-list:before { content: fa-content($fa-var-th-list); } -.#{$fa-css-prefix}-the-red-yeti:before { content: fa-content($fa-var-the-red-yeti); } -.#{$fa-css-prefix}-theater-masks:before { content: fa-content($fa-var-theater-masks); } -.#{$fa-css-prefix}-themeco:before { content: fa-content($fa-var-themeco); } -.#{$fa-css-prefix}-themeisle:before { content: fa-content($fa-var-themeisle); } -.#{$fa-css-prefix}-thermometer:before { content: fa-content($fa-var-thermometer); } -.#{$fa-css-prefix}-thermometer-empty:before { content: fa-content($fa-var-thermometer-empty); } -.#{$fa-css-prefix}-thermometer-full:before { content: fa-content($fa-var-thermometer-full); } -.#{$fa-css-prefix}-thermometer-half:before { content: fa-content($fa-var-thermometer-half); } -.#{$fa-css-prefix}-thermometer-quarter:before { content: fa-content($fa-var-thermometer-quarter); } -.#{$fa-css-prefix}-thermometer-three-quarters:before { content: fa-content($fa-var-thermometer-three-quarters); } -.#{$fa-css-prefix}-think-peaks:before { content: fa-content($fa-var-think-peaks); } -.#{$fa-css-prefix}-thumbs-down:before { content: fa-content($fa-var-thumbs-down); } -.#{$fa-css-prefix}-thumbs-up:before { content: fa-content($fa-var-thumbs-up); } -.#{$fa-css-prefix}-thumbtack:before { content: fa-content($fa-var-thumbtack); } -.#{$fa-css-prefix}-ticket-alt:before { content: fa-content($fa-var-ticket-alt); } -.#{$fa-css-prefix}-tiktok:before { content: fa-content($fa-var-tiktok); } -.#{$fa-css-prefix}-times:before { content: fa-content($fa-var-times); } -.#{$fa-css-prefix}-times-circle:before { content: fa-content($fa-var-times-circle); } -.#{$fa-css-prefix}-tint:before { content: fa-content($fa-var-tint); } -.#{$fa-css-prefix}-tint-slash:before { content: fa-content($fa-var-tint-slash); } -.#{$fa-css-prefix}-tired:before { content: fa-content($fa-var-tired); } -.#{$fa-css-prefix}-toggle-off:before { content: fa-content($fa-var-toggle-off); } -.#{$fa-css-prefix}-toggle-on:before { content: fa-content($fa-var-toggle-on); } -.#{$fa-css-prefix}-toilet:before { content: fa-content($fa-var-toilet); } -.#{$fa-css-prefix}-toilet-paper:before { content: fa-content($fa-var-toilet-paper); } -.#{$fa-css-prefix}-toilet-paper-slash:before { content: fa-content($fa-var-toilet-paper-slash); } -.#{$fa-css-prefix}-toolbox:before { content: fa-content($fa-var-toolbox); } -.#{$fa-css-prefix}-tools:before { content: fa-content($fa-var-tools); } -.#{$fa-css-prefix}-tooth:before { content: fa-content($fa-var-tooth); } -.#{$fa-css-prefix}-torah:before { content: fa-content($fa-var-torah); } -.#{$fa-css-prefix}-torii-gate:before { content: fa-content($fa-var-torii-gate); } -.#{$fa-css-prefix}-tractor:before { content: fa-content($fa-var-tractor); } -.#{$fa-css-prefix}-trade-federation:before { content: fa-content($fa-var-trade-federation); } -.#{$fa-css-prefix}-trademark:before { content: fa-content($fa-var-trademark); } -.#{$fa-css-prefix}-traffic-light:before { content: fa-content($fa-var-traffic-light); } -.#{$fa-css-prefix}-trailer:before { content: fa-content($fa-var-trailer); } -.#{$fa-css-prefix}-train:before { content: fa-content($fa-var-train); } -.#{$fa-css-prefix}-tram:before { content: fa-content($fa-var-tram); } -.#{$fa-css-prefix}-transgender:before { content: fa-content($fa-var-transgender); } -.#{$fa-css-prefix}-transgender-alt:before { content: fa-content($fa-var-transgender-alt); } -.#{$fa-css-prefix}-trash:before { content: fa-content($fa-var-trash); } -.#{$fa-css-prefix}-trash-alt:before { content: fa-content($fa-var-trash-alt); } -.#{$fa-css-prefix}-trash-restore:before { content: fa-content($fa-var-trash-restore); } -.#{$fa-css-prefix}-trash-restore-alt:before { content: fa-content($fa-var-trash-restore-alt); } -.#{$fa-css-prefix}-tree:before { content: fa-content($fa-var-tree); } -.#{$fa-css-prefix}-trello:before { content: fa-content($fa-var-trello); } -.#{$fa-css-prefix}-tripadvisor:before { content: fa-content($fa-var-tripadvisor); } -.#{$fa-css-prefix}-trophy:before { content: fa-content($fa-var-trophy); } -.#{$fa-css-prefix}-truck:before { content: fa-content($fa-var-truck); } -.#{$fa-css-prefix}-truck-loading:before { content: fa-content($fa-var-truck-loading); } -.#{$fa-css-prefix}-truck-monster:before { content: fa-content($fa-var-truck-monster); } -.#{$fa-css-prefix}-truck-moving:before { content: fa-content($fa-var-truck-moving); } -.#{$fa-css-prefix}-truck-pickup:before { content: fa-content($fa-var-truck-pickup); } -.#{$fa-css-prefix}-tshirt:before { content: fa-content($fa-var-tshirt); } -.#{$fa-css-prefix}-tty:before { content: fa-content($fa-var-tty); } -.#{$fa-css-prefix}-tumblr:before { content: fa-content($fa-var-tumblr); } -.#{$fa-css-prefix}-tumblr-square:before { content: fa-content($fa-var-tumblr-square); } -.#{$fa-css-prefix}-tv:before { content: fa-content($fa-var-tv); } -.#{$fa-css-prefix}-twitch:before { content: fa-content($fa-var-twitch); } -.#{$fa-css-prefix}-twitter:before { content: fa-content($fa-var-twitter); } -.#{$fa-css-prefix}-twitter-square:before { content: fa-content($fa-var-twitter-square); } -.#{$fa-css-prefix}-typo3:before { content: fa-content($fa-var-typo3); } -.#{$fa-css-prefix}-uber:before { content: fa-content($fa-var-uber); } -.#{$fa-css-prefix}-ubuntu:before { content: fa-content($fa-var-ubuntu); } -.#{$fa-css-prefix}-uikit:before { content: fa-content($fa-var-uikit); } -.#{$fa-css-prefix}-umbraco:before { content: fa-content($fa-var-umbraco); } -.#{$fa-css-prefix}-umbrella:before { content: fa-content($fa-var-umbrella); } -.#{$fa-css-prefix}-umbrella-beach:before { content: fa-content($fa-var-umbrella-beach); } -.#{$fa-css-prefix}-underline:before { content: fa-content($fa-var-underline); } -.#{$fa-css-prefix}-undo:before { content: fa-content($fa-var-undo); } -.#{$fa-css-prefix}-undo-alt:before { content: fa-content($fa-var-undo-alt); } -.#{$fa-css-prefix}-uniregistry:before { content: fa-content($fa-var-uniregistry); } -.#{$fa-css-prefix}-unity:before { content: fa-content($fa-var-unity); } -.#{$fa-css-prefix}-universal-access:before { content: fa-content($fa-var-universal-access); } -.#{$fa-css-prefix}-university:before { content: fa-content($fa-var-university); } -.#{$fa-css-prefix}-unlink:before { content: fa-content($fa-var-unlink); } -.#{$fa-css-prefix}-unlock:before { content: fa-content($fa-var-unlock); } -.#{$fa-css-prefix}-unlock-alt:before { content: fa-content($fa-var-unlock-alt); } -.#{$fa-css-prefix}-unsplash:before { content: fa-content($fa-var-unsplash); } -.#{$fa-css-prefix}-untappd:before { content: fa-content($fa-var-untappd); } -.#{$fa-css-prefix}-upload:before { content: fa-content($fa-var-upload); } -.#{$fa-css-prefix}-ups:before { content: fa-content($fa-var-ups); } -.#{$fa-css-prefix}-usb:before { content: fa-content($fa-var-usb); } -.#{$fa-css-prefix}-user:before { content: fa-content($fa-var-user); } -.#{$fa-css-prefix}-user-alt:before { content: fa-content($fa-var-user-alt); } -.#{$fa-css-prefix}-user-alt-slash:before { content: fa-content($fa-var-user-alt-slash); } -.#{$fa-css-prefix}-user-astronaut:before { content: fa-content($fa-var-user-astronaut); } -.#{$fa-css-prefix}-user-check:before { content: fa-content($fa-var-user-check); } -.#{$fa-css-prefix}-user-circle:before { content: fa-content($fa-var-user-circle); } -.#{$fa-css-prefix}-user-clock:before { content: fa-content($fa-var-user-clock); } -.#{$fa-css-prefix}-user-cog:before { content: fa-content($fa-var-user-cog); } -.#{$fa-css-prefix}-user-edit:before { content: fa-content($fa-var-user-edit); } -.#{$fa-css-prefix}-user-friends:before { content: fa-content($fa-var-user-friends); } -.#{$fa-css-prefix}-user-graduate:before { content: fa-content($fa-var-user-graduate); } -.#{$fa-css-prefix}-user-injured:before { content: fa-content($fa-var-user-injured); } -.#{$fa-css-prefix}-user-lock:before { content: fa-content($fa-var-user-lock); } -.#{$fa-css-prefix}-user-md:before { content: fa-content($fa-var-user-md); } -.#{$fa-css-prefix}-user-minus:before { content: fa-content($fa-var-user-minus); } -.#{$fa-css-prefix}-user-ninja:before { content: fa-content($fa-var-user-ninja); } -.#{$fa-css-prefix}-user-nurse:before { content: fa-content($fa-var-user-nurse); } -.#{$fa-css-prefix}-user-plus:before { content: fa-content($fa-var-user-plus); } -.#{$fa-css-prefix}-user-secret:before { content: fa-content($fa-var-user-secret); } -.#{$fa-css-prefix}-user-shield:before { content: fa-content($fa-var-user-shield); } -.#{$fa-css-prefix}-user-slash:before { content: fa-content($fa-var-user-slash); } -.#{$fa-css-prefix}-user-tag:before { content: fa-content($fa-var-user-tag); } -.#{$fa-css-prefix}-user-tie:before { content: fa-content($fa-var-user-tie); } -.#{$fa-css-prefix}-user-times:before { content: fa-content($fa-var-user-times); } -.#{$fa-css-prefix}-users:before { content: fa-content($fa-var-users); } -.#{$fa-css-prefix}-users-cog:before { content: fa-content($fa-var-users-cog); } -.#{$fa-css-prefix}-users-slash:before { content: fa-content($fa-var-users-slash); } -.#{$fa-css-prefix}-usps:before { content: fa-content($fa-var-usps); } -.#{$fa-css-prefix}-ussunnah:before { content: fa-content($fa-var-ussunnah); } -.#{$fa-css-prefix}-utensil-spoon:before { content: fa-content($fa-var-utensil-spoon); } -.#{$fa-css-prefix}-utensils:before { content: fa-content($fa-var-utensils); } -.#{$fa-css-prefix}-vaadin:before { content: fa-content($fa-var-vaadin); } -.#{$fa-css-prefix}-vector-square:before { content: fa-content($fa-var-vector-square); } -.#{$fa-css-prefix}-venus:before { content: fa-content($fa-var-venus); } -.#{$fa-css-prefix}-venus-double:before { content: fa-content($fa-var-venus-double); } -.#{$fa-css-prefix}-venus-mars:before { content: fa-content($fa-var-venus-mars); } -.#{$fa-css-prefix}-viacoin:before { content: fa-content($fa-var-viacoin); } -.#{$fa-css-prefix}-viadeo:before { content: fa-content($fa-var-viadeo); } -.#{$fa-css-prefix}-viadeo-square:before { content: fa-content($fa-var-viadeo-square); } -.#{$fa-css-prefix}-vial:before { content: fa-content($fa-var-vial); } -.#{$fa-css-prefix}-vials:before { content: fa-content($fa-var-vials); } -.#{$fa-css-prefix}-viber:before { content: fa-content($fa-var-viber); } -.#{$fa-css-prefix}-video:before { content: fa-content($fa-var-video); } -.#{$fa-css-prefix}-video-slash:before { content: fa-content($fa-var-video-slash); } -.#{$fa-css-prefix}-vihara:before { content: fa-content($fa-var-vihara); } -.#{$fa-css-prefix}-vimeo:before { content: fa-content($fa-var-vimeo); } -.#{$fa-css-prefix}-vimeo-square:before { content: fa-content($fa-var-vimeo-square); } -.#{$fa-css-prefix}-vimeo-v:before { content: fa-content($fa-var-vimeo-v); } -.#{$fa-css-prefix}-vine:before { content: fa-content($fa-var-vine); } -.#{$fa-css-prefix}-virus:before { content: fa-content($fa-var-virus); } -.#{$fa-css-prefix}-virus-slash:before { content: fa-content($fa-var-virus-slash); } -.#{$fa-css-prefix}-viruses:before { content: fa-content($fa-var-viruses); } -.#{$fa-css-prefix}-vk:before { content: fa-content($fa-var-vk); } -.#{$fa-css-prefix}-vnv:before { content: fa-content($fa-var-vnv); } -.#{$fa-css-prefix}-voicemail:before { content: fa-content($fa-var-voicemail); } -.#{$fa-css-prefix}-volleyball-ball:before { content: fa-content($fa-var-volleyball-ball); } -.#{$fa-css-prefix}-volume-down:before { content: fa-content($fa-var-volume-down); } -.#{$fa-css-prefix}-volume-mute:before { content: fa-content($fa-var-volume-mute); } -.#{$fa-css-prefix}-volume-off:before { content: fa-content($fa-var-volume-off); } -.#{$fa-css-prefix}-volume-up:before { content: fa-content($fa-var-volume-up); } -.#{$fa-css-prefix}-vote-yea:before { content: fa-content($fa-var-vote-yea); } -.#{$fa-css-prefix}-vr-cardboard:before { content: fa-content($fa-var-vr-cardboard); } -.#{$fa-css-prefix}-vuejs:before { content: fa-content($fa-var-vuejs); } -.#{$fa-css-prefix}-walking:before { content: fa-content($fa-var-walking); } -.#{$fa-css-prefix}-wallet:before { content: fa-content($fa-var-wallet); } -.#{$fa-css-prefix}-warehouse:before { content: fa-content($fa-var-warehouse); } -.#{$fa-css-prefix}-water:before { content: fa-content($fa-var-water); } -.#{$fa-css-prefix}-wave-square:before { content: fa-content($fa-var-wave-square); } -.#{$fa-css-prefix}-waze:before { content: fa-content($fa-var-waze); } -.#{$fa-css-prefix}-weebly:before { content: fa-content($fa-var-weebly); } -.#{$fa-css-prefix}-weibo:before { content: fa-content($fa-var-weibo); } -.#{$fa-css-prefix}-weight:before { content: fa-content($fa-var-weight); } -.#{$fa-css-prefix}-weight-hanging:before { content: fa-content($fa-var-weight-hanging); } -.#{$fa-css-prefix}-weixin:before { content: fa-content($fa-var-weixin); } -.#{$fa-css-prefix}-whatsapp:before { content: fa-content($fa-var-whatsapp); } -.#{$fa-css-prefix}-whatsapp-square:before { content: fa-content($fa-var-whatsapp-square); } -.#{$fa-css-prefix}-wheelchair:before { content: fa-content($fa-var-wheelchair); } -.#{$fa-css-prefix}-whmcs:before { content: fa-content($fa-var-whmcs); } -.#{$fa-css-prefix}-wifi:before { content: fa-content($fa-var-wifi); } -.#{$fa-css-prefix}-wikipedia-w:before { content: fa-content($fa-var-wikipedia-w); } -.#{$fa-css-prefix}-wind:before { content: fa-content($fa-var-wind); } -.#{$fa-css-prefix}-window-close:before { content: fa-content($fa-var-window-close); } -.#{$fa-css-prefix}-window-maximize:before { content: fa-content($fa-var-window-maximize); } -.#{$fa-css-prefix}-window-minimize:before { content: fa-content($fa-var-window-minimize); } -.#{$fa-css-prefix}-window-restore:before { content: fa-content($fa-var-window-restore); } -.#{$fa-css-prefix}-windows:before { content: fa-content($fa-var-windows); } -.#{$fa-css-prefix}-wine-bottle:before { content: fa-content($fa-var-wine-bottle); } -.#{$fa-css-prefix}-wine-glass:before { content: fa-content($fa-var-wine-glass); } -.#{$fa-css-prefix}-wine-glass-alt:before { content: fa-content($fa-var-wine-glass-alt); } -.#{$fa-css-prefix}-wix:before { content: fa-content($fa-var-wix); } -.#{$fa-css-prefix}-wizards-of-the-coast:before { content: fa-content($fa-var-wizards-of-the-coast); } -.#{$fa-css-prefix}-wolf-pack-battalion:before { content: fa-content($fa-var-wolf-pack-battalion); } -.#{$fa-css-prefix}-won-sign:before { content: fa-content($fa-var-won-sign); } -.#{$fa-css-prefix}-wordpress:before { content: fa-content($fa-var-wordpress); } -.#{$fa-css-prefix}-wordpress-simple:before { content: fa-content($fa-var-wordpress-simple); } -.#{$fa-css-prefix}-wpbeginner:before { content: fa-content($fa-var-wpbeginner); } -.#{$fa-css-prefix}-wpexplorer:before { content: fa-content($fa-var-wpexplorer); } -.#{$fa-css-prefix}-wpforms:before { content: fa-content($fa-var-wpforms); } -.#{$fa-css-prefix}-wpressr:before { content: fa-content($fa-var-wpressr); } -.#{$fa-css-prefix}-wrench:before { content: fa-content($fa-var-wrench); } -.#{$fa-css-prefix}-x-ray:before { content: fa-content($fa-var-x-ray); } -.#{$fa-css-prefix}-xbox:before { content: fa-content($fa-var-xbox); } -.#{$fa-css-prefix}-xing:before { content: fa-content($fa-var-xing); } -.#{$fa-css-prefix}-xing-square:before { content: fa-content($fa-var-xing-square); } -.#{$fa-css-prefix}-y-combinator:before { content: fa-content($fa-var-y-combinator); } -.#{$fa-css-prefix}-yahoo:before { content: fa-content($fa-var-yahoo); } -.#{$fa-css-prefix}-yammer:before { content: fa-content($fa-var-yammer); } -.#{$fa-css-prefix}-yandex:before { content: fa-content($fa-var-yandex); } -.#{$fa-css-prefix}-yandex-international:before { content: fa-content($fa-var-yandex-international); } -.#{$fa-css-prefix}-yarn:before { content: fa-content($fa-var-yarn); } -.#{$fa-css-prefix}-yelp:before { content: fa-content($fa-var-yelp); } -.#{$fa-css-prefix}-yen-sign:before { content: fa-content($fa-var-yen-sign); } -.#{$fa-css-prefix}-yin-yang:before { content: fa-content($fa-var-yin-yang); } -.#{$fa-css-prefix}-yoast:before { content: fa-content($fa-var-yoast); } -.#{$fa-css-prefix}-youtube:before { content: fa-content($fa-var-youtube); } -.#{$fa-css-prefix}-youtube-square:before { content: fa-content($fa-var-youtube-square); } -.#{$fa-css-prefix}-zhihu:before { content: fa-content($fa-var-zhihu); } diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_larger.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_larger.scss deleted file mode 100644 index 58a3f67..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_larger.scss +++ /dev/null @@ -1,23 +0,0 @@ -// Icon Sizes -// ------------------------- -@use 'sass:math'; -// makes the font 33% larger relative to the icon container -.#{$fa-css-prefix}-lg { - font-size: (math.div(4em, 3)); - line-height: (math.div(3em, 4)); - vertical-align: -0.0667em; -} - -.#{$fa-css-prefix}-xs { - font-size: 0.75em; -} - -.#{$fa-css-prefix}-sm { - font-size: 0.875em; -} - -@for $i from 1 through 10 { - .#{$fa-css-prefix}-#{$i}x { - font-size: $i * 1em; - } -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_list.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_list.scss deleted file mode 100644 index a44483e..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_list.scss +++ /dev/null @@ -1,21 +0,0 @@ -// List Icons -// ------------------------- -@use 'sass:math'; - -.#{$fa-css-prefix}-ul { - list-style-type: none; - margin-left: math.div($fa-li-width * 5, 4); - padding-left: 0; - - > li { - position: relative; - } -} - -.#{$fa-css-prefix}-li { - left: -$fa-li-width; - position: absolute; - text-align: center; - width: $fa-li-width; - line-height: inherit; -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_mixins.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_mixins.scss deleted file mode 100644 index 55baeeb..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_mixins.scss +++ /dev/null @@ -1,56 +0,0 @@ -// Mixins -// -------------------------- - -@mixin fa-icon { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - display: inline-block; - font-style: normal; - font-variant: normal; - font-weight: normal; - line-height: 1; -} - -@mixin fa-icon-rotate($degrees, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; - transform: rotate($degrees); -} - -@mixin fa-icon-flip($horiz, $vert, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; - transform: scale($horiz, $vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -@mixin sr-only { - border: 0; - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -@mixin sr-only-focusable { - &:active, - &:focus { - clip: auto; - height: auto; - margin: 0; - overflow: visible; - position: static; - width: auto; - } -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_rotated-flipped.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_rotated-flipped.scss deleted file mode 100644 index 164d972..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_rotated-flipped.scss +++ /dev/null @@ -1,24 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } -.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } -.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } - -.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } -.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } -.#{$fa-css-prefix}-flip-both, .#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root { - .#{$fa-css-prefix}-rotate-90, - .#{$fa-css-prefix}-rotate-180, - .#{$fa-css-prefix}-rotate-270, - .#{$fa-css-prefix}-flip-horizontal, - .#{$fa-css-prefix}-flip-vertical, - .#{$fa-css-prefix}-flip-both { - filter: none; - } -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_screen-reader.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_screen-reader.scss deleted file mode 100644 index 5d0ab26..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_screen-reader.scss +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { @include sr-only; } -.sr-only-focusable { @include sr-only-focusable; } diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_shims.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_shims.scss deleted file mode 100644 index d175344..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_shims.scss +++ /dev/null @@ -1,2066 +0,0 @@ -.#{$fa-css-prefix}.#{$fa-css-prefix}-glass:before { content: fa-content($fa-var-glass-martini); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-meetup { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-star-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-star-o:before { content: fa-content($fa-var-star); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-remove:before { content: fa-content($fa-var-times); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-close:before { content: fa-content($fa-var-times); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-gear:before { content: fa-content($fa-var-cog); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-trash-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-trash-o:before { content: fa-content($fa-var-trash-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-o:before { content: fa-content($fa-var-file); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-clock-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-clock-o:before { content: fa-content($fa-var-clock); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-down:before { content: fa-content($fa-var-arrow-alt-circle-down); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-up:before { content: fa-content($fa-var-arrow-alt-circle-up); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-play-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-play-circle-o:before { content: fa-content($fa-var-play-circle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-repeat:before { content: fa-content($fa-var-redo); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-rotate-right:before { content: fa-content($fa-var-redo); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-refresh:before { content: fa-content($fa-var-sync); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-list-alt { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-dedent:before { content: fa-content($fa-var-outdent); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-video-camera:before { content: fa-content($fa-var-video); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-picture-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-picture-o:before { content: fa-content($fa-var-image); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-photo { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-photo:before { content: fa-content($fa-var-image); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-image { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-image:before { content: fa-content($fa-var-image); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pencil:before { content: fa-content($fa-var-pencil-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-map-marker:before { content: fa-content($fa-var-map-marker-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pencil-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-pencil-square-o:before { content: fa-content($fa-var-edit); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-share-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-share-square-o:before { content: fa-content($fa-var-share-square); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-check-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-check-square-o:before { content: fa-content($fa-var-check-square); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrows:before { content: fa-content($fa-var-arrows-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-times-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-times-circle-o:before { content: fa-content($fa-var-times-circle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-check-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-check-circle-o:before { content: fa-content($fa-var-check-circle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-mail-forward:before { content: fa-content($fa-var-share); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-expand:before { content: fa-content($fa-var-expand-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-compress:before { content: fa-content($fa-var-compress-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-eye { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-eye-slash { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-warning:before { content: fa-content($fa-var-exclamation-triangle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar:before { content: fa-content($fa-var-calendar-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrows-v:before { content: fa-content($fa-var-arrows-alt-v); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrows-h:before { content: fa-content($fa-var-arrows-alt-h); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bar-chart { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-bar-chart:before { content: fa-content($fa-var-chart-bar); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bar-chart-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-bar-chart-o:before { content: fa-content($fa-var-chart-bar); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-twitter-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-gears:before { content: fa-content($fa-var-cogs); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-up:before { content: fa-content($fa-var-thumbs-up); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-down:before { content: fa-content($fa-var-thumbs-down); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-heart-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-heart-o:before { content: fa-content($fa-var-heart); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sign-out:before { content: fa-content($fa-var-sign-out-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin-square:before { content: fa-content($fa-var-linkedin); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-thumb-tack:before { content: fa-content($fa-var-thumbtack); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-external-link:before { content: fa-content($fa-var-external-link-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sign-in:before { content: fa-content($fa-var-sign-in-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-github-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-lemon-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-lemon-o:before { content: fa-content($fa-var-lemon); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-square-o:before { content: fa-content($fa-var-square); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bookmark-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-bookmark-o:before { content: fa-content($fa-var-bookmark); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-twitter { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook:before { content: fa-content($fa-var-facebook-f); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-f { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-f:before { content: fa-content($fa-var-facebook-f); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-github { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-credit-card { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-feed:before { content: fa-content($fa-var-rss); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hdd-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hdd-o:before { content: fa-content($fa-var-hdd); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-right:before { content: fa-content($fa-var-hand-point-right); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-left:before { content: fa-content($fa-var-hand-point-left); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-up:before { content: fa-content($fa-var-hand-point-up); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-down:before { content: fa-content($fa-var-hand-point-down); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrows-alt:before { content: fa-content($fa-var-expand-arrows-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-group:before { content: fa-content($fa-var-users); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-chain:before { content: fa-content($fa-var-link); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-scissors:before { content: fa-content($fa-var-cut); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-files-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-files-o:before { content: fa-content($fa-var-copy); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-floppy-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-floppy-o:before { content: fa-content($fa-var-save); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-navicon:before { content: fa-content($fa-var-bars); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-reorder:before { content: fa-content($fa-var-bars); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pinterest { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pinterest-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus:before { content: fa-content($fa-var-google-plus-g); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-money { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-money:before { content: fa-content($fa-var-money-bill-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-unsorted:before { content: fa-content($fa-var-sort); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-desc:before { content: fa-content($fa-var-sort-down); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-asc:before { content: fa-content($fa-var-sort-up); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin:before { content: fa-content($fa-var-linkedin-in); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-rotate-left:before { content: fa-content($fa-var-undo); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-legal:before { content: fa-content($fa-var-gavel); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-tachometer:before { content: fa-content($fa-var-tachometer-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-dashboard:before { content: fa-content($fa-var-tachometer-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-comment-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-comment-o:before { content: fa-content($fa-var-comment); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-comments-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-comments-o:before { content: fa-content($fa-var-comments); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-flash:before { content: fa-content($fa-var-bolt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-clipboard { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-paste { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-paste:before { content: fa-content($fa-var-clipboard); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-lightbulb-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-lightbulb-o:before { content: fa-content($fa-var-lightbulb); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-exchange:before { content: fa-content($fa-var-exchange-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cloud-download:before { content: fa-content($fa-var-cloud-download-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cloud-upload:before { content: fa-content($fa-var-cloud-upload-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bell-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-bell-o:before { content: fa-content($fa-var-bell); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cutlery:before { content: fa-content($fa-var-utensils); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-text-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-text-o:before { content: fa-content($fa-var-file-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-building-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-building-o:before { content: fa-content($fa-var-building); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hospital-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hospital-o:before { content: fa-content($fa-var-hospital); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-tablet:before { content: fa-content($fa-var-tablet-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-mobile:before { content: fa-content($fa-var-mobile-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-mobile-phone:before { content: fa-content($fa-var-mobile-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-circle-o:before { content: fa-content($fa-var-circle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-mail-reply:before { content: fa-content($fa-var-reply); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-github-alt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-folder-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-folder-o:before { content: fa-content($fa-var-folder); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-folder-open-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-folder-open-o:before { content: fa-content($fa-var-folder-open); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-smile-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-smile-o:before { content: fa-content($fa-var-smile); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-frown-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-frown-o:before { content: fa-content($fa-var-frown); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-meh-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-meh-o:before { content: fa-content($fa-var-meh); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-keyboard-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-keyboard-o:before { content: fa-content($fa-var-keyboard); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-flag-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-flag-o:before { content: fa-content($fa-var-flag); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-mail-reply-all:before { content: fa-content($fa-var-reply-all); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-o:before { content: fa-content($fa-var-star-half); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-empty { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-empty:before { content: fa-content($fa-var-star-half); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-full { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-full:before { content: fa-content($fa-var-star-half); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-code-fork:before { content: fa-content($fa-var-code-branch); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-chain-broken:before { content: fa-content($fa-var-unlink); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-shield:before { content: fa-content($fa-var-shield-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-o:before { content: fa-content($fa-var-calendar); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-maxcdn { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-html5 { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-css3 { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-ticket:before { content: fa-content($fa-var-ticket-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-minus-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-minus-square-o:before { content: fa-content($fa-var-minus-square); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-level-up:before { content: fa-content($fa-var-level-up-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-level-down:before { content: fa-content($fa-var-level-down-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pencil-square:before { content: fa-content($fa-var-pen-square); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-external-link-square:before { content: fa-content($fa-var-external-link-square-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-compass { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-down:before { content: fa-content($fa-var-caret-square-down); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-down:before { content: fa-content($fa-var-caret-square-down); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-up:before { content: fa-content($fa-var-caret-square-up); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-up:before { content: fa-content($fa-var-caret-square-up); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-right:before { content: fa-content($fa-var-caret-square-right); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-right:before { content: fa-content($fa-var-caret-square-right); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-eur:before { content: fa-content($fa-var-euro-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-euro:before { content: fa-content($fa-var-euro-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-gbp:before { content: fa-content($fa-var-pound-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-usd:before { content: fa-content($fa-var-dollar-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-dollar:before { content: fa-content($fa-var-dollar-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-inr:before { content: fa-content($fa-var-rupee-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-rupee:before { content: fa-content($fa-var-rupee-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-jpy:before { content: fa-content($fa-var-yen-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cny:before { content: fa-content($fa-var-yen-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-rmb:before { content: fa-content($fa-var-yen-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-yen:before { content: fa-content($fa-var-yen-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-rub:before { content: fa-content($fa-var-ruble-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-ruble:before { content: fa-content($fa-var-ruble-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-rouble:before { content: fa-content($fa-var-ruble-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-krw:before { content: fa-content($fa-var-won-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-won:before { content: fa-content($fa-var-won-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-btc { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bitcoin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-bitcoin:before { content: fa-content($fa-var-btc); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-text:before { content: fa-content($fa-var-file-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-alpha-asc:before { content: fa-content($fa-var-sort-alpha-down); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-alpha-desc:before { content: fa-content($fa-var-sort-alpha-down-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-amount-asc:before { content: fa-content($fa-var-sort-amount-down); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-amount-desc:before { content: fa-content($fa-var-sort-amount-down-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-numeric-asc:before { content: fa-content($fa-var-sort-numeric-down); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-numeric-desc:before { content: fa-content($fa-var-sort-numeric-down-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-youtube-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-youtube { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-xing { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-xing-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-youtube-play { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-youtube-play:before { content: fa-content($fa-var-youtube); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-dropbox { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-stack-overflow { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-instagram { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-flickr { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-adn { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bitbucket { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bitbucket-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-bitbucket-square:before { content: fa-content($fa-var-bitbucket); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-tumblr { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-tumblr-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-down:before { content: fa-content($fa-var-long-arrow-alt-down); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-up:before { content: fa-content($fa-var-long-arrow-alt-up); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-left:before { content: fa-content($fa-var-long-arrow-alt-left); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-right:before { content: fa-content($fa-var-long-arrow-alt-right); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-apple { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-windows { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-android { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-linux { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-dribbble { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-skype { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-foursquare { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-trello { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-gratipay { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-gittip { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-gittip:before { content: fa-content($fa-var-gratipay); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sun-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-sun-o:before { content: fa-content($fa-var-sun); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-moon-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-moon-o:before { content: fa-content($fa-var-moon); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-vk { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-weibo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-renren { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pagelines { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-stack-exchange { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-right:before { content: fa-content($fa-var-arrow-alt-circle-right); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-left:before { content: fa-content($fa-var-arrow-alt-circle-left); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-left:before { content: fa-content($fa-var-caret-square-left); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-left:before { content: fa-content($fa-var-caret-square-left); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-dot-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-dot-circle-o:before { content: fa-content($fa-var-dot-circle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-vimeo-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-try:before { content: fa-content($fa-var-lira-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-turkish-lira:before { content: fa-content($fa-var-lira-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-plus-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-plus-square-o:before { content: fa-content($fa-var-plus-square); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-slack { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-wordpress { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-openid { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-institution:before { content: fa-content($fa-var-university); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bank:before { content: fa-content($fa-var-university); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-mortar-board:before { content: fa-content($fa-var-graduation-cap); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-yahoo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-google { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-reddit { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-reddit-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-stumbleupon-circle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-stumbleupon { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-delicious { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-digg { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pied-piper-pp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pied-piper-alt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-drupal { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-joomla { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-spoon:before { content: fa-content($fa-var-utensil-spoon); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-behance { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-behance-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-steam { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-steam-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-automobile:before { content: fa-content($fa-var-car); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-o:before { content: fa-content($fa-var-envelope); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-spotify { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-deviantart { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-soundcloud { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-pdf-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-pdf-o:before { content: fa-content($fa-var-file-pdf); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-word-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-word-o:before { content: fa-content($fa-var-file-word); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-excel-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-excel-o:before { content: fa-content($fa-var-file-excel); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-powerpoint-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-powerpoint-o:before { content: fa-content($fa-var-file-powerpoint); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-image-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-image-o:before { content: fa-content($fa-var-file-image); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-photo-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-photo-o:before { content: fa-content($fa-var-file-image); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-picture-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-picture-o:before { content: fa-content($fa-var-file-image); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-archive-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-archive-o:before { content: fa-content($fa-var-file-archive); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-zip-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-zip-o:before { content: fa-content($fa-var-file-archive); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-audio-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-audio-o:before { content: fa-content($fa-var-file-audio); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-sound-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-sound-o:before { content: fa-content($fa-var-file-audio); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-video-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-video-o:before { content: fa-content($fa-var-file-video); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-movie-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-movie-o:before { content: fa-content($fa-var-file-video); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-code-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-file-code-o:before { content: fa-content($fa-var-file-code); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-vine { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-codepen { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-jsfiddle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-life-ring { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-life-bouy { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-life-bouy:before { content: fa-content($fa-var-life-ring); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-life-buoy { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-life-buoy:before { content: fa-content($fa-var-life-ring); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-life-saver { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-life-saver:before { content: fa-content($fa-var-life-ring); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-support { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-support:before { content: fa-content($fa-var-life-ring); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-circle-o-notch:before { content: fa-content($fa-var-circle-notch); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-rebel { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-ra { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-ra:before { content: fa-content($fa-var-rebel); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-resistance { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-resistance:before { content: fa-content($fa-var-rebel); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-empire { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-ge { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-ge:before { content: fa-content($fa-var-empire); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-git-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-git { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hacker-news { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-y-combinator-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-y-combinator-square:before { content: fa-content($fa-var-hacker-news); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-yc-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-yc-square:before { content: fa-content($fa-var-hacker-news); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-tencent-weibo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-qq { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-weixin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-wechat { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-wechat:before { content: fa-content($fa-var-weixin); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-send:before { content: fa-content($fa-var-paper-plane); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-paper-plane-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-paper-plane-o:before { content: fa-content($fa-var-paper-plane); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-send-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-send-o:before { content: fa-content($fa-var-paper-plane); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-circle-thin { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-circle-thin:before { content: fa-content($fa-var-circle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-header:before { content: fa-content($fa-var-heading); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sliders:before { content: fa-content($fa-var-sliders-h); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-futbol-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-futbol-o:before { content: fa-content($fa-var-futbol); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-soccer-ball-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-soccer-ball-o:before { content: fa-content($fa-var-futbol); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-slideshare { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-twitch { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-yelp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-newspaper-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-newspaper-o:before { content: fa-content($fa-var-newspaper); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-paypal { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-google-wallet { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-visa { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-mastercard { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-discover { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-amex { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-paypal { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-stripe { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bell-slash-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-bell-slash-o:before { content: fa-content($fa-var-bell-slash); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-trash:before { content: fa-content($fa-var-trash-alt); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-copyright { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-eyedropper:before { content: fa-content($fa-var-eye-dropper); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-area-chart:before { content: fa-content($fa-var-chart-area); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pie-chart:before { content: fa-content($fa-var-chart-pie); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-line-chart:before { content: fa-content($fa-var-chart-line); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-lastfm { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-lastfm-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-ioxhost { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-angellist { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cc { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-cc:before { content: fa-content($fa-var-closed-captioning); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-ils:before { content: fa-content($fa-var-shekel-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-shekel:before { content: fa-content($fa-var-shekel-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sheqel:before { content: fa-content($fa-var-shekel-sign); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-meanpath { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-meanpath:before { content: fa-content($fa-var-font-awesome); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-buysellads { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-connectdevelop { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-dashcube { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-forumbee { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-leanpub { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sellsy { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-shirtsinbulk { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-simplybuilt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-skyatlas { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-diamond { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-diamond:before { content: fa-content($fa-var-gem); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-intersex:before { content: fa-content($fa-var-transgender); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-official { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-official:before { content: fa-content($fa-var-facebook); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pinterest-p { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-whatsapp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hotel:before { content: fa-content($fa-var-bed); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-viacoin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-medium { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-y-combinator { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-yc { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-yc:before { content: fa-content($fa-var-y-combinator); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-optin-monster { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-opencart { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-expeditedssl { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-battery-4:before { content: fa-content($fa-var-battery-full); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-battery:before { content: fa-content($fa-var-battery-full); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-battery-3:before { content: fa-content($fa-var-battery-three-quarters); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-battery-2:before { content: fa-content($fa-var-battery-half); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-battery-1:before { content: fa-content($fa-var-battery-quarter); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-battery-0:before { content: fa-content($fa-var-battery-empty); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-object-group { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-object-ungroup { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-sticky-note-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-sticky-note-o:before { content: fa-content($fa-var-sticky-note); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-jcb { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-diners-club { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-clone { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-o:before { content: fa-content($fa-var-hourglass); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-1:before { content: fa-content($fa-var-hourglass-start); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-2:before { content: fa-content($fa-var-hourglass-half); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-3:before { content: fa-content($fa-var-hourglass-end); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-rock-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-rock-o:before { content: fa-content($fa-var-hand-rock); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-grab-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-grab-o:before { content: fa-content($fa-var-hand-rock); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-paper-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-paper-o:before { content: fa-content($fa-var-hand-paper); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-stop-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-stop-o:before { content: fa-content($fa-var-hand-paper); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-scissors-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-scissors-o:before { content: fa-content($fa-var-hand-scissors); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-lizard-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-lizard-o:before { content: fa-content($fa-var-hand-lizard); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-spock-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-spock-o:before { content: fa-content($fa-var-hand-spock); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-pointer-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-pointer-o:before { content: fa-content($fa-var-hand-pointer); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-peace-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-peace-o:before { content: fa-content($fa-var-hand-peace); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-registered { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-creative-commons { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-gg { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-gg-circle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-tripadvisor { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-odnoklassniki { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-odnoklassniki-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-get-pocket { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-wikipedia-w { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-safari { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-chrome { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-firefox { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-opera { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-internet-explorer { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-television:before { content: fa-content($fa-var-tv); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-contao { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-500px { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-amazon { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-plus-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-plus-o:before { content: fa-content($fa-var-calendar-plus); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-minus-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-minus-o:before { content: fa-content($fa-var-calendar-minus); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-times-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-times-o:before { content: fa-content($fa-var-calendar-times); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-check-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-check-o:before { content: fa-content($fa-var-calendar-check); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-map-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-map-o:before { content: fa-content($fa-var-map); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-commenting:before { content: fa-content($fa-var-comment-dots); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-commenting-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-commenting-o:before { content: fa-content($fa-var-comment-dots); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-houzz { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-vimeo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-vimeo:before { content: fa-content($fa-var-vimeo-v); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-black-tie { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-fonticons { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-reddit-alien { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-edge { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-credit-card-alt:before { content: fa-content($fa-var-credit-card); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-codiepie { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-modx { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-fort-awesome { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-usb { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-product-hunt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-mixcloud { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-scribd { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pause-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-pause-circle-o:before { content: fa-content($fa-var-pause-circle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-stop-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-stop-circle-o:before { content: fa-content($fa-var-stop-circle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bluetooth { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bluetooth-b { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-gitlab { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-wpbeginner { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-wpforms { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-envira { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-wheelchair-alt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-wheelchair-alt:before { content: fa-content($fa-var-accessible-icon); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-question-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-question-circle-o:before { content: fa-content($fa-var-question-circle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-volume-control-phone:before { content: fa-content($fa-var-phone-volume); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-asl-interpreting:before { content: fa-content($fa-var-american-sign-language-interpreting); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-deafness:before { content: fa-content($fa-var-deaf); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-hard-of-hearing:before { content: fa-content($fa-var-deaf); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-glide { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-glide-g { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-signing:before { content: fa-content($fa-var-sign-language); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-viadeo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-viadeo-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat-ghost { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-pied-piper { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-first-order { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-yoast { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-themeisle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-official { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-official:before { content: fa-content($fa-var-google-plus); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-circle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-circle:before { content: fa-content($fa-var-google-plus); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-font-awesome { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-fa { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-fa:before { content: fa-content($fa-var-font-awesome); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-handshake-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-handshake-o:before { content: fa-content($fa-var-handshake); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-open-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-open-o:before { content: fa-content($fa-var-envelope-open); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-linode { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-address-book-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-address-book-o:before { content: fa-content($fa-var-address-book); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-vcard:before { content: fa-content($fa-var-address-card); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-address-card-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-address-card-o:before { content: fa-content($fa-var-address-card); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-vcard-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-vcard-o:before { content: fa-content($fa-var-address-card); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-user-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-user-circle-o:before { content: fa-content($fa-var-user-circle); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-user-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-user-o:before { content: fa-content($fa-var-user); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-id-badge { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-drivers-license:before { content: fa-content($fa-var-id-card); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-id-card-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-id-card-o:before { content: fa-content($fa-var-id-card); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-drivers-license-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-drivers-license-o:before { content: fa-content($fa-var-id-card); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-quora { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-free-code-camp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-telegram { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-4:before { content: fa-content($fa-var-thermometer-full); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer:before { content: fa-content($fa-var-thermometer-full); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-3:before { content: fa-content($fa-var-thermometer-three-quarters); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-2:before { content: fa-content($fa-var-thermometer-half); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-1:before { content: fa-content($fa-var-thermometer-quarter); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-0:before { content: fa-content($fa-var-thermometer-empty); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bathtub:before { content: fa-content($fa-var-bath); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-s15:before { content: fa-content($fa-var-bath); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-window-maximize { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-window-restore { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-times-rectangle:before { content: fa-content($fa-var-window-close); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-window-close-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-window-close-o:before { content: fa-content($fa-var-window-close); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-times-rectangle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-times-rectangle-o:before { content: fa-content($fa-var-window-close); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-bandcamp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-grav { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-etsy { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-imdb { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-ravelry { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-eercast { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-eercast:before { content: fa-content($fa-var-sellcast); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-snowflake-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.#{$fa-css-prefix}.#{$fa-css-prefix}-snowflake-o:before { content: fa-content($fa-var-snowflake); } - -.#{$fa-css-prefix}.#{$fa-css-prefix}-superpowers { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-wpexplorer { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.#{$fa-css-prefix}.#{$fa-css-prefix}-cab:before { content: fa-content($fa-var-taxi); } - diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_stacked.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_stacked.scss deleted file mode 100644 index ae7ef4e..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_stacked.scss +++ /dev/null @@ -1,31 +0,0 @@ -// Stacked Icons -// ------------------------- - -.#{$fa-css-prefix}-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: ($fa-fw-width*2); -} - -.#{$fa-css-prefix}-stack-1x, -.#{$fa-css-prefix}-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; -} - -.#{$fa-css-prefix}-stack-1x { - line-height: inherit; -} - -.#{$fa-css-prefix}-stack-2x { - font-size: 2em; -} - -.#{$fa-css-prefix}-inverse { - color: $fa-inverse; -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_variables.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_variables.scss deleted file mode 100644 index fb203b9..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/_variables.scss +++ /dev/null @@ -1,1469 +0,0 @@ -// Variables -// -------------------------- -@use 'sass:math'; - -$fa-font-path: '../../../fonts/fontawesome' !default; -$fa-font-size-base: 16px !default; -$fa-font-display: block !default; -$fa-css-prefix: fa !default; -$fa-version: '5.13.1' !default; -$fa-border-color: #eee !default; -$fa-inverse: #fff !default; -$fa-li-width: 2em !default; -$fa-fw-width: (math.div(20em, 16)); -$fa-primary-opacity: 1 !default; -$fa-secondary-opacity: 0.4 !default; - -// Convenience function used to set content property -@function fa-content($fa-var) { - @return unquote('"#{ $fa-var }"'); -} - -$fa-var-500px: \f26e; -$fa-var-accessible-icon: \f368; -$fa-var-accusoft: \f369; -$fa-var-acquisitions-incorporated: \f6af; -$fa-var-ad: \f641; -$fa-var-address-book: \f2b9; -$fa-var-address-card: \f2bb; -$fa-var-adjust: \f042; -$fa-var-adn: \f170; -$fa-var-adobe: \f778; -$fa-var-adversal: \f36a; -$fa-var-affiliatetheme: \f36b; -$fa-var-air-freshener: \f5d0; -$fa-var-airbnb: \f834; -$fa-var-algolia: \f36c; -$fa-var-align-center: \f037; -$fa-var-align-justify: \f039; -$fa-var-align-left: \f036; -$fa-var-align-right: \f038; -$fa-var-alipay: \f642; -$fa-var-allergies: \f461; -$fa-var-amazon: \f270; -$fa-var-amazon-pay: \f42c; -$fa-var-ambulance: \f0f9; -$fa-var-american-sign-language-interpreting: \f2a3; -$fa-var-amilia: \f36d; -$fa-var-anchor: \f13d; -$fa-var-android: \f17b; -$fa-var-angellist: \f209; -$fa-var-angle-double-down: \f103; -$fa-var-angle-double-left: \f100; -$fa-var-angle-double-right: \f101; -$fa-var-angle-double-up: \f102; -$fa-var-angle-down: \f107; -$fa-var-angle-left: \f104; -$fa-var-angle-right: \f105; -$fa-var-angle-up: \f106; -$fa-var-angry: \f556; -$fa-var-angrycreative: \f36e; -$fa-var-angular: \f420; -$fa-var-ankh: \f644; -$fa-var-app-store: \f36f; -$fa-var-app-store-ios: \f370; -$fa-var-apper: \f371; -$fa-var-apple: \f179; -$fa-var-apple-alt: \f5d1; -$fa-var-apple-pay: \f415; -$fa-var-archive: \f187; -$fa-var-archway: \f557; -$fa-var-arrow-alt-circle-down: \f358; -$fa-var-arrow-alt-circle-left: \f359; -$fa-var-arrow-alt-circle-right: \f35a; -$fa-var-arrow-alt-circle-up: \f35b; -$fa-var-arrow-circle-down: \f0ab; -$fa-var-arrow-circle-left: \f0a8; -$fa-var-arrow-circle-right: \f0a9; -$fa-var-arrow-circle-up: \f0aa; -$fa-var-arrow-down: \f063; -$fa-var-arrow-left: \f060; -$fa-var-arrow-right: \f061; -$fa-var-arrow-up: \f062; -$fa-var-arrows-alt: \f0b2; -$fa-var-arrows-alt-h: \f337; -$fa-var-arrows-alt-v: \f338; -$fa-var-artstation: \f77a; -$fa-var-assistive-listening-systems: \f2a2; -$fa-var-asterisk: \f069; -$fa-var-asymmetrik: \f372; -$fa-var-at: \f1fa; -$fa-var-atlas: \f558; -$fa-var-atlassian: \f77b; -$fa-var-atom: \f5d2; -$fa-var-audible: \f373; -$fa-var-audio-description: \f29e; -$fa-var-autoprefixer: \f41c; -$fa-var-avianex: \f374; -$fa-var-aviato: \f421; -$fa-var-award: \f559; -$fa-var-aws: \f375; -$fa-var-baby: \f77c; -$fa-var-baby-carriage: \f77d; -$fa-var-backspace: \f55a; -$fa-var-backward: \f04a; -$fa-var-bacon: \f7e5; -$fa-var-bacteria: \f959; -$fa-var-bacterium: \f95a; -$fa-var-bahai: \f666; -$fa-var-balance-scale: \f24e; -$fa-var-balance-scale-left: \f515; -$fa-var-balance-scale-right: \f516; -$fa-var-ban: \f05e; -$fa-var-band-aid: \f462; -$fa-var-bandcamp: \f2d5; -$fa-var-barcode: \f02a; -$fa-var-bars: \f0c9; -$fa-var-baseball-ball: \f433; -$fa-var-basketball-ball: \f434; -$fa-var-bath: \f2cd; -$fa-var-battery-empty: \f244; -$fa-var-battery-full: \f240; -$fa-var-battery-half: \f242; -$fa-var-battery-quarter: \f243; -$fa-var-battery-three-quarters: \f241; -$fa-var-battle-net: \f835; -$fa-var-bed: \f236; -$fa-var-beer: \f0fc; -$fa-var-behance: \f1b4; -$fa-var-behance-square: \f1b5; -$fa-var-bell: \f0f3; -$fa-var-bell-slash: \f1f6; -$fa-var-bezier-curve: \f55b; -$fa-var-bible: \f647; -$fa-var-bicycle: \f206; -$fa-var-biking: \f84a; -$fa-var-bimobject: \f378; -$fa-var-binoculars: \f1e5; -$fa-var-biohazard: \f780; -$fa-var-birthday-cake: \f1fd; -$fa-var-bitbucket: \f171; -$fa-var-bitcoin: \f379; -$fa-var-bity: \f37a; -$fa-var-black-tie: \f27e; -$fa-var-blackberry: \f37b; -$fa-var-blender: \f517; -$fa-var-blender-phone: \f6b6; -$fa-var-blind: \f29d; -$fa-var-blog: \f781; -$fa-var-blogger: \f37c; -$fa-var-blogger-b: \f37d; -$fa-var-bluetooth: \f293; -$fa-var-bluetooth-b: \f294; -$fa-var-bold: \f032; -$fa-var-bolt: \f0e7; -$fa-var-bomb: \f1e2; -$fa-var-bone: \f5d7; -$fa-var-bong: \f55c; -$fa-var-book: \f02d; -$fa-var-book-dead: \f6b7; -$fa-var-book-medical: \f7e6; -$fa-var-book-open: \f518; -$fa-var-book-reader: \f5da; -$fa-var-bookmark: \f02e; -$fa-var-bootstrap: \f836; -$fa-var-border-all: \f84c; -$fa-var-border-none: \f850; -$fa-var-border-style: \f853; -$fa-var-bowling-ball: \f436; -$fa-var-box: \f466; -$fa-var-box-open: \f49e; -$fa-var-box-tissue: \f95b; -$fa-var-boxes: \f468; -$fa-var-braille: \f2a1; -$fa-var-brain: \f5dc; -$fa-var-bread-slice: \f7ec; -$fa-var-briefcase: \f0b1; -$fa-var-briefcase-medical: \f469; -$fa-var-broadcast-tower: \f519; -$fa-var-broom: \f51a; -$fa-var-brush: \f55d; -$fa-var-btc: \f15a; -$fa-var-buffer: \f837; -$fa-var-bug: \f188; -$fa-var-building: \f1ad; -$fa-var-bullhorn: \f0a1; -$fa-var-bullseye: \f140; -$fa-var-burn: \f46a; -$fa-var-buromobelexperte: \f37f; -$fa-var-bus: \f207; -$fa-var-bus-alt: \f55e; -$fa-var-business-time: \f64a; -$fa-var-buy-n-large: \f8a6; -$fa-var-buysellads: \f20d; -$fa-var-calculator: \f1ec; -$fa-var-calendar: \f133; -$fa-var-calendar-alt: \f073; -$fa-var-calendar-check: \f274; -$fa-var-calendar-day: \f783; -$fa-var-calendar-minus: \f272; -$fa-var-calendar-plus: \f271; -$fa-var-calendar-times: \f273; -$fa-var-calendar-week: \f784; -$fa-var-camera: \f030; -$fa-var-camera-retro: \f083; -$fa-var-campground: \f6bb; -$fa-var-canadian-maple-leaf: \f785; -$fa-var-candy-cane: \f786; -$fa-var-cannabis: \f55f; -$fa-var-capsules: \f46b; -$fa-var-car: \f1b9; -$fa-var-car-alt: \f5de; -$fa-var-car-battery: \f5df; -$fa-var-car-crash: \f5e1; -$fa-var-car-side: \f5e4; -$fa-var-caravan: \f8ff; -$fa-var-caret-down: \f0d7; -$fa-var-caret-left: \f0d9; -$fa-var-caret-right: \f0da; -$fa-var-caret-square-down: \f150; -$fa-var-caret-square-left: \f191; -$fa-var-caret-square-right: \f152; -$fa-var-caret-square-up: \f151; -$fa-var-caret-up: \f0d8; -$fa-var-carrot: \f787; -$fa-var-cart-arrow-down: \f218; -$fa-var-cart-plus: \f217; -$fa-var-cash-register: \f788; -$fa-var-cat: \f6be; -$fa-var-cc-amazon-pay: \f42d; -$fa-var-cc-amex: \f1f3; -$fa-var-cc-apple-pay: \f416; -$fa-var-cc-diners-club: \f24c; -$fa-var-cc-discover: \f1f2; -$fa-var-cc-jcb: \f24b; -$fa-var-cc-mastercard: \f1f1; -$fa-var-cc-paypal: \f1f4; -$fa-var-cc-stripe: \f1f5; -$fa-var-cc-visa: \f1f0; -$fa-var-centercode: \f380; -$fa-var-centos: \f789; -$fa-var-certificate: \f0a3; -$fa-var-chair: \f6c0; -$fa-var-chalkboard: \f51b; -$fa-var-chalkboard-teacher: \f51c; -$fa-var-charging-station: \f5e7; -$fa-var-chart-area: \f1fe; -$fa-var-chart-bar: \f080; -$fa-var-chart-line: \f201; -$fa-var-chart-pie: \f200; -$fa-var-check: \f00c; -$fa-var-check-circle: \f058; -$fa-var-check-double: \f560; -$fa-var-check-square: \f14a; -$fa-var-cheese: \f7ef; -$fa-var-chess: \f439; -$fa-var-chess-bishop: \f43a; -$fa-var-chess-board: \f43c; -$fa-var-chess-king: \f43f; -$fa-var-chess-knight: \f441; -$fa-var-chess-pawn: \f443; -$fa-var-chess-queen: \f445; -$fa-var-chess-rook: \f447; -$fa-var-chevron-circle-down: \f13a; -$fa-var-chevron-circle-left: \f137; -$fa-var-chevron-circle-right: \f138; -$fa-var-chevron-circle-up: \f139; -$fa-var-chevron-down: \f078; -$fa-var-chevron-left: \f053; -$fa-var-chevron-right: \f054; -$fa-var-chevron-up: \f077; -$fa-var-child: \f1ae; -$fa-var-chrome: \f268; -$fa-var-chromecast: \f838; -$fa-var-church: \f51d; -$fa-var-circle: \f111; -$fa-var-circle-notch: \f1ce; -$fa-var-city: \f64f; -$fa-var-clinic-medical: \f7f2; -$fa-var-clipboard: \f328; -$fa-var-clipboard-check: \f46c; -$fa-var-clipboard-list: \f46d; -$fa-var-clock: \f017; -$fa-var-clone: \f24d; -$fa-var-closed-captioning: \f20a; -$fa-var-cloud: \f0c2; -$fa-var-cloud-download-alt: \f381; -$fa-var-cloud-meatball: \f73b; -$fa-var-cloud-moon: \f6c3; -$fa-var-cloud-moon-rain: \f73c; -$fa-var-cloud-rain: \f73d; -$fa-var-cloud-showers-heavy: \f740; -$fa-var-cloud-sun: \f6c4; -$fa-var-cloud-sun-rain: \f743; -$fa-var-cloud-upload-alt: \f382; -$fa-var-cloudscale: \f383; -$fa-var-cloudsmith: \f384; -$fa-var-cloudversify: \f385; -$fa-var-cocktail: \f561; -$fa-var-code: \f121; -$fa-var-code-branch: \f126; -$fa-var-codepen: \f1cb; -$fa-var-codiepie: \f284; -$fa-var-coffee: \f0f4; -$fa-var-cog: \f013; -$fa-var-cogs: \f085; -$fa-var-coins: \f51e; -$fa-var-columns: \f0db; -$fa-var-comment: \f075; -$fa-var-comment-alt: \f27a; -$fa-var-comment-dollar: \f651; -$fa-var-comment-dots: \f4ad; -$fa-var-comment-medical: \f7f5; -$fa-var-comment-slash: \f4b3; -$fa-var-comments: \f086; -$fa-var-comments-dollar: \f653; -$fa-var-compact-disc: \f51f; -$fa-var-compass: \f14e; -$fa-var-compress: \f066; -$fa-var-compress-alt: \f422; -$fa-var-compress-arrows-alt: \f78c; -$fa-var-concierge-bell: \f562; -$fa-var-confluence: \f78d; -$fa-var-connectdevelop: \f20e; -$fa-var-contao: \f26d; -$fa-var-cookie: \f563; -$fa-var-cookie-bite: \f564; -$fa-var-copy: \f0c5; -$fa-var-copyright: \f1f9; -$fa-var-cotton-bureau: \f89e; -$fa-var-couch: \f4b8; -$fa-var-cpanel: \f388; -$fa-var-creative-commons: \f25e; -$fa-var-creative-commons-by: \f4e7; -$fa-var-creative-commons-nc: \f4e8; -$fa-var-creative-commons-nc-eu: \f4e9; -$fa-var-creative-commons-nc-jp: \f4ea; -$fa-var-creative-commons-nd: \f4eb; -$fa-var-creative-commons-pd: \f4ec; -$fa-var-creative-commons-pd-alt: \f4ed; -$fa-var-creative-commons-remix: \f4ee; -$fa-var-creative-commons-sa: \f4ef; -$fa-var-creative-commons-sampling: \f4f0; -$fa-var-creative-commons-sampling-plus: \f4f1; -$fa-var-creative-commons-share: \f4f2; -$fa-var-creative-commons-zero: \f4f3; -$fa-var-credit-card: \f09d; -$fa-var-critical-role: \f6c9; -$fa-var-crop: \f125; -$fa-var-crop-alt: \f565; -$fa-var-cross: \f654; -$fa-var-crosshairs: \f05b; -$fa-var-crow: \f520; -$fa-var-crown: \f521; -$fa-var-crutch: \f7f7; -$fa-var-css3: \f13c; -$fa-var-css3-alt: \f38b; -$fa-var-cube: \f1b2; -$fa-var-cubes: \f1b3; -$fa-var-cut: \f0c4; -$fa-var-cuttlefish: \f38c; -$fa-var-d-and-d: \f38d; -$fa-var-d-and-d-beyond: \f6ca; -$fa-var-dailymotion: \f952; -$fa-var-dashcube: \f210; -$fa-var-database: \f1c0; -$fa-var-deaf: \f2a4; -$fa-var-deezer: \f977; -$fa-var-delicious: \f1a5; -$fa-var-democrat: \f747; -$fa-var-deploydog: \f38e; -$fa-var-deskpro: \f38f; -$fa-var-desktop: \f108; -$fa-var-dev: \f6cc; -$fa-var-deviantart: \f1bd; -$fa-var-dharmachakra: \f655; -$fa-var-dhl: \f790; -$fa-var-diagnoses: \f470; -$fa-var-diaspora: \f791; -$fa-var-dice: \f522; -$fa-var-dice-d20: \f6cf; -$fa-var-dice-d6: \f6d1; -$fa-var-dice-five: \f523; -$fa-var-dice-four: \f524; -$fa-var-dice-one: \f525; -$fa-var-dice-six: \f526; -$fa-var-dice-three: \f527; -$fa-var-dice-two: \f528; -$fa-var-digg: \f1a6; -$fa-var-digital-ocean: \f391; -$fa-var-digital-tachograph: \f566; -$fa-var-directions: \f5eb; -$fa-var-discord: \f392; -$fa-var-discourse: \f393; -$fa-var-disease: \f7fa; -$fa-var-divide: \f529; -$fa-var-dizzy: \f567; -$fa-var-dna: \f471; -$fa-var-dochub: \f394; -$fa-var-docker: \f395; -$fa-var-dog: \f6d3; -$fa-var-dollar-sign: \f155; -$fa-var-dolly: \f472; -$fa-var-dolly-flatbed: \f474; -$fa-var-donate: \f4b9; -$fa-var-door-closed: \f52a; -$fa-var-door-open: \f52b; -$fa-var-dot-circle: \f192; -$fa-var-dove: \f4ba; -$fa-var-download: \f019; -$fa-var-draft2digital: \f396; -$fa-var-drafting-compass: \f568; -$fa-var-dragon: \f6d5; -$fa-var-draw-polygon: \f5ee; -$fa-var-dribbble: \f17d; -$fa-var-dribbble-square: \f397; -$fa-var-dropbox: \f16b; -$fa-var-drum: \f569; -$fa-var-drum-steelpan: \f56a; -$fa-var-drumstick-bite: \f6d7; -$fa-var-drupal: \f1a9; -$fa-var-dumbbell: \f44b; -$fa-var-dumpster: \f793; -$fa-var-dumpster-fire: \f794; -$fa-var-dungeon: \f6d9; -$fa-var-dyalog: \f399; -$fa-var-earlybirds: \f39a; -$fa-var-ebay: \f4f4; -$fa-var-edge: \f282; -$fa-var-edge-legacy: \f978; -$fa-var-edit: \f044; -$fa-var-egg: \f7fb; -$fa-var-eject: \f052; -$fa-var-elementor: \f430; -$fa-var-ellipsis-h: \f141; -$fa-var-ellipsis-v: \f142; -$fa-var-ello: \f5f1; -$fa-var-ember: \f423; -$fa-var-empire: \f1d1; -$fa-var-envelope: \f0e0; -$fa-var-envelope-open: \f2b6; -$fa-var-envelope-open-text: \f658; -$fa-var-envelope-square: \f199; -$fa-var-envira: \f299; -$fa-var-equals: \f52c; -$fa-var-eraser: \f12d; -$fa-var-erlang: \f39d; -$fa-var-ethereum: \f42e; -$fa-var-ethernet: \f796; -$fa-var-etsy: \f2d7; -$fa-var-euro-sign: \f153; -$fa-var-evernote: \f839; -$fa-var-exchange-alt: \f362; -$fa-var-exclamation: \f12a; -$fa-var-exclamation-circle: \f06a; -$fa-var-exclamation-triangle: \f071; -$fa-var-expand: \f065; -$fa-var-expand-alt: \f424; -$fa-var-expand-arrows-alt: \f31e; -$fa-var-expeditedssl: \f23e; -$fa-var-external-link-alt: \f35d; -$fa-var-external-link-square-alt: \f360; -$fa-var-eye: \f06e; -$fa-var-eye-dropper: \f1fb; -$fa-var-eye-slash: \f070; -$fa-var-facebook: \f09a; -$fa-var-facebook-f: \f39e; -$fa-var-facebook-messenger: \f39f; -$fa-var-facebook-square: \f082; -$fa-var-fan: \f863; -$fa-var-fantasy-flight-games: \f6dc; -$fa-var-fast-backward: \f049; -$fa-var-fast-forward: \f050; -$fa-var-faucet: \f905; -$fa-var-fax: \f1ac; -$fa-var-feather: \f52d; -$fa-var-feather-alt: \f56b; -$fa-var-fedex: \f797; -$fa-var-fedora: \f798; -$fa-var-female: \f182; -$fa-var-fighter-jet: \f0fb; -$fa-var-figma: \f799; -$fa-var-file: \f15b; -$fa-var-file-alt: \f15c; -$fa-var-file-archive: \f1c6; -$fa-var-file-audio: \f1c7; -$fa-var-file-code: \f1c9; -$fa-var-file-contract: \f56c; -$fa-var-file-csv: \f6dd; -$fa-var-file-download: \f56d; -$fa-var-file-excel: \f1c3; -$fa-var-file-export: \f56e; -$fa-var-file-image: \f1c5; -$fa-var-file-import: \f56f; -$fa-var-file-invoice: \f570; -$fa-var-file-invoice-dollar: \f571; -$fa-var-file-medical: \f477; -$fa-var-file-medical-alt: \f478; -$fa-var-file-pdf: \f1c1; -$fa-var-file-powerpoint: \f1c4; -$fa-var-file-prescription: \f572; -$fa-var-file-signature: \f573; -$fa-var-file-upload: \f574; -$fa-var-file-video: \f1c8; -$fa-var-file-word: \f1c2; -$fa-var-fill: \f575; -$fa-var-fill-drip: \f576; -$fa-var-film: \f008; -$fa-var-filter: \f0b0; -$fa-var-fingerprint: \f577; -$fa-var-fire: \f06d; -$fa-var-fire-alt: \f7e4; -$fa-var-fire-extinguisher: \f134; -$fa-var-firefox: \f269; -$fa-var-firefox-browser: \f907; -$fa-var-first-aid: \f479; -$fa-var-first-order: \f2b0; -$fa-var-first-order-alt: \f50a; -$fa-var-firstdraft: \f3a1; -$fa-var-fish: \f578; -$fa-var-fist-raised: \f6de; -$fa-var-flag: \f024; -$fa-var-flag-checkered: \f11e; -$fa-var-flag-usa: \f74d; -$fa-var-flask: \f0c3; -$fa-var-flickr: \f16e; -$fa-var-flipboard: \f44d; -$fa-var-flushed: \f579; -$fa-var-fly: \f417; -$fa-var-folder: \f07b; -$fa-var-folder-minus: \f65d; -$fa-var-folder-open: \f07c; -$fa-var-folder-plus: \f65e; -$fa-var-font: \f031; -$fa-var-font-awesome: \f2b4; -$fa-var-font-awesome-alt: \f35c; -$fa-var-font-awesome-flag: \f425; -$fa-var-font-awesome-logo-full: \f4e6; -$fa-var-fonticons: \f280; -$fa-var-fonticons-fi: \f3a2; -$fa-var-football-ball: \f44e; -$fa-var-fort-awesome: \f286; -$fa-var-fort-awesome-alt: \f3a3; -$fa-var-forumbee: \f211; -$fa-var-forward: \f04e; -$fa-var-foursquare: \f180; -$fa-var-free-code-camp: \f2c5; -$fa-var-freebsd: \f3a4; -$fa-var-frog: \f52e; -$fa-var-frown: \f119; -$fa-var-frown-open: \f57a; -$fa-var-fulcrum: \f50b; -$fa-var-funnel-dollar: \f662; -$fa-var-futbol: \f1e3; -$fa-var-galactic-republic: \f50c; -$fa-var-galactic-senate: \f50d; -$fa-var-gamepad: \f11b; -$fa-var-gas-pump: \f52f; -$fa-var-gavel: \f0e3; -$fa-var-gem: \f3a5; -$fa-var-genderless: \f22d; -$fa-var-get-pocket: \f265; -$fa-var-gg: \f260; -$fa-var-gg-circle: \f261; -$fa-var-ghost: \f6e2; -$fa-var-gift: \f06b; -$fa-var-gifts: \f79c; -$fa-var-git: \f1d3; -$fa-var-git-alt: \f841; -$fa-var-git-square: \f1d2; -$fa-var-github: \f09b; -$fa-var-github-alt: \f113; -$fa-var-github-square: \f092; -$fa-var-gitkraken: \f3a6; -$fa-var-gitlab: \f296; -$fa-var-gitter: \f426; -$fa-var-glass-cheers: \f79f; -$fa-var-glass-martini: \f000; -$fa-var-glass-martini-alt: \f57b; -$fa-var-glass-whiskey: \f7a0; -$fa-var-glasses: \f530; -$fa-var-glide: \f2a5; -$fa-var-glide-g: \f2a6; -$fa-var-globe: \f0ac; -$fa-var-globe-africa: \f57c; -$fa-var-globe-americas: \f57d; -$fa-var-globe-asia: \f57e; -$fa-var-globe-europe: \f7a2; -$fa-var-gofore: \f3a7; -$fa-var-golf-ball: \f450; -$fa-var-goodreads: \f3a8; -$fa-var-goodreads-g: \f3a9; -$fa-var-google: \f1a0; -$fa-var-google-drive: \f3aa; -$fa-var-google-pay: \f979; -$fa-var-google-play: \f3ab; -$fa-var-google-plus: \f2b3; -$fa-var-google-plus-g: \f0d5; -$fa-var-google-plus-square: \f0d4; -$fa-var-google-wallet: \f1ee; -$fa-var-gopuram: \f664; -$fa-var-graduation-cap: \f19d; -$fa-var-gratipay: \f184; -$fa-var-grav: \f2d6; -$fa-var-greater-than: \f531; -$fa-var-greater-than-equal: \f532; -$fa-var-grimace: \f57f; -$fa-var-grin: \f580; -$fa-var-grin-alt: \f581; -$fa-var-grin-beam: \f582; -$fa-var-grin-beam-sweat: \f583; -$fa-var-grin-hearts: \f584; -$fa-var-grin-squint: \f585; -$fa-var-grin-squint-tears: \f586; -$fa-var-grin-stars: \f587; -$fa-var-grin-tears: \f588; -$fa-var-grin-tongue: \f589; -$fa-var-grin-tongue-squint: \f58a; -$fa-var-grin-tongue-wink: \f58b; -$fa-var-grin-wink: \f58c; -$fa-var-grip-horizontal: \f58d; -$fa-var-grip-lines: \f7a4; -$fa-var-grip-lines-vertical: \f7a5; -$fa-var-grip-vertical: \f58e; -$fa-var-gripfire: \f3ac; -$fa-var-grunt: \f3ad; -$fa-var-guitar: \f7a6; -$fa-var-gulp: \f3ae; -$fa-var-h-square: \f0fd; -$fa-var-hacker-news: \f1d4; -$fa-var-hacker-news-square: \f3af; -$fa-var-hackerrank: \f5f7; -$fa-var-hamburger: \f805; -$fa-var-hammer: \f6e3; -$fa-var-hamsa: \f665; -$fa-var-hand-holding: \f4bd; -$fa-var-hand-holding-heart: \f4be; -$fa-var-hand-holding-medical: \f95c; -$fa-var-hand-holding-usd: \f4c0; -$fa-var-hand-holding-water: \f4c1; -$fa-var-hand-lizard: \f258; -$fa-var-hand-middle-finger: \f806; -$fa-var-hand-paper: \f256; -$fa-var-hand-peace: \f25b; -$fa-var-hand-point-down: \f0a7; -$fa-var-hand-point-left: \f0a5; -$fa-var-hand-point-right: \f0a4; -$fa-var-hand-point-up: \f0a6; -$fa-var-hand-pointer: \f25a; -$fa-var-hand-rock: \f255; -$fa-var-hand-scissors: \f257; -$fa-var-hand-sparkles: \f95d; -$fa-var-hand-spock: \f259; -$fa-var-hands: \f4c2; -$fa-var-hands-helping: \f4c4; -$fa-var-hands-wash: \f95e; -$fa-var-handshake: \f2b5; -$fa-var-handshake-alt-slash: \f95f; -$fa-var-handshake-slash: \f960; -$fa-var-hanukiah: \f6e6; -$fa-var-hard-hat: \f807; -$fa-var-hashtag: \f292; -$fa-var-hat-cowboy: \f8c0; -$fa-var-hat-cowboy-side: \f8c1; -$fa-var-hat-wizard: \f6e8; -$fa-var-hdd: \f0a0; -$fa-var-head-side-cough: \f961; -$fa-var-head-side-cough-slash: \f962; -$fa-var-head-side-mask: \f963; -$fa-var-head-side-virus: \f964; -$fa-var-heading: \f1dc; -$fa-var-headphones: \f025; -$fa-var-headphones-alt: \f58f; -$fa-var-headset: \f590; -$fa-var-heart: \f004; -$fa-var-heart-broken: \f7a9; -$fa-var-heartbeat: \f21e; -$fa-var-helicopter: \f533; -$fa-var-highlighter: \f591; -$fa-var-hiking: \f6ec; -$fa-var-hippo: \f6ed; -$fa-var-hips: \f452; -$fa-var-hire-a-helper: \f3b0; -$fa-var-history: \f1da; -$fa-var-hockey-puck: \f453; -$fa-var-holly-berry: \f7aa; -$fa-var-home: \f015; -$fa-var-hooli: \f427; -$fa-var-hornbill: \f592; -$fa-var-horse: \f6f0; -$fa-var-horse-head: \f7ab; -$fa-var-hospital: \f0f8; -$fa-var-hospital-alt: \f47d; -$fa-var-hospital-symbol: \f47e; -$fa-var-hospital-user: \f80d; -$fa-var-hot-tub: \f593; -$fa-var-hotdog: \f80f; -$fa-var-hotel: \f594; -$fa-var-hotjar: \f3b1; -$fa-var-hourglass: \f254; -$fa-var-hourglass-end: \f253; -$fa-var-hourglass-half: \f252; -$fa-var-hourglass-start: \f251; -$fa-var-house-damage: \f6f1; -$fa-var-house-user: \f965; -$fa-var-houzz: \f27c; -$fa-var-hryvnia: \f6f2; -$fa-var-html5: \f13b; -$fa-var-hubspot: \f3b2; -$fa-var-i-cursor: \f246; -$fa-var-ice-cream: \f810; -$fa-var-icicles: \f7ad; -$fa-var-icons: \f86d; -$fa-var-id-badge: \f2c1; -$fa-var-id-card: \f2c2; -$fa-var-id-card-alt: \f47f; -$fa-var-ideal: \f913; -$fa-var-igloo: \f7ae; -$fa-var-image: \f03e; -$fa-var-images: \f302; -$fa-var-imdb: \f2d8; -$fa-var-inbox: \f01c; -$fa-var-indent: \f03c; -$fa-var-industry: \f275; -$fa-var-infinity: \f534; -$fa-var-info: \f129; -$fa-var-info-circle: \f05a; -$fa-var-instagram: \f16d; -$fa-var-instagram-square: \f955; -$fa-var-intercom: \f7af; -$fa-var-internet-explorer: \f26b; -$fa-var-invision: \f7b0; -$fa-var-ioxhost: \f208; -$fa-var-italic: \f033; -$fa-var-itch-io: \f83a; -$fa-var-itunes: \f3b4; -$fa-var-itunes-note: \f3b5; -$fa-var-java: \f4e4; -$fa-var-jedi: \f669; -$fa-var-jedi-order: \f50e; -$fa-var-jenkins: \f3b6; -$fa-var-jira: \f7b1; -$fa-var-joget: \f3b7; -$fa-var-joint: \f595; -$fa-var-joomla: \f1aa; -$fa-var-journal-whills: \f66a; -$fa-var-js: \f3b8; -$fa-var-js-square: \f3b9; -$fa-var-jsfiddle: \f1cc; -$fa-var-kaaba: \f66b; -$fa-var-kaggle: \f5fa; -$fa-var-key: \f084; -$fa-var-keybase: \f4f5; -$fa-var-keyboard: \f11c; -$fa-var-keycdn: \f3ba; -$fa-var-khanda: \f66d; -$fa-var-kickstarter: \f3bb; -$fa-var-kickstarter-k: \f3bc; -$fa-var-kiss: \f596; -$fa-var-kiss-beam: \f597; -$fa-var-kiss-wink-heart: \f598; -$fa-var-kiwi-bird: \f535; -$fa-var-korvue: \f42f; -$fa-var-landmark: \f66f; -$fa-var-language: \f1ab; -$fa-var-laptop: \f109; -$fa-var-laptop-code: \f5fc; -$fa-var-laptop-house: \f966; -$fa-var-laptop-medical: \f812; -$fa-var-laravel: \f3bd; -$fa-var-lastfm: \f202; -$fa-var-lastfm-square: \f203; -$fa-var-laugh: \f599; -$fa-var-laugh-beam: \f59a; -$fa-var-laugh-squint: \f59b; -$fa-var-laugh-wink: \f59c; -$fa-var-layer-group: \f5fd; -$fa-var-leaf: \f06c; -$fa-var-leanpub: \f212; -$fa-var-lemon: \f094; -$fa-var-less: \f41d; -$fa-var-less-than: \f536; -$fa-var-less-than-equal: \f537; -$fa-var-level-down-alt: \f3be; -$fa-var-level-up-alt: \f3bf; -$fa-var-life-ring: \f1cd; -$fa-var-lightbulb: \f0eb; -$fa-var-line: \f3c0; -$fa-var-link: \f0c1; -$fa-var-linkedin: \f08c; -$fa-var-linkedin-in: \f0e1; -$fa-var-linode: \f2b8; -$fa-var-linux: \f17c; -$fa-var-lira-sign: \f195; -$fa-var-list: \f03a; -$fa-var-list-alt: \f022; -$fa-var-list-ol: \f0cb; -$fa-var-list-ul: \f0ca; -$fa-var-location-arrow: \f124; -$fa-var-lock: \f023; -$fa-var-lock-open: \f3c1; -$fa-var-long-arrow-alt-down: \f309; -$fa-var-long-arrow-alt-left: \f30a; -$fa-var-long-arrow-alt-right: \f30b; -$fa-var-long-arrow-alt-up: \f30c; -$fa-var-low-vision: \f2a8; -$fa-var-luggage-cart: \f59d; -$fa-var-lungs: \f604; -$fa-var-lungs-virus: \f967; -$fa-var-lyft: \f3c3; -$fa-var-magento: \f3c4; -$fa-var-magic: \f0d0; -$fa-var-magnet: \f076; -$fa-var-mail-bulk: \f674; -$fa-var-mailchimp: \f59e; -$fa-var-male: \f183; -$fa-var-mandalorian: \f50f; -$fa-var-map: \f279; -$fa-var-map-marked: \f59f; -$fa-var-map-marked-alt: \f5a0; -$fa-var-map-marker: \f041; -$fa-var-map-marker-alt: \f3c5; -$fa-var-map-pin: \f276; -$fa-var-map-signs: \f277; -$fa-var-markdown: \f60f; -$fa-var-marker: \f5a1; -$fa-var-mars: \f222; -$fa-var-mars-double: \f227; -$fa-var-mars-stroke: \f229; -$fa-var-mars-stroke-h: \f22b; -$fa-var-mars-stroke-v: \f22a; -$fa-var-mask: \f6fa; -$fa-var-mastodon: \f4f6; -$fa-var-maxcdn: \f136; -$fa-var-mdb: \f8ca; -$fa-var-medal: \f5a2; -$fa-var-medapps: \f3c6; -$fa-var-medium: \f23a; -$fa-var-medium-m: \f3c7; -$fa-var-medkit: \f0fa; -$fa-var-medrt: \f3c8; -$fa-var-meetup: \f2e0; -$fa-var-megaport: \f5a3; -$fa-var-meh: \f11a; -$fa-var-meh-blank: \f5a4; -$fa-var-meh-rolling-eyes: \f5a5; -$fa-var-memory: \f538; -$fa-var-mendeley: \f7b3; -$fa-var-menorah: \f676; -$fa-var-mercury: \f223; -$fa-var-meteor: \f753; -$fa-var-microblog: \f91a; -$fa-var-microchip: \f2db; -$fa-var-microphone: \f130; -$fa-var-microphone-alt: \f3c9; -$fa-var-microphone-alt-slash: \f539; -$fa-var-microphone-slash: \f131; -$fa-var-microscope: \f610; -$fa-var-microsoft: \f3ca; -$fa-var-minus: \f068; -$fa-var-minus-circle: \f056; -$fa-var-minus-square: \f146; -$fa-var-mitten: \f7b5; -$fa-var-mix: \f3cb; -$fa-var-mixcloud: \f289; -$fa-var-mixer: \f956; -$fa-var-mizuni: \f3cc; -$fa-var-mobile: \f10b; -$fa-var-mobile-alt: \f3cd; -$fa-var-modx: \f285; -$fa-var-monero: \f3d0; -$fa-var-money-bill: \f0d6; -$fa-var-money-bill-alt: \f3d1; -$fa-var-money-bill-wave: \f53a; -$fa-var-money-bill-wave-alt: \f53b; -$fa-var-money-check: \f53c; -$fa-var-money-check-alt: \f53d; -$fa-var-monument: \f5a6; -$fa-var-moon: \f186; -$fa-var-mortar-pestle: \f5a7; -$fa-var-mosque: \f678; -$fa-var-motorcycle: \f21c; -$fa-var-mountain: \f6fc; -$fa-var-mouse: \f8cc; -$fa-var-mouse-pointer: \f245; -$fa-var-mug-hot: \f7b6; -$fa-var-music: \f001; -$fa-var-napster: \f3d2; -$fa-var-neos: \f612; -$fa-var-network-wired: \f6ff; -$fa-var-neuter: \f22c; -$fa-var-newspaper: \f1ea; -$fa-var-nimblr: \f5a8; -$fa-var-node: \f419; -$fa-var-node-js: \f3d3; -$fa-var-not-equal: \f53e; -$fa-var-notes-medical: \f481; -$fa-var-npm: \f3d4; -$fa-var-ns8: \f3d5; -$fa-var-nutritionix: \f3d6; -$fa-var-object-group: \f247; -$fa-var-object-ungroup: \f248; -$fa-var-odnoklassniki: \f263; -$fa-var-odnoklassniki-square: \f264; -$fa-var-oil-can: \f613; -$fa-var-old-republic: \f510; -$fa-var-om: \f679; -$fa-var-opencart: \f23d; -$fa-var-openid: \f19b; -$fa-var-opera: \f26a; -$fa-var-optin-monster: \f23c; -$fa-var-orcid: \f8d2; -$fa-var-osi: \f41a; -$fa-var-otter: \f700; -$fa-var-outdent: \f03b; -$fa-var-page4: \f3d7; -$fa-var-pagelines: \f18c; -$fa-var-pager: \f815; -$fa-var-paint-brush: \f1fc; -$fa-var-paint-roller: \f5aa; -$fa-var-palette: \f53f; -$fa-var-palfed: \f3d8; -$fa-var-pallet: \f482; -$fa-var-paper-plane: \f1d8; -$fa-var-paperclip: \f0c6; -$fa-var-parachute-box: \f4cd; -$fa-var-paragraph: \f1dd; -$fa-var-parking: \f540; -$fa-var-passport: \f5ab; -$fa-var-pastafarianism: \f67b; -$fa-var-paste: \f0ea; -$fa-var-patreon: \f3d9; -$fa-var-pause: \f04c; -$fa-var-pause-circle: \f28b; -$fa-var-paw: \f1b0; -$fa-var-paypal: \f1ed; -$fa-var-peace: \f67c; -$fa-var-pen: \f304; -$fa-var-pen-alt: \f305; -$fa-var-pen-fancy: \f5ac; -$fa-var-pen-nib: \f5ad; -$fa-var-pen-square: \f14b; -$fa-var-pencil-alt: \f303; -$fa-var-pencil-ruler: \f5ae; -$fa-var-penny-arcade: \f704; -$fa-var-people-arrows: \f968; -$fa-var-people-carry: \f4ce; -$fa-var-pepper-hot: \f816; -$fa-var-percent: \f295; -$fa-var-percentage: \f541; -$fa-var-periscope: \f3da; -$fa-var-person-booth: \f756; -$fa-var-phabricator: \f3db; -$fa-var-phoenix-framework: \f3dc; -$fa-var-phoenix-squadron: \f511; -$fa-var-phone: \f095; -$fa-var-phone-alt: \f879; -$fa-var-phone-slash: \f3dd; -$fa-var-phone-square: \f098; -$fa-var-phone-square-alt: \f87b; -$fa-var-phone-volume: \f2a0; -$fa-var-photo-video: \f87c; -$fa-var-php: \f457; -$fa-var-pied-piper: \f2ae; -$fa-var-pied-piper-alt: \f1a8; -$fa-var-pied-piper-hat: \f4e5; -$fa-var-pied-piper-pp: \f1a7; -$fa-var-pied-piper-square: \f91e; -$fa-var-piggy-bank: \f4d3; -$fa-var-pills: \f484; -$fa-var-pinterest: \f0d2; -$fa-var-pinterest-p: \f231; -$fa-var-pinterest-square: \f0d3; -$fa-var-pizza-slice: \f818; -$fa-var-place-of-worship: \f67f; -$fa-var-plane: \f072; -$fa-var-plane-arrival: \f5af; -$fa-var-plane-departure: \f5b0; -$fa-var-plane-slash: \f969; -$fa-var-play: \f04b; -$fa-var-play-circle: \f144; -$fa-var-playstation: \f3df; -$fa-var-plug: \f1e6; -$fa-var-plus: \f067; -$fa-var-plus-circle: \f055; -$fa-var-plus-square: \f0fe; -$fa-var-podcast: \f2ce; -$fa-var-poll: \f681; -$fa-var-poll-h: \f682; -$fa-var-poo: \f2fe; -$fa-var-poo-storm: \f75a; -$fa-var-poop: \f619; -$fa-var-portrait: \f3e0; -$fa-var-pound-sign: \f154; -$fa-var-power-off: \f011; -$fa-var-pray: \f683; -$fa-var-praying-hands: \f684; -$fa-var-prescription: \f5b1; -$fa-var-prescription-bottle: \f485; -$fa-var-prescription-bottle-alt: \f486; -$fa-var-print: \f02f; -$fa-var-procedures: \f487; -$fa-var-product-hunt: \f288; -$fa-var-project-diagram: \f542; -$fa-var-pump-medical: \f96a; -$fa-var-pump-soap: \f96b; -$fa-var-pushed: \f3e1; -$fa-var-puzzle-piece: \f12e; -$fa-var-python: \f3e2; -$fa-var-qq: \f1d6; -$fa-var-qrcode: \f029; -$fa-var-question: \f128; -$fa-var-question-circle: \f059; -$fa-var-quidditch: \f458; -$fa-var-quinscape: \f459; -$fa-var-quora: \f2c4; -$fa-var-quote-left: \f10d; -$fa-var-quote-right: \f10e; -$fa-var-quran: \f687; -$fa-var-r-project: \f4f7; -$fa-var-radiation: \f7b9; -$fa-var-radiation-alt: \f7ba; -$fa-var-rainbow: \f75b; -$fa-var-random: \f074; -$fa-var-raspberry-pi: \f7bb; -$fa-var-ravelry: \f2d9; -$fa-var-react: \f41b; -$fa-var-reacteurope: \f75d; -$fa-var-readme: \f4d5; -$fa-var-rebel: \f1d0; -$fa-var-receipt: \f543; -$fa-var-record-vinyl: \f8d9; -$fa-var-recycle: \f1b8; -$fa-var-red-river: \f3e3; -$fa-var-reddit: \f1a1; -$fa-var-reddit-alien: \f281; -$fa-var-reddit-square: \f1a2; -$fa-var-redhat: \f7bc; -$fa-var-redo: \f01e; -$fa-var-redo-alt: \f2f9; -$fa-var-registered: \f25d; -$fa-var-remove-format: \f87d; -$fa-var-renren: \f18b; -$fa-var-reply: \f3e5; -$fa-var-reply-all: \f122; -$fa-var-replyd: \f3e6; -$fa-var-republican: \f75e; -$fa-var-researchgate: \f4f8; -$fa-var-resolving: \f3e7; -$fa-var-restroom: \f7bd; -$fa-var-retweet: \f079; -$fa-var-rev: \f5b2; -$fa-var-ribbon: \f4d6; -$fa-var-ring: \f70b; -$fa-var-road: \f018; -$fa-var-robot: \f544; -$fa-var-rocket: \f135; -$fa-var-rocketchat: \f3e8; -$fa-var-rockrms: \f3e9; -$fa-var-route: \f4d7; -$fa-var-rss: \f09e; -$fa-var-rss-square: \f143; -$fa-var-ruble-sign: \f158; -$fa-var-ruler: \f545; -$fa-var-ruler-combined: \f546; -$fa-var-ruler-horizontal: \f547; -$fa-var-ruler-vertical: \f548; -$fa-var-running: \f70c; -$fa-var-rupee-sign: \f156; -$fa-var-rust: \f97a; -$fa-var-sad-cry: \f5b3; -$fa-var-sad-tear: \f5b4; -$fa-var-safari: \f267; -$fa-var-salesforce: \f83b; -$fa-var-sass: \f41e; -$fa-var-satellite: \f7bf; -$fa-var-satellite-dish: \f7c0; -$fa-var-save: \f0c7; -$fa-var-schlix: \f3ea; -$fa-var-school: \f549; -$fa-var-screwdriver: \f54a; -$fa-var-scribd: \f28a; -$fa-var-scroll: \f70e; -$fa-var-sd-card: \f7c2; -$fa-var-search: \f002; -$fa-var-search-dollar: \f688; -$fa-var-search-location: \f689; -$fa-var-search-minus: \f010; -$fa-var-search-plus: \f00e; -$fa-var-searchengin: \f3eb; -$fa-var-seedling: \f4d8; -$fa-var-sellcast: \f2da; -$fa-var-sellsy: \f213; -$fa-var-server: \f233; -$fa-var-servicestack: \f3ec; -$fa-var-shapes: \f61f; -$fa-var-share: \f064; -$fa-var-share-alt: \f1e0; -$fa-var-share-alt-square: \f1e1; -$fa-var-share-square: \f14d; -$fa-var-shekel-sign: \f20b; -$fa-var-shield-alt: \f3ed; -$fa-var-shield-virus: \f96c; -$fa-var-ship: \f21a; -$fa-var-shipping-fast: \f48b; -$fa-var-shirtsinbulk: \f214; -$fa-var-shoe-prints: \f54b; -$fa-var-shopify: \f957; -$fa-var-shopping-bag: \f290; -$fa-var-shopping-basket: \f291; -$fa-var-shopping-cart: \f07a; -$fa-var-shopware: \f5b5; -$fa-var-shower: \f2cc; -$fa-var-shuttle-van: \f5b6; -$fa-var-sign: \f4d9; -$fa-var-sign-in-alt: \f2f6; -$fa-var-sign-language: \f2a7; -$fa-var-sign-out-alt: \f2f5; -$fa-var-signal: \f012; -$fa-var-signature: \f5b7; -$fa-var-sim-card: \f7c4; -$fa-var-simplybuilt: \f215; -$fa-var-sink: \f96d; -$fa-var-sistrix: \f3ee; -$fa-var-sitemap: \f0e8; -$fa-var-sith: \f512; -$fa-var-skating: \f7c5; -$fa-var-sketch: \f7c6; -$fa-var-skiing: \f7c9; -$fa-var-skiing-nordic: \f7ca; -$fa-var-skull: \f54c; -$fa-var-skull-crossbones: \f714; -$fa-var-skyatlas: \f216; -$fa-var-skype: \f17e; -$fa-var-slack: \f198; -$fa-var-slack-hash: \f3ef; -$fa-var-slash: \f715; -$fa-var-sleigh: \f7cc; -$fa-var-sliders-h: \f1de; -$fa-var-slideshare: \f1e7; -$fa-var-smile: \f118; -$fa-var-smile-beam: \f5b8; -$fa-var-smile-wink: \f4da; -$fa-var-smog: \f75f; -$fa-var-smoking: \f48d; -$fa-var-smoking-ban: \f54d; -$fa-var-sms: \f7cd; -$fa-var-snapchat: \f2ab; -$fa-var-snapchat-ghost: \f2ac; -$fa-var-snapchat-square: \f2ad; -$fa-var-snowboarding: \f7ce; -$fa-var-snowflake: \f2dc; -$fa-var-snowman: \f7d0; -$fa-var-snowplow: \f7d2; -$fa-var-soap: \f96e; -$fa-var-socks: \f696; -$fa-var-solar-panel: \f5ba; -$fa-var-sort: \f0dc; -$fa-var-sort-alpha-down: \f15d; -$fa-var-sort-alpha-down-alt: \f881; -$fa-var-sort-alpha-up: \f15e; -$fa-var-sort-alpha-up-alt: \f882; -$fa-var-sort-amount-down: \f160; -$fa-var-sort-amount-down-alt: \f884; -$fa-var-sort-amount-up: \f161; -$fa-var-sort-amount-up-alt: \f885; -$fa-var-sort-down: \f0dd; -$fa-var-sort-numeric-down: \f162; -$fa-var-sort-numeric-down-alt: \f886; -$fa-var-sort-numeric-up: \f163; -$fa-var-sort-numeric-up-alt: \f887; -$fa-var-sort-up: \f0de; -$fa-var-soundcloud: \f1be; -$fa-var-sourcetree: \f7d3; -$fa-var-spa: \f5bb; -$fa-var-space-shuttle: \f197; -$fa-var-speakap: \f3f3; -$fa-var-speaker-deck: \f83c; -$fa-var-spell-check: \f891; -$fa-var-spider: \f717; -$fa-var-spinner: \f110; -$fa-var-splotch: \f5bc; -$fa-var-spotify: \f1bc; -$fa-var-spray-can: \f5bd; -$fa-var-square: \f0c8; -$fa-var-square-full: \f45c; -$fa-var-square-root-alt: \f698; -$fa-var-squarespace: \f5be; -$fa-var-stack-exchange: \f18d; -$fa-var-stack-overflow: \f16c; -$fa-var-stackpath: \f842; -$fa-var-stamp: \f5bf; -$fa-var-star: \f005; -$fa-var-star-and-crescent: \f699; -$fa-var-star-half: \f089; -$fa-var-star-half-alt: \f5c0; -$fa-var-star-of-david: \f69a; -$fa-var-star-of-life: \f621; -$fa-var-staylinked: \f3f5; -$fa-var-steam: \f1b6; -$fa-var-steam-square: \f1b7; -$fa-var-steam-symbol: \f3f6; -$fa-var-step-backward: \f048; -$fa-var-step-forward: \f051; -$fa-var-stethoscope: \f0f1; -$fa-var-sticker-mule: \f3f7; -$fa-var-sticky-note: \f249; -$fa-var-stop: \f04d; -$fa-var-stop-circle: \f28d; -$fa-var-stopwatch: \f2f2; -$fa-var-stopwatch-20: \f96f; -$fa-var-store: \f54e; -$fa-var-store-alt: \f54f; -$fa-var-store-alt-slash: \f970; -$fa-var-store-slash: \f971; -$fa-var-strava: \f428; -$fa-var-stream: \f550; -$fa-var-street-view: \f21d; -$fa-var-strikethrough: \f0cc; -$fa-var-stripe: \f429; -$fa-var-stripe-s: \f42a; -$fa-var-stroopwafel: \f551; -$fa-var-studiovinari: \f3f8; -$fa-var-stumbleupon: \f1a4; -$fa-var-stumbleupon-circle: \f1a3; -$fa-var-subscript: \f12c; -$fa-var-subway: \f239; -$fa-var-suitcase: \f0f2; -$fa-var-suitcase-rolling: \f5c1; -$fa-var-sun: \f185; -$fa-var-superpowers: \f2dd; -$fa-var-superscript: \f12b; -$fa-var-supple: \f3f9; -$fa-var-surprise: \f5c2; -$fa-var-suse: \f7d6; -$fa-var-swatchbook: \f5c3; -$fa-var-swift: \f8e1; -$fa-var-swimmer: \f5c4; -$fa-var-swimming-pool: \f5c5; -$fa-var-symfony: \f83d; -$fa-var-synagogue: \f69b; -$fa-var-sync: \f021; -$fa-var-sync-alt: \f2f1; -$fa-var-syringe: \f48e; -$fa-var-table: \f0ce; -$fa-var-table-tennis: \f45d; -$fa-var-tablet: \f10a; -$fa-var-tablet-alt: \f3fa; -$fa-var-tablets: \f490; -$fa-var-tachometer-alt: \f3fd; -$fa-var-tag: \f02b; -$fa-var-tags: \f02c; -$fa-var-tape: \f4db; -$fa-var-tasks: \f0ae; -$fa-var-taxi: \f1ba; -$fa-var-teamspeak: \f4f9; -$fa-var-teeth: \f62e; -$fa-var-teeth-open: \f62f; -$fa-var-telegram: \f2c6; -$fa-var-telegram-plane: \f3fe; -$fa-var-temperature-high: \f769; -$fa-var-temperature-low: \f76b; -$fa-var-tencent-weibo: \f1d5; -$fa-var-tenge: \f7d7; -$fa-var-terminal: \f120; -$fa-var-text-height: \f034; -$fa-var-text-width: \f035; -$fa-var-th: \f00a; -$fa-var-th-large: \f009; -$fa-var-th-list: \f00b; -$fa-var-the-red-yeti: \f69d; -$fa-var-theater-masks: \f630; -$fa-var-themeco: \f5c6; -$fa-var-themeisle: \f2b2; -$fa-var-thermometer: \f491; -$fa-var-thermometer-empty: \f2cb; -$fa-var-thermometer-full: \f2c7; -$fa-var-thermometer-half: \f2c9; -$fa-var-thermometer-quarter: \f2ca; -$fa-var-thermometer-three-quarters: \f2c8; -$fa-var-think-peaks: \f731; -$fa-var-thumbs-down: \f165; -$fa-var-thumbs-up: \f164; -$fa-var-thumbtack: \f08d; -$fa-var-ticket-alt: \f3ff; -$fa-var-tiktok: \f97b; -$fa-var-times: \f00d; -$fa-var-times-circle: \f057; -$fa-var-tint: \f043; -$fa-var-tint-slash: \f5c7; -$fa-var-tired: \f5c8; -$fa-var-toggle-off: \f204; -$fa-var-toggle-on: \f205; -$fa-var-toilet: \f7d8; -$fa-var-toilet-paper: \f71e; -$fa-var-toilet-paper-slash: \f972; -$fa-var-toolbox: \f552; -$fa-var-tools: \f7d9; -$fa-var-tooth: \f5c9; -$fa-var-torah: \f6a0; -$fa-var-torii-gate: \f6a1; -$fa-var-tractor: \f722; -$fa-var-trade-federation: \f513; -$fa-var-trademark: \f25c; -$fa-var-traffic-light: \f637; -$fa-var-trailer: \f941; -$fa-var-train: \f238; -$fa-var-tram: \f7da; -$fa-var-transgender: \f224; -$fa-var-transgender-alt: \f225; -$fa-var-trash: \f1f8; -$fa-var-trash-alt: \f2ed; -$fa-var-trash-restore: \f829; -$fa-var-trash-restore-alt: \f82a; -$fa-var-tree: \f1bb; -$fa-var-trello: \f181; -$fa-var-tripadvisor: \f262; -$fa-var-trophy: \f091; -$fa-var-truck: \f0d1; -$fa-var-truck-loading: \f4de; -$fa-var-truck-monster: \f63b; -$fa-var-truck-moving: \f4df; -$fa-var-truck-pickup: \f63c; -$fa-var-tshirt: \f553; -$fa-var-tty: \f1e4; -$fa-var-tumblr: \f173; -$fa-var-tumblr-square: \f174; -$fa-var-tv: \f26c; -$fa-var-twitch: \f1e8; -$fa-var-twitter: \f099; -$fa-var-twitter-square: \f081; -$fa-var-typo3: \f42b; -$fa-var-uber: \f402; -$fa-var-ubuntu: \f7df; -$fa-var-uikit: \f403; -$fa-var-umbraco: \f8e8; -$fa-var-umbrella: \f0e9; -$fa-var-umbrella-beach: \f5ca; -$fa-var-underline: \f0cd; -$fa-var-undo: \f0e2; -$fa-var-undo-alt: \f2ea; -$fa-var-uniregistry: \f404; -$fa-var-unity: \f949; -$fa-var-universal-access: \f29a; -$fa-var-university: \f19c; -$fa-var-unlink: \f127; -$fa-var-unlock: \f09c; -$fa-var-unlock-alt: \f13e; -$fa-var-unsplash: \f97c; -$fa-var-untappd: \f405; -$fa-var-upload: \f093; -$fa-var-ups: \f7e0; -$fa-var-usb: \f287; -$fa-var-user: \f007; -$fa-var-user-alt: \f406; -$fa-var-user-alt-slash: \f4fa; -$fa-var-user-astronaut: \f4fb; -$fa-var-user-check: \f4fc; -$fa-var-user-circle: \f2bd; -$fa-var-user-clock: \f4fd; -$fa-var-user-cog: \f4fe; -$fa-var-user-edit: \f4ff; -$fa-var-user-friends: \f500; -$fa-var-user-graduate: \f501; -$fa-var-user-injured: \f728; -$fa-var-user-lock: \f502; -$fa-var-user-md: \f0f0; -$fa-var-user-minus: \f503; -$fa-var-user-ninja: \f504; -$fa-var-user-nurse: \f82f; -$fa-var-user-plus: \f234; -$fa-var-user-secret: \f21b; -$fa-var-user-shield: \f505; -$fa-var-user-slash: \f506; -$fa-var-user-tag: \f507; -$fa-var-user-tie: \f508; -$fa-var-user-times: \f235; -$fa-var-users: \f0c0; -$fa-var-users-cog: \f509; -$fa-var-users-slash: \f973; -$fa-var-usps: \f7e1; -$fa-var-ussunnah: \f407; -$fa-var-utensil-spoon: \f2e5; -$fa-var-utensils: \f2e7; -$fa-var-vaadin: \f408; -$fa-var-vector-square: \f5cb; -$fa-var-venus: \f221; -$fa-var-venus-double: \f226; -$fa-var-venus-mars: \f228; -$fa-var-viacoin: \f237; -$fa-var-viadeo: \f2a9; -$fa-var-viadeo-square: \f2aa; -$fa-var-vial: \f492; -$fa-var-vials: \f493; -$fa-var-viber: \f409; -$fa-var-video: \f03d; -$fa-var-video-slash: \f4e2; -$fa-var-vihara: \f6a7; -$fa-var-vimeo: \f40a; -$fa-var-vimeo-square: \f194; -$fa-var-vimeo-v: \f27d; -$fa-var-vine: \f1ca; -$fa-var-virus: \f974; -$fa-var-virus-slash: \f975; -$fa-var-viruses: \f976; -$fa-var-vk: \f189; -$fa-var-vnv: \f40b; -$fa-var-voicemail: \f897; -$fa-var-volleyball-ball: \f45f; -$fa-var-volume-down: \f027; -$fa-var-volume-mute: \f6a9; -$fa-var-volume-off: \f026; -$fa-var-volume-up: \f028; -$fa-var-vote-yea: \f772; -$fa-var-vr-cardboard: \f729; -$fa-var-vuejs: \f41f; -$fa-var-walking: \f554; -$fa-var-wallet: \f555; -$fa-var-warehouse: \f494; -$fa-var-water: \f773; -$fa-var-wave-square: \f83e; -$fa-var-waze: \f83f; -$fa-var-weebly: \f5cc; -$fa-var-weibo: \f18a; -$fa-var-weight: \f496; -$fa-var-weight-hanging: \f5cd; -$fa-var-weixin: \f1d7; -$fa-var-whatsapp: \f232; -$fa-var-whatsapp-square: \f40c; -$fa-var-wheelchair: \f193; -$fa-var-whmcs: \f40d; -$fa-var-wifi: \f1eb; -$fa-var-wikipedia-w: \f266; -$fa-var-wind: \f72e; -$fa-var-window-close: \f410; -$fa-var-window-maximize: \f2d0; -$fa-var-window-minimize: \f2d1; -$fa-var-window-restore: \f2d2; -$fa-var-windows: \f17a; -$fa-var-wine-bottle: \f72f; -$fa-var-wine-glass: \f4e3; -$fa-var-wine-glass-alt: \f5ce; -$fa-var-wix: \f5cf; -$fa-var-wizards-of-the-coast: \f730; -$fa-var-wolf-pack-battalion: \f514; -$fa-var-won-sign: \f159; -$fa-var-wordpress: \f19a; -$fa-var-wordpress-simple: \f411; -$fa-var-wpbeginner: \f297; -$fa-var-wpexplorer: \f2de; -$fa-var-wpforms: \f298; -$fa-var-wpressr: \f3e4; -$fa-var-wrench: \f0ad; -$fa-var-x-ray: \f497; -$fa-var-xbox: \f412; -$fa-var-xing: \f168; -$fa-var-xing-square: \f169; -$fa-var-y-combinator: \f23b; -$fa-var-yahoo: \f19e; -$fa-var-yammer: \f840; -$fa-var-yandex: \f413; -$fa-var-yandex-international: \f414; -$fa-var-yarn: \f7e3; -$fa-var-yelp: \f1e9; -$fa-var-yen-sign: \f157; -$fa-var-yin-yang: \f6ad; -$fa-var-yoast: \f2b1; -$fa-var-youtube: \f167; -$fa-var-youtube-square: \f431; -$fa-var-zhihu: \f63f; diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/brands.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/brands.scss deleted file mode 100644 index eb153b2..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/brands.scss +++ /dev/null @@ -1,23 +0,0 @@ -/*! - * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -@import 'variables'; - -@font-face { - font-family: 'Font Awesome 5 Brands'; - font-style: normal; - font-weight: 400; - font-display: $fa-font-display; - src: url('#{$fa-font-path}/fa-brands-400.eot'); - src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'), - url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'), - url('#{$fa-font-path}/fa-brands-400.woff') format('woff'), - url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'), - url('#{$fa-font-path}/fa-brands-400.svg#fontawesome') format('svg'); -} - -.fab { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/fontawesome.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/fontawesome.scss deleted file mode 100644 index ac6d7e9..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/fontawesome.scss +++ /dev/null @@ -1,16 +0,0 @@ -/*! - * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -@import 'variables'; -@import 'mixins'; -@import 'core'; -@import 'larger'; -@import 'fixed-width'; -@import 'list'; -@import 'bordered-pulled'; -@import 'animated'; -@import 'rotated-flipped'; -@import 'stacked'; -@import 'icons'; -@import 'screen-reader'; diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/regular.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/regular.scss deleted file mode 100644 index 953e3a7..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/regular.scss +++ /dev/null @@ -1,23 +0,0 @@ -/*! - * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -@import 'variables'; - -@font-face { - font-family: 'Font Awesome 5 Free'; - font-style: normal; - font-weight: 400; - font-display: $fa-font-display; - src: url('#{$fa-font-path}/fa-regular-400.eot'); - src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'), - url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'), - url('#{$fa-font-path}/fa-regular-400.woff') format('woff'), - url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'), - url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg'); -} - -.far { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/solid.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/solid.scss deleted file mode 100644 index 6ea911c..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/solid.scss +++ /dev/null @@ -1,24 +0,0 @@ -/*! - * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -@import 'variables'; - -@font-face { - font-family: 'Font Awesome 5 Free'; - font-style: normal; - font-weight: 900; - font-display: $fa-font-display; - src: url('#{$fa-font-path}/fa-solid-900.eot'); - src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'), - url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'), - url('#{$fa-font-path}/fa-solid-900.woff') format('woff'), - url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'), - url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg'); -} - -.fa, -.fas { - font-family: 'Font Awesome 5 Free'; - font-weight: 900; -} diff --git a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/v4-shims.scss b/MyOffice.SPA/src/assets/scss/fonts/fontawesome/v4-shims.scss deleted file mode 100644 index 90f1392..0000000 --- a/MyOffice.SPA/src/assets/scss/fonts/fontawesome/v4-shims.scss +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -@import 'variables'; -@import 'shims'; diff --git a/MyOffice.SPA/src/assets/scss/pages/_auth.scss b/MyOffice.SPA/src/assets/scss/pages/_auth.scss deleted file mode 100644 index 113d220..0000000 --- a/MyOffice.SPA/src/assets/scss/pages/_auth.scss +++ /dev/null @@ -1,211 +0,0 @@ -.auth-container { - height: 100%; - width: 100%; - .auth-main { - height: 100%; - width: 100%; - margin: 0px !important; - min-height: 100vh; - } -} - -.left-img { - height: 100%; - width: 100%; - background-repeat: no-repeat; - background-position: center center; - background-size: cover; - display: flex; - align-items: center; - justify-content: center; - padding: 30px 15px; - position: relative; - z-index: 1; -} - -.left-content { - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - max-width: 480px; - width: 100%; - text-align: center; - - h1 { - color: #fff; - } - p { - color: #fff; - } -} -.auth-form-section { - background-color: #fff; -} -.auth-form-btn { - display: flex; - justify-content: center; - width: 100%; - height: 50px !important; - border-radius: 10px; - cursor: pointer; - button { - width: 100%; - } -} -.form-section { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; -} -.auth-signup-text { - font-size: 18px; - color: #000; - padding-bottom: 30px; - width: 410px; - max-width: 100%; -} -.sign-up-link { - color: #3699ff; - font-size: 20px !important; - margin: 0px 10px; -} -.auth-wrapper { - width: 410px; - max-width: 100%; - margin-top: auto; - margin-bottom: auto; -} -.login-title { - margin-bottom: 20px; -} -.social-login-title { - font-size: 15px; - color: #919aa3; - display: flex; - margin: 20px 0px; - - &::before, - &::after { - content: ""; - background-image: linear-gradient(#bbb8b8, #f3f3f3); - flex-grow: 1; - background-size: calc(100% - 20px) 1px; - background-repeat: no-repeat; - } - - &::before { - background-position: center left; - } - - &::after { - background-position: center right; - } -} -.welcome-msg { - font-weight: 500; -} -.social-icon { - text-align: center; - li a { - color: #3c4858; - border: 1px solid #3c4858; - display: inline-block; - height: 32px; - width: 32px; - line-height: 32px; - text-align: center; - transition: all 0.4s ease; - overflow: hidden; - position: relative; - &:hover { - background-color: #2f55d4; - border-color: #2f55d4 !important; - color: #ffffff !important; - } - } -} -.sm-icon { - height: 16px !important; - width: 16px !important; -} -.show-pwd-icon { - color: rgba(0, 0, 0, 0.55); - padding: 12px; -} -.face-icon { - color: rgba(0, 0, 0, 0.55); -} -.auth-locked { - font-size: 60px; - color: #333; - width: 120px; - height: 120px; - background-color: transparent; - margin: 0 auto; - img { - width: 100px; - border-radius: 50%; - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.2); - } -} -.auth-locked-title { - font-size: 30px; - font-family: Poppins, sans-serif; - color: #403866; - line-height: 1.2; - text-align: center; - width: 100%; - display: block; -} -.error-header { - font-size: 80px; - line-height: 1.2; - color: #403866; - text-transform: uppercase; - text-align: center; - width: 100%; - display: block; - font-weight: 700; -} -.error-subheader { - font-size: 17px; - color: #403866; - text-transform: uppercase; - text-align: center; - width: 100%; - display: block; - font-weight: 700; -} -.error-subheader2 { - font-size: 12px; - color: #919192; - text-align: center; - width: 100%; - display: block; - font-weight: 500; -} - -@keyframes spinner { - to { - transform: rotate(360deg); - } -} - -.auth-spinner:before { - content: ""; - box-sizing: border-box; - position: absolute; - top: 50%; - left: 50%; - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - border-radius: 50%; - border: 2px solid #ffffff; - border-top-color: #000000; - animation: spinner 0.8s linear infinite; -} diff --git a/MyOffice.SPA/src/assets/scss/pages/_dashboard.scss b/MyOffice.SPA/src/assets/scss/pages/_dashboard.scss deleted file mode 100644 index 539e19f..0000000 --- a/MyOffice.SPA/src/assets/scss/pages/_dashboard.scss +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Document : _dashboard.scss - * Author : RedStar Template - * Description: This scss file for dashboard page style classes - */ -.dashboard-flot-chart { - height: 275px; -} - -.dashboard-donut-chart { - height: 265px; - text-align: center; -} - -.dashboard-line-chart { - height: 250px; -} - -.dashboard-stat-list { - list-style: none; - padding-left: 0; - margin-top: 40px; - - li { - padding: 16px 0 0 0; - - small { - font-size: 8px; - } - } -} - -.dashboard-task-infos { - .progress { - height: 10px; - position: relative; - top: 6px; - } -} -.totalEarning { - text-align: center; - padding: 6px; - color: #ff9800; -} -.earningProgress .progress { - height: 9px; -} diff --git a/MyOffice.SPA/src/assets/scss/pages/_inbox.scss b/MyOffice.SPA/src/assets/scss/pages/_inbox.scss deleted file mode 100644 index ba18d1a..0000000 --- a/MyOffice.SPA/src/assets/scss/pages/_inbox.scss +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Document : _inbox.scss - * Author : RedStar Template - * Description: This scss file for email page style classes - */ -.p-15 { - padding: 15px; -} -.p-10 { - padding: 10px; -} -.b-b { - border-bottom: 1px solid rgba(0, 0, 0, 0.2); -} -.mail_listing { - .mail-option { - .btn-group { - margin-bottom: 5px; - } - } -} -#mail-nav { - .btn { - min-width: 110px; - } - #mail-folders { - list-style-type: none; - padding-left: 0px; - .badge { - float: right; - } - } - #mail-folders > li { - margin: 2px 0; - a { - &:hover { - color: #fff; - background-color: #337ab7; - } - } - &.active > a { - color: #fff; - background-color: #337ab7; - &:hover { - background-color: #32c0c3; - } - } - } - #mail-labels { - float: left; - width: 100%; - list-style-type: none; - padding-left: 0px; - li { - float: left; - } - .material-icons { - font-size: 16px; - height: 16px; - padding: 2px; - float: left; - } - } - #online-offline { - list-style-type: none; - padding-left: 0px; - .material-icons { - font-size: 8px; - height: 8px; - padding: 0px 5px 2px 0; - } - } - #mail-labels, - #online-offline { - li { - a:hover { - background-color: #e6e6e6; - } - } - } - li { - a { - color: #212529; - padding: 7px 10px; - display: block; - border-radius: 4px; - position: relative; - -webkit-transition: all 0.2s ease-out; - -moz-transition: all 0.2s ease-out; - transition: all 0.2s ease-out; - } - } -} -.composeForm { - padding: 25px; -} -.inbox-body { - padding: 20px; -} -.replyBox { - border: 1px solid rgba(120, 130, 140, 0.13); - padding: 20px; -} -.inbox-center .table thead th { - vertical-align: middle; - padding: 20px; -} -.email-btn-group { - position: relative; - display: -ms-inline-flexbox; - display: -webkit-inline-box; - display: inline-flex; - vertical-align: middle; -} -.max-texts { - padding: 15px !important; - a { - color: #212529; - padding: 10px 0px 10px 0px; - } -} diff --git a/MyOffice.SPA/src/assets/scss/pages/_pricing.scss b/MyOffice.SPA/src/assets/scss/pages/_pricing.scss deleted file mode 100644 index 74de917..0000000 --- a/MyOffice.SPA/src/assets/scss/pages/_pricing.scss +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Document : _pricing.scss - * Author : RedStar Template - * Description: This scss file for pricing page style classes - */ -//colors -$white: #fff; -$color_orange: #ffa442; -$color_blue: #4b64ff; -$color_red: #ff4b4b; -$color_green: #40c952; - -.pricingTable { - text-align: center; - background: $white; - margin: 0 -10px; - box-shadow: 0 0 10px #ababab; - padding-bottom: 40px; - border-radius: 10px; - color: #cad0de; - transform: scale(1); - transition: all 0.5s ease 0s; - &:hover { - transform: scale(1.05); - z-index: 1; - .pricingTable-header { - background: #ff9624; - i { - color: $white; - } - } - .price-value { - color: $white; - } - .month { - color: $white; - } - } - .pricingTable-header { - padding: 40px 0; - background: #f5f6f9; - border-radius: 10px 10px 50% 50%; - transition: all 0.5s ease 0s; - i { - font-size: 50px; - color: #858c9a; - margin-bottom: 10px; - transition: all 0.5s ease 0s; - } - } - .price-value { - font-size: 35px; - color: #ff9624; - transition: all 0.5s ease 0s; - } - .month { - display: block; - font-size: 14px; - color: #cad0de; - } - .heading { - font-size: 24px; - color: #ff9624; - margin-bottom: 20px; - text-transform: uppercase; - padding-top: 15px; - } - &.blue { - .price-value { - color: $color_blue; - } - .heading { - color: $color_blue; - } - &:hover .pricingTable-header { - background: $color_blue; - } - .pricingTable-signup a { - background: $color_blue; - &:hover { - box-shadow: 0 0 10px $color_blue; - } - } - } - &.red { - .price-value { - color: $color_red; - } - .heading { - color: $color_red; - } - &:hover .pricingTable-header { - background: $color_red; - } - .pricingTable-signup a { - background: $color_red; - &:hover { - box-shadow: 0 0 10px $color_red; - } - } - } - &.greenColor { - .price-value { - color: $color_green; - } - &:hover { - .pricingTable-header { - background: $color_green; - } - .price-value { - color: $white; - } - } - .pricingTable-signup a { - background: $color_green; - &:hover { - box-shadow: 0 0 10px $color_green; - } - } - } - &.blueColor { - &:hover { - .pricingTable-header { - background: $color_blue; - } - .price-value { - color: $white; - } - } - .price-value { - color: $color_blue; - } - .heading { - color: $color_blue; - } - .pricingTable-signup a { - background: $color_blue; - } - } - &.redColor { - &:hover { - .pricingTable-header { - background: $color_red; - } - .price-value { - color: $white; - } - } - .price-value { - color: $color_red; - } - .heading { - color: $color_red; - } - .pricingTable-signup a { - background: $color_red; - } - } - .pricing-content ul { - list-style: none; - padding: 0; - margin-bottom: 30px; - li { - line-height: 30px; - color: #a7a8aa; - } - } - .pricingTable-signup a { - display: inline-block; - font-size: 15px; - color: $white; - padding: 10px 35px; - border-radius: 20px; - background: $color_orange; - text-transform: uppercase; - transition: all 0.3s ease 0s; - &:hover { - box-shadow: 0 0 10px $color_orange; - } - } - &.green .heading { - color: $color_green; - } -} -@media screen and (max-width: 990px) { - .pricingTable { - margin: 0 0 20px 0; - } -} -.greenColor .heading { - font-size: 24px; - color: $color_green; - margin-bottom: 20px; - text-transform: uppercase; -} diff --git a/MyOffice.SPA/src/assets/scss/pages/_profile.scss b/MyOffice.SPA/src/assets/scss/pages/_profile.scss deleted file mode 100644 index a7c61ea..0000000 --- a/MyOffice.SPA/src/assets/scss/pages/_profile.scss +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Document : _profile.scss - * Author : RedStar Template - * Description: This scss file for profile page style classes - */ -.profile-tab-box { - background: $white; - padding: 10px; - margin-top: 10px; - margin-bottom: 15px; - width: 100%; -} - -.skill-progress { - height: 10px !important; -} -.tab-all a { - color: #948f8f !important; - &.active { - background-color: #e91e63 !important; - box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), - 0 13px 24px -11px rgba(233, 30, 99, 0.6); - color: #ffffff !important; - border-radius: 30px; - } -} diff --git a/MyOffice.SPA/src/assets/scss/pages/_projects.scss b/MyOffice.SPA/src/assets/scss/pages/_projects.scss deleted file mode 100644 index 7d910ba..0000000 --- a/MyOffice.SPA/src/assets/scss/pages/_projects.scss +++ /dev/null @@ -1,539 +0,0 @@ -@use "sass:math"; - -@function rem($size) { - $remSize: math.div($size, 16px); - @return #{$remSize}rem; -} - -.board { - height: 100%; - max-width: 100%; - background-color: #ffffff; - float: none; - box-shadow: none; - .list { - flex: 1 0 0; - margin: rem(16px) 0; - border-radius: rem(5px); - box-shadow: 0 rem(2px) rem(2px) rgba(#000, 0.03), - 0 rem(1px) rem(5px) rgba(#000, 0.02); - overflow: hidden; - .header { - display: flex; - padding: rem(18px) rem(14px); - background: #ffffff; - align-items: center; - .title { - flex: 1; - text-align: center; - h2 { - margin: 0 0 rem(6px); - font-weight: 500; - font-size: 18px; - line-height: 1; - } - .count { - font-size: rem(14px); - line-height: 1; - opacity: 0.65; - } - } - } - .projects { - margin: 0; - padding: rem(14px); - list-style: none; - &.cdk-drop-list-dragging { - opacity: 0.65; - } - .cdk-drag-placeholder { - display: none; - } - } - } -} - -.project { - cursor: pointer; - list-style: none; - padding: rem(16px); - background: #ffffff; - transition: box-shadow 0.2s; - min-height: 50px; - position: relative; - margin-bottom: 24px; - border: 1px solid #d1d1d1; - border-radius: 10px; - box-shadow: 0 0 10px 0 rgba(183, 192, 206, 0.2); - -webkit-box-shadow: 0 0 10px 0 rgba(183, 192, 206, 0.2); - - &:hover { - box-shadow: 0 rem(2px) rem(2px) rgba(#000, 0.1), - 0 rem(1px) rem(5px) rgba(#000, 0.09); - } - &:last-child { - margin-bottom: 0; - } - &:not(.project-list-add) { - padding-right: rem(32px); - } - - h3 { - margin: 0 0 rem(4px); - font-size: 1em; - font-weight: 500; - } - .description { - margin: 0 0 rem(8px); - } - .gravity { - display: flex; - font-size: rem(11px); - letter-spacing: 1px; - text-transform: uppercase; - .priority { - flex: 1; - } - .deadline { - margin-right: rem(-16px); - text-align: right; - .icon { - margin-right: rem(4px); - display: inline-block; - height: 1em; - overflow: visible; - font-size: inherit; - vertical-align: -0.125em; - } - .deadline-label { - display: none; - } - } - } - .project-actions { - opacity: 0; - position: absolute; - top: rem(6px); - right: rem(-3px); - transition: opacity 0.2s; - } - .project-actions[aria-expanded="true"], - &:hover .project-actions { - opacity: 1; - } -} - -@media (min-width: 768px) { - .board { - display: flex; - .list { - margin: 0; - box-shadow: none; - border-radius: 0; - border-width: 0 0 0 1px; - // &:last-child { - // border-right: 1px solid #bbb; - // } - } - } -} - -@media (min-width: 992px) { - .project .gravity .deadline .deadline-label { - display: inline; - } -} - -.wrapper { - display: flex; - flex-flow: column; - height: 100%; -} - -.container { - margin: 0 auto; - padding: 0 rem(8px); - max-width: 1320px; -} - -.header { - flex: 0 1 auto; - padding: rem(18px) 0; - background: linear-gradient( - to top, - var(--color-purple-heart), - var(--color-purple-heart-light) - ); - color: var(--color-white); - .container { - display: flex; - justify-content: space-between; - align-items: center; - } - h1 { - margin: 0; - font-size: rem(16px); - line-height: 1; - font-weight: 500; - text-transform: uppercase; - letter-spacing: rem(1.5px); - a { - color: var(--color-white); - } - svg { - position: relative; - top: -1px; - margin-right: rem(12px); - display: inline-block; - vertical-align: middle; - height: rem(25px); - } - span { - display: inline-block; - vertical-align: middle; - } - } -} - -nav { - flex: 0 1 auto; - padding: rem(3px) 0; - background: var(--color-purple-heart-dark); - .container { - display: flex; - justify-content: space-between; - align-items: center; - } - .menu { - a { - display: inline-block; - padding: rem(11px) rem(11px) rem(9px); - color: var(--color-white); - font-weight: 500; - text-decoration: none; - border-bottom: rem(3px) solid rgba(#fff, 0.5); - } - } - .actions { - position: fixed; - z-index: 10; - right: rem(40px); - bottom: rem(40px); - button { - width: rem(60px); - height: rem(60px); - padding: 0; - background: #1075f2; - color: white; - border: none; - border-radius: 50%; - box-shadow: 0 0 rem(20px) rgba(#000, 0.3); - cursor: pointer; - svg { - height: rem(30px); - } - } - } -} - -main { - position: relative; - flex: 1 1 auto; - .container { - height: 100%; - } -} -.project-bedge { - font-size: 12px; - font-weight: 500; - background-color: #d1d3d4; - display: inline-flex; - cursor: default; - user-select: none; - border-radius: 3px; - padding: 2px 5px; - float: right; -} -.project-bedge2 { - font-size: 12px; - font-weight: 500; - background-color: #d1d3d4; - display: inline-flex; - cursor: default; - user-select: none; - border-radius: 3px; - padding: 2px 5px; - float: left; -} -.project-priority--1 { - color: rgb(0, 218, 0); - font-weight: 500; -} -.project-priority-0 { - color: rgb(233, 0, 233); - font-weight: 500; -} -.project-priority-1 { - color: hsl(0, 84%, 31%); - font-weight: 500; -} -.project-type-Website { - background-color: #1075f2; - color: #fff; -} -.project-type-Android { - background-color: #f21023; - color: #fff; -} -.project-type-IPhone { - background-color: #110103; - color: #fff; -} -.project-type-Testing { - background-color: #06a800; - color: #fff; -} -.pro-left { - font-weight: 500; - padding: 0px 10px; - border-radius: 5px; -} -.project-title { - font-size: 17px; - color: #1f2225; -} -.project-icon { - font-size: 19px; - margin-right: 5px; - vertical-align: text-top; -} -.project-icon2 { - font-size: 16px; - margin-right: 5px; - vertical-align: text-top; -} -.add-icon { - font-size: 19px; - margin-right: 5px; - vertical-align: text-top; -} - -@media (min-width: 576px) { - .container { - padding: 0 rem(16px); - } -} - -.project-people { - text-align: right; - vertical-align: middle; - img { - width: 32px; - height: 32px; - } -} -.project-actions { - text-align: right; - vertical-align: middle; -} -.profile-content { - border-top: none !important; -} -.profile-stats { - margin-right: 10px; -} -.profile-image { - width: 120px; - float: left; - img { - width: 96px; - height: 96px; - } -} -.profile-info { - margin-left: 120px; -} -.feed-element { - padding-bottom: 15px; - margin-top: 15px; - overflow: hidden; - &:first-child { - margin-top: 0; - } - .media { - margin-top: 15px; - } - .well { - border: 1px solid #e7eaec; - box-shadow: none; - background: #f2f3ff; - margin-top: 10px; - margin-bottom: 5px; - padding: 10px 20px; - font-size: 11px; - line-height: 16px; - } - .actions { - margin-top: 10px; - } - .photos { - margin: 10px 0; - } - > .pull-left { - margin-right: 10px; - } - img.img-circle { - width: 38px; - height: 38px; - } -} -.media-body { - overflow: hidden; -} -.feed-photo { - max-height: 180px; - //Instead of the line below you could use @include border-radius($radius, $vertical-radius) - border-radius: 4px; - overflow: hidden; - margin-right: 10px; - margin-bottom: 10px; -} -.ibox { - clear: both; - margin-bottom: 25px; - margin-top: 0; - padding: 0; - &.collapsed { - .ibox-content { - display: none; - } - .fa { - &.fa-chevron-up:before { - content: "\f078"; - } - &.fa-chevron-down:before { - content: "\f077"; - } - } - } - &:after { - display: table; - } - &:before { - display: table; - } -} -.ibox-title { - background-color: #ffffff; - border-color: #e7eaec; - //Instead of the line below you could use @include border-image($value) - border-image: none; - border-style: solid solid none; - border-width: 3px 0 0; - color: inherit; - margin-bottom: 0; - padding: 14px 15px 7px; - min-height: 48px; -} -.ibox-content { - background-color: #ffffff; - color: inherit; - padding: 0px 20px 20px; - border-image: none; - border-width: 1px 0; -} -.ibox-footer { - color: inherit; - border-top: 1px solid #e7eaec; - font-size: 90%; - background: #ffffff; - padding: 10px 15px; -} -dd.project-people { - text-align: left; - margin-top: 5px; -} -.project-title a { - font-size: 14px; - color: #676a6c; - font-weight: 600; -} -.project-list table tr td { - border-top: none; - border-bottom: 1px solid #e7eaec; - padding: 15px 10px; - vertical-align: middle; -} -.project-manager .tag-list li a { - font-size: 10px; - background-color: white; - padding: 5px 12px; - color: inherit; - //Instead of the line below you could use @include border-radius($radius, $vertical-radius) - border-radius: 2px; - border: 1px solid #e7eaec; - margin-right: 5px; - margin-top: 5px; - display: block; -} -.project-files li a { - font-size: 11px; - color: #676a6c; - margin-left: 10px; - line-height: 22px; -} -.feed-activity-list { - margin: 10px; - .feed-element { - border-bottom: 1px solid #e7eaec; - } -} -.dropdown-messages-box img.img-circle { - width: 38px; - height: 38px; -} -.file-list li { - padding: 5px 10px; - font-size: 11px; - //Instead of the line below you could use @include border-radius($radius, $vertical-radius) - border-radius: 2px; - border: 1px solid #e7eaec; - margin-bottom: 5px; - a { - color: inherit; - &:hover { - color: #1ab394; - } - } -} -.user-friends img { - width: 42px; - height: 42px; - margin-bottom: 5px; - margin-right: 5px; -} -.project-activity { - border: 1px solid #e5e5e5; - margin-top: 20px; -} -.project-doc-icon { - width: 40px; - height: 40px; - border: 1px solid #d9d9d9; - border-radius: 0.55rem; - i { - font-size: 20px; - line-height: 40px; - } -} -.project-name { - color: #f68c1f; -} -.project-card-header { - color: #5b626b; - font-size: 17px; - line-height: 28px; - padding-right: 10px; - font-weight: 500; - margin-bottom: 10px; -} diff --git a/MyOffice.SPA/src/assets/scss/pages/_timeline.scss b/MyOffice.SPA/src/assets/scss/pages/_timeline.scss deleted file mode 100644 index a5445a7..0000000 --- a/MyOffice.SPA/src/assets/scss/pages/_timeline.scss +++ /dev/null @@ -1,744 +0,0 @@ -/* - * Document : _timeline.scss - * Author : RedStar Template - * Description: This scss file for timeline page style classes - */ - -.cd-container { - width: 90%; - max-width: 1170px; - margin: 0 auto; -} - -.cd-container::after { - content: ""; - display: table; - clear: both; -} - -/* -------------------------------- - - Main components - - -------------------------------- */ -header { - height: 200px; - line-height: 200px; - text-align: center; - background: #303e49; -} - -header h1 { - color: #ffffff; - font-size: 18px; - font-size: 1.125rem; -} - -.timelineImgHight { - width: 150px; -} - -@media only screen and (min-width: 1170px) { - header { - height: 300px; - line-height: 300px; - } - header h1 { - font-size: 24px; - font-size: 1.5rem; - } -} - -#cd-timeline { - position: relative; - padding: 2em 0; - margin-top: 2em; - margin-bottom: 2em; -} - -#cd-timeline::before { - /* this is the vertical line */ - content: ""; - position: absolute; - top: 0; - left: 18px; - height: 100%; - width: 4px; - background: #d7e4ed; -} - -@media only screen and (min-width: 1170px) { - #cd-timeline { - margin-top: 3em; - margin-bottom: 3em; - } - #cd-timeline::before { - left: 50%; - margin-left: -2px; - } -} - -.cd-timeline-block { - position: relative; - margin: 2em 0; -} - -.cd-timeline-block::after { - clear: both; - content: ""; - display: table; -} - -.cd-timeline-block:first-child { - margin-top: 0; -} - -.cd-timeline-block:last-child { - margin-bottom: 0; -} - -@media only screen and (min-width: 1170px) { - .cd-timeline-block { - margin: 4em 0; - } - .cd-timeline-block:first-child { - margin-top: 0; - } - .cd-timeline-block:last-child { - margin-bottom: 0; - } -} - -.cd-timeline-img { - position: absolute; - top: 0; - left: 0; - width: 40px; - height: 40px; - border-radius: 50%; - box-shadow: 0 0 0 4px #e6dfdf, inset 0 2px 0 rgba(0, 0, 0, 0.08), - 0 3px 0 4px rgba(0, 0, 0, 0.05); -} - -.cd-timeline-img img { - display: block; - width: 48px; - position: relative; - left: 30%; - top: 30%; - margin-left: -12px; - margin-top: -12px; - border-radius: 50%; -} - -.cd-timeline-img.cd-picture { - background: #75ce66; -} - -.cd-timeline-img.cd-movie { - background: #c03b44; -} - -.cd-timeline-img.cd-location { - background: #f0ca45; -} - -@media only screen and (min-width: 1170px) { - .cd-timeline-img { - width: 60px; - height: 60px; - left: 50%; - margin-left: -30px; - /* Force Hardware Acceleration in WebKit */ - -webkit-transform: translateZ(0); - -webkit-backface-visibility: hidden; - } - .cssanimations .cd-timeline-img.is-hidden { - visibility: hidden; - } - .cssanimations .cd-timeline-img.bounce-in { - visibility: visible; - -webkit-animation: cd-bounce-1 0.6s; - -moz-animation: cd-bounce-1 0.6s; - animation: cd-bounce-1 0.6s; - } -} - -@-webkit-keyframes cd-bounce-1 { - 0% { - opacity: 0; - -webkit-transform: scale(0.5); - } - 60% { - opacity: 1; - -webkit-transform: scale(1.2); - } - 100% { - -webkit-transform: scale(1); - } -} - -@-moz-keyframes cd-bounce-1 { - 0% { - opacity: 0; - -moz-transform: scale(0.5); - } - 60% { - opacity: 1; - -moz-transform: scale(1.2); - } - 100% { - -moz-transform: scale(1); - } -} - -@keyframes cd-bounce-1 { - 0% { - opacity: 0; - -webkit-transform: scale(0.5); - -moz-transform: scale(0.5); - -ms-transform: scale(0.5); - -o-transform: scale(0.5); - transform: scale(0.5); - } - 60% { - opacity: 1; - -webkit-transform: scale(1.2); - -moz-transform: scale(1.2); - -ms-transform: scale(1.2); - -o-transform: scale(1.2); - transform: scale(1.2); - } - 100% { - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); - } -} - -.cd-timeline-content { - position: relative; - margin-left: 60px; - background: #f0f1f3; - border-radius: 0.25em; - padding: 1em; - box-shadow: 0 3px 0 #d7e4ed; -} - -.cd-timeline-content::after { - clear: both; - content: ""; - display: table; -} - -.cd-timeline-content h2 { - color: #303e49; -} - -.cd-timeline-content p, -.cd-timeline-content .cd-read-more, -.cd-timeline-content .cd-date { - font-size: 13px; - font-size: 0.8125rem; -} - -.cd-timeline-content .cd-read-more, -.cd-timeline-content .cd-date { - display: inline-block; -} - -.cd-timeline-content p { - margin: 1em 0; - line-height: 1.6; -} - -.cd-timeline-content .cd-read-more { - float: right; - padding: 0.8em 1em; - background: #acb7c0; - color: #ffffff; - border-radius: 0.25em; -} - -.no-touch .cd-timeline-content .cd-read-more:hover { - background-color: #bac4cb; -} - -.cd-timeline-content .cd-date { - float: left; - padding: 0.8em 0; - opacity: 0.7; -} - -.cd-timeline-content::before { - content: ""; - position: absolute; - top: 16px; - right: 100%; - height: 0; - width: 0; - border: 7px solid transparent; - border-right: 7px solid #ffffff; -} - -@media only screen and (min-width: 768px) { - .cd-timeline-content h2 { - font-size: 20px; - font-size: 1.25rem; - } - .cd-timeline-content p { - font-size: 16px; - font-size: 1rem; - } - .cd-timeline-content .cd-read-more, - .cd-timeline-content .cd-date { - font-size: 14px; - font-size: 0.875rem; - } -} - -@media only screen and (min-width: 1170px) { - .cd-timeline-content { - margin-left: 0; - padding: 1.6em; - width: 45%; - } - .cd-timeline-content::before { - top: 24px; - left: 100%; - border-color: transparent; - border-left-color: #f0f1f3; - } - .cd-timeline-content .cd-read-more { - float: left; - } - .cd-timeline-content .cd-date { - position: absolute; - width: 100%; - left: 122%; - top: 6px; - font-size: 16px; - font-size: 1rem; - } - .cd-timeline-block:nth-child(even) .cd-timeline-content { - float: right; - } - .cd-timeline-block:nth-child(even) .cd-timeline-content::before { - top: 24px; - left: auto; - right: 100%; - border-color: transparent; - border-right-color: #f0f1f3; - } - .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-read-more { - float: right; - } - .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-date { - left: auto; - right: 122%; - text-align: right; - } - .cssanimations .cd-timeline-content.is-hidden { - visibility: hidden; - } - .cssanimations .cd-timeline-content.bounce-in { - visibility: visible; - -webkit-animation: cd-bounce-2 0.6s; - -moz-animation: cd-bounce-2 0.6s; - animation: cd-bounce-2 0.6s; - } -} - -@media only screen and (min-width: 1170px) { - /* inverse bounce effect on even content blocks */ - .cssanimations - .cd-timeline-block:nth-child(even) - .cd-timeline-content.bounce-in { - -webkit-animation: cd-bounce-2-inverse 0.6s; - -moz-animation: cd-bounce-2-inverse 0.6s; - animation: cd-bounce-2-inverse 0.6s; - } -} - -@-webkit-keyframes cd-bounce-2 { - 0% { - opacity: 0; - -webkit-transform: translateX(-100px); - } - 60% { - opacity: 1; - -webkit-transform: translateX(20px); - } - 100% { - -webkit-transform: translateX(0); - } -} - -@-moz-keyframes cd-bounce-2 { - 0% { - opacity: 0; - -moz-transform: translateX(-100px); - } - 60% { - opacity: 1; - -moz-transform: translateX(20px); - } - 100% { - -moz-transform: translateX(0); - } -} - -@keyframes cd-bounce-2 { - 0% { - opacity: 0; - -webkit-transform: translateX(-100px); - -moz-transform: translateX(-100px); - -ms-transform: translateX(-100px); - -o-transform: translateX(-100px); - transform: translateX(-100px); - } - 60% { - opacity: 1; - -webkit-transform: translateX(20px); - -moz-transform: translateX(20px); - -ms-transform: translateX(20px); - -o-transform: translateX(20px); - transform: translateX(20px); - } - 100% { - -webkit-transform: translateX(0); - -moz-transform: translateX(0); - -ms-transform: translateX(0); - -o-transform: translateX(0); - transform: translateX(0); - } -} - -@-webkit-keyframes cd-bounce-2-inverse { - 0% { - opacity: 0; - -webkit-transform: translateX(100px); - } - 60% { - opacity: 1; - -webkit-transform: translateX(-20px); - } - 100% { - -webkit-transform: translateX(0); - } -} - -@-moz-keyframes cd-bounce-2-inverse { - 0% { - opacity: 0; - -moz-transform: translateX(100px); - } - 60% { - opacity: 1; - -moz-transform: translateX(-20px); - } - 100% { - -moz-transform: translateX(0); - } -} - -@keyframes cd-bounce-2-inverse { - 0% { - opacity: 0; - -webkit-transform: translateX(100px); - -moz-transform: translateX(100px); - -ms-transform: translateX(100px); - -o-transform: translateX(100px); - transform: translateX(100px); - } - 60% { - opacity: 1; - -webkit-transform: translateX(-20px); - -moz-transform: translateX(-20px); - -ms-transform: translateX(-20px); - -o-transform: translateX(-20px); - transform: translateX(-20px); - } - 100% { - -webkit-transform: translateX(0); - -moz-transform: translateX(0); - -ms-transform: translateX(0); - -o-transform: translateX(0); - transform: translateX(0); - } -} - -.timeline { - list-style: none; - padding: 0 0 8px; - position: relative; - &:before { - top: 00px; - bottom: 0; - position: absolute; - content: " "; - width: 3px; - background-color: #e7e7e7; - left: 25px; - margin-right: -1.5px; - } - > li { - margin-bottom: 5px; - position: relative; - &:before { - content: " "; - display: table; - } - &:after { - content: " "; - display: table; - clear: both; - } - > { - .timeline-panel { - width: calc(100% - 70px); - float: right; - border: 1px solid #e7e7e7; - border-radius: 2px; - padding: 5px 20px; - position: relative; - border-radius: 10px; - margin-bottom: 5px; - &:before { - position: absolute; - top: 26px; - left: -15px; - display: inline-block; - border-top: 15px solid transparent; - border-right: 15px solid #e7e7e7; - border-left: 0 solid #e7e7e7; - border-bottom: 15px solid transparent; - content: " "; - } - &:after { - position: absolute; - top: 27px; - left: -14px; - display: inline-block; - border-top: 14px solid transparent; - border-right: 14px solid #ffffff; - border-left: 0 solid #ffffff; - border-bottom: 14px solid transparent; - content: " "; - } - } - .timeline-badge { - width: 35px; - height: 35px; - position: absolute; - top: 25px; - left: 8px; - img { - border-radius: 50%; - border: 2px solid #ffffff; - -webkit-box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); - -ms-box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); - box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); - } - } - } - } -} -.timeline-title { - margin: 4px 0 !important; - font-size: 13px; -} -.timeline-body > p { - font-size: 12px; - margin-bottom: 2px; -} - -// Timeline 2 - -.left-timeline { - margin: 0; - padding: 0; - list-style: none; - position: relative; - &:before { - content: ""; - position: absolute; - top: 0; - bottom: 0; - width: 3px; - background: #eee; - left: 20%; - margin-left: -6px; - } - > li { - position: relative; - &:first-child { - .left-icon { - background: #fff; - color: #666; - } - .left-time span.large { - color: #444; - font-size: 17px !important; - font-weight: 700; - } - } - &:nth-child(odd) { - .left-label { - background: #f0f1f3; - &:after { - border-right-color: #f0f1f3; - } - } - .left-time span:last-child { - color: #444; - font-size: 13px; - } - } - .left-time { - display: block; - width: 23%; - padding-right: 70px; - position: absolute; - span { - display: block; - text-align: right; - &:first-child { - font-size: 15px; - color: #3d4c5a; - font-weight: 700; - } - &:last-child { - font-size: 14px; - color: #444; - } - } - } - .left-label { - margin: 0 0 15px 25%; - background: #f0f1f3; - padding: 1.2em; - position: relative; - //Instead of the line below you could use @include border-radius($radius, $vertical-radius) - border-radius: 5px; - &:after { - right: 100%; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-right-color: #f0f1f3; - border-width: 10px; - top: 10px; - } - blockquote { - font-size: 16px; - } - .map-checkin { - border: 5px solid rgba(235, 235, 235, 0.2); - //Instead of the line below you could use @include box-shadow($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10) - box-shadow: 0 0 0 1px #ebebeb; - background: #fff !important; - } - h2 { - margin: 0; - padding: 0 0 10px 0; - line-height: 26px; - font-size: 16px; - font-weight: normal; - a { - font-size: 15px; - &:hover { - text-decoration: none; - } - } - span { - font-size: 15px; - } - } - p { - color: #444; - } - } - .left-icon { - width: 40px; - height: 40px; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - font-size: 1.4em; - line-height: 40px; - position: absolute; - color: #fff; - border-radius: 50%; - box-shadow: 0 5px 25px 0 rgba(0, 0, 0, 0.2); - text-align: center; - left: 20%; - top: 0; - margin: 0 0 0 -25px; - img { - border-radius: 50%; - } - } - .empty span { - color: #777; - } - } -} -@media screen and (max-width: 992px) and (min-width: 768px) { - .left-timeline > li .left-time { - padding-right: 60px; - } -} -@media screen and (max-width: 65.375em) { - .left-timeline > li .left-time span:last-child { - font-size: 12px; - } -} -@media screen and (max-width: 47.2em) { - .left-timeline { - &:before { - display: none; - } - > li { - .left-time { - width: 100%; - position: relative; - padding: 0 0 20px 0; - span { - text-align: left; - } - } - .left-label { - margin: 0 0 30px 0; - padding: 1em; - font-weight: 400; - font-size: 95%; - &:after { - right: auto; - left: 20px; - border-right-color: transparent; - border-bottom-color: #f5f5f6; - top: -20px; - } - } - .left-icon { - position: relative; - float: right; - left: auto; - margin: -64px 5px 0 0; - } - &:nth-child(odd) .left-label:after { - border-right-color: transparent; - border-bottom-color: #f5f5f6; - } - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/plugins/_carousel.scss b/MyOffice.SPA/src/assets/scss/plugins/_carousel.scss deleted file mode 100644 index 435404d..0000000 --- a/MyOffice.SPA/src/assets/scss/plugins/_carousel.scss +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Document : _carousel.scss - * Author : RedStar Template - * Description: This scss file for owl carousel style classes - */ - -.owl-btns { - text-align: center; - [class*="owl-"] { - color: #fff; - font-size: 14px; - margin: 5px; - padding: 4px 7px; - background: #d6d6d6; - display: inline-block; - cursor: pointer; - border-radius: 3px; - &:hover { - background: #869791; - color: #fff; - text-decoration: none; - } - } -} -#dashboard_slide { - padding: 6px 10px 0px 0px; -} -#dashboard_slide2 { - padding: 0px 10px 0px 0px; -} -.carousel-content { - height: 232px; - border-radius: 5px; - .slide-heading { - font-size: 20px; - } -} diff --git a/MyOffice.SPA/src/assets/scss/plugins/_charts.scss b/MyOffice.SPA/src/assets/scss/plugins/_charts.scss deleted file mode 100644 index fa7850f..0000000 --- a/MyOffice.SPA/src/assets/scss/plugins/_charts.scss +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Document : _charts.scss - * Author : RedStar Template - * Description: This scss file for all charts style classes - */ -/* Morris */ -.morris-hover { - &.morris-default-style { - @include border-radius(0); - } -} - -/* Flot */ -.flot-chart { - width: 100%; - height: 320px; -} - -.panel-switch-btn { - position: relative; - right: 20px; - z-index: 9; - - label { - font-weight: bold !important; - } -} - -.legendLabel { - width: 85px !important; - position: relative; - left: 3px; -} - -#multiple_axis_chart { - .legendLabel { - width: 160px !important; - } -} - -/* Sparkline */ -.sparkline { - text-align: center; -} - -.chart-box { - display: flex; - justify-content: space-between; - font-size: 14px; - margin-bottom: 30px; -} -.chart-box2 { - font-size: 14px; - margin-bottom: 30px; - text-align: center; -} -.chart-note { - text-transform: capitalize; - display: inline-block; - margin-right: 12px; - font-size: 14px; - .dot { - margin: 0px 7px; - } -} -.chart-statis { - display: inline-block; - margin-right: 35px; - .label { - display: block; - text-transform: capitalize; - line-height: 1.2; - } - .index { - font-size: 18px; - color: #333; - padding-left: 15px; - } -} - -.dot { - display: inline-block; - width: 10px; - height: 10px; - border-radius: 100%; -} -.dot-black { - background: #000000; -} -.dot-orange { - background: #f96332; -} -.chart-box-left { - padding-left: 10px; -} -.area_chart-style { - height: 170px; - margin: 30px; -} -.chart-shadow2 { - -webkit-filter: drop-shadow(0 -6px 4px rgba(106, 141, 247, 0.5)); - filter: drop-shadow(0 -6px 4px rgba(106, 141, 247, 0.5)); -} -.chart-shadow { - -webkit-filter: drop-shadow(0px 9px 2px rgba(0, 0, 0, 0.3)); - filter: drop-shadow(0px 9px 2px rgba(0, 0, 0, 0.3)); -} -.chartsh { - height: 16rem; -} - -// chartjs - -.axisData { - position: absolute; - color: #fff; - z-index: 1; - text-transform: uppercase; - display: flex; - width: 100%; - bottom: 0; - .tick { - flex: 1; - position: relative; - overflow: hidden; - opacity: 0.2; - font-size: 11px; - text-align: center; - line-height: 40px; - padding-top: 150px; - &:hover { - opacity: 1; - background-color: rgba(255, 255, 255, 0.2); - .value { - &.productValue { - transform: translateY(0); - display: block; - } - &.serviceValue { - transform: translateY(0); - display: block; - left: 0; - top: 80px; - color: #000; - transition: 0.3s transform; - } - } - } - .value { - transform: translateY(20px); - transition: 0.3s transform; - position: absolute; - top: 20px; - color: #000; - border-radius: 2px; - width: 100%; - line-height: 20px; - } - } -} -.dot-product { - background: #5bcfe4; -} -.dot-service { - background: #64e88b; -} -.dot-product1 { - background: #d3d3d3; -} -.dot-service1 { - background: #6e68c1; -} - -// ngx-chart -.chart-legend { - header { - background: transparent; - height: 0px; - } - .legend-labels { - background: transparent !important; - } -} -.ngx-charts { - text { - fill: #9aa0ac; - } -} - -// Gauge chart -mwl-gauge { - width: 150px; - height: 150px; - display: block; - padding: 10px; -} -mwl-gauge > .gauge > .dial { - stroke: #d7d7d7; - stroke-width: 5; - fill: rgba(0, 0, 0, 0); -} -mwl-gauge > .gauge > .value { - stroke: #4fa1f1; - stroke-width: 5; - fill: rgba(0, 0, 0, 0); -} -mwl-gauge > .gauge > .value-text { - fill: #4fa1f1; - font-family: sans-serif; - font-weight: bold; - font-size: 0.8em; -} -/* ------- Alternate Style ------- */ -mwl-gauge.two { -} -mwl-gauge.two > .gauge > .dial { - stroke: #334455; - stroke-width: 10; -} -mwl-gauge.two > .gauge > .value { - stroke: orange; - stroke-dasharray: none; - stroke-width: 13; -} -mwl-gauge.two > .gauge > .value-text { - fill: orange; -} -/* ------- Alternate Style ------- */ -mwl-gauge.three { -} -mwl-gauge.three > .gauge > .dial { - stroke: #334455; - stroke-width: 2; -} -mwl-gauge.three > .gauge > .value { - stroke: #c9de3c; - stroke-width: 5; -} -mwl-gauge.three > .gauge > .value-text { - fill: #c9de3c; -} -/* ----- Alternate Style ----- */ -mwl-gauge.four > .gauge > .dial { - stroke: #334455; - stroke-width: 5; -} -mwl-gauge.four > .gauge > .value { - stroke: #be80ff; - stroke-dasharray: none; - stroke-width: 5; -} -mwl-gauge.four > .gauge > .value-text { - fill: #be80ff; -} -/* ----- Alternate Style ----- */ -mwl-gauge.five > .gauge > .dial { - stroke: #334455; - stroke-width: 5; -} -mwl-gauge.five > .gauge > .value { - stroke: #f8774b; - stroke-dasharray: 25 1; - stroke-width: 5; -} -mwl-gauge.five > .gauge > .value-text { - fill: #f8774b; - font-size: 0.7em; -} -/* ----- Alternate Style ----- */ -mwl-gauge.six > .gauge > .dial { - stroke: #334455; - fill: #334455; - stroke-width: 20; -} -mwl-gauge.six > .gauge > .value { - stroke: #ff6daf; - stroke-width: 20; -} -mwl-gauge.six > .gauge > .value-text { - fill: #ff6daf; - font-size: 0.7em; -} -mwl-gauge.seven > .gauge > .dial { - stroke: transparent; - stroke-width: 5; - transform: scale(0.9, 0.9) translate3d(5.5px, 5.5px, 0); - fill: rgba(191, 202, 214, 0.42); -} -mwl-gauge.seven > .gauge > .value { - stroke: #f8774b; - stroke-dasharray: none; - stroke-width: 5; -} -ngx-gauge.guage-chart-center { - display: flex; - justify-content: center; - width: 100% !important; -} -.apex-pie-center { - display: flex; - justify-content: center; -} -.apexcharts-legend-marker { - margin: 0px 5px !important; -} diff --git a/MyOffice.SPA/src/assets/scss/plugins/_formwizard.scss b/MyOffice.SPA/src/assets/scss/plugins/_formwizard.scss deleted file mode 100644 index a63cbc2..0000000 --- a/MyOffice.SPA/src/assets/scss/plugins/_formwizard.scss +++ /dev/null @@ -1,368 +0,0 @@ -/* - * Document : _formwizard.scss - * Author : RedStar Template - * Description: This scss file for wizard style classes - */ - -.wizard, -.tabcontrol { - display: block; - width: 100%; - overflow: hidden; -} - -.wizard a, -.tabcontrol a { - outline: 0; -} - -.wizard ul, -.tabcontrol ul { - list-style: none !important; - padding: 0; - margin: 0; -} - -.wizard ul > li, -.tabcontrol ul > li { - display: block; - padding: 0; -} -/* Accessibility */ -.wizard > .steps .current-info, -.tabcontrol > .steps .current-info, -.wizard > .content > .title, -.tabcontrol > .content > .title { - position: absolute; - left: -999em; -} - -.wizard { - > .steps { - position: relative; - display: block; - width: 100%; - } - - &.vertical { - > .steps { - float: left; - width: 30%; - clear: none; - } - - > .steps > ul > li { - float: none; - width: 100%; - } - - > .content { - float: left; - margin: 0 0 0.5em 0; - width: 70%; - clear: none; - } - - > .actions { - float: right; - width: 100%; - } - - > .actions > ul > li { - margin: 0 0 0 1em; - } - } - - > { - .steps { - .number { - font-size: 1.429em; - } - - > ul > li { - width: 25%; - float: left; - } - } - - .actions > ul > li { - float: left; - } - } - - > { - .steps { - a { - display: block; - width: auto; - margin: 0 0.5em 0.5em; - padding: 1em 1em; - text-decoration: none; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - - &:hover, - &:active { - display: block; - width: auto; - margin: 0 0.5em 0.5em; - padding: 1em 1em; - text-decoration: none; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - } - } - - .disabled a { - background: #eee; - color: #aaa; - cursor: default; - - &:hover, - &:active { - background: #eee; - color: #aaa; - cursor: default; - } - } - - .current a { - background: #2184be; - color: #fff; - cursor: default; - - &:hover, - &:active { - background: #2184be; - color: #fff; - cursor: default; - } - } - - .done a { - background: #9dc8e2; - color: #fff; - - &:hover, - &:active { - background: #9dc8e2; - color: #fff; - } - } - - .error a { - background: #ff3111; - color: #fff; - - &:hover, - &:active { - background: #ff3111; - color: #fff; - } - } - } - - .content { - border: 1px solid #ddd; - display: block; - margin: 0.5em; - min-height: 35em; - overflow: hidden; - position: relative; - width: auto; - } - } - - > { - .actions { - position: relative; - display: block; - text-align: right; - width: 100%; - } - } - - > .actions > ul { - display: inline-block; - text-align: right; - - > li { - margin: 0 0.5em; - } - } - - > { - .actions { - a { - background: #009688; - color: #fff; - display: block; - padding: 0.5em 1em; - text-decoration: none; - @include border-radius(0); - - &:hover, - &:active { - background: #009688; - color: #fff; - display: block; - padding: 0.5em 1em; - text-decoration: none; - @include border-radius(0); - } - } - - .disabled a { - background: #eee; - color: #aaa; - - &:hover, - &:active { - background: #eee; - color: #aaa; - } - } - } - } -} - -.tabcontrol > { - .steps { - position: relative; - display: block; - width: 100%; - - > ul { - position: relative; - margin: 6px 0 0 0; - top: 1px; - z-index: 1; - - > li { - float: left; - margin: 5px 2px 0 0; - padding: 1px; - -webkit-border-top-left-radius: 5px; - -webkit-border-top-right-radius: 5px; - -moz-border-radius-topleft: 5px; - -moz-border-radius-topright: 5px; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - - &:hover { - background: #edecec; - border: 1px solid #bbb; - padding: 0; - } - - &.current { - background: #fff; - border: 1px solid #bbb; - border-bottom: 0 none; - padding: 0 0 1px 0; - margin-top: 0; - - > a { - padding: 15px 30px 10px 30px; - } - } - - > a { - color: #5f5f5f; - display: inline-block; - border: 0 none; - margin: 0; - padding: 10px 30px; - text-decoration: none; - - &:hover { - text-decoration: none; - } - } - } - } - } - - .content { - position: relative; - display: inline-block; - width: 100%; - height: 35em; - overflow: hidden; - border-top: 1px solid #bbb; - padding-top: 20px; - - > .body { - float: left; - position: absolute; - width: 95%; - height: 95%; - padding: 2.5%; - - ul { - list-style: disc !important; - - > li { - display: list-item; - } - } - } - } -} - -.wizard { - .content { - min-height: 245px; - @include border-radius(0); - overflow-y: auto; - - .body { - padding: 15px; - } - } - - .steps { - a { - @include border-radius(0); - @include transition(0.5s); - - &:active, - &:focus, - &:hover { - @include border-radius(0); - } - } - - .done { - a { - background-color: rgba(#009688, 0.6); - - &:hover, - &:active, - &:focus { - background-color: rgba(#009688, 0.5); - } - } - } - - .error { - a { - background-color: #f44336 !important; - } - } - - .current { - a { - background-color: #009688; - - &:active, - &:focus, - &:hover { - background-color: #009688; - } - } - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/plugins/_imagegallery.scss b/MyOffice.SPA/src/assets/scss/plugins/_imagegallery.scss deleted file mode 100644 index 9586c44..0000000 --- a/MyOffice.SPA/src/assets/scss/plugins/_imagegallery.scss +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Document : _imagegallery.scss - * Author : RedStar Template - * Description: This scss file for image gallery style classes - */ -.group-1, -.group-2 { - border: 1px solid #ffffff; - border-radius: 5px; - display: table; - margin-bottom: 20px; - box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); -} - -.group-1 img, -.group-2 img { - cursor: pointer; - width: 300px; - height: 300px; - padding: 10px; - border-radius: 10px; -} diff --git a/MyOffice.SPA/src/assets/scss/plugins/_maps.scss b/MyOffice.SPA/src/assets/scss/plugins/_maps.scss deleted file mode 100644 index 3d4aef8..0000000 --- a/MyOffice.SPA/src/assets/scss/plugins/_maps.scss +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Document : _maps.scss - * Author : RedStar Template - * Description: This scss file for maps style classes - */ -/* Google Maps */ -agm-map { - height: 300px; -} diff --git a/MyOffice.SPA/src/assets/scss/plugins/_tables.scss b/MyOffice.SPA/src/assets/scss/plugins/_tables.scss deleted file mode 100644 index 46c0189..0000000 --- a/MyOffice.SPA/src/assets/scss/plugins/_tables.scss +++ /dev/null @@ -1,910 +0,0 @@ -/* - * Document : _tables.scss - * Author : RedStar Template - * Description: This scss file for tables style classes - */ - - .table { - tbody { - border-top: none !important; - tr { - td, - th { - padding: 10px; - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; - vertical-align: middle; - - ul { - margin: 0; - } - .tbl-user-img-small { - margin: 0px 5px; - border-radius: 5px; - height: 30px; - width: 30px; - } - } - } - - tr.primary { - td, - th { - background-color: #1f91f3; - color: #fff; - } - } - - tr.success { - td, - th { - background-color: #2b982b; - color: #fff; - } - } - - tr.info { - td, - th { - background-color: #00b0e4; - color: #fff; - } - } - - tr.warning { - td, - th { - background-color: #ff9600; - color: #fff; - } - } - - tr.danger { - td, - th { - background-color: #fb483a; - color: #fff; - } - } - } - - thead { - tr { - th { - padding: 0 10px; - height: 50px; - vertical-align: middle; - background-color: #f5f5f5; - color: #666; - font-weight: 500; - border: none; - } - } - } - - .tbl-pdf { - color: #f96332; - font-size: 20px; - cursor: pointer; - } - .tbl-action-btn { - height: 40px; - width: 40px; - display: inline-flex; - align-items: center; - } -} - -.table-bordered { - border-top: 1px solid #eee; - - tbody { - tr { - td, - th { - padding: 10px; - border: 1px solid #eee; - } - } - } - - thead { - tr { - th { - padding: 10px; - border: 1px solid #eee; - } - } - } -} - -.table-img { - img { - border-radius: 5px; - height: 33px; - width: 33px; - background: #fff; - position: inherit; - } -} - -.btn-tbl-edit { - background-color: #96a2b4; - height: 30px !important; - width: 30px !important; - margin: 2px !important; - line-height: 30px !important; - color: #fff; - - // box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2) !important; - .material-icons { - font-size: 16px !important; - } - - &:hover { - background-color: #888; - color: $white; - } - - &:focus { - background-color: #888; - } -} - -.btn-tbl-delete { - background-color: #ff944f; - height: 30px !important; - width: 30px !important; - margin: 2px !important; - line-height: 30px !important; - color: #fff; - - // box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2) !important; - .material-icons { - font-size: 16px !important; - } - - &:hover { - background-color: #ff9600; - color: $white; - } - - &:focus { - background-color: #ff9600; - } -} -.btn-tbl-confirm { - background-color: #3fa3f3; - height: 30px !important; - width: 30px !important; - margin: 2px !important; - line-height: 30px !important; - color: #fff; - - // box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2) !important; - .material-icons { - font-size: 16px !important; - } - - &:hover { - background-color: #62b5f8; - color: $white; - } - - &:focus { - background-color: #62b5f8; - } -} -.btn-tbl-reject { - background-color: #f96333; - height: 30px !important; - width: 30px !important; - margin: 2px !important; - line-height: 30px !important; - color: #fff; - - // box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2) !important; - .material-icons { - font-size: 16px !important; - } - - &:hover { - background-color: #f87346; - color: $white; - } - - &:focus { - background-color: #f87346; - } -} - -.tbl-fav-edit { - color: #6777ef; - display: inline !important; - .feather { - height: 20px !important; - width: 20px !important; - } -} -.tbl-fav-delete { - color: #ff5200; - display: inline !important; - .feather { - height: 20px !important; - width: 20px !important; - } -} -.avatar { - position: relative; - width: 30px; - white-space: nowrap; - border-radius: 1000px; - vertical-align: bottom; - display: inline-block; - - img { - width: 100%; - max-width: 100%; - height: auto; - border: 0; - border-radius: 1000px; - } -} - -.avatar-sm { - width: 32px; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.spinner { - display: inline-block; -} - -.spinner-reverse { - display: inline-block; -} - -.order-list li { - img { - border: 2px solid #ffffff; - box-shadow: 0 2px 10px 0 rgba(107, 111, 130, 0.3); - } - - + li { - margin-left: -14px; - } - - .badge { - background: rgba(255, 255, 255, 0.8); - color: #6b6f82; - margin-bottom: 6px; - } -} - -.buttons-copy { - background-color: #666 !important; - box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), - 0 13px 24px -11px rgba(233, 30, 99, 0.6); - color: #fff !important; - border-radius: 30px !important; - border: 0px !important; - height: 30px; - width: 60px; - cursor: pointer; -} - -.buttons-excel { - background-color: #59bf70 !important; - box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), - 0 13px 24px -11px rgba(233, 30, 99, 0.6); - color: #fff !important; - border-radius: 30px !important; - border: 0px !important; - height: 30px; - width: 60px; - cursor: pointer; -} - -.buttons-csv { - background-color: #2ab9d0 !important; - box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), - 0 13px 24px -11px rgba(233, 30, 99, 0.6); - color: #fff !important; - border-radius: 30px !important; - border: 0px !important; - height: 30px; - width: 60px; - cursor: pointer; -} - -.buttons-pdf { - background-color: #e91e63 !important; - box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), - 0 13px 24px -11px rgba(233, 30, 99, 0.6); - color: #fff !important; - border-radius: 30px !important; - border: 0px !important; - height: 30px; - width: 60px; - cursor: pointer; -} - -.buttons-print { - background-color: #6563ef !important; - box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), 0 13px 24px -11px #6563ef; - color: #fff !important; - border-radius: 30px !important; - border: 0px !important; - height: 30px; - width: 60px; - cursor: pointer; -} - -tr.group, -tr.group:hover { - background-color: #ddd !important; -} - -.tableBody { - font-size: 14px; - color: #555; - padding: 0px 15px 0px 15px; -} - -.tbl-checkbox { - text-align: center; -} - -.ngx-datatable.material { - background: #fff; - border: 1px solid #f5f5f5; - box-shadow: none !important; - - .datatable-footer { - .datatable-pager { - .pager li a { - margin: 5px; - - .datatable-icon-right, - .datatable-icon-skip, - .datatable-icon-left, - .datatable-icon-prev { - line-height: 30px; - } - } - - li.active a { - background-color: #0d8df3; - transition: 0.25s ease; - color: #ffffff; - box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - } - } - } -} - -.ngx-table-form-select { - margin-top: 0px; - padding-left: 40px !important; -} - -.ngx-search { - margin: 15px auto !important; - width: 30% !important; - font-size: 13px !important; -} - -.ngx-datatable { - .datatable-body-cell { - display: table !important; - } - - .datatable-body-cell-label { - display: table-cell !important; - vertical-align: middle !important; - } - - .datatable-header-cell { - line-height: 2.4 !important; - } -} - -.ngxTableHeader { - padding: 10px 20px; - display: flex; - align-items: center; - border-color: #e6e9ed; - background-color: #ebebee; - min-width: 800px; - height: 70px; - - .header-buttons { - position: absolute; - right: 30px; - list-style: none; - margin-bottom: 0px; - - li { - display: inline-block; - } - - .material-icons { - color: #000000; - vertical-align: text-bottom; - } - } - - .header-buttons-left { - position: absolute; - list-style: none; - - li { - display: inline-block; - } - - .searchbox { - position: relative; - } - - ::placeholder { - color: rgba(0, 0, 0, 0.54); - } - - .search-icon { - position: absolute; - top: 10px; - padding-left: 10px; - color: rgba(0, 0, 0, 0.54); - } - - input.search-field { - font-weight: 500; - color: rgba(0, 0, 0, 0.54); - border-radius: 25px; - border: 0; - height: 45px; - padding: 8px 8px 8px 50px; - width: 250px; - background: #ffffff; - transition: background 0.2s, width 0.2s; - - &:hover { - background: #fffefe; - } - - &:focus { - outline: none; - width: 380px; - color: #212121; - - &:hover { - background: #f7f7f7; - } - } - } - } - - h2 { - margin: 0; - font-size: 16px; - font-weight: normal; - color: #5b626b; - } -} - -.mat-table { - .mat-header-cell { - font-size: 14px; - font-weight: 600; - } -} - -.ngx-datatable.material { - background: #fff; - border: 1px solid #f5f5f5; - box-shadow: none !important; - - .datatable-footer { - .datatable-pager { - .pager li a { - margin: 5px; - - .datatable-icon-right, - .datatable-icon-skip, - .datatable-icon-left, - .datatable-icon-prev { - line-height: 30px; - } - } - - li.active a { - background-color: #0d8df3; - transition: 0.25s ease; - color: #ffffff; - box-shadow: 4px 3px 6px 0 rgba(0, 0, 0, 0.2); - } - } - } -} - -.ngx-table-form-select { - margin-top: 0px; - padding-left: 40px !important; -} - -.ngx-search { - margin: 15px auto !important; - width: 30% !important; - font-size: 13px !important; -} - -.ngx-datatable { - .datatable-body-cell { - display: table !important; - } - - .datatable-body-cell-label { - display: table-cell !important; - vertical-align: middle !important; - } - - .datatable-header-cell { - line-height: 2.4 !important; - } -} - -.materialTableHeader { - -webkit-box-align: center; - align-items: center; - border-color: #dae1f3; - background-color: #dae1f3; - display: flex; - flex-wrap: wrap; - text-align: center; - // min-width: 800px; - - .left { - flex: 35%; - height: 60px; - display: table-cell; - vertical-align: middle; - text-align: center; - } - .center { - flex: 40%; - height: 60px; - display: table-cell; - vertical-align: middle; - text-align: left; - } - - .right { - flex: 10%; - height: 60px; - display: table-cell; - vertical-align: middle; - text-align: center; - } - - .tbl-export-btn { - float: right; - margin: 0px 15px; - list-style: none; - height: 100%; - display: flex; - align-items: center; - - li { - display: inline-block; - position: relative; - } - } - - .header-buttons-left { - list-style: none; - height: 100%; - display: flex; - align-items: center; - - .tbl-search-box { - position: relative; - margin-left: 10px; - } - .tbl-title { - vertical-align: middle; - margin-left: 20px; - - h2 { - font-weight: 500; - } - } - .tbl-header-btn { - position: relative; - } - - li { - display: inline-block; - } - - .searchbox { - position: relative; - } - - ::placeholder { - color: rgba(0, 0, 0, 0.54); - } - - .search-icon { - position: absolute; - top: 10px; - padding-left: 10px; - color: rgba(0, 0, 0, 0.54); - } - - input.search-field { - font-weight: 500; - color: rgba(0, 0, 0, 0.54); - border-radius: 5px; - border: 0; - height: 45px; - padding: 8px 8px 8px 50px; - width: 250px; - background: #ffffff; - - &:hover { - background: #fffefe; - } - - // &:focus { - // outline: none; - // width: 380px; - // color: #212121; - // &:hover { - // background: #f7f7f7; - // } - // } - } - } - - .header-buttons-right { - text-align: right; - list-style: none; - height: 100%; - margin: 0px 10px; - - .tbl-header-btn { - position: relative; - top: 12px; - } - - li { - display: inline-block; - } - - h2 { - margin: 0; - font-size: 16px; - font-weight: normal; - color: #5b626b; - } - } - - h2 { - margin: 0; - font-size: 16px; - font-weight: normal; - color: #5b626b; - } -} - -.tbl-checkbox label { - margin-bottom: 0px; -} -.column-nowrap { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.table-tab a { - background-color: #e2e2e2 !important; - color: #868788 !important; - border-radius: 30px; - &.active { - background-color: #7274e2 !important; - box-shadow: 0 5px 5px 0 rgba(0, 0, 0, 0.2), 0 4px 13px -11px #7197b5; - color: #ffffff !important; - border-radius: 30px; - } -} -.app-list { - display: flex; - flex-direction: row; - align-items: center; - border-radius: 10px; - vertical-align: middle; - padding: 10px; - margin-bottom: 10px; - background: #f9f9f9; - img { - margin: 0px 10px; - } - .set-flex { - flex: 1; - } -} -.lecture-list { - display: flex; - flex-direction: row; - align-items: center; - border-radius: 5px; - vertical-align: middle; - padding: 10px; - margin-bottom: 10px; - background: #f6f4ff; -} -.report-list { - display: flex; - align-items: center; - margin-bottom: 20px; - padding: 12px 12px; - border: 1px dashed #bfc9d4; - border-radius: 6px; - .file-style { - font-size: 20px; - margin: 0px 10px; - } - .ms-auto { - margin-right: 10px; - cursor: pointer; - i { - padding-right: 10px; - } - } -} -.patient-group-list { - display: flex; - align-items: center; - padding: 12px 12px; - border-radius: 6px; - .lbl-bedge { - padding: 10px; - margin: 0px 5px; - border-radius: 50%; - position: relative; - display: inline-block; - width: 38px; - height: 38px; - font-size: 14px; - font-weight: 600; - letter-spacing: 1px; - .lbl-bedge-title { - color: #ffffff; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; - } - } - - .group-details { - line-height: 38px; - padding-left: 10px; - font-weight: 500; - } -} -.tbl-spinner { - display: flex; - justify-content: center; - align-items: center; - margin-top: 20px; -} -.doc-file-type { - .d-flex { - margin-bottom: 15px; - padding-bottom: 15px; - border-bottom: 1px solid #d5dadb; - } - .img-icon { - width: 46px; - height: 46px; - line-height: 46px; - border-radius: 10%; - font-size: 23px; - text-align: center; - margin: 0px 15px; - } - .set-flex { - display: block; - color: #000; - height: 30px; - } - .ms-auto { - margin-right: 10px; - cursor: pointer; - } -} -.primary-rgba { - background-color: rgba(110, 129, 220, 0.1); -} -.success-rgba { - background-color: rgba(95, 194, 126, 0.1); -} -.danger-rgba { - background-color: rgba(244, 68, 85, 0.1); -} -.info-rgba { - background-color: rgba(114, 208, 251, 0.1); -} -.timetable-block { - border-radius: 4px; - border: 1px solid #f4f4f4; - padding: 10px; - margin-bottom: 20px; - box-shadow: 0 0.46875rem 2.1875rem rgba(90, 97, 105, 0.1), - 0 0.9375rem 1.40625rem rgba(90, 97, 105, 0.1), - 0 0.25rem 0.53125rem rgba(90, 97, 105, 0.12), - 0 0.125rem 0.1875rem rgba(90, 97, 105, 0.1); - background: #ffffff; -} -.medicine-list td { - padding: 0.4rem; -} -mat-cell > span.truncate-text { - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} -.export-button { - cursor: pointer; - img { - height: 32px; - width: 32px; - } -} - -.mobile-label { - display: none; -} - -@media (max-width: 600px) { - .mobile-label { - width: 100px; - display: inline-block; - font-weight: bold; - } - - .mat-mdc-table .mdc-data-table__header-row { - display: none; - } - - .mat-mdc-table .mdc-data-table__row { - flex-direction: column; - align-items: start; - padding: 8px 24px; - } - mat-cell:first-of-type, - mat-header-cell:first-of-type, - mat-footer-cell:first-of-type { - padding-left: 10px; - } - .flex-item-right, - .flex-item-left { - flex: 100%; - } - .tbl-col-width-per-6 { - max-width: 100%; - } - .tbl-col-width-per-7 { - max-width: 100%; - } -} diff --git a/MyOffice.SPA/src/assets/scss/style.scss b/MyOffice.SPA/src/assets/scss/style.scss deleted file mode 100644 index 7cd7eee..0000000 --- a/MyOffice.SPA/src/assets/scss/style.scss +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Document : style.css - * Author : RedStar Template - * Description: This is a main style scss file for import all scss files. - * - * Structure (with shortcodes): - [1. Common ] - [2. Fonts ] - [3. Components ] - [4. Apps] - [5. Pages ] - [6. Pugins ] - [7. UI ] - [8. Browser ] - - -/* [1. Common ] */ - -/* Importing Bootstrap SCSS file. */ -@import "common/_variables"; -@import "common/_mixins"; -@import "common/_customanimate.scss"; -@import "common/_general.scss"; -@import "common/_demo.scss"; -@import "common/_helpers.scss"; -@import "common/_media.scss"; -@import "common/_animation.scss"; -@import "common/_rtl.scss"; - -/* [2. Fonts] */ -@import "fonts/fontawesome/fontawesome.scss"; -@import "fonts/fontawesome/regular.scss"; -@import "fonts/fontawesome/solid.scss"; -@import "fonts/fontawesome/brands.scss"; - -/* [3. Components ] */ -@import "components/_breadcrumbs.scss"; -@import "components/_checkboxradio.scss"; -@import "components/_dropdownmenu.scss"; -@import "components/_feed.scss"; -@import "components/_formcomponents.scss"; -@import "components/_infobox.scss"; -@import "components/_inputformgroup.scss"; -@import "components/_labels.scss"; -@import "components/_leftsidebaroverlay.scss"; -@import "components/_navbar"; -@import "components/_navtabs.scss"; -@import "components/_noticeboard.scss"; -@import "components/_rightsidebar.scss"; -@import "components/_searchbar.scss"; -@import "components/_switch.scss"; -@import "components/_thumbnails.scss"; -@import "components/_todo.scss"; -@import "components/_settingSidebar.scss"; - -/* [4. Apps] */ -@import "apps/_calendar.scss"; -@import "apps/_chat.scss"; -@import "apps/_contactlist.scss"; -@import "apps/_contactgrid.scss"; -@import "apps/_dragdrop.scss"; -@import "apps/_task.scss"; - -/* [5. Pages ] */ -@import "pages/_dashboard.scss"; -@import "pages/_inbox.scss"; -@import "pages/_pricing.scss"; -@import "pages/_profile.scss"; -@import "pages/_timeline.scss"; -@import "pages/_projects.scss"; -@import "pages/_auth.scss"; - -/* [6. Pugins ] */ -@import "plugins/_carousel.scss"; -@import "plugins/_charts.scss"; -@import "plugins/_formwizard.scss"; -@import "plugins/_imagegallery.scss"; -@import "plugins/_maps.scss"; -@import "plugins/_tables.scss"; - -/* [7. UI ] */ -@import "ui/_alerts.scss"; -@import "ui/_badgelistgroupitem.scss"; -@import "ui/_buttons.scss"; -@import "ui/_card.scss"; -@import "ui/_collapse.scss"; -@import "ui/_dialogs.scss"; -@import "ui/_expansion.scss"; -@import "ui/_mediaobject.scss"; -@import "ui/_modals.scss"; -@import "ui/_pageloader.scss"; -@import "ui/_pagination.scss"; -@import "ui/_panels.scss"; -@import "ui/_preloaders.scss"; -@import "ui/_progressbars.scss"; -@import "ui/_slider.scss"; -@import "ui/_snackbar.scss"; -@import "ui/_tabs.scss"; -@import "ui/_tooltippopovers.scss"; -@import "ui/_listItems.scss"; - -/* [8. Browser ] */ -@import "browser/_ie10.scss"; -@import "browser/_ie11.scss"; diff --git a/MyOffice.SPA/src/assets/scss/theme/_dark.scss b/MyOffice.SPA/src/assets/scss/theme/_dark.scss deleted file mode 100644 index 7481525..0000000 --- a/MyOffice.SPA/src/assets/scss/theme/_dark.scss +++ /dev/null @@ -1,1741 +0,0 @@ -/* - * Document : dark.scss - * Author : RedStar Template - * Description: This scss file for dark theme style classes - */ -.dark { - background-color: #232b3e; - color: #96a2b4; - padding-top: 1px; - - body, - html { - background-color: #232b3e; - } - - input { - color: #96a2b4 !important; - } - - .dark-font-col { - color: #96a2b4; - } - - .card { - --bs-card-bg: #1a202e; - --bs-card-color: #96a2b4; - --bs-card-border-color: rgba(255, 255, 255, 0.08); - background: #1a202e; - color: #96a2b4; - border: none; - box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2); - - .body { - color: #96a2b4; - background: transparent; - } - - .header { - color: #96a2b4; - - h2 { - color: #96a2b4; - } - } - - .card-content { - color: #96a2b4; - } - - .card-statistic-3 { - .card-content { - color: #ffffff; - } - } - } - .card-bnner { - background: #1a202e; - } - - .course-card { - background: #1a202e; - - .bg-body-light { - background-color: #292c31; - } - } - - .plain-card { - background: #1a202e; - } - - .people-list { - .chat-list { - li { - &:hover { - background: #3f4650; - cursor: pointer; - } - - &.active { - background: #262b33; - } - } - } - } - - .chat { - .chat-history { - .message-data-time { - color: #96a2b4; - } - } - } - - .contact-usertitle-name { - color: #fff; - } - - .demo-skin { - color: #eaeaea; - - .form-check-label { - color: #eaeaea; - } - } - - .demo-settings { - color: #eaeaea; - } - - .block-header { - padding-bottom: 0px; - - h2 { - color: #96a2b4 !important; - } - } - - .select-wrapper { - input.select-dropdown { - color: #fff; - } - } - - .breadcrumb { - li { - &.active { - color: #a5abb1; - } - } - } - - .dropzone { - border: 1px solid #afacac !important; - background-color: #1a202e !important; - - .dz-message { - min-height: 150px !important; - background: #1a202e !important; - color: white; - } - } - - .sl-item { - .sl-content { - p { - color: #96a2b4; - } - } - } - - .info-box5 { - background-color: #1a202e; - } - - .form-check { - color: #96a2b4; - } - - label { - color: #96a2b4; - } - - .input-field { - input, - textarea { - color: #96a2b4; - } - } - - .input-group { - .input-group-addon { - .material-icons { - color: #96a2b4; - } - } - - input[type="text"], - .form-control { - color: #96a2b4; - } - } - - .container-login100 { - .form-group { - .form-control { - background: transparent; - } - } - } - - .form-group { - .form-control { - color: #96a2b4; - background: #1a202e; - } - - input.form-control { - color: #96a2b4; - border-bottom: 1px solid #9e9e9e; - } - } - - .form-check { - .form-check-sign { - .check { - border: 1px solid #96a2b4; - } - } - } - - .form-control { - color: #96a2b4; - background: #1a202e; - } - - .right-sidebar { - background: #1a202e; - } - - .ms-container { - .ms-selectable, - .ms-selection { - li.ms-hover { - color: #96a2b4 !important; - background-color: #46484e !important; - } - } - } - - .nav-tabs { - li { - a.active { - color: #fff !important; - } - } - } - - .bootstrap-tagsinput { - background-color: #343840 !important; - } - - .to-do-list { - li { - background: #1a202e; - } - } - - #mail-nav { - li { - a { - color: #96a2b4; - } - } - } - - .max-texts { - a { - color: #96a2b4; - } - } - - .pricingTable { - background: #0c0c0c; - - .pricingTable-header { - background: #36373c; - } - } - - .profile-tab-box { - background: #1a202e; - } - - .cd-timeline-content { - background: #10131c; - - .timelineLabelColor strong { - color: #ffffff !important; - } - } - - .timeline > li > .timeline-panel { - border: 1px solid #444444; - } - - .cd-timeline-content h2 { - color: #96a2b4; - } - - .chart-note { - color: #96a2b4; - } - - .chart-statis { - .index { - color: #96a2b4; - } - } - - .dataTables_wrapper { - input[type="search"] { - color: #96a2b4; - } - } - - .page-item.disabled .page-link { - color: #96a2b4; - pointer-events: none; - cursor: auto; - background-color: #1a202e; - } - - .table { - // Bootstrap 5 paints cell backgrounds via --bs-table-bg (defaults light). - --bs-table-bg: transparent; - --bs-table-color: #96a2b4; - --bs-table-striped-bg: rgba(255, 255, 255, 0.04); - --bs-table-hover-bg: rgba(255, 255, 255, 0.06); - --bs-table-border-color: rgba(255, 255, 255, 0.1); - --bs-table-striped-color: #96a2b4; - --bs-table-hover-color: #96a2b4; - background-color: transparent; - color: #96a2b4; - - > :not(caption) > * > * { - background-color: var(--bs-table-bg); - color: #96a2b4; - border-bottom-color: var(--bs-table-border-color); - box-shadow: none; - } - - tbody { - tr { - color: #96a2b4; - background-color: transparent; - - td, - th { - border-top: 1px solid rgb(21 24 29); - border-bottom: 1px solid rgba(255, 255, 255, 0.1); - background-color: transparent !important; - color: #96a2b4; - } - } - } - - thead { - tr { - color: #96a2b4; - - th { - border-bottom: 1px solid #15181d; - border-top: 1px solid #15181d; - background-color: #15181d !important; - color: #abaaaa; - } - } - } - } - - .table-bordered { - border: 1px solid rgba(120, 130, 140, 0.5); - - tbody { - tr { - td, - th { - border-right: 1px solid rgba(120, 130, 140, 0.5); - border-bottom: none; - } - } - } - - thead { - tr { - th { - border: 1px solid rgba(120, 130, 140, 0.5); - } - } - } - - th { - border: 1px solid rgba(120, 130, 140, 0.5); - color: #96a2b4; - } - } - - tr.group, - tr.group:hover { - background-color: #282d35 !important; - } - - .tableBody { - color: #96a2b4; - } - - $theme-black: #1a202e; - - .card .header h2 strong { - color: #96a2b4 !important; - } - - .breadcrumb-main { - .page-title { - color: #a5abb1; - } - .breadcrumb-icon .feather { - color: #a5abb1 !important; - } - .breadcrumb-item { - color: #a5abb1; - ::before { - color: #a5abb1; - } - } - } - - .counter-box, - .box-part { - background: #1a202e !important; - color: #96a2b4; - } - - .tblActnBtn i { - color: #96a2b4; - } - - .chat .chat-history { - .other-message { - background: #3b4453; - - &:after { - border-bottom-color: #3b4454; - } - } - - .message { - color: #96a2b4; - } - - .my-message { - background: #343840; - - &:after { - border-bottom-color: #343840; - } - } - } - - .task-box { - border-bottom: solid 1px #5e5e5f; - color: #96a2b4; - background: #141a27; - } - - .task-list { - border: solid 1px #10141d; - background: #141a27; - } - - .mat-drawer { - background-color: #141a27; - color: #96a2b4; - border-color: #121315 !important; - } - - .mat-drawer-container { - background-color: #1a202e; - } - - .taskbar .card-footer { - background: #1a202e !important; - } - - .move { - background: #1a202e; - } - - .board { - background-color: #1a202e; - - .drop-card { - background-color: #404754; - } - .list { - .header { - background: #10131c; - } - .project-title { - color: #96a2b4; - } - .project { - background: #10131c; - border: 1px solid #363b47; - } - } - } - - .list-group-item { - background: #1a202e; - } - - .product-grid .product-content { - background-color: #3b4453; - } - - .ibox-title, - .ibox-content { - background: #1a202e; - border-color: #6c757d; - } - - .collapsible-header { - background: #1a202e; - } - - .card .card-inside-title { - color: #96a2b4; - } - - .left-timeline > li { - &:nth-child(odd) { - .left-label { - background: #202529; - - &:after { - border-right-color: #202428; - } - } - - .left-time span:last-child { - color: #eee; - } - } - - .left-label { - background: #303438; - - p { - color: #96a2b4; - } - - &:after { - border-right-color: #303438; - } - } - - .empty span { - color: #96a2b4; - } - - .left-time span { - &:first-child { - color: #96a2b4; - } - - &:last-child { - color: #eae9e9; - } - } - } - - .font-icon .icon-preview i { - color: #96a2b4; - } - - .nav-tabs .nav-link.active, - .nav-tabs .nav-item.show .nav-link { - background-color: transparent; - } - - .panel-group { - .panel-primary .panel-title a { - color: #96a2b4; - background: #32363c; - } - - .panel .panel-body { - color: #96a2b4; - } - } - - .btn-outline-primary { - color: #96a2b4 !important; - border: 1px solid #96a2b4 !important; - } - - .chip { - background-color: #31353a; - color: #96a2b4; - } - - .dropdown-content { - background-color: #31353a; - - li > span { - color: #96a2b4; - } - } - - .autocomplete { - font-size: 13px !important; - color: #96a2b4; - caret-color: #fff; - - &:focus { - color: #96a2b4; - } - } - - .autocomplete-content li { - .highlight { - color: #fff; - } - - :hover { - background-color: #343d44; - } - } - - //select 2 - .select2-container--default { - .select2-selection--single { - background: #1a202e; - color: #96a2b4; - border-bottom: 1px solid #9e9e9e; - - .select2-selection__rendered { - background: #1a202e; - color: #96a2b4; - border-bottom: 1px solid #9e9e9e; - } - } - - .select2-selection--multiple { - background: #1a202e; - color: #96a2b4; - border-bottom: 1px solid #9e9e9e; - - .select2-selection__choice { - background-color: #444141; - border: 1px solid #656464; - } - } - - &.select2-container--focus .select2-selection--multiple { - background: #1a202e; - color: #96a2b4; - border-bottom: 1px solid #9e9e9e; - } - - .select2-results > .select2-results__options { - background-color: #282d35; - } - } - - .select2-search--dropdown { - background-color: #1c1f25; - } - - .flatpickr-input { - border-bottom: 1px solid #9e9e9e !important; - } - - .ngx-datatable.material { - background: #1a202e; - color: #96a2b4; - - .datatable-body .datatable-body-row .datatable-body-cell { - color: #96a2b4; - } - - .datatable-header-cell-label { - color: #96a2b4; - } - - :not(.cell-selection) .datatable-body-row:hover .datatable-row-group { - background-color: #1c1f25; - } - } - - .pagination > li > a:hover { - background-color: #fff; - color: #000; - } - - .dataTables_length .custom-select { - background-color: #1a202e; - color: white; - } - - .ngx-search { - color: #96a2b4; - } - - .ngx-datatable { - &.material { - background: #1a202e; - border: 1px solid #404755; - - .datatable-header { - .datatable-header-cell { - background: #1a202e; - } - - .resize-handle { - border-right: solid 1px #1a202e; - } - } - - .datatable-footer { - color: #fff; - - .datatable-pager { - a { - color: #fff; - } - - li.disabled a { - color: #fff !important; - } - } - } - - .datatable-body .datatable-body-row .datatable-body-cell { - color: #96a2b4; - } - - &:not(.cell-selection) .datatable-body-row:hover { - background: #32383e; - - .datatable-row-group { - background: #32383e; - } - } - - .datatable-body-cell, - .datatable-header-cell { - border: 1px solid #404755; - } - } - - &.fixed-header - .datatable-header - .datatable-header-inner - .datatable-header-cell { - color: #96a2b4; - } - } - - ::-webkit-input-placeholder { - color: #96a2b4; - opacity: 1 !important; - /* for older chrome versions. may no longer apply. */ - } - - :-moz-placeholder { - /* Firefox 18- */ - color: #96a2b4; - opacity: 1 !important; - } - - ::-moz-placeholder { - /* Firefox 19+ */ - color: #96a2b4; - opacity: 1 !important; - } - - :-ms-input-placeholder { - color: #96a2b4; - } - - input, - textarea { - color: #96a2b4; - } - - .flatPicker { - color: #96a2b4; - } - - .modal { - .modal-content { - background: #1a202e; - - .modal-body { - color: #96a2b4; - } - } - - .modal-close-button { - color: #96a2b4; - } - } - - .ngx-search { - color: #96a2b4; - } - - .ngx-datatable { - background: #434f5a; - border: 1px solid #343d45; - - &.material { - background: #1a202e; - - .datatable-header { - .datatable-header-cell { - background: #313742; - } - - .resize-handle { - border-right: solid 1px #434f5a; - } - } - - .datatable-footer { - color: #fff; - - .datatable-pager { - a { - color: #fff; - } - - li.disabled a { - color: #fff !important; - } - } - } - - .datatable-body .datatable-body-row .datatable-body-cell { - color: #96a2b4; - } - - &:not(.cell-selection) .datatable-body-row:hover { - background: #32383e; - - .datatable-row-group { - background: #32383e; - } - } - } - - &.fixed-header - .datatable-header - .datatable-header-inner - .datatable-header-cell { - color: #96a2b4; - } - } - - .ngxTableHeader { - background-color: #242931; - - .header-buttons-left strong, - .header-buttons { - color: #96a2b4; - - .material-icons { - color: #96a2b4; - } - - .dropdown-menu li span { - color: #000000; - } - } - .header-buttons-left { - input.search-field { - background-color: #000000; - } - .search-icon { - color: rgba(255, 255, 255, 0.55); - } - input.search-field:focus:hover { - background: #000000; - } - } - } - - .navbar-nav { - .dropdown-menu { - background-color: #1a202e; - border: 1px solid #292a2a; - - &::after { - border-bottom: 6px solid #10131c; - } - - .header { - color: #96a2b4; - border-bottom: 1px solid #232a31; - } - - ul.menu { - .menu-info .menu-title { - color: #fff; - } - - li a { - border-bottom: 1px solid #232a31; - - &:hover { - background-color: #141820; - } - } - .msg-unread { - background-color: #141820; - } - .menu-info .menu-desc { - color: rgb(255, 255, 255, 0.5); - .material-icons { - color: rgb(255, 255, 255, 0.5); - } - } - } - .nfc-read-more { - color: #96a2b4; - } - } - - .user_dw_menu li { - border-bottom: 1px solid #232a31; - - a { - color: #96a2b4; - } - } - } - .fc .fc-col-header-cell-cushion { - color: #fff; - } - - .fc-daygrid-day-top .fc-daygrid-day-number { - color: #96a2b4; - } - .fc-theme-standard .fc-scrollgrid { - border: 1px solid #5c5c5c; - } - .fc-view > table td { - color: #96a2b4; - } - .fc-unthemed td { - &.fc-today { - background: transparent; - } - - &.fc-day-top .fc-day-number { - color: #ffffff; - } - } - - .fc-button-primary { - background-color: #151414 !important; - border-color: #4a4a4a !important; - color: #fff !important; - } - - .fc-view > table { - td { - border-color: #65686d; - } - - th { - color: #fff; - border-color: #65686d; - } - } - - /* Material Design Form style */ - - .mat-checkbox-frame { - border-color: #96a2b4; - } - - .mat-radio-outer-circle { - border-color: #96a2b4; - } - - .mat-datepicker-content { - .mat-calendar-next-button { - color: #96a2b4; - } - - .mat-calendar-previous-button { - color: #96a2b4; - } - - .time-container { - background-color: #12161f; - } - - .actions { - background-color: #12161f; - - .mat-button-wrapper { - .material-icons { - color: white; - } - } - - .mat-stroked-button:not([disabled]) { - border-color: rgba(255, 255, 255, 0.37); - } - } - } - - .mat-datepicker-toggle { - color: #96a2b4; - } - - .mat-select-value { - color: #96a2b4; - } - - .mat-form-field-appearance-legacy { - .mat-hint { - color: #96a2b4; - } - - .mat-form-field-label { - color: #96a2b4; - } - - .mat-form-field-underline { - background-color: #96a2b4; - } - } - - .mat-form-field-appearance-outline { - .mat-form-field-outline-thick { - color: #b7b7b7; - } - - .mat-form-field-outline { - color: #96a2b4; - } - - &.mat-focused .mat-form-field-outline-thick { - color: #96a2b4; - } - } - - .mat-stepper-horizontal { - background-color: #1a202e; - } - - .mat-stepper-vertical { - background-color: #1a202e; - } - - .mat-horizontal-stepper-header::after { - border-top-color: rgba(255, 255, 255, 0.12); - } - - .mat-horizontal-stepper-header::before { - border-top-color: rgba(255, 255, 255, 0.12); - } - - .mat-stepper-horizontal-line { - border-top-color: rgba(255, 255, 255, 0.12); - } - - .mat-form-field-ripple { - background-color: #96a2b4; - } - - .mat-select-arrow { - color: #96a2b4; - } - - input { - caret-color: #96a2b4; - } - - .mat-input-element { - caret-color: #96a2b4; - } - - .mat-hint { - color: #96a2b4; - } - - .mat-mdc-table { - background: #1a202e; - } - - .mat-mdc-cell { - color: #96a2b4; - border-bottom-color: rgba(234, 229, 229, 0.12); - } - - .mat-mdc-footer-cell { - color: #96a2b4; - } - - .mat-mdc-header-cell { - color: #96a2b4; - border-bottom: 1px solid #2a3040; - border-top: 1px solid #2a3040; - background-color: #2a3040; - font-weight: 500; - } - - .mat-mdc-paginator { - color: #96a2b4; - background: #1a202e; - } - - .mat-form-field-type-mat-native-select .mat-form-field-infix::after { - color: #96a2b4; - } - - .mat-form-field.mat-focused .mat-form-field-label { - color: #96a2b4; - } - - .mat-form-field-appearance-fill { - .mat-form-field-flex { - background-color: rgba(0, 0, 0, 0.25); - } - - .mat-form-field-underline::before { - background-color: #96a2b4; - } - } - - .mat-step-header .mat-step-label.mat-step-label-active { - color: #96a2b4; - } - - .mat-paginator-page-size .mat-select-trigger { - color: #96a2b4; - } - - .mat-dialog-container { - background: #2d364a; - color: #c5cdd8; - border: 1px solid #4a5568; - box-shadow: 0 12px 40px rgba(0, 0, 0, 0.55); - } - - .mat-expansion-panel { - background: #101217; - color: #96a2b4; - border-bottom: 1px solid #31384b; - } - - .mat-expansion-panel-header-title { - color: #96a2b4; - } - - .mat-expansion-panel-header-description { - color: #96a2b4; - } - - .mat-card, - .mat-mdc-card { - background: #12161f; - color: #96a2b4; - } - - .mat-card-subtitle, - .mat-mdc-card-subtitle { - color: #96a2b4; - } - - .mat-list-base .mat-list-option { - color: #96a2b4; - } - - .mat-list-base .mat-list-item { - color: #96a2b4; - } - - .list-group { - a.list-group-item { - color: #96a2b4; - } - - button.list-group-item { - color: #96a2b4; - } - - .list-group-item:hover { - background-color: rgba(10, 10, 10, 0.5); - } - } - - .mat-tab-label, - .mat-tab-link { - color: #96a2b4; - } - - .materialTableHeader { - background-color: #020910; - - h2 { - color: #96a2b4; - } - - ::placeholder { - /* Chrome, Firefox, Opera, Safari 10.1+ */ - color: #96a2b4; - opacity: 1; - /* Firefox */ - } - - :-ms-input-placeholder { - /* Internet Explorer 10-11 */ - color: #96a2b4; - } - - ::-ms-input-placeholder { - /* Microsoft Edge */ - color: #96a2b4; - } - - .header-buttons-left { - input.search-field { - background: #12161f; - color: #96a2b4; - } - - .search-icon { - color: #96a2b4; - } - } - } - - .mat-menu-panel { - background: #12161f; - } - - .mat-menu-item { - color: #96a2b4; - - .mat-icon { - color: #96a2b4; - } - } - - .mat-menu-item-submenu-trigger::after { - color: #96a2b4; - } - - // Angular Material 15+ / MDC: menu colors come from CSS variables on html. - // Overlay panels inherit from body.dark when dark theme is active. - --mat-menu-container-color: #12161f; - --mat-menu-item-label-text-color: #e0e6ed; - --mat-menu-item-icon-color: #e0e6ed; - --mat-menu-item-hover-state-layer-color: rgba(255, 255, 255, 0.08); - --mat-menu-item-focus-state-layer-color: rgba(255, 255, 255, 0.08); - --mat-menu-divider-color: rgba(255, 255, 255, 0.12); - - .mat-datepicker-content { - .mat-calendar { - background: #12161f; - color: #b8bbbd; - - .mat-calendar-body-cell-content { - color: #b8bbbd; - } - - .mat-calendar-table-header { - color: #b8bbbd; - } - - .mat-calendar-body-label { - color: #b8bbbd; - } - - .mat-calendar-body-today:not(.mat-calendar-body-selected) { - border-color: rgba(255, 255, 255, 0.32); - } - - .mat-calendar-arrow { - border-top-color: #b8bbbd; - } - } - } - - .mat-select-panel { - background: #12161f; - color: #b8bbbd; - - .mat-option { - color: #b8bbbd; - } - - .mat-option.mat-active { - color: #b8bbbd; - background: rgba(0, 0, 0, 0.4); - } - } - - .mat-pseudo-checkbox { - color: #b8bbbd; - } - - .mat-autocomplete-panel { - background: #12161f; - color: #b8bbbd; - - .mat-option-text { - color: #b8bbbd; - } - } - - .container-login100 { - background: #12161f; - } - - .login100-form { - background-color: #1a202e; - } - - .login100-form-title, - .error-header, - .error-subheader { - color: #ffffff; - } - - .txt1 { - color: #96a2b4; - } - - .apexcharts-legend-text { - color: #96a2b4 !important; - } - - .mat-button[disabled], - .mat-icon-button[disabled], - .mat-stroked-button[disabled], - .mat-flat-button[disabled], - .mat-raised-button[disabled], - .mat-fab[disabled], - .mat-mini-fab[disabled], - .mat-flat-button[disabled], - .mat-raised-button[disabled], - .mat-fab[disabled], - .mat-mini-fab[disabled], - .mat-flat-button[disabled], - .mat-raised-button[disabled], - .mat-fab[disabled], - .mat-mini-fab[disabled] { - color: rgba(255, 255, 255, 0.23); - } - - .mat-stroked-button:not([disabled]) { - border-color: rgba(255, 255, 255, 0.3); - } - - .mat-bottom-sheet-container { - background: #12161f; - } - - .mat-row { - border-bottom-color: rgba(255, 255, 255, 0.12); - } - // .material-icons-two-tone { - // filter: invert(99%) sepia(95%) saturate(4461%) hue-rotate(181deg) - // brightness(134%) contrast(83%); - // } - .appointment-tab-box { - background-color: #11141b; - } - .owl-dt-calendar-table { - .owl-dt-calendar-cell { - color: #96a2b4; - } - .owl-dt-calendar-header { - color: #96a2b4; - } - } - .owl-dt-container { - background: #11141b; - } - .owl-dt-calendar-control { - color: #ffffff; - } - .owl-dt-timer-content .owl-dt-timer-input { - border: 1px solid #717070; - background-color: #000000; - } - .owl-dt-container-buttons { - color: #ffffff; - } - .show-pwd-icon { - color: #96a2b4; - } - .mat-form-field-prefix, - .mat-form-field-suffix { - color: #96a2b4; - } - .app-list { - background: #181c27; - } - .lecture-list { - background: #181c27; - } - .media .media-body { - color: #96a2b4; - } - .auth-form-section { - background-color: #11141b; - } - .lang-item .lang-item-list { - color: #96a2b4; - &.active { - background-color: #10131c; - } - &:hover { - background-color: #171a21; - span.mdc-list-item__primary-text { - color: #ffffff; - } - } - } - .settingSidebar { - background: #1a202e; - .setting-panel-header { - color: #ffffff; - border: 1px solid #000000; - background: #000000; - } - .border-bottom { - border-bottom: 1px solid #3b434a !important; - } - } - .breadcrumb { - color: #96a2b4; - } - .breadcrumb-icon .feather { - color: #96a2b4; - } - .contact-details-field .color-icon { - filter: invert(68%) sepia(6%) saturate(787%) hue-rotate(177deg) - brightness(94%) contrast(86%); - } - .material-icons-two-tone { - filter: invert(68%) sepia(6%) saturate(787%) hue-rotate(177deg) - brightness(94%) contrast(86%); - } - .doc-file-type { - .d-flex { - border-bottom: 1px solid #15181d; - } - .set-flex { - color: #96a2b4; - } - } - .feed-element .well { - border: 1px solid #10131c; - background: #10131c; - } - .feed-activity-list .feed-element { - border-bottom: 1px solid #525252; - } - .project-activity { - border: 1px solid #525252; - margin-top: 20px; - } - .project-card-header { - color: #96a2b4; - } - .navbar-nav.navbar-right .user_profile span { - color: #fff; - } - - .mat-mdc-dialog-container { - .mdc-dialog__surface { - background: #2d364a; - color: #c5cdd8; - border: 1px solid #4a5568; - box-shadow: 0 12px 40px rgba(0, 0, 0, 0.55); - } - .mdc-dialog__content { - background: #2d364a; - color: #c5cdd8 !important; - } - } - .mdc-text-field--outlined:not(.mdc-text-field--disabled) - .mdc-notched-outline__leading, - .mdc-text-field--outlined:not(.mdc-text-field--disabled) - .mdc-notched-outline__notch, - .mdc-text-field--outlined:not(.mdc-text-field--disabled) - .mdc-notched-outline__trailing { - border-color: rgba(255, 255, 255, 0.38); - } - - .mdc-text-field--outlined:not(.mdc-text-field--disabled):not( - .mdc-text-field--focused - ):hover - .mdc-notched-outline - .mdc-notched-outline__leading, - .mdc-text-field--outlined:not(.mdc-text-field--disabled):not( - .mdc-text-field--focused - ):hover - .mdc-notched-outline - .mdc-notched-outline__notch, - .mdc-text-field--outlined:not(.mdc-text-field--disabled):not( - .mdc-text-field--focused - ):hover - .mdc-notched-outline - .mdc-notched-outline__trailing { - border-color: #96a2b4; - } - - .mdc-text-field--outlined:not(.mdc-text-field--disabled):not( - .mdc-text-field--focused - ):hover - .mdc-notched-outline - .mdc-notched-outline__notch { - border-left: none; - } - .mat-mdc-dialog-container .mdc-dialog__title { - color: #e2e6ed; - } - .mat-button-toggle-appearance-standard { - color: #96a2b4; - background: #1d1d1d; - } - .mat-button-toggle-checked { - background: #000000 !important; - color: #96a2b4; - } - .mat-button-toggle-standalone.mat-button-toggle-appearance-standard, - .mat-button-toggle-group-appearance-standard { - border: solid 1px #4a4a4a; - } - .mat-button-toggle-group-appearance-standard - .mat-button-toggle - + .mat-button-toggle { - border: solid 1px #4a4a4a; - } - .mat-button-toggle-disabled .mat-button-toggle-button { - background-color: #565656; - color: white; - } - - .mdc-text-field:not(.mdc-text-field--disabled) .mdc-floating-label { - color: #96a2b4; - } - .mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input { - color: #96a2b4; - } - .mat-mdc-select-value { - color: #96a2b4; - } - .mdc-text-field--filled:not(.mdc-text-field--disabled) { - background-color: #181b24; - } - .mat-mdc-checkbox - .mdc-checkbox - .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not( - [data-indeterminate="true"] - ) - ~ .mdc-checkbox__background { - border-color: #96a2b4; - } - .mat-mdc-checkbox - .mdc-checkbox:hover - .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not( - [data-indeterminate="true"] - ) - ~ .mdc-checkbox__background { - border-color: #96a2b4; - } - - .mat-mdc-paginator-icon { - fill: #96a2b4; - } - .mat-mdc-radio-button - .mdc-radio - .mdc-radio__native-control:enabled:not(:checked) - + .mdc-radio__background - .mdc-radio__outer-circle { - border-color: #96a2b4; - } - .mat-mdc-select-arrow { - color: #96a2b4; - } - .mat-mdc-icon-button[disabled] .mat-mdc-paginator-icon { - fill: rgba(255, 255, 255, 0.15); - } - .mat-mdc-tab:not(.mat-mdc-tab-disabled) .mdc-tab__text-label { - color: #96a2b4; - } - - .mat-mdc-tab-group, - .mat-mdc-tab-header, - .mat-mdc-tab-body-wrapper, - .mat-mdc-tab-body-content, - .mat-mdc-tab-body.mat-mdc-tab-body-active { - background: #1a202e; - color: #96a2b4; - } - - .mat-mdc-tab-header { - border-bottom-color: rgba(255, 255, 255, 0.1); - } - - .mdc-tab-indicator__content--underline { - border-color: #2196f3; - } - .order-list li { - .badge { - background: rgb(12, 12, 12, 0.8); - } - img { - border: 2px solid #545454; - } - } - .mat-mdc-raised-button:disabled { - color: #7c7c7c; - } - - .nfc-menu { - .nfc-dropdown { - background-color: #1b1e27; - .menu { - button { - &:hover { - background-color: #10131c; - } - } - .msg-read { - background-color: #1b1e27; - border-bottom: 1px solid #5e5e5e; - } - .menu-info { - h4 { - color: #96a2b4; - } - .menu-title { - color: #96a2b4; - } - p { - color: rgba(255, 255, 255, 0.55); - } - .menu-desc { - color: rgba(255, 255, 255, 0.55); - .material-icons { - color: #979797; - } - } - } - .msg-unread { - background-color: #000000; - border-bottom: 1px solid #5e5e5e; - } - } - } - .nfc-footer { - background-color: #1b1e27; - border-top: 1px solid #363636; - .nfc-read-all { - color: rgb(181 181 181); - } - } - } - .user_dw_menu { - .mat-mdc-menu-item.mdc-list-item { - background-color: #1b1e27; - color: #e0e6ed; - - &:hover { - background-color: #10131c; - } - } - .mat-mdc-menu-item .mdc-list-item__primary-text { - color: #e0e6ed !important; - } - .user-menu-icons, - .user-menu-icons .feather { - color: #e0e6ed !important; - stroke: #e0e6ed; - } - } - .mat-mdc-select-panel-above .mdc-menu-surface.mat-mdc-select-panel { - background-color: #10131c; - } - .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not( - .mdc-list-item--disabled - ) { - background: rgb(0 0 0); - } - .mat-mdc-option.mat-mdc-option-active { - background: rgb(0 0 0); - } - .mat-mdc-option.mdc-list-item { - background-color: #10131c; - } - .mdc-menu-surface.mat-mdc-select-panel { - background-color: #10131c; - } - .mat-mdc-option:hover:not(.mdc-list-item--disabled) { - background: rgb(0 0 0); - } - .mat-mdc-option .mdc-list-item__primary-text { - color: #d5d5d5 !important; - } - .mat-mdc-menu-panel.mat-mdc-menu-panel { - background-color: var(--mat-menu-container-color, #10131c); - } - .mat-mdc-menu-item { - color: var(--mat-menu-item-label-text-color, #e0e6ed) !important; - } - .mat-mdc-menu-item .mdc-list-item__primary-text { - color: var(--mat-menu-item-label-text-color, #e0e6ed) !important; - } - .mat-mdc-menu-item[disabled] .mat-icon-no-color { - color: #d5d5d5; - } - .mat-mdc-menu-item .mat-icon { - color: var(--mat-menu-item-icon-color, #e0e6ed) !important; - } - .profile-menu { - .mat-mdc-menu-item, - .mat-mdc-menu-item .mdc-list-item__primary-text, - .user-menu-icons, - .user-menu-icons .feather { - color: #e0e6ed !important; - } - .user-menu-icons .feather { - stroke: #e0e6ed; - } - } - nav.navbar { - box-shadow: 0 -18px 1px 5px rgb(35 43 62); - } - .app-dropdown { - .app-icons:hover { - background-color: #000000; - } - p { - color: #d5d5d5; - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/theme/_theme-black.scss b/MyOffice.SPA/src/assets/scss/theme/_theme-black.scss deleted file mode 100644 index b7b27b4..0000000 --- a/MyOffice.SPA/src/assets/scss/theme/_theme-black.scss +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Document : theme-black.scss - * Author : RedStar Template - * Description: This scss file for black theme style classes - */ -@import "_theme-color-variables"; - -.theme-black { - .navbar { - background-color: transparent; - .icon-color { - color: #fff; - } - .navbar-nav.navbar-right .user_profile span { - color: #fff; - } - } - - .navbar.active { - background: #485563; - /* fallback for old browsers */ - background: -webkit-linear-gradient(to right, #1c212d, #1a202e); - /* Chrome 10-25, Safari 5.1-6 */ - background: linear-gradient(to right, #1c212d, #1a202e); - - .nav { - > li { - > a { - color: #fff; - } - } - } - - .collapse-menu-icon .mat-icon { - color: #fff; - } - .collapse-menu-icon .feather { - color: #fff; - } - .nav-notification-icons .mat-icon { - color: #fff; - } - .nav-notification-icons .feather { - color: #fff; - } - } - - .navbar-brand { - color: $theme-black-navbar-brand; - - &:hover { - color: $theme-black-navbar-brand_hover; - } - - &:active { - color: $theme-black-navbar-brand_active; - } - - &:focus { - color: $theme-black-navbar-brand_focus; - } - } - - .nav { - > li { - > a { - &:hover { - background-color: $theme-black-nav-anchor_hover; - text-decoration: none; - } - - &:focus { - background-color: $theme-black-nav-anchor_focus; - text-decoration: none; - } - } - } - - .open { - > a { - background-color: $theme-black-nav-anchor-opened; - - &:hover { - background-color: $theme-black-nav-anchor-opened_hover; - } - - &:focus { - background-color: $theme-black-nav-anchor-opened_focus; - } - } - } - } - - .bars { - color: $theme-black-bar; - } - - .sidebar { - .menu { - .list { - li { - &.active { - background-color: $theme-black-menu-list-active; - } - - a { - -moz-transition: all 0.3s; - -o-transition: all 0.3s; - -webkit-transition: all 0.3s; - transition: all 0.3s; - - i, - span { - -moz-transition: all 0.3s; - -o-transition: all 0.3s; - -webkit-transition: all 0.3s; - transition: all 0.3s; - } - - &:hover { - color: $theme-black-sidebar-menu-hover; - // i, - // span { - // color: $theme-black-sidebar-menu-hover; - // } - } - } - } - - .ml-menu { - background-color: $theme-black-menu-list-submenu; - } - } - } - - .legal { - background-color: $theme-black-legal-bg; - - .copyright { - a { - color: $theme-black !important; - } - } - } - } - - .breadcrumb li a { - color: $theme-black !important; - } - - .page-item.active .page-link { - background-color: $theme-black; - border-color: $theme-black; - color: #ffffff; - border-radius: 50%; - box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.2); - } - - .btn-primary { - background-color: $theme-black-button-color !important; - color: #fff !important; - border-color: $theme-black !important; - - &:hover { - background-color: $theme-black !important; - color: #fff !important; - } - - &:active { - background-color: $theme-black !important; - color: #fff !important; - } - - &:focus { - background-color: $theme-black !important; - color: #fff !important; - } - - &:disabled { - background-color: $theme-black !important; - color: #fff !important; - } - } - - .btn-outline-primary { - background: 0 0 !important; - color: $theme-black !important; - border: 1px solid $theme-black !important; - - &:hover { - background: $theme-black !important; - color: #fff !important; - border: 1px solid $theme-black !important; - } - } - - .timelineLabelColor strong { - color: $theme-black !important; - } - - .top-sidebar { - .horizontal-menu { - li { - &.active { - > a { - color: $theme-black; - } - } - - a { - -moz-transition: all 0.3s; - -o-transition: all 0.3s; - -webkit-transition: all 0.3s; - transition: all 0.3s; - - &:hover { - color: $theme-black; - } - } - } - } - } - - .nav-tabs > li > a:before { - border-bottom: 2px solid $theme-black; - } -} - -/*Logo Header Background Color*/ -.logo-black { - .navbar-header { - background-color: #1a202e; - border-right: 1px solid #323538; - } -} diff --git a/MyOffice.SPA/src/assets/scss/theme/_theme-color-variables.scss b/MyOffice.SPA/src/assets/scss/theme/_theme-color-variables.scss deleted file mode 100644 index 8c5a655..0000000 --- a/MyOffice.SPA/src/assets/scss/theme/_theme-color-variables.scss +++ /dev/null @@ -1,132 +0,0 @@ -//Theme white -$theme-white: #fff; -$theme-white-active-color: #00bcd4; -$theme-white-sidemenu-active-color: #ffffff; -$theme-white-legal-bg: #2c303b; -$theme-white-bar: #2c303b; -$theme-white-navbar-brand: #2c303b; -$theme-white-navbar-brand_active: #2c303b; -$theme-white-navbar-brand_hover: #2c303b; -$theme-white-navbar-brand_focus: #2c303b; -$theme-white-nav-anchor: #3a2c70; -$theme-white-nav-anchor_hover: rgba(0, 0, 0, 0); -$theme-white-nav-anchor_focus: rgba(0, 0, 0, 0); -$theme-white-nav-anchor-opened: rgba(0, 0, 0, 0); -$theme-white-nav-anchor-opened_hover: rgba(0, 0, 0, 0); -$theme-white-nav-anchor-opened_focus: rgba(0, 0, 0, 0); -$theme-white-menu-list-active: rgba(0, 0, 0, 0); -$theme-white-menu-list-toggled: rgba(0, 0, 0, 0); -$theme-white-menu-list-submenu: rgba(0, 0, 0, 0); -$theme-white-sidebar-menu-active: #5783c7; -$theme-white-sidebar-menu-hover: #5783c7; - -//Theme Black -$theme-black: #1a202e; -$theme-black-legal-bg: #fff; -$theme-black-bar: #fff; -$theme-black-button-color: #5783c7; -$theme-black-navbar-brand: #fff; -$theme-black-navbar-brand_active: #fff; -$theme-black-navbar-brand_hover: #fff; -$theme-black-navbar-brand_focus: #fff; -$theme-black-nav-anchor: #fff; -$theme-black-nav-anchor_hover: rgba(0, 0, 0, 0); -$theme-black-nav-anchor_focus: rgba(0, 0, 0, 0); -$theme-black-nav-anchor-opened: rgba(0, 0, 0, 0); -$theme-black-nav-anchor-opened_hover: rgba(0, 0, 0, 0); -$theme-black-nav-anchor-opened_focus: rgba(0, 0, 0, 0); -$theme-black-menu-list-active: rgba(0, 0, 0, 0); -$theme-black-menu-list-toggled: rgba(0, 0, 0, 0); -$theme-black-menu-list-submenu: rgba(0, 0, 0, 0); -$theme-black-sidebar-menu-active: #5783c7; -$theme-black-sidebar-menu-hover: #5783c7; - -//Theme Purple -$theme-purple: #909de4; -$theme-purple-legal-bg: #fff; -$theme-purple-bar: #fff; -$theme-purple-navbar-brand: #fff; -$theme-purple-navbar-brand_active: #fff; -$theme-purple-navbar-brand_hover: #fff; -$theme-purple-navbar-brand_focus: #fff; -$theme-purple-nav-anchor: #fff; -$theme-purple-nav-anchor_hover: rgba(0, 0, 0, 0); -$theme-purple-nav-anchor_focus: rgba(0, 0, 0, 0); -$theme-purple-nav-anchor-opened: rgba(0, 0, 0, 0); -$theme-purple-nav-anchor-opened_hover: rgba(0, 0, 0, 0); -$theme-purple-nav-anchor-opened_focus: rgba(0, 0, 0, 0); -$theme-purple-menu-list-active: rgba(0, 0, 0, 0); -$theme-purple-menu-list-toggled: rgba(0, 0, 0, 0); -$theme-purple-menu-list-submenu: rgba(0, 0, 0, 0); - -//Theme Blue -$theme-blue: #03a9f3; -$theme-blue-legal-bg: #fff; -$theme-blue-bar: #fff; -$theme-blue-navbar-brand: #fff; -$theme-blue-navbar-brand_active: #fff; -$theme-blue-navbar-brand_hover: #fff; -$theme-blue-navbar-brand_focus: #fff; -$theme-blue-nav-anchor: #fff; -$theme-blue-nav-anchor_hover: rgba(0, 0, 0, 0); -$theme-blue-nav-anchor_focus: rgba(0, 0, 0, 0); -$theme-blue-nav-anchor-opened: rgba(0, 0, 0, 0); -$theme-blue-nav-anchor-opened_hover: rgba(0, 0, 0, 0); -$theme-blue-nav-anchor-opened_focus: rgba(0, 0, 0, 0); -$theme-blue-menu-list-active: rgba(0, 0, 0, 0); -$theme-blue-menu-list-toggled: rgba(0, 0, 0, 0); -$theme-blue-menu-list-submenu: rgba(0, 0, 0, 0); - -//Theme Cyan -$theme-cyan: #01d8da; -$theme-cyan-legal-bg: #fff; -$theme-cyan-bar: #fff; -$theme-cyan-navbar-brand: #fff; -$theme-cyan-navbar-brand_active: #fff; -$theme-cyan-navbar-brand_hover: #fff; -$theme-cyan-navbar-brand_focus: #fff; -$theme-cyan-nav-anchor: #fff; -$theme-cyan-nav-anchor_hover: rgba(0, 0, 0, 0); -$theme-cyan-nav-anchor_focus: rgba(0, 0, 0, 0); -$theme-cyan-nav-anchor-opened: rgba(0, 0, 0, 0); -$theme-cyan-nav-anchor-opened_hover: rgba(0, 0, 0, 0); -$theme-cyan-nav-anchor-opened_focus: rgba(0, 0, 0, 0); -$theme-cyan-menu-list-active: rgba(0, 0, 0, 0); -$theme-cyan-menu-list-toggled: rgba(0, 0, 0, 0); -$theme-cyan-menu-list-submenu: rgba(0, 0, 0, 0); - -//Theme Green -$theme-green: #11a37d; -$theme-green-legal-bg: #fff; -$theme-green-bar: #fff; -$theme-green-navbar-brand: #fff; -$theme-green-navbar-brand_active: #fff; -$theme-green-navbar-brand_hover: #fff; -$theme-green-navbar-brand_focus: #fff; -$theme-green-nav-anchor: #fff; -$theme-green-nav-anchor_hover: rgba(0, 0, 0, 0); -$theme-green-nav-anchor_focus: rgba(0, 0, 0, 0); -$theme-green-nav-anchor-opened: rgba(0, 0, 0, 0); -$theme-green-nav-anchor-opened_hover: rgba(0, 0, 0, 0); -$theme-green-nav-anchor-opened_focus: rgba(0, 0, 0, 0); -$theme-green-menu-list-active: rgba(0, 0, 0, 0); -$theme-green-menu-list-toggled: rgba(0, 0, 0, 0); -$theme-green-menu-list-submenu: rgba(0, 0, 0, 0); - -//Theme Orange -$theme-orange: #f16735; -$theme-orange-legal-bg: #fff; -$theme-orange-bar: #fff; -$theme-orange-navbar-brand: #fff; -$theme-orange-navbar-brand_active: #fff; -$theme-orange-navbar-brand_hover: #fff; -$theme-orange-navbar-brand_focus: #fff; -$theme-orange-nav-anchor: #fff; -$theme-orange-nav-anchor_hover: rgba(0, 0, 0, 0); -$theme-orange-nav-anchor_focus: rgba(0, 0, 0, 0); -$theme-orange-nav-anchor-opened: rgba(0, 0, 0, 0); -$theme-orange-nav-anchor-opened_hover: rgba(0, 0, 0, 0); -$theme-orange-nav-anchor-opened_focus: rgba(0, 0, 0, 0); -$theme-orange-menu-list-active: rgba(0, 0, 0, 0); -$theme-orange-menu-list-toggled: rgba(0, 0, 0, 0); -$theme-orange-menu-list-submenu: rgba(0, 0, 0, 0); diff --git a/MyOffice.SPA/src/assets/scss/theme/_theme-white.scss b/MyOffice.SPA/src/assets/scss/theme/_theme-white.scss deleted file mode 100644 index 4651044..0000000 --- a/MyOffice.SPA/src/assets/scss/theme/_theme-white.scss +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Document : theme-white.scss - * Author : RedStar Template - * Description: This scss file for white theme style classes - */ -@import "_theme-color-variables"; - -.theme-white { - .navbar { - background-color: transparent; - .header-icon .feather { - color: black; - } - } - .navbar-right .user_profile span { - color: rgb(0, 0, 0) !important; - } - .navbar.active { - background-color: $theme-white !important; - .nav { - > li { - > a { - color: #3a2c70; - } - } - } - .collapse-menu-icon .mat-icon { - color: #3a2c70; - } - .nav-notification-icons .mat-icon { - color: #3a2c70; - } - } - - .navbar-brand { - color: $theme-white-navbar-brand; - - &:hover { - color: $theme-white-navbar-brand_hover; - } - - &:active { - color: $theme-white-navbar-brand_active; - } - - &:focus { - color: $theme-white-navbar-brand_focus; - } - } - - .nav { - > li { - > a { - &:hover { - background-color: $theme-white-nav-anchor_hover; - text-decoration: none; - } - - &:focus { - background-color: $theme-white-nav-anchor_focus; - text-decoration: none; - } - } - } - - .open { - > a { - background-color: $theme-white-nav-anchor-opened; - - &:hover { - background-color: $theme-white-nav-anchor-opened_hover; - } - - &:focus { - background-color: $theme-white-nav-anchor-opened_focus; - } - } - } - } - - .bars { - color: $theme-white-bar; - } - - .sidebar { - .menu { - .list { - li { - &.active { - background-color: $theme-white-menu-list-active; - } - a { - -moz-transition: all 0.3s; - -o-transition: all 0.3s; - -webkit-transition: all 0.3s; - transition: all 0.3s; - i, - span { - -moz-transition: all 0.3s; - -o-transition: all 0.3s; - -webkit-transition: all 0.3s; - transition: all 0.3s; - } - } - } - - .ml-menu { - background-color: $theme-white-menu-list-submenu; - - // li.active a:not(.menu-toggle):before { - // content: "\f068"; - // font-family: "Font Awesome 5 Free"; - // font-size: 11px; - // display: block; - // width: 7px; - // height: 7px; - // position: absolute; - // left: 10%; - // font-weight: 900; - // } - } - } - } - - .legal { - background-color: $theme-white-legal-bg; - - .copyright { - a { - color: $theme-white !important; - } - } - } - } - - .breadcrumb li a { - color: $theme-white-active-color !important; - } - .page-item.active .page-link { - background-color: $theme-white-active-color; - border-color: $theme-white-active-color; - border-radius: 50%; - margin: 5px; - box-shadow: 0 4px 5px 0 #d4d8da, 0 1px 10px 0 #d4d8da, - 0 2px 4px -1px #d4d8da; - padding: 0px 12px; - min-width: 30px; - line-height: 30px; - color: #ffffff; - text-transform: uppercase; - } - - .btn-primary { - background-color: $theme-white-active-color !important; - color: #fff !important; - border-color: $theme-white-active-color !important; - &:hover { - background-color: $theme-white-active-color !important; - color: #fff !important; - } - &:active { - background-color: $theme-white-active-color !important; - color: #fff !important; - } - &:focus { - background-color: $theme-white-active-color !important; - color: #fff !important; - } - &:disabled { - background-color: $theme-white-active-color !important; - color: #fff !important; - } - } - .btn-outline-primary { - background: 0 0 !important; - color: $theme-white-bar !important; - border: 1px solid $theme-white-active-color !important; - &:hover { - background: $theme-white-active-color !important; - color: #fff !important; - border: 1px solid $theme-white !important; - } - } - .timelineLabelColor strong { - color: $theme-white-active-color !important; - } - .top-sidebar { - .horizontal-menu { - li { - &.active { - > a { - color: $theme-white-active-color; - } - } - a { - -moz-transition: all 0.3s; - -o-transition: all 0.3s; - -webkit-transition: all 0.3s; - transition: all 0.3s; - &:hover { - color: $theme-white-active-color; - } - } - } - } - } - .demo-choose-skin li.actived:after { - color: #000; - } - - .nav-tabs > li > a:before { - border-bottom: 2px solid $theme-white-active-color; - } - .search-box input#search { - color: gray; - background: #edecec; - } - .settingSidebar ul.choose-theme li.active div::after { - color: #000; - } -} -/*Logo Header Background Color*/ -.logo-white { - .navbar-header { - background-color: $theme-white; - - .logo-name { - color: #000; - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/theme/all-themes.scss b/MyOffice.SPA/src/assets/scss/theme/all-themes.scss deleted file mode 100644 index bd016b3..0000000 --- a/MyOffice.SPA/src/assets/scss/theme/all-themes.scss +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Light / dark RedStar skins only (Phase 3.6 — color skins removed). - */ - -@import "theme-black"; -@import "theme-white"; -@import "dark"; diff --git a/MyOffice.SPA/src/assets/scss/ui/_alerts.scss b/MyOffice.SPA/src/assets/scss/ui/_alerts.scss deleted file mode 100644 index 96edb3e..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_alerts.scss +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Document : alert.scss - * Author : RedStar Template - * Description: This scss file for alert style classes - */ -.alert { - @include border-radius(0); - @include box-shadow(none); - border: none; - color: #fff !important; - - .alert-link { - color: #fff; - text-decoration: underline; - font-weight: bold; - } -} - -.alert-success { - background-color: rgba(24, 206, 15, 0.8); -} - -.alert-info { - background-color: rgba(44, 168, 255, 0.8); -} - -.alert-warning { - background-color: rgba(255, 178, 54, 0.8); -} - -.alert-danger { - background-color: rgba(255, 54, 54, 0.8); -} - -.alert-dismissible { - .close { - color: #fff; - opacity: 1; - border: none; - text-shadow: none; - } -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_badgelistgroupitem.scss b/MyOffice.SPA/src/assets/scss/ui/_badgelistgroupitem.scss deleted file mode 100644 index 10db563..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_badgelistgroupitem.scss +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Document : badgelistgroupitem.scss - * Author : RedStar Template - * Description: This scss file for badge style classes - */ -.badge { - padding: 5px 8px; - line-height: 12px; - border: 1px solid; - font-weight: 400; - font-size: 13px; -} - -.list-group-item { - @include border-radius(0); - @include transition(0.5s); -} - -.list-group { - .active, - .list-group-item.active { - background-color: #2196f3; - border-color: #2196f3; - - &:hover, - &:focus, - &:active { - background-color: #2196f3; - border-color: #2196f3; - } - - .list-group-item-text { - color: #dfe9f1; - font-size: 13px; - - &:hover, - &:active, - &:focus { - color: #dfe9f1; - } - } - } - a, - button { - &.list-group-item { - color: #555; - } - &.list-group-item.active { - color: #dfe9f1; - } - } - - .list-group-item.active { - &:hover, - &:focus, - &:active { - .list-group-item-text { - color: #dfe9f1; - } - } - } - - .list-group-item { - &:first-child, - &:last-child { - @include border-radius(0); - } - - .list-group-item-heading { - font-weight: bold; - font-size: 17px; - } - text-align: left; - &:focus, - &:hover { - background-color: #f5f5f5; - } - } - - .list-group-item-success { - background-color: #2b982b; - border: none; - color: #fff; - - &:hover, - &:focus { - background-color: #2b982b; - color: #fff; - opacity: 0.8; - } - } - - .list-group-item-info { - background-color: #00b0e4; - border: none; - color: #fff; - - &:hover, - &:focus { - background-color: #00b0e4; - color: #fff; - opacity: 0.8; - } - } - - .list-group-item-warning { - background-color: #ff9600; - border: none; - color: #fff; - - &:hover, - &:focus { - background-color: #ff9600; - color: #fff; - opacity: 0.8; - } - } - - .list-group-item-danger { - background-color: #fb483a; - border: none; - color: #fff; - - &:hover, - &:focus { - background-color: #fb483a; - color: #fff; - opacity: 0.8; - } - } - - @each $key, $val in $colors { - .pl-#{$key} { - stroke: $val; - } - - .list-group-bg-#{$key} { - background-color: $val; - border: none; - color: #fff; - - &:hover, - &:focus { - background-color: $val; - color: #fff; - opacity: 0.8; - } - } - } -} -span.badge { - min-width: auto; - float: none; - font-size: 13px; -} -.list-group span.badge { - float: right; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-primary .badge { - color: #337ab7; - background-color: #fff; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.badge-solid-red { - color: #f11541; - background-color: rgba(241, 21, 65, 0.15); - border: none; - padding: 5px 12px; - font-weight: 500; - line-height: 1.2; -} -.badge-solid-purple { - color: #6f42c1; - background-color: rgba(111, 66, 193, 0.15); - border: none; - padding: 5px 12px; - font-weight: 500; - line-height: 1.2; -} -.badge-solid-green { - color: #198754; - background-color: rgba(25, 135, 84, 0.15); - border: none; - padding: 5px 12px; - font-weight: 500; - line-height: 1.2; -} -.badge-solid-blue { - color: #0d6efd; - background-color: rgba(13, 110, 253, 0.15); - border: none; - padding: 5px 12px; - font-weight: 500; - line-height: 1.2; -} -.badge-solid-pink { - color: #fd0dfd; - background-color: rgba(253, 13, 253, 0.15); - border: none; - padding: 5px 12px; - font-weight: 500; - line-height: 1.2; -} -.badge-solid-orange { - color: #fd7e14; - background-color: rgba(253, 126, 20, 0.15); - border: none; - padding: 5px 12px; - font-weight: 500; - line-height: 1.2; -} -.badge-solid-cyan { - color: #0dcaf0; - background-color: rgba(13, 202, 240, 0.15); - border: none; - padding: 5px 12px; - font-weight: 500; - line-height: 1.2; -} -.badge-solid-brown { - color: #964b00; - background-color: rgba(150, 75, 0, 0.15); - border: none; - padding: 5px 12px; - font-weight: 500; - line-height: 1.2; -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_buttons.scss b/MyOffice.SPA/src/assets/scss/ui/_buttons.scss deleted file mode 100644 index 40d73d4..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_buttons.scss +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Document : _buttons.scss - * Author : RedStar Template - * Description: This scss file for button style classes - */ -.example-button-row button, -.example-button-row a { - margin-right: 8px; -} - -.btn:focus, -.btn.focus { - box-shadow: none; -} - -.btn-space { - margin-right: 10px !important; -} - -/* Dialog Cancel: readable on dark surfaces, secondary to Save */ -.dialog-btn-cancel.mat-mdc-unelevated-button, -.dialog-btn-cancel.mat-mdc-button, -.dialog-btn-cancel { - background-color: #5a6578 !important; - color: rgba(255, 255, 255, 0.5) !important; - --mdc-filled-button-container-color: #5a6578; - --mdc-filled-button-label-text-color: rgba(255, 255, 255, 0.5); - --mdc-text-button-label-text-color: rgba(255, 255, 255, 0.5); - - .mdc-button__label { - color: rgba(255, 255, 255, 0.5) !important; - } - - &:hover { - background-color: #6b7689 !important; - --mdc-filled-button-container-color: #6b7689; - } -} - -.big-button { - width: 200px !important; - min-width: unset !important; - height: 45px; -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_card.scss b/MyOffice.SPA/src/assets/scss/ui/_card.scss deleted file mode 100644 index f5fb0be..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_card.scss +++ /dev/null @@ -1,320 +0,0 @@ -/* - * Document : _card.scss - * Author : RedStar Template - * Description: This scss file for card style classes - */ -.card { - background: #fff; - min-height: 50px; - position: relative; - margin-bottom: 24px; - border: 1px solid #f2f4f9; - border-radius: 10px; - box-shadow: 0 0 10px 0 rgba(183, 192, 206, 0.2); - -webkit-box-shadow: 0 0 10px 0 rgba(183, 192, 206, 0.2); - - .card-inside-title { - margin-top: 25px; - margin-bottom: 15px; - display: block; - font-size: 15px; - color: #000; - - small { - color: #999; - display: block; - font-size: 11px; - margin-top: 5px; - - a { - color: #777; - font-weight: bold; - } - } - } - - .card-inside-title:first-child { - margin-top: 0; - } - - .bg-red, - .bg-pink, - .bg-purple, - .bg-indigo, - .bg-blue, - .bg-cyan, - .bg-teal, - .bg-green, - .bg-yellow, - .bg-orange, - .bg-deep-orange, - .bg-brown, - .bg-grey, - .bg-black { - border-bottom: none !important; - color: #fff !important; - - h2, - small, - .material-icons { - color: #fff !important; - } - - .badge { - background-color: #fff; - color: #555; - } - } - - .header { - position: relative; - display: flex; - width: 100%; - color: #555; - padding: 10px 15px; - line-height: 30px; - border-bottom: 1px solid; - border-color: rgba(82, 63, 105, 0.06); - - .header-dropdown { - position: absolute; - top: 0px; - right: 0px; - list-style: none; - - .dropdown-menu { - li { - display: block !important; - } - } - - li { - display: inline-block; - } - - i { - font-size: 20px; - color: #999; - @include transition(all 0.5s); - - &:hover { - color: #000; - } - } - } - - h2 { - margin: 0; - color: #5b626b; - font-size: 17px; - line-height: 28px; - padding-right: 10px; - font-weight: 500; - - small { - display: block; - font-size: 12px; - margin-top: 5px; - color: #999; - line-height: 15px; - - a { - font-weight: bold; - color: #777; - } - } - } - - .col-xs-12 { - h2 { - margin-top: 5px; - } - } - } - - .body { - font-size: 14px; - color: #555; - padding: 15px; - - @for $i from 1 through 12 { - .col-xs-#{$i}, - .col-sm-#{$i}, - .col-md-#{$i}, - .col-lg-#{$i} { - margin-bottom: 20px; - } - } - } - .list-body { - padding: 0px 10px; - } - &.card-statistic-1 .card-header, - &.card-statistic-2 .card-header { - border-color: transparent; - padding-bottom: 0; - height: auto; - min-height: auto; - display: block; - } - - &.card-statistic-1 .card-icon { - width: 30px; - height: 30px; - margin: 10px 0px 0px 20px; - border-radius: 3px; - line-height: 78px; - text-align: center; - float: left; - font-size: 30px; - } - - &.card-statistic-1 .card-header h4, - &.card-statistic-2 .card-header h4 { - line-height: 1.2; - color: color(muted); - } - - &.card-statistic-1 .card-body, - &.card-statistic-2 .card-body { - padding-top: 0; - } - - &.card-statistic-1 .card-body, - &.card-statistic-2 .card-body { - font-size: 26px; - font-weight: 700; - color: color(fontdark); - padding-bottom: 0; - } - - &.card-statistic-1, - &.card-statistic-2 { - display: inline-block; - width: 100%; - } - - &.card-statistic-1 .card-icon, - &.card-statistic-2 .card-icon { - width: 80px; - height: 80px; - margin: 10px; - border-radius: 3px; - line-height: 94px; - text-align: center; - float: left; - border-radius: 50px; - margin-right: 15px; - - .ion, - .fas, - .far, - .fab, - .fal { - font-size: 22px; - color: #fff; - } - } - - &.card-statistic-1 .card-icon { - line-height: 90px; - } - - &.card-statistic-2 .card-icon { - width: 50px; - height: 50px; - line-height: 50px; - font-size: 22px; - margin: 25px; - box-shadow: 5px 3px 10px 0 rgba(21, 15, 15, 0.3); - border-radius: 10px; - background: #6777ef; - } - &.card-statistic-2 .card-icon-only { - font-size: 35px; - margin: 20px; - } - - &.card-statistic-1 .card-header, - &.card-statistic-2 .card-header { - padding-bottom: 0; - padding-top: 25px; - } - - &.card-statistic-2 .card-header + .card-body, - &.card-statistic-2 .card-body + .card-header { - padding-top: 0; - } - - &.card-statistic-1 .card-header h4, - &.card-statistic-2 .card-header h4 { - font-weight: 600; - font-size: 13px; - letter-spacing: 0.5px; - } - - &.card-statistic-1 .card-header h4 { - margin-bottom: 0; - } - - &.card-statistic-2 .card-header h4 { - text-transform: none; - margin-bottom: 0; - } - - &.card-statistic-1 .card-body { - font-size: 20px; - } - - &.card-statistic-2 { - .card-chart { - margin-left: -10px; - margin-right: -1px; - margin-bottom: -7px; - - canvas { - height: 70px !important; - } - } - .card-right { - float: right; - margin: 15px 15px 15px 0px; - } - } -} -.plain-card { - box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.1); - padding: 20px; - border-radius: 10px; - background: #fff; - overflow: hidden; - margin: 0.5rem 0 1rem 0; -} -.card-inner .progress { - height: 10px; - margin: 0px; -} -.col-block { - margin-left: 5px; -} -.card-height-100 { - height: 100px; -} -.doc-card-title { - color: #00bdf2; - font-size: 16px; -} -.doc-card-image { - background: #fff; - position: inherit; - padding: 2px; - box-shadow: 0 5px 25px 0 rgba(0, 0, 0, 0.2); -} -.card-spacing { - padding-right: 0px; -} -.card-bnner { - background: white; - padding: 15px; - border-radius: 10px; -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_ckeditor.scss b/MyOffice.SPA/src/assets/scss/ui/_ckeditor.scss deleted file mode 100644 index 2aa06c8..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_ckeditor.scss +++ /dev/null @@ -1,18 +0,0 @@ -.ck.ck-content ul, -.ck.ck-content ul li { - list-style-type: inherit; -} - -.ck.ck-content ul { - /* Default user agent stylesheet, you can change it to your needs. */ - padding-left: 40px; -} -.ck.ck-content ol, -.ck.ck-content ol li { - list-style-type: decimal; -} - -.ck.ck-content ol { - /* Default user agent stylesheet, you can change it to your needs. */ - padding-left: 40px; -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_collapse.scss b/MyOffice.SPA/src/assets/scss/ui/_collapse.scss deleted file mode 100644 index 3de6549..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_collapse.scss +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Document : _collapse.scss - * Author : RedStar Template - * Description: This scss file for collapse style classes - */ -.collapse, -.collapse.in, -.collapsing { - .well { - @include border-radius(0); - margin-bottom: 0; - } - &.show { - display: block; - } -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_dialogs.scss b/MyOffice.SPA/src/assets/scss/ui/_dialogs.scss deleted file mode 100644 index 06d4c71..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_dialogs.scss +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Document : _dialogs.scss - * Author : RedStar Template - * Description: This scss file for dialogs style classes - */ -.sweet-alert { - @include border-radius(0 !important); - - p { - font-size: 14px !important; - } - - .sa-input-error { - top: 23px !important; - right: 13px !important; - } - - h2 { - font-size: 18px !important; - margin: 0 0 5px 0 !important; - line-height: 40px; - } - - button { - font-size: 15px !important; - @include border-radius(0 !important); - padding: 5px 20px !important; - } -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_expansion.scss b/MyOffice.SPA/src/assets/scss/ui/_expansion.scss deleted file mode 100644 index cc8000b..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_expansion.scss +++ /dev/null @@ -1,13 +0,0 @@ -.main-headers-align .mat-expansion-panel-header-title, -.main-headers-align .mat-expansion-panel-header-description { - flex-basis: 0; -} - -.main-headers-align .mat-expansion-panel-header-description { - justify-content: space-between; - align-items: center; -} - -.main-headers-align .mat-form-field + .mat-form-field { - margin-left: 8px; -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_listItems.scss b/MyOffice.SPA/src/assets/scss/ui/_listItems.scss deleted file mode 100644 index aaa37bc..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_listItems.scss +++ /dev/null @@ -1,26 +0,0 @@ -.icon-box { - position: relative; - line-height: 1; - padding: 8px; - border-radius: 5px; -} -.icon-box-orange { - background-color: #ffe3db; -} -.icon-box-green { - background-color: #e1fbe2; -} -.icon-box-purple { - background-color: #dfceff; -} -.icon-box-blue { - background-color: #cbe8ff; -} -.icon-box-red { - background-color: #ffe5e4; -} -.amount-section { - .material-icons { - font-size: 10px; - } -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_mediaobject.scss b/MyOffice.SPA/src/assets/scss/ui/_mediaobject.scss deleted file mode 100644 index f416071..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_mediaobject.scss +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Document : _mediaobject.scss - * Author : RedStar Template - * Description: This scss file for media object style classes - */ -.media { - margin-bottom: 25px; - margin-top: 15px; - - .media-left { - padding-right: 10px; - } - .media-body { - color: #777; - font-size: 13px; - - .media-heading { - font-size: 16px; - font-weight: bold; - color: #333; - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_modals.scss b/MyOffice.SPA/src/assets/scss/ui/_modals.scss deleted file mode 100644 index 6e9d8ed..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_modals.scss +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Document : _modals.scss - * Author : RedStar Template - * Description: This scss file for modals style classes - */ -.modal { - background-color: rgba(238, 238, 238, 0.41); - //padding: 100px 0 0; - max-height: 100%; - width: 100%; - .modal-header { - border: none; - padding: 0px; - border-bottom: 1px solid #eee; - - .modal-title { - font-weight: bold; - font-size: 16px; - } - } - - .modal-content { - border-radius: 10px; - box-shadow: 0 5px 20px rgba(0, 0, 0, 0.31) !important; - border: none; - padding: 10px; - - .modal-body { - color: #777; - padding: 15px 25px; - } - } - - .modal-footer { - border: none; - background-color: transparent; - .btn { - margin: 10px; - } - } -} -.addContainer { - display: flex; - flex-direction: column; - overflow: hidden; - .form { - display: flex; - padding-top: 6px; - } - - .mat-form-field { - flex-grow: 1; - } - .modalHeader img { - border-radius: 50%; - } -} - -.modalHeader { - display: flex; - align-items: flex-start; - // justify-content: space-between; - padding: 0px 10px 0px 10px; - margin: 10px 10px 0px 10px; - .modal-about { - padding: 5px; - font-weight: 500; - font-size: 16px; - } -} -.modal-close-button { - background-color: transparent !important; - box-shadow: none !important; - color: #161d38; - right: 10px; - position: absolute !important; -} - -@each $key, $val in $colors { - .modal-col-#{$key} { - background-color: $val; - - .modal-body, - .modal-title { - color: #fff !important; - } - - .modal-footer { - background-color: rgba(0, 0, 0, 0.12); - - .btn-link { - color: #fff !important; - - &:hover, - &:active, - &:focus { - background-color: rgba(0, 0, 0, 0.12); - } - } - } - } -} -.cdk-overlay-connected-position-bounding-box { - z-index: 1052 !important; -} -.mat-dialog-content { - margin: 0px !important; - padding: 0px !important; -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_pageloader.scss b/MyOffice.SPA/src/assets/scss/ui/_pageloader.scss deleted file mode 100644 index 0246382..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_pageloader.scss +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Document : _pageloader.scss - * Author : RedStar Template - * Description: This scss file for page loader style classes - */ -.page-loader-wrapper { - z-index: 99999999; - position: fixed; - top: 0; - left: 0; - bottom: 0; - right: 0; - width: 100%; - height: 100%; - background: #eee; - overflow: hidden; - text-align: center; - - p { - font-size: 13px; - margin-top: 10px; - font-weight: bold; - color: #444; - } - - .loader { - position: relative; - // top: calc(50% - 30px); - } -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_pagination.scss b/MyOffice.SPA/src/assets/scss/ui/_pagination.scss deleted file mode 100644 index d07c9a2..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_pagination.scss +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Document : _pagination.scss - * Author : RedStar Template - * Description: This scss file for pagination style classes - */ -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; - - li { - display: inline; - - > a { - @include border-radius(0); - border: none; - background-color: transparent; - color: #222; - font-weight: bold; - display: inline-block; - padding: 5px 14px; - } - - a:focus, - a:active { - background-color: transparent; - } - } - .previous { - > a, - > span { - float: left; - } - } - .next { - > a, - > span { - float: right; - } - } -} - -.pagination { - margin: 20px 0; - - .disabled { - a, - a:hover, - a:focus, - a:active { - color: #bbb; - } - } - - li.active { - background-color: transparent !important; - a { - background-color: #ffc107; - border-color: #ffc107; - color: #ffffff; - border-radius: 50%; - box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.2); - } - } - - li { - @include border-radius(0); - - // a:focus, - // a:active { - // background-color: transparent; - // color: #555; - // } - } - - > li { - > a { - border: none; - font-weight: bold; - color: #555; - font-size: 14px; - margin: 0px 3px; - color: gray; - margin: 5px; - border-radius: 50%; - color: gray; - min-width: 30px; - text-transform: uppercase; - padding: 0.5rem 0.75rem; - line-height: 1.25; - } - } - > li { - > a:hover { - font-weight: bold; - background-color: transparent; - color: #8c8b8b; - border-radius: 50%; - font-size: 14px; - } - } - - > li:first-child, - > li:last-child { - > a { - width: auto; - height: 32px; - @include border-radius(0); - - .material-icons { - position: relative; - bottom: 0px; - } - } - } -} - -.pagination-sm { - > li:first-child, - > li:last-child { - > a { - width: 28px; - height: 28px; - - .material-icons { - position: relative; - top: 4px; - left: -6px; - font-size: 20px; - } - } - } - > li > a, - > li > span { - padding: 5px 10px; - font-size: 12px; - } -} - -.pagination-lg { - > li:first-child, - > li:last-child { - > a { - width: 44px; - height: 44px; - - .material-icons { - font-size: 30px; - position: relative; - top: 0px; - left: -10px; - } - } - } - > li > a, - > li > span { - padding: 10px 16px; - font-size: 18px; - } -} -.page-link:focus, -.page-link:hover { - color: #65686b; - text-decoration: none; - background-color: #e3eaf1; - border-color: #e3eaf1; - border-radius: 50%; -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_panels.scss b/MyOffice.SPA/src/assets/scss/ui/_panels.scss deleted file mode 100644 index 8ecbc63..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_panels.scss +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Document : _panels.scss - * Author : RedStar Template - * Description: This scss file for panels style classes - */ -.panel-group { - @each $key, $val in $colors { - .panel-col-#{$key} { - border: 1px solid $val; - - .panel-title { - background-color: $val !important; - color: #fff; - } - - .panel-body { - border-top-color: transparent !important; - } - } - } - - .panel { - @include border-radius(0); - margin-top: 5px; - - .panel-title { - margin-bottom: 0; - font-size: 16px; - .material-icons { - float: left; - line-height: 16px; - margin-right: 8px; - } - > a, - > small, - > .small, - > small > a, - > .small > a { - color: #fff; - } - } - - .panel-heading { - padding: 0; - @include border-radius(0); - - a { - display: block; - padding: 10px 15px; - - &:hover, - &:focus, - &:active { - text-decoration: none; - } - } - } - - .panel-body { - color: #555; - border-top: 1px solid #ddd; - padding: 15px; - } - } - - .panel-primary { - border: none; - - .panel-title { - background-color: #f5f5f5; - a { - color: #757575; - font-weight: 400; - font-size: 16px; - } - } - } - - .panel-success { - border: 1px solid #2b982b; - - .panel-title { - background-color: #2b982b; - color: #fff; - } - } - - .panel-warning { - border: 1px solid #ff9600; - - .panel-title { - background-color: #ff9600; - color: #fff; - } - } - - .panel-danger { - border: 1px solid #fb483a; - - .panel-title { - background-color: #fb483a; - color: #fff; - } - } -} - -.full-body { - @each $key, $val in $colors { - .panel-col-#{$key} { - .panel-body { - border-top-color: #fff !important; - background-color: $val; - color: #fff; - } - } - } - - .panel-primary { - .panel-body { - border-top-color: #fff !important; - background-color: #7861a9; - color: #fff; - } - } - - .panel-success { - .panel-body { - border-top-color: #fff !important; - background-color: #2b982b; - color: #fff; - } - } - - .panel-warning { - .panel-body { - border-top-color: #fff !important; - background-color: #ff9600; - color: #fff; - } - } - - .panel-danger { - .panel-body { - border-top-color: #fff !important; - background-color: #fb483a; - color: #fff; - } - } -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_preloaders.scss b/MyOffice.SPA/src/assets/scss/ui/_preloaders.scss deleted file mode 100644 index 7a850c8..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_preloaders.scss +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Document : _preloaders.scss - * Author : RedStar Template - * Description: This scss file for preloaders style classes - */ -.md-preloader { - @each $key, $val in $colors { - .pl-#{$key} { - stroke: $val; - } - } -} - -.preloader { - display: inline-block; - position: relative; - width: 50px; - height: 50px; - -webkit-animation: container-rotate 1568ms linear infinite; - -moz-animation: container-rotate 1568ms linear infinite; - -o-animation: container-rotate 1568ms linear infinite; - animation: container-rotate 1568ms linear infinite; - - &.pl-size-xl { - width: 75px; - height: 75px; - } - - &.pl-size-l { - width: 60px; - height: 60px; - } - - &.pl-size-md { - width: 50px; - height: 50px; - } - - &.pl-size-sm { - width: 40px; - height: 40px; - } - - &.pl-size-xs { - width: 25px; - height: 25px; - } -} - -.spinner-layer { - position: absolute; - width: 100%; - height: 100%; - border-color: #f44336; - -ms-opacity: 1; - opacity: 1; - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) - infinite both; - -moz-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) - infinite both; - -o-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite - both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite - both; - - @each $key, $val in $colors { - &.pl-#{$key} { - border-color: $val; - } - } -} - -.right { - float: right !important; -} - -.gap-patch { - position: absolute; - top: 0; - left: 45%; - width: 10%; - height: 100%; - overflow: hidden; - border-color: inherit; - - &.circle { - width: 1000%; - left: -450%; - } -} - -.circle-clipper { - display: inline-block; - position: relative; - width: 50%; - height: 100%; - overflow: hidden; - border-color: inherit; - - .circle { - width: 200%; - height: 100%; - border-width: 3px; - border-style: solid; - border-color: inherit; - border-bottom-color: transparent !important; - -ms-border-radius: 50%; - border-radius: 50%; - -webkit-animation: none; - animation: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; - } - - &.left { - .circle { - left: 0; - border-right-color: transparent !important; - -webkit-transform: rotate(129deg); - -moz-transform: rotate(129deg); - -ms-transform: rotate(129deg); - -o-transform: rotate(129deg); - transform: rotate(129deg); - -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite - both; - -moz-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite - both; - -o-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - } - } - - &.right { - .circle { - left: -100%; - border-left-color: transparent !important; - -webkit-transform: rotate(-129deg); - -moz-transform: rotate(-129deg); - -ms-transform: rotate(-129deg); - -o-transform: rotate(-129deg); - transform: rotate(-129deg); - -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite - both; - -moz-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite - both; - -o-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - } - } -} - -@-webkit-keyframes container-rotate { - to { - -webkit-transform: rotate(360deg); - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -o-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@keyframes container-rotate { - to { - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -o-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@-webkit-keyframes fill-unfill-rotate { - 12.5% { - -webkit-transform: rotate(135deg); - transform: rotate(135deg); - } - - 25% { - -webkit-transform: rotate(270deg); - transform: rotate(270deg); - } - - 37.5% { - -webkit-transform: rotate(405deg); - transform: rotate(405deg); - } - - 50% { - -webkit-transform: rotate(540deg); - transform: rotate(540deg); - } - - 62.5% { - -webkit-transform: rotate(675deg); - transform: rotate(675deg); - } - - 75% { - -webkit-transform: rotate(810deg); - transform: rotate(810deg); - } - - 87.5% { - -webkit-transform: rotate(945deg); - transform: rotate(945deg); - } - - to { - -webkit-transform: rotate(1080deg); - transform: rotate(1080deg); - } -} - -@keyframes fill-unfill-rotate { - 12.5% { - transform: rotate(135deg); - } - - 25% { - transform: rotate(270deg); - } - - 37.5% { - transform: rotate(405deg); - } - - 50% { - transform: rotate(540deg); - } - - 62.5% { - transform: rotate(675deg); - } - - 75% { - transform: rotate(810deg); - } - - 87.5% { - transform: rotate(945deg); - } - - to { - transform: rotate(1080deg); - } -} - -@-webkit-keyframes left-spin { - from { - -webkit-transform: rotate(130deg); - -moz-transform: rotate(130deg); - -ms-transform: rotate(130deg); - -o-transform: rotate(130deg); - transform: rotate(130deg); - } - - 50% { - -webkit-transform: rotate(-5deg); - -moz-transform: rotate(-5deg); - -ms-transform: rotate(-5deg); - -o-transform: rotate(-5deg); - transform: rotate(-5deg); - } - - to { - -webkit-transform: rotate(130deg); - -moz-transform: rotate(130deg); - -ms-transform: rotate(130deg); - -o-transform: rotate(130deg); - transform: rotate(130deg); - } -} - -@keyframes left-spin { - from { - -moz-transform: rotate(130deg); - -ms-transform: rotate(130deg); - -o-transform: rotate(130deg); - -webkit-transform: rotate(130deg); - transform: rotate(130deg); - } - - 50% { - -moz-transform: rotate(-5deg); - -ms-transform: rotate(-5deg); - -o-transform: rotate(-5deg); - -webkit-transform: rotate(-5deg); - transform: rotate(-5deg); - } - - to { - -moz-transform: rotate(130deg); - -ms-transform: rotate(130deg); - -o-transform: rotate(130deg); - -webkit-transform: rotate(130deg); - transform: rotate(130deg); - } -} - -@-webkit-keyframes right-spin { - from { - -webkit-transform: rotate(-130deg); - -moz-transform: rotate(-130deg); - -ms-transform: rotate(-130deg); - -o-transform: rotate(-130deg); - transform: rotate(-130deg); - } - - 50% { - -webkit-transform: rotate(5deg); - -moz-transform: rotate(5deg); - -ms-transform: rotate(5deg); - -o-transform: rotate(5deg); - transform: rotate(5deg); - } - - to { - -webkit-transform: rotate(-130deg); - -moz-transform: rotate(-130deg); - -ms-transform: rotate(-130deg); - -o-transform: rotate(-130deg); - transform: rotate(-130deg); - } -} - -@-moz-keyframes right-spin { - from { - -moz-transform: rotate(-130deg); - -ms-transform: rotate(-130deg); - -o-transform: rotate(-130deg); - -webkit-transform: rotate(-130deg); - transform: rotate(-130deg); - } - - 50% { - -moz-transform: rotate(5deg); - -ms-transform: rotate(5deg); - -o-transform: rotate(5deg); - -webkit-transform: rotate(5deg); - transform: rotate(5deg); - } - - to { - -moz-transform: rotate(-130deg); - -ms-transform: rotate(-130deg); - -o-transform: rotate(-130deg); - -webkit-transform: rotate(-130deg); - transform: rotate(-130deg); - } -} - -@keyframes right-spin { - from { - -moz-transform: rotate(-130deg); - -ms-transform: rotate(-130deg); - -o-transform: rotate(-130deg); - -webkit-transform: rotate(-130deg); - transform: rotate(-130deg); - } - - 50% { - -moz-transform: rotate(5deg); - -ms-transform: rotate(5deg); - -o-transform: rotate(5deg); - -webkit-transform: rotate(5deg); - transform: rotate(5deg); - } - - to { - -moz-transform: rotate(-130deg); - -ms-transform: rotate(-130deg); - -o-transform: rotate(-130deg); - -webkit-transform: rotate(-130deg); - transform: rotate(-130deg); - } -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_progressbars.scss b/MyOffice.SPA/src/assets/scss/ui/_progressbars.scss deleted file mode 100644 index c597502..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_progressbars.scss +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Document : _progressbars.scss - * Author : RedStar Template - * Description: This scss file for progress bars style classes - */ - -.mat-mdc-progress-bar { - &.progress-xs { - height: 4px; - } - &.progress-s { - height: 5px; - } - &.progress-m { - height: 10px; - .mdc-linear-progress__bar-inner { - border-top-width: var(--mdc-linear-progress-track-height, 10px); - } - } - &.progress-l { - height: 15px; - .mdc-linear-progress__bar-inner { - border-top-width: 15px; - } - } - - &.progress-round { - border-radius: 7px; - } - - &.green-progress .mdc-linear-progress__bar-inner { - border-color: #0af30a !important; - } - &.sky-progress .mdc-linear-progress__bar-inner { - border-color: #248afd !important; - } - &.orange-progress .mdc-linear-progress__bar-inner { - border-color: #ffc100 !important; - } - &.red-progress .mdc-linear-progress__bar-inner { - border-color: #ff4747 !important; - } - - &.l-green-progress .mdc-linear-progress__bar-inner { - background: #11998e; /* fallback for old browsers */ - background: -webkit-linear-gradient( - to right, - #38ef7d, - #11998e - ); /* Chrome 10-25, Safari 5.1-6 */ - background: linear-gradient( - to right, - #38ef7d, - #11998e - ); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */ - } - &.l-sky-progress .mat-progress-bar-fill::after { - background: #36d1dc; /* fallback for old browsers */ - background: -webkit-linear-gradient( - to right, - #5b86e5, - #36d1dc - ); /* Chrome 10-25, Safari 5.1-6 */ - background: linear-gradient( - to right, - #5b86e5, - #36d1dc - ); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */ - } - &.l-orange-progress .mat-progress-bar-fill::after { - background: #f12711; /* fallback for old browsers */ - background: -webkit-linear-gradient( - to right, - #f5af19, - #f12711 - ); /* Chrome 10-25, Safari 5.1-6 */ - background: linear-gradient( - to right, - #f5af19, - #f12711 - ); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */ - } - &.l-red-progress .mat-progress-bar-fill::after { - background: #ff416c; /* fallback for old browsers */ - background: -webkit-linear-gradient( - to right, - #ff4b2b, - #ff416c - ); /* Chrome 10-25, Safari 5.1-6 */ - background: linear-gradient( - to right, - #ff4b2b, - #ff416c - ); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */ - } - &.l-purple-progress .mat-progress-bar-fill::after { - background: #7f00ff; /* fallback for old browsers */ - background: -webkit-linear-gradient( - to right, - #e100ff, - #7f00ff - ); /* Chrome 10-25, Safari 5.1-6 */ - background: linear-gradient( - to right, - #e100ff, - #7f00ff - ); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */ - } - - &.progress-shadow { - box-shadow: 0.4rem 0.4rem 0.8rem rgb(0 0 0 / 10%); - } -} - -.progress-list { - position: relative; - - .status { - display: inline-block; - font-size: 12px; - padding: 6px; - position: absolute; - right: 0; - top: 0; - } -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_slider.scss b/MyOffice.SPA/src/assets/scss/ui/_slider.scss deleted file mode 100644 index a7b85e1..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_slider.scss +++ /dev/null @@ -1,3 +0,0 @@ -mat-slider { - width: 300px; -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_snackbar.scss b/MyOffice.SPA/src/assets/scss/ui/_snackbar.scss deleted file mode 100644 index c845b43..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_snackbar.scss +++ /dev/null @@ -1,19 +0,0 @@ -.mat-mdc-snack-bar-container.snackbar-success .mdc-snackbar__surface { - background-color: rgba(24, 206, 15, 0.8); - color: #ffffff; -} - -.mat-mdc-snack-bar-container.snackbar-info .mdc-snackbar__surface { - background-color: rgba(44, 168, 255, 0.8); - color: #ffffff; -} - -.mat-mdc-snack-bar-container.snackbar-warning .mdc-snackbar__surface { - background-color: rgba(255, 230, 0, 0.8); - color: #ffffff; -} - -.mat-mdc-snack-bar-container.snackbar-danger .mdc-snackbar__surface { - background-color: rgba(255, 0, 0, 0.8); - color: #ffffff; -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_tabs.scss b/MyOffice.SPA/src/assets/scss/ui/_tabs.scss deleted file mode 100644 index ff4da90..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_tabs.scss +++ /dev/null @@ -1,29 +0,0 @@ -.example-small-box, -.example-large-box { - display: flex; - align-items: center; - justify-content: center; - margin: 16px; - padding: 16px; - border-radius: 8px; -} - -.example-small-box { - height: 100px; - width: 100px; -} - -.example-large-box { - height: 300px; - width: 300px; -} -.appointment-tab-box { - background-color: #eff1f7; - width: 100%; - padding: 10px; -} -.tab-header { - color: #555; - padding: 15px; - position: relative; -} diff --git a/MyOffice.SPA/src/assets/scss/ui/_tooltippopovers.scss b/MyOffice.SPA/src/assets/scss/ui/_tooltippopovers.scss deleted file mode 100644 index 56e4d01..0000000 --- a/MyOffice.SPA/src/assets/scss/ui/_tooltippopovers.scss +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Document : _tooltippopovers.scss - * Author : RedStar Template - * Description: This scss file for tooltip pop overs style classes - */ -.tooltip { - font-size: 13px; - - .tooltip-inner { - @include border-radius(0); - } -} - -.popover { - @include border-radius(0); - border: 1px solid rgba(0, 0, 0, 0.08); - - .popover-title { - font-weight: bold; - @include border-radius(0); - background-color: #e9e9e9; - border-bottom: 1px solid #ddd; - } - - .popover-content { - font-size: 13px; - color: #777; - @include border-radius(0); - } -} diff --git a/MyOffice.SPA/src/environments/environment.docker.ts b/MyOffice.SPA/src/environments/environment.docker.ts deleted file mode 100644 index cfff301..0000000 --- a/MyOffice.SPA/src/environments/environment.docker.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Browser → host ports (defaults; Docker build may overwrite via API_PUBLIC_URL). -export const environment = { - production: true, - apiUrl: 'http://localhost:32081', - identityServer: 'http://localhost:32081/', - allowedUrls: ['http://localhost:32081'], - // Plain HTTP demo stack — do not require HTTPS for OIDC. - requireHttps: false, - externalLogins: { - google: { - clientId: '' - }, - auth0: { - clientId: '', - domain: '' - } - } -}; diff --git a/MyOffice.SPA/src/environments/environment.proxmox.ts b/MyOffice.SPA/src/environments/environment.proxmox.ts deleted file mode 100644 index 943991a..0000000 --- a/MyOffice.SPA/src/environments/environment.proxmox.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Same-origin Proxmox deploy: API serves SPA from wwwroot (one public URL). -// Empty apiUrl / identityServer / allowedUrls → resolved at runtime from window.location.origin. -export const environment = { - production: true, - apiUrl: '', - identityServer: '', - allowedUrls: [] as string[], - requireHttps: false, - externalLogins: { - google: { - clientId: '' - }, - auth0: { - clientId: '', - domain: '' - } - } -}; diff --git a/MyOffice.SPA/src/environments/environment.sample.ts b/MyOffice.SPA/src/environments/environment.sample.ts deleted file mode 100644 index 66395af..0000000 --- a/MyOffice.SPA/src/environments/environment.sample.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Copy to environment.ts for local development (environment.ts is gitignored). -export const environment = { - production: false, - apiUrl: 'http://localhost:9100', - identityServer: 'http://localhost:9100/', - allowedUrls: ['http://localhost:9100'], - externalLogins: { - google: { - clientId: '' - }, - auth0: { - clientId: '', - domain: '' - } - } -}; diff --git a/MyOffice.SPA/src/favicon.ico b/MyOffice.SPA/src/favicon.ico deleted file mode 100644 index 997406ad22c29aae95893fb3d666c30258a09537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 - - - - MyOffice - - - - - - - - - - - diff --git a/MyOffice.SPA/src/main.ts b/MyOffice.SPA/src/main.ts deleted file mode 100644 index 2a48f56..0000000 --- a/MyOffice.SPA/src/main.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { bootstrapApplication } from '@angular/platform-browser'; - -import { AppComponent } from './app/app.component'; -import { appConfig } from './app/app.config'; - -bootstrapApplication(AppComponent, appConfig) - .catch(err => console.error(err)); diff --git a/MyOffice.SPA/src/polyfills.ts b/MyOffice.SPA/src/polyfills.ts deleted file mode 100644 index f85b963..0000000 --- a/MyOffice.SPA/src/polyfills.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes recent versions of Safari, Chrome (including - * Opera), Edge on the desktop, and iOS and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/MyOffice.SPA/src/proxy.conf.js b/MyOffice.SPA/src/proxy.conf.js deleted file mode 100644 index 62ba391..0000000 --- a/MyOffice.SPA/src/proxy.conf.js +++ /dev/null @@ -1,15 +0,0 @@ -const PROXY_CONFIG = [ - { - context: [ - '/api', - '/authorize', - '/.well-known', - '/connect', - '/weatherforecast', - ], - target: 'http://localhost:9100', - secure: false - } -]; - -module.exports = PROXY_CONFIG; diff --git a/MyOffice.SPA/src/silent-refresh.html b/MyOffice.SPA/src/silent-refresh.html deleted file mode 100644 index 0c2ab58..0000000 --- a/MyOffice.SPA/src/silent-refresh.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - diff --git a/MyOffice.SPA/src/styles.scss b/MyOffice.SPA/src/styles.scss deleted file mode 100644 index 008c901..0000000 --- a/MyOffice.SPA/src/styles.scss +++ /dev/null @@ -1,68 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ - -.mdc-text-field--disabled.mdc-text-field--filled { - background-color: #4c4f57; -} - -@keyframes spinner { - to { - transform: rotate(360deg); - } -} - -.spinner:before { - content: ''; - box-sizing: border-box; - position: absolute; - top: 50%; - left: 50%; - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - border-radius: 50%; - border: 2px solid #ffffff; - border-top-color: #000000; - animation: spinner .8s linear infinite; -} - -.mat-dialog-actions { - display: grid !important; - grid-template-columns: 1fr auto !important; - align-items: center !important; -} - -.mat-dialog-actions { - display: grid !important; - grid-template-columns: 1fr auto !important; - align-items: center !important; -} - -.mat-dialog-left { - display: flex !important; - align-items: center !important; -} - -.error-icon { - margin-right: 8px !important; -} - -.error-message { - margin: 0 !important; - overflow: auto !important; -} - -.mat-dialog-right { - display: flex !important; - justify-content: flex-end !important; - align-items: center !important; -} - -.button-bottom { - display: flex !important; - align-items: center !important; -} - -.button-bottom button { - margin-left: 8px !important; -} diff --git a/MyOffice.SPA/src/styles/_variables.scss b/MyOffice.SPA/src/styles/_variables.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/styles/global.scss b/MyOffice.SPA/src/styles/global.scss deleted file mode 100644 index 6c384d0..0000000 --- a/MyOffice.SPA/src/styles/global.scss +++ /dev/null @@ -1,277 +0,0 @@ -@import '@angular/material/theming'; -@include mat-core(); - -/* You can add global styles to this file, and also import other style files */ -html, body { - height: 100%; -} - -body { - margin: 0; - font-family: Roboto, "Helvetica Neue", sans-serif; -} - -.app-header { - justify-content: space-between; - position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 2; - box-shadow: 0 3px 5px -1px rgba(0, 0, 0, .2), 0 6px 10px 0 rgba(0, 0, 0, .14), 0 1px 18px 0 rgba(0, 0, 0, .12); -} - -.login-wrapper { - height: 100%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.mat-card-content-center { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; -} - -.primary-content { - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - min-width: 600px; - padding: 30px 40px 30px 40px; -} - -.box { - position: relative; - top: 0; - opacity: 1; - float: left; - padding: 30px 40px 30px 40px; - width: 100%; - background: #fff; - border-radius: 10px; - transform: scale(1); - -webkit-transform: scale(1); - -ms-transform: scale(1); - z-index: 5; - max-width: 330px; -} - -.box.back { - transform: scale(.95); - -webkit-transform: scale(.95); - -ms-transform: scale(.95); - top: -20px; - opacity: .8; - z-index: -1; -} - -.box:before { - content: ""; - width: 100%; - height: 30px; - border-radius: 10px; - position: absolute; - top: -10px; - background: rgba(255, 255, 255, .6); - left: 0; - transform: scale(.95); - -webkit-transform: scale(.95); - -ms-transform: scale(.95); - z-index: -1; -} - -mat-form-field { - width: 350px !important; -} - -.mat-mdc-form-field-infix { -} - -/* margins */ -.m-5 { - margin: 5px; -} - -.m-10 { - margin: 10px; -} - -.m-15 { - margin: 15px; -} - -.m-20 { - margin: 20px; -} - -.m-25 { - margin: 25px; -} - -.m-30 { - margin: 30px; -} - -.mt-5 { - margin-top: 5px; -} - -.mt-10 { - margin-top: 10px; -} - -.mt-15 { - margin-top: 15px; -} - -.mt-20 { - margin-top: 20px; -} - -.mt-25 { - margin-top: 25px; -} - -.mt-30 { - margin-top: 30px; -} - -.mb-5 { - margin-bottom: 5px; -} - -.mb-10 { - margin-bottom: 10px; -} - -.mb-15 { - margin-bottom: 15px; -} - -.mb-20 { - margin-bottom: 20px; -} - -.mb-25 { - margin-bottom: 25px; -} - -.mb-30 { - margin-bottom: 30px; -} - -.ml-5 { - margin-left: 5px; -} - -.ml-10 { - margin-left: 10px; -} - -.ml-15 { - margin-left: 15px; -} - -.ml-20 { - margin-left: 20px; -} - -.ml-25 { - margin-left: 25px; -} - -.ml-30 { - margin-left: 30px; -} - -.mr-5 { - margin-right: 5px; -} - -.mr-10 { - margin-right: 10px; -} - -.mr-15 { - margin-right: 15px; -} - -.mr-20 { - margin-right: 20px; -} - -.mr-25 { - margin-right: 25px; -} - -.mr-30 { - margin-right: 30px; -} - -.ml-a { - margin-left: auto; -} -/* paddings */ - -/* min-width */ -.w-50 { - width: 50px; -} - -.w-75 { - width: 75px; -} - -.w-100 { - width: 100px; -} - -.w-100p { - width: 100%; -} - -/* min-width */ -.mw-50 { - min-width: 50px; -} - -.mw-75 { - min-width: 75px; -} - -.mw-100 { - min-width: 100px; -} - -.mw-50-imp { - min-width: 50px !important; -} - -.mw-75-imp { - min-width: 75px !important; -} - -.mw-100-imp { - min-width: 100px !important; -} - -.fl-l { - float: left -} - -.fl-r { - float: right -} - -/* colors */ - -$primary: mat-palette($mat-blue,800); - -.color-warn { - color: mat-color($primary, default); -} diff --git a/MyOffice.SPA/src/styles/reset.scss b/MyOffice.SPA/src/styles/reset.scss deleted file mode 100644 index e69de29..0000000 diff --git a/MyOffice.SPA/src/styles/styles.scss b/MyOffice.SPA/src/styles/styles.scss deleted file mode 100644 index b794247..0000000 --- a/MyOffice.SPA/src/styles/styles.scss +++ /dev/null @@ -1,18 +0,0 @@ -@import "src/styles/_variables"; - -// Import functions, variables, and mixins needed by other Bootstrap files -@import "bootstrap/scss/functions"; -@import "bootstrap/scss/variables"; -@import "bootstrap/scss/maps"; -@import "bootstrap/scss/mixins"; - -// Import Bootstrap Reboot -@import "bootstrap/scss/root"; // Contains :root CSS variables used by other Bootstrap files -@import "bootstrap/scss/reboot"; - -@import "bootstrap/scss/containers"; // Add .container and .container-fluid classes -@import "bootstrap/scss/grid"; // Add the grid system - -@import "src/styles/reset"; - -@import "src/styles/global"; diff --git a/MyOffice.SPA/src/test.ts b/MyOffice.SPA/src/test.ts deleted file mode 100644 index ffa954b..0000000 --- a/MyOffice.SPA/src/test.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import 'zone.js/testing'; -import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting -} from '@angular/platform-browser-dynamic/testing'; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting(), -); diff --git a/MyOffice.SPA/tsconfig.app.json b/MyOffice.SPA/tsconfig.app.json deleted file mode 100644 index 90880d5..0000000 --- a/MyOffice.SPA/tsconfig.app.json +++ /dev/null @@ -1,15 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "files": [ - "src/main.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.d.ts" - ] -} diff --git a/MyOffice.SPA/tsconfig.json b/MyOffice.SPA/tsconfig.json deleted file mode 100644 index 1c3bc1b..0000000 --- a/MyOffice.SPA/tsconfig.json +++ /dev/null @@ -1,35 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "moduleResolution": "node", - "importHelpers": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "target": "ES2022", - "module": "es2020", - "lib": [ - "es2020", - "dom" - ], - "useDefineForClassFields": false - }, - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "strictTemplates": true - } -} diff --git a/MyOffice.SPA/tsconfig.spec.json b/MyOffice.SPA/tsconfig.spec.json deleted file mode 100644 index c1fdd7e..0000000 --- a/MyOffice.SPA/tsconfig.spec.json +++ /dev/null @@ -1,18 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/spec", - "types": [ - "jasmine" - ] - }, - "files": [ - "src/test.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.spec.ts", - "src/**/*.d.ts" - ] -} diff --git a/MyOffice.Services/Account/AccountAcl.cs b/MyOffice.Services/Account/AccountAcl.cs deleted file mode 100644 index f1b5eef..0000000 --- a/MyOffice.Services/Account/AccountAcl.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace MyOffice.Services.Account; - -using Data.Models.Accounts; - -///

-/// Account access checks shared by service mutations (motions, settings, invites). -/// -public static class AccountAcl -{ - public static AccountAccess? GetUserAccess(Account account, Guid userId) => - account.AccessRights?.FirstOrDefault(x => x.UserId == userId); - - public static bool CanWrite(Account account, Guid userId) => - GetUserAccess(account, userId)?.IsAllowWrite == true; - - public static bool CanManage(Account account, Guid userId) => - GetUserAccess(account, userId)?.IsAllowManage == true; -} diff --git a/MyOffice.Services/Account/AccountMotionBalancing.cs b/MyOffice.Services/Account/AccountMotionBalancing.cs deleted file mode 100644 index 66870f9..0000000 --- a/MyOffice.Services/Account/AccountMotionBalancing.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace MyOffice.Services.Account; - -/// -/// Rules for counterparty (transfer) motion amounts when balancing between accounts. -/// -public static class AccountMotionBalancing -{ - /// - /// When the primary motion is income (Plus != 0), balancing is expense on the other account. - /// Otherwise balancing is income on the other account. - /// - public static (decimal Plus, decimal Minus) ResolveAmounts(decimal primaryPlus, decimal amountBalancing) - { - if (primaryPlus != 0) - { - return (0, amountBalancing); - } - - return (amountBalancing, 0); - } - - public static string BalancingItemName(string accountName) => $"+{accountName}"; -} diff --git a/MyOffice.Services/Account/AccountService.Access.cs b/MyOffice.Services/Account/AccountService.Access.cs deleted file mode 100644 index 6b8fc4a..0000000 --- a/MyOffice.Services/Account/AccountService.Access.cs +++ /dev/null @@ -1,214 +0,0 @@ -namespace MyOffice.Services.Account; - -using System.Collections.Generic; - -using Core; -using Core.Extensions; -using Data.Models.Accounts; -using Domain; - -public partial class AccountService -{ - public async Task> AccessInviteAsync( - Guid userId, - Guid accountId, - string email, - bool isAllowWrite, - CancellationToken cancellationToken = default) - { - if (email == null) - throw new ArgumentNullException(nameof(email)); - - var result = new Exec(AccessInviteStatus.success); - - var account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - if (account == null) - { - return result.Set(AccessInviteStatus.account_not_found); - } - - if (!CanManage(account, userId)) - { - return result.Set(AccessInviteStatus.forbidden); - } - - if (account.AccessRights!.Any(x => x.User!.Email.EqualsIgnoreCase(email))) - { - return result.Set(AccessInviteStatus.access_exists); - } - - var access = await _accountAccessInviteRepository.GetAsync(userId, email, cancellationToken); - if (access != null) - { - return result.Set(AccessInviteStatus.invite_exists); - } - - var invite = new AccountAccessInvite - { - Id = Guid.NewGuid(), - CreatedOn = DateTime.UtcNow, - UserId = userId, - AccountId = account.Id, - Email = email.SafeTrim()!, - IsAllowWrite = isAllowWrite, - }; - - await _accountAccessInviteRepository.AddAsync(invite, cancellationToken); - - return result.Set(_mapper.Map(invite)); - } - - public async Task> AccessUpdateAsync( - Guid userId, - Guid accountId, - List accesses, - CancellationToken cancellationToken = default) - { - if (accesses == null) - throw new ArgumentNullException(nameof(accesses)); - - var result = new Exec(GeneralExecStatus.success); - - var account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - if (account == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - if (!CanManage(account, userId)) - { - return result.Set(GeneralExecStatus.forbidden); - } - - foreach (var access in account.AccessRights!) - { - var newAccess = accesses.FirstOrDefault(x => x.UserId == access.UserId); - if (newAccess != null && newAccess.IsAllowWrite != access.IsAllowWrite) - { - access.IsAllowWrite = newAccess.IsAllowWrite; - await _accountAccessRepository.UpdateAsync(access, cancellationToken); - } - } - - account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - - return result.Set(_mapper.Map(account)); - } - - public async Task> AccessDeleteAsync( - Guid userId, - Guid accountId, - Guid accessUserId, - CancellationToken cancellationToken = default) - { - var result = new Exec(GeneralExecStatus.success); - - var account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - if (account == null || !account.AccessRights!.Any() || account.AccessRights!.Count() == 1) - { - return result.Set(GeneralExecStatus.not_found); - } - - if (!CanManage(account, userId)) - { - return result.Set(GeneralExecStatus.forbidden); - } - - var access = account.AccessRights!.FirstOrDefault(x => x.UserId == accessUserId); - if (access == null) - { - return result.Set(GeneralExecStatus.not_found); - } - if (access.OwnerId == access.UserId) - { - return result.Set(GeneralExecStatus.not_found); - } - - await _accountAccessRepository.DeleteAsync(access, cancellationToken); - - account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - - return result.Set(_mapper.Map(account)); - - } - - public async Task> InvitesGetAsync(string email, CancellationToken cancellationToken = default) - { - var invites = await _accountAccessInviteRepository.GetActiveAsync(email, cancellationToken); - - return _mapper.Map>(invites); - } - - public async Task> InviteAcceptAsync( - Guid userId, - Guid id, - string name, - CancellationToken cancellationToken = default) - { - var result = new Exec(InviteAcceptStatus.success); - - var invite = await _accountAccessInviteRepository.GetAsync(id, cancellationToken); - if (invite == null - || !invite.Email.EqualsIgnoreCase(_contextProvider.User.Email) - || invite.AcceptedOn.HasValue - || invite.RejectedOn.HasValue - ) - { - return result.Set(InviteAcceptStatus.invite_not_found); - } - - var account = await _accountRepository.GetAsync(invite.UserId, invite.AccountId, cancellationToken); - if (account == null) - { - return result.Set(InviteAcceptStatus.account_not_found); - } - - if (account.AccessRights!.Any(x => x.UserId == userId)) - { - result.Set(InviteAcceptStatus.already_accepted); - } - else - { - await _accountAccessRepository.AddAsync(new AccountAccess - { - UserId = userId, - AccountId = account.Id, - OwnerId = invite.UserId, - Name = name, - IsAllowRead = true, - IsAllowWrite = invite.IsAllowWrite, - IsAllowManage = false, - Type = AccountAccessTypeEnum.external, - }, cancellationToken); - } - - invite.AcceptedOn = DateTime.UtcNow; - await _accountAccessInviteRepository.UpdateAsync(invite, cancellationToken); - - account = await _accountRepository.GetAsync(userId, account.Id, cancellationToken); - - return result.Set(_mapper.Map(account)); - } - - public async Task> InviteRejectAsync( - Guid id, - CancellationToken cancellationToken = default) - { - var result = new Exec(GeneralExecStatus.success); - - var invite = await _accountAccessInviteRepository.GetAsync(id, cancellationToken); - if (invite == null - || !invite.Email.EqualsIgnoreCase(_contextProvider.User.Email) - || invite.AcceptedOn.HasValue - || invite.RejectedOn.HasValue - ) - { - return result.Set(GeneralExecStatus.not_found); - } - - invite.RejectedOn = DateTime.UtcNow; - await _accountAccessInviteRepository.UpdateAsync(invite, cancellationToken); - - return result.Set(_mapper.Map(invite)); - } -} diff --git a/MyOffice.Services/Account/AccountService.AccessRights.cs b/MyOffice.Services/Account/AccountService.AccessRights.cs deleted file mode 100644 index ea0f42f..0000000 --- a/MyOffice.Services/Account/AccountService.AccessRights.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace MyOffice.Services.Account; - -using Data.Models.Accounts; - -public partial class AccountService -{ - private static AccountAccess? GetUserAccess(Account account, Guid userId) => - AccountAcl.GetUserAccess(account, userId); - - private static bool CanWrite(Account account, Guid userId) => - AccountAcl.CanWrite(account, userId); - - private static bool CanManage(Account account, Guid userId) => - AccountAcl.CanManage(account, userId); -} diff --git a/MyOffice.Services/Account/AccountService.Account.cs b/MyOffice.Services/Account/AccountService.Account.cs deleted file mode 100644 index 13f9a47..0000000 --- a/MyOffice.Services/Account/AccountService.Account.cs +++ /dev/null @@ -1,270 +0,0 @@ -namespace MyOffice.Services.Account; - -using MyOffice.Core; -using MyOffice.Core.Extensions; -using MyOffice.Data.Models.Accounts; -using MyOffice.Services.Account.Domain; - -public partial class AccountService -{ - public async Task> GetAllAccountsAsync(Guid userId, CancellationToken cancellationToken = default) - { - var accounts = await _accountRepository.GetAllAsync(userId, cancellationToken); - - return accounts.ToDto(_mapper); - } - - public async Task> GetByCategoryAsync(Guid userId, Guid categoryId, CancellationToken cancellationToken = default) - { - var accounts = await _accountRepository.GetByCategoryAsync(userId, categoryId, cancellationToken); - - return accounts.ToDto(_mapper); - } - - public async Task> FindAccountsAsync(Guid userId, string term, CancellationToken cancellationToken = default) - { - var accounts = await _accountRepository.FindAccountsAsync(userId, term, cancellationToken); - - return accounts.ToDto(_mapper); - } - - public List GetByCategoryDetailed(Guid userId, Guid categoryId) - { - return _accountRepository - .GetByCategoryDetailed(userId, categoryId) - .ToDto(_mapper); - } - - public async Task> GetByCategoryDetailedAsync( - Guid userId, - Guid categoryId, - CancellationToken cancellationToken = default - ) - { - var list = await _accountRepository.GetByCategoryDetailedAsync(userId, categoryId, cancellationToken); - return list.ToDto(_mapper); - } - - public Exec GetByIdDetailed(Guid userId, Guid id) - { - var result = new Exec(GeneralExecStatus.success); - - var account = _accountRepository.GetByIdDetailed(userId, id); - if (account == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - return result.Set(account.ToDto(_mapper));; - } - - public async Task> GetByIdDetailedAsync( - Guid userId, - Guid id, - CancellationToken cancellationToken = default - ) - { - var result = new Exec(GeneralExecStatus.success); - - var account = await _accountRepository.GetByIdDetailedAsync(userId, id, cancellationToken); - if (account == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - return result.Set(account.ToDto(_mapper)); - } - - public async Task> AccountAddAsync( - Guid userId, - AccountAdd input, - CancellationToken cancellationToken = default - ) - { - if (input == null) - throw new ArgumentNullException(nameof(input)); - - var result = new Exec(AccountAddStatus.success); - - var category = await _accountCategoryRepository.GetAsync(userId, input.CategoryId, cancellationToken); - if (category == null) - { - return result.Set(AccountAddStatus.category_not_found); - } - var currency = await _currencyRepository.GetByGlobalCurrencyAsync(userId, input.CurrencyId, cancellationToken); - if (currency == null) - { - return result.Set(AccountAddStatus.currency_not_found); - } - - var account = new Account - { - Id = Guid.NewGuid(), - Name = input.Name, - CurrencyGlobalId = currency.CurrencyGlobalId, - OwnerId = userId, - }; - - account.Categories = new List - { - new() - { - AccountId = account.Id, - CategoryId = category.Id, - } - }; - account.AccessRights = new List - { - new() - { - AccountId = account.Id, - UserId = userId, - OwnerId = userId, - IsAllowManage = true, - IsAllowRead = true, - IsAllowWrite = true, - } - }; - - if (!await _accountRepository.AddAsync(account, cancellationToken)) - { - return result.Set(AccountAddStatus.failure); - } - // TODO: Add category refactoring - if (!await _accountAccountCategoryRepository.AddAsync(account.Categories.FirstOrDefault()!, cancellationToken)) - { - return result.Set(AccountAddStatus.failure); - } - // TODO: Add access refactoring - if (!await _accountAccessRepository.AddAsync(account.AccessRights.FirstOrDefault()!, cancellationToken)) - { - return result.Set(AccountAddStatus.failure); - } - - // TODO: Add account update AccessRights ??? - var access = account.AccessRights!.FirstOrDefault(x => x.UserId == userId); - if (access != null && access.Type.ToString() != input.Type) - { - if (Enum.TryParse(input.Type, out var enumType)) - { - access.Type = enumType; - await _accountAccessRepository.UpdateAsync(access, cancellationToken); - } - } - - return result.Set(account.ToDto(_mapper)); - } - - public async Task> AccountDeleteAsync( - Guid userId, - string id, - CancellationToken cancellationToken = default - ) - { - var result = new Exec(GeneralExecStatus.success); - - var account = await _accountRepository.GetAsync(userId, id.AsGuid(), cancellationToken); - if (account == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - if (!CanManage(account, userId)) - { - return result.Set(GeneralExecStatus.forbidden); - } - - if (account.Motions!.Any()) - { - return result.Set(GeneralExecStatus.not_found); - } - - await _accountRepository.DeleteAsync(account, cancellationToken); - result.Set(account.ToDto(_mapper)); - - return result; - } - - public async Task> AccountUpdateAsync( - Guid userId, - Guid accountId, - AccountEdit input, - CancellationToken cancellationToken = default - ) - { - if (input == null) - throw new ArgumentNullException(nameof(input)); - - var result = new Exec(AccountEditStatus.success); - - AccountCategory? category = null; - if (input.CategoryId.HasValue) - { - category = await _accountCategoryRepository.GetAsync(userId, input.CategoryId.Value, cancellationToken); - if (category == null) - { - return result.Set(AccountEditStatus.category_not_found); - } - } - - var currency = await _currencyRepository.GetByGlobalCurrencyAsync(userId, input.CurrencyId, cancellationToken); - if (currency == null) - { - return result.Set(AccountEditStatus.currency_not_found); - } - - var account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - if (account == null) - { - return result.Set(AccountEditStatus.not_found); - } - - if (!CanManage(account, userId)) - { - return result.Set(AccountEditStatus.forbidden); - } - - account.Name = input.Name; - if (account.CurrencyGlobalId != currency.CurrencyGlobalId) - { - account.CurrencyGlobalId = currency.CurrencyGlobalId; - } - - AccountAccountCategory? addedLink = null; - if (category != null && account.Categories!.All(x => x.CategoryId != category.Id)) - { - addedLink = new AccountAccountCategory - { - AccountId = account.Id, - CategoryId = category.Id, - Category = category, - }; - await _accountAccountCategoryRepository.AddAsync(addedLink, cancellationToken); - } - - if (!await _accountRepository.UpdateAsync(account, cancellationToken)) - { - return result.Set(AccountEditStatus.failure); - } - - var access = account.AccessRights!.FirstOrDefault(x => x.UserId == userId); - if (access != null && access.Type.ToString() != input.Type) - { - if (Enum.TryParse(input.Type, out var enumType)) - { - access.Type = enumType; - await _accountAccessRepository.UpdateAsync(access, cancellationToken); - } - } - - // AddAsync detaches the link and does not refresh Account.Categories — keep response in sync. - if (addedLink != null && (account.Categories?.All(x => x.CategoryId != addedLink.CategoryId) ?? true)) - { - account.Categories = (account.Categories ?? Enumerable.Empty()) - .Append(addedLink) - .ToList(); - } - - return result.Set(account.ToDto(_mapper)); - } -} diff --git a/MyOffice.Services/Account/AccountService.AccountCategory.cs b/MyOffice.Services/Account/AccountService.AccountCategory.cs deleted file mode 100644 index 028ed68..0000000 --- a/MyOffice.Services/Account/AccountService.AccountCategory.cs +++ /dev/null @@ -1,147 +0,0 @@ -namespace MyOffice.Services.Account; - -using MyOffice.Core; -using MyOffice.Data.Models.Accounts; -using MyOffice.Services.Account.Domain; - -public partial class AccountService -{ - public async Task> GetAllCategoriesAsync(Guid userId, CancellationToken cancellationToken = default) - { - var categories = await _accountCategoryRepository.GetAllAsync(userId, cancellationToken); - - return _mapper.Map>(categories); - } - - public async Task> GetCategoryAsync( - Guid userId, - Guid id, - CancellationToken cancellationToken = default) - { - var result = new Exec(GeneralExecStatus.success); - - var category = await _accountCategoryRepository.GetAsync(userId, id, cancellationToken); - - if (category == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - return result.Set(_mapper.Map(category)); - } - - public async Task> CategoryAddAsync( - Guid userId, - AccountCategoryDto input, - CancellationToken cancellationToken = default) - { - if (input == null) - throw new ArgumentNullException(nameof(input)); - - var result = new Exec(GeneralExecStatus.success); - - var category = new AccountCategory - { - Id = Guid.NewGuid(), - UserId = userId, - Name = input.Name, - }; - - if (!await _accountCategoryRepository.AddAsync(category, cancellationToken)) - { - return result.Set(GeneralExecStatus.failure); - } - - return result.Set(_mapper.Map(category)); - } - - public async Task> CategoryUpdateAsync( - Guid userId, - Guid id, - AccountCategoryDto input, - CancellationToken cancellationToken = default) - { - if (input == null) - throw new ArgumentNullException(nameof(input)); - - var result = new Exec(GeneralExecStatus.success); - - var exists = await _accountCategoryRepository.GetAsync(userId, id, cancellationToken); - if (exists == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - exists.Name = input.Name; - - if (!await _accountCategoryRepository.UpdateAsync(exists, cancellationToken)) - { - return result.Set(GeneralExecStatus.failure); - } - - return result.Set(_mapper.Map(exists)); - } - - public async Task> CategoryRemoveAsync( - Guid userId, - Guid id, - CancellationToken cancellationToken = default) - { - var result = new Exec(AccountCategoryRemoveResult.success); - - var exists = await _accountCategoryRepository.GetAsync(userId, id, cancellationToken); - if (exists == null) - { - return result.Set(AccountCategoryRemoveResult.not_found); - } - - if (exists.Accounts?.Any() == true) - { - return result.Set(AccountCategoryRemoveResult.accounts_exists); - } - if (!await _accountCategoryRepository.RemoveAsync(exists, cancellationToken)) - { - return result.Set(AccountCategoryRemoveResult.failure); - } - - return result.Set(_mapper.Map(exists)); - } - - public async Task> AccountCategoryRemoveAsync( - Guid userId, - Guid accountId, - Guid categoryId, - CancellationToken cancellationToken = default) - { - var result = new Exec(GeneralExecStatus.success); - - var account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - if (account == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - if (!CanManage(account, userId)) - { - return result.Set(GeneralExecStatus.forbidden); - } - - var links = await _accountAccountCategoryRepository.GetAsync(userId, accountId, categoryId, cancellationToken); - if (links.Count == 0) - { - return result.Set(GeneralExecStatus.not_found); - } - - foreach (var link in links) - { - await _accountAccountCategoryRepository.RemoveAsync(link, cancellationToken); - } - - // Account stays tracked after Remove; filter in-memory so the response is not stale. - account.Categories = account.Categories? - .Where(c => c.CategoryId != categoryId) - .ToList(); - - return result.Set(account.ToDto(_mapper)); - } -} diff --git a/MyOffice.Services/Account/AccountService.Motion.cs b/MyOffice.Services/Account/AccountService.Motion.cs deleted file mode 100644 index ec030ce..0000000 --- a/MyOffice.Services/Account/AccountService.Motion.cs +++ /dev/null @@ -1,212 +0,0 @@ -namespace MyOffice.Services.Account; - -using System.Collections.Generic; - -using Core; -using Core.Extensions; -using Data.Models.Accounts; -using Domain; -using Item.Domain; - -public partial class AccountService -{ - public async Task, MotionAddStatus>> MotionAddAsync( - Guid userId, - Guid accountId, - MotionAddUpdate motion, - CancellationToken cancellationToken = default - ) - { - if (motion == null) - throw new ArgumentNullException(nameof(motion)); - if (motion.Item == null) - throw new ArgumentNullException(nameof(motion.Item)); - - var result = new Exec, MotionAddStatus>(MotionAddStatus.success); - - var account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - if (account == null) - { - return result.Set(MotionAddStatus.account_not_found); - } - - if (!CanWrite(account, userId)) - { - return result.Set(MotionAddStatus.forbidden); - } - - var itemExec = await _itemService.GetOrCreateAsync(userId, motion.Item, cancellationToken); - if (itemExec.Status != ItemGetOrAddResult.success) - { - return result.Set(MotionAddStatus.failure); - } - - var motionDb = new Motion - { - Id = Guid.NewGuid(), - CreatedOn = DateTime.UtcNow, - DateTime = motion.Date, - AccountId = account.Id, - ItemId = itemExec.Result!.Id, - Description = motion.Description, - AmountPlus = motion.Plus, - AmountMinus = motion.Minus, - }; - - if (!await _motionRepository.AddAsync(motionDb, cancellationToken)) - { - return result.Set(MotionAddStatus.failure); - } - - result.Set(new List()); - result.Result!.Add(_mapper.Map(motionDb)); - - if (motion.AccountId.IsPresent() && motion.AmountBalancing != 0) - { - var accountBalancing = await _accountRepository.GetAsync( - userId, - motion.AccountId!.AsGuid(), - cancellationToken); - if (accountBalancing != null && CanWrite(accountBalancing, userId)) - { - var balancingName = AccountMotionBalancing.BalancingItemName(account.Name); - var itemBalancingExec = await _itemService.GetOrCreateAsync( - userId, - balancingName, - cancellationToken); - var (plus, minus) = AccountMotionBalancing.ResolveAmounts(motion.Plus, motion.AmountBalancing); - var motionBalancing = new Motion - { - Id = Guid.NewGuid(), - CreatedOn = DateTime.UtcNow, - DateTime = motion.Date, - AccountId = accountBalancing.Id, - ItemId = itemBalancingExec.Result!.Id, - Description = motion.Description, - AmountPlus = plus, - AmountMinus = minus, - }; - - if (await _motionRepository.AddAsync(motionBalancing, cancellationToken)) - { - result.Result!.Add(_mapper.Map(motionBalancing)); - } - } - } - - motionDb.Item = itemExec.Result!; - - return result; - } - - public async Task> MotionUpdateAsync( - Guid userId, - Guid accountId, - Guid motionId, - MotionAddUpdate motion, - CancellationToken cancellationToken = default - ) - { - if (motion == null) - throw new ArgumentNullException(nameof(motion)); - if (motion.Item == null) - throw new ArgumentNullException(nameof(motion.Item)); - - var result = new Exec(MotionUpdateStatus.success); - - var exists = await _motionRepository.GetAsync(userId, motionId, cancellationToken); - if (exists == null || exists.AccountId != accountId) - { - return result.Set(MotionUpdateStatus.not_found); - } - - var account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - if (account == null) - { - return result.Set(MotionUpdateStatus.not_found); - } - - if (!CanWrite(account, userId)) - { - return result.Set(MotionUpdateStatus.forbidden); - } - - var itemExec = await _itemService.GetOrCreateAsync(userId, motion.Item, cancellationToken); - if (itemExec.Status != ItemGetOrAddResult.success) - { - return result.Set(MotionUpdateStatus.failure); - } - - exists.Item.Id = itemExec.Result!.Id; - exists.DateTime = motion.Date; - exists.Description = motion.Description; - exists.AmountPlus = motion.Plus; - exists.AmountMinus = motion.Minus; - - if (!await _motionRepository.UpdateAsync(exists, cancellationToken)) - { - return result.Set(MotionUpdateStatus.failure); - } - - return result.Set(_mapper.Map(exists)); - } - - public async Task, GeneralExecStatus>> GetMotionsAsync( - Guid userId, - Guid accountId, - DateTime dateFrom, - DateTime dateTo, - CancellationToken cancellationToken = default - ) - { - var result = new Exec, GeneralExecStatus>(GeneralExecStatus.success); - - var account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - if (account == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - var motions = await _motionRepository.GetByAccountAsync( - accountId, - dateFrom.ToUtc(), - dateTo.ToUtc(), - cancellationToken); - - return result.Set(_mapper.Map>(motions)); - } - - public async Task> MotionRemoveAsync( - Guid userId, - Guid accountId, - Guid motionId, - CancellationToken cancellationToken = default - ) - { - var result = new Exec(MotionDeleteStatus.success); - - var exists = await _motionRepository.GetAsync(userId, motionId, cancellationToken); - if (exists == null || exists.AccountId != accountId) - { - return result.Set(MotionDeleteStatus.not_found); - } - - var account = await _accountRepository.GetAsync(userId, accountId, cancellationToken); - if (account == null) - { - return result.Set(MotionDeleteStatus.not_found); - } - - if (!CanWrite(account, userId)) - { - return result.Set(MotionDeleteStatus.forbidden); - } - - if (!await _motionRepository.RemoveAsync(exists, cancellationToken)) - { - return result.Set(MotionDeleteStatus.failure); - } - - return result.Set(_mapper.Map(exists)); - } -} diff --git a/MyOffice.Services/Account/AccountService.cs b/MyOffice.Services/Account/AccountService.cs deleted file mode 100644 index 361d2f1..0000000 --- a/MyOffice.Services/Account/AccountService.cs +++ /dev/null @@ -1,58 +0,0 @@ -namespace MyOffice.Services.Account; - -using AutoMapper; -using Microsoft.Extensions.Logging; - -using Identity; -using Data.Repositories.Account; -using Data.Repositories.Currency; -using Data.Repositories.Item; -using Item; - -public partial class AccountService -{ - private ILogger _logger; - private readonly IMapper _mapper; - private readonly IAccountCategoryRepository _accountCategoryRepository; - private readonly IAccountAccessRepository _accountAccessRepository; - private readonly IAccountAccessInviteRepository _accountAccessInviteRepository; - private readonly IAccountRepository _accountRepository; - private readonly ICurrencyRepository _currencyRepository; - private readonly IAccountAccountCategoryRepository _accountAccountCategoryRepository; - private readonly IMotionRepository _motionRepository; - private readonly IItemRepository _itemRepository; - private readonly IItemGlobalRepository _itemGlobalRepository; - private readonly ItemService _itemService; - private readonly IContextProvider _contextProvider; - - public AccountService( - ILogger logger, - IMapper mapper, - IAccountCategoryRepository accountCategoryRepository, - IAccountAccessRepository accountAccessRepository, - IAccountAccessInviteRepository accountAccessInviteRepository, - IAccountRepository accountRepository, - ICurrencyRepository currencyRepository, - IAccountAccountCategoryRepository accountAccountCategoryRepository, - IMotionRepository motionRepository, - IItemRepository itemRepository, - IItemGlobalRepository itemGlobalRepository, - ItemService itemService, - IContextProvider contextProvider - ) - { - _logger = logger; - _mapper = mapper; - _accountCategoryRepository = accountCategoryRepository; - _accountAccessRepository = accountAccessRepository; - _accountAccessInviteRepository = accountAccessInviteRepository; - _accountRepository = accountRepository; - _currencyRepository = currencyRepository; - _accountAccountCategoryRepository = accountAccountCategoryRepository; - _motionRepository = motionRepository; - _itemRepository = itemRepository; - _itemGlobalRepository = itemGlobalRepository; - _itemService = itemService; - _contextProvider = contextProvider; - } -} diff --git a/MyOffice.Services/Account/Domain/AccessInviteStatus.cs b/MyOffice.Services/Account/Domain/AccessInviteStatus.cs deleted file mode 100644 index f058a87..0000000 --- a/MyOffice.Services/Account/Domain/AccessInviteStatus.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Services.Account.Domain; - -public enum AccessInviteStatus -{ - success, - account_not_found, - access_exists, - invite_exists, - forbidden, -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/AccountAccessDto.cs b/MyOffice.Services/Account/Domain/AccountAccessDto.cs deleted file mode 100644 index a103cd0..0000000 --- a/MyOffice.Services/Account/Domain/AccountAccessDto.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace MyOffice.Services.Account.Domain; - -using AutoMapper; -using Data.Models.Accounts; -using MyOffice.Services.Identity; - -public class AccountAccessDto -{ - public Guid AccountId { get; set; } - public AccountDto? Account { get; set; } - - /// - /// User can access to account - /// - public Guid UserId { get; set; } - public UserDto? User { get; set; } - - public bool IsAllowRead { get; set; } - public bool IsAllowWrite { get; set; } - public bool IsAllowManage { get; set; } - public bool IsOwner { get; set; } - public AccountAccessTypeEnum Type { get; set; } - /// - /// Who add access - /// - public Guid OwnerId { get; set; } - public UserDto? Owner { get; set; } - public string? Name { get; set; } -} - -public class AccountAccessDtoProfile : Profile -{ - public AccountAccessDtoProfile() - { - CreateMap() - .AfterMap() - ; - } -} - -public class AccountAccessDtoMappingAction : IMappingAction -{ - private readonly IContextProvider _contextProvider; - public AccountAccessDtoMappingAction(IContextProvider contextProvider) - { - _contextProvider = contextProvider; - } - - public void Process(AccountAccess source, AccountAccessDto destination, ResolutionContext context) - { - destination.IsOwner = destination.OwnerId == _contextProvider.UserId; - } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/AccountAccessInviteDto.cs b/MyOffice.Services/Account/Domain/AccountAccessInviteDto.cs deleted file mode 100644 index 8145d76..0000000 --- a/MyOffice.Services/Account/Domain/AccountAccessInviteDto.cs +++ /dev/null @@ -1,22 +0,0 @@ -/// -namespace MyOffice.Services.Account.Domain; - -using AutoMapper; -using Data.Models.Accounts; - -public class AccountAccessInviteDto -{ - public string Id { get; set; } = null!; - public string Account { get; set; } = null!; - public bool IsAllowWrite { get; set; } -} - -public class AccountAccessInviteDtoProfile: Profile -{ - public AccountAccessInviteDtoProfile() - { - CreateMap() - .ForMember(x => x.Account, o => o.MapFrom(x => x.Account!.Name)) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/AccountAccountCategoryDto.cs b/MyOffice.Services/Account/Domain/AccountAccountCategoryDto.cs deleted file mode 100644 index 1867802..0000000 --- a/MyOffice.Services/Account/Domain/AccountAccountCategoryDto.cs +++ /dev/null @@ -1,19 +0,0 @@ -/// -namespace MyOffice.Services.Account.Domain; - -using AutoMapper; -using MyOffice.Data.Models.Accounts; - -public class AccountAccountCategoryDto -{ - public Guid CategoryId { get; set; } - public AccountCategoryDto? Category { get; set; } = null!; -} - -public class AccountAccountCategoryDtoProfile: Profile -{ - public AccountAccountCategoryDtoProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/AccountAdd.cs b/MyOffice.Services/Account/Domain/AccountAdd.cs deleted file mode 100644 index 1077830..0000000 --- a/MyOffice.Services/Account/Domain/AccountAdd.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Services.Account.Domain -{ - public class AccountAdd - { - public string Name { get; set; } = null!; - public string CurrencyId { get; set; } = null!; - public Guid CategoryId { get; set; } - public string Type { get; set; } = null!; - } -} diff --git a/MyOffice.Services/Account/Domain/AccountAddStatus.cs b/MyOffice.Services/Account/Domain/AccountAddStatus.cs deleted file mode 100644 index b50b045..0000000 --- a/MyOffice.Services/Account/Domain/AccountAddStatus.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Services.Account.Domain -{ - public enum AccountAddStatus - { - success, - failure, - category_not_found, - currency_not_found, - } -} diff --git a/MyOffice.Services/Account/Domain/AccountCategoryDto.cs b/MyOffice.Services/Account/Domain/AccountCategoryDto.cs deleted file mode 100644 index 545115a..0000000 --- a/MyOffice.Services/Account/Domain/AccountCategoryDto.cs +++ /dev/null @@ -1,24 +0,0 @@ -/// -namespace MyOffice.Services.Account.Domain; - -using AutoMapper; -using MyOffice.Data.Models.Accounts; - -public class AccountCategoryDto -{ - public Guid Id { get; set; } - public Guid UserId { get; set; } - public string Name { get; set; } = null!; - public bool AllowDelete { get; set; } -} - -public class AccountCategoryDtoProfile: Profile -{ - public AccountCategoryDtoProfile() - { - CreateMap() - .ForMember(x => x.Id, o => o.MapFrom(x => x.Id)) - .ForMember(x => x.AllowDelete, o => o.MapFrom(x => !x.Accounts!.Any())) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/AccountCategoryRemoveResult.cs b/MyOffice.Services/Account/Domain/AccountCategoryRemoveResult.cs deleted file mode 100644 index 8f9909c..0000000 --- a/MyOffice.Services/Account/Domain/AccountCategoryRemoveResult.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Services.Account.Domain -{ - public enum AccountCategoryRemoveResult - { - success, - failure, - not_found, - accounts_exists, - } -} diff --git a/MyOffice.Services/Account/Domain/AccountDetailedDto.cs b/MyOffice.Services/Account/Domain/AccountDetailedDto.cs deleted file mode 100644 index 4ed39a6..0000000 --- a/MyOffice.Services/Account/Domain/AccountDetailedDto.cs +++ /dev/null @@ -1,22 +0,0 @@ -/// -namespace MyOffice.Services.Account.Domain; - -using AutoMapper; -using MyOffice.Core; -using MyOffice.Data.Models.Accounts; - -public class AccountDetailedDto: IDataModelDto -{ - public AccountDto Account { get; set; } = null!; - public decimal TotalPlus { get; set; } - public decimal TotalMinus { get; set; } - public decimal Rest => TotalPlus - TotalMinus; -} - -public class AccountDetailedDtoProfile: Profile -{ - public AccountDetailedDtoProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/AccountDto.cs b/MyOffice.Services/Account/Domain/AccountDto.cs deleted file mode 100644 index ab816d7..0000000 --- a/MyOffice.Services/Account/Domain/AccountDto.cs +++ /dev/null @@ -1,79 +0,0 @@ -namespace MyOffice.Services.Account.Domain; - -using System; -using Data.Models.Accounts; -using MyOffice.Services.Currency.Domain; -using AutoMapper; -using MyOffice.Services.Identity; -using MyOffice.Core; -using MyOffice.Services.Mapper; - -[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false)] -public class GenerateMappedDtoAttribute: Attribute -{ - public GenerateMappedDtoAttribute() - { - } -} - -[GenerateMappedDto] -public class AccountDto : IDataModelDto -{ - #region Account properties - - public Guid Id { get; set; } - public string CurrencyGlobalId { get; set; } = null!; - public CurrencyGlobalDto? CurrencyGlobal { get; set; } - public string Name { get; set; } = null!; - public Guid OwnerId { get; set; } - public UserDto? Owner { get; set; } - - #endregion Account properties - - #region Dto properties - - public Guid CurrencyId { get; set; } - public CurrencyDto? Currency { get; set; } - public string Type { get; set; } = null!; - public List? Categories { get; set; } - - public bool HasMotions { get; set; } - - #endregion Dto properties - - #region Permissions - - public List? AccessRights { get; set; } - public bool AllowRead { get; set; } - public bool AllowWrite { get; set; } - public bool AllowDelete { get; set; } - public bool AllowManage { get; set; } - - #endregion Permissions -} - -public class AccountDtoProfile : BaseProfile -{ - public AccountDtoProfile() - { - Mapping - .ForMember(x => x.HasMotions, o => o.MapFrom(x => x.Motions!.Any())) - .AfterMap(); - } -} - -public class AccountDtoMappingAction : BaseMappingAction, IMappingAction -{ - public AccountDtoMappingAction(IContextProvider contextProvider) : base(contextProvider) { } - - public void Process(Account source, AccountDto destination, ResolutionContext context) - { - var accessRight = destination.AccessRights?.FirstOrDefault(x => x.UserId == ContextProvider.UserId); - destination.AllowRead = accessRight?.IsAllowRead ?? false; - destination.AllowWrite = accessRight?.IsAllowWrite ?? false; - destination.AllowManage = accessRight?.IsAllowManage ?? false; - destination.AllowDelete = (accessRight?.IsOwner ?? false) && !destination.HasMotions; - destination.Name = accessRight?.Name ?? destination.Name; - destination.Type = accessRight != null ? accessRight.Type.ToString() : destination.Type; - } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/AccountEdit.cs b/MyOffice.Services/Account/Domain/AccountEdit.cs deleted file mode 100644 index 8a19d69..0000000 --- a/MyOffice.Services/Account/Domain/AccountEdit.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Services.Account.Domain; - -public class AccountEdit -{ - public string Name { get; set; } = null!; - public string CurrencyId { get; set; } = null!; - public Guid? CategoryId { get; set; } - public Guid? UserId { get; set; } - public string? Type { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/AccountEditStatus.cs b/MyOffice.Services/Account/Domain/AccountEditStatus.cs deleted file mode 100644 index f74f74a..0000000 --- a/MyOffice.Services/Account/Domain/AccountEditStatus.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MyOffice.Services.Account.Domain; - -public enum AccountEditStatus -{ - success, - failure, - not_found, - category_not_found, - currency_not_found, - forbidden, -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/InviteAcceptStatus.cs b/MyOffice.Services/Account/Domain/InviteAcceptStatus.cs deleted file mode 100644 index cfec492..0000000 --- a/MyOffice.Services/Account/Domain/InviteAcceptStatus.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Services.Account.Domain -{ - public enum InviteAcceptStatus - { - success, - invite_not_found, - account_not_found, - already_accepted, - } -} diff --git a/MyOffice.Services/Account/Domain/ItemCategoryDto.cs b/MyOffice.Services/Account/Domain/ItemCategoryDto.cs deleted file mode 100644 index c7b76a3..0000000 --- a/MyOffice.Services/Account/Domain/ItemCategoryDto.cs +++ /dev/null @@ -1,23 +0,0 @@ -/// -namespace MyOffice.Services.Account.Domain; - -using AutoMapper; -using MyOffice.Data.Models.Items; - -public class ItemCategoryDto -{ - public Guid Id { get; set; } - public Guid UserId { get; set; } - public UserDto User { get; set; } = null!; - public string Name { get; set; } = null!; - public List Items { get; set; } = null!; - public bool IsInternal { get; set; } -} - -public class ItemCategoryDtoProfile: Profile -{ - public ItemCategoryDtoProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/ItemDto.cs b/MyOffice.Services/Account/Domain/ItemDto.cs deleted file mode 100644 index 357c601..0000000 --- a/MyOffice.Services/Account/Domain/ItemDto.cs +++ /dev/null @@ -1,27 +0,0 @@ -/// -namespace MyOffice.Services.Account.Domain; - -using AutoMapper; -using MyOffice.Data.Models.Items; - -public class ItemDto -{ - public Guid Id { get; set; } - public string? Name { get; set; } - public bool AllowDelete { get; set; } - - public Guid CategoryId { get; set; } - public ItemCategoryDto? Category { get; set; } -} - -public class ItemDtoProfile: Profile -{ - public ItemDtoProfile() - { - CreateMap() - .ForMember(x => x.Id, o => o.MapFrom(x => x.ItemGlobalId)) - .ForMember(x => x.Name, o => o.MapFrom(x => x.ItemGlobal.Name)) - .ForMember(x => x.AllowDelete, o => o.MapFrom(x => !x.Motions!.Any())) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/MotionAddStatus.cs b/MyOffice.Services/Account/Domain/MotionAddStatus.cs deleted file mode 100644 index b06969a..0000000 --- a/MyOffice.Services/Account/Domain/MotionAddStatus.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MyOffice.Services.Account.Domain; - -public enum MotionAddStatus -{ - success, - failure, - account_not_found, - forbidden, -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/MotionAddUpdate.cs b/MyOffice.Services/Account/Domain/MotionAddUpdate.cs deleted file mode 100644 index 473dbc9..0000000 --- a/MyOffice.Services/Account/Domain/MotionAddUpdate.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace MyOffice.Services.Account.Domain; - -using AutoMapper; - -public class MotionAddUpdate -{ - public DateTime Date { get; set; } - public string Item { get; set; } = null!; - public string? ItemId { get; set; } = null!; - public string? AccountId { get; set; } = null!; - public string? Description { get; set; } - public decimal Plus { get; set; } - public decimal Minus { get; set; } - public decimal AmountBalancing { get; set; } -} - -public class MotionAddUpdateProfile: Profile -{ - public MotionAddUpdateProfile() - { - } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/MotionDeleteStatus.cs b/MyOffice.Services/Account/Domain/MotionDeleteStatus.cs deleted file mode 100644 index d049b94..0000000 --- a/MyOffice.Services/Account/Domain/MotionDeleteStatus.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MyOffice.Services.Account.Domain; - -public enum MotionDeleteStatus -{ - success, - failure, - not_found, - forbidden, -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/MotionDto.cs b/MyOffice.Services/Account/Domain/MotionDto.cs deleted file mode 100644 index cc2aaed..0000000 --- a/MyOffice.Services/Account/Domain/MotionDto.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace MyOffice.Services.Account.Domain; - -using AutoMapper; -using MyOffice.Data.Models.Accounts; - -public class MotionDto -{ - public Guid Id { get; set; } - public DateTime CreatedOn { get; set; } - public DateTime DateTime { get; set; } - public Guid AccountId { get; set; } - public AccountDto Account { get; set; } = null!; - public int ItemId { get; set; } - public ItemDto Item { get; set; } = null!; - public string? Description { get; set; } - public decimal AmountPlus { get; set; } - public decimal AmountMinus { get; set; } - public DateTime? DeletedOn { get; set; } -} - -public class MotionDtoProfile: Profile -{ - public MotionDtoProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/MotionUpdateStatus.cs b/MyOffice.Services/Account/Domain/MotionUpdateStatus.cs deleted file mode 100644 index f7f1985..0000000 --- a/MyOffice.Services/Account/Domain/MotionUpdateStatus.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MyOffice.Services.Account.Domain; - -public enum MotionUpdateStatus -{ - success, - failure, - not_found, - forbidden, -} \ No newline at end of file diff --git a/MyOffice.Services/Account/Domain/UserDto.cs b/MyOffice.Services/Account/Domain/UserDto.cs deleted file mode 100644 index b6939e9..0000000 --- a/MyOffice.Services/Account/Domain/UserDto.cs +++ /dev/null @@ -1,28 +0,0 @@ -/// -namespace MyOffice.Services.Account.Domain; - -using AutoMapper; -using MyOffice.Data.Models.Users; -using MyOffice.Services.Currency.Domain; - -public class UserDto -{ - public Guid Id { get; set; } - public string UserName { get; set; } = null!; - public string Email { get; set; } = null!; - public string? FirstName { get; set; } - public string? LastName { get; set; } - public string? FullName { get; set; } - public string? Phone { get; set; } - - public string CurrencyId { get; set; } = null!; - public CurrencyGlobalDto? Currency { get; set; } -} - -public class UserDtoProfile : Profile -{ - public UserDtoProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Services/Currency/CurrencyService.cs b/MyOffice.Services/Currency/CurrencyService.cs deleted file mode 100644 index 4662147..0000000 --- a/MyOffice.Services/Currency/CurrencyService.cs +++ /dev/null @@ -1,202 +0,0 @@ -namespace MyOffice.Services.Currency; - -using AutoMapper; - -using Core; -using Data.Models.Currencies; -using Data.Repositories.Currency; -using Domain; - -public class CurrencyService -{ - private readonly ICurrencyGlobalRepository _currencyGlobalRepository; - private readonly ICurrencyRepository _currencyRepository; - private readonly ICurrencyRateRepository _currencyRateRepository; - private readonly IMapper _mapper; - - public CurrencyService( - ICurrencyGlobalRepository currencyGlobalRepository, - ICurrencyRepository currencyRepository, - ICurrencyRateRepository currencyRateRepository, - IMapper mapper - ) - { - _currencyGlobalRepository = currencyGlobalRepository; - _currencyRepository = currencyRepository; - _currencyRateRepository = currencyRateRepository; - _mapper = mapper; - } - - public async Task> GetGlobalAllAsync(CancellationToken cancellationToken = default) - { - return _mapper.Map>(await _currencyGlobalRepository.GetAllAsync(cancellationToken)); - } - - public async Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default) - { - return _mapper.Map>(await _currencyRepository.GetAllAsync(userId, cancellationToken)); - } - - public async Task> GetAllWithRatesAsync(Guid userId, CancellationToken cancellationToken = default) - { - var list = await _currencyRepository.GetAllAsync(userId, cancellationToken); - - var result = new List(list.Count); - foreach (var currency in list) - { - var rates = await _currencyRateRepository.GetLastRatesAsync(currency.Id, cancellationToken: cancellationToken); - result.Add(new CurrencyWithRateDto - { - Currency = _mapper.Map(currency), - Rate = _mapper.Map(rates.FirstOrDefault()), - }); - } - - return result; - } - - public async Task> CurrencyAddAsync( - Guid userId, - CurrencyDto input, - CancellationToken cancellationToken = default) - { - if (input == null) - throw new ArgumentNullException(nameof(input)); - - var result = new Exec(CurrencyAddStatus.success); - - var exists = await _currencyRepository.GetByGlobalCurrencyAsync(userId, input.CurrencyGlobalId, cancellationToken); - if (exists != null) - { - return result.Set(_mapper.Map(exists), CurrencyAddStatus.exists); - } - - var currency = new Currency - { - Id = Guid.NewGuid(), - UserId = userId, - CurrencyGlobalId = input.CurrencyGlobalId, - Name = input.Name, - ShortName = input.ShortName, - }; - - if (!await _currencyRepository.AddAsync(currency, cancellationToken)) - { - return result.Set(CurrencyAddStatus.failed); - } - - return result.Set(_mapper.Map(currency)); - } - - public async Task> CurrencyUpdateAsync( - Guid userId, - Guid currencyId, - CurrencyEdit currency, - CancellationToken cancellationToken = default) - { - if (currency == null) - throw new ArgumentNullException(nameof(currency)); - - var result = new Exec(CurrencyEditStatus.success); - - var exists = await _currencyRepository.GetAsync(userId, currencyId, cancellationToken); - if (exists == null) - { - return result.Set(CurrencyEditStatus.not_found); - } - - exists.Name = currency.Name; - exists.ShortName = currency.ShortName; - exists.IsPrimary = currency.IsPrimary; - - if (!await _currencyRepository.UpdateAsync(exists, cancellationToken)) - { - return result.Set(CurrencyEditStatus.failed); - } - - if (exists.IsPrimary) - { - var primaries = await _currencyRepository.GetPrimariesAsync(userId, cancellationToken); - foreach (var primary in primaries) - { - if (primary.Id != exists.Id) - { - primary.IsPrimary = false; - await _currencyRepository.UpdateAsync(primary, cancellationToken); - } - } - } - - return result.Set(_mapper.Map(exists)); - } - - public async Task> CurrencyRateAddAsync( - Guid userId, - Guid currencyId, - CurrencyRateDto input, - CancellationToken cancellationToken = default) - { - if (input == null) - throw new ArgumentNullException(nameof(input)); - - var result = new Exec(CurrencyAddRateStatus.success); - - var currency = await _currencyRepository.GetAsync(userId, currencyId, cancellationToken); - if (currency == null) - { - return result.Set(CurrencyAddRateStatus.not_found); - } - - var currencyRate = new CurrencyRate - { - CurrencyId = currency.Id, - DateTime = input.DateTime.Date, - Rate = input.Rate, - Quantity = input.Quantity, - }; - - var rates = await _currencyRateRepository.GetAtDateAsync(currencyRate.CurrencyId, currencyRate.DateTime, cancellationToken); - var rate = rates.Find(x => x.Rate == currencyRate.Rate); - - if (rate == null) - { - if (!await _currencyRateRepository.AddRateAsync(currencyRate, cancellationToken)) - { - return result.Set(CurrencyAddRateStatus.failed); - } - - // TODO: more logic to fix current rate - if (currencyRate.DateTime.Date == DateTime.UtcNow.Date || !currency.CurrentRateId.HasValue) - { - currency.CurrencyGlobal = null; - currency.CurrentRateId = currencyRate.Id; - await _currencyRepository.UpdateAsync(currency, cancellationToken); - } - - rate = currencyRate; - } - - return result.Set(_mapper.Map(rate)); - } - - public async Task> RemoveAsync( - Guid userId, - Guid id, - CancellationToken cancellationToken = default) - { - var result = new Exec(GeneralExecStatus.success); - - var currency = await _currencyRepository.GetAsync(userId, id, cancellationToken); - if (currency == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - if (!await _currencyRepository.RemoveAsync(currency, cancellationToken)) - { - return result.Set(GeneralExecStatus.failure); - } - - return result.Set(_mapper.Map(currency)); - } -} diff --git a/MyOffice.Services/Currency/Domain/CurrencyAddRateStatus.cs b/MyOffice.Services/Currency/Domain/CurrencyAddRateStatus.cs deleted file mode 100644 index 088ac18..0000000 --- a/MyOffice.Services/Currency/Domain/CurrencyAddRateStatus.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MyOffice.Services.Currency.Domain; - -public enum CurrencyAddRateStatus -{ - not_found, - success, - failed, -} \ No newline at end of file diff --git a/MyOffice.Services/Currency/Domain/CurrencyAddStatus.cs b/MyOffice.Services/Currency/Domain/CurrencyAddStatus.cs deleted file mode 100644 index 0c375ce..0000000 --- a/MyOffice.Services/Currency/Domain/CurrencyAddStatus.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MyOffice.Services.Currency.Domain -{ - public enum CurrencyAddStatus - { - success, - failed, - exists, - } -} diff --git a/MyOffice.Services/Currency/Domain/CurrencyDto.cs b/MyOffice.Services/Currency/Domain/CurrencyDto.cs deleted file mode 100644 index dbedf23..0000000 --- a/MyOffice.Services/Currency/Domain/CurrencyDto.cs +++ /dev/null @@ -1,32 +0,0 @@ -/// -namespace MyOffice.Services.Currency.Domain; - -using AutoMapper; -using MyOffice.Data.Models.Currencies; -using MyOffice.Services.Account.Domain; - -public class CurrencyDto -{ - public Guid Id { get; set; } - public string CurrencyGlobalId { get; set; } = null!; - public CurrencyGlobalDto? CurrencyGlobal { get; set; } - public Guid UserId { get; set; } - public UserDto? User { get; set; } - - public string Name { get; set; } = null!; - public string ShortName { get; set; } = null!; - public List? Rates { get; set; } - - public int? CurrentRateId { get; set; } - public CurrencyRateDto? CurrentRate { get; set; } - - public bool IsPrimary { get; set; } -} - -public class CurrencyDtoProfile: Profile -{ - public CurrencyDtoProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Services/Currency/Domain/CurrencyEdit.cs b/MyOffice.Services/Currency/Domain/CurrencyEdit.cs deleted file mode 100644 index ddbdad7..0000000 --- a/MyOffice.Services/Currency/Domain/CurrencyEdit.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MyOffice.Services.Currency.Domain; - -public class CurrencyEdit -{ - public string Name { get; set; } = null!; - public string ShortName { get; set; } = null!; - public bool IsPrimary { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Services/Currency/Domain/CurrencyEditStatus.cs b/MyOffice.Services/Currency/Domain/CurrencyEditStatus.cs deleted file mode 100644 index 6ca41e4..0000000 --- a/MyOffice.Services/Currency/Domain/CurrencyEditStatus.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MyOffice.Services.Currency.Domain; - -public enum CurrencyEditStatus -{ - success, - not_found, - failed, -} \ No newline at end of file diff --git a/MyOffice.Services/Currency/Domain/CurrencyGlobalDto.cs b/MyOffice.Services/Currency/Domain/CurrencyGlobalDto.cs deleted file mode 100644 index 7cdaa7f..0000000 --- a/MyOffice.Services/Currency/Domain/CurrencyGlobalDto.cs +++ /dev/null @@ -1,21 +0,0 @@ -/// -namespace MyOffice.Services.Currency.Domain; - -using AutoMapper; -using MyOffice.Data.Models.Currencies; - -public class CurrencyGlobalDto -{ - public string Id { get; set; } = null!; - public string Name { get; set; } = null!; - public string Symbol { get; set; } = null!; - public int DefaultQuantity { get; set; } -} - -public class CurrencyGlobalDtoProfile: Profile -{ - public CurrencyGlobalDtoProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Services/Currency/Domain/CurrencyRateDto.cs b/MyOffice.Services/Currency/Domain/CurrencyRateDto.cs deleted file mode 100644 index 60e2f07..0000000 --- a/MyOffice.Services/Currency/Domain/CurrencyRateDto.cs +++ /dev/null @@ -1,24 +0,0 @@ -/// -namespace MyOffice.Services.Currency.Domain; - -using AutoMapper; -using MyOffice.Data.Models.Currencies; - -public class CurrencyRateDto -{ - public int Id { get; set; } - public Guid CurrencyId { get; set; } - public CurrencyDto? Currency { get; set; } - public DateTime DateTime { get; set; } - public int Quantity { get; set; } - public decimal Rate { get; set; } - public List? Currencies { get; set; } -} - -public class CurrencyRateDtoProfile : Profile -{ - public CurrencyRateDtoProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Services/Currency/Domain/CurrencyWithRateDto.cs b/MyOffice.Services/Currency/Domain/CurrencyWithRateDto.cs deleted file mode 100644 index 3aba6e2..0000000 --- a/MyOffice.Services/Currency/Domain/CurrencyWithRateDto.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MyOffice.Services.Currency.Domain; - -using MyOffice.Data.Models.Currencies; - -public class CurrencyWithRateDto -{ - public CurrencyDto Currency { get; set; } = null!; - public CurrencyRateDto? Rate { get; set; } -} diff --git a/MyOffice.Services/Dashboard/DashboardService.cs b/MyOffice.Services/Dashboard/DashboardService.cs deleted file mode 100644 index a09d500..0000000 --- a/MyOffice.Services/Dashboard/DashboardService.cs +++ /dev/null @@ -1,160 +0,0 @@ -namespace MyOffice.Services.Dashboard; - -using Core.Extensions; -using Data.Repositories.Account; -using Data.Repositories.Currency; -using MyOffice.Data.Models.Accounts; -using MyOffice.Services.Dashboard.Domain; - -public class DashboardService -{ - private readonly IAccountRepository _accountRepository; - private readonly ICurrencyRateRepository _currencyRateRepository; - - public DashboardService( - IAccountRepository accountRepository, - ICurrencyRateRepository currencyRateRepository - ) - { - _accountRepository = accountRepository; - _currencyRateRepository = currencyRateRepository; - } - - public async Task GetDashboardRestDataAsync( - Guid userId, - CancellationToken cancellationToken = default - ) - { - var rests = await _accountRepository.GetRestAtDateAsync(userId, DateTime.UtcNow, cancellationToken); - - return new DashboardData - { - Balance = rests - .Where(x => (x.Type == AccountAccessTypeEnum.balance || x.Type == AccountAccessTypeEnum.credit) && x.CurrencyRate.HasValue) - .Sum(x => x.Balance * (x.CurrencyRate * x.CurrencyQuantity)), - - BalanceDebit = rests - .Where(x => x.Type == AccountAccessTypeEnum.balance && x.CurrencyRate.HasValue) - .Sum(x => x.Balance * (x.CurrencyRate * x.CurrencyQuantity)), - - BalanceCredit = rests - .Where(x => x.Type == AccountAccessTypeEnum.credit && x.CurrencyRate.HasValue) - .Sum(x => x.Balance * (x.CurrencyRate * x.CurrencyQuantity)), - - BalanceRests = rests - .Where(x => x.Type == AccountAccessTypeEnum.balance) - .Where(x => x.CurrencyRate.HasValue && x.Balance.HasValue && x.Balance != 0) - .Select(x => new DashboardRestData - { - Id = x.Id, - Name = x.Name, - Balance = x.Balance, - CurrencyName = x.CurrencyName!, - CurrencyShortName = x.CurrencyShortName!, - CurrencyRate = x.CurrencyRate, - CurrencyQuantity = x.CurrencyQuantity, - }) - .OrderByDescending(x => x.BalanceAtRate) - .ToList(), - }; - } - - public async Task GetDashboardIncomeDataAsync( - Guid userId, - DateTime from, - DateTime to, - Guid? category, - CancellationToken cancellationToken = default - ) - { - var data = category.HasValue - ? await _accountRepository.GetIncomeByCategoryAsync(userId, category.Value, from.ToUtc(), to.ToUtc(), cancellationToken) - : await _accountRepository.GetIncomeByCategoriesAsync(userId, from.ToUtc(), to.ToUtc(), cancellationToken); - - data = data - .Where(x => x.Amount != 0) - .ToList(); - - var currencies = data - .Select(x => x.CurrencyId) - .Distinct() - .ToList(); - - var rates = (await _currencyRateRepository.GetLastRatesAsync(userId, currencies, to.ToUtc(), cancellationToken)) - .ToDictionary(x => x.Key, x => x.Value.Rate * x.Value.Quantity); - - return BuildIncomeData(data, rates); - } - - public async Task GetDashboardOutcomeDataAsync( - Guid userId, - DateTime from, - DateTime to, - Guid? category, - CancellationToken cancellationToken = default - ) - { - var data = category.HasValue - ? await _accountRepository.GetOutcomeByCategoryAsync(userId, category.Value, from.ToUtc(), to.ToUtc(), cancellationToken) - : await _accountRepository.GetOutcomeByCategoriesAsync(userId, from.ToUtc(), to.ToUtc(), cancellationToken); - - data = data - .Where(x => x.Amount != 0) - .ToList(); - - var currencies = data - .Select(x => x.CurrencyId) - .Distinct() - .ToList(); - - var rates = (await _currencyRateRepository.GetLastRatesAsync(userId, currencies, to.ToUtc(), cancellationToken)) - .ToDictionary(x => x.Key, x => x.Value.Rate * x.Value.Quantity); - - return BuildIncomeData(data, rates); - } - - private static DashboardIncomeData BuildIncomeData( - List data, - Dictionary rates - ) - { - return new DashboardIncomeData - { - Data = data.Select(x => new - { - Id = x.Id.ToShort(), - Name = x.Name, - ValueRaw = x.Amount, - Value = x.Amount * rates.FirstOrDefault(r => r.Key == x.CurrencyId).Value, - }) - .GroupBy(x => new { x.Id, x.Name }) - .Select(x => new DashboardIncomeDataItem - { - Id = x.Key.Id, - Name = x.Key.Name, - Value = x.Sum(s => s.Value), - ValueRaw = x.Sum(s => s.ValueRaw), - }) - .OrderBy(x => x.Name) - .ToList(), - - Details = data.Select(x => new - { - Id = x.CurrencyId, - Name = x.CurrencyName, - ValueRaw = x.Amount, - Value = x.Amount * rates.FirstOrDefault(r => r.Key == x.CurrencyId).Value, - }) - .GroupBy(x => new { x.Id, x.Name }) - .Select(x => new DashboardIncomeDataItem - { - Id = x.Key.Id, - Name = x.Key.Name, - Value = x.Sum(s => s.Value), - ValueRaw = x.Sum(s => s.ValueRaw), - }) - .OrderBy(x => x.Name) - .ToList(), - }; - } -} diff --git a/MyOffice.Services/Dashboard/Domain/DashboardData.cs b/MyOffice.Services/Dashboard/Domain/DashboardData.cs deleted file mode 100644 index 8f34850..0000000 --- a/MyOffice.Services/Dashboard/Domain/DashboardData.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace MyOffice.Services.Dashboard.Domain; - -using System.Collections.Generic; - -public class DashboardData -{ - public decimal IncomeLast { get; set; } - public decimal IncomePrevious { get; set; } - public decimal OutcomeLast { get; set; } - public decimal OutcomePrevious { get; set; } - public decimal? Balance { get; set; } - public decimal? BalanceDebit { get; set; } - public decimal? BalanceCredit { get; set; } - public List BalanceRests { get; set; } = null!; -} - -public class DashboardRestData -{ - public Guid Id { get; set; } - public string Name { get; set; } = null!; - public string CurrencyName { get; set; } = null!; - public string CurrencyShortName { get; set; } = null!; - public decimal? Balance { get; set; } - public decimal? CurrencyRate { get; set; } - public decimal? CurrencyQuantity { get; set; } - - public decimal? BalanceAtRate => Balance * (CurrencyRate * CurrencyQuantity); -} - -public class DashboardIncomeData -{ - public List Data { get; set; } = null!; - public List Details { get; set; } = null!; -} - -public class DashboardIncomeDataItem -{ - public string? Id { get; set; } - public string Currency { get; set; } = null!; - public string Name { get; set; } = null!; - public decimal Value { get; set; } - public decimal ValueRaw { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Services/Identity/IContextProvider.cs b/MyOffice.Services/Identity/IContextProvider.cs deleted file mode 100644 index b57fd11..0000000 --- a/MyOffice.Services/Identity/IContextProvider.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Services.Identity; - -using Data.Models.Users; - -public interface IContextProvider -{ - User User { get; } - Guid UserId { get; } -} - diff --git a/MyOffice.Services/Item/Domain/ItemCategoryRemoveResult.cs b/MyOffice.Services/Item/Domain/ItemCategoryRemoveResult.cs deleted file mode 100644 index e5d73d6..0000000 --- a/MyOffice.Services/Item/Domain/ItemCategoryRemoveResult.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Services.Item.Domain -{ - public enum ItemCategoryRemoveResult - { - success, - failure, - not_found, - accounts_exists, - } -} diff --git a/MyOffice.Services/Item/Domain/ItemGetOrAddResult.cs b/MyOffice.Services/Item/Domain/ItemGetOrAddResult.cs deleted file mode 100644 index f3a22b0..0000000 --- a/MyOffice.Services/Item/Domain/ItemGetOrAddResult.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Services.Item.Domain -{ - public enum ItemGetOrAddResult - { - success, - failure, - not_found, - accounts_exists, - } -} diff --git a/MyOffice.Services/Item/ItemService.cs b/MyOffice.Services/Item/ItemService.cs deleted file mode 100644 index 585d180..0000000 --- a/MyOffice.Services/Item/ItemService.cs +++ /dev/null @@ -1,264 +0,0 @@ -namespace MyOffice.Services.Item; - -using AutoMapper; -using Domain; -using MyOffice.Core; -using MyOffice.Data.Models.Items; -using MyOffice.Data.Repositories.Item; -using MyOffice.Services.Account.Domain; - -public class ItemService -{ - private readonly IItemCategoryRepository _itemCategoryRepository; - private readonly IItemRepository _itemRepository; - private readonly IItemGlobalRepository _itemGlobalRepository; - private readonly IMapper _mapper; - - public ItemService( - IItemCategoryRepository itemCategoryRepository, - IItemRepository itemRepository, - IItemGlobalRepository itemGlobalRepository, - IMapper mapper - ) - { - _itemCategoryRepository = itemCategoryRepository; - _itemRepository = itemRepository; - _itemGlobalRepository = itemGlobalRepository; - _mapper = mapper; - } - - public async Task> GetAllCategoriesAsync(Guid userId, CancellationToken cancellationToken = default) - { - var result = await _itemCategoryRepository.GetAllAsync(userId, cancellationToken); - if (result.All(x => x.Id != userId)) - { - var category = new ItemCategory - { - Id = userId, - UserId = userId, - Name = "UnCategorized", - }; - await _itemCategoryRepository.AddAsync(category, cancellationToken); - - result.Add((await _itemCategoryRepository.GetAsync(userId, userId, cancellationToken))!); - } - return _mapper.Map>(result); - } - - public async Task> CategoryAddAsync( - Guid userId, - ItemCategoryDto input, - CancellationToken cancellationToken = default) - { - if (input == null) - throw new ArgumentNullException(nameof(input)); - - var result = new Exec(GeneralExecStatus.success); - - var category = new ItemCategory - { - Id = Guid.NewGuid(), - UserId = userId, - Name = input.Name, - IsInternal = input.IsInternal, - }; - - if (!await _itemCategoryRepository.AddAsync(category, cancellationToken)) - { - return result.Set(GeneralExecStatus.failure); - } - - return result.Set(_mapper.Map(category)); - } - - public async Task> CategoryUpdateAsync( - Guid userId, - Guid id, - ItemCategoryDto category, - CancellationToken cancellationToken = default) - { - if (category == null) - throw new ArgumentNullException(nameof(category)); - - var result = new Exec(GeneralExecStatus.success); - - var exists = await _itemCategoryRepository.GetAsync(userId, id, cancellationToken); - if (exists == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - exists.Name = category.Name; - exists.IsInternal = category.IsInternal; - - if (!await _itemCategoryRepository.UpdateAsync(exists, cancellationToken)) - { - return result.Set(GeneralExecStatus.failure); - } - - return result.Set(_mapper.Map(exists)); - } - - public async Task> CategoryRemoveAsync( - Guid userId, - Guid id, - CancellationToken cancellationToken = default) - { - var result = new Exec(ItemCategoryRemoveResult.success); - - var exists = await _itemCategoryRepository.GetAsync(userId, id, cancellationToken); - if (exists == null) - { - return result.Set(ItemCategoryRemoveResult.not_found); - } - - if (exists.Items.Any()) - { - return result.Set(ItemCategoryRemoveResult.accounts_exists); - } - if (!await _itemCategoryRepository.RemoveAsync(exists, cancellationToken)) - { - return result.Set(ItemCategoryRemoveResult.failure); - } - - return result.Set(_mapper.Map(exists)); - } - - public async Task> GetAllAsync(Guid userId, CancellationToken cancellationToken = default) - { - return _mapper.Map>(await _itemRepository.GetAllAsync(userId, cancellationToken)); - } - - public async Task> GetByCategoryAsync( - Guid userId, - Guid categoryId, - CancellationToken cancellationToken = default) - { - return _mapper.Map>(await _itemRepository.GetByCategoryAsync(userId, categoryId, cancellationToken)); - } - - public async Task> GetByUncategorizedAsync(Guid userId, CancellationToken cancellationToken = default) - { - var itemGlobals = await _itemGlobalRepository.GetAvailableToUserAsync(userId, cancellationToken); - foreach (var itemGlobal in itemGlobals) - { - await GetOrCreateAsync(userId, itemGlobal, cancellationToken); - } - - return await GetByCategoryAsync(userId, userId, cancellationToken); - } - - public async Task> UpdateAsync( - Guid userId, - Guid motionId, - Guid categoryId, - CancellationToken cancellationToken = default) - { - var result = new Exec(GeneralExecStatus.success); - - var item = await _itemRepository.GetByGlobalAsync(userId, motionId, cancellationToken); - if (item == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - item.CategoryId = categoryId; - await _itemRepository.UpdateAsync(item, cancellationToken); - - return result.Set(_mapper.Map(item)); - } - - public async Task> GetOrCreateAsync( - Guid userId, - string name, - CancellationToken cancellationToken = default - ) - { - if (name == null) - throw new ArgumentNullException(nameof(name)); - - var result = new Exec(ItemGetOrAddResult.success); - - var itemGlobal = await _itemGlobalRepository.GetByNameAsync(name, cancellationToken); - if (itemGlobal == null) - { - itemGlobal = new ItemGlobal - { - Id = Guid.NewGuid(), - Name = name.Trim(), - }; - - if (!await _itemGlobalRepository.AddAsync(itemGlobal, cancellationToken)) - { - return result.Set(ItemGetOrAddResult.failure); - } - - return await GetOrCreateAsync(userId, itemGlobal, cancellationToken); - } - - return await GetOrCreateAsync(userId, itemGlobal, cancellationToken); - } - - private async Task> GetOrCreateAsync( - Guid userId, - ItemGlobal itemGlobal, - CancellationToken cancellationToken = default - ) - { - if (itemGlobal == null) - throw new ArgumentNullException(nameof(itemGlobal)); - - var result = new Exec(ItemGetOrAddResult.success); - - var item = await _itemRepository.GetByGlobalAsync(userId, itemGlobal.Id, cancellationToken); - if (item == null) - { - item = new Item - { - CategoryId = userId, - ItemGlobalId = itemGlobal.Id, - }; - await _itemRepository.AddAsync(item, cancellationToken); - } - - item.ItemGlobal = itemGlobal; - return result.Set(item); - } - - public async Task> FindItemsAsync( - Guid userId, - string term, - int limit = 15, - CancellationToken cancellationToken = default) - { - if (term == null) - throw new ArgumentNullException(nameof(term)); - - return _mapper.Map>(await _itemRepository.FindAsync(userId, term, limit, cancellationToken)); - } - - public async Task UpdateItemsCategoryAsync( - Guid userId, - Guid categoryId, - List items, - CancellationToken cancellationToken = default) - { - var category = await _itemCategoryRepository.GetAsync(userId, categoryId, cancellationToken); - if (category == null) - { - return GeneralExecStatus.not_found; - } - - foreach (var item in items) - { - var dbItem = await _itemRepository.GetByGlobalAsync(userId, item, cancellationToken); - if (dbItem != null) - { - dbItem.CategoryId = category.Id; - await _itemRepository.UpdateAsync(dbItem, cancellationToken); - } - } - - return GeneralExecStatus.success; - } -} diff --git a/MyOffice.Services/Mapper/AutomapperExtensions.cs b/MyOffice.Services/Mapper/AutomapperExtensions.cs deleted file mode 100644 index 9cee4be..0000000 --- a/MyOffice.Services/Mapper/AutomapperExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ -using AutoMapper; -using MyOffice.Core; - -namespace MyOffice.Services; - -public static class AutomapperExtensions -{ - public static List ToDto(this IEnumerable list, IMapper mapper) - { - return mapper.Map>(list); - } - - public static TTo ToDto(this IDataModel item, IMapper mapper) - { - return mapper.Map(item); - } -} diff --git a/MyOffice.Services/Mapper/BaseMappingAction.cs b/MyOffice.Services/Mapper/BaseMappingAction.cs deleted file mode 100644 index c518055..0000000 --- a/MyOffice.Services/Mapper/BaseMappingAction.cs +++ /dev/null @@ -1,12 +0,0 @@ -using MyOffice.Services.Identity; - -namespace MyOffice.Services.Mapper; - -public class BaseMappingAction -{ - protected readonly IContextProvider ContextProvider; - public BaseMappingAction(IContextProvider contextProvider) - { - ContextProvider = contextProvider; - } -} diff --git a/MyOffice.Services/Mapper/BaseProfile.cs b/MyOffice.Services/Mapper/BaseProfile.cs deleted file mode 100644 index e1932b8..0000000 --- a/MyOffice.Services/Mapper/BaseProfile.cs +++ /dev/null @@ -1,13 +0,0 @@ -using AutoMapper; - -namespace MyOffice.Services.Mapper; - -public class BaseProfile : Profile -{ - protected IMappingExpression Mapping; - - public BaseProfile() - { - Mapping = CreateMap(); - } -} diff --git a/MyOffice.Services/Mapper/UserIdResolver.cs b/MyOffice.Services/Mapper/UserIdResolver.cs deleted file mode 100644 index cd87127..0000000 --- a/MyOffice.Services/Mapper/UserIdResolver.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MyOffice.Services.Mapper; - -using AutoMapper; -using Identity; - -public class UserIdResolver : IValueResolver -{ - private readonly IContextProvider _contextProvider; - - public UserIdResolver( - IContextProvider contextProvider - ) - { - _contextProvider = contextProvider; - } - - public Guid Resolve(object source, object destination, Guid member, ResolutionContext context) - { - return _contextProvider.UserId; - } -} \ No newline at end of file diff --git a/MyOffice.Services/MyOffice.Services.csproj b/MyOffice.Services/MyOffice.Services.csproj deleted file mode 100644 index f4e8c86..0000000 --- a/MyOffice.Services/MyOffice.Services.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/MyOffice.Services/Notifications/EmailNotificationService.cs b/MyOffice.Services/Notifications/EmailNotificationService.cs deleted file mode 100644 index 6374e9b..0000000 --- a/MyOffice.Services/Notifications/EmailNotificationService.cs +++ /dev/null @@ -1,80 +0,0 @@ -namespace MyOffice.Services.Notifications; - -using MyOffice.Core; -using MyOffice.Data.Models.Notifications; -using MyOffice.Data.Models.Users; -using MyOffice.Data.Models.Verifications; -using MyOffice.Data.Repositories.Item; -using MyOffice.Services.Verifications; - -public class EmailNotificationService -{ - private readonly VerificationService _verificationService; - - public EmailNotificationService( - VerificationService verificationService - ) - { - _verificationService = verificationService; - } - - public void PasswordResetEmail(User user) - { - var code = _verificationService.Add( - user, - user.Email, - VerificationCodeTemplateEnum.password_restore, - VerificationCodeTypeEnum.email - ); - - var subject = ""; - var body = ""; - } -} - -public class TemplateSevice -{ - private readonly IEmailTemplateRepository _emailTemplateRepository; - - public TemplateSevice( - IEmailTemplateRepository emailTemplateRepository - ) - { - _emailTemplateRepository = emailTemplateRepository; - } - - public Exec GetTemplate( - EmailTemplateEnum template, - Dictionary tokens - ) - { - var result = new Exec(GeneralExecStatus.success); - - var emailTemplate = _emailTemplateRepository.Get(template); - if (emailTemplate == null) - { - return result.Set(GeneralExecStatus.not_found); - } - - result.Set(new EmailTemplateFormated - { - Subject = emailTemplate.Subject, - Body = emailTemplate.Template, - }); - - return result; - } -} - -public class EmailTemplateFormated -{ - public string Sender { get; set; } - public string SenderName { get; set; } - public string Subject { get; set; } - public string Body { get; set; } -} - -public interface IEmailSender -{ - //Exec Send(string from, string[] to, string subject, string body); -} \ No newline at end of file diff --git a/MyOffice.Services/Users/Domain/AddUserExternalStatusEnum.cs b/MyOffice.Services/Users/Domain/AddUserExternalStatusEnum.cs deleted file mode 100644 index b90155f..0000000 --- a/MyOffice.Services/Users/Domain/AddUserExternalStatusEnum.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MyOffice.Services.Users.Domain; - -public enum AddUserExternalStatusEnum -{ - success, - externalid_used, - user_not_valid -} \ No newline at end of file diff --git a/MyOffice.Services/Users/UserService.cs b/MyOffice.Services/Users/UserService.cs deleted file mode 100644 index 115b8af..0000000 --- a/MyOffice.Services/Users/UserService.cs +++ /dev/null @@ -1,96 +0,0 @@ -namespace MyOffice.Services.Users; - -using Domain; -using Core; -using Data.Models.Users; -using Data.Repositories.Users; - -public class UserService -{ - private readonly IUserRepository _userRepository; - private readonly IUserExternalRepository _userExternalRepository; - private readonly SemaphoreSlim _addExternalLock = new(1, 1); - - public UserService( - IUserRepository userRepository, - IUserExternalRepository userExternalRepository - ) - { - _userRepository = userRepository; - _userExternalRepository = userExternalRepository; - } - - public async Task Get(Guid id) - { - return await _userRepository.GetUserAsync(id); - } - - public async Task> GetUserExternals(Guid userId) - { - return await _userExternalRepository.GetUserExternalsByUserIdAsync(userId); - } - - public async Task GetUserExternal(Guid userId, string provider) - { - return await _userExternalRepository.GetByUserIdAsync(userId, provider); - } - - public async Task> RemoveUserExternal( - Guid userId, - string provider, - CancellationToken cancellationToken = default) - { - var result = new Exec(); - - var userExternal = await _userExternalRepository.GetByUserIdAsync(userId, provider); - if (userExternal == null) return result.Set(GeneralExecStatus.not_found); - - await _userExternalRepository.RemoveUserExternalAsync(userExternal, cancellationToken); - - return result.Set(userExternal); - } - - public async Task> AddUserExternalAsync( - Guid userId, - string provider, - string externalId, - string email, - CancellationToken cancellationToken = default - ) - { - var result = new Exec(AddUserExternalStatusEnum.success); - - var externalLogin = await _userExternalRepository.GetByUserIdAsync(userId, provider); - - if (externalLogin != null) return result.Set(externalLogin); - - await _addExternalLock.WaitAsync(cancellationToken); - try - { - externalLogin = await _userExternalRepository.GetByUserIdAsync(userId, provider); - if (externalLogin != null) return result.Set(externalLogin); - - externalLogin = await _userExternalRepository.GetByExternalIdAsync(externalId, provider); - if (externalLogin != null) return result.Set(AddUserExternalStatusEnum.externalid_used); - - var user = await _userRepository.GetByUserUserNameAsync(email); - if (user?.Id != userId) return result.Set(AddUserExternalStatusEnum.user_not_valid); - - externalLogin = new UserExternal - { - UserId = userId, - CreatedOn = DateTime.UtcNow, - Provider = provider.ToLower(), - ExternalId = externalId, - Email = email - }; - await _userExternalRepository.AddUserExternalAsync(externalLogin, cancellationToken); - } - finally - { - _addExternalLock.Release(); - } - - return result; - } -} diff --git a/MyOffice.Services/Validators/ContextValidator.cs b/MyOffice.Services/Validators/ContextValidator.cs deleted file mode 100644 index f844d8a..0000000 --- a/MyOffice.Services/Validators/ContextValidator.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MyOffice.Services.Validators -{ - public static class ContextValidator - { - } -} diff --git a/MyOffice.Services/Verifications/VerificationService.cs b/MyOffice.Services/Verifications/VerificationService.cs deleted file mode 100644 index 988b11b..0000000 --- a/MyOffice.Services/Verifications/VerificationService.cs +++ /dev/null @@ -1,51 +0,0 @@ -namespace MyOffice.Services.Verifications; - -using MyOffice.Core.Helpers; -using MyOffice.Data.Models.Users; -using MyOffice.Data.Models.Verifications; -using MyOffice.Data.Repositories.Item; - -public class VerificationService -{ - private readonly TimeSpan _defaultExpires = TimeSpan.FromDays(1); - - private readonly IVerificationCodeRepository _verificationCodeRepository; - - public VerificationService( - IVerificationCodeRepository verificationCodeRepository - ) - { - _verificationCodeRepository = verificationCodeRepository; - } - - public VerificationCode Add( - User user, - string destination, - VerificationCodeTemplateEnum template, - VerificationCodeTypeEnum type, - DateTime? expiresOn = null, - string? metadata = null - ) - { - if (user == null) - throw new ArgumentNullException(nameof(user)); - if (destination == null) - throw new ArgumentNullException(nameof(destination)); - - var verificationCode = new VerificationCode - { - UserId = user.Id, - Code = RandomizationHelper.Generate(40), - CreatedOn = DateTime.UtcNow, - ExpiresOn = expiresOn ?? DateTime.UtcNow.Add(_defaultExpires), - Template = template.ToString(), - DestinationType = type.ToString(), - Destination = destination, - Metadata = metadata, - }; - - _verificationCodeRepository.Add(verificationCode); - - return verificationCode; - } -} \ No newline at end of file diff --git a/MyOffice.Shared/Configuration.cs b/MyOffice.Shared/Configuration.cs deleted file mode 100644 index 5d75f75..0000000 --- a/MyOffice.Shared/Configuration.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace MyOffice.Shared; - -using Microsoft.Extensions.Configuration; - -public static class SharedConfiguration -{ - public const string BaseFileName = "appsettings.shared.json"; - - /// - /// Adds shared JSON sources to an existing configuration builder (base + environment overlay). - /// - public static IConfigurationBuilder AddSharedAppSettings( - this IConfigurationBuilder builder, - string environmentName, - string? basePath = null, - bool optional = false, - bool reloadOnChange = true - ) - { - basePath ??= AppContext.BaseDirectory; - - builder - .AddJsonFile(Path.Combine(basePath, BaseFileName), optional: optional, reloadOnChange: reloadOnChange) - .AddJsonFile( - Path.Combine(basePath, $"appsettings.shared.{environmentName}.json"), - optional: true, - reloadOnChange: reloadOnChange); - - return builder; - } - - /// - /// Builds a standalone configuration for design-time tools (EF migrations, etc.). - /// Layering: base shared → environment shared → environment variables. - /// - public static IConfiguration Build(string? environmentName = null) - { - environmentName ??= Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") - ?? Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT") - ?? "Production"; - - return new ConfigurationBuilder() - .SetBasePath(AppContext.BaseDirectory) - .AddSharedAppSettings(environmentName, optional: false, reloadOnChange: false) - .AddEnvironmentVariables() - .Build(); - } -} diff --git a/MyOffice.Shared/MyOffice.Shared.csproj b/MyOffice.Shared/MyOffice.Shared.csproj deleted file mode 100644 index cc156eb..0000000 --- a/MyOffice.Shared/MyOffice.Shared.csproj +++ /dev/null @@ -1,40 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - Always - true - - - Always - true - PreserveNewest - - - Always - true - - - Always - true - PreserveNewest - - - - - - - - - - diff --git a/MyOffice.Shared/appsettings.shared.Docker.json b/MyOffice.Shared/appsettings.shared.Docker.json deleted file mode 100644 index 86dc9f0..0000000 --- a/MyOffice.Shared/appsettings.shared.Docker.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ConnectionStrings": { - "npgsql": "Host=postgres;Port=5432;Database=myoffice;Username=myoffice;Password=myoffice" - } -} diff --git a/MyOffice.Shared/appsettings.shared.json b/MyOffice.Shared/appsettings.shared.json deleted file mode 100644 index 4c8cd57..0000000 --- a/MyOffice.Shared/appsettings.shared.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "ConnectionStrings": { - "sqlite": "Filename=AppDbContext.Dev.db", - "mssql": "", - "npgsql": "" - } -} \ No newline at end of file diff --git a/MyOffice.Tests/Account/AccountAclTests.cs b/MyOffice.Tests/Account/AccountAclTests.cs deleted file mode 100644 index f931d5c..0000000 --- a/MyOffice.Tests/Account/AccountAclTests.cs +++ /dev/null @@ -1,65 +0,0 @@ -using MyOffice.Data.Models.Accounts; -using MyOffice.Services.Account; -using AccountEntity = MyOffice.Data.Models.Accounts.Account; - -namespace MyOffice.Tests.Accounts; - -public class AccountAclTests -{ - private static AccountEntity CreateAccount(Guid userId, bool write, bool manage) - { - return new AccountEntity - { - Id = Guid.NewGuid(), - Name = "Cash", - AccessRights = - [ - new AccountAccess - { - UserId = userId, - IsAllowRead = true, - IsAllowWrite = write, - IsAllowManage = manage, - } - ] - }; - } - - [Fact] - public void CanWrite_true_when_flag_set() - { - var userId = Guid.NewGuid(); - var account = CreateAccount(userId, write: true, manage: false); - - Assert.True(AccountAcl.CanWrite(account, userId)); - Assert.False(AccountAcl.CanManage(account, userId)); - } - - [Fact] - public void CanManage_true_when_flag_set() - { - var userId = Guid.NewGuid(); - var account = CreateAccount(userId, write: false, manage: true); - - Assert.False(AccountAcl.CanWrite(account, userId)); - Assert.True(AccountAcl.CanManage(account, userId)); - } - - [Fact] - public void CanWrite_false_for_other_user() - { - var account = CreateAccount(Guid.NewGuid(), write: true, manage: true); - - Assert.False(AccountAcl.CanWrite(account, Guid.NewGuid())); - Assert.False(AccountAcl.CanManage(account, Guid.NewGuid())); - } - - [Fact] - public void CanWrite_false_when_access_rights_null() - { - var account = new AccountEntity { Id = Guid.NewGuid(), Name = "X", AccessRights = null }; - - Assert.False(AccountAcl.CanWrite(account, Guid.NewGuid())); - Assert.False(AccountAcl.CanManage(account, Guid.NewGuid())); - } -} diff --git a/MyOffice.Tests/Account/AccountMotionBalancingTests.cs b/MyOffice.Tests/Account/AccountMotionBalancingTests.cs deleted file mode 100644 index 4a3163a..0000000 --- a/MyOffice.Tests/Account/AccountMotionBalancingTests.cs +++ /dev/null @@ -1,30 +0,0 @@ -using MyOffice.Services.Account; - -namespace MyOffice.Tests.Accounts; - -public class AccountMotionBalancingTests -{ - [Fact] - public void ResolveAmounts_income_primary_creates_expense_on_balancing() - { - var (plus, minus) = AccountMotionBalancing.ResolveAmounts(primaryPlus: 100m, amountBalancing: 100m); - - Assert.Equal(0m, plus); - Assert.Equal(100m, minus); - } - - [Fact] - public void ResolveAmounts_expense_primary_creates_income_on_balancing() - { - var (plus, minus) = AccountMotionBalancing.ResolveAmounts(primaryPlus: 0m, amountBalancing: 50m); - - Assert.Equal(50m, plus); - Assert.Equal(0m, minus); - } - - [Fact] - public void BalancingItemName_prefixes_account_name() - { - Assert.Equal("+Wallet", AccountMotionBalancing.BalancingItemName("Wallet")); - } -} diff --git a/MyOffice.Tests/Account/MotionAddAclTests.cs b/MyOffice.Tests/Account/MotionAddAclTests.cs deleted file mode 100644 index 7088c74..0000000 --- a/MyOffice.Tests/Account/MotionAddAclTests.cs +++ /dev/null @@ -1,173 +0,0 @@ -using AutoMapper; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using Moq; -using MyOffice.Data.Models.Accounts; -using MyOffice.Data.Models.Items; -using MyOffice.Data.Repositories.Account; -using MyOffice.Data.Repositories.Currency; -using MyOffice.Data.Repositories.Item; -using MyOffice.Services.Account; -using MyOffice.Services.Account.Domain; -using MyOffice.Services.Identity; -using MyOffice.Services.Item; - -using AccountEntity = MyOffice.Data.Models.Accounts.Account; - -namespace MyOffice.Tests.Accounts; - -public class MotionAddAclTests -{ - [Fact] - public async Task MotionAddAsync_returns_forbidden_without_write_access() - { - var userId = Guid.NewGuid(); - var accountId = Guid.NewGuid(); - var account = new AccountEntity - { - Id = accountId, - Name = "Cash", - AccessRights = - [ - new AccountAccess - { - UserId = userId, - IsAllowRead = true, - IsAllowWrite = false, - IsAllowManage = false, - } - ] - }; - - var accountRepo = new Mock(); - accountRepo - .Setup(x => x.GetAsync(userId, accountId, It.IsAny())) - .ReturnsAsync(account); - - var service = CreateService(accountRepo.Object); - - var exec = await service.MotionAddAsync( - userId, - accountId, - new MotionAddUpdate - { - Date = DateTime.UtcNow, - Item = "Coffee", - Plus = 0, - Minus = 10, - }); - - Assert.Equal(MotionAddStatus.forbidden, exec.Status); - } - - [Fact] - public async Task MotionAddAsync_skips_balancing_when_counterparty_not_writable() - { - var userId = Guid.NewGuid(); - var primaryId = Guid.NewGuid(); - var balancingId = Guid.NewGuid(); - - var primary = new AccountEntity - { - Id = primaryId, - Name = "Cash", - AccessRights = - [ - new AccountAccess { UserId = userId, IsAllowRead = true, IsAllowWrite = true } - ] - }; - var balancing = new AccountEntity - { - Id = balancingId, - Name = "Bank", - AccessRights = - [ - new AccountAccess { UserId = userId, IsAllowRead = true, IsAllowWrite = false } - ] - }; - - var accountRepo = new Mock(); - accountRepo - .Setup(x => x.GetAsync(userId, primaryId, It.IsAny())) - .ReturnsAsync(primary); - accountRepo - .Setup(x => x.GetAsync(userId, balancingId, It.IsAny())) - .ReturnsAsync(balancing); - - var motionRepo = new Mock(); - motionRepo - .Setup(x => x.AddAsync(It.IsAny(), It.IsAny())) - .ReturnsAsync(true); - - var service = CreateService(accountRepo.Object, motionRepo.Object); - - var exec = await service.MotionAddAsync( - userId, - primaryId, - new MotionAddUpdate - { - Date = DateTime.UtcNow, - Item = "Transfer", - Plus = 0, - Minus = 25, - AccountId = balancingId.ToString("N"), - AmountBalancing = 25, - }); - - Assert.Equal(MotionAddStatus.success, exec.Status); - Assert.NotNull(exec.Result); - Assert.Single(exec.Result!); - motionRepo.Verify(x => x.AddAsync(It.IsAny(), It.IsAny()), Times.Once); - } - - private static ItemService CreateItemServiceStub() - { - var nextId = 1; - var itemRepo = new Mock(); - var itemGlobalRepo = new Mock(); - - itemGlobalRepo - .Setup(x => x.GetByNameAsync(It.IsAny(), It.IsAny())) - .ReturnsAsync((ItemGlobal?)null); - itemGlobalRepo - .Setup(x => x.AddAsync(It.IsAny(), It.IsAny())) - .ReturnsAsync(true); - itemRepo - .Setup(x => x.GetByGlobalAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync((Item?)null); - itemRepo - .Setup(x => x.AddAsync(It.IsAny(), It.IsAny())) - .ReturnsAsync(true) - .Callback((i, _) => i.Id = nextId++); - - return new ItemService( - Mock.Of(), - itemRepo.Object, - itemGlobalRepo.Object, - new MapperConfiguration(_ => { }, NullLoggerFactory.Instance).CreateMapper()); - } - - private static AccountService CreateService( - IAccountRepository accountRepository, - IMotionRepository? motionRepository = null) - { - var mapper = new MapperConfiguration( - cfg => cfg.AddProfile(), - NullLoggerFactory.Instance).CreateMapper(); - - return new AccountService( - Mock.Of>(), - mapper, - Mock.Of(), - Mock.Of(), - Mock.Of(), - accountRepository, - Mock.Of(), - Mock.Of(), - motionRepository ?? Mock.Of(), - Mock.Of(), - Mock.Of(), - CreateItemServiceStub(), - Mock.Of()); - } -} diff --git a/MyOffice.Tests/Auth/OpenIddictRedirectUriTests.cs b/MyOffice.Tests/Auth/OpenIddictRedirectUriTests.cs deleted file mode 100644 index ac21b6c..0000000 --- a/MyOffice.Tests/Auth/OpenIddictRedirectUriTests.cs +++ /dev/null @@ -1,22 +0,0 @@ -using MyOffice.Web.Auth; - -namespace MyOffice.Tests.Auth; - -public class OpenIddictRedirectUriTests -{ - [Fact] - public void BuildRedirectUri_uses_localhost_when_host_empty() - { - var uri = OpenIddictSeeder.BuildRedirectUri(null); - - Assert.Equal("http://localhost:4300/silent-refresh.html", uri.ToString()); - } - - [Fact] - public void BuildRedirectUri_appends_silent_refresh_and_trims_slash() - { - var uri = OpenIddictSeeder.BuildRedirectUri("https://app.example.com/"); - - Assert.Equal("https://app.example.com/silent-refresh.html", uri.ToString()); - } -} diff --git a/MyOffice.Tests/Auth/PasswordHasherTests.cs b/MyOffice.Tests/Auth/PasswordHasherTests.cs deleted file mode 100644 index 6182366..0000000 --- a/MyOffice.Tests/Auth/PasswordHasherTests.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Microsoft.AspNetCore.Identity; -using MyOffice.Web.Identity.Domain; -using MyOffice.Web.Identity.Repositories; - -namespace MyOffice.Tests.Auth; - -public class PasswordHasherTests -{ - private readonly PasswordHasher _hasher = new(); - private readonly ApplicationUser _user = new() { Id = Guid.NewGuid(), UserName = "test@example.com" }; - - [Fact] - public void HashPassword_then_verify_succeeds_with_identity_format() - { - var hash = _hasher.HashPassword(_user, "P@ssw0rd!"); - - Assert.Equal(PasswordVerificationResult.Success, _hasher.VerifyHashedPassword(_user, hash, "P@ssw0rd!")); - } - - [Fact] - public void VerifyHashedPassword_fails_for_wrong_password() - { - var hash = _hasher.HashPassword(_user, "P@ssw0rd!"); - - Assert.Equal(PasswordVerificationResult.Failed, _hasher.VerifyHashedPassword(_user, hash, "wrong")); - } - - [Fact] - public void HashPassword_produces_distinct_hashes_due_to_salt() - { - var a = _hasher.HashPassword(_user, "same"); - var b = _hasher.HashPassword(_user, "same"); - - Assert.NotEqual(a, b); - } - - [Fact] - public void VerifyHashedPassword_legacy_hash_returns_rehash_needed() - { - var legacy = PasswordHasher.HashLegacyForTests("legacy-secret"); - - Assert.Equal( - PasswordVerificationResult.SuccessRehashNeeded, - _hasher.VerifyHashedPassword(_user, legacy, "legacy-secret")); - } - - [Fact] - public void VerifyHashedPassword_legacy_wrong_password_fails() - { - var legacy = PasswordHasher.HashLegacyForTests("legacy-secret"); - - Assert.Equal( - PasswordVerificationResult.Failed, - _hasher.VerifyHashedPassword(_user, legacy, "nope")); - } -} diff --git a/MyOffice.Tests/Data/DemoDataSeederTests.cs b/MyOffice.Tests/Data/DemoDataSeederTests.cs deleted file mode 100644 index d03991d..0000000 --- a/MyOffice.Tests/Data/DemoDataSeederTests.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Microsoft.Data.Sqlite; -using Microsoft.EntityFrameworkCore; -using MyOffice.DbContext; - -namespace MyOffice.Tests.Data; - -public class DemoDataSeederTests -{ - [Fact] - public async Task SeedIfEmpty_creates_demo_users_catalog_and_motions() - { - var path = Path.Combine(Path.GetTempPath(), $"myoffice-seed-{Guid.NewGuid():N}.db"); - var connection = new ConnectionConfiguration("sqlite", $"Data Source={path}"); - var options = new DbContextOptionsBuilder(); - DbContextServiceCollectionExtensions.ConfigureDbContextOptions(options, connection); - - await using (var db = new AppDbContext(AppDbContextProvidersEnum.sqlite, options.Options)) - { - await DatabaseBootstrapper.InitializeAsync(db); - - Assert.Equal(3, await db.Users.CountAsync()); - Assert.Equal(9, await db.Currencies.CountAsync()); - Assert.Equal(9, await db.CurrencyRates.CountAsync()); - Assert.Equal(9, await db.AccountCategories.CountAsync()); - Assert.Equal(27, await db.Accounts.CountAsync()); - Assert.Equal(300, await db.Motions.CountAsync()); - - var uahUser = await db.Users.SingleAsync(x => x.Email == "user_UAH@user_UAH.userUAH"); - Assert.Equal("UAH", uahUser.CurrencyId); - - var uahRates = await db.CurrencyRates - .Include(x => x.Currency) - .Where(x => x.Currency!.UserId == uahUser.Id) - .ToListAsync(); - Assert.Equal(1m, uahRates.Single(x => x.Currency!.CurrencyGlobalId == "UAH").Rate); - Assert.Equal(42m, uahRates.Single(x => x.Currency!.CurrencyGlobalId == "USD").Rate); - Assert.Equal(50m, uahRates.Single(x => x.Currency!.CurrencyGlobalId == "EUR").Rate); - - Assert.Contains(await db.AccountCategories.Where(x => x.UserId == uahUser.Id).Select(x => x.Name).ToListAsync(), - x => x == "Готівка"); - Assert.Contains(await db.ItemCategories.Where(x => x.UserId == uahUser.Id).Select(x => x.Name).ToListAsync(), - x => x == "Доходи"); - - await DemoDataSeeder.SeedIfEmptyAsync(db); - Assert.Equal(3, await db.Users.CountAsync()); - } - - SqliteConnection.ClearAllPools(); - if (File.Exists(path)) - { - File.Delete(path); - } - } -} diff --git a/MyOffice.Tests/MyOffice.Tests.csproj b/MyOffice.Tests/MyOffice.Tests.csproj deleted file mode 100644 index f1d43c2..0000000 --- a/MyOffice.Tests/MyOffice.Tests.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - - net10.0 - enable - enable - false - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MyOffice.Web/App.Config b/MyOffice.Web/App.Config deleted file mode 100644 index cae4452..0000000 --- a/MyOffice.Web/App.Config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/MyOffice.Web/Controllers/AccountController.cs b/MyOffice.Web/Controllers/AccountController.cs deleted file mode 100644 index c313bea..0000000 --- a/MyOffice.Web/Controllers/AccountController.cs +++ /dev/null @@ -1,187 +0,0 @@ -namespace MyOffice.Web.Controllers; - -using AutoMapper; -using Core; -using Core.Extensions; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Models.Account; -using Models.Item; -using Models.Motion; -using MyOffice.Web.Infrastructure.Attributes; -using Services.Account; -using Services.Account.Domain; -using Services.Item; - -[Authorize] -[ApiController] -[Route("api/accounts")] -[DefaultFromBody] -public class AccountController : BaseApiController -{ - private readonly ILogger _logger; - private readonly IMapper _mapper; - private readonly AccountService _accountService; - private readonly ItemService _itemService; - - public AccountController( - ILogger logger, - IMapper mapper, - AccountService accountService, - ItemService itemService - ) - { - _logger = logger; - _mapper = mapper; - _accountService = accountService; - _itemService = itemService; - } - - [HttpGet] - public async Task AccountsGet([FromQuery] string category) - { - var list = await _accountService.GetByCategoryDetailedAsync(UserId, category!.AsGuid()); - - return OkResponse(_mapper.Map>(list.OrderBy(x => x.Account.Name).ToList())); - } - - [HttpGet("{id}")] - public async Task AccountGet(string id) - { - var exec = await _accountService.GetByIdDetailedAsync(UserId, id!.AsGuid()); - - return MapGeneralExec( - exec, - result => OkResponse(_mapper.Map(result)), - notFoundDetail: "Account not found.", - failureDetail: "Failed to load account."); - } - - [HttpGet("{id}/motions")] - public async Task MotionsGet(string id, [FromQuery] MotionsGetRequest request) - { - var exec = await _accountService.GetMotionsAsync( - UserId, - id!.AsGuid(), - request.From.StartOfDay(), - request.To.EndOfDay()); - - return MapGeneralExec( - exec, - result => OkResponse(_mapper.Map>(result)), - notFoundDetail: "Account not found.", - failureDetail: "Failed to load motions."); - } - - [HttpPost("{id}/motions")] - public async Task MotionsPost(string id, MotionRequest motion) - { - var exec = await _accountService.MotionAddAsync( - UserId, - id.AsGuid(), - _mapper.Map(motion)); - - switch (exec.Status) - { - case MotionAddStatus.account_not_found: - return ProblemNotFoundResponse("Account not found."); - case MotionAddStatus.forbidden: - return ProblemForbiddenResponse("Write access required."); - case MotionAddStatus.failure: - return ProblemBadResponse("Adding motion failed."); - case MotionAddStatus.success: - return Ok(_mapper.Map(exec.Result!)); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpPut("{id}/motions/{motionId}")] - public async Task MotionsPut(string id, string motionId, MotionRequest motion) - { - var exec = await _accountService.MotionUpdateAsync( - UserId, - id.AsGuid(), - motionId.AsGuid(), - _mapper.Map(motion)); - - switch (exec.Status) - { - case MotionUpdateStatus.not_found: - return ProblemNotFoundResponse("Motion not found."); - case MotionUpdateStatus.forbidden: - return ProblemForbiddenResponse("Write access required."); - case MotionUpdateStatus.failure: - return ProblemBadResponse("Updating motion failed."); - case MotionUpdateStatus.success: - return OkResponse(_mapper.Map>(exec.Result!)); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpDelete("{id}/motions/{motionId}")] - public async Task MotionsDelete(string id, string motionId) - { - var exec = await _accountService.MotionRemoveAsync( - UserId, - id.AsGuid(), - motionId.AsGuid()); - - switch (exec.Status) - { - case MotionDeleteStatus.not_found: - return ProblemNotFoundResponse("Motion not found."); - case MotionDeleteStatus.forbidden: - return ProblemForbiddenResponse("Write access required."); - case MotionDeleteStatus.failure: - return ProblemBadResponse("Deliting motion failed."); - case MotionDeleteStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpGet("~/api/items")] - public async Task FindItems([FromQuery] string term, CancellationToken cancellationToken) - { - var itemsDto = await _itemService.FindItemsAsync(UserId, term, cancellationToken: cancellationToken); - - var items = _mapper.Map>(itemsDto); - - if (term.StartsWith("+") && term.Length > 1) - { - var foundAccounts = await _accountService.FindAccountsAsync(UserId, term.Substring(1), cancellationToken); - var accounts = foundAccounts.OrderByDescending(x => x.Name); - - foreach (var account in accounts) - { - var accountName = $"+{account.Name}"; - var item = items.FirstOrDefault(x => x.Name.IsPresent() && x.Name!.Length > 1 && x.Name.Substring(1) == accountName); - - if (item == null) - { - items.Add(new ItemViewModel - { - Name = accountName, - AccountId = account.Id.ToShort(), - }); - } - else - { - item.AccountId = account.Id.ToShort(); - } - } - } - - return OkResponse(_mapper - .Map>(items) - .OrderBy(x => x.AccountId) - .ThenBy(x => x.Name) - ); - } -} diff --git a/MyOffice.Web/Controllers/AuthorizationController.cs b/MyOffice.Web/Controllers/AuthorizationController.cs deleted file mode 100644 index 968c32d..0000000 --- a/MyOffice.Web/Controllers/AuthorizationController.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace MyOffice.Web.Controllers; - -using System.Security.Claims; -using Data.Repositories.Users; -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using OpenIddict.Server.AspNetCore; -using OpenIddict.Validation.AspNetCore; -using static OpenIddict.Abstractions.OpenIddictConstants; - -[ApiController] -public sealed class AuthorizationController : ControllerBase -{ - private readonly IUserRepository _userRepository; - - public AuthorizationController(IUserRepository userRepository) - { - _userRepository = userRepository; - } - - [Authorize(AuthenticationSchemes = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme)] - [HttpGet("~/connect/authorize")] - [HttpPost("~/connect/authorize")] - public async Task Authorize() - { - var result = await HttpContext.AuthenticateAsync( - OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); - if (!result.Succeeded) - { - return Forbid( - authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, - properties: new AuthenticationProperties(new Dictionary - { - [OpenIddictServerAspNetCoreConstants.Properties.Error] = Errors.LoginRequired, - [OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = - "The user is not authenticated." - })); - } - - return SignIn(result.Principal!, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); - } - - [Authorize(AuthenticationSchemes = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme)] - [HttpGet("~/connect/userinfo")] - [HttpPost("~/connect/userinfo")] - [Produces("application/json")] - public async Task Userinfo() - { - var userIdValue = User.FindFirstValue(Claims.Subject); - if (!Guid.TryParse(userIdValue, out var userId)) - return Challenge(authenticationSchemes: OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); - - var user = await _userRepository.GetUserAsync(userId); - if (user is null) - return Challenge(authenticationSchemes: OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); - - return Ok(new - { - sub = userIdValue, - id = userIdValue, - email = user.Email, - name = user.FullName ?? user.UserName, - firstName = user.FirstName, - lastName = user.LastName, - fullName = user.FullName, - phone = user.Phone - }); - } -} diff --git a/MyOffice.Web/Controllers/BaseApiController.cs b/MyOffice.Web/Controllers/BaseApiController.cs deleted file mode 100644 index d6131ed..0000000 --- a/MyOffice.Web/Controllers/BaseApiController.cs +++ /dev/null @@ -1,80 +0,0 @@ -namespace MyOffice.Web.Controllers; - -using System.Security.Authentication; -using Microsoft.AspNetCore.Mvc; -using Core; -using Core.Extensions; -using IdentityModel; -using MyOffice.Web.Infrastructure.Attributes; -using MyOffice.Web.Models; - -[DefaultFromBody] -public class BaseApiController : ControllerBase -{ - public Guid UserId - { - get - { - var subject = User.Claims.FirstOrDefault(x => x.Type == JwtClaimTypes.Subject)?.Value; - if (subject.IsPresent() && Guid.TryParse(subject, out var guid)) return guid; - - throw new AuthenticationException("Get UserId failed"); - } - } - - [NonAction] - public ObjectResult ProblemBadResponse(string? detail = null) - { - return Problem(detail, statusCode: StatusCodes.Status400BadRequest); - } - - [NonAction] - public ObjectResult ProblemNotFoundResponse(string? detail = null) - { - return Problem(detail ?? "Not found.", statusCode: StatusCodes.Status404NotFound); - } - - [NonAction] - public ObjectResult ProblemForbiddenResponse(string? detail = null) - { - return Problem(detail ?? "Forbidden.", statusCode: StatusCodes.Status403Forbidden); - } - - [NonAction] - public ObjectResult OkResponse(IResponseModel response) - { - return Ok(response); - } - - [NonAction] - public ObjectResult OkResponse(IEnumerable response) where T : IResponseModel - { - return Ok(response); - } - - /// - /// Maps to ProblemDetails status codes: - /// not_found → 404, forbidden → 403, failure → 400. - /// - protected ObjectResult MapGeneralExec( - Exec exec, - Func onSuccess, - string notFoundDetail, - string? failureDetail = null, - string? forbiddenDetail = null) where T : class - { - switch (exec.Status) - { - case GeneralExecStatus.success: - return onSuccess(exec.Result!); - case GeneralExecStatus.not_found: - return ProblemNotFoundResponse(notFoundDetail); - case GeneralExecStatus.forbidden: - return ProblemForbiddenResponse(forbiddenDetail); - case GeneralExecStatus.failure: - return ProblemBadResponse(failureDetail ?? "Operation failed."); - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } -} \ No newline at end of file diff --git a/MyOffice.Web/Controllers/DashboardController.cs b/MyOffice.Web/Controllers/DashboardController.cs deleted file mode 100644 index bd6c188..0000000 --- a/MyOffice.Web/Controllers/DashboardController.cs +++ /dev/null @@ -1,75 +0,0 @@ -namespace MyOffice.Web.Controllers; - -using AutoMapper; -using Core.Extensions; -using Infrastructure.Attributes; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using MyOffice.Web.Models.Dashboard; -using Services.Dashboard; - -[Authorize] -[ApiController] -[Route("api/dashboard")] -[DefaultFromBody] -public class DashboardController : BaseApiController -{ - private readonly ILogger _logger; - private readonly DashboardService _dashboardService; - private readonly IMapper _mapper; - - public DashboardController( - ILogger logger, - DashboardService dashboardService, - IMapper mapper - ) - { - _logger = logger; - _dashboardService = dashboardService; - _mapper = mapper; - } - - [HttpGet] - public async Task Index(CancellationToken cancellationToken) - { - var data = await _dashboardService.GetDashboardRestDataAsync(UserId, cancellationToken); - - return OkResponse(_mapper.Map(data)); - } - - [HttpGet("income")] - public async Task Income( - DateTime from, - DateTime to, - [AsGuid(true)] string? category, - CancellationToken cancellationToken - ) - { - var data = await _dashboardService.GetDashboardIncomeDataAsync( - UserId, - from.StartOfDay(), - to.EndOfDay(), - category?.AsGuidNull(), - cancellationToken); - - return OkResponse(_mapper.Map(data)); - } - - [HttpGet("outcome")] - public async Task Outcome( - DateTime from, - DateTime to, - [AsGuid(true)] string? category, - CancellationToken cancellationToken - ) - { - var data = await _dashboardService.GetDashboardOutcomeDataAsync( - UserId, - from.StartOfDay(), - to.EndOfDay(), - category?.AsGuidNull(), - cancellationToken); - - return OkResponse(_mapper.Map(data)); - } -} diff --git a/MyOffice.Web/Controllers/GeneralController.cs b/MyOffice.Web/Controllers/GeneralController.cs deleted file mode 100644 index e9e8780..0000000 --- a/MyOffice.Web/Controllers/GeneralController.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace MyOffice.Web.Controllers; - -using AutoMapper; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Authorization; -using Models.Currency; -using Services.Currency; -using MyOffice.Web.Infrastructure.Attributes; - -[Authorize] -[ApiController] -[Route("api/general")] -[DefaultFromBody] -public class GeneralController : BaseApiController -{ - private readonly CurrencyService _currencyService; - private readonly IMapper _mapper; - - public GeneralController( - CurrencyService currencyService, - IMapper mapper - ) - { - _currencyService = currencyService; - _mapper = mapper; - } - - [HttpGet("currencies")] - public async Task GetGlobalCurrencies(CancellationToken cancellationToken) - { - var list = await _currencyService.GetGlobalAllAsync(cancellationToken); - - return Ok(_mapper.Map>(list)); - } -} diff --git a/MyOffice.Web/Controllers/SettingsAccountCategoryController.cs b/MyOffice.Web/Controllers/SettingsAccountCategoryController.cs deleted file mode 100644 index bc85edb..0000000 --- a/MyOffice.Web/Controllers/SettingsAccountCategoryController.cs +++ /dev/null @@ -1,122 +0,0 @@ -namespace MyOffice.Web.Controllers; - -using AutoMapper; -using Microsoft.AspNetCore.Authorization; - -using Core; -using Core.Extensions; -using Models.Account; -using Services.Account; -using Services.Account.Domain; -using Infrastructure.Attributes; -using Services.Identity; -using Microsoft.AspNetCore.Mvc; - -[Authorize] -[ApiController] -[Route("api/settings/account-categories")] -[DefaultFromBody] -public class SettingsAccountCategoryController : BaseApiController -{ - private readonly ILogger _logger; - private readonly IMapper _mapper; - private readonly AccountService _accountService; - private readonly IContextProvider _contextProvider; - - public SettingsAccountCategoryController( - ILogger logger, - IMapper mapper, - AccountService accountService, - IContextProvider contextProvider - ) - { - _logger = logger; - _mapper = mapper; - _accountService = accountService; - _contextProvider = contextProvider; - } - - [HttpGet] - public async Task AccountCategories(CancellationToken cancellationToken) - { - var list = await _accountService.GetAllCategoriesAsync(UserId, cancellationToken); - - return OkResponse(_mapper.Map>(list).OrderBy(x => x.Name)); - } - - [HttpGet("{id}")] - public async Task AccountCategory([AsGuid] string id, CancellationToken cancellationToken) - { - var exec = await _accountService.GetCategoryAsync(UserId, id.AsGuid(), cancellationToken); - - switch (exec.Status) - { - case GeneralExecStatus.not_found: - case GeneralExecStatus.failure: - return ProblemNotFoundResponse("Account category not found."); - - case GeneralExecStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpPost] - public async Task AccountCategoriesAdd(AccountCategoryViewModel request, CancellationToken cancellationToken) - { - var exec = await _accountService.CategoryAddAsync(UserId, new AccountCategoryDto { Name = request.Name! }, cancellationToken); - switch (exec.Status) - { - case GeneralExecStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - case GeneralExecStatus.failure: - case GeneralExecStatus.not_found: - return ProblemBadResponse("Adding account category failed."); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpPut("{id}")] - public async Task AccountCategoriesUpdate([AsGuid] string id, AccountCategoryViewModel request, CancellationToken cancellationToken) - { - var exec = await _accountService.CategoryUpdateAsync(UserId, id.AsGuid(), new AccountCategoryDto { Name = request.Name! }, cancellationToken); - switch (exec.Status) - { - case GeneralExecStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - case GeneralExecStatus.failure: - case GeneralExecStatus.not_found: - return ProblemBadResponse("Update account category failed."); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpDelete("{id}")] - public async Task AccountCategoriesDelete([AsGuid] string id, CancellationToken cancellationToken) - { - var exec = await _accountService.CategoryRemoveAsync(UserId, id.AsGuid(), cancellationToken); - switch (exec.Status) - { - case AccountCategoryRemoveResult.success: - return OkResponse(_mapper.Map(exec.Result!)); - - case AccountCategoryRemoveResult.failure: - return ProblemBadResponse("Remove account category failed."); - case AccountCategoryRemoveResult.not_found: - return ProblemNotFoundResponse("Account category not found."); - case AccountCategoryRemoveResult.accounts_exists: - return ProblemBadResponse("Account category have accounts."); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } -} diff --git a/MyOffice.Web/Controllers/SettingsAccountController.cs b/MyOffice.Web/Controllers/SettingsAccountController.cs deleted file mode 100644 index 20a44f5..0000000 --- a/MyOffice.Web/Controllers/SettingsAccountController.cs +++ /dev/null @@ -1,226 +0,0 @@ -namespace MyOffice.Web.Controllers; - -using AutoMapper; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Authorization; - -using Core; -using Core.Extensions; -using Models.Account; -using Services.Account; -using Services.Account.Domain; -using Infrastructure.Attributes; -using Services.Identity; - -[Authorize] -[ApiController] -[Route("api/settings/accounts")] -[DefaultFromBody] -public class SettingsAccountController : BaseApiController -{ - private readonly ILogger _logger; - private readonly IMapper _mapper; - private readonly AccountService _accountService; - private readonly IContextProvider _contextProvider; - - public SettingsAccountController( - ILogger logger, - IMapper mapper, - AccountService accountService, - IContextProvider contextProvider - ) - { - _logger = logger; - _mapper = mapper; - _accountService = accountService; - _contextProvider = contextProvider; - } - - [HttpGet("invites")] - public async Task AccountInvites(CancellationToken cancellationToken) - { - var invites = await _accountService.InvitesGetAsync(_contextProvider.User.Email, cancellationToken); - - return OkResponse(_mapper.Map>(invites)); - } - - [HttpPost("invites/{id}/accept")] - public async Task AccountInviteAccept([AsGuid] string id, AccountInviteAcceptRequest request, CancellationToken cancellationToken) - { - var exec = await _accountService.InviteAcceptAsync(UserId, id.AsGuid(), request.Name, cancellationToken); - - switch (exec.Status) - { - case InviteAcceptStatus.invite_not_found: - return ProblemNotFoundResponse("Invite not found."); - case InviteAcceptStatus.account_not_found: - return ProblemNotFoundResponse("Account not found."); - - case InviteAcceptStatus.already_accepted: - case InviteAcceptStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpPost("invites/{id}/reject")] - public async Task AccountInviteReject([AsGuid] string id, CancellationToken cancellationToken) - { - var exec = await _accountService.InviteRejectAsync(id.AsGuid(), cancellationToken); - - return MapGeneralExec( - exec, - result => OkResponse(_mapper.Map(result)), - notFoundDetail: "Invite not found.", - failureDetail: "Invite reject failed."); - } - - [HttpGet] - public async Task AccountsGet([FromQuery][AsGuid(true)] string? category, CancellationToken cancellationToken) - { - var list = category.IsPresent() - ? await _accountService.GetByCategoryAsync(UserId, category!.AsGuid(), cancellationToken) - : await _accountService.GetAllAccountsAsync(UserId, cancellationToken); - - return OkResponse(_mapper.Map>(list.OrderBy(x => x.Name))); - } - - [HttpPost] - public async Task AccountsAdd(AccountViewModel request, CancellationToken cancellationToken) - { - var exec = await _accountService.AccountAddAsync(UserId, new AccountAdd - { - Name = request.Name, - CurrencyId = request.CurrencyId, - CategoryId = request.CategoryId.AsGuid(), - Type = request.Type, - }, cancellationToken); - - switch (exec.Status) - { - case AccountAddStatus.category_not_found: - return ProblemNotFoundResponse("Category not found."); - case AccountAddStatus.currency_not_found: - return ProblemNotFoundResponse("Currency not found."); - case AccountAddStatus.failure: - return ProblemBadResponse("Adding account failed."); - case AccountAddStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpPut("{id}")] - public async Task AccountsUpdate([AsGuid] string id, AccountEditRequestModel request, CancellationToken cancellationToken) - { - var exec = await _accountService.AccountUpdateAsync(UserId, id.AsGuid(), new AccountEdit - { - Name = request.Name, - CurrencyId = request.CurrencyId, - CategoryId = request.CategoryId?.AsGuidNull(), - UserId = request.UserId?.AsGuidNull(), - Type = request.Type, - }, cancellationToken); - - switch (exec.Status) - { - case AccountEditStatus.not_found: - return ProblemNotFoundResponse("Account not found."); - case AccountEditStatus.forbidden: - return ProblemForbiddenResponse("Manage access required."); - case AccountEditStatus.category_not_found: - return ProblemNotFoundResponse("Category not found."); - case AccountEditStatus.currency_not_found: - return ProblemNotFoundResponse("Currency not found."); - case AccountEditStatus.failure: - return ProblemBadResponse("Adding account failed."); - case AccountEditStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpDelete("{id}")] - public async Task AccountsDelete([AsGuid] string id, CancellationToken cancellationToken) - { - var exec = await _accountService.AccountDeleteAsync(UserId, id, cancellationToken); - return MapGeneralExec( - exec, - result => OkResponse(_mapper.Map(result)), - notFoundDetail: "Account not found.", - forbiddenDetail: "Manage access required."); - } - - [HttpDelete("{id}/category/{categoryId}")] - public async Task AccountsCategoryDelete([AsGuid] string id, [AsGuid] string categoryId, CancellationToken cancellationToken) - { - var exec = await _accountService.AccountCategoryRemoveAsync(UserId, id.AsGuid(), categoryId.AsGuid(), cancellationToken); - - return MapGeneralExec( - exec, - result => OkResponse(_mapper.Map(result)), - notFoundDetail: "Category not found.", - failureDetail: "Category remove failed.", - forbiddenDetail: "Manage access required."); - } - - [HttpPost("{id}/access")] - public async Task AccountsAccessAdd([AsGuid] string id, AccountAccessViewModel request, CancellationToken cancellationToken) - { - var model = _mapper.Map>(request.Accesses); - - var exec = await _accountService.AccessUpdateAsync(UserId, id.AsGuid(), model, cancellationToken); - - if (exec.Status != GeneralExecStatus.success) - { - return MapGeneralExec( - exec, - _ => OkResponse(_mapper.Map(exec.Result!)), - notFoundDetail: "Account not found.", - failureDetail: "Access update failed.", - forbiddenDetail: "Manage access required."); - } - - if (!request.Email.IsPresent()) - { - return OkResponse(_mapper.Map(exec.Result!)); - } - - var inviteExec = await _accountService.AccessInviteAsync(UserId, id.AsGuid(), request.Email!, request.AllowWrite, cancellationToken); - - switch (inviteExec.Status) - { - case AccessInviteStatus.account_not_found: - return ProblemNotFoundResponse("Account not found."); - case AccessInviteStatus.forbidden: - return ProblemForbiddenResponse("Manage access required."); - - case AccessInviteStatus.access_exists: - case AccessInviteStatus.invite_exists: - case AccessInviteStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpDelete("{id}/access/{userId}")] - public async Task AccountsAccessDelete([AsGuid] string id, [AsGuid] string userId, CancellationToken cancellationToken) - { - var exec = await _accountService.AccessDeleteAsync(UserId, id.AsGuid(), userId.AsGuid(), cancellationToken); - - return MapGeneralExec( - exec, - result => OkResponse(_mapper.Map(result)), - notFoundDetail: "Account not found.", - failureDetail: "Access delete failed.", - forbiddenDetail: "Manage access required."); - } -} diff --git a/MyOffice.Web/Controllers/SettingsCurrencyController.cs b/MyOffice.Web/Controllers/SettingsCurrencyController.cs deleted file mode 100644 index 9d45e6d..0000000 --- a/MyOffice.Web/Controllers/SettingsCurrencyController.cs +++ /dev/null @@ -1,142 +0,0 @@ -namespace MyOffice.Web.Controllers; - -using AutoMapper; -using Core; -using Core.Extensions; -using Infrastructure.Attributes; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Authorization; -using Models.Currency; -using Services.Currency; -using Services.Currency.Domain; - -[Authorize] -[ApiController] -[Route("api/settings/currencies")] -[DefaultFromBody] -public class SettingCurrencyController : BaseApiController -{ - private readonly CurrencyService _currencyService; - private readonly ILogger _logger; - private readonly IMapper _mapper; - - public SettingCurrencyController( - CurrencyService currencyService, - ILogger logger, - IMapper mapper - ) - { - _currencyService = currencyService; - _logger = logger; - _mapper = mapper; - } - - [HttpGet] - public async Task Get(CancellationToken cancellationToken) - { - var list = await _currencyService.GetAllWithRatesAsync(UserId, cancellationToken); - - return OkResponse(_mapper.Map>(list).OrderBy(x => x.Id)); - } - - [HttpPost] - public async Task Add(CurrencyAddModel currency, CancellationToken cancellationToken) - { - var exec = await _currencyService.CurrencyAddAsync(UserId, new CurrencyDto - { - UserId = UserId, - CurrencyGlobalId = currency.Id, - Name = currency.Name, - ShortName = currency.ShortName, - }, cancellationToken); - - switch (exec.Status) - { - case CurrencyAddStatus.success: - case CurrencyAddStatus.exists: - await _currencyService.CurrencyRateAddAsync(UserId, exec.Result!.Id, new CurrencyRateDto - { - CurrencyId = exec.Result!.Id, - Rate = currency.Rate, - Quantity = currency.Quantity, - DateTime = currency.RateDate.Date, - }, cancellationToken); - return OkResponse(_mapper.Map(exec.Result!)); - - case CurrencyAddStatus.failed: - return ProblemBadResponse("Adding currency failed."); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpPut("{id}")] - public async Task Update(string id, CurrencyEditModel currency, CancellationToken cancellationToken) - { - var exec = await _currencyService.CurrencyUpdateAsync( - UserId, - id.AsGuid(), - new CurrencyEdit { Name = currency.Name, ShortName = currency.ShortName, IsPrimary = currency.IsPrimary }, - cancellationToken - ); - - switch (exec.Status) - { - case CurrencyEditStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - case CurrencyEditStatus.not_found: - case CurrencyEditStatus.failed: - return ProblemNotFoundResponse("Currency not found."); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpDelete("{id}")] - public async Task Delete([AsGuid] string id, CancellationToken cancellationToken) - { - var exec = await _currencyService.RemoveAsync(UserId, id.AsGuid(), cancellationToken); - - switch (exec.Status) - { - case GeneralExecStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - case GeneralExecStatus.not_found: - case GeneralExecStatus.failure: - return ProblemNotFoundResponse("Currency not found."); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpPost("{id}/rate")] - public async Task AddRate(string id, CurrencyRateModel currencyRate, CancellationToken cancellationToken) - { - var exec = await _currencyService.CurrencyRateAddAsync(UserId, id.AsGuid(), new CurrencyRateDto - { - CurrencyId = id.AsGuid(), - Quantity = currencyRate.Quantity, - Rate = currencyRate.Rate, - DateTime = currencyRate.RateDate.Date, - }, cancellationToken); - - switch (exec.Status) - { - case CurrencyAddRateStatus.failed: - return ProblemBadResponse("Adding currency rate failed."); - case CurrencyAddRateStatus.not_found: - return ProblemNotFoundResponse("Currency not found."); - - case CurrencyAddRateStatus.success: - return OkResponse(_mapper.Map(exec.Result!)); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } -} diff --git a/MyOffice.Web/Controllers/SettingsItemController.cs b/MyOffice.Web/Controllers/SettingsItemController.cs deleted file mode 100644 index a03ba98..0000000 --- a/MyOffice.Web/Controllers/SettingsItemController.cs +++ /dev/null @@ -1,163 +0,0 @@ -namespace MyOffice.Web.Controllers; - -using AutoMapper; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -using Models.Item; -using Core.Extensions; -using Core; -using Infrastructure.Attributes; -using Services.Item; -using Services.Item.Domain; - -[Authorize] -[ApiController] -[Route("api/settings")] -[DefaultFromBody] -public class SettingsItemController : BaseApiController -{ - private ILogger _logger; - private IMapper _mapper; - private ItemService _itemService; - - public SettingsItemController( - ILogger logger, - ItemService itemService, - IMapper mapper - ) - { - _itemService = itemService; - _logger = logger; - _mapper = mapper; - } - - [HttpGet("item-categories")] - public async Task ItemsCategories(CancellationToken cancellationToken) - { - var list = await _itemService.GetAllCategoriesAsync(UserId, cancellationToken); - - return Ok(_mapper.Map>(list) - .OrderByDescending(x => x.SortOrder) - .ThenBy(x => x.Name)); - } - - [HttpPost("item-categories")] - public async Task ItemCategoriesAdd(ItemCategoryViewModel request, CancellationToken cancellationToken) - { - var exec = await _itemService.CategoryAddAsync(UserId, request.FromModel(), cancellationToken); - - switch (exec.Status) - { - case GeneralExecStatus.success: - return Ok(_mapper.Map(exec.Result!)); - - case GeneralExecStatus.failure: - case GeneralExecStatus.not_found: - return ProblemBadResponse("Adding item category failed."); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpPut("item-categories/{id}")] - public async Task ItemCategoriesUpdate( - [AsGuid] string id, - ItemCategoryViewModel request, - CancellationToken cancellationToken) - { - var exec = await _itemService.CategoryUpdateAsync(UserId, id.AsGuid(), request.FromModel(), cancellationToken); - - switch (exec.Status) - { - case GeneralExecStatus.success: - return Ok(_mapper.Map(exec.Result!)); - - case GeneralExecStatus.failure: - case GeneralExecStatus.not_found: - return ProblemBadResponse("Update item category failed."); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpDelete("item-categories/{id}")] - public async Task ItemCategoriesDelete([AsGuid] string id, CancellationToken cancellationToken) - { - var exec = await _itemService.CategoryRemoveAsync(UserId, id.AsGuid(), cancellationToken); - switch (exec.Status) - { - case ItemCategoryRemoveResult.success: - return Ok(_mapper.Map(exec.Result!)); - - case ItemCategoryRemoveResult.failure: - return ProblemBadResponse("Remove item category failed."); - case ItemCategoryRemoveResult.not_found: - return ProblemNotFoundResponse("Account item not found."); - case ItemCategoryRemoveResult.accounts_exists: - return ProblemBadResponse("Account motion have accounts."); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpGet("items")] - public async Task Items([FromQuery][AsGuid] string category, CancellationToken cancellationToken) - { - var categoryId = category.AsGuid(); - - var list = categoryId != UserId - ? await _itemService.GetByCategoryAsync(UserId, categoryId, cancellationToken) - : await _itemService.GetByUncategorizedAsync(UserId, cancellationToken); - - return Ok(_mapper.Map>(list.OrderBy(x => x.Name))); - } - - [HttpPut("items/{id}")] - public async Task ItemsUpdate( - [AsGuid] string id, - ItemEditModel request, - CancellationToken cancellationToken) - { - var exec = await _itemService.UpdateAsync(UserId, id.AsGuid(), request.Category.AsGuid(), cancellationToken); - - switch (exec.Status) - { - case GeneralExecStatus.not_found: - return ProblemNotFoundResponse("Item not found."); - case GeneralExecStatus.failure: - return ProblemBadResponse("Item update failed."); - case GeneralExecStatus.success: - return Ok(_mapper.Map(exec.Result!)); - - default: - throw new NotSupportedException(exec.Status.ToString()); - } - } - - [HttpPost("items")] - public async Task ItemsPost(ItemChangeCategoryModel request, CancellationToken cancellationToken) - { - var exec = await _itemService.UpdateItemsCategoryAsync( - UserId, - request.category.AsGuid(), - request.Items.Select(x => x.AsGuid()).ToList(), - cancellationToken); - - switch (exec) - { - case GeneralExecStatus.not_found: - return ProblemNotFoundResponse("Category not found."); - case GeneralExecStatus.failure: - return ProblemBadResponse("Update failed."); - case GeneralExecStatus.success: - return Ok(new {}); - - default: - throw new NotSupportedException(exec.ToString()); - } - } -} diff --git a/MyOffice.Web/Controllers/UserController.cs b/MyOffice.Web/Controllers/UserController.cs deleted file mode 100644 index d4044c7..0000000 --- a/MyOffice.Web/Controllers/UserController.cs +++ /dev/null @@ -1,189 +0,0 @@ -namespace MyOffice.Web.Controllers; - -using Models.Auth; -using Identity.Domain; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Mvc; -using System; -using System.ComponentModel.DataAnnotations; -using Microsoft.AspNetCore.Authorization; -using MyOffice.Data.Models.Users; -using Core.Extensions; -using MyOffice.Core.Identity; -using Core; -using Services.Users; -using Services.Users.Domain; -using MyOffice.Data.Models.Currencies; -using MyOffice.Web.Infrastructure.Attributes; - -[ApiController] -[Route("api/user")] -[DefaultFromBody] -public class UserController : BaseApiController -{ - private readonly UserManager> _userManager; - private readonly UserService _userService; - private readonly IEnumerable _externalProviderValidators; - - public UserController( - UserManager> userManager, - UserService userService, - IEnumerable externalProviderValidators - ) - { - _userManager = userManager; - _userService = userService; - _externalProviderValidators = externalProviderValidators; - } - - [AllowAnonymous] - [HttpPost("register")] - public async Task Register([FromBody] RegisterModel request) - { - if (!ModelState.IsValid) - return BadRequest(new - { - Succeeded = false, - Errors = ModelState.Values - .SelectMany(v => v.Errors) - .Select(e => new { Code = "Validation", Description = e.ErrorMessage }) - }); - - var email = request.UserName.Trim(); - var user = new ApplicationUser - { - Id = Guid.NewGuid(), - UserName = email, - Email = email, - IsEmailConfirmed = true, - CurrencyId = CurrencyGlobalIdEnum.USD.ToString(), - }; - - var result = await _userManager.CreateAsync(user, request.Password); - - return Ok(new - { - result.Succeeded, - Errors = result.Errors - .Where(x => !x.Code.Equals("DuplicateUserName")) - .Select(x => new { x.Code, x.Description }) - }); - } - - [Authorize] - [HttpGet("profile")] - public async Task ProfileGet() - { - var user = await _userManager.FindByIdAsync(UserId.ToString()); - - return user.ToModel(await _userService.GetUserExternals(user.Id)); - } - - [Authorize] - [HttpPost("profile")] - public async Task ProfileUpdate([FromBody] ProfileModel model) - { - var user = await _userManager.FindByIdAsync(UserId.ToString()); ; - - user.FirstName = model.FirstName; - user.LastName = model.LastName; - user.FullName = model.FullName.NullIfEmpty() ?? $"{model.FirstName} {model.LastName}"; - user.CurrencyId = model.Currency; - - await _userManager.UpdateAsync(user); - - return user.ToModel(await _userService.GetUserExternals(user.Id)); - } - - [Authorize] - [HttpPost("attach")] - public async Task AttachProvider([FromBody] AttachModel model) - { - var validator = _externalProviderValidators.FirstOrDefault(x => x.Provider.EqualsIgnoreCase(model.Provider)); - if (validator == null) return ProblemBadResponse("Provider not supported"); - - var result = await validator.ValidateAsync(model.Token); - if (!result.IsSuccessed) return ProblemBadResponse("Token not valid"); - - var execResult = await _userService.AddUserExternalAsync(UserId, model.Provider, result.ExternalId!, result.Email!); - switch (execResult.Status) - { - case AddUserExternalStatusEnum.success: - return Ok(new - { - success = true - }); - - case AddUserExternalStatusEnum.externalid_used: - case AddUserExternalStatusEnum.user_not_valid: - return ProblemBadResponse("Provider already connected"); - - default: - throw new NotSupportedException(execResult.Status.ToString()); - } - } - - [Authorize] - [HttpPost("deattach")] - public async Task DeattachProvider([FromBody] DeattachModel model) - { - var exec = await _userService.RemoveUserExternal(UserId, model.Provider); - - if (exec.Status == GeneralExecStatus.not_found) return ProblemBadResponse("Provider not connected"); - - return Ok(new - { - success = true - }); - } -} - -public class DeattachModel -{ - [Required] public string Provider { get; set; } = null!; -} - -public class AttachModel -{ - [Required] public string Provider { get; set; } = null!; - [Required] public string Token { get; set; } = null!; -} - -public class ProfileModel -{ - public class ProviderModel - { - public string Provider { get; set; } = null!; - - public DateTime CreatedOn { get; set; } - } - - public string? Email { get; set; } - public string? FirstName { get; set; } - public string? LastName { get; set; } - public string? FullName { get; set; } - public bool? IsEmailConfirmed { get; set; } - public string? Currency { get; set; } - public List? Providers { get; set; } -} - -public static class ProfileModelExtensions -{ - public static ProfileModel ToModel(this ApplicationUser user, List userClaims) - { - return new ProfileModel - { - Email = user.Email, - FirstName = user.FirstName, - LastName = user.LastName, - FullName = user.FullName, - IsEmailConfirmed = user.IsEmailConfirmed, - Currency = user.CurrencyId, - Providers = userClaims?.Select(x => new ProfileModel.ProviderModel - { - Provider = x.Provider, - CreatedOn = x.CreatedOn - }).ToList() - }; - } -} \ No newline at end of file diff --git a/MyOffice.Web/Identity/ContextProvider.cs b/MyOffice.Web/Identity/ContextProvider.cs deleted file mode 100644 index 8ad8e1e..0000000 --- a/MyOffice.Web/Identity/ContextProvider.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace MyOffice.Web.Identity; - -using Data.Repositories.Users; -using MyOffice.Data.Models.Users; -using MyOffice.Services.Identity; - -public class ContextProvider : IContextProvider -{ - private readonly IHttpContextAccessor _httpContextAccessor; - private readonly IUserRepository _userRepository; - - public ContextProvider( - IHttpContextAccessor httpContextAccessor, - IUserRepository userRepository - ) - { - _httpContextAccessor = httpContextAccessor; - _userRepository = userRepository; - } - - private User? _user = null; - public User User - { - get - { - _user ??= _userRepository.GetUser(UserId); - - return _user!; - } - } - - public Guid UserId - { - get - { - return Guid.Parse(_httpContextAccessor!.HttpContext!.User!.Claims!.FirstOrDefault(x => x.Type == "sub")!.Value); - } - } -} diff --git a/MyOffice.Web/Identity/Domain/ApplicationRole.cs b/MyOffice.Web/Identity/Domain/ApplicationRole.cs deleted file mode 100644 index ddd8f96..0000000 --- a/MyOffice.Web/Identity/Domain/ApplicationRole.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace MyOffice.Web.Identity.Domain; - -public class ApplicationRole -{ -} \ No newline at end of file diff --git a/MyOffice.Web/Identity/Domain/ApplicationUser.cs b/MyOffice.Web/Identity/Domain/ApplicationUser.cs deleted file mode 100644 index c4f63d4..0000000 --- a/MyOffice.Web/Identity/Domain/ApplicationUser.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyOffice.Web.Identity.Domain; - -public class ApplicationUser -{ -#pragma warning disable CS8618 // Non-nullable property 'Id' must contain a non-null value when exiting constructor. Consider declaring the property as nullable. - public TKey Id { get; set; } -#pragma warning restore CS8618 // Non-nullable property 'Id' must contain a non-null value when exiting constructor. Consider declaring the property as nullable. - public string UserName { get; set; } = null!; - public string Email { get; set; } = null!; - public string PasswordHash { get; set; } = null!; - - public string? FirstName { get; set; } - public string? LastName { get; set; } - public string? FullName { get; set; } - public bool IsEmailConfirmed { get; set; } - public string? CurrencyId { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Web/Identity/Domain/ExternalProvidersConfig.cs b/MyOffice.Web/Identity/Domain/ExternalProvidersConfig.cs deleted file mode 100644 index af1b964..0000000 --- a/MyOffice.Web/Identity/Domain/ExternalProvidersConfig.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyOffice.Web.Identity.Domain; - -public class ExternalProvidersConfig -{ - public class Auth0Config - { - public string? ClientId { get; set; } - public string? Domain { get; set; } - public string? SecretKey { get; set; } - } - - public class GoogleConfig - { - public string? ClientId { get; set; } - } - - public Auth0Config? Auth0 { get; set; } - public GoogleConfig? Google { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Web/Identity/ExternalProviders/ExternalProviderValidatorAuth0.cs b/MyOffice.Web/Identity/ExternalProviders/ExternalProviderValidatorAuth0.cs deleted file mode 100644 index efff106..0000000 --- a/MyOffice.Web/Identity/ExternalProviders/ExternalProviderValidatorAuth0.cs +++ /dev/null @@ -1,69 +0,0 @@ -namespace MyOffice.Web.Identity.ExternalProviders; - -using Domain; -using Microsoft.Extensions.Options; -using Microsoft.IdentityModel.Protocols; -using Microsoft.IdentityModel.Protocols.OpenIdConnect; -using Microsoft.IdentityModel.Tokens; -using System.IdentityModel.Tokens.Jwt; -using System.Text; -using Core.Extensions; -using Core.Identity; - -public class ExternalProviderValidatorAuth0 : IExternalProviderValidator -{ - private readonly ExternalProvidersConfig _externalProvidersConfig; - private readonly ILogger _logger; - - public ExternalProviderValidatorAuth0( - ILogger logger, - IOptions externalProvidersConfig - ) - { - _externalProvidersConfig = externalProvidersConfig.Value; - _logger = logger; - - Provider = ExternalProvidersConst.PROVIDER_AUTH0; - IsConfigured = _externalProvidersConfig.IsAuth0Configured(); - } - - public string Provider { get; } - public bool IsConfigured { get; } - - public async Task ValidateAsync(string token) - { - var auth0Domain = _externalProvidersConfig.Auth0!.Domain!; - var secretKey = _externalProvidersConfig.Auth0!.SecretKey!; - var securityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey)); - var configurationManager = new ConfigurationManager( - $"{auth0Domain}.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever()); - var openIdConfig = await configurationManager.GetConfigurationAsync(CancellationToken.None); - - var validations = new TokenValidationParameters - { - ValidIssuer = auth0Domain, - ValidAudiences = new[] { _externalProvidersConfig.Auth0!.ClientId }, - IssuerSigningKeys = openIdConfig.SigningKeys, - TokenDecryptionKey = securityKey - }; - - var tokenHandler = new JwtSecurityTokenHandler(); - var user = tokenHandler.ValidateToken(token, validations, out var validatedToken); - if (user.Identity?.IsAuthenticated != true) - { - return ExternalProviderValidatorResult.Failed(); - } - - var email = user.Claims.GetEmail(); - var emailVerified = user.Claims.GetValue("email_verified").AsBool(); - var fullName = user.Claims.GetValue("name")?.ToString(); - var externalId = user.Claims.GetSID(); - - if (email == null || externalId == null) - { - return ExternalProviderValidatorResult.Failed(); - } - - return ExternalProviderValidatorResult.Success(email, emailVerified, externalId, fullName); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Identity/ExternalProviders/ExternalProviderValidatorGoogle.cs b/MyOffice.Web/Identity/ExternalProviders/ExternalProviderValidatorGoogle.cs deleted file mode 100644 index d5e6c4d..0000000 --- a/MyOffice.Web/Identity/ExternalProviders/ExternalProviderValidatorGoogle.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace MyOffice.Web.Identity.ExternalProviders; - -using MyOffice.Core.Identity; -using Domain; -using Google.Apis.Auth; -using Microsoft.Extensions.Options; - -public class ExternalProviderValidatorGoogle : IExternalProviderValidator -{ - private readonly ExternalProvidersConfig _externalProvidersConfig; - - public ExternalProviderValidatorGoogle( - IOptions externalProvidersConfig - ) - { - _externalProvidersConfig = externalProvidersConfig.Value; - - Provider = ExternalProvidersConst.PROVIDER_GOOGLE; - IsConfigured = _externalProvidersConfig.IsGoogleConfigured(); - } - - public string Provider { get; } - public bool IsConfigured { get; } - - public async Task ValidateAsync(string token) - { - var settings = new GoogleJsonWebSignature.ValidationSettings() - { - Audience = new List() { _externalProvidersConfig.Google!.ClientId! } - }; - var result = await GoogleJsonWebSignature.ValidateAsync(token, settings); - if (!result.EmailVerified) return ExternalProviderValidatorResult.Failed(); - - return ExternalProviderValidatorResult.Success(result.Email, result.EmailVerified, result.Subject, result.Name); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Identity/ExternalProviders/ExternalProvidersConst.cs b/MyOffice.Web/Identity/ExternalProviders/ExternalProvidersConst.cs deleted file mode 100644 index 261bc0a..0000000 --- a/MyOffice.Web/Identity/ExternalProviders/ExternalProvidersConst.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyOffice.Web.Identity.ExternalProviders; - -public class ExternalProvidersConst -{ - public const string PROVIDER_GOOGLE = "google"; - public const string PROVIDER_AUTH0 = "auth0"; -} \ No newline at end of file diff --git a/MyOffice.Web/Identity/ExternalProvidersConfigExtensions.cs b/MyOffice.Web/Identity/ExternalProvidersConfigExtensions.cs deleted file mode 100644 index 49c8a0d..0000000 --- a/MyOffice.Web/Identity/ExternalProvidersConfigExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using MyOffice.Web.Identity.Domain; - -namespace MyOffice.Web.Identity; - -using Core.Extensions; - -public static class ExternalProvidersConfigExtensions -{ - public static bool IsGoogleConfigured(this ExternalProvidersConfig? config) - { - return config != null - && config.Google != null - && config.Google.ClientId.IsPresent(); - } - - public static bool IsAuth0Configured(this ExternalProvidersConfig? config) - { - return config != null - && config.Auth0 != null - && config.Auth0.ClientId.IsPresent() - && config.Auth0.Domain.IsPresent() - && config.Auth0.SecretKey.IsPresent(); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Identity/OpenIddict/ExternalGrantHandler.cs b/MyOffice.Web/Identity/OpenIddict/ExternalGrantHandler.cs deleted file mode 100644 index 7cdf7cc..0000000 --- a/MyOffice.Web/Identity/OpenIddict/ExternalGrantHandler.cs +++ /dev/null @@ -1,137 +0,0 @@ -namespace MyOffice.Web.Auth; - -using Core.Extensions; -using Core.Identity; -using Data.Models.Users; -using Data.Repositories.Users; -using Identity.Domain; -using Identity.ExternalProviders; -using Identity.Repositories; -using Microsoft.Extensions.Options; -using OpenIddict.Abstractions; -using OpenIddict.Server; -using static OpenIddict.Abstractions.OpenIddictConstants; -using static OpenIddict.Server.OpenIddictServerEvents; - -public sealed class ExternalGrantHandler : IOpenIddictServerHandler -{ - private readonly AppUserManager _userManager; - private readonly IUserExternalRepository _userExternalRepository; - private readonly IEnumerable _externalProviderValidators; - private readonly IHttpContextAccessor _httpContextAccessor; - - public ExternalGrantHandler( - AppUserManager userManager, - IUserExternalRepository userExternalRepository, - IEnumerable externalProviderValidators, - IHttpContextAccessor httpContextAccessor - ) - { - _userManager = userManager; - _userExternalRepository = userExternalRepository; - _externalProviderValidators = externalProviderValidators; - _httpContextAccessor = httpContextAccessor; - } - - public async ValueTask HandleAsync(HandleTokenRequestContext context) - { - if (!string.Equals(context.Request.GrantType, OpenIddictAuthConstants.ExternalGrantType, StringComparison.Ordinal)) - return; - - var provider = context.Request.GetParameter("provider")?.ToString(); - if (provider.IsMissing()) - { - context.Reject(Errors.InvalidRequest, "The provider parameter is required."); - return; - } - - var validator = _externalProviderValidators.FirstOrDefault(x => x.Provider.EqualsIgnoreCase(provider)); - if (validator is null || !validator.IsConfigured) - { - context.Reject(Errors.InvalidRequest, $"Provider not supported: {provider}"); - return; - } - - var token = context.Request.GetParameter("token")?.ToString(); - if (token.IsMissing()) - { - context.Reject(Errors.InvalidRequest, "The token parameter is required."); - return; - } - - var validationResult = await validator.ValidateAsync(token); - if (!validationResult.IsSuccessed) - { - context.Reject(Errors.InvalidGrant, "Token not valid."); - return; - } - - if (_httpContextAccessor.HttpContext?.User?.Identity?.IsAuthenticated == true) - { - context.Reject(Errors.InvalidGrant, "Authentication failed."); - return; - } - - var user = await _userManager.FindByEmailAsync(validationResult.Email!); - if (user is null) - { - if (!validationResult.EmailVerified) - { - context.Reject(Errors.InvalidGrant, "Email not confirmed."); - return; - } - - user = await CreateUserAsync(validationResult.Email!, validationResult.EmailVerified, validationResult.FullName); - if (user is null) - { - context.Reject(Errors.InvalidGrant, "Unable to create user."); - return; - } - } - - var externalLogin = await _userExternalRepository.GetByUserIdAsync(user.Id, provider) - ?? AddExternalLogin(user, validationResult.Email!, validationResult.ExternalId!, provider); - - context.SignIn(OpenIddictClaimsHelper.CreatePrincipal(user, context.Request.GetScopes())); - } - - private async Task?> CreateUserAsync(string email, bool isEmailConfirmed, string? fullName) - { - var user = new ApplicationUser - { - Id = Guid.NewGuid(), - UserName = email, - Email = email, - IsEmailConfirmed = isEmailConfirmed, - FullName = fullName - }; - - var password = "Qq1!_" + Guid.NewGuid(); - var result = await _userManager.CreateAsync(user, password); - return result.Succeeded ? user : null; - } - - private UserExternal AddExternalLogin( - ApplicationUser user, - string email, - string externalId, - string provider - ) - { - var existing = _userExternalRepository.GetByUserId(user.Id, provider); - if (existing is not null) - return existing; - - var claim = new UserExternal - { - UserId = user.Id, - CreatedOn = DateTime.UtcNow, - Provider = provider.ToLower(), - ExternalId = externalId, - Email = email - }; - _userExternalRepository.AddUserExternal(claim); - - return claim; - } -} diff --git a/MyOffice.Web/Identity/OpenIddict/OpenIddictClaimsHelper.cs b/MyOffice.Web/Identity/OpenIddict/OpenIddictClaimsHelper.cs deleted file mode 100644 index 3cdbdb6..0000000 --- a/MyOffice.Web/Identity/OpenIddict/OpenIddictClaimsHelper.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace MyOffice.Web.Auth; - -using System.Security.Claims; -using Identity.Domain; -using Microsoft.IdentityModel.Tokens; -using OpenIddict.Abstractions; -using static OpenIddict.Abstractions.OpenIddictConstants; - -public static class OpenIddictClaimsHelper -{ - public static ClaimsPrincipal CreatePrincipal( - ApplicationUser user, - IEnumerable scopes - ) - { - var identity = new ClaimsIdentity( - authenticationType: TokenValidationParameters.DefaultAuthenticationType, - nameType: Claims.Name, - roleType: Claims.Role); - - var userId = user.Id.ToString(); - identity.SetClaim(Claims.Subject, userId); - identity.SetClaim(Claims.Name, user.UserName); - identity.SetClaim(Claims.PreferredUsername, user.UserName); - identity.SetClaim(Claims.Email, user.Email); - identity.SetClaim(Claims.EmailVerified, user.IsEmailConfirmed); - - if (!string.IsNullOrWhiteSpace(user.FullName)) - identity.SetClaim(Claims.GivenName, user.FullName); - - identity.SetScopes(scopes); - identity.SetDestinations(static claim => claim.Type switch - { - Claims.Name or Claims.PreferredUsername or Claims.Email or Claims.EmailVerified or Claims.GivenName - => [Destinations.AccessToken, Destinations.IdentityToken], - _ => [Destinations.AccessToken] - }); - - return new ClaimsPrincipal(identity); - } -} diff --git a/MyOffice.Web/Identity/OpenIddict/OpenIddictConstants.cs b/MyOffice.Web/Identity/OpenIddict/OpenIddictConstants.cs deleted file mode 100644 index 62689d0..0000000 --- a/MyOffice.Web/Identity/OpenIddict/OpenIddictConstants.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyOffice.Web.Auth; - -public static class OpenIddictAuthConstants -{ - public const string ApiScope = "api"; - public const string ApiFriendlyName = "MyOffice.Web API"; - public const string SpaClientId = "angulartemplate_spa"; - public const string ExternalGrantType = "external"; - public const string RolesScope = "roles"; -} diff --git a/MyOffice.Web/Identity/OpenIddict/OpenIddictSeeder.cs b/MyOffice.Web/Identity/OpenIddict/OpenIddictSeeder.cs deleted file mode 100644 index a095cd3..0000000 --- a/MyOffice.Web/Identity/OpenIddict/OpenIddictSeeder.cs +++ /dev/null @@ -1,130 +0,0 @@ -namespace MyOffice.Web.Auth; - -using DbContext; -using Infrastructure; -using Microsoft.Extensions.Options; -using OpenIddict.Abstractions; -using static OpenIddict.Abstractions.OpenIddictConstants; - -public sealed class OpenIddictSeeder : IHostedService -{ - private readonly IServiceProvider _serviceProvider; - private readonly IConfiguration _configuration; - private readonly ILogger _logger; - - public OpenIddictSeeder( - IServiceProvider serviceProvider, - IConfiguration configuration, - ILogger logger - ) - { - _serviceProvider = serviceProvider; - _configuration = configuration; - _logger = logger; - } - - public async Task StartAsync(CancellationToken cancellationToken) - { - await using var scope = _serviceProvider.CreateAsyncScope(); - - await RegisterScopesAsync(scope.ServiceProvider, cancellationToken); - await RegisterClientAsync(scope.ServiceProvider, cancellationToken); - } - - public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; - - private async Task RegisterScopesAsync(IServiceProvider provider, CancellationToken cancellationToken) - { - var manager = provider.GetRequiredService(); - - if (await manager.FindByNameAsync(OpenIddictAuthConstants.ApiScope, cancellationToken) is null) - { - await manager.CreateAsync(new OpenIddictScopeDescriptor - { - Name = OpenIddictAuthConstants.ApiScope, - DisplayName = OpenIddictAuthConstants.ApiFriendlyName, - Resources = { OpenIddictAuthConstants.ApiScope } - }, cancellationToken); - - _logger.LogInformation("Created OpenIddict scope {Scope}.", OpenIddictAuthConstants.ApiScope); - } - - if (await manager.FindByNameAsync(OpenIddictAuthConstants.RolesScope, cancellationToken) is null) - { - await manager.CreateAsync(new OpenIddictScopeDescriptor - { - Name = OpenIddictAuthConstants.RolesScope, - DisplayName = "User roles" - }, cancellationToken); - - _logger.LogInformation("Created OpenIddict scope {Scope}.", OpenIddictAuthConstants.RolesScope); - } - } - - private async Task RegisterClientAsync(IServiceProvider provider, CancellationToken cancellationToken) - { - var manager = provider.GetRequiredService(); - var globalSettings = provider.GetRequiredService(); - - var redirectUri = BuildRedirectUri(globalSettings.Host); - var existing = await manager.FindByClientIdAsync(OpenIddictAuthConstants.SpaClientId, cancellationToken); - var descriptor = CreateSpaClientDescriptor(redirectUri); - - if (existing is null) - { - await manager.CreateAsync(descriptor, cancellationToken); - _logger.LogInformation("Created OpenIddict client {ClientId}.", OpenIddictAuthConstants.SpaClientId); - return; - } - - var currentRedirectUris = await manager.GetRedirectUrisAsync(existing, cancellationToken); - foreach (var uri in currentRedirectUris) - { - if (!string.Equals(uri, redirectUri.ToString(), StringComparison.Ordinal)) - descriptor.RedirectUris.Add(new Uri(uri, UriKind.Absolute)); - } - - await manager.UpdateAsync(existing, descriptor, cancellationToken); - _logger.LogInformation("Updated OpenIddict client {ClientId}.", OpenIddictAuthConstants.SpaClientId); - } - - internal static OpenIddictApplicationDescriptor CreateSpaClientDescriptor(Uri redirectUri) - { - var descriptor = new OpenIddictApplicationDescriptor - { - ClientId = OpenIddictAuthConstants.SpaClientId, - DisplayName = "MyOffice SPA", - ClientType = ClientTypes.Public, - ConsentType = ConsentTypes.Implicit, - Permissions = - { - Permissions.Endpoints.Authorization, - Permissions.Endpoints.Token, - Permissions.Endpoints.EndSession, - Permissions.GrantTypes.AuthorizationCode, - Permissions.GrantTypes.Password, - Permissions.GrantTypes.RefreshToken, - Permissions.Prefixes.GrantType + OpenIddictAuthConstants.ExternalGrantType, - Permissions.ResponseTypes.Code, - Permissions.Scopes.Email, - Permissions.Scopes.Profile, - Permissions.Scopes.Roles, - Permissions.Prefixes.Scope + Scopes.OpenId, - Permissions.Prefixes.Scope + Scopes.OfflineAccess, - Permissions.Prefixes.Scope + OpenIddictAuthConstants.ApiScope, - Permissions.Prefixes.Scope + OpenIddictAuthConstants.RolesScope - } - }; - - descriptor.RedirectUris.Add(redirectUri); - return descriptor; - } - - internal static Uri BuildRedirectUri(string? host) - { - if (string.IsNullOrWhiteSpace(host)) - return new Uri("http://localhost:4300/silent-refresh.html"); - - return new Uri($"{host.TrimEnd('/')}/silent-refresh.html"); - } -} diff --git a/MyOffice.Web/Identity/OpenIddict/OpenIddictServiceCollectionExtensions.cs b/MyOffice.Web/Identity/OpenIddict/OpenIddictServiceCollectionExtensions.cs deleted file mode 100644 index 44942fd..0000000 --- a/MyOffice.Web/Identity/OpenIddict/OpenIddictServiceCollectionExtensions.cs +++ /dev/null @@ -1,192 +0,0 @@ -namespace MyOffice.Web.Auth; - -using System.Security.Cryptography; -using DbContext; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.IdentityModel.Tokens; -using OpenIddict.Server; -using OpenIddict.Validation.AspNetCore; -using static OpenIddict.Abstractions.OpenIddictConstants; -using static OpenIddict.Server.OpenIddictServerEvents; - -public static class OpenIddictServiceCollectionExtensions -{ - public static IServiceCollection AddMyOfficeOpenIddict( - this IServiceCollection services, - IConfiguration configuration, - IHostEnvironment environment - ) - { - services.AddOpenIddict() - .AddCore(options => - { - options.UseEntityFrameworkCore() - .UseDbContext(); - }) - .AddServer(options => - { - options.SetAuthorizationEndpointUris("/connect/authorize") - .SetTokenEndpointUris("/connect/token") - .SetUserInfoEndpointUris("/connect/userinfo") - .SetEndSessionEndpointUris("/connect/logout"); - - options.AllowAuthorizationCodeFlow() - .AllowPasswordFlow() - .AllowRefreshTokenFlow() - .AllowCustomFlow(OpenIddictAuthConstants.ExternalGrantType); - - options.RegisterScopes( - Scopes.OpenId, - Scopes.Email, - Scopes.Profile, - Scopes.Roles, - Scopes.OfflineAccess, - OpenIddictAuthConstants.ApiScope, - OpenIddictAuthConstants.RolesScope); - - ConfigureCryptography(options, configuration, environment); - - var aspNetCoreBuilder = options.UseAspNetCore() - .EnableAuthorizationEndpointPassthrough() - .EnableUserInfoEndpointPassthrough() - .EnableEndSessionEndpointPassthrough(); - - // Local HTTP only. In production nginx terminates TLS and - // ForwardedHeaders restores https:// for OpenIddict. - // Docker demo also serves plain HTTP (OpenIddict:AllowHttp / Environment=Docker). - if (environment.IsDevelopment() - || IsDockerEnvironment(environment) - || configuration.GetValue("OpenIddict:AllowHttp", false)) - { - aspNetCoreBuilder.DisableTransportSecurityRequirement(); - } - - // Password and external grants need custom handlers (separate registrations — - // a second UseScopedHandler() on the same builder replaces the first). - options.AddEventHandler(builder => - builder.UseScopedHandler()); - - options.AddEventHandler(builder => - builder.UseScopedHandler()); - }) - .AddValidation(options => - { - options.UseLocalServer(); - options.UseAspNetCore(); - }); - - services.AddAuthentication(options => - { - options.DefaultScheme = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme; - options.DefaultAuthenticateScheme = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme; - options.DefaultChallengeScheme = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme; - }); - - services.AddHostedService(); - - return services; - } - - private static void ConfigureCryptography( - OpenIddictServerBuilder options, - IConfiguration configuration, - IHostEnvironment environment - ) - { - // Dev: certs in the user profile. Docker/demo: ephemeral keys (no cert store in containers). - if (string.IsNullOrWhiteSpace(configuration["OpenIddict:SigningKeyPath"]) - && (environment.IsDevelopment() - || IsDockerEnvironment(environment) - || configuration.GetValue("OpenIddict:UseEphemeralKeys", false))) - { - if (IsDockerEnvironment(environment) - || configuration.GetValue("OpenIddict:UseEphemeralKeys", false)) - { - options.AddEphemeralEncryptionKey() - .AddEphemeralSigningKey(); - } - else - { - options.AddDevelopmentEncryptionCertificate() - .AddDevelopmentSigningCertificate(); - } - - return; - } - - var contentRoot = configuration.GetValue(WebHostDefaults.ContentRootKey) - ?? throw new InvalidOperationException("Content root path is not configured."); - - var signingPath = ResolveKeyPath( - configuration["OpenIddict:SigningKeyPath"], - contentRoot, - "keys/signing.pem"); - var encryptionPath = ResolveKeyPath( - configuration["OpenIddict:EncryptionKeyPath"], - contentRoot, - "keys/encryption.pem"); - - if (!File.Exists(signingPath)) - { - throw new InvalidOperationException( - $"OpenIddict signing key not found at '{signingPath}'. " + - "Set OpenIddict:SigningKeyPath or place keys/signing.pem under the content root."); - } - - options.AddSigningKey(LoadRsaSecurityKey(signingPath)); - - if (File.Exists(encryptionPath) && - !string.Equals(encryptionPath, signingPath, StringComparison.OrdinalIgnoreCase)) - { - options.AddEncryptionKey(LoadRsaSecurityKey(encryptionPath)); - } - else - { - // Prefer a dedicated encryption key. Fallback keeps older single-key setups working. - options.AddEncryptionKey(LoadRsaSecurityKey(signingPath)); - } - } - - private static bool IsDockerEnvironment(IHostEnvironment environment) => - string.Equals(environment.EnvironmentName, "Docker", StringComparison.OrdinalIgnoreCase); - - private static string ResolveKeyPath(string? configuredPath, string contentRoot, string defaultRelative) - { - if (!string.IsNullOrWhiteSpace(configuredPath)) - { - return Path.IsPathRooted(configuredPath) - ? configuredPath - : Path.GetFullPath(Path.Combine(contentRoot, configuredPath)); - } - - return Path.GetFullPath(Path.Combine(contentRoot, defaultRelative)); - } - - private static RsaSecurityKey LoadRsaSecurityKey(string path) - { - var privateKey = File.ReadAllText(path) - .Replace("-----BEGIN RSA PRIVATE KEY-----", string.Empty, StringComparison.Ordinal) - .Replace("-----END RSA PRIVATE KEY-----", string.Empty, StringComparison.Ordinal) - .Replace("-----BEGIN PRIVATE KEY-----", string.Empty, StringComparison.Ordinal) - .Replace("-----END PRIVATE KEY-----", string.Empty, StringComparison.Ordinal) - .Replace("\r", string.Empty, StringComparison.Ordinal) - .Replace("\n", string.Empty, StringComparison.Ordinal); - - var rsa = RSA.Create(); - var keyBytes = Convert.FromBase64String(privateKey); - - try - { - rsa.ImportRSAPrivateKey(keyBytes, out _); - } - catch (CryptographicException) - { - rsa.ImportPkcs8PrivateKey(keyBytes, out _); - } - - return new RsaSecurityKey(rsa); - } -} diff --git a/MyOffice.Web/Identity/OpenIddict/PasswordGrantHandler.cs b/MyOffice.Web/Identity/OpenIddict/PasswordGrantHandler.cs deleted file mode 100644 index ce48be5..0000000 --- a/MyOffice.Web/Identity/OpenIddict/PasswordGrantHandler.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace MyOffice.Web.Auth; - -using Identity.Domain; -using Identity.Repositories; -using Microsoft.AspNetCore.Identity; -using OpenIddict.Abstractions; -using OpenIddict.Server; -using OpenIddict.Server.AspNetCore; -using static OpenIddict.Abstractions.OpenIddictConstants; -using static OpenIddict.Server.OpenIddictServerEvents; - -public sealed class PasswordGrantHandler : IOpenIddictServerHandler -{ - private readonly AppUserManager _userManager; - private readonly SignInManager> _signInManager; - - public PasswordGrantHandler( - AppUserManager userManager, - SignInManager> signInManager - ) - { - _userManager = userManager; - _signInManager = signInManager; - } - - public async ValueTask HandleAsync(HandleTokenRequestContext context) - { - if (!string.Equals(context.Request.GrantType, GrantTypes.Password, StringComparison.Ordinal)) - return; - - var username = context.Request.Username?.Trim(); - if (string.IsNullOrWhiteSpace(username)) - { - context.Reject(Errors.InvalidGrant, "Invalid username or password."); - return; - } - - var user = await _userManager.FindByNameAsync(username) - ?? await _userManager.FindByEmailAsync(username); - if (user is null) - { - context.Reject(Errors.InvalidGrant, "Invalid username or password."); - return; - } - - if (!await _signInManager.CanSignInAsync(user)) - { - context.Reject(Errors.InvalidGrant, "The specified user cannot sign in."); - return; - } - - if (_userManager.SupportsUserLockout && await _userManager.IsLockedOutAsync(user)) - { - context.Reject(Errors.InvalidGrant, "The specified user is locked out."); - return; - } - - var result = await _signInManager.CheckPasswordSignInAsync(user, context.Request.Password!, lockoutOnFailure: true); - if (!result.Succeeded) - { - context.Reject(Errors.InvalidGrant, "Invalid username or password."); - return; - } - - if (_userManager.SupportsUserLockout) - await _userManager.ResetAccessFailedCountAsync(user); - - context.SignIn(OpenIddictClaimsHelper.CreatePrincipal(user, context.Request.GetScopes())); - } -} diff --git a/MyOffice.Web/Identity/Repositories/AppUserManager.cs b/MyOffice.Web/Identity/Repositories/AppUserManager.cs deleted file mode 100644 index bbdf67e..0000000 --- a/MyOffice.Web/Identity/Repositories/AppUserManager.cs +++ /dev/null @@ -1,133 +0,0 @@ -namespace MyOffice.Web.Identity.Repositories; - -using System.Security.Cryptography; -using Domain; -using Microsoft.AspNetCore.Identity; -using Microsoft.Extensions.Options; - -/// -/// Identity V3 hasher for new passwords; still verifies the legacy -/// (16-byte salt + 20-byte PBKDF2-SHA1 @ 100k) format and signals rehash. -/// -public class PasswordHasher : IPasswordHasher> -{ - private const int LegacySaltSize = 16; - private const int LegacyHashSize = 20; - private const int LegacyIterations = 100_000; - private const int LegacyPayloadSize = LegacySaltSize + LegacyHashSize; - - private readonly PasswordHasher> _identityHasher = new(); - - public string HashPassword(ApplicationUser user, string password) => - _identityHasher.HashPassword(user, password); - - public PasswordVerificationResult VerifyHashedPassword( - ApplicationUser user, - string hashedPassword, - string providedPassword - ) - { - if (string.IsNullOrEmpty(hashedPassword) || providedPassword == null) - { - return PasswordVerificationResult.Failed; - } - - // Prefer modern Identity format when payload is not the legacy 36-byte blob. - if (!IsLegacyPayload(hashedPassword)) - { - return _identityHasher.VerifyHashedPassword(user, hashedPassword, providedPassword); - } - - if (VerifyLegacyHash(providedPassword, hashedPassword)) - { - return PasswordVerificationResult.SuccessRehashNeeded; - } - - return PasswordVerificationResult.Failed; - } - - private static bool IsLegacyPayload(string hashedPassword) - { - try - { - var bytes = Convert.FromBase64String(hashedPassword); - return bytes.Length == LegacyPayloadSize; - } - catch (FormatException) - { - return false; - } - } - - internal static string HashLegacyForTests(string password) - { - var salt = RandomNumberGenerator.GetBytes(LegacySaltSize); - var hash = Rfc2898DeriveBytes.Pbkdf2( - password, - salt, - LegacyIterations, - HashAlgorithmName.SHA1, - LegacyHashSize); - - var payload = new byte[LegacyPayloadSize]; - Buffer.BlockCopy(salt, 0, payload, 0, LegacySaltSize); - Buffer.BlockCopy(hash, 0, payload, LegacySaltSize, LegacyHashSize); - return Convert.ToBase64String(payload); - } - - private static bool VerifyLegacyHash(string password, string passwordHash) - { - byte[] hashBytes; - try - { - hashBytes = Convert.FromBase64String(passwordHash); - } - catch (FormatException) - { - return false; - } - - if (hashBytes.Length != LegacyPayloadSize) - { - return false; - } - - var salt = hashBytes.AsSpan(0, LegacySaltSize); - var expected = hashBytes.AsSpan(LegacySaltSize, LegacyHashSize); - var actual = Rfc2898DeriveBytes.Pbkdf2( - password, - salt, - LegacyIterations, - HashAlgorithmName.SHA1, - LegacyHashSize); - - return CryptographicOperations.FixedTimeEquals(expected, actual); - } -} - -public class AppUserManager : UserManager> -{ - public AppUserManager( - IUserStore> store, - IOptions optionsAccessor, - IPasswordHasher> passwordHasher, - IEnumerable>> userValidators, - IEnumerable>> passwordValidators, - ILookupNormalizer keyNormalizer, - IdentityErrorDescriber errors, - IServiceProvider services, - ILogger>> logger) : - base( - store, - optionsAccessor, - passwordHasher, - userValidators, - passwordValidators, - keyNormalizer, - errors, - services, - logger - ) - { - } -} diff --git a/MyOffice.Web/Identity/Repositories/RoleStore.cs b/MyOffice.Web/Identity/Repositories/RoleStore.cs deleted file mode 100644 index 285f433..0000000 --- a/MyOffice.Web/Identity/Repositories/RoleStore.cs +++ /dev/null @@ -1,62 +0,0 @@ -namespace MyOffice.Web.Identity.Repositories; - -using Domain; -using Microsoft.AspNetCore.Identity; - -public class RoleStore : IRoleStore -{ - public void Dispose() - { - } - - public Task CreateAsync(ApplicationRole role, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task UpdateAsync(ApplicationRole role, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task DeleteAsync(ApplicationRole role, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task GetRoleIdAsync(ApplicationRole role, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task GetRoleNameAsync(ApplicationRole role, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task SetRoleNameAsync(ApplicationRole role, string roleName, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task GetNormalizedRoleNameAsync(ApplicationRole role, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task SetNormalizedRoleNameAsync(ApplicationRole role, string normalizedName, - CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task FindByIdAsync(string roleId, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task FindByNameAsync(string normalizedRoleName, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Identity/Repositories/UserStore.cs b/MyOffice.Web/Identity/Repositories/UserStore.cs deleted file mode 100644 index 881d42a..0000000 --- a/MyOffice.Web/Identity/Repositories/UserStore.cs +++ /dev/null @@ -1,198 +0,0 @@ -namespace MyOffice.Web.Identity.Repositories; - -using Data.Models.Users; -using Data.Repositories.Users; -using Domain; -using Microsoft.AspNetCore.Identity; - -public class UserStore : - IUserStore>, - IUserPasswordStore>, - IUserEmailStore> -{ - private readonly IUserRepository _userRepository; - - public UserStore( - IUserRepository userRepository - ) - { - _userRepository = userRepository; - } - - public void Dispose() - { - } - - public Task GetUserIdAsync(ApplicationUser user, CancellationToken cancellationToken) - { - return Task.FromResult(user.Id.ToString()); - } - - public Task GetUserNameAsync(ApplicationUser user, CancellationToken cancellationToken) - { - return Task.FromResult(user.UserName); - } - - public Task SetUserNameAsync(ApplicationUser user, string userName, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task GetNormalizedUserNameAsync(ApplicationUser user, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public Task SetNormalizedUserNameAsync(ApplicationUser user, string normalizedName, - CancellationToken cancellationToken) - { - user.UserName = normalizedName; - return Task.FromResult(0); - } - - public Task CreateAsync(ApplicationUser user, CancellationToken cancellationToken) - { - var result = _userRepository.AddUser(new User - { - Id = user.Id, - UserName = user.UserName, - Email = user.Email, - PasswordHash = user.PasswordHash, - FirstName = user.FirstName, - LastName = user.LastName, - FullName = user.FullName, - CurrencyId = user.CurrencyId!, - IsEmailConfirmed = user.IsEmailConfirmed - }); - - return Task.FromResult(result == 1 ? IdentityResult.Success : IdentityResult.Failed()); - } - - public Task UpdateAsync(ApplicationUser user, CancellationToken cancellationToken) - { - var userDb = new User - { - Id = user.Id, - UserName = user.UserName, - Email = user.Email, - PasswordHash = user.PasswordHash, - FirstName = user.FirstName, - LastName = user.LastName, - FullName = user.FullName, - CurrencyId = user.CurrencyId!, - IsEmailConfirmed = user.IsEmailConfirmed - }; - - var result = _userRepository.UpdateUser(userDb); - return Task.FromResult(result == 1 ? IdentityResult.Success : IdentityResult.Failed()); - } - - public Task DeleteAsync(ApplicationUser user, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public async Task> FindByIdAsync(string userId, CancellationToken cancellationToken) - { - var user = await _userRepository.GetUserAsync(Guid.Parse(userId)); - if (user == null) - { -#pragma warning disable CS8603 // Possible null reference return. - return null; -#pragma warning restore CS8603 // Possible null reference return. - } - - return new ApplicationUser - { - Id = user.Id, - UserName = user.UserName, - Email = user.Email, - PasswordHash = user.PasswordHash, - FirstName = user.FirstName, - LastName = user.LastName, - FullName = user.FullName, - CurrencyId = user.CurrencyId, - IsEmailConfirmed = user.IsEmailConfirmed - }; - } - - public async Task> FindByNameAsync(string normalizedUserName, - CancellationToken cancellationToken) - { - var user = await _userRepository.GetByUserUserNameAsync(normalizedUserName); - if (user == null) - { -#pragma warning disable CS8603 // Possible null reference return. - return null; -#pragma warning restore CS8603 // Possible null reference return. - } - - return new ApplicationUser - { - Id = user.Id, - UserName = user.UserName, - Email = user.Email, - PasswordHash = user.PasswordHash, - FirstName = user.FirstName, - LastName = user.LastName, - FullName = user.FullName, - CurrencyId = user.CurrencyId, - IsEmailConfirmed = user.IsEmailConfirmed - }; - } - - public Task SetPasswordHashAsync(ApplicationUser user, string passwordHash, - CancellationToken cancellationToken) - { - user.PasswordHash = passwordHash; - return Task.FromResult(0); - } - - public Task GetPasswordHashAsync(ApplicationUser user, CancellationToken cancellationToken) - { - return Task.FromResult(user.PasswordHash); - } - - public Task HasPasswordAsync(ApplicationUser user, CancellationToken cancellationToken) - { - return Task.FromResult(!string.IsNullOrEmpty(user.PasswordHash)); - } - - public Task SetEmailAsync(ApplicationUser user, string email, CancellationToken cancellationToken) - { - user.Email = email; - return Task.CompletedTask; - } - - public Task GetEmailAsync(ApplicationUser user, CancellationToken cancellationToken) - { - return Task.FromResult(user.Email); - } - - public Task GetEmailConfirmedAsync(ApplicationUser user, CancellationToken cancellationToken) - { - return Task.FromResult(user.IsEmailConfirmed); - } - - public Task SetEmailConfirmedAsync(ApplicationUser user, bool confirmed, CancellationToken cancellationToken) - { - user.IsEmailConfirmed = confirmed; - return Task.CompletedTask; - } - - public Task> FindByEmailAsync(string normalizedEmail, CancellationToken cancellationToken) - { - return FindByNameAsync(normalizedEmail, cancellationToken); - } - - public Task GetNormalizedEmailAsync(ApplicationUser user, CancellationToken cancellationToken) - { - return Task.FromResult(user?.Email); - } - - public Task SetNormalizedEmailAsync(ApplicationUser user, string normalizedEmail, - CancellationToken cancellationToken) - { - return Task.FromResult(0); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Infrastructure/Attributes/AsGuidAttribute.cs b/MyOffice.Web/Infrastructure/Attributes/AsGuidAttribute.cs deleted file mode 100644 index 1439835..0000000 --- a/MyOffice.Web/Infrastructure/Attributes/AsGuidAttribute.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace MyOffice.Web.Infrastructure.Attributes -{ - using System.ComponentModel.DataAnnotations; - using Core.Extensions; - - public class AsGuidAttribute: ValidationAttribute - { - private readonly bool _nullable; - - public AsGuidAttribute(bool nullable = false) - { - _nullable = nullable; - } - - protected override ValidationResult? IsValid(object? value, ValidationContext validationContext) - { - if (value == null && _nullable) - { - return ValidationResult.Success; - } - - if (value == null || value.ToString().IsMissing()) - { - return new ValidationResult("Id parameter is not valid"); - } - - if (!Guid.TryParse(value.ToString(), out _)) - { - return new ValidationResult("Id parameter is not valid"); - } - - return ValidationResult.Success; - } - } -} diff --git a/MyOffice.Web/Infrastructure/Attributes/DefaultFromBodyAttribute.cs b/MyOffice.Web/Infrastructure/Attributes/DefaultFromBodyAttribute.cs deleted file mode 100644 index 4ef604e..0000000 --- a/MyOffice.Web/Infrastructure/Attributes/DefaultFromBodyAttribute.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace MyOffice.Web.Infrastructure.Attributes; - -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.ApplicationModels; -using Microsoft.AspNetCore.Mvc.ModelBinding; - -[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] -public sealed class DefaultFromBodyAttribute : Attribute -{ -} - -public class DefaultFromBodyBindingConvention : IActionModelConvention -{ - public void Apply(ActionModel action) - { - if (action == null) - { - throw new ArgumentNullException(nameof(action)); - } - - if (action.Controller.Attributes.Any(x => x is DefaultFromBodyAttribute)) - { - foreach (var parameter in action.Parameters) - { - if (parameter.Attributes.Any(x => - x is FromQueryAttribute - or FromRouteAttribute - or FromHeaderAttribute - or FromFormAttribute - or FromServicesAttribute)) - { - continue; - } - - // Already bound (e.g. CancellationToken → Special) — do not force Body. - if (parameter.BindingInfo?.BindingSource is { } existing - && existing != BindingSource.ModelBinding - && existing != BindingSource.Custom) - { - continue; - } - - var paramType = parameter.ParameterInfo.ParameterType; - if (paramType == typeof(CancellationToken) - || Nullable.GetUnderlyingType(paramType) == typeof(CancellationToken)) - { - continue; - } - - var isSimpleType = paramType.IsPrimitive - || paramType.IsEnum - || paramType == typeof(string) - || paramType == typeof(decimal) - || paramType == typeof(Guid) - || paramType == typeof(Guid?) - || paramType == typeof(DateTime) - || paramType == typeof(DateTime?) - || paramType == typeof(DateOnly) - || paramType == typeof(DateOnly?) - || paramType == typeof(TimeOnly) - || paramType == typeof(TimeOnly?); - - if (!isSimpleType) - { - parameter.BindingInfo ??= new BindingInfo(); - parameter.BindingInfo.BindingSource = BindingSource.Body; - } - } - } - } -} diff --git a/MyOffice.Web/Infrastructure/Attributes/GlobalModelStateValidatorAttribute.cs b/MyOffice.Web/Infrastructure/Attributes/GlobalModelStateValidatorAttribute.cs deleted file mode 100644 index fa8d645..0000000 --- a/MyOffice.Web/Infrastructure/Attributes/GlobalModelStateValidatorAttribute.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace MyOffice.Web.Infrastructure.Attributes; - -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.AspNetCore.Mvc.Infrastructure; - -public class GlobalModelStateValidatorAttribute : ActionFilterAttribute -{ - private readonly ProblemDetailsFactory _problemDetailsFactory; - - public GlobalModelStateValidatorAttribute(ProblemDetailsFactory problemDetailsFactory) - { - _problemDetailsFactory = problemDetailsFactory; - } - - public override void OnActionExecuting(ActionExecutingContext context) - { - if (!context.ModelState.IsValid) - { - context.Result = new ObjectResult(_problemDetailsFactory.CreateValidationProblemDetails(context.HttpContext, context.ModelState)) - { - StatusCode = StatusCodes.Status400BadRequest - }; - } - - base.OnActionExecuting(context); - } -} diff --git a/MyOffice.Web/Infrastructure/CustomProblemDetailsFactory.cs b/MyOffice.Web/Infrastructure/CustomProblemDetailsFactory.cs deleted file mode 100644 index 9b37b12..0000000 --- a/MyOffice.Web/Infrastructure/CustomProblemDetailsFactory.cs +++ /dev/null @@ -1,95 +0,0 @@ -namespace MyOffice.Web.Infrastructure; - -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Infrastructure; -using Microsoft.AspNetCore.Mvc.ModelBinding; -using Microsoft.Extensions.Options; - -public class CustomProblemDetailsFactory : ProblemDetailsFactory -{ - private readonly ApiBehaviorOptions options; - private readonly JsonOptions jsonOptions; - - public CustomProblemDetailsFactory(IOptions options, IOptions jsonOptions) - { - this.options = options?.Value ?? throw new ArgumentNullException(nameof(options)); - this.jsonOptions = jsonOptions?.Value ?? throw new ArgumentNullException(nameof(jsonOptions)); - } - - public override ProblemDetails CreateProblemDetails( - HttpContext httpContext, - int? statusCode = null, - string? title = null, - string? type = null, - string? detail = null, - string? instance = null) - { - statusCode ??= 500; - - var problemDetails = new ProblemDetails - { - Status = statusCode, - Title = title, - Type = type, - Detail = detail, - Instance = instance, - }; - - ApplyProblemDetailsDefaults(httpContext, problemDetails, statusCode.Value); - - return problemDetails; - } - - public override ValidationProblemDetails CreateValidationProblemDetails( - HttpContext httpContext, - ModelStateDictionary modelStateDictionary, - int? statusCode = null, - string? title = null, - string? type = null, - string? detail = null, - string? instance = null) - { - if (modelStateDictionary == null) - { - throw new ArgumentNullException(nameof(modelStateDictionary)); - } - - statusCode ??= 400; - - var errors = modelStateDictionary - .Where(x => x.Value?.Errors.Any() == true) - .ToDictionary( - kvp => jsonOptions?.JsonSerializerOptions?.PropertyNamingPolicy?.ConvertName(kvp.Key) ?? kvp.Key, - kvp => kvp.Value!.Errors.Select(x => x.ErrorMessage).ToArray() - ); - - var problemDetails = new ValidationProblemDetails(errors) - { - Status = statusCode, - Type = type, - Detail = detail, - Instance = instance, - }; - - if (title != null) - { - // For validation problem details, don't overwrite the default title with null. - problemDetails.Title = title; - } - - ApplyProblemDetailsDefaults(httpContext, problemDetails, statusCode.Value); - - return problemDetails; - } - - private void ApplyProblemDetailsDefaults(HttpContext httpContext, ProblemDetails problemDetails, int statusCode) - { - problemDetails.Status ??= statusCode; - - if (options.ClientErrorMapping.TryGetValue(statusCode, out var clientErrorData)) - { - problemDetails.Title ??= clientErrorData.Title; - problemDetails.Type ??= clientErrorData.Link; - } - } -} diff --git a/MyOffice.Web/Infrastructure/DatabaseInitializerHostedService.cs b/MyOffice.Web/Infrastructure/DatabaseInitializerHostedService.cs deleted file mode 100644 index b18e96a..0000000 --- a/MyOffice.Web/Infrastructure/DatabaseInitializerHostedService.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace MyOffice.Web.Infrastructure; - -using DbContext; - -/// -/// Runs EF migrate + seed on startup with a scoped DbContext. -/// -public sealed class DatabaseInitializerHostedService : IHostedService -{ - private readonly IServiceProvider _serviceProvider; - private readonly ILogger _logger; - - public DatabaseInitializerHostedService( - IServiceProvider serviceProvider, - ILogger logger - ) - { - _serviceProvider = serviceProvider; - _logger = logger; - } - - public async Task StartAsync(CancellationToken cancellationToken) - { - await using var scope = _serviceProvider.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - - _logger.LogInformation("Applying database migrations and seed data…"); - await DatabaseBootstrapper.InitializeAsync(db, cancellationToken); - _logger.LogInformation("Database ready."); - } - - public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; -} diff --git a/MyOffice.Web/Infrastructure/Filters/ResponseFilter.cs b/MyOffice.Web/Infrastructure/Filters/ResponseFilter.cs deleted file mode 100644 index dda3f3d..0000000 --- a/MyOffice.Web/Infrastructure/Filters/ResponseFilter.cs +++ /dev/null @@ -1,47 +0,0 @@ -namespace MyOffice.Web.Infrastructure.Filters; - -using System.Collections; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using MyOffice.Web.Models; - -public class ResponseFilter : IActionFilter -{ - private readonly ILogger _logger; - - public ResponseFilter(ILogger logger) - { - _logger = logger; - } - - public void OnActionExecuting(ActionExecutingContext context) - { - } - - public void OnActionExecuted(ActionExecutedContext context) - { - // TODO: restore - /*var route = $"{context.Controller.GetType().Name}.{context.ActionDescriptor.DisplayName}"; - if (context.Result == null) - throw new NotSupportedException($"[{route}] Response required"); - if (!(context.Result is ObjectResult result)) - throw new NotSupportedException($"[{route}] Response must be an ObjectResult - {context.Result?.GetType().Name}"); - if (result.Value == null) - throw new NotSupportedException($"[{route}] Response must be an ObjectResult with value"); - - if (result.Value is IResponseModel) - { - return; - } - - var type = result.Value.GetType(); - if (type.IsGenericType - && result.Value is IEnumerable - && type.GenericTypeArguments.Any(x => x.GetInterfaces().Any(y => y == typeof(IResponseModel)))) - { - return; - } - - throw new NotSupportedException($"[{route}] Response must be an ObjectResult with an IResponseModel - {result.Value?.GetType().Name}");*/ - } -} \ No newline at end of file diff --git a/MyOffice.Web/Infrastructure/GlobalSettings.cs b/MyOffice.Web/Infrastructure/GlobalSettings.cs deleted file mode 100644 index afa20c2..0000000 --- a/MyOffice.Web/Infrastructure/GlobalSettings.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MyOffice.Web.Infrastructure; - -public class GlobalSettings -{ - public string? Host { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Web/Infrastructure/RouteHelper.cs b/MyOffice.Web/Infrastructure/RouteHelper.cs deleted file mode 100644 index d021e0d..0000000 --- a/MyOffice.Web/Infrastructure/RouteHelper.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace MyOffice.Web.Infrastructure; - -using System.Linq.Expressions; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; - -public static class RouteHelperExtensions -{ - public static void Bind(this IRouteBuilder routeBuilder, Expression> expression) - { - System.Console.WriteLine("Bind"); - System.Console.WriteLine(expression.Name); - System.Console.WriteLine(expression.Body.ToString()); - routeBuilder.MapRoute("SettingsAccountAccountsGet", "api/settings/accounts", new { controller = "SettingsAccount", action = "AccountsGet" }); - } -} - -public class CustomRouter : IRouter -{ - private readonly IRouter _defaultRouter; - private readonly string _controller; - private readonly string _action; - - public CustomRouter(IRouter defaultRouter, string controller, string action) - { - _defaultRouter = defaultRouter; - _controller = controller; - _action = action; - } - - public VirtualPathData? GetVirtualPath(VirtualPathContext context) - { - Console.WriteLine($"1:{context.RouteName}"); - return null; - } - - public async Task RouteAsync(RouteContext context) - { - var headers = context.HttpContext.Request.Headers; - var path = context.HttpContext.Request.Path.Value!.Split('/'); - - Console.WriteLine($"CustomRouter:{context.HttpContext.Request.Path.Value}"); - - context.RouteData.Values["controller"] = _controller; - context.RouteData.Values["action"] = _action; - - await _defaultRouter.RouteAsync(context); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Infrastructure/UnhandledExceptionHandler.cs b/MyOffice.Web/Infrastructure/UnhandledExceptionHandler.cs deleted file mode 100644 index 24cf6b8..0000000 --- a/MyOffice.Web/Infrastructure/UnhandledExceptionHandler.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace MyOffice.Web.Infrastructure; - -using Microsoft.AspNetCore.Diagnostics; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Infrastructure; - -/// -/// Returns ProblemDetails for unhandled exceptions (replaces missing /Error page). -/// -public sealed class UnhandledExceptionHandler : IExceptionHandler -{ - private readonly IHostEnvironment _environment; - private readonly ILogger _logger; - private readonly ProblemDetailsFactory _problemDetailsFactory; - - public UnhandledExceptionHandler( - IHostEnvironment environment, - ILogger logger, - ProblemDetailsFactory problemDetailsFactory - ) - { - _environment = environment; - _logger = logger; - _problemDetailsFactory = problemDetailsFactory; - } - - public async ValueTask TryHandleAsync( - HttpContext httpContext, - Exception exception, - CancellationToken cancellationToken - ) - { - _logger.LogError(exception, "Unhandled exception for {Method} {Path}", - httpContext.Request.Method, - httpContext.Request.Path); - - var problem = _problemDetailsFactory.CreateProblemDetails( - httpContext, - statusCode: StatusCodes.Status500InternalServerError, - title: "An unexpected error occurred.", - detail: _environment.IsDevelopment() ? exception.Message : null); - - httpContext.Response.StatusCode = problem.Status ?? StatusCodes.Status500InternalServerError; - httpContext.Response.ContentType = "application/problem+json"; - await httpContext.Response.WriteAsJsonAsync(problem, cancellationToken); - return true; - } -} diff --git a/MyOffice.Web/Models/Account/AccessRightsViewModel.cs b/MyOffice.Web/Models/Account/AccessRightsViewModel.cs deleted file mode 100644 index 108f2f8..0000000 --- a/MyOffice.Web/Models/Account/AccessRightsViewModel.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace MyOffice.Web.Models.Account; - -using AutoMapper; -using MyOffice.Services.Account.Domain; -using MyOffice.Services.Identity; -using User; - -public class AccessRightsViewModel -{ - public UserViewModel? User { get; set; } = null!; - public bool AllowRead { get; set; } - public bool AllowWrite { get; set; } - public bool AllowManage { get; set; } - public bool AllowDelete { get; set; } - public bool IsOwner { get; set; } -} - -public class AccessRightsViewModelProfile : Profile -{ - public AccessRightsViewModelProfile() - { - CreateMap() - .AfterMap() - ; - - } -} - -public class AccessRightsViewModelMappingAction : IMappingAction -{ - private readonly IContextProvider _contextProvider; - - public AccessRightsViewModelMappingAction(IContextProvider contextProvider) - { - _contextProvider = contextProvider; - } - - public void Process(AccountAccessDto source, AccessRightsViewModel destination, ResolutionContext context) - { - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Account/AccountAccessInviteViewModel.cs b/MyOffice.Web/Models/Account/AccountAccessInviteViewModel.cs deleted file mode 100644 index b691570..0000000 --- a/MyOffice.Web/Models/Account/AccountAccessInviteViewModel.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MyOffice.Web.Models.Account; - -using AutoMapper; -using MyOffice.Services.Account.Domain; - -public class AccountAccessInviteViewModel: IResponseModel -{ - public string? Id { get; set; } - public string? Account { get; set; } - public bool? AllowWrite { get; set; } -} - -public class AccountAccessInviteViewModelProfile: Profile -{ - public AccountAccessInviteViewModelProfile() - { - CreateMap() - .ForMember(x => x.AllowWrite, o => o.MapFrom(x => x.IsAllowWrite)) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Account/AccountAccessViewModel.cs b/MyOffice.Web/Models/Account/AccountAccessViewModel.cs deleted file mode 100644 index 90046b7..0000000 --- a/MyOffice.Web/Models/Account/AccountAccessViewModel.cs +++ /dev/null @@ -1,24 +0,0 @@ -using AutoMapper; -using MyOffice.Services.Account.Domain; - -namespace MyOffice.Web.Models.Account; - -public class AccountAccessViewModel -{ - public class AccountAccessItemViewModel - { - public string UserId { get; set; } = null!; - public bool AllowWrite { get; set; } - } - - public string? Email { get; set; } - public bool AllowWrite { get; set; } - public List Accesses { get; set; } = null!; -} - -public class AccountAccessItemViewModelProfile : Profile -{ - public AccountAccessItemViewModelProfile() - { - } -} diff --git a/MyOffice.Web/Models/Account/AccountCategoryViewModel.cs b/MyOffice.Web/Models/Account/AccountCategoryViewModel.cs deleted file mode 100644 index b36df26..0000000 --- a/MyOffice.Web/Models/Account/AccountCategoryViewModel.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace MyOffice.Web.Models.Account; - -using System.ComponentModel.DataAnnotations; -using AutoMapper; -using MyOffice.Services.Account.Domain; - -public class AccountCategoryViewModel: IResponseModel -{ - public string? Id { get; set; } - - [Required] - public string? Name { get; set; } - - public bool? AllowDelete { get; set; } -} - -public class AccountCategoryViewModelProfile: Profile -{ - public AccountCategoryViewModelProfile() - { - CreateMap() - .ForMember(x => x.Id, o => o.MapFrom(x => x.CategoryId)) - .ForMember(x => x.Name, o => o.MapFrom(x => x.Category!.Name)) - ; - CreateMap() - .ForMember(x => x.Id, o => o.MapFrom(x => x.Id)) - .ForMember(x => x.Name, o => o.MapFrom(x => x.Name)) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Account/AccountDetailedViewModel.cs b/MyOffice.Web/Models/Account/AccountDetailedViewModel.cs deleted file mode 100644 index 63b1448..0000000 --- a/MyOffice.Web/Models/Account/AccountDetailedViewModel.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace MyOffice.Web.Models.Account; - -using AutoMapper; -using MyOffice.Services.Account.Domain; - -public class AccountDetailedViewModel: BaseViewModel -{ - public AccountViewModel Account { get; set; } = null!; - public decimal Rest { get; set; } -} - -public class AccountDetailedViewModelProfile: Profile -{ - public AccountDetailedViewModelProfile() - { - CreateMap() - .ForMember(x => x.Account, o => o.MapFrom(x => x.Account)) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Account/AccountEditRequestModel.cs b/MyOffice.Web/Models/Account/AccountEditRequestModel.cs deleted file mode 100644 index 07ee7c9..0000000 --- a/MyOffice.Web/Models/Account/AccountEditRequestModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace MyOffice.Web.Models.Account; - -using System.ComponentModel.DataAnnotations; - -public class AccountEditRequestModel -{ - [Required] - public string Name { get; set; } = null!; - [Required] - public string CurrencyId { get; set; } = null!; - public string? CategoryId { get; set; } - public string? UserId { get; set; } - public string? Type { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Account/AccountInviteAcceptRequest.cs b/MyOffice.Web/Models/Account/AccountInviteAcceptRequest.cs deleted file mode 100644 index 246160f..0000000 --- a/MyOffice.Web/Models/Account/AccountInviteAcceptRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MyOffice.Web.Models.Account; - -public class AccountInviteAcceptRequest -{ - public string Name { get; set; } = null!; -} diff --git a/MyOffice.Web/Models/Account/AccountViewModel.cs b/MyOffice.Web/Models/Account/AccountViewModel.cs deleted file mode 100644 index 5ee5a51..0000000 --- a/MyOffice.Web/Models/Account/AccountViewModel.cs +++ /dev/null @@ -1,61 +0,0 @@ -namespace MyOffice.Web.Models.Account; - -using AutoMapper; -using MyOffice.Services.Account.Domain; -using MyOffice.Services.Identity; -using Newtonsoft.Json; -using System.ComponentModel.DataAnnotations; - -public class AccountViewModel: IResponseModel -{ - public string? Id { get; set; } - - [Required] - public string Name { get; set; } = null!; - public string Type { get; set; } = null!; - - [Required] - public string CurrencyId { get; set; } = null!; - public string? CurrencyName { get; set; } - - public List? Categories { get; set; } - - [Required] - public string CategoryId { get; set; } = null!; - - #region Permissions - - public List? AccessRights { get; set; } - public bool AllowRead { get; set; } - public bool AllowWrite { get; set; } - public bool AllowDelete { get; set; } - public bool AllowManage { get; set; } - - #endregion Permissions -} - -public class AccountViewModelProfile : Profile -{ - public AccountViewModelProfile() - { - CreateMap() - .ForMember(x => x.CurrencyId, o => o.MapFrom(x => x.CurrencyGlobalId)) - .ForMember(x => x.CurrencyName, o => o.MapFrom(x => x.Currency!.Name)) - .AfterMap() - ; - } -} - -public class AccountViewModelMappingAction : IMappingAction -{ - private readonly IContextProvider _contextProvider; - - public AccountViewModelMappingAction(IContextProvider contextProvider) - { - _contextProvider = contextProvider; - } - - public void Process(AccountDto source, AccountViewModel destination, ResolutionContext context) - { - } -} diff --git a/MyOffice.Web/Models/Account/AccountViewModelProfile.cs b/MyOffice.Web/Models/Account/AccountViewModelProfile.cs deleted file mode 100644 index 5a8b582..0000000 --- a/MyOffice.Web/Models/Account/AccountViewModelProfile.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace MyOffice.Web.Models.Account; - -using AutoMapper; - -using MyOffice.Services.Currency.Domain; -using Currency; -using Item; -using Motion; -using Services.Account.Domain; -using User; -using MyOffice.Services.Identity; - -/*public class CustomResolver : IValueResolver -{ - private readonly ILogger _logger; - private readonly IContextProvider _contextProvider; - - public CustomResolver( - ILogger logger, - IContextProvider contextProvider - ) - { - _logger = logger; - _contextProvider = contextProvider; - } - - public bool Resolve(AccountAccessDto source, AccessRightsViewModel destination, bool member, ResolutionContext context) - { - return source.OwnerId == _contextProvider.UserId; - } -}*/ - -/*public class PublicationSystemResolver : IMemberValueResolver -{ - private readonly IContextProvider _contextProvider; - - public PublicationSystemResolver( - IContextProvider contextProvider - ) - { - this._contextProvider = contextProvider; - } - - public bool Resolve(object source, object destination, string sourceMember, bool destMember, ResolutionContext context) - { - return true; - } -}*/ \ No newline at end of file diff --git a/MyOffice.Web/Models/Account/MotionsGetRequest.cs b/MyOffice.Web/Models/Account/MotionsGetRequest.cs deleted file mode 100644 index 4c7bcd3..0000000 --- a/MyOffice.Web/Models/Account/MotionsGetRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyOffice.Web.Models.Account -{ - using System.ComponentModel.DataAnnotations; - - public class MotionsGetRequest - { - [Required] - public DateTime From { get; set; } - [Required] - public DateTime To { get; set; } - } -} diff --git a/MyOffice.Web/Models/Auth/LoginModel.cs b/MyOffice.Web/Models/Auth/LoginModel.cs deleted file mode 100644 index 7127c9c..0000000 --- a/MyOffice.Web/Models/Auth/LoginModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyOffice.Web.Models.Auth; - -public class LoginModel -{ - public string? UserName { get; set; } - public string? Password { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Auth/RegisterModel.cs b/MyOffice.Web/Models/Auth/RegisterModel.cs deleted file mode 100644 index 086c364..0000000 --- a/MyOffice.Web/Models/Auth/RegisterModel.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace MyOffice.Web.Models.Auth; - -using System.ComponentModel.DataAnnotations; - -public class RegisterModel -{ - [Required] - [EmailAddress] - public string UserName { get; set; } = null!; - - [Required] - [MinLength(8)] - public string Password { get; set; } = null!; - - [Required] - [Compare(nameof(Password))] - public string ConfirmPassword { get; set; } = null!; -} diff --git a/MyOffice.Web/Models/BaseViewModel.cs b/MyOffice.Web/Models/BaseViewModel.cs deleted file mode 100644 index 8a65a94..0000000 --- a/MyOffice.Web/Models/BaseViewModel.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MyOffice.Web.Models; - -public class BaseViewModel : IResponseModel -{ - -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Currency/CurrencyAddModel.cs b/MyOffice.Web/Models/Currency/CurrencyAddModel.cs deleted file mode 100644 index cdb00e5..0000000 --- a/MyOffice.Web/Models/Currency/CurrencyAddModel.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyOffice.Web.Models.Currency -{ - public class CurrencyAddModel - { - public string Id { get; set; } = null!; - public string Name { get; set; } = null!; - public string ShortName { get; set; } = null!; - public int Quantity { get; set; } - public decimal Rate { get; set; } - public DateTime RateDate { get; set; } - } - - public class CurrencyRateModel - { - public int Quantity { get; set; } - public decimal Rate { get; set; } - public DateTime RateDate { get; set; } - } -} diff --git a/MyOffice.Web/Models/Currency/CurrencyEditModel.cs b/MyOffice.Web/Models/Currency/CurrencyEditModel.cs deleted file mode 100644 index 412607a..0000000 --- a/MyOffice.Web/Models/Currency/CurrencyEditModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MyOffice.Web.Models.Currency; - -public class CurrencyEditModel -{ - public string Name { get; set; } = null!; - public string ShortName { get; set; } = null!; - public int Quantity { get; set; } - public decimal Rate { get; set; } - public DateTime RateDate { get; set; } - public bool IsPrimary { get; set; } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Currency/CurrencyGlobalViewModel.cs b/MyOffice.Web/Models/Currency/CurrencyGlobalViewModel.cs deleted file mode 100644 index 6b71f9a..0000000 --- a/MyOffice.Web/Models/Currency/CurrencyGlobalViewModel.cs +++ /dev/null @@ -1,22 +0,0 @@ -/// -/// -namespace MyOffice.Web.Models.Currency; - -using AutoMapper; -using MyOffice.Services.Currency.Domain; - -public class CurrencyGlobalViewModel: IResponseModel -{ - public string Id { get; set; } = null!; - public string Name { get; set; } = null!; - public int Quantity { get; set; } - public string Symbol { get; set; } = null!; -} - -public class CurrencyGlobalViewModelProfile : Profile -{ - public CurrencyGlobalViewModelProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Currency/CurrencyRateViewModel.cs b/MyOffice.Web/Models/Currency/CurrencyRateViewModel.cs deleted file mode 100644 index 0b6f26c..0000000 --- a/MyOffice.Web/Models/Currency/CurrencyRateViewModel.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace MyOffice.Web.Models.Currency; - -using AutoMapper; -using MyOffice.Services.Currency.Domain; - -public class CurrencyRateViewModel: BaseViewModel -{ - public string Currency { get; set; } = null!; - public DateTime DateTime { get; set; } - public int Quantity { get; set; } - public decimal Rate { get; set; } -} - -public class CurrencyRateViewModelProfile: Profile -{ - public CurrencyRateViewModelProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Currency/CurrencyViewModel.cs b/MyOffice.Web/Models/Currency/CurrencyViewModel.cs deleted file mode 100644 index efade2f..0000000 --- a/MyOffice.Web/Models/Currency/CurrencyViewModel.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace MyOffice.Web.Models.Currency; - -using AutoMapper; -using MyOffice.Services.Currency.Domain; - -public class CurrencyViewModel: BaseViewModel -{ - public string Id { get; set; } = null!; - public string Code { get; set; } = null!; - public string Symbol { get; set; } = null!; - public string Name { get; set; } = null!; - public string ShortName { get; set; } = null!; - public decimal? Rate { get; set; } - public int? Quantity { get; set; } - public DateTime? RateDate { get; set; } - public bool IsPrimary { get; set; } -} - -public class CurrencyViewModelProfile: Profile -{ - public CurrencyViewModelProfile() - { - CreateMap(); - - CreateMap() - .ForMember(x => x.Id, o => o.MapFrom(x => x.Currency.Id)) - .ForMember(x => x.Code, o => o.MapFrom(x => x.Currency.CurrencyGlobalId)) - .ForMember(x => x.Name, o => o.MapFrom(x => x.Currency.Name)) - .ForMember(x => x.ShortName, o => o.MapFrom(x => x.Currency.ShortName)) - .ForMember(x => x.Rate, o => o.MapFrom(x => x.Rate == null ? (decimal?)null : x.Rate.Rate)) - .ForMember(x => x.IsPrimary, o => o.MapFrom(x => x.Currency.IsPrimary)) - .ForMember(x => x.Quantity, o => o.MapFrom(x => x.Rate == null ? (int?)null : x.Rate.Quantity)) - .ForMember(x => x.RateDate, o => o.MapFrom(x => x.Rate == null ? (DateTime?)null : x.Rate.DateTime)) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Dashboard/DashboardIncomeDataViewModel.cs b/MyOffice.Web/Models/Dashboard/DashboardIncomeDataViewModel.cs deleted file mode 100644 index 8af7fb0..0000000 --- a/MyOffice.Web/Models/Dashboard/DashboardIncomeDataViewModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyOffice.Web.Models.Dashboard; - -using AutoMapper; -using MyOffice.Services.Dashboard.Domain; - -public class DashboardIncomeDataViewModel : DashboardIncomeData, IResponseModel -{ - -} - -public class DashboardIncomeDataViewModelProfile : Profile -{ - public DashboardIncomeDataViewModelProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Dashboard/DashboardViewModel.cs b/MyOffice.Web/Models/Dashboard/DashboardViewModel.cs deleted file mode 100644 index 42d4b46..0000000 --- a/MyOffice.Web/Models/Dashboard/DashboardViewModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyOffice.Web.Models.Dashboard; - -using AutoMapper; -using MyOffice.Services.Dashboard.Domain; - -public class DashboardViewModel : DashboardData, IResponseModel -{ - -} - -public class DashboardViewModelProfile : Profile -{ - public DashboardViewModelProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/IRequestModel.cs b/MyOffice.Web/Models/IRequestModel.cs deleted file mode 100644 index 95ac4db..0000000 --- a/MyOffice.Web/Models/IRequestModel.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace MyOffice.Web.Models; - -public interface IRequestModel -{ -} diff --git a/MyOffice.Web/Models/IResponseModel.cs b/MyOffice.Web/Models/IResponseModel.cs deleted file mode 100644 index c1948e0..0000000 --- a/MyOffice.Web/Models/IResponseModel.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace MyOffice.Web.Models; - -public interface IResponseModel -{ -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Item/ItemCategoryViewModel.cs b/MyOffice.Web/Models/Item/ItemCategoryViewModel.cs deleted file mode 100644 index d6596d5..0000000 --- a/MyOffice.Web/Models/Item/ItemCategoryViewModel.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace MyOffice.Web.Models.Item; - -using System.ComponentModel.DataAnnotations; -using AutoMapper; -using Services.Account.Domain; - -public class ItemCategoryViewModel: IResponseModel -{ - public string? Id { get; set; } - - [Required] - public string Name { get; set; } = null!; - - public bool AllowDelete { get; set; } - public int SortOrder { get; set; } - public bool Internal { get; set; } -} - -//TODO: REMOVE -public static class ItemCategoryViewModelExtensions -{ - public static ItemCategoryDto FromModel(this ItemCategoryViewModel input) - { - if (input == null) - throw new ArgumentNullException(nameof(input)); - - return new ItemCategoryDto - { - Name = input.Name, - IsInternal = input.Internal, - }; - } -} - -public class ItemCategoryViewModelProfile: Profile -{ - public ItemCategoryViewModelProfile() - { - CreateMap() - .ForMember(x => x.Internal, o => o.MapFrom(x => x.IsInternal)) - .ForMember(x => x.AllowDelete, o => o.MapFrom(x => !x.Items.Any() && x.Id != x.UserId)) - .ForMember(x => x.SortOrder, o => o.MapFrom(x => x.Id == x.UserId ? 1 : 0)) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Item/ItemChangeCategoryModel.cs b/MyOffice.Web/Models/Item/ItemChangeCategoryModel.cs deleted file mode 100644 index 104544d..0000000 --- a/MyOffice.Web/Models/Item/ItemChangeCategoryModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyOffice.Web.Models.Item; - -public class ItemChangeCategoryModel -{ - public string category { get; set; } = null!; - public List Items { get; set; } = null!; -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Item/ItemEditModel.cs b/MyOffice.Web/Models/Item/ItemEditModel.cs deleted file mode 100644 index 43f161a..0000000 --- a/MyOffice.Web/Models/Item/ItemEditModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyOffice.Web.Models.Item; - -public class ItemEditModel -{ - public string Id { get; set; } = null!; - public string Category { get; set; } = null!; -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Item/ItemViewModel.cs b/MyOffice.Web/Models/Item/ItemViewModel.cs deleted file mode 100644 index 33a0a12..0000000 --- a/MyOffice.Web/Models/Item/ItemViewModel.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace MyOffice.Web.Models.Item; - -using System.ComponentModel.DataAnnotations; -using AutoMapper; -using MyOffice.Services.Account.Domain; - -public class ItemViewModel : BaseViewModel -{ - public string? Id { get; set; } - [Required] - public string? Name { get; set; } - - public bool AllowDelete { get; set; } - - public string CategoryId { get; set; } = null!; - public string? Category { get; set; } = null!; - - public string? AccountId { get; set; } -} - -public class ItemViewModelProfile: Profile -{ - public ItemViewModelProfile() - { - CreateMap() - .ForMember(x => x.Category, o => o.MapFrom(x => x.Category!.Name)) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Motion/AccountControllerProfile.cs b/MyOffice.Web/Models/Motion/AccountControllerProfile.cs deleted file mode 100644 index c976d20..0000000 --- a/MyOffice.Web/Models/Motion/AccountControllerProfile.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace MyOffice.Web.Models.Motion; - -using AutoMapper; -using Data.Models.Accounts; -using Services.Account.Domain; - -public class AccountControllerProfile : Profile -{ - public AccountControllerProfile() - { - CreateMap() - .ForMember(x => x.Date, o => o.MapFrom(x => x.DateTime)) - .ForMember(x => x.Item, o => o.MapFrom(x => x.Item.ItemGlobal.Name)) - .ForMember(x => x.Plus, o => o.MapFrom(x => x.AmountPlus)) - .ForMember(x => x.Minus, o => o.MapFrom(x => x.AmountMinus)) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Motion/MotionRequest.cs b/MyOffice.Web/Models/Motion/MotionRequest.cs deleted file mode 100644 index a4f2bc8..0000000 --- a/MyOffice.Web/Models/Motion/MotionRequest.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace MyOffice.Web.Models.Motion; - -using AutoMapper; -using MyOffice.Services.Account.Domain; - -public class MotionRequest -{ - public DateTime Date { get; set; } - public string Item { get; set; } = null!; - public string? ItemId { get; set; } = null!; - public string? AccountId { get; set; } = null!; - public string? Description { get; set; } - public decimal? Plus { get; set; } - public decimal? Minus { get; set; } - public decimal? AmountBalancing { get; set; } -} - -public class MotionRequestProfile : Profile -{ - public MotionRequestProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/Motion/MotionViewModel.cs b/MyOffice.Web/Models/Motion/MotionViewModel.cs deleted file mode 100644 index c5a0f11..0000000 --- a/MyOffice.Web/Models/Motion/MotionViewModel.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace MyOffice.Web.Models.Motion; - -using AutoMapper; -using MyOffice.Services.Account.Domain; - -public class MotionViewModel : BaseViewModel -{ - public string Id { get; set; } = null!; - public DateTime Date { get; set; } - public string AccountId { get; set; } = null!; - public string Item { get; set; } = null!; - public string? Description { get; set; } - public decimal Plus { get; set; } - public decimal Minus { get; set; } -} - -public class MotionViewModelProfile : Profile -{ - public MotionViewModelProfile() - { - CreateMap() - .ForMember(x => x.Item, x => x.MapFrom(m => m.Item.Name)) - .ForMember(x => x.Minus, x => x.MapFrom(m => m.AmountMinus)) - .ForMember(x => x.Plus, x => x.MapFrom(m => m.AmountPlus)) - ; - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/User/UserViewModel.cs b/MyOffice.Web/Models/User/UserViewModel.cs deleted file mode 100644 index 03d8b8b..0000000 --- a/MyOffice.Web/Models/User/UserViewModel.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyOffice.Web.Models.User; - -using AutoMapper; -using MyOffice.Services.Account.Domain; - -public class UserViewModel -{ - public string Id { get; set; } = null!; - public string UserName { get; set; } = null!; - public string Email { get; set; } = null!; -} - -public class UserViewModelProfile: Profile -{ - public UserViewModelProfile() - { - CreateMap(); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Models/ViewModelProfile.cs b/MyOffice.Web/Models/ViewModelProfile.cs deleted file mode 100644 index a5e4db6..0000000 --- a/MyOffice.Web/Models/ViewModelProfile.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyOffice.Web.Models; - -using AutoMapper; -using Core.Extensions; - -public class ViewModelProfile : Profile -{ - public ViewModelProfile() - { - CreateMap().ConvertUsing(x => x.ToShort()); - } -} \ No newline at end of file diff --git a/MyOffice.Web/MyOffice.Web.csproj b/MyOffice.Web/MyOffice.Web.csproj deleted file mode 100644 index 4456927..0000000 --- a/MyOffice.Web/MyOffice.Web.csproj +++ /dev/null @@ -1,54 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - - - - - - - - - - - - Never - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MyOffice.Web/Program.Routes.cs b/MyOffice.Web/Program.Routes.cs deleted file mode 100644 index 9ec95fe..0000000 --- a/MyOffice.Web/Program.Routes.cs +++ /dev/null @@ -1,56 +0,0 @@ -namespace MyOffice.Web; - -public partial class Program -{ - /// - /// Legacy imperative MapRoute table removed — API controllers use attribute routing. - /// Kept as a no-op so call sites stay stable while Routes constants remain for SPA/docs. - /// - private static void MapRoutes(WebApplication app) - { - } -} - -/// -/// Canonical API path constants (also used by SPA clients / docs). -/// -public static class Routes -{ - public static readonly string GlobalCurrencies = "api/general/currencies"; - public static readonly string SettingsCurrencies = "api/settings/currencies"; - public static readonly string SettingsCurrency = "api/settings/currencies/{id}"; - public static readonly string SettingsCurrencyRate = "api/settings/currencies/{id}/rate"; - - public static readonly string SettingsAccountCategories = "api/settings/account-categories"; - public static readonly string SettingsAccountCategory = "api/settings/account-categories/{id}"; - - public static readonly string SettingsAccounts = "api/settings/accounts"; - public static readonly string SettingsAccount = "api/settings/accounts/{id}"; - public static readonly string SettingsAccountAccountCategory = "api/settings/accounts/{id}/category/{categoryId}"; - - public static readonly string SettingsAccountAccesses = "api/settings/accounts/{id}/access"; - public static readonly string SettingsAccountAccess = "api/settings/accounts/{id}/access/{userId}"; - public static readonly string SettingsAccountInvites = "api/settings/accounts/invites"; - public static readonly string SettingsAccountInviteAccept = "api/settings/accounts/invites/{id}/accept"; - public static readonly string SettingsAccountInviteReject = "api/settings/accounts/invites/{id}/reject"; - - public static readonly string SettingsItemCategories = "api/settings/item-categories"; - public static readonly string SettingsItemCategory = "api/settings/item-categories/{id}"; - public static readonly string SettingsItems = "api/settings/items"; - public static readonly string SettingsItem = "api/settings/items/{id}"; - - public static readonly string Accounts = "api/accounts"; - public static readonly string Account = "api/accounts/{id}"; - public static readonly string AccountMotions = "api/accounts/{id}/motions"; - public static readonly string AccountMotion = "api/accounts/{id}/motions/{motionId}"; - public static readonly string Items = "api/items"; - - public static readonly string Dashboard = "api/dashboard"; - public static readonly string DashboardIncome = "api/dashboard/income"; - public static readonly string DashboardOutcome = "api/dashboard/outcome"; - - public static readonly string UserRegister = "api/user/register"; - public static readonly string UserProfile = "api/user/profile"; - public static readonly string UserAttach = "api/user/attach"; - public static readonly string UserDeattach = "api/user/deattach"; -} diff --git a/MyOffice.Web/Program.cs b/MyOffice.Web/Program.cs deleted file mode 100644 index 4aabbda..0000000 --- a/MyOffice.Web/Program.cs +++ /dev/null @@ -1,449 +0,0 @@ -namespace MyOffice.Web; - -using System.IO; -using System.Linq; -using System.Collections.Concurrent; -using Microsoft.AspNetCore.Identity; -using Microsoft.Extensions.FileProviders.Physical; -using Microsoft.Extensions.Logging; -using Microsoft.IdentityModel.Logging; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.HttpOverrides; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Options; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging.Console; -using System.Text.Json.Serialization; - -using Identity; -using Identity.Domain; -using Identity.ExternalProviders; -using Identity.Repositories; -using Auth; -using Core.Identity; -using Core.Extensions; -using Data.Repositories.Account; -using Data.Repositories.Currency; -using Data.Repositories.Item; -using Data.Repositories.Users; -using DbContext; -using Services.Users; -using Shared; -using Infrastructure; -using Models.Account; -using MyOffice.Services.Currency; -using Services.Account; -using Services.Item; -using MyOffice.Services.Dashboard; -using MyOffice.Services.Identity; -using MyOffice.Services.Account.Domain; -using MyOffice.Web.Infrastructure.Attributes; -using System.Text.Json; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Infrastructure; -using MyOffice.Web.Infrastructure.Filters; - -//TODO: Data.Model only Repository and Service, response <-> mapper <-> web <-> mapper <-> service <-> repository -//TODO: Project management -//TODO: Model names. Controller = xxxRequest/xxxResponse. Service xxxInput/xxxOutput. -//TODO: Validate string as Guid when id -//TODO: Test back -//TODO: Test front -//TODO: Test DB ??? -//TODO: Email confirmation -//TODO: Password recovery -//TODO: Account sharing -//TODO: /dashboard/dashboard -> /dashboard/main or /dashboard -//TODO: SPA load categories twice menu + setting (cache) -//TODO: SPA update account category -> update menu -//TODO: Response model from base type -//TODO: XXXResult -> XXXStatus -//TODO: SPA isAllowDelete -> allowDelete (remove is) -//TODO: Repository auto registration -//TODO: Services auto registration -//TODO: openid-configuration failed - lock login -//TODO: BUG some times after login redirect to dashboard but exists return url -//TODO: automapper -> Extension ToModel() ToDbo() FromModel() FromDbo() -//TODO: SPA all http requests -> services -//TODO: Items, select category -> save url to allow refresh -//TODO: Accounts, select category -> save url to allow refresh - -public partial class Program -{ - public static void Main(string[] args) - { - var builder = WebApplication.CreateBuilder(args); - AddServices(builder, args); - - var app = builder.Build(); - Configure(app); - - app.Run(); - } - - private static void AddServices(WebApplicationBuilder builder, string[] args) - { - #region Loging - - builder.Services.AddLogging(logging => - logging.AddSimpleConsole(options => - { - //options.SingleLine = true; - options.TimestampFormat = "[HH:mm:ss] "; - options.ColorBehavior = LoggerColorBehavior.Enabled; - }) - ); - //File Logger - builder.Logging.AddFile(builder.Configuration.GetSection("Logging")); - - #endregion Loging - - builder.Services.Configure(options => - { - options.AddFilter("OpenIddict", LogLevel.Warning); - }); - - // Shared JSON after appsettings.*, then restore higher-priority sources - builder.Configuration.AddSharedAppSettings(builder.Environment.EnvironmentName); - builder.Configuration.AddEnvironmentVariables(); - builder.Configuration.AddCommandLine(args); - - #region Database - - var databaseProvider = builder.Configuration["DatabaseProvider"]; - if (databaseProvider == null) - throw new NullReferenceException($"Configuration DatabaseProvider {databaseProvider}"); - - var connectionString = builder.Configuration.GetConnectionString(databaseProvider); - if (connectionString == null) - throw new NullReferenceException($"Configuration ConnectionString {databaseProvider}"); - - var connectionConfiguration = new ConnectionConfiguration(databaseProvider, connectionString); - RepositoryInitializer.Initialize(builder.Services, connectionConfiguration); - // Before OpenIddictSeeder so the schema exists when clients/scopes are registered. - builder.Services.AddHostedService(); - - #endregion Database - - // Configurations - builder.Services.Configure( - builder.Configuration.GetSection("ExternalProviders") - ); - - InitializeGlobalSettings(builder); - - AddIdentityServices(builder); - - builder.Services.AddScoped(); - - AddAutoMapper(builder); - - AddRepositories(builder); - - AddBusinessServices(builder); - - builder.Services - .AddControllers() - .AddJsonOptions(options => - { - options.AllowInputFormatterExceptionMessages = builder.Environment.IsDevelopment(); - options.JsonSerializerOptions.MaxDepth = 0; - options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; - options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; - options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; - options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase; - }); - - builder.Services.AddCors(); - - builder.Services.AddControllersWithViews(options => - { - options.Conventions.Add(new DefaultFromBodyBindingConvention()); - options.Filters.Add(typeof(GlobalModelStateValidatorAttribute)); - options.Filters.Add(typeof(ResponseFilter)); - }); - - builder.Services.Configure(options => - { - }); - - builder.Services.Configure(x => { - }); - - builder.Services.AddProblemDetails(); - builder.Services.AddExceptionHandler(); - builder.Services.AddSingleton(); - } - - private static void InitializeGlobalSettings(WebApplicationBuilder builder) - { - var frontEndHost = builder.Configuration.GetValue("FrontEnd:Host"); - if (frontEndHost.IsMissing()) - { - frontEndHost = "http://localhost:4300"; - if (!builder.Environment.IsDevelopment()) - { - throw new InvalidOperationException( - "FrontEnd:Host must be set outside Development (do not derive it from Referer)."); - } - } - - frontEndHost = frontEndHost!.TrimEnd('/'); - builder.Services.Configure(options => options.Host = frontEndHost); - builder.Services.AddSingleton(resolver => resolver.GetRequiredService>().Value); - } - - private static void AddIdentityServices(WebApplicationBuilder builder) - { - builder.Services.AddHttpContextAccessor(); - - // add identity - builder.Services - .AddIdentity, ApplicationRole>() - .AddUserStore() - .AddRoleStore() - .AddUserManager() - .AddSignInManager>>() - .AddDefaultTokenProviders(); - - builder.Services.AddScoped>, PasswordHasher>(); - - // Identity Services - builder.Services.AddScoped>, UserStore>(); - builder.Services.AddScoped, RoleStore>(); - - // External providers - builder.Services.AddScoped(); - builder.Services.AddScoped(); - - // Configure Identity options and password complexity here - builder.Services.Configure(options => - { - // User settings - options.User.RequireUniqueEmail = true; - - // Email+password accounts can sign in immediately after register - options.SignIn.RequireConfirmedAccount = false; - options.SignIn.RequireConfirmedEmail = false; - - // Password settings - options.Password.RequireDigit = true; - options.Password.RequiredLength = 8; - options.Password.RequireNonAlphanumeric = true; - options.Password.RequireUppercase = true; - options.Password.RequireLowercase = true; - - // Lockout settings - options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30); - options.Lockout.MaxFailedAccessAttempts = 10; - }); - - builder.Services.Configure(options => - { - options.ForwardedHeaders = - ForwardedHeaders.XForwardedFor - | ForwardedHeaders.XForwardedProto - | ForwardedHeaders.XForwardedHost; - // Trust nginx in Docker; headers are only present behind the proxy. - options.KnownNetworks.Clear(); - options.KnownProxies.Clear(); - }); - - builder.Services.AddMyOfficeOpenIddict(builder.Configuration, builder.Environment); - } - - private static void AddAutoMapper(WebApplicationBuilder builder) - { - // AutoMapper 15+ dual license: runs without a key (warning logs only). - // Set AutoMapper:LicenseKey (or AUTOMAPPER_LICENSE_KEY) from https://automapper.io — free Community tier if under $5M revenue. - var licenseKey = builder.Configuration["AutoMapper:LicenseKey"]; - - builder.Services.AddAutoMapper( - c => - { - if (!string.IsNullOrWhiteSpace(licenseKey)) - { - c.LicenseKey = licenseKey; - } - - c.AllowNullCollections = true; - c.AllowNullDestinationValues = true; - }, - typeof(AccountDto).Assembly, - typeof(AccountViewModel).Assembly - ); - } - - private static void AddRepositories(WebApplicationBuilder builder) - { - builder.Services.AddScoped(); - builder.Services.AddScoped(); - - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - - builder.Services.AddScoped(); - builder.Services.AddScoped(); - } - - private static void AddBusinessServices(WebApplicationBuilder builder) - { - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - } - - private static readonly ConcurrentDictionary _staticFilesCache = new(); - - private static void Configure(WebApplication app) - { - // nginx (prod) terminates TLS and forwards X-Forwarded-Proto/Host - app.UseForwardedHeaders(); - - // Configure the HTTP request pipeline. - if (app.Environment.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - IdentityModelEventSource.ShowPII = true; - } - else - { - app.UseExceptionHandler(); - app.UseStatusCodePages(); - } - - // Explicit routing so CORS runs before endpoint matching (preflight / OPTIONS). - app.UseRouting(); - ConfigureCors(app); - - app.UseDefaultFiles(); - app.UseStaticFiles(); - - var logger = app.Logger; - var globalSettings = app.Services.GetRequiredService(); - logger.LogInformation("FrontEnd host: {Host}", globalSettings.Host); - - // send index.html / static files for non-API routes - var coreRoutes = new[] - { - // API routes - new PathString("/api"), - // Identity server routes - new PathString("/.well-known"), - new PathString("/connect"), - new PathString("/silent-refresh.html") - }; - - var webRootPath = app.Configuration.GetValue(WebHostDefaults.ContentRootKey); - var wwwrootPath = Path.Combine(webRootPath!, "wwwroot"); - app.Use(async (context, next) => - { - var path = context.Request.Path; - - if (path.Value == null) - { - await next(); - return; - } - - if (coreRoutes.Any(x => path.StartsWithSegments(x, StringComparison.OrdinalIgnoreCase))) - { - await next(); - return; - } - - if (!_staticFilesCache.TryGetValue(path.Value, out var physicalFileInfo)) - { - var segments = path.Value.Split('/', '\\'); - var fileName = segments.LastOrDefault(); - var fileInfo = string.IsNullOrEmpty(fileName) - ? null - : new FileInfo(Path.Combine(wwwrootPath, fileName)); - - if (fileInfo is null || !fileInfo.Exists) - { - // SPA deep link fallback - var indexInfo = new FileInfo(Path.Combine(wwwrootPath, "index.html")); - if (!indexInfo.Exists) - { - context.Response.StatusCode = StatusCodes.Status404NotFound; - return; - } - - physicalFileInfo = new PhysicalFileInfo(indexInfo); - } - else - { - physicalFileInfo = new PhysicalFileInfo(fileInfo); - _staticFilesCache.TryAdd(path.Value, physicalFileInfo); - } - } - - await context.Response.SendFileAsync(physicalFileInfo); - }); - - app.UseAuthentication(); - app.UseAuthorization(); - - MapRoutes(app); - - app.MapControllers(); - } - - private static void ConfigureCors(WebApplication app) - { - var allowedOrigins = (app.Configuration.GetSection("Cors:AllowedOrigins").Get() ?? []) - .Where(x => !string.IsNullOrWhiteSpace(x)) - .Select(x => x.Trim().TrimEnd('/')) - .Distinct(StringComparer.OrdinalIgnoreCase) - .ToList(); - - var frontEndHost = app.Configuration.GetValue("FrontEnd:Host")?.Trim().TrimEnd('/'); - if (!string.IsNullOrWhiteSpace(frontEndHost) - && !allowedOrigins.Contains(frontEndHost, StringComparer.OrdinalIgnoreCase)) - { - allowedOrigins.Add(frontEndHost); - } - - var isDocker = string.Equals( - app.Environment.EnvironmentName, - "Docker", - StringComparison.OrdinalIgnoreCase); - - app.Logger.LogInformation( - "CORS origins: {Origins}", - allowedOrigins.Count > 0 ? string.Join(", ", allowedOrigins) : "(none)"); - - app.UseCors(policy => - { - if (allowedOrigins.Count > 0) - { - policy.WithOrigins(allowedOrigins.ToArray()) - .AllowAnyHeader() - .AllowAnyMethod(); - } - else if (app.Environment.IsDevelopment() || isDocker) - { - // Demo / local: SPA and API are on different host ports. - policy.AllowAnyOrigin() - .AllowAnyHeader() - .AllowAnyMethod(); - } - }); - } -} \ No newline at end of file diff --git a/MyOffice.Web/Properties/launchSettings.json b/MyOffice.Web/Properties/launchSettings.json deleted file mode 100644 index 833dff2..0000000 --- a/MyOffice.Web/Properties/launchSettings.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "profiles": { - "MyOffice.Web": { - "commandName": "Project", - "launchUrl": "swagger", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:9100", - "dotnetRunMessages": true - }, - "MyOffice.SPA": { - "commandName": "Project" - }, - "IIS Express": { - "commandName": "IISExpress", - "launchUrl": "swagger", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS": { - "commandName": "IIS", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "watch": { - "commandName": "Executable", - "executablePath": "dotnet", - "workingDirectory": "$(ProjectDir)", - "hotReloadEnabled": true, - "hotReloadProfile": "aspnetcore", - "commandLineArgs": "watch run", - "launchBrowser": false, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - }, - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iis": { - "applicationUrl": "http://localhost:9300" - }, - "iisExpress": { - "applicationUrl": "http://localhost:9300", - "sslPort": 0 - }, - "watch": { - "applicationUrl": "http://localhost:9300" - } - } -} diff --git a/MyOffice.Web/appsettings.Docker.json b/MyOffice.Web/appsettings.Docker.json deleted file mode 100644 index 88a0d2c..0000000 --- a/MyOffice.Web/appsettings.Docker.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "DatabaseProvider": "npgsql", - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "Kestrel": { - "EndPoints": { - "Http": { - "Url": "http://*:8080" - } - } - }, - "FrontEnd": { - "Host": "http://localhost:32080" - }, - "Cors": { - "AllowedOrigins": [ - "http://localhost:32080", - "http://127.0.0.1:32080" - ] - }, - "OpenIddict": { - "SigningKeyPath": "", - "EncryptionKeyPath": "", - "UseEphemeralKeys": true, - "AllowHttp": true - } -} diff --git a/MyOffice.Web/appsettings.json b/MyOffice.Web/appsettings.json deleted file mode 100644 index df31feb..0000000 --- a/MyOffice.Web/appsettings.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "DatabaseProvider": "npgsql", - /*"DatabaseProvider": "sqlite",*/ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "Kestrel": { - "EndPoints": { - "Http": { - "Url": "http://*:9100" - } - /*, - "Https": { - "Url": "https://*:9101" - }*/ - } - }, - "AllowedHosts": "*", - "FrontEnd": { - "Host": "http://localhost:4300" - }, - "AutoMapper": { - "LicenseKey": "" - }, - "OpenIddict": { - "SigningKeyPath": "", - "EncryptionKeyPath": "" - }, - "Cors": { - "AllowedOrigins": [ - "http://localhost:4300" - ] - }, - "ExternalProviders": { - "Auth0": { - "ClientId": "", - "Domain": "", - "SecretKey": "" - }, - "Google": { - "ClientId": "" - } - } -} \ No newline at end of file diff --git a/MyOffice.Web/web.Release.config b/MyOffice.Web/web.Release.config deleted file mode 100644 index a7c2127..0000000 --- a/MyOffice.Web/web.Release.config +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MyOffice.Web/web.config b/MyOffice.Web/web.config deleted file mode 100644 index add3e64..0000000 --- a/MyOffice.Web/web.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MyOffice.Web/wwwroot/index.html b/MyOffice.Web/wwwroot/index.html deleted file mode 100644 index 80b20c7..0000000 --- a/MyOffice.Web/wwwroot/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - MyOffice - - - - - - -

DEVELOPER INDEX.HTML

- - \ No newline at end of file diff --git a/MyOffice.sln b/MyOffice.sln deleted file mode 100644 index a49c3e3..0000000 --- a/MyOffice.sln +++ /dev/null @@ -1,196 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 18 -VisualStudioVersion = 18.8.12009.203 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{54A90642-561A-4BB1-A94E-469ADEE60C69}") = "MyOffice.SPA", "MyOffice.SPA\MyOffice.SPA.esproj", "{B02D9868-26CB-4E98-95D8-7286BF255F89}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyOffice.Web", "MyOffice.Web\MyOffice.Web.csproj", "{BCF0590C-5F6A-49BA-A05B-F333865ABEDB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyOffice.Core", "MyOffice.Core\MyOffice.Core.csproj", "{0347A25D-12D5-4FE0-92F3-102F9F35DCE9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyOffice.Data.Models", "MyOffice.Data.Models\MyOffice.Data.Models.csproj", "{3D1626CF-1FC3-45D5-A479-65EB955CCFD9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyOffice.Data.Repositories", "MyOffice.Data.Repositories\MyOffice.Data.Repositories.csproj", "{B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyOffice.Services", "MyOffice.Services\MyOffice.Services.csproj", "{0442839B-7509-4E76-9EA9-66DAD9F74031}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "EF", "EF", "{89463832-F443-478A-AF0D-F2BC209237C8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyOffice.Migrations.Sqlite", "MyOffice.Migration.Sqlite\MyOffice.Migrations.Sqlite.csproj", "{4CAEC4BF-E3BA-4027-8628-F307075C1D9F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyOffice.Migrations.Postgres", "MyOffice.Migration.Postgres\MyOffice.Migrations.Postgres.csproj", "{030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyOffice.DbContext", "MyOffice.DbContext\MyOffice.DbContext.csproj", "{1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyOffice.Shared", "MyOffice.Shared\MyOffice.Shared.csproj", "{8D8D816F-837D-43CA-8F59-3C78DEB9D48A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{06517FE0-8E41-4124-A482-F21382A62687}" - ProjectSection(SolutionItems) = preProject - gulpfile.js = gulpfile.js - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PostgresPgAdmin", "PostgresPgAdmin", "{D22C304C-7187-46B9-A059-47F557FAE764}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docker", "Docker", "{C2361FAE-1865-44C2-94AA-1ED41EDAE973}" - ProjectSection(SolutionItems) = preProject - Docker\dc-postgres-pgadmin.yml = Docker\dc-postgres-pgadmin.yml - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyOffice.Tests", "MyOffice.Tests\MyOffice.Tests.csproj", "{3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B02D9868-26CB-4E98-95D8-7286BF255F89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B02D9868-26CB-4E98-95D8-7286BF255F89}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B02D9868-26CB-4E98-95D8-7286BF255F89}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {B02D9868-26CB-4E98-95D8-7286BF255F89}.Debug|x64.ActiveCfg = Debug|x64 - {B02D9868-26CB-4E98-95D8-7286BF255F89}.Debug|x86.ActiveCfg = Debug|x86 - {B02D9868-26CB-4E98-95D8-7286BF255F89}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B02D9868-26CB-4E98-95D8-7286BF255F89}.Release|Any CPU.Build.0 = Release|Any CPU - {B02D9868-26CB-4E98-95D8-7286BF255F89}.Release|Any CPU.Deploy.0 = Release|Any CPU - {B02D9868-26CB-4E98-95D8-7286BF255F89}.Release|x64.ActiveCfg = Release|x64 - {B02D9868-26CB-4E98-95D8-7286BF255F89}.Release|x86.ActiveCfg = Release|x86 - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Debug|x64.ActiveCfg = Debug|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Debug|x64.Build.0 = Debug|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Debug|x86.ActiveCfg = Debug|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Debug|x86.Build.0 = Debug|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Release|Any CPU.Build.0 = Release|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Release|x64.ActiveCfg = Release|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Release|x64.Build.0 = Release|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Release|x86.ActiveCfg = Release|Any CPU - {BCF0590C-5F6A-49BA-A05B-F333865ABEDB}.Release|x86.Build.0 = Release|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Debug|x64.ActiveCfg = Debug|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Debug|x64.Build.0 = Debug|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Debug|x86.ActiveCfg = Debug|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Debug|x86.Build.0 = Debug|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Release|Any CPU.Build.0 = Release|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Release|x64.ActiveCfg = Release|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Release|x64.Build.0 = Release|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Release|x86.ActiveCfg = Release|Any CPU - {0347A25D-12D5-4FE0-92F3-102F9F35DCE9}.Release|x86.Build.0 = Release|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Debug|x64.ActiveCfg = Debug|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Debug|x64.Build.0 = Debug|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Debug|x86.ActiveCfg = Debug|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Debug|x86.Build.0 = Debug|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Release|Any CPU.Build.0 = Release|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Release|x64.ActiveCfg = Release|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Release|x64.Build.0 = Release|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Release|x86.ActiveCfg = Release|Any CPU - {3D1626CF-1FC3-45D5-A479-65EB955CCFD9}.Release|x86.Build.0 = Release|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Debug|x64.ActiveCfg = Debug|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Debug|x64.Build.0 = Debug|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Debug|x86.ActiveCfg = Debug|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Debug|x86.Build.0 = Debug|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Release|Any CPU.Build.0 = Release|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Release|x64.ActiveCfg = Release|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Release|x64.Build.0 = Release|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Release|x86.ActiveCfg = Release|Any CPU - {B6C7263F-4ED5-4EF3-93E3-25E1A9036A97}.Release|x86.Build.0 = Release|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Debug|x64.ActiveCfg = Debug|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Debug|x64.Build.0 = Debug|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Debug|x86.ActiveCfg = Debug|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Debug|x86.Build.0 = Debug|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Release|Any CPU.Build.0 = Release|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Release|x64.ActiveCfg = Release|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Release|x64.Build.0 = Release|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Release|x86.ActiveCfg = Release|Any CPU - {0442839B-7509-4E76-9EA9-66DAD9F74031}.Release|x86.Build.0 = Release|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Debug|x64.ActiveCfg = Debug|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Debug|x64.Build.0 = Debug|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Debug|x86.ActiveCfg = Debug|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Debug|x86.Build.0 = Debug|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Release|Any CPU.Build.0 = Release|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Release|x64.ActiveCfg = Release|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Release|x64.Build.0 = Release|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Release|x86.ActiveCfg = Release|Any CPU - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F}.Release|x86.Build.0 = Release|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Debug|Any CPU.Build.0 = Debug|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Debug|x64.ActiveCfg = Debug|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Debug|x64.Build.0 = Debug|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Debug|x86.ActiveCfg = Debug|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Debug|x86.Build.0 = Debug|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Release|Any CPU.ActiveCfg = Release|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Release|Any CPU.Build.0 = Release|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Release|x64.ActiveCfg = Release|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Release|x64.Build.0 = Release|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Release|x86.ActiveCfg = Release|Any CPU - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18}.Release|x86.Build.0 = Release|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Debug|x64.ActiveCfg = Debug|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Debug|x64.Build.0 = Debug|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Debug|x86.ActiveCfg = Debug|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Debug|x86.Build.0 = Debug|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Release|Any CPU.Build.0 = Release|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Release|x64.ActiveCfg = Release|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Release|x64.Build.0 = Release|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Release|x86.ActiveCfg = Release|Any CPU - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF}.Release|x86.Build.0 = Release|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Debug|x64.ActiveCfg = Debug|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Debug|x64.Build.0 = Debug|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Debug|x86.ActiveCfg = Debug|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Debug|x86.Build.0 = Debug|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Release|Any CPU.Build.0 = Release|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Release|x64.ActiveCfg = Release|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Release|x64.Build.0 = Release|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Release|x86.ActiveCfg = Release|Any CPU - {8D8D816F-837D-43CA-8F59-3C78DEB9D48A}.Release|x86.Build.0 = Release|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Debug|x64.ActiveCfg = Debug|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Debug|x64.Build.0 = Debug|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Debug|x86.ActiveCfg = Debug|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Debug|x86.Build.0 = Debug|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Release|Any CPU.Build.0 = Release|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Release|x64.ActiveCfg = Release|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Release|x64.Build.0 = Release|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Release|x86.ActiveCfg = Release|Any CPU - {3E7C3005-275C-4AD5-AAAA-0B9C4D1F0111}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {4CAEC4BF-E3BA-4027-8628-F307075C1D9F} = {89463832-F443-478A-AF0D-F2BC209237C8} - {030C3E7B-5CED-4A9D-BBE6-A9879F3CDF18} = {89463832-F443-478A-AF0D-F2BC209237C8} - {1EC878BB-CFE1-40AC-A091-0BEE3403DEAF} = {89463832-F443-478A-AF0D-F2BC209237C8} - {D22C304C-7187-46B9-A059-47F557FAE764} = {06517FE0-8E41-4124-A482-F21382A62687} - {C2361FAE-1865-44C2-94AA-1ED41EDAE973} = {06517FE0-8E41-4124-A482-F21382A62687} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {6EAF5FD7-426A-4EA9-9A73-63854C47CDED} - EndGlobalSection -EndGlobal diff --git a/PUBLIC.md b/PUBLIC.md new file mode 100644 index 0000000..b3a38fa --- /dev/null +++ b/PUBLIC.md @@ -0,0 +1,8 @@ +# MyOffice public tree + +This repository is a **filtered** mirror for Proxmox CT install scripts and Docker demo files. +Application **source** stays in the private developer repository. +Runnable app binaries are published as **Gitea Releases** (`myoffice-publish.tar.gz`). + +See [proxmox/README.md](proxmox/README.md). + diff --git a/README.md b/README.md new file mode 100644 index 0000000..faf6a8b --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +# MyOffice + +**Layers** +Frontend <-> Backend <-> Services <-> Repositories <-> Database + +*1. MyOffice.SPA* +Frontend layer +Angular + +*2. MyOffice.Web* +Backend layer +ASP Core + +*3. MyOffice.Data.Services* +Services layer + +*5. MyOffice.Data.Models* +Models + +*6. MyOffice.Data.Repositories* +Database layer + +*7. MyOffice.DbContext* +AppDbContext +EntityFramework Core + +*8. MyOffice.Migrations.Postgres* +Postgres Migrations + +*9. MyOffice.Migrations.Sqlite* +Sqlite Migrations + + +**DataBase** +1. SQLite +2. PostgreSql +3. MS SQL + +**Develompent** +1. Local IIS +2. Express IIS + +**Authentication & Authorization** + +1. OpenIddict (replaces IdentityServer4) +2. Custom UserStore + Identity V3 password hashes (legacy hashes rehashed on login) +3. SPA: email/password via ROPC (kept); Authorization Code + PKCE configured for interactive OIDC +4. Login with Google / Auth0 (`external` grant) +5. Details: [docs/AUTH.md](docs/AUTH.md), refactoring: [docs/REFACTORING_PLAN.md](docs/REFACTORING_PLAN.md) + +**Build & Deploy** +1. Build with .bat +2. Deploy to Linux + +**Get started** +1. Restore / build: `dotnet build MyOffice.Web/MyOffice.Web.csproj` +2. SPA: `cd MyOffice.SPA && npm install && npm start` (default http://localhost:4300) +3. Set startup project to `MyOffice.Web`, run (API default http://localhost:9100) +4. Ensure `FrontEnd:Host` matches the SPA origin (`appsettings.json`) +5. Tests: `dotnet test MyOffice.Tests/MyOffice.Tests.csproj` +6. Empty DB is auto-filled with demo users (rates at Jan 1, sample accounts/items/motions): + - `user_UAH@user_UAH.userUAH` / `user_UAH` + - `user_USD@user_USD.userUSD` / `user_USD` + - `user_EUR@user_EUR.userEUR` / `user_EUR` + +**add site to IIS** +1. add +Site name:myproject +Physical path:...\MyProject\MyProject.Web +Port:9100 +2. Select 'IIS', Run Backend (F5) + +**Settings** +1. launchSettings.json +2. appsettings +appsettings.json +appsettings.Development.json +appsettings.Production.json +3. Optional: `AutoMapper:LicenseKey` (or env `AUTOMAPPER_LICENSE_KEY`) — free Community key from https://automapper.io if under ~$5M revenue. Empty works; you only get license warning logs. + +**External providers** +1. Auth0 +appsettings ExternalProviders:Auth0 +2. Google +appsettings ExternalProviders:Google + +**PowerShell scripts** +1. use 'Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass' to allow run *.ps1 +2. params.txt +2.1. publish_folder=_Published (folder to publish) +2.2. linux_user=root (linux user) +2.3. linux_host=192.168.1.215 (linux host) +2.4. linux_folder=/var/www/MyProject (folder in linux) + +**Build** +1. .\build.ps1 +1.1. '.\build.ps1' - build Backend + Frontend +1.2. '.\build.ps1 dotnet' build Backend +1.3. '.\build.ps1 spa' build Frontend + +**Docker demo** (SPA + API + Postgres + pgAdmin) +1. `cd Docker` then `.\build.ps1` (defaults :32080 / :32081 / :32082) +2. After code changes: `.\build.ps1 rebuild` (or `.\build.ps1 reset` to wipe DB + re-seed) +3. Details: [Docker/README.md](Docker/README.md) + +**Proxmox** (Gitea public scripts + release artifact) +1. Maintainer: `.\proxmox\publish.ps1 -Tar` → `.\proxmox\release.ps1` → `.\proxmox\sync-public.ps1 -Push` (or Gitea Actions) +2. User on Proxmox: set `GITEA_URL` / `GITEA_OWNER` / `REPO_RAW_BASE`, run `myoffice.sh` (see [proxmox/README.md](proxmox/README.md)) +3. Proxy nginx to `http://:9100` +4. Lab SSH (no Gitea): `.\proxmox\deploy.ps1 -TargetHost ` diff --git a/proxmox/README.md b/proxmox/README.md new file mode 100644 index 0000000..77a5f60 --- /dev/null +++ b/proxmox/README.md @@ -0,0 +1,136 @@ +# MyOffice on Proxmox (Gitea releases) + +Three-tier setup on **your Gitea**: + +| Tier | Repo | Visibility | Contents | +|------|------|------------|----------| +| 1. Dev | `myoffice` | Private | Full source | +| 2. Public code | `myoffice-public` | Public | Allowlisted scripts (`proxmox/`, `Docker/`, README) | +| 3. Published app | Releases on `myoffice-public` | Public | `myoffice-publish.tar.gz` | + +CT install downloads the release tarball (not source). No Docker/nginx/SDK/Node inside the CT — proxy with your existing nginx LXC to Kestrel `:9100`. + +```text +[private myoffice] --sync-public--> [myoffice-public raw scripts] +[private myoffice] --publish+release--> [Gitea Release .tar.gz] + | +[User Proxmox] curl myoffice.sh ----------> [LXC: Postgres + ASP.NET + app] + ^ +[User nginx] proxy_pass http://ct-ip:9100 ----+ +``` + +## End user: create CT + +```bash +export GITEA_URL="https://gitea.example.com" +export GITEA_OWNER="org" +export GITEA_REPO="myoffice-public" # optional, default +export RELEASE_TAG="latest" # or v1.2.3 +export REPO_RAW_BASE="${GITEA_URL}/${GITEA_OWNER}/${GITEA_REPO}/raw/branch/main" + +bash -c "$(curl -fsSL ${REPO_RAW_BASE}/proxmox/myoffice.sh)" +``` + +Or copy `proxmox/` to the host and run `bash myoffice.sh` with the same env vars. + +Whiptail: Default / Advanced (Public URL, release tag) → creates CT → installs Postgres + ASP.NET runtime → downloads release → configures FrontEnd/CORS + local Postgres → systemd. + +## Maintainer: publish a release + +On the private repo (build PC): + +```powershell +$env:GITEA_TOKEN = '' + +.\proxmox\publish.ps1 -Tar +.\proxmox\release.ps1 -GiteaUrl https://gitea.example.com -Owner org -Repo myoffice-public -Tag v1.2.3 +.\proxmox\sync-public.ps1 -GiteaUrl https://gitea.example.com -Owner org -Repo myoffice-public -Push +``` + +- `proxmox/publish.ps1` → `_Published/` + `myoffice-publish.tar.gz` +- `proxmox/release.ps1` → Gitea Release asset +- `proxmox/sync-public.ps1` → push allowlisted files to public repo (scripts users curl) + +Or via Gitea Actions on the private repo (`.gitea/workflows/publish.yml`): push `master` → tag `latest`, or push tag `v*` / manual dispatch. + +Lab-only SSH deploy (no Gitea): `.\proxmox\deploy.ps1 -TargetHost ` + +## What runs inside the CT + +| Service | How | Port | +|---------|-----|------| +| PostgreSQL | apt + systemd | `127.0.0.1:5432` | +| MyOffice API + SPA | `dotnet` via `myoffice-api.service` | **9100** | + +```text +/opt/myoffice/api # extracted release (API + wwwroot) +/opt/myoffice/proxmox # install/update helpers + env +``` + +Config chain: + +- **Front → API:** same-origin SPA (`environment.proxmox.ts`) +- **API → Postgres:** CT `appsettings.shared.Production.json` +- **Browser → app:** nginx → `http://:9100` + +## Proxy (your nginx LXC) + +```nginx +location / { + proxy_pass http://:9100; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; +} +``` + +In Advanced install, set **Public URL** to the browser URL so CORS / `FrontEnd:Host` match. + +## Update later + +```bash +pct enter +/opt/myoffice/proxmox/update.sh # re-download RELEASE_TAG + restart +/opt/myoffice/proxmox/update.sh logs +/opt/myoffice/proxmox/update.sh status +``` + +Release settings are stored in `/opt/myoffice/proxmox/env`. + +## Gitea ops checklist + +- Create private `myoffice` and public `myoffice-public` +- Raise release attachment size limit if needed +- Token for maintainers: `write:repository` on public repo +- TLS (or trust custom CA) so Proxmox/`curl` can download +- Private repo secret `PUBLIC_TOKEN` for Actions (`.gitea/workflows/publish.yml`) + +## Gitea runner caching + +Three layers (independent): + +| Layer | What | How | +|-------|------|-----| +| Toolcache | .NET SDK / Node binaries | `setup-dotnet` / `setup-node` write to `/opt/hostedtoolcache`. Persist it on the **act_runner** host so the next job reuses downloads (steps still run, but skip re-download — you already saw `Found in cache @ /opt/hostedtoolcache/...`). | +| Actions cache | NuGet + npm packages | Workflow uses `actions/cache@v4` for `~/.nuget/packages` and `~/.npm`. Needs the runner cache server (default on act_runner). | +| Skip setup | No setup steps at all | Bake SDK + Node into the job Docker image (or host runner), then set job env `SKIP_SETUP_DOTNET=true` and `SKIP_SETUP_NODE=true`. | + +Example act_runner volume (compose): + +```yaml +volumes: + - /var/run/docker.sock:/var/run/docker.sock + - act-toolcache:/opt/hostedtoolcache # persist SDK/Node between jobs +``` + +If jobs use ephemeral containers without that volume, SDKs download every run. + +- Debian 12 LXC, unprivileged, `--onboot 1` +- 2 vCPU / 4096 MiB / 20G / `vmbr0` / DHCP +- Listen `:9100` + +## Demo logins + +- App: `user_UAH@user_UAH.userUAH` / `user_UAH` (also USD, EUR) +- Postgres: user/db/password `myoffice` diff --git a/proxmox/deploy.ps1 b/proxmox/deploy.ps1 new file mode 100644 index 0000000..f449299 --- /dev/null +++ b/proxmox/deploy.ps1 @@ -0,0 +1,138 @@ +# Deploy prebuilt MyOffice artifacts to a Proxmox CT (or any Linux host). +# Usage: +# .\proxmox\publish.ps1 +# .\proxmox\deploy.ps1 -TargetHost 192.168.1.120 +# .\proxmox\deploy.ps1 -TargetHost 192.168.1.120 -User root -RemotePath /opt/myoffice/api +# +# Requires OpenSSH client (ssh/scp). Prefers rsync if available (Git Bash / WSL / cwRsync). +# Preserves CT-owned appsettings.Production.json / appsettings.shared.Production.json. + +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)] + [Alias('ComputerName', 'Host')] + [string]$TargetHost, + + [string]$User = 'root', + + [Alias('Path')] + [string]$RemotePath = '/opt/myoffice/api', + + [string]$Service = 'myoffice-api', + + [string]$PublishDir = '', + + [int]$Port = 22 +) + +$ErrorActionPreference = 'Stop' + +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$repoRoot = Resolve-Path (Join-Path $scriptDir '..') + +if (-not $PublishDir) { + $PublishDir = Join-Path $repoRoot '_Published' +} +if (-not (Test-Path $PublishDir)) { + throw "Publish folder not found: $PublishDir — run .\proxmox\publish.ps1 first." +} +if (-not (Test-Path (Join-Path $PublishDir 'MyOffice.Web.dll'))) { + throw "MyOffice.Web.dll missing in $PublishDir — run .\proxmox\publish.ps1 first." +} + +$ctOwnedSettings = @( + 'appsettings.Production.json', + 'appsettings.shared.Production.json' +) + +$remote = "${User}@${TargetHost}" +$sshTarget = @('-p', "$Port", $remote) +$scpTarget = @('-P', "$Port") + +function Invoke-Remote { + param([Parameter(Mandatory = $true)][string]$Command) + & ssh @sshTarget $Command + if ($LASTEXITCODE -ne 0) { + throw "ssh failed (exit $LASTEXITCODE): $Command" + } +} + +function Test-Rsync { + return [bool](Get-Command rsync -ErrorAction SilentlyContinue) +} + +function ConvertTo-RsyncPath([string]$WindowsPath) { + $p = ($WindowsPath.TrimEnd('\', '/') + '/') -replace '\\', '/' + if ($p -match '^[A-Za-z]:') { + $drive = $p.Substring(0, 1).ToLower() + $p = "/$drive" + $p.Substring(2) + } + return $p +} + +Write-Host "-----------------------------------------------" +Write-Host "Deploy $PublishDir -> ${remote}:${RemotePath}" +Write-Host "-----------------------------------------------" + +Write-Host "Stopping $Service..." +Invoke-Remote "systemctl stop $Service || true" + +Invoke-Remote "mkdir -p '$RemotePath'" + +$rsync = Test-Rsync +if ($rsync) { + Write-Host "Copying with rsync (preserve CT Production appsettings)..." + $rsyncSrc = ConvertTo-RsyncPath $PublishDir + $rsyncArgs = @( + '-r', '--info=progress2', + '--exclude', 'appsettings.Production.json', + '--exclude', 'appsettings.shared.Production.json', + '-e', "ssh -p $Port", + $rsyncSrc, + "${remote}:${RemotePath}/" + ) + & rsync @rsyncArgs + if ($LASTEXITCODE -ne 0) { + throw "rsync failed with exit code $LASTEXITCODE" + } +} +else { + Write-Host "rsync not found — using tar+scp fallback..." + $staging = Join-Path $env:TEMP ("myoffice-deploy-" + [guid]::NewGuid().ToString('N')) + New-Item -ItemType Directory -Path $staging | Out-Null + try { + Get-ChildItem -Path $PublishDir -Force | Where-Object { + $_.Name -notin $ctOwnedSettings + } | ForEach-Object { + Copy-Item $_.FullName -Destination $staging -Recurse -Force + } + + $tarLocal = Join-Path $env:TEMP 'myoffice-deploy.tar.gz' + if (Test-Path $tarLocal) { Remove-Item -Force $tarLocal } + Push-Location $staging + try { + tar -czf $tarLocal * + if ($LASTEXITCODE -ne 0) { throw "tar create failed" } + } + finally { + Pop-Location + } + + & scp @scpTarget $tarLocal "${remote}:/tmp/myoffice-deploy.tar.gz" + if ($LASTEXITCODE -ne 0) { throw "scp failed" } + + Invoke-Remote "tar -xzf /tmp/myoffice-deploy.tar.gz -C '$RemotePath' && rm -f /tmp/myoffice-deploy.tar.gz" + } + finally { + Remove-Item -Recurse -Force $staging -ErrorAction SilentlyContinue + Remove-Item -Force (Join-Path $env:TEMP 'myoffice-deploy.tar.gz') -ErrorAction SilentlyContinue + } +} + +Write-Host "Starting $Service..." +Invoke-Remote "systemctl start $Service" +Invoke-Remote "systemctl --no-pager --full status $Service || true" + +Write-Host "" +Write-Host "Deployed to http://${TargetHost}:9100 (or your nginx public URL)" +Write-Host "" diff --git a/proxmox/fetch-release.sh b/proxmox/fetch-release.sh new file mode 100644 index 0000000..9d6ce5f --- /dev/null +++ b/proxmox/fetch-release.sh @@ -0,0 +1,137 @@ +#!/usr/bin/env bash +# Download myoffice-publish.tar.gz from a Gitea release into API_DIR. +# Env: +# GITEA_URL, GITEA_OWNER, GITEA_REPO, RELEASE_TAG (latest|v1.2.3) +# API_DIR (default /opt/myoffice/api) +# RELEASE_ASSET_URL — optional direct override (skips API resolve) +# GITEA_TOKEN — optional for private release downloads + +set -euo pipefail + +API_DIR="${API_DIR:-/opt/myoffice/api}" +GITEA_URL="${GITEA_URL:-}" +GITEA_OWNER="${GITEA_OWNER:-}" +GITEA_REPO="${GITEA_REPO:-myoffice-public}" +RELEASE_TAG="${RELEASE_TAG:-latest}" +RELEASE_ASSET_URL="${RELEASE_ASSET_URL:-}" +ASSET_NAME="${ASSET_NAME:-myoffice-publish.tar.gz}" +GITEA_TOKEN="${GITEA_TOKEN:-}" + +msg() { echo -e " ==> $*"; } + +curl_auth() { + if [[ -n "$GITEA_TOKEN" ]]; then + curl -fsSL -H "Authorization: token ${GITEA_TOKEN}" "$@" + else + curl -fsSL "$@" + fi +} + +json_first_string() { + # Extract first "key":"value" for key=$1 from JSON on stdin (no jq/python required). + local key="$1" + tr -d '\n' | sed -n "s/.*\"${key}\"[[:space:]]*:[[:space:]]*\"\([^\"]*\)\".*/\1/p" | head -1 +} + +resolve_asset_url() { + if [[ -n "$RELEASE_ASSET_URL" ]]; then + echo "$RELEASE_ASSET_URL" + return 0 + fi + + if [[ -z "$GITEA_URL" || -z "$GITEA_OWNER" ]]; then + echo "Set GITEA_URL + GITEA_OWNER (and GITEA_REPO), or RELEASE_ASSET_URL." >&2 + exit 1 + fi + + local base api_json tag browser_url + base="${GITEA_URL%/}" + + if [[ "$RELEASE_TAG" == "latest" ]]; then + api_json=$(curl_auth "${base}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/releases/latest") + tag=$(printf '%s' "$api_json" | json_first_string tag_name) + if [[ -z "$tag" ]]; then + echo "Could not resolve latest release tag from Gitea API." >&2 + exit 1 + fi + else + tag="$RELEASE_TAG" + api_json=$(curl_auth "${base}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/releases/tags/${tag}" || true) + fi + + # Prefer browser_download_url that ends with the asset name + browser_url=$(printf '%s' "${api_json:-}" | tr '"' '\n' | grep -F "/${ASSET_NAME}" | grep -E '^https?://' | head -1 || true) + + if [[ -z "$browser_url" ]]; then + browser_url="${base}/${GITEA_OWNER}/${GITEA_REPO}/releases/download/${tag}/${ASSET_NAME}" + fi + + echo "$browser_url" +} + +download_and_extract() { + local url tar_path staging + url=$(resolve_asset_url) + msg "Downloading release asset: $url" + + mkdir -p "$API_DIR" + tar_path="/tmp/${ASSET_NAME}" + curl_auth -o "$tar_path" "$url" + + staging=$(mktemp -d /tmp/myoffice-extract.XXXXXX) + tar -xzf "$tar_path" -C "$staging" + rm -f "$tar_path" + + local prod="${API_DIR}/appsettings.Production.json" + local shared_prod="${API_DIR}/appsettings.shared.Production.json" + local prod_bak="" shared_bak="" + if [[ -f "$prod" ]]; then + prod_bak=$(mktemp) + cp -a "$prod" "$prod_bak" + fi + if [[ -f "$shared_prod" ]]; then + shared_bak=$(mktemp) + cp -a "$shared_prod" "$shared_bak" + fi + + local top_count top_dir + top_count=$(find "$staging" -mindepth 1 -maxdepth 1 | wc -l) + top_dir="" + if [[ "$top_count" -eq 1 ]]; then + local only + only=$(find "$staging" -mindepth 1 -maxdepth 1 | head -1) + if [[ -d "$only" ]]; then + top_dir="$only" + fi + fi + + find "$API_DIR" -mindepth 1 -maxdepth 1 \ + ! -name 'appsettings.Production.json' \ + ! -name 'appsettings.shared.Production.json' \ + -exec rm -rf {} + + + if [[ -n "$top_dir" ]]; then + cp -a "$top_dir"/. "$API_DIR"/ + else + cp -a "$staging"/. "$API_DIR"/ + fi + rm -rf "$staging" + + rm -f "$API_DIR/appsettings.Production.json" "$API_DIR/appsettings.shared.Production.json" 2>/dev/null || true + if [[ -n "$prod_bak" ]]; then + mv "$prod_bak" "$prod" + fi + if [[ -n "$shared_bak" ]]; then + mv "$shared_bak" "$shared_prod" + fi + + if [[ ! -f "${API_DIR}/MyOffice.Web.dll" ]]; then + echo "Extracted archive but MyOffice.Web.dll is missing in ${API_DIR}" >&2 + exit 1 + fi + msg "App extracted to ${API_DIR}" +} + +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + download_and_extract +fi diff --git a/proxmox/install-in-ct.sh b/proxmox/install-in-ct.sh new file mode 100644 index 0000000..47a352b --- /dev/null +++ b/proxmox/install-in-ct.sh @@ -0,0 +1,194 @@ +#!/usr/bin/env bash +# Runs inside the MyOffice LXC: PostgreSQL + ASP.NET Core runtime + app from Gitea Release. +# No Docker, no nginx, no git, no SDK, no Node. +# +# Env (from proxmox/myoffice.sh): +# APP_DIR, PUBLIC_URL, API_PORT, ASSETS_DIR +# GITEA_URL, GITEA_OWNER, GITEA_REPO, RELEASE_TAG, RELEASE_ASSET_URL, GITEA_TOKEN + +set -euo pipefail + +APP_DIR="${APP_DIR:-/opt/myoffice}" +API_DIR="${APP_DIR}/api" +ASSETS_DIR="${ASSETS_DIR:-/tmp/myoffice-proxmox}" +PUBLIC_URL="${PUBLIC_URL:-}" +API_PORT="${API_PORT:-9100}" +PG_DB="myoffice" +PG_USER="myoffice" +PG_PASS="myoffice" +SKIP_FETCH="${SKIP_FETCH:-0}" + +export DEBIAN_FRONTEND=noninteractive +export API_DIR + +msg() { echo -e " ==> $*"; } + +detect_public_url() { + if [[ -n "$PUBLIC_URL" ]]; then + PUBLIC_URL=$(echo "$PUBLIC_URL" | sed 's:/*$::') + return 0 + fi + local ip + ip=$(ip -4 -o addr show eth0 2>/dev/null | awk '{print $4}' | cut -d/ -f1 | head -1 || true) + if [[ -z "$ip" ]]; then + ip=$(hostname -I 2>/dev/null | awk '{print $1}') + fi + if [[ -z "$ip" ]]; then + echo "Could not detect CT IP. Set PUBLIC_URL." >&2 + exit 1 + fi + PUBLIC_URL="http://${ip}:${API_PORT}" +} + +install_base() { + msg "Installing base packages" + apt-get update -y + apt-get install -y ca-certificates curl gnupg postgresql postgresql-contrib +} + +install_aspnet_runtime() { + if command -v dotnet >/dev/null 2>&1 && dotnet --list-runtimes 2>/dev/null | grep -q 'Microsoft.AspNetCore.App 10\.'; then + msg "ASP.NET Core 10 runtime already installed" + return 0 + fi + msg "Installing ASP.NET Core 10 runtime" + curl -fsSL https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -o /tmp/packages-microsoft-prod.deb + dpkg -i /tmp/packages-microsoft-prod.deb + apt-get update -y + apt-get install -y aspnetcore-runtime-10.0 +} + +setup_postgres() { + msg "Configuring PostgreSQL" + systemctl enable --now postgresql + if ! sudo -u postgres psql -tAc "SELECT 1 FROM pg_roles WHERE rolname='${PG_USER}'" | grep -q 1; then + sudo -u postgres psql -c "CREATE USER ${PG_USER} WITH PASSWORD '${PG_PASS}';" + else + sudo -u postgres psql -c "ALTER USER ${PG_USER} WITH PASSWORD '${PG_PASS}';" + fi + if ! sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname='${PG_DB}'" | grep -q 1; then + sudo -u postgres psql -c "CREATE DATABASE ${PG_DB} OWNER ${PG_USER};" + fi + sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE ${PG_DB} TO ${PG_USER};" + sudo -u postgres psql -d "$PG_DB" -c "GRANT ALL ON SCHEMA public TO ${PG_USER};" || true + msg "PostgreSQL ready (db/user/pass=${PG_DB})" +} + +write_runtime_config() { + mkdir -p "$API_DIR" + if [[ ! -f "$API_DIR/appsettings.Production.json" ]]; then + cat >"$API_DIR/appsettings.Production.json" <"$API_DIR/appsettings.shared.Production.json" <&2 + exit 1 + fi + # shellcheck disable=SC1090 + source "$fetch_script" + download_and_extract +} + +install_systemd() { + msg "Configuring systemd unit myoffice-api" + local unit_src="${ASSETS_DIR}/myoffice-api.service" + if [[ ! -f "$unit_src" ]]; then + unit_src="${APP_DIR}/proxmox/myoffice-api.service" + fi + if [[ ! -f "$unit_src" ]]; then + echo "Missing myoffice-api.service" >&2 + exit 1 + fi + sed -e "s|__API_DIR__|${API_DIR}|g" -e "s|__API_PORT__|${API_PORT}|g" \ + "$unit_src" >/etc/systemd/system/myoffice-api.service + + mkdir -p "${APP_DIR}/proxmox" + if [[ -d "$ASSETS_DIR" ]]; then + cp -a "${ASSETS_DIR}/." "${APP_DIR}/proxmox/" + fi + chmod +x "${APP_DIR}/proxmox/"*.sh 2>/dev/null || true + + cat >"${APP_DIR}/proxmox/env" </dev/null || true + msg "App DLL missing — service not started" + fi +} + +print_done() { + echo + echo " MyOffice CT is ready:" + echo " Public URL ${PUBLIC_URL}" + echo " Listen 0.0.0.0:${API_PORT} (proxy this from your nginx LXC)" + echo " Postgres 127.0.0.1:5432 db/user/pass=${PG_DB}" + echo " App dir ${API_DIR}" + echo + echo " Update later: ${APP_DIR}/proxmox/update.sh" + echo " Demo login: user_UAH@user_UAH.userUAH / user_UAH" + echo +} + +detect_public_url +install_base +install_aspnet_runtime +setup_postgres +write_runtime_config +fetch_app +install_systemd +print_done diff --git a/proxmox/myoffice-api.service b/proxmox/myoffice-api.service new file mode 100644 index 0000000..047b732 --- /dev/null +++ b/proxmox/myoffice-api.service @@ -0,0 +1,19 @@ +[Unit] +Description=MyOffice ASP.NET Core (API + SPA) +After=network.target postgresql.service +Wants=postgresql.service + +[Service] +WorkingDirectory=__API_DIR__ +ExecStart=/usr/bin/dotnet __API_DIR__/MyOffice.Web.dll +Restart=always +RestartSec=5 +KillSignal=SIGINT +SyslogIdentifier=myoffice-api +User=root +Environment=ASPNETCORE_ENVIRONMENT=Production +Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false +Environment=ASPNETCORE_URLS=http://*:__API_PORT__ + +[Install] +WantedBy=multi-user.target diff --git a/proxmox/myoffice.sh b/proxmox/myoffice.sh new file mode 100644 index 0000000..1ad48e6 --- /dev/null +++ b/proxmox/myoffice.sh @@ -0,0 +1,490 @@ +#!/usr/bin/env bash +# MyOffice Proxmox LXC installer (community-scripts style). +# Run on the Proxmox host (public Gitea repo raw URL): +# export GITEA_URL="https://gitea.example.com" +# export GITEA_OWNER="org" +# export GITEA_REPO="myoffice-public" +# export REPO_RAW_BASE="${GITEA_URL}/${GITEA_OWNER}/${GITEA_REPO}/raw/branch/main" +# bash -c "$(curl -fsSL ${REPO_RAW_BASE}/proxmox/myoffice.sh)" +# +# Creates one LXC with PostgreSQL + ASP.NET runtime + app from Gitea Release. +# No Docker, no nginx, no git/SDK/Node in the CT (use your existing proxy LXC in front). + +set -euo pipefail + +GITEA_URL="${GITEA_URL:-}" +GITEA_OWNER="${GITEA_OWNER:-}" +GITEA_REPO="${GITEA_REPO:-myoffice-public}" +RELEASE_TAG="${RELEASE_TAG:-latest}" +RELEASE_ASSET_URL="${RELEASE_ASSET_URL:-}" +GITEA_TOKEN="${GITEA_TOKEN:-}" + +if [[ -z "${REPO_RAW_BASE:-}" ]]; then + if [[ -n "$GITEA_URL" && -n "$GITEA_OWNER" ]]; then + REPO_RAW_BASE="${GITEA_URL%/}/${GITEA_OWNER}/${GITEA_REPO}/raw/branch/main" + else + REPO_RAW_BASE="https://gitea.example.com/OWNER/myoffice-public/raw/branch/main" + fi +fi + +# Derive GITEA_* from REPO_RAW_BASE when only raw base is set: +# https://host/owner/repo/raw/branch/main +if [[ -z "$GITEA_URL" || -z "$GITEA_OWNER" ]]; then + if [[ "$REPO_RAW_BASE" =~ ^(https?://[^/]+)/([^/]+)/([^/]+)/raw/ ]]; then + [[ -z "$GITEA_URL" ]] && GITEA_URL="${BASH_REMATCH[1]}" + [[ -z "$GITEA_OWNER" ]] && GITEA_OWNER="${BASH_REMATCH[2]}" + [[ "$GITEA_REPO" == "myoffice-public" ]] && GITEA_REPO="${BASH_REMATCH[3]}" + fi +fi + +APP="MyOffice" +APP_DIR="/opt/myoffice" + +YW=$'\033[33m' +BL=$'\033[36m' +RD=$'\033[01;31m' +BGN=$'\033[4;92m' +GN=$'\033[1;92m' +DGN=$'\033[32m' +CL=$'\033[m' +BOLD=$'\033[1m' +BFR=$'\r\033[K' +TAB=$' ' + +CM="${TAB}✔️${TAB}${CL}" +CROSS="${TAB}✖️${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}🖥️${TAB}${CL}" +CONTAINERTYPE="${TAB}📦${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}🛠️${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}⚙️${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + +header_info() { + clear + cat <<"EOF" + __ ___ ____ ____________ + / |/ /_ __/ __ \/ __/ __/ _/______ + / /|_/ / / / / / / / /_/ /_ / // ___/ _ \ + / / / / /_/ / /_/ / __/ __// // /__/ __/ +/_/ /_/\__, /\____/_/ /_/ /___/\___/\___/ + /____/ Proxmox LXC (Gitea release) +EOF +} + +msg_info() { echo -ne "${TAB}${YW}${1}${CL}"; } +msg_ok() { echo -e "${BFR}${CM}${GN}${1}${CL}"; } +msg_error() { echo -e "${BFR}${CROSS}${RD}${1}${CL}"; } + +error_handler() { + local exit_code=$? + local line_number=$1 + local command=$2 + echo -e "\n${RD}[ERROR]${CL} line ${RD}${line_number}${CL}: exit ${RD}${exit_code}${CL}: ${YW}${command}${CL}\n" + if [[ -n "${CTID:-}" ]] && pct status "$CTID" &>/dev/null; then + echo -e "${INFO}CT ${CTID} exists; destroy with: pct stop ${CTID}; pct destroy ${CTID}" + fi + exit "$exit_code" +} +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR + +exit_script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit 0 +} + +check_root() { + if [[ "$(id -u)" -ne 0 ]]; then + msg_error "Please run this script as root on the Proxmox host." + exit 1 + fi +} + +pve_check() { + if ! command -v pveversion >/dev/null 2>&1; then + msg_error "This script must run on a Proxmox VE host (pveversion not found)." + exit 1 + fi + if ! command -v whiptail >/dev/null 2>&1; then + msg_error "whiptail is required (apt install whiptail)." + exit 1 + fi +} + +arch_check() { + if [[ "$(dpkg --print-architecture)" != "amd64" ]]; then + msg_error "Only amd64 is supported." + exit 1 + fi +} + +get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [[ -f "/etc/pve/qemu-server/${try_id}.conf" ]] || [[ -f "/etc/pve/lxc/${try_id}.conf" ]]; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +select_storage() { + local STORAGE_MENU=() + local MSG_MAX_LENGTH=0 + local line TAG TYPE FREE ITEM OFFSET VALID + while read -r line; do + TAG=$(echo "$line" | awk '{print $1}') + TYPE=$(echo "$line" | awk '{printf "%-10s", $2}') + FREE=$(echo "$line" | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f 2>/dev/null | awk '{printf("%9sB", $6)}' || echo "?") + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + OFFSET)) -gt ${MSG_MAX_LENGTH:-0} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") + done < <(pvesm status -content rootdir | awk 'NR>1') + + VALID=$(pvesm status -content rootdir | awk 'NR>1') + if [[ -z "$VALID" ]]; then + msg_error "Unable to detect a valid storage location (rootdir)." + exit 1 + elif [[ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]]; then + STORAGE=${STORAGE_MENU[0]} + else + while [[ -z "${STORAGE:+x}" ]]; do + STORAGE=$(whiptail --backtitle "MyOffice Proxmox" --title "Storage Pools" --radiolist \ + "Which storage pool for ${HN}?\n(Spacebar to select)\n" \ + 16 $((MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit_script + done + fi + msg_ok "Using ${CL}${BL}${STORAGE}${CL}${GN} for storage." +} + +default_settings() { + CTID=$(get_valid_nextid) + HN="myoffice" + CORE_COUNT="2" + RAM_SIZE="4096" + DISK_SIZE="20" + BRG="vmbr0" + NET="dhcp" + GATEWAY_IP="" + API_PORT="9100" + PUBLIC_URL="" # filled after CT IP known + START_CT="yes" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}${CTID}${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}OS: ${BGN}Debian 12${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM: ${BGN}${RAM_SIZE} MiB${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk: ${BGN}${DISK_SIZE}G${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}IP: ${BGN}DHCP${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}API listen: ${BGN}:${API_PORT}${CL} (SPA from release wwwroot)" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Stack: ${BGN}PostgreSQL + ASP.NET + Gitea release${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating MyOffice LXC with default settings${CL}" +} + +advanced_settings() { + METHOD="advanced" + [[ -z "${CTID:-}" ]] && CTID=$(get_valid_nextid) + + while true; do + if CTID=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Set Container ID" 8 58 "$CTID" --title "CONTAINER ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + [[ -z "$CTID" ]] && CTID=$(get_valid_nextid) + if pct status "$CTID" &>/dev/null || qm status "$CTID" &>/dev/null; then + echo -e "${CROSS}${RD}ID $CTID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}${CTID}${CL}" + break + else + exit_script + fi + done + + if HN_IN=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Set Hostname" 8 58 myoffice --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + HN=$(echo "${HN_IN:-myoffice}" | tr '[:upper:]' '[:lower:]' | tr -cs 'a-z0-9-' '-' | sed 's/^-//;s/-$//' || true) + [[ -z "$HN" ]] && HN="myoffice" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + else + exit_script + fi + + while true; do + if CORE_COUNT=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + [[ -z "$CORE_COUNT" ]] && CORE_COUNT="2" + if [[ "$CORE_COUNT" =~ ^[1-9][0-9]*$ ]]; then + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + break + fi + whiptail --backtitle "MyOffice Proxmox" --title "INVALID" --msgbox "CPU cores must be a positive integer." 8 58 + else + exit_script + fi + done + + while true; do + if RAM_SIZE=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Allocate RAM in MiB" 8 58 4096 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + [[ -z "$RAM_SIZE" ]] && RAM_SIZE="4096" + if [[ "$RAM_SIZE" =~ ^[1-9][0-9]*$ ]]; then + echo -e "${RAMSIZE}${BOLD}${DGN}RAM: ${BGN}${RAM_SIZE} MiB${CL}" + break + fi + whiptail --backtitle "MyOffice Proxmox" --title "INVALID" --msgbox "RAM must be a positive integer (MiB)." 8 58 + else + exit_script + fi + done + + while true; do + if DISK_SIZE=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Disk size in GiB" 8 58 20 --title "DISK" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "${DISK_SIZE:-20}" | tr -d ' Gg') + if [[ "$DISK_SIZE" =~ ^[1-9][0-9]*$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk: ${BGN}${DISK_SIZE}G${CL}" + break + fi + whiptail --backtitle "MyOffice Proxmox" --title "INVALID" --msgbox "Disk must be a positive integer (GiB)." 8 58 + else + exit_script + fi + done + + if BRG=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + [[ -z "$BRG" ]] && BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + else + exit_script + fi + + if whiptail --backtitle "MyOffice Proxmox" --title "NETWORK" --yesno "Use DHCP?" --yes-button DHCP --no-button Static 10 58; then + NET="dhcp" + GATEWAY_IP="" + echo -e "${GATEWAY}${BOLD}${DGN}IP: ${BGN}DHCP${CL}" + else + if NET=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Static IP CIDR (e.g. 192.168.1.120/24)" 8 58 --title "IP ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + : + else + exit_script + fi + if GATEWAY_IP=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Gateway (e.g. 192.168.1.1)" 8 58 --title "GATEWAY" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + : + else + exit_script + fi + echo -e "${GATEWAY}${BOLD}${DGN}IP: ${BGN}${NET} gw ${GATEWAY_IP}${CL}" + fi + + if API_PORT=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Kestrel listen port" 8 58 9100 --title "API PORT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + [[ -z "$API_PORT" ]] && API_PORT="9100" + else + exit_script + fi + echo -e "${DEFAULT}${BOLD}${DGN}API listen: ${BGN}:${API_PORT}${CL}" + + if PUBLIC_URL=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Browser public URL (empty = http://CT_IP:PORT). Use your nginx proxy URL if any." 10 70 "" --title "PUBLIC URL" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + PUBLIC_URL=$(echo "$PUBLIC_URL" | sed 's:/*$::') + else + exit_script + fi + + if RELEASE_TAG=$(whiptail --backtitle "MyOffice Proxmox" --inputbox "Gitea release tag (latest or v1.2.3)" 8 58 "${RELEASE_TAG}" --title "RELEASE TAG" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + [[ -z "$RELEASE_TAG" ]] && RELEASE_TAG="latest" + else + exit_script + fi + echo -e "${DEFAULT}${BOLD}${DGN}Release: ${BGN}${RELEASE_TAG}${CL}" + + if whiptail --backtitle "MyOffice Proxmox" --title "START CONTAINER" --yesno "Start CT when created?" 10 58; then + START_CT="yes" + else + START_CT="no" + fi + + if whiptail --backtitle "MyOffice Proxmox" --title "ADVANCED SETTINGS" --yesno "Ready to create MyOffice LXC?" --no-button Do-Over 10 58; then + echo -e "${CREATING}${BOLD}${DGN}Creating MyOffice LXC with advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +start_script() { + if whiptail --backtitle "MyOffice Proxmox" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58; then + header_info + echo -e "${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +ensure_template() { + local template="debian-12-standard" + local store="local" + msg_info "Ensuring Debian 12 LXC template..." + if ! pveam list "$store" 2>/dev/null | grep -q "$template"; then + pveam update >/dev/null + local remote + remote=$(pveam available -section system | awk '/debian-12-standard/ {print $2; exit}') + if [[ -z "$remote" ]]; then + msg_error "Could not find debian-12-standard template in pveam available." + exit 1 + fi + pveam download "$store" "$remote" + fi + TEMPLATE_REF=$(pveam list "$store" | awk '/debian-12-standard/ {print $1; exit}') + if [[ -z "${TEMPLATE_REF:-}" ]]; then + msg_error "Debian 12 template not found after download." + exit 1 + fi + msg_ok "Template ${CL}${BL}${TEMPLATE_REF}${CL}" +} + +create_container() { + local net_cfg + if [[ "$NET" == "dhcp" ]]; then + net_cfg="name=eth0,bridge=${BRG},ip=dhcp" + else + net_cfg="name=eth0,bridge=${BRG},ip=${NET},gw=${GATEWAY_IP}" + fi + + msg_info "Creating LXC ${CTID} (${HN})..." + pct create "$CTID" "$TEMPLATE_REF" \ + --hostname "$HN" \ + --cores "$CORE_COUNT" \ + --memory "$RAM_SIZE" \ + --swap 512 \ + --rootfs "${STORAGE}:${DISK_SIZE}" \ + --net0 "$net_cfg" \ + --unprivileged 1 \ + --ostype debian \ + --onboot 1 \ + --timezone host \ + --tags "myoffice" \ + --description "MyOffice: PostgreSQL + ASP.NET Core from Gitea release. Proxy via external nginx LXC." + msg_ok "Created CT ${CL}${BL}${CTID}${CL}" + + if [[ "$START_CT" == "yes" ]]; then + msg_info "Starting CT ${CTID}..." + pct start "$CTID" + msg_ok "Started CT ${CTID}" + else + msg_error "CT created but not started (Start=no). Start with: pct start ${CTID}" + exit 0 + fi +} + +wait_for_network() { + msg_info "Waiting for CT network..." + local i ip + for i in $(seq 1 60); do + ip=$(pct exec "$CTID" -- bash -c "ip -4 -o addr show eth0 2>/dev/null | awk '{print \$4}' | cut -d/ -f1 | head -1" 2>/dev/null || true) + if [[ -n "$ip" ]]; then + CT_IP="$ip" + msg_ok "CT IP ${CL}${BL}${CT_IP}${CL}" + return 0 + fi + sleep 2 + done + msg_error "Timed out waiting for CT IP." + exit 1 +} + +resolve_script_dir() { + if [[ -n "${BASH_SOURCE[0]:-}" && -f "${BASH_SOURCE[0]}" ]]; then + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + else + SCRIPT_DIR="" + fi +} + +push_install_assets() { + local dest_dir="/tmp/myoffice-proxmox" + pct exec "$CTID" -- mkdir -p "$dest_dir" + + if [[ -n "${SCRIPT_DIR}" && -f "${SCRIPT_DIR}/install-in-ct.sh" ]]; then + for f in install-in-ct.sh fetch-release.sh myoffice-api.service update.sh; do + pct push "$CTID" "${SCRIPT_DIR}/${f}" "${dest_dir}/${f}" + done + else + msg_info "Downloading install assets from REPO_RAW_BASE..." + for f in install-in-ct.sh fetch-release.sh myoffice-api.service update.sh; do + curl -fsSL "${REPO_RAW_BASE}/proxmox/${f}" -o "/tmp/${f}" + pct push "$CTID" "/tmp/${f}" "${dest_dir}/${f}" + done + msg_ok "Downloaded install assets" + fi + pct exec "$CTID" -- chmod +x "${dest_dir}/install-in-ct.sh" "${dest_dir}/fetch-release.sh" "${dest_dir}/update.sh" +} + +run_ct_install() { + if [[ -z "${PUBLIC_URL}" ]]; then + PUBLIC_URL="http://${CT_IP}:${API_PORT}" + fi + if [[ -z "${GITEA_URL}" || -z "${GITEA_OWNER}" ]] && [[ -z "${RELEASE_ASSET_URL}" ]]; then + msg_error "Set GITEA_URL + GITEA_OWNER (and GITEA_REPO), or RELEASE_ASSET_URL, before install." + exit 1 + fi + msg_info "Installing PostgreSQL + ASP.NET runtime + Gitea release..." + pct exec "$CTID" -- env \ + REPO_RAW_BASE="$REPO_RAW_BASE" \ + APP_DIR="$APP_DIR" \ + PUBLIC_URL="$PUBLIC_URL" \ + API_PORT="$API_PORT" \ + ASSETS_DIR="/tmp/myoffice-proxmox" \ + GITEA_URL="$GITEA_URL" \ + GITEA_OWNER="$GITEA_OWNER" \ + GITEA_REPO="$GITEA_REPO" \ + RELEASE_TAG="$RELEASE_TAG" \ + RELEASE_ASSET_URL="$RELEASE_ASSET_URL" \ + GITEA_TOKEN="$GITEA_TOKEN" \ + bash /tmp/myoffice-proxmox/install-in-ct.sh + msg_ok "Stack installed" +} + +# --- main --- +header_info +echo -e "\n Loading..." +check_root +arch_check +pve_check + +if ! whiptail --backtitle "MyOffice Proxmox" --title "MyOffice LXC" --yesno \ + "This will create a new LXC with:\n\n • PostgreSQL\n • ASP.NET Core runtime\n • App from Gitea Release\n\nNo Docker, no nginx (point your proxy LXC at :9100).\n\nProceed?" 16 58; then + exit_script +fi + +start_script +select_storage +ensure_template +resolve_script_dir +create_container +wait_for_network +push_install_assets +run_ct_install + +echo -e "\n${GN}${BOLD}Completed successfully!${CL}\n" +echo -e "${INFO}${YW}Stack in CT ${CTID}:${CL} PostgreSQL + ASP.NET + release ${RELEASE_TAG}" +echo -e "${GATEWAY}${BGN}Public URL ${PUBLIC_URL}${CL}" +echo -e "${GATEWAY}${BGN}Upstream http://${CT_IP}:${API_PORT}${CL} (for your nginx proxy)" +echo -e "${INFO}Demo login: user_UAH@user_UAH.userUAH / user_UAH" +echo -e "${INFO}Update: pct enter ${CTID} then ${APP_DIR}/proxmox/update.sh" +echo diff --git a/proxmox/publish.ps1 b/proxmox/publish.ps1 new file mode 100644 index 0000000..ee4d98a --- /dev/null +++ b/proxmox/publish.ps1 @@ -0,0 +1,166 @@ +# Publish MyOffice API + SPA for Proxmox (artifacts only, no source). +# Usage (from repo root): +# .\proxmox\publish.ps1 +# .\proxmox\publish.ps1 -OutDir D:\builds\myoffice +# .\proxmox\publish.ps1 -Tar # also write myoffice-publish.tar.gz next to OutDir +# +# Before build: +# 1) copy appsettings.shared.json → Development + Production overlays (only if missing) +# 2) restore NuGet + npm +# +# Output: / with MyOffice.Web.dll + wwwroot/ (SPA, same-origin URLs) + +[CmdletBinding()] +param( + [string]$OutDir = '', + [switch]$Tar +) + +$ErrorActionPreference = 'Stop' + +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$repoRoot = Resolve-Path (Join-Path $scriptDir '..') +Set-Location $repoRoot + +if (-not $OutDir) { + $OutDir = Join-Path $repoRoot '_Published' +} +$OutDir = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($OutDir) + +$sharedDir = Join-Path $repoRoot 'MyOffice.Shared' +$sharedBase = Join-Path $sharedDir 'appsettings.shared.json' +if (-not (Test-Path $sharedBase)) { + throw "Missing $sharedBase" +} + +Write-Host "-----------------------------------------------" +Write-Host "Copy appsettings.shared.json -> Development + Production (if missing)" +Write-Host "-----------------------------------------------" +foreach ($name in @('appsettings.shared.Development.json', 'appsettings.shared.Production.json')) { + $dest = Join-Path $sharedDir $name + if (Test-Path $dest) { + Write-Host "Skip (exists): $name" + } + else { + Copy-Item $sharedBase $dest + Write-Host "Created: $name" + } +} + +Write-Host "-----------------------------------------------" +Write-Host "Restore NuGet packages" +Write-Host "-----------------------------------------------" +dotnet restore 'MyOffice.Web\MyOffice.Web.csproj' --nologo +if ($LASTEXITCODE -ne 0) { + throw "dotnet restore failed with exit code $LASTEXITCODE" +} + +$spaDir = Join-Path $repoRoot 'MyOffice.SPA' +$envSample = Join-Path $spaDir 'src\environments\environment.sample.ts' +$envLocal = Join-Path $spaDir 'src\environments\environment.ts' +if (-not (Test-Path $envLocal) -and (Test-Path $envSample)) { + Copy-Item $envSample $envLocal +} + +Write-Host "-----------------------------------------------" +Write-Host "Restore npm packages (MyOffice.SPA)" +Write-Host "-----------------------------------------------" +Push-Location $spaDir +try { + if (Test-Path (Join-Path $spaDir 'package-lock.json')) { + npm ci + } + else { + npm install + } + if ($LASTEXITCODE -ne 0) { + throw "npm restore failed with exit code $LASTEXITCODE" + } +} +finally { + Pop-Location +} + +Write-Host "-----------------------------------------------" +Write-Host "dotnet publish -> $OutDir" +Write-Host "-----------------------------------------------" + +if (Test-Path $OutDir) { + Remove-Item -Recurse -Force $OutDir +} +New-Item -ItemType Directory -Path $OutDir | Out-Null + +dotnet publish 'MyOffice.Web\MyOffice.Web.csproj' -c Release -o $OutDir --no-restore --nologo +if ($LASTEXITCODE -ne 0) { + throw "dotnet publish failed with exit code $LASTEXITCODE" +} + +# CT owns Production overlays — do not ship local env-specific appsettings. +# Keep appsettings.json + appsettings.shared.json (required at runtime). +Get-ChildItem -Path $OutDir -Filter 'appsettings*.json' -File -ErrorAction SilentlyContinue | + Where-Object { + $_.Name -notin @('appsettings.json', 'appsettings.shared.json') + } | + Remove-Item -Force + +Write-Host "-----------------------------------------------" +Write-Host "ng build (proxmox) -> $OutDir\wwwroot" +Write-Host "-----------------------------------------------" + +Push-Location $spaDir +try { + $spaOut = Join-Path $env:TEMP ("myoffice-spa-" + [guid]::NewGuid().ToString('N')) + + npx ng build --configuration proxmox --output-path $spaOut + if ($LASTEXITCODE -ne 0) { + throw "ng build failed with exit code $LASTEXITCODE" + } + + $wwwroot = Join-Path $OutDir 'wwwroot' + if (Test-Path $wwwroot) { + Remove-Item -Recurse -Force $wwwroot + } + New-Item -ItemType Directory -Path $wwwroot | Out-Null + + $browser = Join-Path $spaOut 'browser' + if (Test-Path $browser) { + Copy-Item -Path (Join-Path $browser '*') -Destination $wwwroot -Recurse -Force + } + else { + Copy-Item -Path (Join-Path $spaOut '*') -Destination $wwwroot -Recurse -Force + } + Remove-Item -Recurse -Force $spaOut -ErrorAction SilentlyContinue +} +finally { + Pop-Location +} + +if ($Tar) { + $tarPath = Join-Path (Split-Path -Parent $OutDir) 'myoffice-publish.tar.gz' + if (Test-Path $tarPath) { + Remove-Item -Force $tarPath + } + Write-Host "-----------------------------------------------" + Write-Host "tar -> $tarPath" + Write-Host "-----------------------------------------------" + # Windows 10+ tar; paths relative to OutDir parent + Push-Location (Split-Path -Parent $OutDir) + try { + $leaf = Split-Path -Leaf $OutDir + tar -czf $tarPath $leaf + if ($LASTEXITCODE -ne 0) { + throw "tar failed with exit code $LASTEXITCODE" + } + } + finally { + Pop-Location + } + Write-Host "Archive: $tarPath" +} + +Write-Host "" +Write-Host "Published to $OutDir" +Write-Host "Next (Gitea): .\proxmox\publish.ps1 -Tar ; .\proxmox\release.ps1 -GiteaUrl ... -Owner ... -Tag v1.2.3" +Write-Host "Linux/CI: ./proxmox/publish.sh --tar ; ./proxmox/release.sh ..." +Write-Host "Lab SSH: .\proxmox\deploy.ps1 -TargetHost " +Write-Host "" diff --git a/proxmox/publish.sh b/proxmox/publish.sh new file mode 100755 index 0000000..48fd84c --- /dev/null +++ b/proxmox/publish.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash +# Publish MyOffice API + SPA for Proxmox (artifacts only, no source). +# Usage (from repo root): +# ./proxmox/publish.sh +# ./proxmox/publish.sh --out-dir /tmp/myoffice-out +# ./proxmox/publish.sh --tar +# +# Output: / with MyOffice.Web.dll + wwwroot/ (SPA, same-origin URLs) + +set -euo pipefail + +script_dir="$(cd "$(dirname "$0")" && pwd)" +repo_root="$(cd "$script_dir/.." && pwd)" +cd "$repo_root" + +out_dir="${OUT_DIR:-_Published}" +do_tar=false + +while [[ $# -gt 0 ]]; do + case "$1" in + --tar | -Tar) + do_tar=true + shift + ;; + --out-dir) + out_dir="$2" + shift 2 + ;; + -h | --help) + echo "Usage: $0 [--tar] [--out-dir DIR]" + exit 0 + ;; + *) + echo "Unknown argument: $1" >&2 + exit 1 + ;; + esac +done + +# Resolve relative out_dir against repo root +if [[ "$out_dir" != /* ]]; then + out_dir="$repo_root/$out_dir" +fi + +shared_dir="$repo_root/MyOffice.Shared" +shared_base="$shared_dir/appsettings.shared.json" +if [[ ! -f "$shared_base" ]]; then + echo "Missing $shared_base" >&2 + exit 1 +fi + +echo "-----------------------------------------------" +echo "Copy appsettings.shared.json -> Development + Production (if missing)" +echo "-----------------------------------------------" +for name in appsettings.shared.Development.json appsettings.shared.Production.json; do + dest="$shared_dir/$name" + if [[ -f "$dest" ]]; then + echo "Skip (exists): $name" + else + cp "$shared_base" "$dest" + echo "Created: $name" + fi +done + +echo "-----------------------------------------------" +echo "Restore NuGet packages" +echo "-----------------------------------------------" +dotnet restore MyOffice.Web/MyOffice.Web.csproj --nologo + +spa_dir="$repo_root/MyOffice.SPA" +env_sample="$spa_dir/src/environments/environment.sample.ts" +env_local="$spa_dir/src/environments/environment.ts" +if [[ ! -f "$env_local" && -f "$env_sample" ]]; then + cp "$env_sample" "$env_local" +fi + +echo "-----------------------------------------------" +echo "Restore npm packages (MyOffice.SPA)" +echo "-----------------------------------------------" +pushd "$spa_dir" >/dev/null +if [[ -f package-lock.json ]]; then + npm ci +else + npm install +fi +popd >/dev/null + +echo "-----------------------------------------------" +echo "dotnet publish -> $out_dir" +echo "-----------------------------------------------" +rm -rf "$out_dir" +mkdir -p "$out_dir" + +dotnet publish MyOffice.Web/MyOffice.Web.csproj -c Release -o "$out_dir" --no-restore --nologo + +# CT owns Production overlays — do not ship local env-specific appsettings. +while IFS= read -r -d '' f; do + base="$(basename "$f")" + if [[ "$base" != appsettings.json && "$base" != appsettings.shared.json ]]; then + rm -f "$f" + fi +done < <(find "$out_dir" -maxdepth 1 -name 'appsettings*.json' -print0) + +echo "-----------------------------------------------" +echo "ng build (proxmox) -> $out_dir/wwwroot" +echo "-----------------------------------------------" +spa_out="$(mktemp -d /tmp/myoffice-spa.XXXXXX)" +pushd "$spa_dir" >/dev/null +npx ng build --configuration proxmox --output-path "$spa_out" +popd >/dev/null + +wwwroot="$out_dir/wwwroot" +rm -rf "$wwwroot" +mkdir -p "$wwwroot" + +if [[ -d "$spa_out/browser" ]]; then + cp -a "$spa_out/browser/." "$wwwroot/" +else + cp -a "$spa_out/." "$wwwroot/" +fi +rm -rf "$spa_out" + +if [[ "$do_tar" == true ]]; then + out_parent="$(cd "$(dirname "$out_dir")" && pwd)" + out_leaf="$(basename "$out_dir")" + tar_path="$out_parent/myoffice-publish.tar.gz" + rm -f "$tar_path" + echo "-----------------------------------------------" + echo "tar -> $tar_path" + echo "-----------------------------------------------" + pushd "$out_parent" >/dev/null + tar -czf "$tar_path" "$out_leaf" + popd >/dev/null + echo "Archive: $tar_path" +fi + +echo "" +echo "Published to $out_dir" +echo "Next (Gitea): ./proxmox/publish.sh --tar ; ./proxmox/release.sh ..." +echo "Lab SSH: ./proxmox/deploy.ps1 -TargetHost " +echo "" diff --git a/proxmox/release.ps1 b/proxmox/release.ps1 new file mode 100644 index 0000000..6d215f5 --- /dev/null +++ b/proxmox/release.ps1 @@ -0,0 +1,154 @@ +# Upload myoffice-publish.tar.gz to a Gitea Release on the public repo. +# Usage: +# $env:GITEA_TOKEN = '' +# .\proxmox\publish.ps1 -Tar +# .\proxmox\release.ps1 -GiteaUrl https://gitea.example.com -Owner org -Repo myoffice-public -Tag v1.2.3 +# +# Token needs write:repository on the public repo. + +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)] + [string]$GiteaUrl, + + [Parameter(Mandatory = $true)] + [string]$Owner, + + [string]$Repo = 'myoffice-public', + + [Parameter(Mandatory = $true)] + [string]$Tag, + + [string]$Token = $env:GITEA_TOKEN, + + [string]$AssetPath = '', + + [string]$Title = '', + + [string]$Body = 'MyOffice published API + SPA (Proxmox CT artifact).', + + [string]$Target = 'main' +) + +$ErrorActionPreference = 'Stop' + +if (-not $Token) { + throw 'GITEA_TOKEN (or -Token) is required.' +} + +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$repoRoot = Resolve-Path (Join-Path $scriptDir '..') + +if (-not $AssetPath) { + $AssetPath = Join-Path $repoRoot 'myoffice-publish.tar.gz' +} +if (-not (Test-Path $AssetPath)) { + throw "Asset not found: $AssetPath — run .\proxmox\publish.ps1 -Tar first." +} + +$GiteaUrl = $GiteaUrl.TrimEnd('/') +$api = "$GiteaUrl/api/v1" +$assetName = 'myoffice-publish.tar.gz' +if (-not $Title) { $Title = $Tag } + +$headers = @{ + Authorization = "token $Token" + Accept = 'application/json' +} + +function Invoke-GiteaJson { + param( + [string]$Method, + [string]$Uri, + [object]$BodyObject = $null + ) + $params = @{ + Method = $Method + Uri = $Uri + Headers = $headers + } + if ($null -ne $BodyObject) { + $params.ContentType = 'application/json' + $params.Body = ($BodyObject | ConvertTo-Json -Depth 6) + } + return Invoke-RestMethod @params +} + +Write-Host "-----------------------------------------------" +Write-Host "Gitea release $Owner/$Repo tag $Tag" +Write-Host "-----------------------------------------------" + +$release = $null +try { + $release = Invoke-GiteaJson -Method GET -Uri "$api/repos/$Owner/$Repo/releases/tags/$Tag" + Write-Host "Release $Tag already exists (id $($release.id))." +} +catch { + Write-Host "Creating release $Tag..." + $release = Invoke-GiteaJson -Method POST -Uri "$api/repos/$Owner/$Repo/releases" -BodyObject @{ + tag_name = $Tag + target_commitish = $Target + name = $Title + body = $Body + draft = $false + prerelease = $false + } + Write-Host "Created release id $($release.id)." +} + +# Remove existing asset with the same name so re-upload works +$existing = @($release.assets) | Where-Object { $_.name -eq $assetName } +foreach ($a in $existing) { + Write-Host "Deleting existing asset id $($a.id) ($($a.name))..." + Invoke-GiteaJson -Method DELETE -Uri "$api/repos/$Owner/$Repo/releases/$($release.id)/assets/$($a.id)" | Out-Null +} + +$uploadUrl = "$api/repos/$Owner/$Repo/releases/$($release.id)/assets?name=$assetName" +Write-Host "Uploading $AssetPath ..." + +# Prefer curl multipart (reliable on Windows PowerShell 5 + 7) +$curl = Get-Command curl.exe -ErrorAction SilentlyContinue +if ($curl) { + $args = @( + '-fsS', '-X', 'POST', + '-H', "Authorization: token $Token", + '-F', "attachment=@$AssetPath", + $uploadUrl + ) + & curl.exe @args + if ($LASTEXITCODE -ne 0) { + throw "curl upload failed with exit code $LASTEXITCODE" + } +} +else { + # Fallback: .NET multipart + Add-Type -AssemblyName System.Net.Http + $handler = [System.Net.Http.HttpClientHandler]::new() + $client = [System.Net.Http.HttpClient]::new($handler) + $client.DefaultRequestHeaders.Add('Authorization', "token $Token") + $content = [System.Net.Http.MultipartFormDataContent]::new() + $fs = [System.IO.File]::OpenRead($AssetPath) + try { + $streamContent = [System.Net.Http.StreamContent]::new($fs) + $streamContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse('application/octet-stream') + $content.Add($streamContent, 'attachment', $assetName) + $resp = $client.PostAsync($uploadUrl, $content).Result + if (-not $resp.IsSuccessStatusCode) { + $err = $resp.Content.ReadAsStringAsync().Result + throw "Upload failed: $($resp.StatusCode) $err" + } + } + finally { + $fs.Dispose() + $content.Dispose() + $client.Dispose() + } +} + +$downloadUrl = "$GiteaUrl/$Owner/$Repo/releases/download/$Tag/$assetName" +Write-Host "" +Write-Host "Uploaded. Download URL:" +Write-Host " $downloadUrl" +Write-Host "Latest API:" +Write-Host " $api/repos/$Owner/$Repo/releases/latest" +Write-Host "" diff --git a/proxmox/release.sh b/proxmox/release.sh new file mode 100755 index 0000000..9f566f3 --- /dev/null +++ b/proxmox/release.sh @@ -0,0 +1,158 @@ +#!/usr/bin/env bash +# Upload myoffice-publish.tar.gz to a Gitea Release on the public repo. +# Usage: +# export GITEA_TOKEN='' +# ./proxmox/publish.sh --tar +# ./proxmox/release.sh --gitea-url https://gitea.example.com --owner org --repo myoffice-public --tag v1.2.3 +# +# Token needs write:repository on the public repo. + +set -euo pipefail + +script_dir="$(cd "$(dirname "$0")" && pwd)" +repo_root="$(cd "$script_dir/.." && pwd)" + +gitea_url="${GITEA_URL:-}" +owner="${GITEA_OWNER:-}" +repo="${GITEA_REPO:-myoffice-public}" +tag="${TAG:-}" +token="${GITEA_TOKEN:-}" +asset_path="${ASSET_PATH:-}" +title="${TITLE:-}" +body="${BODY:-MyOffice published API + SPA (Proxmox CT artifact).}" +target="${TARGET:-main}" + +usage() { + echo "Usage: $0 --gitea-url URL --owner OWNER --tag TAG [--repo REPO] [--asset-path PATH]" >&2 + exit 1 +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --gitea-url) + gitea_url="$2" + shift 2 + ;; + --owner) + owner="$2" + shift 2 + ;; + --repo) + repo="$2" + shift 2 + ;; + --tag) + tag="$2" + shift 2 + ;; + --asset-path) + asset_path="$2" + shift 2 + ;; + --title) + title="$2" + shift 2 + ;; + --body) + body="$2" + shift 2 + ;; + --target) + target="$2" + shift 2 + ;; + -h | --help) + usage + ;; + *) + echo "Unknown argument: $1" >&2 + usage + ;; + esac +done + +if [[ -z "$token" ]]; then + echo "GITEA_TOKEN (or export before run) is required." >&2 + exit 1 +fi +if [[ -z "$gitea_url" || -z "$owner" || -z "$tag" ]]; then + usage +fi + +if [[ -z "$asset_path" ]]; then + asset_path="$repo_root/myoffice-publish.tar.gz" +fi +if [[ ! -f "$asset_path" ]]; then + echo "Asset not found: $asset_path — run ./proxmox/publish.sh --tar first." >&2 + exit 1 +fi + +gitea_url="${gitea_url%/}" +api="$gitea_url/api/v1" +asset_name="myoffice-publish.tar.gz" +if [[ -z "$title" ]]; then + title="$tag" +fi + +auth_header="Authorization: token $token" + +api_call() { + local method="$1" + local uri="$2" + local payload="${3:-}" + if [[ -n "$payload" ]]; then + curl -fsS -X "$method" -H "$auth_header" -H "Accept: application/json" \ + -H "Content-Type: application/json" -d "$payload" "$uri" + else + curl -fsS -X "$method" -H "$auth_header" -H "Accept: application/json" "$uri" + fi +} + +release_json="" +if release_json="$(api_call GET "$api/repos/$owner/$repo/releases/tags/$tag" 2>/dev/null)"; then + release_id="$(python3 -c "import json,sys; print(json.load(sys.stdin)['id'])" <<<"$release_json")" + echo "Release $tag already exists (id $release_id)." +else + echo "Creating release $tag..." + payload="$(TAG="$tag" TITLE="$title" BODY="$body" TARGET="$target" python3 <<'PY' +import json, os +print(json.dumps({ + "tag_name": os.environ["TAG"], + "target_commitish": os.environ["TARGET"], + "name": os.environ["TITLE"], + "body": os.environ["BODY"], + "draft": False, + "prerelease": False, +})) +PY +)" + release_json="$(api_call POST "$api/repos/$owner/$repo/releases" "$payload")" + release_id="$(python3 -c "import json,sys; print(json.load(sys.stdin)['id'])" <<<"$release_json")" + echo "Created release id $release_id." +fi + +asset_ids="$(python3 -c " +import json, sys +data = json.load(sys.stdin) +for a in data.get('assets', []): + if a.get('name') == '$asset_name': + print(a['id']) +" <<<"$release_json")" + +while IFS= read -r asset_id; do + [[ -z "$asset_id" ]] && continue + echo "Deleting existing asset id $asset_id ($asset_name)..." + api_call DELETE "$api/repos/$owner/$repo/releases/$release_id/assets/$asset_id" >/dev/null || true +done <<<"$asset_ids" + +upload_url="$api/repos/$owner/$repo/releases/$release_id/assets?name=$asset_name" +echo "Uploading $asset_path ..." +curl -fsS -X POST -H "$auth_header" -F "attachment=@$asset_path" "$upload_url" + +download_url="$gitea_url/$owner/$repo/releases/download/$tag/$asset_name" +echo "" +echo "Uploaded. Download URL:" +echo " $download_url" +echo "Latest API:" +echo " $api/repos/$owner/$repo/releases/latest" +echo "" diff --git a/proxmox/sync-public.ps1 b/proxmox/sync-public.ps1 new file mode 100644 index 0000000..124f4eb --- /dev/null +++ b/proxmox/sync-public.ps1 @@ -0,0 +1,161 @@ +# Sync allowlisted paths from the private repo to the public Gitea repo (no full source). +# Usage: +# $env:GITEA_TOKEN = '' # optional if using SSH remote +# .\proxmox\sync-public.ps1 -GiteaUrl https://gitea.example.com -Owner org -Repo myoffice-public -Push +# +# Allowlist: proxmox/, Docker/, README.md, LICENSE (if present). +# Never syncs MyOffice.* source, _Published, secrets, node_modules, etc. + +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)] + [string]$GiteaUrl, + + [Parameter(Mandatory = $true)] + [string]$Owner, + + [string]$Repo = 'myoffice-public', + + [string]$Branch = 'main', + + [string]$Token = $env:GITEA_TOKEN, + + [string]$WorkDir = '', + + [switch]$Push +) + +$ErrorActionPreference = 'Stop' + +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$repoRoot = Resolve-Path (Join-Path $scriptDir '..') +Set-Location $repoRoot + +$GiteaUrl = $GiteaUrl.TrimEnd('/') + +if (-not $WorkDir) { + $WorkDir = Join-Path $env:TEMP 'myoffice-public-sync' +} + +$allowDirs = @('proxmox', 'Docker') +$allowFiles = @('README.md', 'LICENSE', 'LICENSE.md') +$excludeNames = @('.git', '_Published', 'myoffice-publish.tar.gz', 'node_modules', 'data', '.env', 'env.local') + +function Test-Excluded([string]$Name) { + return $excludeNames -contains $Name +} + +function Copy-Allowlisted { + param([string]$DestRoot) + + foreach ($dir in $allowDirs) { + $src = Join-Path $repoRoot $dir + if (-not (Test-Path $src)) { + Write-Host "Skip missing dir: $dir" + continue + } + $dest = Join-Path $DestRoot $dir + if (Test-Path $dest) { + Remove-Item -Recurse -Force $dest + } + New-Item -ItemType Directory -Path $dest -Force | Out-Null + + Get-ChildItem -Path $src -Force | Where-Object { -not (Test-Excluded $_.Name) } | ForEach-Object { + if ($dir -eq 'Docker' -and $_.Name -eq 'data') { return } + Copy-Item $_.FullName -Destination (Join-Path $dest $_.Name) -Recurse -Force + } + Write-Host "Synced $dir/" + } + + foreach ($file in $allowFiles) { + $src = Join-Path $repoRoot $file + if (Test-Path $src) { + Copy-Item $src -Destination (Join-Path $DestRoot $file) -Force + Write-Host "Synced $file" + } + } + + $publicNote = Join-Path $DestRoot 'PUBLIC.md' + @( + '# MyOffice public tree', + '', + 'This repository is a **filtered** mirror for Proxmox CT install scripts and Docker demo files.', + 'Application **source** stays in the private developer repository.', + 'Runnable app binaries are published as **Gitea Releases** (`myoffice-publish.tar.gz`).', + '', + 'See [proxmox/README.md](proxmox/README.md).', + '' + ) | Set-Content -Path $publicNote -Encoding utf8 +} + +if ($Token) { + $hostPart = $GiteaUrl -replace '^https://', '' -replace '^http://', '' + $scheme = if ($GiteaUrl -match '^http://') { 'http' } else { 'https' } + $remote = "${scheme}://oauth2:${Token}@${hostPart}/${Owner}/${Repo}.git" +} +else { + $remote = "${GiteaUrl}/${Owner}/${Repo}.git" + Write-Host "No token — using remote as-is (SSH URL recommended): $remote" +} + +Write-Host "-----------------------------------------------" +Write-Host "Sync allowlist -> $Owner/$Repo ($Branch)" +Write-Host "WorkDir: $WorkDir" +Write-Host "-----------------------------------------------" + +if (Test-Path $WorkDir) { + Remove-Item -Recurse -Force $WorkDir +} +New-Item -ItemType Directory -Path $WorkDir | Out-Null + +$cloned = $false +git clone --depth 1 --branch $Branch $remote $WorkDir 2>$null +if ($LASTEXITCODE -eq 0) { + $cloned = $true +} + +if (-not $cloned) { + Write-Host "Clone failed or empty repo — initializing new git repo..." + git -C $WorkDir init -b $Branch + if ($LASTEXITCODE -ne 0) { + git -C $WorkDir init + git -C $WorkDir checkout -b $Branch 2>$null + } + git -C $WorkDir remote remove origin 2>$null + git -C $WorkDir remote add origin $remote +} + +Get-ChildItem -Path $WorkDir -Force | Where-Object { $_.Name -ne '.git' } | ForEach-Object { + Remove-Item $_.FullName -Recurse -Force +} + +Copy-Allowlisted -DestRoot $WorkDir + +git -C $WorkDir add -A +$status = git -C $WorkDir status --porcelain +if (-not $status) { + Write-Host "No changes to commit." +} +else { + git -C $WorkDir -c user.email='myoffice-sync@local' -c user.name='myoffice-sync' ` + commit -m "sync public allowlist from private myoffice" + Write-Host "Committed allowlist snapshot." +} + +if ($Push) { + Write-Host "Pushing to origin $Branch..." + git -C $WorkDir push -u origin "HEAD:$Branch" + if ($LASTEXITCODE -ne 0) { + throw "git push failed with exit code $LASTEXITCODE" + } + Write-Host "Pushed." +} +else { + Write-Host "Dry run (no push). Re-run with -Push to publish." + Write-Host "Work tree left at: $WorkDir" +} + +Write-Host "" +Write-Host "Raw base for CT install:" +Write-Host " $GiteaUrl/$Owner/$Repo/raw/branch/$Branch" +Write-Host "" diff --git a/proxmox/sync-public.sh b/proxmox/sync-public.sh new file mode 100755 index 0000000..40ecbd3 --- /dev/null +++ b/proxmox/sync-public.sh @@ -0,0 +1,183 @@ +#!/usr/bin/env bash +# Sync allowlisted paths from the private repo to the public Gitea repo (no full source). +# Usage: +# export GITEA_TOKEN='' +# ./proxmox/sync-public.sh --gitea-url https://gitea.example.com --owner org --repo myoffice-public --push +# +# Allowlist: proxmox/, Docker/, README.md, LICENSE (if present). + +set -euo pipefail + +script_dir="$(cd "$(dirname "$0")" && pwd)" +repo_root="$(cd "$script_dir/.." && pwd)" +cd "$repo_root" + +gitea_url="${GITEA_URL:-}" +owner="${GITEA_OWNER:-}" +repo="${GITEA_REPO:-myoffice-public}" +branch="${BRANCH:-main}" +token="${GITEA_TOKEN:-}" +work_dir="${WORK_DIR:-}" +do_push=false + +usage() { + echo "Usage: $0 --gitea-url URL --owner OWNER [--repo REPO] [--branch BRANCH] [--push]" >&2 + exit 1 +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --gitea-url) + gitea_url="$2" + shift 2 + ;; + --owner) + owner="$2" + shift 2 + ;; + --repo) + repo="$2" + shift 2 + ;; + --branch) + branch="$2" + shift 2 + ;; + --work-dir) + work_dir="$2" + shift 2 + ;; + --push) + do_push=true + shift + ;; + -h | --help) + usage + ;; + *) + echo "Unknown argument: $1" >&2 + usage + ;; + esac +done + +if [[ -z "$gitea_url" || -z "$owner" ]]; then + usage +fi + +gitea_url="${gitea_url%/}" + +if [[ -z "$work_dir" ]]; then + work_dir="${TMPDIR:-/tmp}/myoffice-public-sync" +fi + +allow_dirs=(proxmox Docker) +allow_files=(README.md LICENSE LICENSE.md) +exclude_names=('.git' '_Published' 'myoffice-publish.tar.gz' 'node_modules' 'data' '.env' 'env.local') + +is_excluded() { + local name="$1" + for x in "${exclude_names[@]}"; do + [[ "$name" == "$x" ]] && return 0 + done + return 1 +} + +if [[ -n "$token" ]]; then + host_part="${gitea_url#https://}" + host_part="${host_part#http://}" + if [[ "$gitea_url" == http://* ]]; then + scheme=http + else + scheme=https + fi + remote="${scheme}://oauth2:${token}@${host_part}/${owner}/${repo}.git" +else + remote="${gitea_url}/${owner}/${repo}.git" + echo "No token — using remote as-is (SSH URL recommended): $remote" +fi + +echo "-----------------------------------------------" +echo "Sync allowlist -> $owner/$repo ($branch)" +echo "WorkDir: $work_dir" +echo "-----------------------------------------------" + +rm -rf "$work_dir" +mkdir -p "$work_dir" + +if git clone --depth 1 --branch "$branch" "$remote" "$work_dir" 2>/dev/null; then + : +else + echo "Clone failed or empty repo — initializing new git repo..." + git -C "$work_dir" init -b "$branch" 2>/dev/null || { + git -C "$work_dir" init + git -C "$work_dir" checkout -b "$branch" 2>/dev/null || true + } + git -C "$work_dir" remote remove origin 2>/dev/null || true + git -C "$work_dir" remote add origin "$remote" +fi + +find "$work_dir" -mindepth 1 -maxdepth 1 ! -name '.git' -exec rm -rf {} + + +for dir in "${allow_dirs[@]}"; do + src="$repo_root/$dir" + if [[ ! -d "$src" ]]; then + echo "Skip missing dir: $dir" + continue + fi + dest="$work_dir/$dir" + mkdir -p "$dest" + while IFS= read -r -d '' item; do + name="$(basename "$item")" + if is_excluded "$name"; then + continue + fi + if [[ "$dir" == Docker && "$name" == data ]]; then + continue + fi + cp -a "$item" "$dest/" + done < <(find "$src" -mindepth 1 -maxdepth 1 -print0) + echo "Synced $dir/" +done + +for file in "${allow_files[@]}"; do + src="$repo_root/$file" + if [[ -f "$src" ]]; then + cp -a "$src" "$work_dir/$file" + echo "Synced $file" + fi +done + +cat >"$work_dir/PUBLIC.md" <<'EOF' +# MyOffice public tree + +This repository is a **filtered** mirror for Proxmox CT install scripts and Docker demo files. +Application **source** stays in the private developer repository. +Runnable app binaries are published as **Gitea Releases** (`myoffice-publish.tar.gz`). + +See [proxmox/README.md](proxmox/README.md). + +EOF + +git -C "$work_dir" add -A +if [[ -z "$(git -C "$work_dir" status --porcelain)" ]]; then + echo "No changes to commit." +else + git -C "$work_dir" -c user.email='myoffice-sync@local' -c user.name='myoffice-sync' \ + commit -m "sync public allowlist from private myoffice" + echo "Committed allowlist snapshot." +fi + +if [[ "$do_push" == true ]]; then + echo "Pushing to origin $branch..." + git -C "$work_dir" push -u origin "HEAD:$branch" + echo "Pushed." +else + echo "Dry run (no push). Re-run with --push to publish." + echo "Work tree left at: $work_dir" +fi + +echo "" +echo "Raw base for CT install:" +echo " $gitea_url/$owner/$repo/raw/branch/$branch" +echo "" diff --git a/proxmox/update.sh b/proxmox/update.sh new file mode 100644 index 0000000..3b4dfa0 --- /dev/null +++ b/proxmox/update.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# Helpers inside an existing MyOffice LXC (runtime + Postgres + Gitea release app). +# Usage: +# /opt/myoffice/proxmox/update.sh # download latest/tag release + restart +# /opt/myoffice/proxmox/update.sh upgrade +# /opt/myoffice/proxmox/update.sh logs +# /opt/myoffice/proxmox/update.sh restart +# /opt/myoffice/proxmox/update.sh status + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +APP_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" +API_DIR="${APP_DIR}/api" +ACTION="${1:-upgrade}" + +# shellcheck disable=SC1091 +[[ -f "${SCRIPT_DIR}/env" ]] && . "${SCRIPT_DIR}/env" + +export APP_DIR API_DIR +export GITEA_URL="${GITEA_URL:-}" +export GITEA_OWNER="${GITEA_OWNER:-}" +export GITEA_REPO="${GITEA_REPO:-myoffice-public}" +export RELEASE_TAG="${RELEASE_TAG:-latest}" +export RELEASE_ASSET_URL="${RELEASE_ASSET_URL:-}" +export GITEA_TOKEN="${GITEA_TOKEN:-}" + +upgrade_app() { + systemctl stop myoffice-api 2>/dev/null || true + # shellcheck disable=SC1091 + source "${SCRIPT_DIR}/fetch-release.sh" + download_and_extract + systemctl start myoffice-api + systemctl status myoffice-api --no-pager || true +} + +case "$ACTION" in + upgrade | update | rebuild | up) + upgrade_app + ;; + logs) + journalctl -u myoffice-api -f + ;; + restart) + systemctl restart myoffice-api + systemctl status myoffice-api --no-pager + ;; + status) + systemctl status myoffice-api --no-pager || true + if [[ ! -f "${API_DIR}/MyOffice.Web.dll" ]]; then + echo + echo "No app binaries. Run: $0 upgrade" + echo "Or set GITEA_URL / GITEA_OWNER / RELEASE_TAG in ${SCRIPT_DIR}/env" + fi + ;; + *) + echo "Usage: $0 [upgrade|status|logs|restart]" >&2 + exit 1 + ;; +esac

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 diff --git a/MyOffice.SPA/src/assets/images/image-gallery/1.jpg b/MyOffice.SPA/src/assets/images/image-gallery/1.jpg deleted file mode 100644 index 25bdf2b48eb67a7c5d5587295c532164d4498f15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4471 zcmeHLc{J4P8~=_$Vi@bSGa1W?o86r$vSi6NBwJleVwg;p$)sz3WkhLY%b-+)77AHr z7(XOghs02}$j&&(dK1x*`Kj)8y8qmB&;9+|^M3z$&-;Ep?|Gij_j%9roR>4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jj4e83%-I zt!%6S5C{N3I|JZs12FT@U|g6#9`BEa`4V7QoImD3n7`j2ivVW`xC%gaOb{Xng$jy^ zi;9cMN=r&g%kEcz?Tq~q8+TP9MJgFo~QANk&%hCJlga$2lW3Q zz-a_T__!`}17MI6z$F3#i-0%`KxQY9uLkTI4>y>L7sMF^_`bvl0GryoTR$d06!?b< zAV11^k)Wdu?foaA1S_)t1O=OmaLLEC1PU3!8^Fz`hi(`=joX>chW z=ds&&%L?yCq$>8m*vg$O3HkN7tAkie>Rz<8i}DTueRjVD28WhOBs4`Y$|YQ{a7ugg z8^7A2kdj|)x!6`QFEv7VZufXNTv64FudF(An~RX;8~v)ZA8|l{hhNAF>v6|lN)1d4 zQ;EzB8HssluKxhfSk`|caU}Zk{&d}&a9D5t>Gb5L6fC0OGNjA>M&Vw?{K=w8QENL$ z>}yjWGilzu8~z$v@12ZmtVeQCt8bNH7kl5AVKK#jI$c?YwGcmttstFMg+4^w1whfq zVPt7XFAIBo$$uz&$VS%)v}Z4P^1P1vFDM6QG1GL`$6bWuas>L{ocBHg$F(60PTEj~ zpb{es=ihWO>q`x32U2iKHh$-Ov;6=j-%Ts-Y2&`Ev<$b|N1$zF(2Z>IAa?v>ae z@ofhb@xt+&hoX%>}X#+pcQ1CL>T2G+i=RN^-R)CEz}VX;Jk2Xs+?TN@Mx&v>7(42Cv#t3xn75 zg+BgXC>7C0v~xb+y*^}7Tqs-Vd$+;*%0b0-2LoR~ zVu)UP!U%{;%|d{+?M4jzd#J6O`w%Ft$nx!d+tlI{=TT!lQC(WZIw%JS?XmB9!8arS z`N-ot(?O*pz3Sb)1)|8YUVU#A9d(S*G2wP>UMD4~iS){n1K2-r_?Fc-!-d+MqdN?n z_2{t>{1a{UZuxYAaayR+9d_Ww>EioCItOOsT`Z+sx$-J(Tv7mH&aqbCn;x{~u8Y6W zgBpgBTXUWA)@yMyh-=rY11~N4FAu;#opwdiJ*SqoR; zCGeVirm^IRb4LYku&TbJ>Vh4Gnj7aaa09{Y zHwKZ9_4?vtyL~F;l@gJg^H_vu(0LeuvV(U~zR=9k|!3L$8vG>Hm-mPML4)7s9 zwgSKJ@KGXVhG7=vRLC=9J-Tr5TOO5NJDwLUl|zNpJw;g_vb}$$uE>R+Yinc3juj+4 z`pgV;QIC}anorek^vt`_oA~8}=Eb}{_5^NgwEHZYG!ug4^EUEF(5CJ6D_Y;(ig#s= zI`yFjem~iytc6JY?0e#^AU=oK;_PItlH?h_qV@1iB66};BG|ZjovoInk&{>mc9+~Q zlaec0c!o(AYN%NWc=u?zg3`LCs#Z`L|KF$XrX{$h&By1>Zu#(d+6SZ^Hpdm7_=w9l za`>=twSr!rDojZbMI>8x&?uSDZbzMe-%5hy9zP1tR8Mnz)2M(C_4|D0SxlfxTZt7g zsnNP*GV?ip#qh=_4&Ymp%-W6`pu(#-z`c*^Z>9HHo{rIDwLXhEsmvn@cPl2Rin~d{ zjg3e@OT;HuAozdDP@c*Y8&ua9d3b+LMsv|?*ywC(L|-nR!O+D!)`Vf`{wg`r-kqfu zB2_W!h6J=>I;*@_yJ&xO&04nouCGaYN9d{rY?;*26P;_wMRAGS<6PK5W{iT_%Bd}b hQ(t-*k*}`^-<4k4w;mC+Q$1nOzd`Jjec*~;n-efg$OjeMpOLdgYCaQX3 zKk1%j{<|x%#cag^Re49cXGQy0PS-?(|8?#iIRcNL5A}a32!b$qK0382vF$HBv;Y7A M07*qoM6N<$f~rTJ>i_@% diff --git a/MyOffice.SPA/src/assets/images/light.png b/MyOffice.SPA/src/assets/images/light.png deleted file mode 100644 index 46595db890e0affb4a654eb852d50fe6cc31d8e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207373 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